74 lines
2.0 KiB
Ruby
74 lines
2.0 KiB
Ruby
# -*- encoding : utf-8 -*-
|
|
module MusicBrainz
|
|
class Client
|
|
include ClientModules::TransparentProxy
|
|
include ClientModules::FailsafeProxy
|
|
include ClientModules::CachingProxy
|
|
|
|
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?
|
|
|
|
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)
|
|
|
|
if params[:create_model]
|
|
model_class_for(params[:create_model]).new(data)
|
|
elsif params[:create_models]
|
|
models = data.map{ |item| model_class_for(params[:create_models]).new(item) }
|
|
models.sort!{ |a, b| a.send(params[:sort]) <=> b.send(params[:sort]) } if params[:sort]
|
|
models
|
|
else
|
|
data
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
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)
|
|
value.map{ |el| el.to_s.gsub('_', '-') }.join(?+)
|
|
else
|
|
value.to_s
|
|
end
|
|
[key, value].join(?=)
|
|
end.join(?&)
|
|
end
|
|
|
|
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
|
|
end
|
|
extend ClientHelper
|
|
end
|