shortwave 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. data/.document +5 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +3 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +74 -0
  6. data/Rakefile +133 -0
  7. data/VERSION +1 -0
  8. data/lib/shortwave.rb +12 -0
  9. data/lib/shortwave/authentication.rb +107 -0
  10. data/lib/shortwave/facade.rb +3 -0
  11. data/lib/shortwave/facade/build/facade_builder.rb +199 -0
  12. data/lib/shortwave/facade/build/facade_template.erb +17 -0
  13. data/lib/shortwave/facade/lastfm.rb +878 -0
  14. data/lib/shortwave/facade/remote.rb +86 -0
  15. data/lib/shortwave/model/album.rb +33 -0
  16. data/lib/shortwave/model/artist.rb +62 -0
  17. data/lib/shortwave/model/base_model.rb +112 -0
  18. data/lib/shortwave/model/chart_dates.rb +15 -0
  19. data/lib/shortwave/model/comparison.rb +15 -0
  20. data/lib/shortwave/model/event.rb +55 -0
  21. data/lib/shortwave/model/group.rb +26 -0
  22. data/lib/shortwave/model/location.rb +45 -0
  23. data/lib/shortwave/model/playlist.rb +36 -0
  24. data/lib/shortwave/model/shout.rb +21 -0
  25. data/lib/shortwave/model/tag.rb +47 -0
  26. data/lib/shortwave/model/track.rb +71 -0
  27. data/lib/shortwave/model/user.rb +70 -0
  28. data/lib/shortwave/model/venue.rb +37 -0
  29. data/lib/shortwave/model/weekly_charts.rb +31 -0
  30. data/lib/shortwave/providers.rb +161 -0
  31. data/shortwave.gemspec +178 -0
  32. data/test/authentication_test.rb +64 -0
  33. data/test/build/build_test.rb +25 -0
  34. data/test/build/data/intro.yml +2 -0
  35. data/test/build/data/screens/album_addTags.html +1238 -0
  36. data/test/build/data/screens/intro_truncated.html +426 -0
  37. data/test/build/data/screens/tasteometer_compare.html +1274 -0
  38. data/test/build/data/screens/user_getLovedTracks.html +1278 -0
  39. data/test/build/data/screens/venue_search.html +1261 -0
  40. data/test/build/facade_builder_test.rb +23 -0
  41. data/test/build/parameter_test.rb +43 -0
  42. data/test/build/remote_method_test.rb +47 -0
  43. data/test/build/ruby_class_test.rb +12 -0
  44. data/test/build/ruby_method_test.rb +137 -0
  45. data/test/helper.rb +35 -0
  46. data/test/model/album_test.rb +62 -0
  47. data/test/model/artist_test.rb +103 -0
  48. data/test/model/chart_dates_test.rb +11 -0
  49. data/test/model/comparison_test.rb +18 -0
  50. data/test/model/data/album_info.xml +38 -0
  51. data/test/model/data/album_search.xml +210 -0
  52. data/test/model/data/artist_info.xml +58 -0
  53. data/test/model/data/artist_search.xml +109 -0
  54. data/test/model/data/artist_shouts.xml +546 -0
  55. data/test/model/data/artist_top_fans.xml +405 -0
  56. data/test/model/data/event_info.xml +47 -0
  57. data/test/model/data/group_members.xml +242 -0
  58. data/test/model/data/group_weekly_album_chart.xml +1754 -0
  59. data/test/model/data/group_weekly_artist_chart.xml +604 -0
  60. data/test/model/data/group_weekly_track_chart.xml +1005 -0
  61. data/test/model/data/location_events.xml +383 -0
  62. data/test/model/data/ok.xml +2 -0
  63. data/test/model/data/playlist_fetch.xml +227 -0
  64. data/test/model/data/tag_search.xml +110 -0
  65. data/test/model/data/tag_similar.xml +254 -0
  66. data/test/model/data/tag_top_albums.xml +805 -0
  67. data/test/model/data/tag_top_artists.xml +605 -0
  68. data/test/model/data/tag_top_tags.xml +1254 -0
  69. data/test/model/data/tag_top_tracks.xml +843 -0
  70. data/test/model/data/tag_weekly_chart_list.xml +57 -0
  71. data/test/model/data/tasteometer_compare.xml +54 -0
  72. data/test/model/data/track_info.xml +53 -0
  73. data/test/model/data/track_search.xml +195 -0
  74. data/test/model/data/user_chartlist.xml +90 -0
  75. data/test/model/data/user_info.xml +16 -0
  76. data/test/model/data/user_neighbours.xml +484 -0
  77. data/test/model/data/user_playlists.xml +17 -0
  78. data/test/model/data/user_recent_tracks.xml +124 -0
  79. data/test/model/data/user_recommended_artists.xml +454 -0
  80. data/test/model/data/user_shouts.xml +9 -0
  81. data/test/model/data/user_weekly_artist_chart.xml +478 -0
  82. data/test/model/data/venue_events.xml +556 -0
  83. data/test/model/data/venue_past_events.xml +1778 -0
  84. data/test/model/data/venue_search.xml +355 -0
  85. data/test/model/event_test.rb +63 -0
  86. data/test/model/group_test.rb +45 -0
  87. data/test/model/location_test.rb +25 -0
  88. data/test/model/playlist_test.rb +51 -0
  89. data/test/model/shout_test.rb +23 -0
  90. data/test/model/tag_test.rb +39 -0
  91. data/test/model/track_test.rb +67 -0
  92. data/test/model/user_test.rb +125 -0
  93. data/test/model/venue_test.rb +60 -0
  94. data/test/provider/album_provider_test.rb +26 -0
  95. data/test/provider/artist_provider_test.rb +25 -0
  96. data/test/provider/group_provider_test.rb +9 -0
  97. data/test/provider/location_provider_test.rb +9 -0
  98. data/test/provider/playlist_provider_test.rb +12 -0
  99. data/test/provider/tag_provider_test.rb +24 -0
  100. data/test/provider/track_provider_test.rb +26 -0
  101. data/test/provider/user_provider_test.rb +11 -0
  102. data/test/provider/venue_provider_test.rb +15 -0
  103. data/test/provider_test_helper.rb +27 -0
  104. data/test/remote_test.rb +26 -0
  105. metadata +209 -0
data/shortwave.gemspec ADDED
@@ -0,0 +1,178 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{shortwave}
5
+ s.version = "0.0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Roland Swingler"]
9
+ s.date = %q{2009-06-11}
10
+ s.email = %q{roland.swingler@gmail.com}
11
+ s.extra_rdoc_files = [
12
+ "LICENSE",
13
+ "README.rdoc"
14
+ ]
15
+ s.files = [
16
+ ".document",
17
+ ".gitignore",
18
+ ".gitmodules",
19
+ "LICENSE",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "lib/shortwave.rb",
24
+ "lib/shortwave/authentication.rb",
25
+ "lib/shortwave/facade.rb",
26
+ "lib/shortwave/facade/build/facade_builder.rb",
27
+ "lib/shortwave/facade/build/facade_template.erb",
28
+ "lib/shortwave/facade/lastfm.rb",
29
+ "lib/shortwave/facade/remote.rb",
30
+ "lib/shortwave/model/album.rb",
31
+ "lib/shortwave/model/artist.rb",
32
+ "lib/shortwave/model/base_model.rb",
33
+ "lib/shortwave/model/chart_dates.rb",
34
+ "lib/shortwave/model/comparison.rb",
35
+ "lib/shortwave/model/event.rb",
36
+ "lib/shortwave/model/group.rb",
37
+ "lib/shortwave/model/location.rb",
38
+ "lib/shortwave/model/playlist.rb",
39
+ "lib/shortwave/model/shout.rb",
40
+ "lib/shortwave/model/tag.rb",
41
+ "lib/shortwave/model/track.rb",
42
+ "lib/shortwave/model/user.rb",
43
+ "lib/shortwave/model/venue.rb",
44
+ "lib/shortwave/model/weekly_charts.rb",
45
+ "lib/shortwave/providers.rb",
46
+ "shortwave.gemspec",
47
+ "test/authentication_test.rb",
48
+ "test/build/build_test.rb",
49
+ "test/build/data/intro.yml",
50
+ "test/build/data/screens/album_addTags.html",
51
+ "test/build/data/screens/intro_truncated.html",
52
+ "test/build/data/screens/tasteometer_compare.html",
53
+ "test/build/data/screens/user_getLovedTracks.html",
54
+ "test/build/data/screens/venue_search.html",
55
+ "test/build/facade_builder_test.rb",
56
+ "test/build/parameter_test.rb",
57
+ "test/build/remote_method_test.rb",
58
+ "test/build/ruby_class_test.rb",
59
+ "test/build/ruby_method_test.rb",
60
+ "test/helper.rb",
61
+ "test/model/album_test.rb",
62
+ "test/model/artist_test.rb",
63
+ "test/model/chart_dates_test.rb",
64
+ "test/model/comparison_test.rb",
65
+ "test/model/data/album_info.xml",
66
+ "test/model/data/album_search.xml",
67
+ "test/model/data/artist_info.xml",
68
+ "test/model/data/artist_search.xml",
69
+ "test/model/data/artist_shouts.xml",
70
+ "test/model/data/artist_top_fans.xml",
71
+ "test/model/data/event_info.xml",
72
+ "test/model/data/group_members.xml",
73
+ "test/model/data/group_weekly_album_chart.xml",
74
+ "test/model/data/group_weekly_artist_chart.xml",
75
+ "test/model/data/group_weekly_track_chart.xml",
76
+ "test/model/data/location_events.xml",
77
+ "test/model/data/ok.xml",
78
+ "test/model/data/playlist_fetch.xml",
79
+ "test/model/data/tag_search.xml",
80
+ "test/model/data/tag_similar.xml",
81
+ "test/model/data/tag_top_albums.xml",
82
+ "test/model/data/tag_top_artists.xml",
83
+ "test/model/data/tag_top_tags.xml",
84
+ "test/model/data/tag_top_tracks.xml",
85
+ "test/model/data/tag_weekly_chart_list.xml",
86
+ "test/model/data/tasteometer_compare.xml",
87
+ "test/model/data/track_info.xml",
88
+ "test/model/data/track_search.xml",
89
+ "test/model/data/user_chartlist.xml",
90
+ "test/model/data/user_info.xml",
91
+ "test/model/data/user_neighbours.xml",
92
+ "test/model/data/user_playlists.xml",
93
+ "test/model/data/user_recent_tracks.xml",
94
+ "test/model/data/user_recommended_artists.xml",
95
+ "test/model/data/user_shouts.xml",
96
+ "test/model/data/user_weekly_artist_chart.xml",
97
+ "test/model/data/venue_events.xml",
98
+ "test/model/data/venue_past_events.xml",
99
+ "test/model/data/venue_search.xml",
100
+ "test/model/event_test.rb",
101
+ "test/model/group_test.rb",
102
+ "test/model/location_test.rb",
103
+ "test/model/playlist_test.rb",
104
+ "test/model/shout_test.rb",
105
+ "test/model/tag_test.rb",
106
+ "test/model/track_test.rb",
107
+ "test/model/user_test.rb",
108
+ "test/model/venue_test.rb",
109
+ "test/provider/album_provider_test.rb",
110
+ "test/provider/artist_provider_test.rb",
111
+ "test/provider/group_provider_test.rb",
112
+ "test/provider/location_provider_test.rb",
113
+ "test/provider/playlist_provider_test.rb",
114
+ "test/provider/tag_provider_test.rb",
115
+ "test/provider/track_provider_test.rb",
116
+ "test/provider/user_provider_test.rb",
117
+ "test/provider/venue_provider_test.rb",
118
+ "test/provider_test_helper.rb",
119
+ "test/remote_test.rb"
120
+ ]
121
+ s.has_rdoc = true
122
+ s.homepage = %q{http://shortwave.rubyforge.org}
123
+ s.rdoc_options = ["--charset=UTF-8"]
124
+ s.require_paths = ["lib"]
125
+ s.rubyforge_project = %q{shortwave}
126
+ s.rubygems_version = %q{1.3.2}
127
+ s.summary = %q{A Last.fm API wrapper}
128
+ s.test_files = [
129
+ "test/helper.rb",
130
+ "test/model/location_test.rb",
131
+ "test/model/tag_test.rb",
132
+ "test/model/track_test.rb",
133
+ "test/model/artist_test.rb",
134
+ "test/model/album_test.rb",
135
+ "test/model/playlist_test.rb",
136
+ "test/model/venue_test.rb",
137
+ "test/model/group_test.rb",
138
+ "test/model/shout_test.rb",
139
+ "test/model/user_test.rb",
140
+ "test/model/chart_dates_test.rb",
141
+ "test/model/event_test.rb",
142
+ "test/model/comparison_test.rb",
143
+ "test/provider_test_helper.rb",
144
+ "test/provider/location_provider_test.rb",
145
+ "test/provider/track_provider_test.rb",
146
+ "test/provider/user_provider_test.rb",
147
+ "test/provider/venue_provider_test.rb",
148
+ "test/provider/tag_provider_test.rb",
149
+ "test/provider/group_provider_test.rb",
150
+ "test/provider/playlist_provider_test.rb",
151
+ "test/provider/artist_provider_test.rb",
152
+ "test/provider/album_provider_test.rb",
153
+ "test/authentication_test.rb",
154
+ "test/remote_test.rb",
155
+ "test/build/remote_method_test.rb",
156
+ "test/build/facade_builder_test.rb",
157
+ "test/build/ruby_class_test.rb",
158
+ "test/build/ruby_method_test.rb",
159
+ "test/build/parameter_test.rb",
160
+ "test/build/build_test.rb"
161
+ ]
162
+
163
+ if s.respond_to? :specification_version then
164
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
165
+ s.specification_version = 3
166
+
167
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
168
+ s.add_runtime_dependency(%q<rest-client>, [">= 0.9.2"])
169
+ s.add_runtime_dependency(%q<nokogiri>, [">= 1.2.3"])
170
+ else
171
+ s.add_dependency(%q<rest-client>, [">= 0.9.2"])
172
+ s.add_dependency(%q<nokogiri>, [">= 1.2.3"])
173
+ end
174
+ else
175
+ s.add_dependency(%q<rest-client>, [">= 0.9.2"])
176
+ s.add_dependency(%q<nokogiri>, [">= 1.2.3"])
177
+ end
178
+ end
@@ -0,0 +1,64 @@
1
+ require 'helper'
2
+ include Shortwave
3
+ include Digest
4
+
5
+ class SessionTest < TestCase
6
+ def setup
7
+ @session = Authentication::Session.new("123", "789")
8
+ end
9
+
10
+ test "can construct a method signature, given a hash of parameters and a secret" do
11
+ params = {:foo => "bar", :api_key => 123}
12
+ assert_equal MD5.hexdigest("api_key123foobar789"), @session.signature(params)
13
+ end
14
+
15
+ test "merges in the api key to the parameters if user authentication is not required" do
16
+ assert_equal( {:foo => "bar", :api_key => "123"}, @session.merge!(:standard, :foo => "bar") )
17
+ end
18
+
19
+ test "raises Authentication error unless session_key is set" do
20
+ assert_raise(Authentication::NotAuthenticated) { @session.merge!(:session, {}) }
21
+ end
22
+
23
+ test "can be constructed with a session key" do
24
+ @session = Authentication::Session.new("123", "456", "789")
25
+ assert @session.signed_in?
26
+ end
27
+ test "session can produce providers" do
28
+ assert @session.tag.kind_of?(Provider::TagProvider)
29
+ end
30
+ end
31
+
32
+ class MobileAuthenticationTest < TestCase
33
+ test "mobile session calls through to Last.fm api" do
34
+ FakeWeb.register_uri :get, "http://ws.audioscrobbler.com/2.0/?username=bob&method=auth.getMobileSession&authToken=4ea54fb6bc6cda12c4eff51263c21cd4&api_key=123&api_sig=bff4f0a37a6e2b99e36542f41eadecde", :string => '<lfm status="ok">\n<session><name>bob</name><key>456</key><subscriber>0</subscriber></session>\n</lfm>'
35
+
36
+ @auth = Authentication::Mobile.new("123", "789")
37
+ @auth.authenticate("bob", "secret")
38
+ assert @auth.signed_in?
39
+ assert_equal "456", @auth.session_key
40
+ end
41
+ end
42
+
43
+ class DesktopTest < TestCase
44
+ test "provides a uri for the user to sign in at" do
45
+ FakeWeb.register_uri :get, "http://ws.audioscrobbler.com/2.0/?method=auth.getToken&api_key=123&api_sig=bedb3b5ac843c821d2812f4de3922d7a", :string => '<lfm status="ok">\n<token>456</token>\n</lfm>'
46
+
47
+ @auth = Authentication::Desktop.new("123", "789")
48
+ assert_equal "http://www.last.fm/api/auth/?api_key=123&token=456", @auth.uri
49
+ end
50
+ end
51
+
52
+ class WebTest < TestCase
53
+ test "provides a uri for the user to sign in at" do
54
+ @auth = Authentication::Web.new("123", "789")
55
+ assert_equal "http://www.last.fm/api/auth/?api_key=123", @auth.uri
56
+ end
57
+
58
+ test "can authenticate" do
59
+ FakeWeb.register_uri :get, "http://ws.audioscrobbler.com/2.0/?method=auth.getSession&api_key=123&token=456&api_sig=0510662b73e1af4edbd9b8f8fc66b04f", :string => '<lfm status="ok">\n<session><name>bob</name><key>456</key><subscriber>0</subscriber></session>\n</lfm>'
60
+ @auth = Authentication::Web.new("123", "789")
61
+ @auth.authenticate("456")
62
+ assert_equal "456", @auth.session_key
63
+ end
64
+ end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+ require 'facade/build/facade_builder'
3
+
4
+ include Shortwave::Facade::Build
5
+
6
+ class BuildTest < TestCase
7
+
8
+ test "finds all remote methods from the intro page" do
9
+ FakeWeb.register_uri :get, "http://last.fm/api/intro", :string => screen("intro_truncated")
10
+ expected = {
11
+ "Album" => {"album.addTags" => "/api/show/?service=302"},
12
+ "Tasteometer" => {"tasteometer.compare" => "/api/show/?service=258"},
13
+ "User" => {"user.getLovedTracks" => "/api/show/?service=329"},
14
+ "Venue" => {"venue.search" => "/api/show/?service=396"}
15
+ }
16
+
17
+ assert_equal expected, DocumentationRemote.scrape_remote_method_index
18
+ end
19
+
20
+ private
21
+
22
+ def screen(screen)
23
+ File.read(File.dirname(__FILE__) + "/data/screens/#{screen}.html")
24
+ end
25
+ end
@@ -0,0 +1,2 @@
1
+ User:
2
+ foo.bar: /baz
@@ -0,0 +1,1238 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
3
+ <head profile="http://purl.org/uF/2008/03/">
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>album.addTags Web Service – Last.fm</title>
6
+ <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
7
+
8
+ <link rel="search" type="application/opensearchdescription+xml" href="http://cdn.last.fm/opensearch_desc.xml" title="Last.fm" />
9
+ <meta name="description" content="The world’s largest online music catalogue, with free music streaming, videos, photos, lyrics, charts, artist biographies, concerts and internet radio."/>
10
+ <meta http-equiv="content-language" content="en" />
11
+ <meta name="robots" content="NOODP" />
12
+
13
+ <link rel="icon" href="http://cdn.last.fm/flatness/favicon.2.ico" />
14
+ <link rel="icon" type="image/png" href="http://cdn.last.fm/flatness/favicon.2.png" />
15
+ <link rel="apple-touch-icon" href="http://cdn.last.fm/flatness/apple-touch-icon.png" />
16
+
17
+
18
+
19
+ <link type="text/html" rel="alternate" hreflang="de" href="http://www.lastfm.de/api/show?service=302" />
20
+ <link type="text/html" rel="alternate" hreflang="es" href="http://www.lastfm.es/api/show?service=302" />
21
+ <link type="text/html" rel="alternate" hreflang="fr" href="http://www.lastfm.fr/api/show?service=302" />
22
+ <link type="text/html" rel="alternate" hreflang="it" href="http://www.lastfm.it/api/show?service=302" />
23
+ <link type="text/html" rel="alternate" hreflang="ja" href="http://www.lastfm.jp/api/show?service=302" />
24
+ <link type="text/html" rel="alternate" hreflang="pl" href="http://www.lastfm.pl/api/show?service=302" />
25
+ <link type="text/html" rel="alternate" hreflang="pt" href="http://www.lastfm.com.br/api/show?service=302" />
26
+ <link type="text/html" rel="alternate" hreflang="ru" href="http://www.lastfm.ru/api/show?service=302" />
27
+ <link type="text/html" rel="alternate" hreflang="sv" href="http://www.lastfm.se/api/show?service=302" />
28
+ <link type="text/html" rel="alternate" hreflang="tr" href="http://www.lastfm.com.tr/api/show?service=302" />
29
+ <link type="text/html" rel="alternate" hreflang="cn" href="http://cn.last.fm/api/show?service=302" />
30
+
31
+
32
+ <!--[if LT IE 7]>
33
+ <style type="text/css">
34
+ .transparent_png {
35
+ behavior: url('/pngbehavior2.htc');
36
+ }
37
+ </style>
38
+ <![endif]-->
39
+ <link rel="stylesheet" href="http://cdn.last.fm/css/release-lastfm/130860/main.css" type="text/css" />
40
+ <link rel="stylesheet" href="http://cdn.last.fm/css/release-lastfm/130860/components.css" type="text/css" />
41
+ <link rel="stylesheet" href="http://cdn.last.fm/css/release-lastfm/130860/dialog.css" type="text/css" />
42
+ <link rel="stylesheet" href="http://cdn.last.fm/css/release-lastfm/130860/form/typeahead.css" type="text/css" />
43
+ <link rel="stylesheet" href="http://cdn.last.fm/css/release-lastfm/130860/dev/console.css" type="text/css" />
44
+
45
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/lib/prototype.js"></script>
46
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/lib/scriptaculous.js"></script>
47
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/lib/ufo.js"></script>
48
+
49
+ <!-- Create our namespace -->
50
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/LFM.js"></script>
51
+
52
+
53
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/console.js"></script>
54
+
55
+ <script type="text/javascript">
56
+
57
+ LFM.set("config", { FOD_TRACKING: false });
58
+
59
+ LFM.set("Session", {"cookieHost":".last.fm","host":"www.last.fm","staticHost":"http:\/\/cdn.last.fm","formtoken":"51819edea1f52c2f11ed0387d0c1ea5b2e05dafb","location":"gb","language":"en","loggedIn":true,"subscriber":false,"userURL":"\/user\/knaveofdiamonds","libraryURL":"\/user\/knaveofdiamonds\/library","userName":"knaveofdiamonds","prefersClient":false});
60
+
61
+
62
+
63
+ LFM.set("String", {
64
+ toRedStr: "Simply Red",
65
+ toBlackStr: "Paint it Black",
66
+
67
+ okText: "OK",
68
+ cancelText: "Cancel",
69
+ clickToEditText: "Click to edit",
70
+ savingText: "Saving…",
71
+ loadingText: "Loading…",
72
+ deletingText: "Deleting…",
73
+ thereWasAnError: "There was an error.",
74
+ dialogLoadError: "There was an error loading this dialog.",
75
+ fileTooBig: "Sorry, the file is too big.",
76
+ noFile: "Please choose a file.",
77
+ uploadCancelled: "Upload Cancelled.",
78
+ deleteMessageTitle: "Delete Message",
79
+ deleteMessagePrompt: "Are you sure you want to delete this message?",
80
+ deleteFriendPrompt: "Are you sure you want to delete this friend?",
81
+ deleteImage: "Are you sure you want to delete this image?",
82
+ deleteButtonText: "Delete",
83
+ done: "Done",
84
+
85
+
86
+ backText: "Back",
87
+
88
+ yesText: "Yes",
89
+ noText: "No",
90
+
91
+ saveText: "Save",
92
+ saveTitle: "Add to profile",
93
+
94
+ sendText: "Send",
95
+ sendTitle: "Share with friends",
96
+
97
+ addTitle: "Add to library",
98
+
99
+ tagTitle: "Add tags",
100
+
101
+ playlistTitle: "Add to playlist",
102
+
103
+ obsessionTitle: "Personalise your obsession",
104
+
105
+ befriendTitle: "Add a friend",
106
+
107
+ joinTitle: "Join this group",
108
+
109
+ loved: "Loved",
110
+
111
+ RemoveFromLibraryTitle: "Remove from library",
112
+
113
+ uploadImageTitle: "Upload Image",
114
+ uploadVideoTitle: "Upload Video",
115
+
116
+ usernoteTitle: "Add a note",
117
+
118
+ flageventTitle: "Flag for review",
119
+
120
+ setLocationTitle: "Set your Location",
121
+
122
+ newWindowTooltip: "This link will open in a new window",
123
+ unloadWarningMessage: "This will stop Radio Playback",
124
+ trackLoved: "You loved this track",
125
+ playbackStopped: "Playback stopped",
126
+ loadingTrackInfo: "Loading track information",
127
+ errorLoadingTrackInfo: "Error loading track information",
128
+
129
+ uploadMessages: {
130
+ mayTakeLonger: "Sorry, this may take slightly longer than usual. Hold on a couple of seconds.",
131
+ uploading: "Uploading…",
132
+ endUploading: "Done",
133
+ progressDisplay: "PERCENTUPLOADED% complete (TRANSFERRATE kb/s) – TIMEREMAINING seconds remaining",
134
+ progressComplete: "100% complete",
135
+ failedRetrying: "Failed retrying upload, bailed.",
136
+ processingMedia: "Processing media…",
137
+ unsupportedFormat: "Sorry, the file you uploaded isn’t encoded in a supported format. Please try again.",
138
+ uploadError: "There was an error uploading your video, please verify that the file you are uploading is not too large or of an incorrect format and try again."
139
+ }
140
+ });
141
+
142
+ LFM.set("Element", {
143
+ icon_loved_indicator: "<img class=\"loved_indicator_icon transparent_png\" width=\"11\" height=\"9\" src=\"http:\/\/cdn.last.fm\/flatness\/global\/icon_loved_indicator.2.png\" \/>",
144
+ icon_tag: "<img class=\"tag_icon transparent_png\" width=\"14\" height=\"14\" src=\"http:\/\/cdn.last.fm\/flatness\/global\/icon_tag3.png\" \/>",
145
+ icon_dismiss: "<img class=\"dismiss_icon transparent_png\" width=\"13\" height=\"13\" src=\"http:\/\/cdn.last.fm\/flatness\/global\/icon_delete.2.png\" \/>",
146
+ icon_play: "<img class=\"play_icon transparent_png\" width=\"17\" height=\"17\" alt=\"Play\" src=\"http:\/\/cdn.last.fm\/flatness\/global\/icon_play.png\" \/>"
147
+ }); </script>
148
+
149
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/components.js"></script>
150
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/flash.js"></script>
151
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/dialog.js"></script>
152
+ <script type="text/javascript" src="http://cdn.last.fm/javascript/release-lastfm/130861/form/typeahead.js"></script>
153
+
154
+ <script type="text/javascript">
155
+
156
+ document.observe("dom:loaded", function () {
157
+ if (typeof ieHover !== 'undefined') {
158
+ ieHover.setUp();
159
+ }
160
+ });
161
+
162
+ </script>
163
+
164
+ </head>
165
+
166
+
167
+ <body class="a-show">
168
+
169
+
170
+
171
+ <!-- SiteCatalyst code version: H.16.
172
+ Copyright 1997-2008 Omniture, Inc. More info available at
173
+ http://www.omniture.com -->
174
+
175
+ <script>var s = false, s_gi = false;</script>
176
+ <script src="http://cdn.last.fm/omniture/9/omniture-core.js"></script>
177
+ <script>
178
+
179
+ /* You may give each page an identifying name, server, and channel on
180
+ the next lines. */
181
+ if (s) {
182
+ s.pageName="Api/Show/";
183
+ s.server="";
184
+ s.channel="";
185
+ s.pageType="other";
186
+
187
+ s.prop1="api"; // namespace
188
+ s.prop2="show"; // controller
189
+ s.prop3=""; // action
190
+
191
+
192
+
193
+
194
+ s.prop10="lfm"; // logged in/out
195
+
196
+ s.prop12="last.fm"; // url extension
197
+
198
+ s.prop13=""; // Member user id
199
+
200
+ s.prop14=""; // Ad source
201
+ s.prop15=""; // Ad id
202
+ s.prop16=""; // Ad size
203
+ s.prop18=s.getTimeParting('h',0,2009); // Set hour
204
+ s.prop19=s.getTimeParting('d',0,2009); // Set day
205
+
206
+
207
+
208
+
209
+
210
+ s.prop32 = ""; // TODO: 1st day of visit
211
+ s.prop33 = "en";
212
+
213
+
214
+
215
+ /* Success Events */
216
+ s.events="";
217
+
218
+ /* E-commerce Variables */
219
+ // s.campaign="";
220
+ s.state="";
221
+ s.zip="";
222
+ s.products="";
223
+ s.purchaseID="";
224
+ s.eVar1="";
225
+ s.eVar2 = s.pageName; // Page name
226
+ s.eVar3="";
227
+
228
+
229
+ s.eVar10="lfm"; // logged in/out
230
+
231
+
232
+
233
+
234
+
235
+ s.eVar26=""; // OnClick Location
236
+ s.eVar27=""; // Download Platform
237
+ s.eVar28=""; // Buy/Download Location
238
+
239
+ s.eVar29=""; // TODO: 1st day of visit
240
+ s.eVar30=s.prop12; // url extension
241
+
242
+ s.eVar31=s.getNewRepeat(); // new/repeat visitor
243
+ s.eVar32=s.getDaysSinceLastVisit(); // Days since last visit
244
+
245
+ s.eVar33=""; // Ad source
246
+ s.eVar34=""; // Ad id
247
+ s.eVar35=""; // Ad size
248
+
249
+ s.eVar36=""; // Member user id
250
+
251
+ s.eVar37=s.prop33; // User language
252
+
253
+ s.eVar38="< 10,000"; // User scrobbles < 10,000
254
+
255
+
256
+ // Set vars to pass with exit/download/custom links called by s.tl()
257
+ // * Click location
258
+ s.linkTrackVars="eVar26";
259
+
260
+ /************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
261
+ var s_code = s.t(); if (s_code) document.write(s_code);
262
+ }
263
+
264
+ </script>
265
+ <script type="text/javascript"><!--
266
+ if(navigator.appVersion.indexOf('MSIE')>=0)document.write(unescape('%3C')+'\!-'+'-')
267
+ //--></script>
268
+ <!--/DO NOT REMOVE/-->
269
+ <!-- End SiteCatalyst code version: H.11. -->
270
+
271
+ <script type="text/javascript" src="http://edge.quantserve.com/quant.js"></script>
272
+ <script type="text/javascript">
273
+
274
+ var _qoptions = {
275
+ labels: "LastFM"
276
+ };
277
+ var _qacct="p-51jhoCdjGFIVU";
278
+ quantserve();
279
+
280
+ </script>
281
+ <noscript>
282
+ <a href="http://www.quantcast.com/p-51jhoCdjGFIVU" target="_blank"><img src="http://pixel.quantserve.com/pixel/p-51jhoCdjGFIVU.gif?labels=LastFM" height="1" width="1" alt="" /></a>
283
+ </noscript>
284
+ <div id="page" class=" ">
285
+ <div class="fixed full">
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+ <div id="header" class="clearit">
297
+ <div id="headerWrapper">
298
+ <h1><a href="/home" id="lastfmLogo">
299
+ <img src="http://cdn.last.fm/flatness/logo.6.png" width="103" height="50" alt="Last.fm" />
300
+ <img src="http://cdn.last.fm/flatness/logo_black.3.png" width="103" height="50" style="display: none;" alt="Last.fm" />
301
+ <span>Last.fm</span>
302
+ </a></h1>
303
+ <ul id="primaryNav" class="clearit">
304
+ <li id="musicNav">
305
+ <a href="/music">Music</a>
306
+ </li>
307
+ <li id="videosNav">
308
+ <a href="/videos">Videos</a>
309
+ </li>
310
+ <li id="listenNav">
311
+ <a href="/listen">Radio</a>
312
+ </li>
313
+ <li id="eventsNav">
314
+ <a href="/events">Events</a>
315
+ </li>
316
+ <li id="chartsNav">
317
+ <a href="/charts">Charts</a>
318
+ </li>
319
+ <li>
320
+ <form id="siteSearch" method="get" action="/search">
321
+
322
+ <select name="m" id="siteSearchSelect">
323
+ <option value="all">Music</option>
324
+ <option value="event">Event</option>
325
+ <option value="tag">Tag</option>
326
+ <option value="user">User</option>
327
+ <option value="group">Group</option>
328
+ <option value="label">Label</option>
329
+ </select>
330
+ <input id="siteSearchBox" placeholder="Search" type="text" autosave="fm.last.searchhistory" results="5" name="q" size="16" />
331
+
332
+ <input class="submit" type="submit" value="" title="Go" id="siteSearchSubmit" />
333
+ </form>
334
+ </li>
335
+ </ul>
336
+
337
+ <div id="idBadger">
338
+ <a href="/user/knaveofdiamonds" id="idBadgerUser" title="Roland Swingler, United Kingdom"><span class="userImage"><img width="16" height="16" alt="" src="http://userserve-ak.last.fm/serve/34s/10636291.jpg" /></span> <span>knaveofdiamonds</span></a><a href="/user/knaveofdiamonds" id="idBadgerDropper" title="Roland Swingler, United Kingdom">▼</a>
339
+ <ul id="idBadgerDropDown">
340
+ <li><a href="/home">Home</a></li>
341
+ <li><a href="/user/knaveofdiamonds" title="Roland Swingler, United Kingdom">Profile</a></li>
342
+ <li><a href="/home/recs">Recommended</a></li>
343
+ <li><a href="/user/knaveofdiamonds/library" title="">Library</a></li>
344
+ <li><a href="/user/knaveofdiamonds/events" title="">Events</a></li>
345
+ <li><a href="/settings">Settings</a></li>
346
+ </ul>
347
+ </div>
348
+ <div id="headLinks">
349
+ <p>
350
+ <a href="/login/logout">Log out</a> | <a href="/inbox">Inbox</a> |
351
+ <a href="#" title="Switch Colour Style" id="colourToggle">Paint it Black</a> |
352
+ <script>
353
+ $('colourToggle').observe('click', function (e) {
354
+ e.stop();
355
+ LFM.Display.colourToggle(e.element(), LFM.String.toRedStr, LFM.String.toBlackStr);
356
+ });
357
+ </script>
358
+ <a href="/help">Help</a>
359
+ |
360
+ <img src="http://cdn.last.fm/depth/flags/mini/globe.gif" id="langToggleFlag" alt="Change language" />
361
+ <a href="/api/show?service=302&amp;change=language" title="Click here to change your language" rel="nofollow" id="headerLangToggle">English</a>
362
+
363
+ </p>
364
+ </div>
365
+ </div><!-- #headerWrapper -->
366
+ </div>
367
+
368
+ <script>
369
+ LFM.Display.setupHeader(); new LFM.Activityfeed.DeleteListener();
370
+ </script>
371
+ <!-- Adserving start -->
372
+
373
+ <div id="LastAd_Skin" class="LastAd">
374
+ <div align="center">
375
+ <script type="text/javascript">
376
+ if(typeof writeSkin == 'function') writeSkin();
377
+ </script>
378
+ </div>
379
+ </div>
380
+ <script>
381
+ $("LastAd_Skin").hide();
382
+ </script>
383
+ <!-- Adserving end --><div id='content'>
384
+ <div class="fullWidth">
385
+
386
+
387
+ <style type="text/css">
388
+
389
+ body {
390
+ padding:0px 0px 0px 20px;
391
+ color:#000;
392
+ text-align:left;
393
+ }
394
+
395
+ a,a:link,a:visited {
396
+ text-decoration:none;
397
+ color:#D01F3C;
398
+ }
399
+
400
+ #content a:hover {
401
+ background-color:#D01F3C;
402
+ color:#FFF;
403
+ }
404
+
405
+ p.sampleurl a {
406
+ word-wrap:break-word;
407
+ text-wrap:unrestricted;
408
+ }
409
+
410
+ a.auth:hover {
411
+ background-color:#FFF;
412
+ color:#000;
413
+ }
414
+
415
+ a.auth {
416
+ color:#000;
417
+ }
418
+
419
+ a.cancel,a.cancel:link,a.cancel:active,a.cancel:visited,a.cancel:hover {
420
+ text-decoration:underline;
421
+ text-underline:solid #D01F3C;
422
+ text-underline-style:solid;
423
+ }
424
+
425
+ ul {
426
+ list-style-type:none;
427
+ padding:0px 0px 0px 10px;
428
+ margin:2px 0px 2px 0px;
429
+ }
430
+
431
+ #main p {
432
+ line-height:1.3em;
433
+ }
434
+
435
+ li {
436
+ padding:0px 0px 0px 0px;
437
+ margin:0px 0px 0px 0px;
438
+ }
439
+
440
+ #content h1,h2,h3 {
441
+ font-family:Helvetica,"Helvetica Neue",Arial,sans-serif;
442
+ font-size:14px;
443
+ color:#000;
444
+ clear:none;
445
+ margin-top:10px;
446
+ }
447
+
448
+ dd {
449
+ margin:5px 0px 5px 20px;
450
+ }
451
+
452
+ ol {
453
+ margin:5px 0px 5px 20px;
454
+ list-style-type:decimal;
455
+ }
456
+
457
+ #content h1 {
458
+ padding-bottom:2px;
459
+ margin:8px 0 10px 0px;
460
+ }
461
+
462
+ h4 {
463
+ color:#000;
464
+ margin-top:5px;
465
+ }
466
+
467
+ .wstesttitle {
468
+ border-bottom:1px solid #CCC;
469
+ font-weight:Bold;
470
+ }
471
+
472
+ .wstestpass {
473
+ background:#C1FFC1;
474
+ padding:10px;
475
+ border:1px dotted #CCC;
476
+ }
477
+
478
+ #grant {
479
+ clear: both;
480
+ float:left;
481
+ padding-left:0;
482
+ padding-right:10px;
483
+ margin-left:0px;
484
+ }
485
+
486
+ #apigroup ul {
487
+ padding-left:0px;
488
+ padding-top:4px;
489
+ }
490
+
491
+ h2 {
492
+ color:#D01F3C;
493
+ margin-bottom:10px;
494
+ margin-top:12px;
495
+ font-size:16px;
496
+ }
497
+
498
+ #leftcol h2{
499
+ color:#000;
500
+ }
501
+
502
+ #leftcol {
503
+ float:left;
504
+ padding:20px 20px 20px 20px;
505
+ background-color:#F0F0F0;
506
+ margin-bottom:20px;
507
+ }
508
+
509
+ ul.wspanel {
510
+ padding-left:0px;
511
+ }
512
+
513
+ .wspanel li.package {
514
+ margin-top:5px;
515
+ }
516
+
517
+ .param {
518
+ font-style:italic;
519
+ font-weight:bold;
520
+ }
521
+
522
+ #main {
523
+ padding:0px 0 0 20px;
524
+ margin:0px 0 0 220px;
525
+ }
526
+
527
+ #wsdescriptor {
528
+ padding-top:0px;
529
+ }
530
+
531
+ textarea {
532
+ width:auto;
533
+ margin-bottom:10px;
534
+ }
535
+
536
+ p {
537
+ padding:8px 2px 2px 0px;
538
+ margin:2px;
539
+ }
540
+
541
+ .wsdescription {
542
+ padding:10px 10px 10px 10px;
543
+ margin-top:5px;
544
+ background:#ffd;
545
+ border:1px dotted #CCC;
546
+ }
547
+
548
+ #wstitle {
549
+ padding-bottom:4px;
550
+ padding-left:55px;
551
+ background-image:url(http://cdn.last.fm/webclient/lastfmlogo.jpg);
552
+ background-repeat:no-repeat;
553
+ background-position: 0 0;
554
+ }
555
+
556
+ .feeds td.feed {
557
+ color:#666;
558
+ width:100%;
559
+ }
560
+
561
+ #blurb {
562
+ background-color:#F0F0F0;
563
+ width:500px;
564
+ padding:10px;
565
+ padding-bottom:20px;
566
+ font-size:16px;
567
+ line-height:1.4em;
568
+ }
569
+
570
+ #apigroup {
571
+ float:right;
572
+ width:260px;
573
+ padding:0px 30px;
574
+ }
575
+
576
+ #build {
577
+ clear:right;
578
+ margin-top:15px;
579
+ }
580
+
581
+ .title {
582
+ border-bottom:1px solid #CCC;
583
+ }
584
+
585
+ #methods {
586
+ clear:left;
587
+ }
588
+
589
+ #apigroup h2 {
590
+ margin-top:6px;
591
+ margin-bottom:6px;
592
+ }
593
+
594
+ ul#apps {
595
+ padding-left:0px;
596
+ }
597
+
598
+ ul#apps li.item {
599
+ cursor:pointer;
600
+ float:left;
601
+ line-height:14px;
602
+ overflow:hidden;
603
+ padding:0px;
604
+ width:260px;
605
+ }
606
+
607
+ ul#apps li.item p.basic {
608
+ width:250px;
609
+ color:#000;
610
+ font-weight:bold;
611
+ }
612
+
613
+ ul#apps li.item a:hover {
614
+ background-color:#F0F0F0;
615
+ }
616
+
617
+ h2.package {
618
+ color:#000;
619
+ }
620
+
621
+ #methods .col {
622
+ float:left;
623
+ width:260px;
624
+ }
625
+
626
+ div.appsimage {
627
+ overflow:hidden;
628
+ width:240px;
629
+ height:100px;
630
+ }
631
+
632
+ ul#apps a.itemlink {
633
+ color:#333;
634
+ display:block;
635
+ height:190px;
636
+ padding:10px;
637
+ padding-top:0px;
638
+ margin-bottom:10px;
639
+ position:relative;
640
+ text-decoration:none;
641
+ width:250px;
642
+ }
643
+
644
+ #content h1.header a,#content h1.header a:hover,#content h1.header a:visited{
645
+ color:#000;
646
+ text-decoration:none;
647
+ background-color:#FFFFFF;
648
+ }
649
+
650
+ ul#apps p.itemdesc {
651
+ width:250px;
652
+ }
653
+
654
+ ul#apps li.item a {
655
+ width:260px;
656
+ }
657
+
658
+ #intro {
659
+ margin-top:5px;
660
+ }
661
+
662
+
663
+ td.feed .title {
664
+ color:#000;
665
+ border-bottom:none;
666
+ }
667
+
668
+ .feeds td {
669
+ width:100px;
670
+ border-bottom: 1px solid #F0F0F0;
671
+ margin:0px;
672
+ }
673
+
674
+ h3.feed {
675
+ color:#D01F3C;
676
+ border-bottom: 1px solid #CCC;
677
+ padding-bottom:5px;
678
+ }
679
+
680
+ .feeds {
681
+ }
682
+
683
+ .feeds .last td{
684
+ border-bottom:none;
685
+ }
686
+ #wstitle h1 {
687
+ font-size:24px;
688
+ line-height:1.0 em;
689
+ font-family:Helvetica,"Helvetica Neue",Arial,sans-serif;
690
+ margin-bottom:2px;
691
+ }
692
+
693
+ #content h1 {
694
+ padding-top:6px;
695
+ font-size:24px;
696
+ }
697
+
698
+ #wsurl {
699
+ padding:4px 0 0 10px;
700
+ }
701
+
702
+ #sample {
703
+ overflow:hidden;
704
+ }
705
+
706
+ ul.stations {
707
+ margin-left:20px;
708
+ }
709
+
710
+ ul.stations li {
711
+ list-style-type:disc;
712
+ margin-left:8px;
713
+ padding:2px 0 0 5px;
714
+ }
715
+
716
+ ul.stationpanel li {
717
+ padding:4px 0 4px 0;
718
+ }
719
+
720
+ pre {
721
+ background-color:#F0F0F0;
722
+ padding:10px;
723
+ line-height:1.2em;
724
+ margin:5px 0 5px 0;
725
+ }
726
+
727
+ textarea:hover {
728
+ }
729
+
730
+ button {
731
+ font-size:12px;
732
+ }
733
+
734
+ td {
735
+ padding:5px 0 5px 5px;
736
+ }
737
+
738
+ table.ws {
739
+ text-align:left;
740
+ }
741
+
742
+ table.ws td,table.ws th,table.ws tr {
743
+ padding:3px;
744
+ }
745
+
746
+ .highlight {
747
+ }
748
+
749
+ #footer {
750
+ padding:10px 0 0 0px;
751
+ margin:20px 0 40px 240px;
752
+ width:700px;
753
+ color:#666;
754
+ border-top:1px solid #CCC;
755
+ }
756
+
757
+ </style>
758
+ <div id="leftcol">
759
+ <h2>API Doc</h2>
760
+
761
+ <ul class="wspanel">
762
+ <li><a href="/api/intro">Overview</a></li>
763
+ <li><a href="/api/authentication">User Authentication</a></li>
764
+ <li><a href="/api/submissions">Submissions</a></li>
765
+ <li><a href="/api/radio">Radio API</a></li>
766
+ <li><a href="/api/playlists">Playlists</a></li>
767
+ <li><a href="/api/downloads">Downloads</a></li>
768
+ <li><a href="/api/rest">REST requests</a></li>
769
+ <li><a href="/api/xmlrpc">XML-RPC requests</a></li>
770
+ </ul>
771
+
772
+ <h2>API Methods</h2>
773
+ <ul class="wspanel">
774
+ <li class="package"><b>Album</b></li>
775
+ <ul>
776
+ <li><a href="/api/show/?service=302">album.addTags</a></li>
777
+ <li><a href="/api/show/?service=290">album.getInfo</a></li>
778
+ <li><a href="/api/show/?service=317">album.getTags</a></li>
779
+ <li><a href="/api/show/?service=314">album.removeTag</a></li>
780
+ <li><a href="/api/show/?service=357">album.search</a></li>
781
+ </ul>
782
+ <li class="package"><b>Artist</b></li>
783
+ <ul>
784
+ <li><a href="/api/show/?service=303">artist.addTags</a></li>
785
+ <li><a href="/api/show/?service=117">artist.getEvents</a></li>
786
+ <li><a href="/api/show/?service=407">artist.getImages</a></li>
787
+ <li><a href="/api/show/?service=267">artist.getInfo</a></li>
788
+ <li><a href="/api/show/?service=397">artist.getShouts</a></li>
789
+ <li><a href="/api/show/?service=119">artist.getSimilar</a></li>
790
+ <li><a href="/api/show/?service=318">artist.getTags</a></li>
791
+ <li><a href="/api/show/?service=287">artist.getTopAlbums</a></li>
792
+ <li><a href="/api/show/?service=310">artist.getTopFans</a></li>
793
+ <li><a href="/api/show/?service=288">artist.getTopTags</a></li>
794
+ <li><a href="/api/show/?service=277">artist.getTopTracks</a></li>
795
+ <li><a href="/api/show/?service=315">artist.removeTag</a></li>
796
+ <li><a href="/api/show/?service=272">artist.search</a></li>
797
+ <li><a href="/api/show/?service=306">artist.share</a></li>
798
+ <li><a href="/api/show/?service=408">artist.shout</a></li>
799
+ </ul>
800
+ <li class="package"><b>Auth</b></li>
801
+ <ul>
802
+ <li><a href="/api/show/?service=266">auth.getMobileSession</a></li>
803
+ <li><a href="/api/show/?service=125">auth.getSession</a></li>
804
+ <li><a href="/api/show/?service=265">auth.getToken</a></li>
805
+ <li><a href="/api/show/?service=133">auth.getWebSession</a></li>
806
+ </ul>
807
+ <li class="package"><b>Event</b></li>
808
+ <ul>
809
+ <li><a href="/api/show/?service=307">event.attend</a></li>
810
+ <li><a href="/api/show/?service=391">event.getAttendees</a></li>
811
+ <li><a href="/api/show/?service=292">event.getInfo</a></li>
812
+ <li><a href="/api/show/?service=399">event.getShouts</a></li>
813
+ <li><a href="/api/show/?service=350">event.share</a></li>
814
+ <li><a href="/api/show/?service=409">event.shout</a></li>
815
+ </ul>
816
+ <li class="package"><b>Geo</b></li>
817
+ <ul>
818
+ <li><a href="/api/show/?service=270">geo.getEvents</a></li>
819
+ <li><a href="/api/show/?service=297">geo.getTopArtists</a></li>
820
+ <li><a href="/api/show/?service=298">geo.getTopTracks</a></li>
821
+ </ul>
822
+ <li class="package"><b>Group</b></li>
823
+ <ul>
824
+ <li><a href="/api/show/?service=379">group.getMembers</a></li>
825
+ <li><a href="/api/show/?service=293">group.getWeeklyAlbumChart</a></li>
826
+ <li><a href="/api/show/?service=294">group.getWeeklyArtistChart</a></li>
827
+ <li><a href="/api/show/?service=295">group.getWeeklyChartList</a></li>
828
+ <li><a href="/api/show/?service=296">group.getWeeklyTrackChart</a></li>
829
+ </ul>
830
+ <li class="package"><b>Library</b></li>
831
+ <ul>
832
+ <li><a href="/api/show/?service=370">library.addAlbum</a></li>
833
+ <li><a href="/api/show/?service=371">library.addArtist</a></li>
834
+ <li><a href="/api/show/?service=372">library.addTrack</a></li>
835
+ <li><a href="/api/show/?service=321">library.getAlbums</a></li>
836
+ <li><a href="/api/show/?service=322">library.getArtists</a></li>
837
+ <li><a href="/api/show/?service=323">library.getTracks</a></li>
838
+ </ul>
839
+ <li class="package"><b>Playlist</b></li>
840
+ <ul>
841
+ <li><a href="/api/show/?service=337">playlist.addTrack</a></li>
842
+ <li><a href="/api/show/?service=365">playlist.create</a></li>
843
+ <li><a href="/api/show/?service=271">playlist.fetch</a></li>
844
+ </ul>
845
+ <li class="package"><b>Radio</b></li>
846
+ <ul>
847
+ <li><a href="/api/show/?service=256">radio.getPlaylist</a></li>
848
+ <li><a href="/api/show/?service=160">radio.tune</a></li>
849
+ </ul>
850
+ <li class="package"><b>Tag</b></li>
851
+ <ul>
852
+ <li><a href="/api/show/?service=311">tag.getSimilar</a></li>
853
+ <li><a href="/api/show/?service=283">tag.getTopAlbums</a></li>
854
+ <li><a href="/api/show/?service=284">tag.getTopArtists</a></li>
855
+ <li><a href="/api/show/?service=276">tag.getTopTags</a></li>
856
+ <li><a href="/api/show/?service=285">tag.getTopTracks</a></li>
857
+ <li><a href="/api/show/?service=358">tag.getWeeklyArtistChart</a></li>
858
+ <li><a href="/api/show/?service=359">tag.getWeeklyChartList</a></li>
859
+ <li><a href="/api/show/?service=273">tag.search</a></li>
860
+ </ul>
861
+ <li class="package"><b>Tasteometer</b></li>
862
+ <ul>
863
+ <li><a href="/api/show/?service=258">tasteometer.compare</a></li>
864
+ </ul>
865
+ <li class="package"><b>Track</b></li>
866
+ <ul>
867
+ <li><a href="/api/show/?service=304">track.addTags</a></li>
868
+ <li><a href="/api/show/?service=261">track.ban</a></li>
869
+ <li><a href="/api/show/?service=356">track.getInfo</a></li>
870
+ <li><a href="/api/show/?service=319">track.getSimilar</a></li>
871
+ <li><a href="/api/show/?service=320">track.getTags</a></li>
872
+ <li><a href="/api/show/?service=312">track.getTopFans</a></li>
873
+ <li><a href="/api/show/?service=289">track.getTopTags</a></li>
874
+ <li><a href="/api/show/?service=260">track.love</a></li>
875
+ <li><a href="/api/show/?service=316">track.removeTag</a></li>
876
+ <li><a href="/api/show/?service=286">track.search</a></li>
877
+ <li><a href="/api/show/?service=305">track.share</a></li>
878
+ </ul>
879
+ <li class="package"><b>User</b></li>
880
+ <ul>
881
+ <li><a href="/api/show/?service=291">user.getEvents</a></li>
882
+ <li><a href="/api/show/?service=263">user.getFriends</a></li>
883
+ <li><a href="/api/show/?service=344">user.getInfo</a></li>
884
+ <li><a href="/api/show/?service=329">user.getLovedTracks</a></li>
885
+ <li><a href="/api/show/?service=264">user.getNeighbours</a></li>
886
+ <li><a href="/api/show/?service=343">user.getPastEvents</a></li>
887
+ <li><a href="/api/show/?service=313">user.getPlaylists</a></li>
888
+ <li><a href="/api/show/?service=278">user.getRecentTracks</a></li>
889
+ <li><a href="/api/show/?service=388">user.getRecommendedArtists</a></li>
890
+ <li><a href="/api/show/?service=375">user.getRecommendedEvents</a></li>
891
+ <li><a href="/api/show/?service=401">user.getShouts</a></li>
892
+ <li><a href="/api/show/?service=299">user.getTopAlbums</a></li>
893
+ <li><a href="/api/show/?service=300">user.getTopArtists</a></li>
894
+ <li><a href="/api/show/?service=123">user.getTopTags</a></li>
895
+ <li><a href="/api/show/?service=301">user.getTopTracks</a></li>
896
+ <li><a href="/api/show/?service=279">user.getWeeklyAlbumChart</a></li>
897
+ <li><a href="/api/show/?service=281">user.getWeeklyArtistChart</a></li>
898
+ <li><a href="/api/show/?service=280">user.getWeeklyChartList</a></li>
899
+ <li><a href="/api/show/?service=282">user.getWeeklyTrackChart</a></li>
900
+ <li><a href="/api/show/?service=411">user.shout</a></li>
901
+ </ul>
902
+ <li class="package"><b>Venue</b></li>
903
+ <ul>
904
+ <li><a href="/api/show/?service=394">venue.getEvents</a></li>
905
+ <li><a href="/api/show/?service=395">venue.getPastEvents</a></li>
906
+ <li><a href="/api/show/?service=396">venue.search</a></li>
907
+ </ul>
908
+ </ul>
909
+ </div> <div id="main">
910
+ <div id="wstitle">
911
+ <h1 class="header"><a href="/api">Last.fm Web Services</a></h1>
912
+ <a href="/api/intro">API</a> | <a href="/api/feeds">Feeds</a> | <a href="/api/account">Your API Account</a>
913
+ </div> <h1>album.addTags</h1>
914
+ <div class="wsdescription">
915
+ Tag an album using a list of user supplied tags.
916
+ </div>
917
+ <div id="wsdescriptor">
918
+ <h2>Params</h2>
919
+ <span class="param">artist</span> (Required) : The artist name in question<br />
920
+ <span class="param">album</span> (Required) : The album name in question<br />
921
+ <span class="param">tags</span> (Required) : A comma delimited list of user supplied tags to apply to this album. Accepts a maximum of 10 tags.<br />
922
+ <span class="param">api_key</span> (Required) : A Last.fm API key.<br />
923
+ <span class="param">api_sig</span> (Required) : A Last.fm method signature. See <a href="/api/authentication">authentication</a> for more information.<br />
924
+ <span class="param">sk</span> (Required) : A session key generated by authenticating a user via the authentication protocol.
925
+ <h2>Auth</h2>
926
+
927
+ This service requires authentication. Please see our <a href="/api/authentication">authentication</a> how-to.<br/>
928
+ This is a <b>write</b> service and must be accessed with an HTTP POST request. All parameters should be sent in the POST body, including the 'method' parameter. See <a href="/api/rest">rest requests</a> for more information.
929
+ <h2>Sample Response</h2>
930
+ <script type="text/javascript">
931
+
932
+ function showWSExcerptSubmit() {
933
+ $('updateexcerpt').style.display = 'block';
934
+ }
935
+
936
+ function hideWSExcerptSubmit() {
937
+ $('updateexcerpt').style.display = 'none';
938
+ }
939
+
940
+ function showWSExcerptSuccess() {
941
+ $('success').style.display = 'block';
942
+ }
943
+
944
+ function updateExcerpt(excerpt,service) {
945
+ new Ajax.Request('/api/updateExcerpt', {
946
+ method: 'post',
947
+ parameters: 'excerpt='+encodeURIComponent(excerpt.value)+'&service='+service.value,
948
+ onSuccess: onUpdateExcerpt
949
+ });
950
+ }
951
+
952
+ function onUpdateExcerpt(response) {
953
+ if(response.responseText) {
954
+ hideWSExcerptSubmit();
955
+ showWSExcerptSuccess();
956
+ $('excerpt').onblur();
957
+ }
958
+ }
959
+
960
+ </script>
961
+ <div id="sample"><pre>&lt;lfm status=&quot;ok&quot;&gt;
962
+ &lt;/lfm&gt;</pre></div>
963
+
964
+ <h2>Errors</h2>
965
+ <ul>
966
+ <li><span class="param">2</span> : Invalid service -This service does not exist</li>
967
+ <li><span class="param">3</span> : Invalid Method - No method with that name in this package</li>
968
+ <li><span class="param">4</span> : Authentication Failed - You do not have permissions to access the service</li>
969
+ <li><span class="param">5</span> : Invalid format - This service doesn't exist in that format</li>
970
+ <li><span class="param">6</span> : Invalid parameters - Your request is missing a required parameter</li>
971
+ <li><span class="param">7</span> : Invalid resource specified</li>
972
+ <li><span class="param">9</span> : Invalid session key - Please re-authenticate</li>
973
+ <li><span class="param">10</span> : Invalid API key - You must be granted a valid key by last.fm</li>
974
+ <li><span class="param">11</span> : Service Offline - This service is temporarily offline. Try again later.</li>
975
+ <li><span class="param">12</span> : Subscription Error - The user needs to be subscribed in order to do that</li>
976
+ <li><span class="param">13</span> : Invalid method signature supplied</li>
977
+ <li><span class="param">18</span> : This user has no free radio plays left. Subscription required.</li>
978
+ </ul>
979
+ </div>
980
+ </div>
981
+ </div>
982
+ </div>
983
+
984
+ <div id="LastFooter">
985
+
986
+ <div id="footer_ads" style="display: none;" class="clearit">
987
+ <div class="footer_ad_wrapper">
988
+
989
+ <!-- Adserving start -->
990
+
991
+ <div id="LastAd_Footer1" class="LastAd">
992
+ <div align="center">
993
+ <script type="text/javascript">
994
+ if ($("footer_ads")) $("footer_ads").show();
995
+ if(typeof writeFooter1 == 'function') writeFooter1();
996
+ </script>
997
+ </div>
998
+ </div>
999
+ <script>
1000
+ $("LastAd_Footer1").hide();
1001
+ </script>
1002
+ <!-- Adserving end --> <!-- Adserving start -->
1003
+
1004
+ <div id="LastAd_Footer2" class="LastAd">
1005
+ <div align="center">
1006
+ <script type="text/javascript">
1007
+ if ($("footer_ads")) $("footer_ads").show();
1008
+ if(typeof writeFooter2 == 'function') writeFooter2();
1009
+ </script>
1010
+ </div>
1011
+ </div>
1012
+ <script>
1013
+ $("LastAd_Footer2").hide();
1014
+ </script>
1015
+ <!-- Adserving end --> <!-- Adserving start -->
1016
+
1017
+ <div id="LastAd_Footer3" class="LastAd">
1018
+ <div align="center">
1019
+ <script type="text/javascript">
1020
+ if ($("footer_ads")) $("footer_ads").show();
1021
+ if(typeof writeFooter3 == 'function') writeFooter3();
1022
+ </script>
1023
+ </div>
1024
+ </div>
1025
+ <script>
1026
+ $("LastAd_Footer3").hide();
1027
+ </script>
1028
+ <!-- Adserving end --> <!-- Adserving start -->
1029
+
1030
+ <div id="LastAd_Footer4" class="LastAd last">
1031
+ <div align="center">
1032
+ <script type="text/javascript">
1033
+ if ($("footer_ads")) $("footer_ads").show();
1034
+ if(typeof writeFooter4 == 'function') writeFooter4();
1035
+ </script>
1036
+ </div>
1037
+ </div>
1038
+ <script>
1039
+ $("LastAd_Footer4").hide();
1040
+ </script>
1041
+ <!-- Adserving end -->
1042
+ </div><!-- .footer_ad_wrapper -->
1043
+ </div><!-- #footer_ads -->
1044
+
1045
+ <ul id="footerStuff" class="clearit">
1046
+ <li><div id="footerMessage">
1047
+ <h3>What’s New</h3>
1048
+ <div class="bbcode">It’s here. Welcome to the new Last.fm! <a href="http://blog.last.fm/2008/07/17/lastfm-the-next-generation">Read all about it on our blog</a>.</div>
1049
+ </div><!-- #footerMessage --></li>
1050
+
1051
+ <li><p id="uploadYourMusic">
1052
+ <strong>Do you make music? Upload it!</strong><br /><a href="/uploadmusic?accountType=artist">Artists</a> or <a href="/uploadmusic?accountType=label">Labels</a>
1053
+ </p></li>
1054
+ </ul><!-- #footerStuff -->
1055
+
1056
+ <div id="footer_content">
1057
+ <ul id="footerLinks" class="clearit">
1058
+ <li class="first">
1059
+ <dl>
1060
+ <dt>Learn About Us</dt>
1061
+ <dd><a href="/about/contact">Contact</a></dd>
1062
+ <dd><a href="/about">About Us</a></dd>
1063
+ <dd><a href="/about/team">Team</a></dd>
1064
+ <dd><a href="/about/jobs">Jobs</a></dd>
1065
+ <dd><a href="/resources">Media Kit</a></dd>
1066
+ <dd><a href="/advertise">Advertise</a></dd>
1067
+ </dl>
1068
+ </li>
1069
+ <li>
1070
+ <dl>
1071
+ <dt>Get Help</dt>
1072
+ <dd><a href="/help/faq">FAQ</a></dd>
1073
+ <dd><a href="/forum/21713">Website Support</a></dd>
1074
+ <dd><a href="/forum/34905">Scrobbler Support</a></dd>
1075
+ <dd><a href="/group/Last.fm+for+iPhone+and+iPod+Touch">iPhone Support</a></dd>
1076
+ </dl>
1077
+ </li>
1078
+
1079
+ <li>
1080
+ <dl>
1081
+ <dt>Join In</dt>
1082
+ <dd><a href="/users">Find People</a></dd>
1083
+ <dd><a href="/users/groups">Find Groups</a></dd>
1084
+ <dd><a href="/forum">Forums</a></dd>
1085
+ <dd><a href="/help/guidelines">Community Guidelines</a></dd>
1086
+ <dd><a href="/about/moderators">Moderators</a></dd>
1087
+ <dd><a href="/promotions">Contests &amp; Promotions</a></dd>
1088
+ </dl>
1089
+ </li>
1090
+ <li class="last">
1091
+ <dl>
1092
+ <dt>Do More</dt>
1093
+ <dd><a href="/download">Last.fm Scrobbler</a></dd>
1094
+ <dd><a href="/download#content_ipod">iPod Scrobbler</a></dd>
1095
+ <dd><a href="/download#content_iphone">iPhone App</a></dd>
1096
+ <dd><a href="http://build.last.fm">More Apps</a></dd>
1097
+ <dd><a href="/music/+free-music-downloads">Free Music Downloads</a></dd>
1098
+ <dd><a href="/hardware">Hardware</a></dd>
1099
+ <dd><a href="/widgets">Widgets</a></dd> <dd><a href="/tools/charts">Chart Images</a></dd>
1100
+ <dd><a href="/subscribe">Subscribe</a></dd>
1101
+ <dd><a href="/api">API</a></dd>
1102
+ </dl>
1103
+ </li>
1104
+ </ul><!-- #footerLinks -->
1105
+
1106
+ <div id="justCantGetEnough" class="clearit">
1107
+ <blockquote>“The Last.fm of Champions.”</blockquote>
1108
+ <p>
1109
+ <strong>More Last.fm Sites:</strong>
1110
+ <a href="http://blog.last.fm/">Blog</a>
1111
+ | <a href="http://musicmanager.last.fm">Music Manager</a>
1112
+ | <a href="http://build.last.fm">Build</a>
1113
+ | <a href="http://playground.last.fm">Playground</a>
1114
+ | <a href="http://www.last.fm/bestof/2008">Best of 2008</a>
1115
+ </p>
1116
+ </div>
1117
+
1118
+ <div id="legalities">
1119
+ <div id="cbsi_f">
1120
+ <form>
1121
+ <script language="javascript">
1122
+ document.write("<div><label class=\"rb_visit_txt\" for=\"cbsi_footer_menu\">Visit other Sites</label><select name=\"cbsi_footer_menu\" id=\"cbsi_footer_menu\" class=\"rb_visit_sel\"><option value=\"\">Select Site</option><option value=\"http://www.bnet.com\">BNET</option><option value=\"http://www.cbscares.com\">CBS Cares</option><option value=\"http://www.cbssports.com/cbscollegesports/\">CBS College Sports</option><option value=\"http://www.cbsradio.com/streaming/\">CBS Radio</option><option value=\"http://www.cbs.com\">CBS.com</option><option value=\"http://www.cbsnews.com\">CBSNews.com</option><option value=\"http://www.cbssports.com\">CBSSports.com</option><option value=\"http://www.chow.com\">CHOW</option><option value=\"http://www.cnet.com\">CNET</option><option value=\"http://www.cnetcontentsolutions.com\">CNET Content Solutions</option><option value=\"http://www.gamespot.com\">GameSpot</option><option value=\"http://www.cnetnetworks.com/advertise/media-kit/international.html?tag=ft\">International</option><option value=\"http://www.last.fm\">Last.fm</option><option value=\"http://www.maxpreps.com\">MaxPreps</option><option value=\"http://www.metacritic.com\">Metacritic.com</option><option value=\"http://moneywatch.bnet.com\">Moneywatch</option><option value=\"http://www.mp3.com\">MP3.com</option><option value=\"http://www.mysimon.com\">mySimon</option><option value=\"http://www.ncaa.com\">NCAA</option><option value=\"http://www.search.com\">Search.com</option><option value=\"http://www.shopper.com\">Shopper.com</option><option value=\"http://www.sho.com\">Showtime</option><option value=\"http://www.techrepublic.com\">TechRepublic</option><option value=\"http://www.theinsider.com\">The Insider</option><option value=\"http://www.tv.com\">TV.com</option><option value=\"http://www.urbanbaby.com\">UrbanBaby.com</option><option value=\"http://www.zdnet.com\">ZDNet</option></select><input type=\"button\" class=\"rb_visit_go\" value=\"Go\" onClick=\"window.location=document.getElementById('cbsi_footer_menu').options[document.getElementById('cbsi_footer_menu').selectedIndex].value;\" /></div>");
1123
+ </script>
1124
+ </form>
1125
+ <noscript>
1126
+ <a href="http://www.bnet.com">BNET</a> | <a href="http://www.cbscares.com">CBS Cares</a> | <a href="http://www.cbssports.com/cbscollegesports/">CBS College Sports</a> | <a href="http://www.cbsradio.com/streaming/">CBS Radio</a> | <a href="http://www.cbs.com">CBS.com</a> | <a href="http://www.cbsnews.com">CBSNews.com</a> | <a href="http://www.cbssports.com">CBSSports.com</a> | <a href="http://www.chow.com">CHOW</a> | <a href="http://www.cnet.com">CNET</a> | <a href="http://www.cnetcontentsolutions.com">CNET Content Solutions</a> | <a href="http://www.gamespot.com">GameSpot</a> | <a href="http://www.cnetnetworks.com/advertise/media-kit/international.html?tag=ft">International</a> | <a href="http://www.last.fm">Last.fm</a> | <a href="http://www.maxpreps.com">MaxPreps</a> | <a href="http://www.metacritic.com">Metacritic.com</a> | <a href="http://moneywatch.bnet.com">Moneywatch</a> | <a href="http://www.mp3.com">MP3.com</a> | <a href="http://www.mysimon.com">mySimon</a> | <a href="http://www.ncaa.com">NCAA</a> | <a href="http://www.search.com">Search.com</a> | <a href="http://www.shopper.com">Shopper.com</a> | <a href="http://www.sho.com">Showtime</a> | <a href="http://www.techrepublic.com">TechRepublic</a> | <a href="http://www.theinsider.com">The Insider</a> | <a href="http://www.tv.com">TV.com</a> | <a href="http://www.urbanbaby.com">UrbanBaby.com</a> | <a href="http://www.zdnet.com">ZDNet</a>
1127
+ </noscript>
1128
+ <p id="cbsi_f_pop">
1129
+ Popular on CBS sites: <a href='http://www.cnet.com/apple-iphone.html'>iPhone 3G</a> | <a href='http://fantasynews.cbssports.com/fantasyfootball'>Fantasy Football</a> | <a href='http://moneywatch.bnet.com'>Moneywatch</a> | <a href='http://download.cnet.com/windows/antivirus-software/'>Antivirus Software</a> | <a href='http://www.chow.com/recipes'>Recipes</a> | <a href='http://www.gamespot.com/pc/strategy/spore/index.html'>Spore</a><!-- cbth:100 -->
1130
+ </p>
1131
+ </div> <p id="copy">
1132
+ &copy; 2009 Last.fm Ltd. All rights reserved. |
1133
+ <a href="/legal/terms" target="_blank">Terms of Use</a>
1134
+ and <a href="/legal/privacy" target="_blank">Privacy Policy</a> | <span class="date">Updated November 21, 2008</span><br />
1135
+
1136
+ </p>
1137
+ </div><!-- #legalities -->
1138
+
1139
+ </div>
1140
+ </div><!-- #LastFooter -->
1141
+
1142
+ <ul id="langSelector" style="display: none; visibility: hidden;" class="nojs">
1143
+
1144
+
1145
+ <li><a href="http://www.lastfm.de/api/show?service=302&amp;setlang=de" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/de.gif" /> <span>Deutsch</span></a></li>
1146
+ <li><a href="http://www.lastfm.es/api/show?service=302&amp;setlang=es" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/es.gif" /> <span>Español</span></a></li>
1147
+ <li><a href="http://www.lastfm.fr/api/show?service=302&amp;setlang=fr" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/fr.gif" /> <span>Français</span></a></li>
1148
+ <li><a href="http://www.lastfm.it/api/show?service=302&amp;setlang=it" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/it.gif" /> <span>Italiano</span></a></li>
1149
+ <li><a href="http://www.lastfm.jp/api/show?service=302&amp;setlang=jp" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/jp.gif" /> <span>日本語</span></a></li>
1150
+ <li><a href="http://www.lastfm.pl/api/show?service=302&amp;setlang=pl" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/pl.gif" /> <span>Polski</span></a></li>
1151
+ <li><a href="http://www.lastfm.com.br/api/show?service=302&amp;setlang=pt" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/pt.gif" /> <span>Português</span></a></li>
1152
+ <li><a href="http://www.lastfm.ru/api/show?service=302&amp;setlang=ru" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/ru.gif" /> <span>Руccкий</span></a></li>
1153
+ <li><a href="http://www.lastfm.se/api/show?service=302&amp;setlang=sv" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/se.gif" /> <span>Svenska</span></a></li>
1154
+ <li><a href="http://www.lastfm.com.tr/api/show?service=302&amp;setlang=tr" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/tr.gif" /> <span>Türkçe</span></a></li>
1155
+ <li><a href="http://cn.last.fm/api/show?service=302&amp;setlang=zh" class="icon"><img src="http://cdn.last.fm/depth/flags/mini/zh.gif" /> <span>简体中文</span></a></li>
1156
+
1157
+ </ul>
1158
+
1159
+ <script>
1160
+
1161
+ $("langSelector").className = "js";
1162
+ LFM.set("Page", {
1163
+ navDropDown: new LFM.Display.DropDown(
1164
+ "headerLangToggle",
1165
+ "headerLangToggle",
1166
+ "langSelector",
1167
+ {
1168
+ align: "right",
1169
+ onShow: function (dropdown) {
1170
+ dropdown.ddbody.setStyle({
1171
+ top: (dropdown.ddbody.getStyle("top").toPixels() + 3) + "px"
1172
+ });
1173
+ }
1174
+ }
1175
+ )
1176
+ });
1177
+
1178
+ </script>
1179
+ <div id="multiButtonMenu" style="display: none;">
1180
+ <div>
1181
+ <ul class="lfmDropDownBody">
1182
+ <li class="mAddToLibrary"><a href="#">Add to my Library</a></li>
1183
+ <li class="mAddToFriends"><a href="#">Add to Friends</a></li>
1184
+
1185
+ <!-- <li class="save"><a href="#">Bookmark</a></li> -->
1186
+ <li class="mSend"><a href="#">Share</a></li>
1187
+
1188
+ <li class="mLove"><a href="#">Love track</a></li>
1189
+ <li class="mUnlove"><a href="#">Unlove track</a></li>
1190
+ <li class="mBan"><a href="#">Ban track from radio</a></li>
1191
+ <li class="mUnban"><a href="#">Unban track from radio</a></li>
1192
+
1193
+
1194
+ <li class="mAddTags"><a href="#">Add tags</a></li>
1195
+ <li class="mAddToPlaylist"><a href="#">Add to playlist</a></li>
1196
+ <li class="mMessage"><a href="#">Send a message</a></li>
1197
+ <li class="mEditDetails"><a href="#">Edit Details</a></li>
1198
+ <li class="mMessageAll"><a href="#">Message All Users</a></li>
1199
+ <li class="mEditPermissions"><a href="#">Edit Permissions</a></li>
1200
+ <li class="mAbdicate"><a href="#">Abdicate</a></li>
1201
+ <li class="mLeave"><a href="#">Leave Group</a></li>
1202
+
1203
+ <li class="mRemoveFromLibrary"><a href="#">Remove from your Library</a></li>
1204
+
1205
+ <li class="mLoading"><a href="#">&nbsp;</a></li>
1206
+ </ul>
1207
+ </div>
1208
+ </div>
1209
+
1210
+
1211
+ <script type="text/javascript" src="http://dw.com.com/js/dw.js"></script>
1212
+ <script type="text/javascript">
1213
+ DW.pageParams = {
1214
+ siteid: '190',
1215
+ ptid: '',
1216
+ onid: ''
1217
+ };
1218
+ DW.clear();
1219
+ </script>
1220
+ <noscript>
1221
+ <img src="http://dw.com.com/clear/c.gif?ts=1242849445&amp;sid=" />
1222
+ </noscript>
1223
+
1224
+
1225
+ <script src="http://surveys.cnet.com/html/surveys/1361.js"></script>
1226
+
1227
+ <script>
1228
+
1229
+ LFM.Button.MultiButton.setup();
1230
+ LFM.Display.setMinHeight();
1231
+
1232
+ </script>
1233
+
1234
+ </div>
1235
+ </div>
1236
+ </div>
1237
+ </body>
1238
+ </html>