1
0
Fork 0
musicbrainz/lib/musicbrainz/client.rb

74 lines
2.0 KiB
Ruby
Raw Normal View History

# -*- encoding : utf-8 -*-
2012-10-12 12:45:51 +00:00
module MusicBrainz
2013-01-20 12:36:52 +00:00
class Client
include ClientModules::TransparentProxy
include ClientModules::FailsafeProxy
include ClientModules::CachingProxy
2012-10-12 12:45:51 +00:00
def http
@faraday ||= Faraday.new do |f|
f.request :url_encoded # form-encode POST params
f.adapter Faraday.default_adapter # make requests with Net::HTTP
f.use MusicBrainz::Middleware # run requests with correct headers
end
end
def load(resource, query, params)
raise Exception.new("You need to run MusicBrainz.configure before querying") if MusicBrainz.config.nil?
2013-01-20 12:36:52 +00:00
url = build_url(resource, query)
response = get_contents(url)
return nil if response[:status] != 200
xml = Nokogiri::XML.parse(response[:body]).remove_namespaces!.xpath('/metadata')
data = binding_class_for(params[:binding]).parse(xml)
2012-10-12 12:45:51 +00:00
if params[:create_model]
2013-01-20 12:36:52 +00:00
model_class_for(params[:create_model]).new(data)
2012-10-12 12:45:51 +00:00
elsif params[:create_models]
2013-01-20 12:36:52 +00:00
models = data.map{ |item| model_class_for(params[:create_models]).new(item) }
2012-10-17 14:05:40 +00:00
models.sort!{ |a, b| a.send(params[:sort]) <=> b.send(params[:sort]) } if params[:sort]
models
2012-10-12 12:45:51 +00:00
else
data
end
end
2013-01-20 12:36:52 +00:00
private
2012-10-12 12:45:51 +00:00
def build_url(resource, params)
"#{MusicBrainz.config.web_service_url}#{resource.to_s.gsub('_', '-')}" <<
((id = params.delete(:id)) ? "/#{id}?" : "?") <<
params.map do |key, value|
key = key.to_s.gsub('_', '-')
value = if value.is_a?(Array)
2013-01-20 12:36:52 +00:00
value.map{ |el| el.to_s.gsub('_', '-') }.join(?+)
2012-10-12 12:45:51 +00:00
else
value.to_s
end
2013-01-20 12:36:52 +00:00
[key, value].join(?=)
end.join(?&)
2012-10-12 12:45:51 +00:00
end
2013-01-20 12:36:52 +00:00
def binding_class_for(key)
MusicBrainz::Bindings.const_get(constantized(key))
end
def model_class_for(key)
MusicBrainz.const_get(constantized(key))
end
def constantized(key)
key.to_s.split(?_).map(&:capitalize).join.to_sym
end
end
module ClientHelper
def client
@client ||= Client.new
end
2012-10-12 12:45:51 +00:00
end
2013-01-20 12:36:52 +00:00
extend ClientHelper
2012-10-12 12:45:51 +00:00
end