require 'active_support' require 'net/http' require 'json' module Itunes class Search include Enumerable @@config = { :endpoint => 'http://phobos.apple.com/WebObjects/MZSearch.woa/wa/itmsSearch', :default_parameters => { :output => 'json', :media => 'music' } } cattr_accessor :config attr_reader :size, :results def initialize(term, options={}) result = get({ :term => term }.merge(self.class.config[:default_parameters]).merge(options)) parse(result) end def each results.each do |track| yield track end end protected def parse(json) source = JSON.load(json) @size = source['resultCount'] @results = source['results'].collect do |result| Track.new result end end def get(params) Net::HTTP.get(compose(self.class.config[:endpoint], params)) end def compose(base, params) URI.parse([base, build_params(params)].join('?')) end def build_params(params) params.collect { |key, value| "#{key.to_s}=#{CGI::escape(value.to_s)}" if value }.compact.join "&" end end class Track FIELD_MAP = { :artist => 'artistName', :title => 'itemName', :album => 'itemParentName', :genre => 'primaryGenreName', :song_url => 'itemLinkUrl', :album_url => 'itemParentLinkUrl', :artist_url => 'artistLinkUrl', :preview_url => 'previewUrl', :small_image_url => 'artworkUrl60', :large_image_url => 'artworkUrl100' } attr_reader *FIELD_MAP.keys def initialize(source) unpack(source) end protected def unpack(source_data) FIELD_MAP.each do |dest, source| instance_variable_set "@#{dest}".to_sym, source_data[source] end end end end