From 2d4c1c42fdcf6513c01a78d7343057ffeb64e8a7 Mon Sep 17 00:00:00 2001 From: Thomas Wolfe Date: Tue, 5 Nov 2013 20:15:09 -0600 Subject: [PATCH] Use magic encoding to ret rid of "invalid multibyte chat (US-ASCII)" errors. track_search is now renamed recording_search. recording_search now works (I mixed up the inputs). --- Gemfile | 4 +++ README.md | 20 ++++++++++-- lib/mb.rb | 1 + lib/musicbrainz.rb | 8 ++++- lib/musicbrainz/bindings/artist.rb | 2 +- .../bindings/artist_release_groups.rb | 1 + lib/musicbrainz/bindings/artist_search.rb | 2 +- lib/musicbrainz/bindings/recording.rb | 20 ++++++++++++ .../{track_search.rb => recording_search.rb} | 4 +-- lib/musicbrainz/bindings/release.rb | 1 + lib/musicbrainz/bindings/release_group.rb | 1 + .../bindings/release_group_releases.rb | 1 + .../bindings/release_group_search.rb | 2 +- lib/musicbrainz/bindings/release_tracks.rb | 1 + lib/musicbrainz/bindings/track.rb | 1 + lib/musicbrainz/client.rb | 1 + .../client_modules/caching_proxy.rb | 1 + .../client_modules/failsafe_proxy.rb | 1 + .../client_modules/transparent_proxy.rb | 1 + lib/musicbrainz/configuration.rb | 1 + lib/musicbrainz/deprecated.rb | 1 + lib/musicbrainz/middleware.rb | 1 + lib/musicbrainz/models/artist.rb | 1 + lib/musicbrainz/models/base_model.rb | 19 +++++++---- lib/musicbrainz/models/recording.rb | 20 ++++++++++++ lib/musicbrainz/models/release.rb | 1 + lib/musicbrainz/models/release_group.rb | 1 + lib/musicbrainz/models/track.rb | 6 +--- lib/musicbrainz/version.rb | 1 + ...earch_spec.rb => recording_search_spec.rb} | 6 ++-- spec/bindings/release_group_search_spec.rb | 2 +- spec/bindings/release_spec.rb | 2 +- spec/client_modules/cache_spec.rb | 2 +- spec/deprecated/cache_config_spec.rb | 2 +- spec/deprecated/proxy_config_spec.rb | 2 +- spec/models/artist_spec.rb | 2 +- spec/models/base_model_spec.rb | 2 +- spec/models/recording_spec.rb | 32 +++++++++++++++++++ spec/models/release_group_spec.rb | 2 +- spec/models/release_spec.rb | 2 +- spec/models/track_spec.rb | 11 +------ spec/spec_helper.rb | 1 + 42 files changed, 151 insertions(+), 42 deletions(-) create mode 100644 lib/musicbrainz/bindings/recording.rb rename lib/musicbrainz/bindings/{track_search.rb => recording_search.rb} (92%) create mode 100644 lib/musicbrainz/models/recording.rb rename spec/bindings/{track_search_spec.rb => recording_search_spec.rb} (88%) create mode 100644 spec/models/recording_spec.rb diff --git a/Gemfile b/Gemfile index 851fabc..cb50039 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,6 @@ source 'https://rubygems.org' gemspec + +group :test do + gem "debugger" +end diff --git a/README.md b/README.md index 7f82a58..5b626cc 100644 --- a/README.md +++ b/README.md @@ -121,11 +121,10 @@ MusicBrainz::Release.find(id) } ``` -MusicBrainz::Track +MusicBrainz::Track (depreciated, now called Recording) ```ruby # Class Methods MusicBrainz::Track.find(id) -MusicBrainz::ReleaseGroup.search(artist_name, track_name) # Fields { @@ -136,6 +135,23 @@ MusicBrainz::ReleaseGroup.search(artist_name, track_name) } ``` +MusicBrainz::Recording +```ruby +# Class Methods +MusicBrainz::Recording.find(id) +MusicBrainz::Recording.search(track_name, artist_name) + +# Fields +{ + :id => Integer, + :mbid => Integer, + :title => String, + :artist => String, + :releases => String, + :score => Integer +} +``` + ### Testing ``` bundle exec rspec diff --git a/lib/mb.rb b/lib/mb.rb index b979ca1..d45c9fa 100644 --- a/lib/mb.rb +++ b/lib/mb.rb @@ -1,2 +1,3 @@ +# -*- encoding : utf-8 -*- require "musicbrainz" MB = MusicBrainz diff --git a/lib/musicbrainz.rb b/lib/musicbrainz.rb index cbc3049..18b701a 100644 --- a/lib/musicbrainz.rb +++ b/lib/musicbrainz.rb @@ -1,3 +1,7 @@ +# -*- encoding : utf-8 -*- +#!/bin/env ruby +# encoding: utf-8 + require "digest/sha1" require "fileutils" require "date" @@ -20,6 +24,7 @@ require "musicbrainz/models/artist" require "musicbrainz/models/release_group" require "musicbrainz/models/release" require "musicbrainz/models/track" +require "musicbrainz/models/recording" require "musicbrainz/bindings/artist" require "musicbrainz/bindings/artist_search" @@ -32,7 +37,8 @@ require "musicbrainz/bindings/release_group_releases" require "musicbrainz/bindings/release" require "musicbrainz/bindings/release_tracks" require "musicbrainz/bindings/track" -require "musicbrainz/bindings/track_search" +require "musicbrainz/bindings/recording" +require "musicbrainz/bindings/recording_search" module MusicBrainz GH_PAGE_URL = "http://git.io/brainz" diff --git a/lib/musicbrainz/bindings/artist.rb b/lib/musicbrainz/bindings/artist.rb index aeb97f0..552f585 100644 --- a/lib/musicbrainz/bindings/artist.rb +++ b/lib/musicbrainz/bindings/artist.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module Artist diff --git a/lib/musicbrainz/bindings/artist_release_groups.rb b/lib/musicbrainz/bindings/artist_release_groups.rb index 78612ed..126f74f 100644 --- a/lib/musicbrainz/bindings/artist_release_groups.rb +++ b/lib/musicbrainz/bindings/artist_release_groups.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ArtistReleaseGroups diff --git a/lib/musicbrainz/bindings/artist_search.rb b/lib/musicbrainz/bindings/artist_search.rb index f693612..e626835 100644 --- a/lib/musicbrainz/bindings/artist_search.rb +++ b/lib/musicbrainz/bindings/artist_search.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ArtistSearch diff --git a/lib/musicbrainz/bindings/recording.rb b/lib/musicbrainz/bindings/recording.rb new file mode 100644 index 0000000..6ddc2e3 --- /dev/null +++ b/lib/musicbrainz/bindings/recording.rb @@ -0,0 +1,20 @@ +# -*- encoding : utf-8 -*- +module MusicBrainz + module Bindings + module Recording + def parse(xml) + xml = xml.xpath('./recording') unless xml.xpath('./recording').empty? + { + id: (xml.attribute('id').value rescue nil), + mbid: (xml.attribute('id').value rescue nil), # Old shit + title: (xml.xpath('./title').text.gsub(/[`’]/, "'") rescue nil), + artist: (xml.xpath('./artist-credit/name-credit/artist/name').text rescue nil), + releases: (xml.xpath('./release-list/release/title').map{ |xml| xml.text } rescue []), + score: (xml.attribute('score').value.to_i rescue nil) + } + end + + extend self + end + end +end diff --git a/lib/musicbrainz/bindings/track_search.rb b/lib/musicbrainz/bindings/recording_search.rb similarity index 92% rename from lib/musicbrainz/bindings/track_search.rb rename to lib/musicbrainz/bindings/recording_search.rb index 512a9a8..1b1f7d5 100644 --- a/lib/musicbrainz/bindings/track_search.rb +++ b/lib/musicbrainz/bindings/recording_search.rb @@ -1,7 +1,7 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings - module TrackSearch + module RecordingSearch def parse(xml) xml.xpath('./recording-list/recording').map do |xml| { diff --git a/lib/musicbrainz/bindings/release.rb b/lib/musicbrainz/bindings/release.rb index f00bd90..19501d5 100644 --- a/lib/musicbrainz/bindings/release.rb +++ b/lib/musicbrainz/bindings/release.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module Release diff --git a/lib/musicbrainz/bindings/release_group.rb b/lib/musicbrainz/bindings/release_group.rb index 7ac95d4..ba9c54a 100644 --- a/lib/musicbrainz/bindings/release_group.rb +++ b/lib/musicbrainz/bindings/release_group.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ReleaseGroup diff --git a/lib/musicbrainz/bindings/release_group_releases.rb b/lib/musicbrainz/bindings/release_group_releases.rb index 4ce7133..aeef95e 100644 --- a/lib/musicbrainz/bindings/release_group_releases.rb +++ b/lib/musicbrainz/bindings/release_group_releases.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ReleaseGroupReleases diff --git a/lib/musicbrainz/bindings/release_group_search.rb b/lib/musicbrainz/bindings/release_group_search.rb index 7766dee..3a0133b 100644 --- a/lib/musicbrainz/bindings/release_group_search.rb +++ b/lib/musicbrainz/bindings/release_group_search.rb @@ -1,4 +1,4 @@ -# encoding: UTF-8 +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ReleaseGroupSearch diff --git a/lib/musicbrainz/bindings/release_tracks.rb b/lib/musicbrainz/bindings/release_tracks.rb index a14835a..b91ccd6 100644 --- a/lib/musicbrainz/bindings/release_tracks.rb +++ b/lib/musicbrainz/bindings/release_tracks.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module ReleaseTracks diff --git a/lib/musicbrainz/bindings/track.rb b/lib/musicbrainz/bindings/track.rb index a2c0a43..a03bec0 100644 --- a/lib/musicbrainz/bindings/track.rb +++ b/lib/musicbrainz/bindings/track.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Bindings module Track diff --git a/lib/musicbrainz/client.rb b/lib/musicbrainz/client.rb index 24e1e06..b53cfa6 100644 --- a/lib/musicbrainz/client.rb +++ b/lib/musicbrainz/client.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Client include ClientModules::TransparentProxy diff --git a/lib/musicbrainz/client_modules/caching_proxy.rb b/lib/musicbrainz/client_modules/caching_proxy.rb index 0d3ecaf..e109925 100644 --- a/lib/musicbrainz/client_modules/caching_proxy.rb +++ b/lib/musicbrainz/client_modules/caching_proxy.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module ClientModules module CachingProxy diff --git a/lib/musicbrainz/client_modules/failsafe_proxy.rb b/lib/musicbrainz/client_modules/failsafe_proxy.rb index 554f844..2361243 100644 --- a/lib/musicbrainz/client_modules/failsafe_proxy.rb +++ b/lib/musicbrainz/client_modules/failsafe_proxy.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module ClientModules module FailsafeProxy diff --git a/lib/musicbrainz/client_modules/transparent_proxy.rb b/lib/musicbrainz/client_modules/transparent_proxy.rb index e3386f6..387c411 100644 --- a/lib/musicbrainz/client_modules/transparent_proxy.rb +++ b/lib/musicbrainz/client_modules/transparent_proxy.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module ClientModules module TransparentProxy diff --git a/lib/musicbrainz/configuration.rb b/lib/musicbrainz/configuration.rb index 039e5b7..1fdcdc2 100644 --- a/lib/musicbrainz/configuration.rb +++ b/lib/musicbrainz/configuration.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Configuration attr_accessor :app_name, :app_version, :contact, diff --git a/lib/musicbrainz/deprecated.rb b/lib/musicbrainz/deprecated.rb index b8df3d3..1cc1b94 100644 --- a/lib/musicbrainz/deprecated.rb +++ b/lib/musicbrainz/deprecated.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz module Deprecated module ProxyConfig diff --git a/lib/musicbrainz/middleware.rb b/lib/musicbrainz/middleware.rb index c3bc1b8..cbd3fc8 100644 --- a/lib/musicbrainz/middleware.rb +++ b/lib/musicbrainz/middleware.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Middleware < Faraday::Middleware def call(env) diff --git a/lib/musicbrainz/models/artist.rb b/lib/musicbrainz/models/artist.rb index ae3b5d7..635d5ee 100644 --- a/lib/musicbrainz/models/artist.rb +++ b/lib/musicbrainz/models/artist.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Artist < BaseModel field :id, String diff --git a/lib/musicbrainz/models/base_model.rb b/lib/musicbrainz/models/base_model.rb index f7af924..a8975bb 100644 --- a/lib/musicbrainz/models/base_model.rb +++ b/lib/musicbrainz/models/base_model.rb @@ -24,15 +24,16 @@ module MusicBrainz MusicBrainz.client end - def search(hash, resource=nil) + def find(hash) + underscored_name = underscore_name.to_sym + client.load(underscored_name, hash, { binding: underscored_name, create_model: underscored_name }) + end + + def search(hash) hash = escape_strings(hash) query_val = build_query(hash) - underscore_name = self.name[13..-1].underscore - if resource # only needed since "track" is really a "recording", ugly - client.load(resource, { query: query_val, limit: 10 }, { binding: underscore_name.insert(-1,"_search").to_sym }) - else - client.load(underscore_name.to_sym, { query: query_val, limit: 10 }, { binding: underscore_name.insert(-1,"_search").to_sym }) - end + underscored_name = underscore_name + client.load(underscored_name.to_sym, { query: query_val, limit: 10 }, { binding: underscored_name.insert(-1,"_search").to_sym }) end class ::String @@ -57,6 +58,10 @@ module MusicBrainz hash end + def underscore_name + self.name[13..-1].underscore + end + # these probably should be private... but I'm not sure how to get it to work in a module... # private_class_method :build_query, :escape_strings end diff --git a/lib/musicbrainz/models/recording.rb b/lib/musicbrainz/models/recording.rb new file mode 100644 index 0000000..a635569 --- /dev/null +++ b/lib/musicbrainz/models/recording.rb @@ -0,0 +1,20 @@ +module MusicBrainz + class Recording < BaseModel + field :id, Integer + field :mbid, Integer + field :title, String + field :artist, String + field :releases, String + field :score, Integer + + class << self + def find(id) + super({ id: id }) + end + + def search(track_name, artist_name) + super({recording: track_name, artist: artist_name}) + end + end + end +end diff --git a/lib/musicbrainz/models/release.rb b/lib/musicbrainz/models/release.rb index 9f49133..f2c9390 100644 --- a/lib/musicbrainz/models/release.rb +++ b/lib/musicbrainz/models/release.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Release < BaseModel field :id, String diff --git a/lib/musicbrainz/models/release_group.rb b/lib/musicbrainz/models/release_group.rb index 66062c2..d9264bb 100644 --- a/lib/musicbrainz/models/release_group.rb +++ b/lib/musicbrainz/models/release_group.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class ReleaseGroup < BaseModel field :id, String diff --git a/lib/musicbrainz/models/track.rb b/lib/musicbrainz/models/track.rb index 8390abf..7a46641 100644 --- a/lib/musicbrainz/models/track.rb +++ b/lib/musicbrainz/models/track.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz class Track < BaseModel field :position, Integer @@ -12,11 +13,6 @@ module MusicBrainz create_model: :track }) end - - def search(artist_name, track_name) - # this model really should be named "recording" I'd rename, but I don't want to break anything - super({recording: track_name, artist: artist_name}, "recording") - end end end end diff --git a/lib/musicbrainz/version.rb b/lib/musicbrainz/version.rb index 935724e..889e1b8 100644 --- a/lib/musicbrainz/version.rb +++ b/lib/musicbrainz/version.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- module MusicBrainz VERSION = "0.7.7" end diff --git a/spec/bindings/track_search_spec.rb b/spec/bindings/recording_search_spec.rb similarity index 88% rename from spec/bindings/track_search_spec.rb rename to spec/bindings/recording_search_spec.rb index a47c827..2b11f9e 100644 --- a/spec/bindings/track_search_spec.rb +++ b/spec/bindings/recording_search_spec.rb @@ -1,10 +1,10 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" -describe MusicBrainz::Bindings::TrackSearch do +describe MusicBrainz::Bindings::RecordingSearch do describe '.parse' do - it "gets correct Track (really recording) data" do + it "gets correct Recording data" do response = 'King FredToo Much JoyGreen Eggs and Crack' expect(described_class.parse(Nokogiri::XML.parse(response).remove_namespaces!.xpath('/metadata'))).to eq [ { diff --git a/spec/bindings/release_group_search_spec.rb b/spec/bindings/release_group_search_spec.rb index 438d68f..e7a611a 100644 --- a/spec/bindings/release_group_search_spec.rb +++ b/spec/bindings/release_group_search_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/bindings/release_spec.rb b/spec/bindings/release_spec.rb index ac7093a..49324e7 100644 --- a/spec/bindings/release_spec.rb +++ b/spec/bindings/release_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/client_modules/cache_spec.rb b/spec/client_modules/cache_spec.rb index 0abc00e..dfeb16f 100644 --- a/spec/client_modules/cache_spec.rb +++ b/spec/client_modules/cache_spec.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +# -*- encoding : utf-8 -*- require "ostruct" require "spec_helper" diff --git a/spec/deprecated/cache_config_spec.rb b/spec/deprecated/cache_config_spec.rb index 8a80f4f..921f461 100644 --- a/spec/deprecated/cache_config_spec.rb +++ b/spec/deprecated/cache_config_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/deprecated/proxy_config_spec.rb b/spec/deprecated/proxy_config_spec.rb index 3558948..9a65fc0 100644 --- a/spec/deprecated/proxy_config_spec.rb +++ b/spec/deprecated/proxy_config_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/models/artist_spec.rb b/spec/models/artist_spec.rb index 8bc396e..f45ec97 100644 --- a/spec/models/artist_spec.rb +++ b/spec/models/artist_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/models/base_model_spec.rb b/spec/models/base_model_spec.rb index 1f5dc5f..ac32f94 100644 --- a/spec/models/base_model_spec.rb +++ b/spec/models/base_model_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/models/recording_spec.rb b/spec/models/recording_spec.rb new file mode 100644 index 0000000..e6dc071 --- /dev/null +++ b/spec/models/recording_spec.rb @@ -0,0 +1,32 @@ +# -*- encoding: utf-8 -*- + +require "spec_helper" + +describe MusicBrainz::Recording do + describe '.find' do + it "gets no exception while loading release info" do + lambda { + MusicBrainz::Recording.find("b3015bab-1540-4d4e-9f30-14872a1525f7") + }.should_not raise_error(Exception) + end + + it "gets correct instance" do + track = MusicBrainz::Recording.find("b3015bab-1540-4d4e-9f30-14872a1525f7") + track.should be_an_instance_of(MusicBrainz::Recording) + end + + it "gets correct track data" do + track = MusicBrainz::Recording.find("b3015bab-1540-4d4e-9f30-14872a1525f7") + track.title.should == "Empire" + end + end + + describe '.search' do + it "searches tracks (aka recordings) by artist name and title" do + matches = MusicBrainz::Recording.search('Bound for the floor', 'Local H') + matches.length.should be > 0 + matches.first[:title].should == "Bound for the Floor" + matches.first[:artist].should == "Local H" + end + end +end diff --git a/spec/models/release_group_spec.rb b/spec/models/release_group_spec.rb index 8d7c3d9..d88387d 100644 --- a/spec/models/release_group_spec.rb +++ b/spec/models/release_group_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 7453fd7..7e6d371 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" diff --git a/spec/models/track_spec.rb b/spec/models/track_spec.rb index acefb8e..1b08c29 100644 --- a/spec/models/track_spec.rb +++ b/spec/models/track_spec.rb @@ -1,4 +1,4 @@ -# -*- encoding: utf-8 -*- +# -*- encoding : utf-8 -*- require "spec_helper" @@ -22,13 +22,4 @@ describe MusicBrainz::Track do track.length.should == 233013 end end - - describe '.search' do - it "searches tracks (aka recordings) by artist name and title" do - matches = MusicBrainz::Track.search('Local H', 'Bound for the floor') - matches.length.should be > 0 - matches.first[:title].should == 'Empire' - matches.first[:type].should == 'Album' - end - end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1440536..5df3849 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,3 +1,4 @@ +# -*- encoding : utf-8 -*- require "rubygems" require "bundler/setup" require "musicbrainz"