hallon 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.yardopts +1 -0
  2. data/{CHANGELOG → CHANGELOG.md} +82 -27
  3. data/Gemfile +1 -0
  4. data/README.markdown +1 -1
  5. data/Rakefile +8 -6
  6. data/examples/adding_tracks_to_playlist.rb +3 -0
  7. data/examples/logging_in.rb +3 -0
  8. data/examples/playing_audio.rb +130 -0
  9. data/examples/printing_link_information.rb +3 -0
  10. data/examples/show_published_playlists_of_user.rb +5 -13
  11. data/hallon.gemspec +2 -2
  12. data/lib/hallon.rb +15 -0
  13. data/lib/hallon/album.rb +1 -1
  14. data/lib/hallon/album_browse.rb +4 -3
  15. data/lib/hallon/artist.rb +1 -1
  16. data/lib/hallon/artist_browse.rb +5 -4
  17. data/lib/hallon/base.rb +7 -2
  18. data/lib/hallon/error.rb +1 -1
  19. data/lib/hallon/ext/spotify.rb +26 -42
  20. data/lib/hallon/image.rb +7 -8
  21. data/lib/hallon/observable.rb +134 -62
  22. data/lib/hallon/observable/album_browse.rb +30 -0
  23. data/lib/hallon/observable/artist_browse.rb +31 -0
  24. data/lib/hallon/observable/image.rb +31 -0
  25. data/lib/hallon/observable/player.rb +13 -0
  26. data/lib/hallon/observable/playlist.rb +194 -0
  27. data/lib/hallon/observable/playlist_container.rb +74 -0
  28. data/lib/hallon/observable/post.rb +30 -0
  29. data/lib/hallon/observable/search.rb +29 -0
  30. data/lib/hallon/observable/session.rb +236 -0
  31. data/lib/hallon/observable/toplist.rb +30 -0
  32. data/lib/hallon/player.rb +8 -17
  33. data/lib/hallon/playlist.rb +11 -7
  34. data/lib/hallon/playlist_container.rb +11 -4
  35. data/lib/hallon/queue.rb +71 -0
  36. data/lib/hallon/search.rb +10 -7
  37. data/lib/hallon/session.rb +18 -21
  38. data/lib/hallon/toplist.rb +4 -3
  39. data/lib/hallon/user.rb +5 -5
  40. data/lib/hallon/version.rb +1 -1
  41. data/spec/hallon/album_browse_spec.rb +4 -0
  42. data/spec/hallon/artist_browse_spec.rb +4 -0
  43. data/spec/hallon/base_spec.rb +26 -9
  44. data/spec/hallon/hallon_spec.rb +0 -18
  45. data/spec/hallon/image_spec.rb +0 -1
  46. data/spec/hallon/link_spec.rb +14 -0
  47. data/spec/hallon/observable/album_browse_spec.rb +7 -0
  48. data/spec/hallon/observable/artist_browse_spec.rb +7 -0
  49. data/spec/hallon/observable/image_spec.rb +8 -0
  50. data/spec/hallon/observable/playlist_container_spec.rb +21 -0
  51. data/spec/hallon/observable/playlist_spec.rb +85 -0
  52. data/spec/hallon/observable/post_spec.rb +8 -0
  53. data/spec/hallon/observable/search_spec.rb +7 -0
  54. data/spec/hallon/observable/session_spec.rb +143 -0
  55. data/spec/hallon/observable/toplist_spec.rb +7 -0
  56. data/spec/hallon/observable_spec.rb +134 -65
  57. data/spec/hallon/playlist_container_spec.rb +24 -18
  58. data/spec/hallon/playlist_spec.rb +2 -0
  59. data/spec/hallon/queue_spec.rb +35 -0
  60. data/spec/hallon/session_spec.rb +4 -4
  61. data/spec/hallon/spotify_spec.rb +35 -9
  62. data/spec/mockspotify.rb +2 -3
  63. data/spec/spec_helper.rb +0 -1
  64. data/spec/support/common_objects.rb +27 -15
  65. data/spec/support/enumerable_comparison.rb +9 -0
  66. data/spec/support/shared_for_callbacks.rb +60 -0
  67. data/spec/support/shared_for_linkable_objects.rb +1 -1
  68. metadata +56 -20
data/.yardopts CHANGED
@@ -4,5 +4,6 @@
4
4
  --readme README.markdown
5
5
  --markup markdown
6
6
  --private
7
+ --protected
7
8
  lib/**/*.rb
8
9
  ext/**/*.c
@@ -1,22 +1,49 @@
1
1
  Hallon’s Changelog
2
2
  ==================
3
3
 
4
- v0.11.0
4
+ [v0.12.0][]
5
5
  ------------------
6
- [ Added ]
6
+
7
+ __Added__
8
+
9
+ - New system of handling callbacks (with documentation)
10
+ - Hallon::Queue (useful for music_delivery callback)
11
+ - PlaylistContainer::Folder#contents
12
+
13
+ __Changed__
14
+
15
+ - Rewrote the callback system (5f74ed8)
16
+ - Thread.abort_on_exception = true
17
+ - Upgraded to Spotify v10.3.0
18
+
19
+ __Fixed__
20
+
21
+ - Hallon::Error.maybe_raise(:is_loading) will not raise now
22
+ - UTF8 strings in applicable places for output/input
23
+ - Playlist#name= validation issue (allowing too long names)
24
+
25
+ [v0.11.0][]
26
+ ------------------
27
+
28
+ __Added__
29
+
7
30
  - Playlist#can_move?
8
31
  - Base.from(pointer)
9
32
 
10
- [ Changed ]
33
+ __Changed__
34
+
11
35
  - Playlist#move no longer takes a dry_run parameter
12
36
 
13
- [ Fixed ]
37
+ __Fixed__
38
+
14
39
  - Player#music_delivery callback ignoring consumed frames
15
40
  - Session#wait_for minimum timeout time from 0 to 10 ms
16
41
 
17
- v0.10.1 (actually v0.10.0)
42
+ [v0.10.1][] (actually v0.10.0)
18
43
  ------------------
19
- [ Added ]
44
+
45
+ __Added__
46
+
20
47
  - Add PlaylistContainer::Folder#rename
21
48
  - Add PlaylistContainer#insert_folder
22
49
  - Add PlaylistContainer#move (do see #57)
@@ -27,33 +54,39 @@ v0.10.1 (actually v0.10.0)
27
54
  - Playlist::Track#moved?
28
55
  - PlaylistContainer callback support (to be changed, see #56)
29
56
 
30
- [ Fixed ]
57
+ __Fixed__
58
+
31
59
  - A lot of random deadlocks (updated spotify gem dependency)
32
60
 
33
- v0.9.1
61
+ [v0.9.1][]
34
62
  ------------------
35
- [ Added ]
63
+
64
+ __Added__
65
+
36
66
  - PlaylistContainer#size
37
67
  - User#published
38
68
  - PlaylistContainer#contents (only for playlists)
39
69
  - PlaylistContainer#add (existing playlist, new playlist)
40
70
 
41
- [ Changed ]
71
+ __Changed__
72
+
42
73
  - Playlist#seen now moved to Playlist::Track#seen=
43
74
 
44
- [ Fixed ]
75
+ __Fixed__
76
+
45
77
  - Album#cover null pointer issue (https://github.com/Burgestrand/Hallon/issues/53)
46
78
  - Various possible null pointer bugs
47
79
 
48
-
49
- v0.9.0
80
+ [v0.9.0][]
50
81
  ------------------
82
+
51
83
  - Upgraded to libspotify *v10*
52
84
  - Improve documentation consistency
53
85
  - Link.new now raises an error if there’s no session
54
86
  - Minimal PlaylistContainer support (more to come next version)
55
87
 
56
- [ Added ]
88
+ __Added__
89
+
57
90
  - Playlist subsystem support
58
91
  - Toplist#request_duration
59
92
  - AlbumBrowse#request_duration
@@ -75,23 +108,27 @@ v0.9.0
75
108
  - Track#unwrap
76
109
  - type parameter to Artist#browse
77
110
 
78
- [ Fixed ]
111
+ __Fixed__
112
+
79
113
  - Moved from using FFI::Pointers to Spotify::Pointers
80
114
  - Spotify::Pointer garbage collection
81
115
  - Link#valid? using exceptions for flow control
82
116
  - Session#connection_rules= now raises an error when given invalid rule
83
117
  - Search.radio now raises an error when given invalid genres
84
118
 
85
- [ Changed ]
119
+ __Changed__
120
+
86
121
  - Playlist::Track#seen= removed in favor of Playlist#seen(index, yesno)
87
122
  - Object#error -> Object#status (AlbumBrowse, ArtistBrowse, Search, Toplist, User)
88
123
  - Album#year renamed to Album#release_year
89
124
  - Linkable.from_link/to_link and resulting #from_link are now private
90
125
 
91
126
 
92
- v0.8.0
127
+ [v0.8.0][]
93
128
  ------------------
94
- [ Added ]
129
+
130
+ __Added__
131
+
95
132
  - Add example for listing track information in playlists
96
133
  - Updated to (lib)Spotify v9
97
134
  - Full Track subsystem support
@@ -112,7 +149,8 @@ v0.8.0
112
149
  - Allow Image.new to accept an image id
113
150
  - Add Hallon::API_BUILD
114
151
 
115
- [ Fixed ]
152
+ __Fixed__
153
+
116
154
  - Improve speed of Session#wait_for for already-loaded cases
117
155
  - Error.maybe_raise no longer errors out on timeout
118
156
  - from_link now checks for null pointers
@@ -120,33 +158,38 @@ v0.8.0
120
158
  - Cleaned up specs to use same mocks everywhere
121
159
  - Make Hallon::URI match image URIs
122
160
 
123
- [ Broke ]
124
- - Ignore Ruby v1.8.x compatibility
161
+ __Broke__
125
162
 
163
+ - Ignore Ruby v1.8.x compatibility
126
164
 
127
- v0.3.0
165
+ [v0.3.0][]
128
166
  ------------------
167
+
129
168
  - Don’t use bundler for :spec and :test rake tasks
130
169
  - Add Error.table
131
170
  - Add Track subsystem
132
171
  - Fix spec:cov and spotify:coverage rake tasks
133
172
 
134
- v0.2.1
173
+ [v0.2.1][]
135
174
  ------------------
175
+
136
176
  - Fix compatibility with v1.8
137
177
 
138
- v0.2.0
178
+ [v0.2.0][]
139
179
  ------------------
180
+
140
181
  - Alias Session#process_events_on to Session#wait_until
141
182
  - Have Error.maybe_raise return error code
142
183
  - Use mockspotify gem (https://rubygems.org/gems/mockspotify) for testing
143
184
 
144
- v0.1.1
185
+ [v0.1.1][]
145
186
  ------------------
146
- Don’t show the README in the gem description.
147
187
 
148
- v0.1.0
188
+ - Don’t show the README in the gem description.
189
+
190
+ [v0.1.0][]
149
191
  ------------------
192
+
150
193
  Initial, first, release! This version is merely made to
151
194
  have a starting point, a point of reference, for future
152
195
  releases soon to come.
@@ -162,3 +205,15 @@ releases soon to come.
162
205
  The API is still very young, and I expect a lot of changes to
163
206
  happen to it, to make the asynchronous nature of libspotify
164
207
  easier to handle.
208
+
209
+ [v0.1.0]: https://github.com/Burgestrand/Hallon/compare/5f2e118...v0.1.0
210
+ [v0.1.1]: https://github.com/Burgestrand/Hallon/compare/v0.1.0...v0.1.1
211
+ [v0.2.0]: https://github.com/Burgestrand/Hallon/compare/v0.1.1...v0.2.0
212
+ [v0.2.1]: https://github.com/Burgestrand/Hallon/compare/v0.2.0...v0.2.1
213
+ [v0.3.0]: https://github.com/Burgestrand/Hallon/compare/v0.2.1...v0.3.0
214
+ [v0.8.0]: https://github.com/Burgestrand/Hallon/compare/v0.3.0...v0.8.0
215
+ [v0.9.0]: https://github.com/Burgestrand/Hallon/compare/v0.8.0...v0.9.0
216
+ [v0.9.1]: https://github.com/Burgestrand/Hallon/compare/v0.9.0...v0.9.1
217
+ [v0.10.1]: https://github.com/Burgestrand/Hallon/compare/v0.9.1...v0.10.1
218
+ [v0.11.0]: https://github.com/Burgestrand/Hallon/compare/v0.10.1...v0.11.0
219
+ [v0.12.0]: https://github.com/Burgestrand/Hallon/compare/v0.11.0...v0.12.0
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ gemspec
4
4
  gem 'ruby_parser'
5
5
  gem 'pry'
6
6
  gem 'cover_me', :platform => :ruby_19
7
+ gem 'coreaudio' if RUBY_PLATFORM =~ /darwin/i
@@ -53,7 +53,7 @@ Versioning policy
53
53
  -----------------
54
54
  Hallon uses [semantic versioning](http://semver.org) as of v0.0.0. As long
55
55
  as Hallon stays at major version 0, no guarantees of backwards-compatibility
56
- are made. CHANGELOG will be kept up to date with the different versions.
56
+ are made. `CHANGELOG.md` will be kept up to date with the different versions.
57
57
 
58
58
  License
59
59
  -------
data/Rakefile CHANGED
@@ -1,8 +1,12 @@
1
1
  # coding: utf-8
2
2
  require 'rake'
3
3
 
4
- require 'bundler'
5
- Bundler::GemHelper.install_tasks
4
+ begin
5
+ require 'bundler'
6
+ Bundler::GemHelper.install_tasks
7
+ rescue LoadError
8
+ # not everybody needs these
9
+ end
6
10
 
7
11
  require 'yard'
8
12
  YARD::Rake::YardocTask.new
@@ -68,9 +72,6 @@ task 'spotify:coverage' do
68
72
  'wrap_function', # not a spotify function
69
73
  'lookup_return_value', # custom method
70
74
  'define_singleton_method', # overloaded by us
71
- 'image_remove_load_callback', # cleared when Image is GCd
72
- 'playlist_remove_callbacks', # cleared when Playlist is GCd
73
- 'playlistcontainer_remove_callbacks', # cleared when Playlist is GCd
74
75
  ]
75
76
 
76
77
  covered -= ignored
@@ -113,7 +114,8 @@ task 'spotify:coverage' do
113
114
  FileList['lib/**/*.rb'].each do |file|
114
115
  begin
115
116
  $file = file
116
- ast = Ruby19Parser.new.parse File.read(file)
117
+ klass = defined?(Ruby19Parser)? Ruby19Parser : RubyParser
118
+ ast = klass.new.parse File.read(file)
117
119
  ast.each_of_type(:call) do |_, recv, meth, args, *rest|
118
120
  name = handlers[recv][meth].call(recv, meth, args)
119
121
  covered.subtract Array(name).map(&:to_s)
@@ -1,4 +1,7 @@
1
1
  # coding: utf-8
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+
2
5
  require 'hallon'
3
6
  require './spec/support/config'
4
7
 
@@ -1,4 +1,7 @@
1
1
  # coding: utf-8
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+
2
5
  require 'hallon'
3
6
  require './spec/support/config'
4
7
 
@@ -0,0 +1,130 @@
1
+ # coding: utf-8
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+
5
+ require 'hallon'
6
+ require_relative '../spec/support/config'
7
+
8
+ begin
9
+ require 'coreaudio'
10
+ rescue LoadError
11
+ abort <<-ERROR
12
+ This example requires the ruby-coreaudio gem.
13
+
14
+ See: http://rubygems.org/gems/coreaudio
15
+ ERROR
16
+ end
17
+
18
+ # Utility
19
+ def say(string)
20
+ system('say', string)
21
+ end
22
+
23
+ def tell(string)
24
+ puts(string)
25
+ say(string)
26
+ end
27
+
28
+ def prompt(string)
29
+ print(string + ': ')
30
+ $stdout.flush
31
+ say(string)
32
+ gets.chomp
33
+ end
34
+
35
+ # Hallon set-up.
36
+
37
+ sample_rate = 44100 # 44100 samples / second
38
+ device = CoreAudio.default_output_device
39
+ output = device.output_buffer(sample_rate * 3)
40
+ audio_queue = Hallon::Queue.new(sample_rate)
41
+
42
+ session = Hallon::Session.initialize IO.read(ENV['HALLON_APPKEY']) do
43
+ on(:log_message) do |message|
44
+ puts "[LOG] #{message}"
45
+ end
46
+
47
+ on(:connection_error) do |error|
48
+ Hallon::Error.maybe_raise(error)
49
+ end
50
+
51
+ on(:logged_out) do
52
+ abort "[FAIL] Logged out!"
53
+ end
54
+ end
55
+
56
+ end_of_track = false
57
+ player = Hallon::Player.new(session) do
58
+ on(:music_delivery) do |format, frames|
59
+ audio_queue.push(frames)
60
+ end
61
+
62
+ on(:start_playback) do
63
+ puts "(start playback)"
64
+ output.start
65
+ end
66
+
67
+ on(:stop_playback) do
68
+ puts "(stop playback)"
69
+ output.stop
70
+ end
71
+
72
+ on(:get_audio_buffer_stats) do
73
+ [audio_queue.size, 0]
74
+ end
75
+
76
+ on(:end_of_track) do
77
+ puts "End of track!"
78
+ end_of_track = true
79
+ end
80
+ end
81
+
82
+ # Program flow.
83
+
84
+ session.login!(ENV['HALLON_USERNAME'], ENV['HALLON_PASSWORD'])
85
+
86
+ search = loop do
87
+ query = prompt("Enter a search term for a track you’d like to play")
88
+ search = Hallon::Search.new(query)
89
+
90
+ tell "Searching for “#{search.query}”…"
91
+ session.wait_for do
92
+ search.loaded? or Hallon::Error.maybe_raise(search.status)
93
+ end
94
+
95
+ if search.tracks.size.zero?
96
+ tell "No results for “#{search.query}”."
97
+ next
98
+ else
99
+ break search
100
+ end
101
+ end
102
+
103
+ tracks = search.tracks[0...10]
104
+ session.wait_for { tracks.all?(&:loaded?) }
105
+
106
+ tell "Results for “#{search.query}”: "
107
+ tracks.each_with_index do |track, index|
108
+ puts " [#{index + 1}] #{track.name} — #{track.artist.name} (#{track.to_link.to_str})"
109
+ end
110
+ puts
111
+
112
+ track = loop do
113
+ index = prompt("Choose a track to play (between 1 and #{tracks.size})").to_i
114
+
115
+ if track = tracks[index - 1]
116
+ break track
117
+ else
118
+ tell "No such track."
119
+ end
120
+ end
121
+
122
+ player.play(track)
123
+
124
+ tell "Alright! Playing “#{track.name}” by “#{track.artist.name}”."
125
+
126
+ until end_of_track
127
+ output << audio_queue.pop(sample_rate)
128
+ end
129
+
130
+ tell "Done! This was “#{track.name}” by “#{track.artist.name}”. Bye bye!"
@@ -1,4 +1,7 @@
1
1
  # coding: utf-8
2
+
3
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
4
+
2
5
  require 'hallon'
3
6
  require './spec/support/config'
4
7
 
@@ -1,21 +1,13 @@
1
1
  # coding: utf-8
2
2
  #
3
3
  # DISCLAIMER:
4
- # This file was written without extensive testing, and is merely a proof
5
- # of concept. Before using this yourself, I advice you to look through
4
+ # This file was written without extensive testing, and is merely an
5
+ # example. Before using this yourself, I advice you to look through
6
6
  # the code carefully.
7
7
  #
8
- # The below code uses the raw Spotify FFI API, and does not represent how
9
- # this will be done when Hallon has API support for below operations!
10
- #
11
- # Hallon API in this file is only used for:
12
- # - logging in
13
- # - querying track information
14
- #
15
- # Raw Spotify FFI API is used for:
16
- # - fetching playlist container
17
- # - fetching playlists
18
- # - fetching tracks from playlists
8
+
9
+ $LOAD_PATH.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
10
+
19
11
  require 'hallon'
20
12
  require './spec/support/config'
21
13