lastfm 1.26.0 → 1.27.4

This diff has not been reviewed by any users.
Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -2
  3. data/.travis.yml +3 -0
  4. data/README.md +14 -5
  5. data/lastfm.gemspec +3 -4
  6. data/lib/lastfm.rb +0 -1
  7. data/lib/lastfm/method_category/album.rb +68 -1
  8. data/lib/lastfm/method_category/artist.rb +7 -0
  9. data/lib/lastfm/method_category/base.rb +1 -1
  10. data/lib/lastfm/method_category/track.rb +5 -2
  11. data/lib/lastfm/method_category/user.rb +2 -2
  12. data/lib/lastfm/response.rb +19 -1
  13. data/lib/lastfm/util.rb +6 -11
  14. data/spec/fixtures/album_get_buylinks.xml +31 -0
  15. data/spec/fixtures/album_get_info_without_release_date.xml +184 -0
  16. data/spec/fixtures/album_get_shouts.xml +15 -0
  17. data/spec/fixtures/album_get_tags.xml +13 -0
  18. data/spec/fixtures/album_get_top_tags.xml +15 -0
  19. data/spec/fixtures/album_search.xml +35 -0
  20. data/spec/fixtures/album_search_no_match.xml +10 -0
  21. data/spec/fixtures/album_search_single_album.xml +23 -0
  22. data/spec/fixtures/artist_get_correction.xml +12 -0
  23. data/spec/fixtures/artist_search.xml +1 -1
  24. data/spec/fixtures/tag_search.xml +1 -1
  25. data/spec/fixtures/track_search_no_match.xml +11 -0
  26. data/spec/fixtures/track_search_single_track.xml +1 -1
  27. data/spec/fixtures/user_get_loved_tracks_no_tracks.xml +5 -0
  28. data/spec/fixtures/user_get_loved_tracks_single_track.xml +17 -0
  29. data/spec/lastfm_spec.rb +34 -34
  30. data/spec/method_category_spec.rb +1 -1
  31. data/spec/method_specs/album_spec.rb +255 -25
  32. data/spec/method_specs/artist_spec.rb +82 -70
  33. data/spec/method_specs/chart_spec.rb +13 -13
  34. data/spec/method_specs/event_spec.rb +3 -3
  35. data/spec/method_specs/geo_spec.rb +13 -13
  36. data/spec/method_specs/group_spec.rb +4 -4
  37. data/spec/method_specs/library_spec.rb +7 -7
  38. data/spec/method_specs/radio_spec.rb +10 -10
  39. data/spec/method_specs/tag_spec.rb +28 -28
  40. data/spec/method_specs/tasteometer_spec.rb +4 -4
  41. data/spec/method_specs/track_spec.rb +91 -73
  42. data/spec/method_specs/user_spec.rb +124 -94
  43. data/spec/response_spec.rb +6 -6
  44. data/spec/util_spec.rb +16 -16
  45. metadata +33 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d75da0eb84e97b713db6269b03898aa030dd269
4
- data.tar.gz: e634865474c9d7f0942537d34c059bac4a030d3e
3
+ metadata.gz: 97fb464cf27713555c45f696a2c7489906c6d8dc
4
+ data.tar.gz: 93856d36bde02f40e1b9180f151e29363fc51ef8
5
5
  SHA512:
6
- metadata.gz: 31bd09f2c32dfb2a080cf4f543a2efe8b64a117993308e97051547f4ca8129b7def45e9fbbf824a7e4bcfc9b15b142dd77570a8282748cdc1e80f477b6faa4c9
7
- data.tar.gz: 8950457ca4a2fdcbd0f113979152dadaec1ae293f25ecae9f8b6acac977289e0d288a585881bbef92993707be9f4831703630b96070d568e86d8b13a76512286
6
+ metadata.gz: 0f0c940d644e5fd4f4c55d0c77ef4e1fa8be5e5252e9e00a2552296745ab4f892478da72d09021b752a7770035c76e065cd8941d900b3d16c2bf6afaa04e3259
7
+ data.tar.gz: 874c706e479275dbff678f62bee3dd87767e8c074722dd4bc08161a1981becbb80608a118f35abdd536353781cbed9c654be7de32a98cb06786289ad29db9d8e
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- -c
2
- -fs
1
+ --color
2
+ --format documentation
@@ -1,3 +1,6 @@
1
+ language: ruby
2
+ before_install:
3
+ - gem update bundler
1
4
  rvm:
2
5
  - 1.9.3
3
6
  - 2.0.0
data/README.md CHANGED
@@ -24,6 +24,7 @@ lastfm.track.update_now_playing(artist: 'Hujiko Pro', track: 'acid acid 7riddim'
24
24
  * 1.9.3
25
25
  * 2.0.0
26
26
  * 2.1.0
27
+ * 2.2.0
27
28
 
28
29
  ## Supported API Methods
29
30
 
@@ -31,11 +32,19 @@ It supports methods which require [authentication](http://www.last.fm/api/authen
31
32
 
32
33
  ### Album
33
34
 
35
+ * [album.addTags](http://www.last.fm/api/show/album.addTags)
36
+ * [album.getBuylinks](http://www.last.fm/api/show/album.getBuylinks)
34
37
  * [album.getInfo](http://www.last.fm/api/show?service=290)
38
+ * [album.getShouts](http://www.last.fm/api/show/album.getShouts)
39
+ * [album.getTags](http://www.last.fm/api/show/album.getTags)
40
+ * [album.getTopTags](http://www.last.fm/api/show/album.getTopTags)
41
+ * [album.removeTag](http://www.last.fm/api/show/album.removeTag)
42
+ * [album.search](http://www.last.fm/api/show/album.search)
43
+ * [album.share](http://www.last.fm/api/show/album.share)
35
44
 
36
45
  ### Artist
37
46
 
38
- * [artist.getEvents](http://www.last.fm/api/show?service=117)
47
+ * ~~[artist.gets](http://www.last.fm/api/show?service=117)~~ deleted
39
48
  * [artist.getInfo](http://www.last.fm/api/show?service=267)
40
49
  * [artist.getSimilar](http://www.last.fm/api/show?service=267)
41
50
  * [artist.getTags](http://www.last.fm/api/show?service=267)
@@ -53,7 +62,7 @@ It supports methods which require [authentication](http://www.last.fm/api/authen
53
62
 
54
63
  ### Event
55
64
 
56
- * [event.getInfo](http://www.last.fm/api/show/event.getInfo)
65
+ * ~~[event.getInfo](http://www.last.fm/api/show/event.getInfo)~~ deleted
57
66
 
58
67
  ### Radio
59
68
 
@@ -69,7 +78,7 @@ It supports methods which require [authentication](http://www.last.fm/api/authen
69
78
 
70
79
  ### Tasteometer
71
80
 
72
- * [tasteometer.compare](http://www.last.fm/api/show/tasteometer.compare)
81
+ * ~~[tasteometer.compare](http://www.last.fm/api/show/tasteometer.compare)~~ deleted
73
82
 
74
83
  ### Track
75
84
 
@@ -97,7 +106,7 @@ It supports methods which require [authentication](http://www.last.fm/api/authen
97
106
  * [user.getNeighbours](http://www.last.fm/api/show?service=264)
98
107
  * [user.getPersonalTags](http://www.last.fm/api/show/user.getPersonalTags)
99
108
  * [user.getRecentTracks](http://www.last.fm/api/show?service=278)
100
- * [user.getRecommendedEvents](http://www.last.fm/api/show/user.getRecommendedEvents)
109
+ * ~~[user.getRecommendedEvents](http://www.last.fm/api/show/user.getRecommendedEvents)~~ deleted
101
110
  * [user.getRecommendedArtists](http://www.last.fm/api/show/user.getRecommendedArtists)
102
111
  * [user.getTopArtists](http://www.last.fm/api/show/user.getTopArtists)
103
112
  * [user.getTopAlbums](http://www.last.fm/api/show/user.getTopAlbums)
@@ -110,7 +119,7 @@ It supports methods which require [authentication](http://www.last.fm/api/authen
110
119
 
111
120
  ### Geo
112
121
 
113
- * [geo.getEvents](http://www.last.fm/api/show?service#270)
122
+ * ~~[geo.getEvents](http://www.last.fm/api/show?service#270)~~ deleted
114
123
 
115
124
  ### Group
116
125
 
@@ -12,13 +12,12 @@ Gem::Specification.new do |gem|
12
12
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
13
  gem.name = %q{lastfm}
14
14
  gem.require_paths = ["lib"]
15
- gem.version = "1.26.0"
15
+ gem.version = "1.27.4"
16
16
  gem.license = 'MIT'
17
17
 
18
18
  gem.add_dependency "xml-simple"
19
19
  gem.add_dependency "httparty"
20
- gem.add_dependency 'activesupport', '>= 3.2.0'
21
20
 
22
- gem.add_development_dependency('rspec', ['~> 2.8.0'])
23
- gem.add_development_dependency('rake')
21
+ gem.add_development_dependency('rspec', ['~> 3.4.0'])
22
+ gem.add_development_dependency('rake', '< 12.3.3')
24
23
  end
@@ -1,7 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'digest/md5'
3
3
  require 'httparty'
4
- require 'active_support/core_ext/string/inflections'
5
4
 
6
5
  require 'lastfm/util'
7
6
  require 'lastfm/response'
@@ -1,15 +1,82 @@
1
1
  class Lastfm
2
2
  module MethodCategory
3
3
  class Album < Base
4
+ write_method :add_tags, :required => [:artist, :album, :tags]
5
+
6
+ write_method :remove_tag, :required => [:artist, :album, :tag]
7
+
8
+ write_method(
9
+ :share,
10
+ :required => [:artist, :album, :recipient],
11
+ :optional => [
12
+ [:public, nil],
13
+ [:message, nil]
14
+ ]
15
+ )
16
+
17
+ regular_method(
18
+ :get_buylinks,
19
+ :required => any_params([:artist, :album, :country], [:mbid, :country]),
20
+ :optional => [
21
+ [:autocorrect, nil]
22
+ ]
23
+ ) do |response|
24
+ response.xml['affiliations']
25
+ end
26
+
4
27
  regular_method(
5
28
  :get_info,
6
29
  :required => any_params([:artist, :album], :mbid)
7
30
  ) do |response|
8
31
  result = response.xml['album']
9
32
 
10
- result['releasedate'].lstrip! unless result['releasedate'].empty?
33
+ result['releasedate'].lstrip! unless result.nil? || result['releasedate'].nil? || result['releasedate'].empty?
11
34
  result
12
35
  end
36
+
37
+ regular_method(
38
+ :get_shouts,
39
+ :required => any_params([:artist, :album], :mbid),
40
+ :optional => [
41
+ [:limit, nil],
42
+ [:autocorrect, nil],
43
+ [:page, nil]
44
+ ]
45
+ ) do |response|
46
+ response.xml['shouts']['shout'] = Util.force_array(response.xml['shouts']['shout'])
47
+ end
48
+
49
+ regular_method(
50
+ :get_top_tags,
51
+ :required => [:artist, :album],
52
+ :optional => [
53
+ [:autocorrect, nil]
54
+ ]
55
+ ) do |response|
56
+ response.xml['toptags']['tag'] = Util.force_array(response.xml['toptags']['tag'])
57
+ end
58
+
59
+ regular_method(
60
+ :search,
61
+ :required => [:album],
62
+ :optional => [
63
+ [:limit, nil],
64
+ [:page, nil]
65
+ ]
66
+ ) do |response|
67
+ response.xml['results']['albummatches']['album'] = Util.force_array(response.xml['results']['albummatches']['album'])
68
+ response.xml
69
+ end
70
+
71
+ method_with_authentication(
72
+ :get_tags,
73
+ :required => any_params([:artist, :album], :mbid),
74
+ :optional => [
75
+ [:autocorrect, nil],
76
+ ]
77
+ ) do |response|
78
+ response.xml['tags']['tag'] = Util.force_array(response.xml['tags']['tag'])
79
+ end
13
80
  end
14
81
  end
15
82
  end
@@ -22,6 +22,13 @@ class Lastfm
22
22
  response.xml['artist']
23
23
  end
24
24
 
25
+ regular_method(
26
+ :get_correction,
27
+ :required => [:artist]
28
+ ) do |response|
29
+ response.xml['corrections']['correction']
30
+ end
31
+
25
32
  regular_method(
26
33
  :get_events,
27
34
  :required => any_params([:artist], [:mbid])
@@ -45,7 +45,7 @@ class Lastfm
45
45
  block.call(
46
46
  send(
47
47
  method,
48
- id.to_s.camelize(:lower),
48
+ id.to_s.gsub(/_[a-z]/){ |s| s[1].upcase },
49
49
  Lastfm::Util.build_options(
50
50
  args,
51
51
  params[:required],
@@ -71,7 +71,10 @@ class Lastfm
71
71
 
72
72
  regular_method(
73
73
  :get_similar,
74
- :required => [:artist, :track]
74
+ :required => [:artist, :track],
75
+ :optional => [
76
+ [:limit, nil]
77
+ ]
75
78
  ) do |response|
76
79
  response.xml['similartracks']['track'][1 .. -1]
77
80
  end
@@ -89,7 +92,7 @@ class Lastfm
89
92
  response.xml
90
93
  end
91
94
 
92
- method_with_authentication(
95
+ regular_method(
93
96
  :get_tags,
94
97
  :required => [:artist, :track]
95
98
  ) do |response|
@@ -14,7 +14,7 @@ class Lastfm
14
14
  end
15
15
 
16
16
  def get_info(*args)
17
- method = :get_info.to_s.camelize(:lower)
17
+ method = 'getInfo'
18
18
  response = if args.any?
19
19
  options = Lastfm::Util.build_options(args, [:user], [])
20
20
  request(method, options)
@@ -33,7 +33,7 @@ class Lastfm
33
33
  [:page, nil]
34
34
  ]
35
35
  ) do |response|
36
- response.xml['lovedtracks']['track']
36
+ response.xml['lovedtracks']['track'] = Util.force_array(response.xml['lovedtracks']['track'])
37
37
  end
38
38
 
39
39
  regular_method(
@@ -6,9 +6,13 @@ class Lastfm
6
6
  attr_reader :xml
7
7
 
8
8
  def initialize(body)
9
+ # workaround for https://github.com/youpy/ruby-lastfm/issues/83
10
+ body = fix_body(body)
11
+
9
12
  @xml = XmlSimple.xml_in(body, 'ForceArray' => ['image', 'tag', 'user', 'event', 'correction'])
10
13
  rescue REXML::ParseException
11
- @xml = XmlSimple.xml_in(body.encode(Encoding.find("ISO-8859-1"), :undef => :replace), 'ForceArray' => ['image', 'tag', 'user', 'event', 'correction'])
14
+ @xml = XmlSimple.xml_in(body.encode(Encoding.find("ISO-8859-1"), :undef => :replace),
15
+ 'ForceArray' => ['image', 'tag', 'user', 'event', 'correction'])
12
16
  end
13
17
 
14
18
  def success?
@@ -22,5 +26,19 @@ class Lastfm
22
26
  def error
23
27
  @xml['error']['code'].to_i
24
28
  end
29
+
30
+ private
31
+
32
+ def fix_body(body)
33
+ namespace_attr = 'xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"'
34
+
35
+ body.sub(/(<results[^>]*)/) do |str|
36
+ if str.match(namespace_attr)
37
+ str
38
+ else
39
+ '%s %s' % [str, namespace_attr]
40
+ end
41
+ end
42
+ end
25
43
  end
26
44
  end
@@ -1,7 +1,7 @@
1
1
  class Lastfm
2
2
  class Util
3
3
  def self.force_array(array_or_something)
4
- array_or_something.kind_of?(Array) ? array_or_something : [array_or_something]
4
+ array_or_something.kind_of?(Array) ? array_or_something : [array_or_something].compact
5
5
  end
6
6
 
7
7
  def self.build_options(args, mandatory, optional)
@@ -14,18 +14,13 @@ class Lastfm
14
14
 
15
15
  def self.build_options_from_hash(options, mandatory, optional)
16
16
  candidates = mandatory.kind_of?(AnyParams) ? mandatory.candidates : [mandatory]
17
- candidates.each_with_index do |params, index|
18
- Array(params).each do |param|
19
- if !options.has_key?(param)
20
- if params.equal? candidates.last
21
- raise ArgumentError.new("%s is required" % param)
22
- else
23
- next
24
- end
25
- end
17
+ candidates.each do |params|
18
+ missing_param = Array(params).any? { |param| !options.key?(param) }
19
+ if missing_param && params.equal?(candidates.last)
20
+ raise ArgumentError.new("%s is required" % candidates.map{ |c| Array(c).join(', ')}.join(' or '))
26
21
  end
27
22
 
28
- break
23
+ break unless missing_param
29
24
  end
30
25
 
31
26
  optional.each do |name, value|
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <lfm status="ok">
3
+ <affiliations>
4
+ <physicals>
5
+ <affiliation>
6
+ <supplierName>Amazon</supplierName>
7
+ <price>
8
+ <currency>GBP</currency>
9
+ <amount>6.34</amount>
10
+ <formatted>£6.34</formatted>
11
+ </price>
12
+ <buyLink>http://www.last.fm/affiliate/byid/8/3418994/1/ws.album.buylinks.f4e2585261d8d10d3297e181d68940fc</buyLink>
13
+ <supplierIcon>http://cdn.last.fm/favicons/1/amazon.gif</supplierIcon>
14
+ <isSearch>0</isSearch>
15
+ </affiliation>
16
+ </physicals>
17
+ <downloads>
18
+ <affiliation>
19
+ <supplierName>Amazon MP3</supplierName>
20
+ <price>
21
+ <currency>GBP</currency>
22
+ <amount>7.99</amount>
23
+ <formatted>£7.99</formatted>
24
+ </price>
25
+ <buyLink>http://www.last.fm/affiliate/byid/8/3418994/44/ws.album.buylinks.f4e2585261d8d10d3297e181d68940fc</buyLink>
26
+ <supplierIcon>http://cdn.last.fm/favicons/amazon-mp3-16x16-a.gif</supplierIcon>
27
+ <isSearch>0</isSearch>
28
+ </affiliation>
29
+ </downloads>
30
+ </affiliations>
31
+ </lfm>
@@ -0,0 +1,184 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <lfm status="ok">
3
+ <album>
4
+ <name>Believe</name>
5
+ <artist>Cher</artist>
6
+ <id>2026126</id>
7
+ <mbid>61bf0388-b8a9-48f4-81d1-7eb02706dfb0</mbid>
8
+ <url>http://www.last.fm/music/Cher/Believe</url>
9
+ <image size="small">http://userserve-ak.last.fm/serve/34s/42806845.png</image>
10
+ <image size="medium">http://userserve-ak.last.fm/serve/64s/42806845.png</image>
11
+ <image size="large">http://userserve-ak.last.fm/serve/174s/42806845.png</image>
12
+ <image size="extralarge">http://userserve-ak.last.fm/serve/300x300/42806845.png</image>
13
+ <image size="mega">http://userserve-ak.last.fm/serve/_/42806845/Believe++600++600+PNG.png</image>
14
+ <listeners>179749</listeners>
15
+ <playcount>838056</playcount>
16
+ <tracks>
17
+ <track rank="1">
18
+ <name>Believe</name>
19
+ <duration>239</duration>
20
+ <mbid/>
21
+ <url>http://www.last.fm/music/Cher/_/Believe</url>
22
+ <streamable fulltrack="0">1</streamable>
23
+ <artist>
24
+ <name>Cher</name>
25
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
26
+ <url>http://www.last.fm/music/Cher</url>
27
+ </artist>
28
+ </track>
29
+ <track rank="2">
30
+ <name>The Power</name>
31
+ <duration>235</duration>
32
+ <mbid/>
33
+ <url>http://www.last.fm/music/Cher/_/The+Power</url>
34
+ <streamable fulltrack="0">0</streamable>
35
+ <artist>
36
+ <name>Cher</name>
37
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
38
+ <url>http://www.last.fm/music/Cher</url>
39
+ </artist>
40
+ </track>
41
+ <track rank="3">
42
+ <name>Runaway</name>
43
+ <duration>285</duration>
44
+ <mbid/>
45
+ <url>http://www.last.fm/music/Cher/_/Runaway</url>
46
+ <streamable fulltrack="0">0</streamable>
47
+ <artist>
48
+ <name>Cher</name>
49
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
50
+ <url>http://www.last.fm/music/Cher</url>
51
+ </artist>
52
+ </track>
53
+ <track rank="4">
54
+ <name>All Or Nothing</name>
55
+ <duration>237</duration>
56
+ <mbid/>
57
+ <url>http://www.last.fm/music/Cher/_/All+Or+Nothing</url>
58
+ <streamable fulltrack="0">1</streamable>
59
+ <artist>
60
+ <name>Cher</name>
61
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
62
+ <url>http://www.last.fm/music/Cher</url>
63
+ </artist>
64
+ </track>
65
+ <track rank="5">
66
+ <name>Strong Enough</name>
67
+ <duration>223</duration>
68
+ <mbid/>
69
+ <url>http://www.last.fm/music/Cher/_/Strong+Enough</url>
70
+ <streamable fulltrack="0">1</streamable>
71
+ <artist>
72
+ <name>Cher</name>
73
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
74
+ <url>http://www.last.fm/music/Cher</url>
75
+ </artist>
76
+ </track>
77
+ <track rank="6">
78
+ <name>Dov'è l'amore</name>
79
+ <duration>257</duration>
80
+ <mbid/>
81
+ <url>http://www.last.fm/music/Cher/_/Dov%27%C3%A8+l%27amore</url>
82
+ <streamable fulltrack="0">0</streamable>
83
+ <artist>
84
+ <name>Cher</name>
85
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
86
+ <url>http://www.last.fm/music/Cher</url>
87
+ </artist>
88
+ </track>
89
+ <track rank="7">
90
+ <name>Takin' Back My Heart</name>
91
+ <duration>271</duration>
92
+ <mbid/>
93
+ <url>http://www.last.fm/music/Cher/_/Takin%27+Back+My+Heart</url>
94
+ <streamable fulltrack="0">0</streamable>
95
+ <artist>
96
+ <name>Cher</name>
97
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
98
+ <url>http://www.last.fm/music/Cher</url>
99
+ </artist>
100
+ </track>
101
+ <track rank="8">
102
+ <name>Taxi Taxi</name>
103
+ <duration>302</duration>
104
+ <mbid/>
105
+ <url>http://www.last.fm/music/Cher/_/Taxi+Taxi</url>
106
+ <streamable fulltrack="0">0</streamable>
107
+ <artist>
108
+ <name>Cher</name>
109
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
110
+ <url>http://www.last.fm/music/Cher</url>
111
+ </artist>
112
+ </track>
113
+ <track rank="9">
114
+ <name>Love Is the Groove</name>
115
+ <duration>270</duration>
116
+ <mbid/>
117
+ <url>http://www.last.fm/music/Cher/_/Love+Is+the+Groove</url>
118
+ <streamable fulltrack="0">0</streamable>
119
+ <artist>
120
+ <name>Cher</name>
121
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
122
+ <url>http://www.last.fm/music/Cher</url>
123
+ </artist>
124
+ </track>
125
+ <track rank="10">
126
+ <name>We All Sleep Alone</name>
127
+ <duration>233</duration>
128
+ <mbid/>
129
+ <url>http://www.last.fm/music/Cher/_/We+All+Sleep+Alone</url>
130
+ <streamable fulltrack="0">1</streamable>
131
+ <artist>
132
+ <name>Cher</name>
133
+ <mbid>bfcc6d75-a6a5-4bc6-8282-47aec8531818</mbid>
134
+ <url>http://www.last.fm/music/Cher</url>
135
+ </artist>
136
+ </track>
137
+ </tracks>
138
+ <toptags>
139
+ <tag>
140
+ <name>pop</name>
141
+ <url>http://www.last.fm/tag/pop</url>
142
+ </tag>
143
+ <tag>
144
+ <name>90s</name>
145
+ <url>http://www.last.fm/tag/90s</url>
146
+ </tag>
147
+ <tag>
148
+ <name>dance</name>
149
+ <url>http://www.last.fm/tag/dance</url>
150
+ </tag>
151
+ <tag>
152
+ <name>1998</name>
153
+ <url>http://www.last.fm/tag/1998</url>
154
+ </tag>
155
+ <tag>
156
+ <name>albums i own</name>
157
+ <url>http://www.last.fm/tag/albums%20i%20own</url>
158
+ </tag>
159
+ </toptags>
160
+ <wiki>
161
+ <published>Sat, 6 Mar 2010 16:48:03 +0000</published>
162
+ <summary><![CDATA[Believe is the twenty-third studio album by American singer-actress Cher, released on November 10, 1998 by Warner Bros. Records. The RIAA certified it Quadruple Platinum on December 23, 1999, recognizing four million shipments in the United States; Worldwide, the album has sold more than 20 million copies, making it the biggest-selling album of her career. In 1999 the album received three Grammy Awards nominations including &quot;Record of the Year&quot;, &quot;Best Pop Album&quot; and winning &quot;Best Dance Recording&quot; for the single &quot;Believe&quot;. ]]></summary>
163
+ <content><![CDATA[Believe is the twenty-third studio album by American singer-actress Cher, released on November 10, 1998 by Warner Bros. Records. The RIAA certified it Quadruple Platinum on December 23, 1999, recognizing four million shipments in the United States; Worldwide, the album has sold more than 20 million copies, making it the biggest-selling album of her career. In 1999 the album received three Grammy Awards nominations including &quot;Record of the Year&quot;, &quot;Best Pop Album&quot; and winning &quot;Best Dance Recording&quot; for the single &quot;Believe&quot;.
164
+
165
+ It was released by Warner Bros. Records at the end of 1998. The album was executive produced by Rob Dickens. Upon its debut, critical reception was generally positive. Believe became Cher's most commercially-successful release, reached number one and Top 10 all over the world. In the United States, the album was released on November 10, 1998, and reached number four on the Billboard 200 chart, where it was certified four times platinum.
166
+
167
+ The album featured a change in Cher's music; in addition, Believe presented a vocally stronger Cher and a massive use of vocoder and Auto-Tune. In 1999, the album received 3 Grammy Awards nominations for &quot;Record of the Year&quot;, &quot;Best Pop Album&quot; and winning &quot;Best Dance Recording&quot;. Throughout 1999 and into 2000 Cher was nominated and winning many awards for the album including a Billboard Music Award for &quot;Female Vocalist of the Year&quot;, Lifelong Contribution Awards and a Star on the Walk of Fame shared with former Sonny Bono. The boost in Cher's popularity led to a very successful Do You Believe? Tour.
168
+
169
+ The album was dedicated to Sonny Bono, Cher's former husband who died earlier that year from a skiing accident.
170
+
171
+ Cher also recorded a cover version of &quot;Love Is in the Air&quot; during early sessions for this album. Although never officially released, the song has leaked on file sharing networks.
172
+
173
+ Singles
174
+
175
+
176
+ &quot;Believe&quot;
177
+ &quot;Strong Enough&quot;
178
+ &quot;All or Nothing&quot;
179
+ &quot;Dov'è L'Amore&quot;
180
+
181
+ User-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL.]]></content>
182
+ </wiki>
183
+ </album>
184
+ </lfm>