hallon 0.11.0 → 0.12.0

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 (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