partygoer-player 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8de5eedf33fdf8d92d9a529e7e388c2e73fa2f1a
4
- data.tar.gz: 2203335b57f79b2a9ae9209e0cb71377e6fa8047
3
+ metadata.gz: cd808b3732d0e0668a599ed9622cd453901993ed
4
+ data.tar.gz: 41ecf1d437b1a5f47b6218b34278ec0754b6c269
5
5
  SHA512:
6
- metadata.gz: ae09b7f31645833b5b3193ad0fdbf34730690de1591169ffd0935faee6152d55e926cee90fc224fd5ba80805554e3a04d7f177137471e1f45faf957fdfedee6f
7
- data.tar.gz: 587e28e8f27bd002c21b185fb0129b2d22ff200c0732a3a858612e6f676794939d2152a5b41fc682777b589678d2679b6cd6ad2cee7149fd8b2826c96320483e
6
+ metadata.gz: 6b0a586cc946eb9dc4b57b756f3038a3b9f418d98cae49fb55b840c1afffbb2f898e29b51edb43d186c84e42be7e94e8bd2113913eb483da7d5baf6148b23f46
7
+ data.tar.gz: 0fd1065e887d3ad902da5d9f275fb8ea6e19a2b8226bf75cc06d9c0278b17a26535b5808f122566c7a88b99e9041eb4e41a44f4338d42270cc3cfc6d4e2fbe05
data/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  **/*.log*
4
4
  **/.spotify
5
5
  **/config.yml
6
+ *.gem
@@ -3,172 +3,172 @@
3
3
 
4
4
  require 'yaml'
5
5
  require 'logger'
6
+ require 'thread'
6
7
 
7
8
  require 'plaything'
8
9
  require 'partygoer-client'
9
10
 
10
11
  require_relative 'partygoer-player/support'
12
+ require_relative 'partygoer-player/framereader'
11
13
 
12
14
 
13
15
 
14
16
  module PartyGoerPlayer
15
17
 
16
- @@logger = Logger.new('partygoer-player.log', 2, 1_000_000)
17
- @@logger.formatter = proc do |severity, datetime, _progname, msg|
18
- "\n\n#{datetime} #{severity}:\n\t#{msg}"
18
+ def self.new(server)
19
+ Player.new(server)
19
20
  end
20
- @@logger.level = Logger::DEBUG
21
21
 
22
- client = PartyGoerClient.new('http://partygoer.io')
23
-
24
- @@playign = false
22
+ class Player
23
+ @@logger = Support.logger
24
+
25
+ def initialize(server)
26
+ @client = PartyGoerClient.new(server)
27
+ @plaything = Plaything.new
28
+ @playing = false
29
+
30
+ $session_callbacks = {
31
+ log_message: proc do |_session, message|
32
+ @@logger.info { "Message from spotify: #{message}" }
33
+ end,
34
+
35
+ logged_in: proc do |_session, error|
36
+ @@logger.info { "Logged in: #{error}" }
37
+ end,
38
+
39
+ logged_out: proc do |_session|
40
+ @@logger.info { 'Logged out!' }
41
+ end,
42
+
43
+ streaming_error: proc do |_session, error|
44
+ @@logger.error { "Streaming error #{error.message}" }
45
+ end,
46
+
47
+ connection_error: proc do |_session, error|
48
+ @@logger.error { "Connection error: #{error}" }
49
+ end,
50
+
51
+ play_token_lost: proc do |_session|
52
+ @@logger.error { 'Play token lost. Stopping playback.' }
53
+ @plaything.stop
54
+ @playing = false
55
+ end,
56
+
57
+ streaming_error: proc do |_session, error|
58
+ @@logger.error { "Streaming error #{error}. Stopping playback" }
59
+ @plaything.stop
60
+ @playing = false
61
+ end,
62
+
63
+ start_playback: proc do |_session|
64
+ @@logger.debug { 'Starting playback' }
65
+ @plaything.play
66
+ end,
67
+
68
+ stop_playback: proc do |_session|
69
+ @@logger.debug { 'Stopping playback' }
70
+ Spotify.try(:session_player_play, session, false)
71
+ @plaything.stop
72
+ end,
73
+
74
+ get_audio_buffer_stats: proc do |_session, stats|
75
+ stats[:samples] = @plaything.queue_size
76
+ stats[:stutter] = @plaything.drops
77
+ end,
78
+
79
+ music_delivery: proc do |_session, format, frames, num_frames|
80
+ if num_frames == 0
81
+ @@logger.error { 'Music delivery audio discontuity' }
82
+ @plaything.stop
83
+ 0
84
+ else
85
+ @@logger.debug {
86
+ "#{num_frames} frames delivered. #{format.to_h.inspect}"
87
+ }
88
+ frames = FrameReader.new(
89
+ format[:channels], format[:sample_type], num_frames, frames)
90
+ consumed_frames = @plaything.stream(frames, format.to_h)
91
+ consumed_frames
92
+ end
93
+ end,
94
+
95
+ end_of_track: proc do |session|
96
+ Spotify.try(:session_player_play, session, false)
97
+ @@logger.info { 'End of track' }
98
+ @plaything.stop
99
+ if @client.up_next
100
+ play_track(session, @client.up_next['spotify_uri'])
101
+ @client.playing = @client.up_next
102
+ @playing = true
103
+ else
104
+ @playing = false
105
+ end
106
+ end
107
+ }
108
+
109
+ config = YAML.load_file('config.yml')
110
+ Support::DEFAULT_CONFIG[:callbacks] = Spotify::SessionCallbacks.new(
111
+ $session_callbacks)
112
+ @session = Support.initialize_spotify!(config['username'], config['password'])
113
+ end
25
114
 
26
115
 
27
- def self.play_track(session, uri)
28
- track = Spotify.link_as_track(Spotify.link_create_from_string(uri))
29
- Spotify.session_process_events(session) until Spotify.track_is_loaded(track)
30
116
 
31
- # Pause before we load a new track. Fixes a quirk in libspotify.
32
- Spotify.try(:session_player_play, session, false)
33
- Spotify.try(:session_player_load, session, track)
34
- Spotify.try(:session_player_play, session, true)
35
- @@playing = true
36
- @@logger.info {"Playing next track: #{uri}"}
37
- rescue
38
- # Log something
39
- @@playing = false
40
- end
41
117
 
42
- class FrameReader
43
- include Enumerable
118
+ def play_track(session, uri)
119
+ track = Spotify.link_as_track(Spotify.link_create_from_string(uri))
120
+ Spotify.session_process_events(session) until Spotify.track_is_loaded(track)
44
121
 
45
- def initialize(channels, sample_type, frames_count, frames_ptr)
46
- @channels = channels
47
- @sample_type = sample_type
48
- @size = frames_count * @channels
49
- @pointer = FFI::Pointer.new(@sample_type, frames_ptr)
122
+ # Pause before we load a new track. Fixes a quirk in libspotify.
123
+ Spotify.try(:session_player_play, session, false)
124
+ Spotify.try(:session_player_load, session, track)
125
+ Spotify.try(:session_player_play, session, true)
126
+ @playing = true
127
+ @@logger.info {"Playing next track: #{uri}"}
128
+ rescue
129
+ @@logger.error {"Failed to play track: #{uri}"}
130
+ @playing = false
50
131
  end
51
132
 
52
- attr_reader :size
53
-
54
- def each
55
- return enum_for(__method__) unless block_given?
56
-
57
- ffi_read = :"read_#{@sample_type}"
58
-
59
- (0...size).each do |index|
60
- yield @pointer[index].public_send(ffi_read)
61
- end
133
+ def pause
134
+ Spotify.try(:session_player_play, @session, false)
62
135
  end
63
- end
64
136
 
65
- plaything = Plaything.new
66
-
67
- $session_callbacks = {
68
- log_message: proc do |_session, message|
69
- @@logger.info { "Message from spotify: #{message}" }
70
- end,
71
-
72
- logged_in: proc do |_session, error|
73
- @@logger.debug { "Logged in: #{error}" }
74
- end,
75
-
76
- logged_out: proc do |_session|
77
- @@logger.debug { 'Logged out!' }
78
- end,
79
-
80
- streaming_error: proc do |_session, error|
81
- @@logger.error { "Streaming error #{error.message}" }
82
- end,
83
-
84
- connection_error: proc do |_session, error|
85
- @@logger.error { "Connection error: #{error}" }
86
- end,
87
-
88
- play_token_lost: proc do |_session|
89
- @@logger.error { 'Play token lost. Stopping playback.' }
90
- plaything.stop
91
- @@playing = false
92
- end,
93
-
94
- streaming_error: proc do |_session, error|
95
- @@logger.error { "Streaming error #{error}. Stopping playback" }
96
- plaything.stop
97
- @@playing = false
98
- end,
99
-
100
- start_playback: proc do |_session|
101
- @@logger.debug { 'Starting playback' }
102
- plaything.play
103
- end,
104
-
105
- stop_playback: proc do |_session|
106
- @@logger.debug { 'Stopping playback' }
107
- plaything.stop
108
- end,
109
-
110
- get_audio_buffer_stats: proc do |_session, stats|
111
- stats[:samples] = plaything.queue_size
112
- stats[:stutter] = plaything.drops
113
- end,
114
-
115
- music_delivery: proc do |_session, format, frames, num_frames|
116
- if num_frames == 0
117
- @@logger.error { 'Music delivery audio discontuity' }
118
- plaything.stop
119
- 0
120
- else
121
- @@logger.error { "#{num_frames} frames delivered. #{format.to_h.inspect}" }
122
- frames = FrameReader.new(
123
- format[:channels], format[:sample_type], num_frames, frames)
124
- consumed_frames = plaything.stream(frames, format.to_h)
125
- consumed_frames
126
- end
127
- end,
128
-
129
- end_of_track: proc do |session|
130
- @@logger.info { 'End of track' }
131
- plaything.stop
132
- if client.up_next
133
- play_track(session, client.up_next['spotify_uri'])
134
- client.playing = client.up_next
135
- @@playing = true
136
- else
137
- @@playing = false
138
- end
137
+ def resume
138
+ Spotify.try(:session_player_play, @session, true)
139
139
  end
140
- }
141
-
142
-
143
- Support::DEFAULT_CONFIG[:callbacks] = Spotify::SessionCallbacks.new(
144
- $session_callbacks)
145
140
 
146
- CONFIG = YAML.load_file('config.yml')
147
-
148
- session = Support.initialize_spotify!(CONFIG['username'], CONFIG['password'])
141
+ def play
142
+ resume
143
+ end
149
144
 
150
- play_track(session, client.playing['spotify_uri']) if client.playing
151
145
 
152
- loop do
153
- Spotify.session_process_events(session)
154
- if client.skip?
155
- @@logger.info { 'Skipping track' }
156
- if client.up_next
157
- play_track(session, client.up_next['spotify_uri'])
158
- client.playing = client.up_next
159
- else
160
- @@playing = false
161
- end
162
- end
163
- unless @@playing
164
- @@logger.info { 'Nothing playing, attempting to play next track' }
165
- if client.up_next
166
- play_track(session, client.up_next['spotify_uri'])
167
- client.playing = client.up_next
168
- else
169
- @@playing = false
170
- end
146
+ def start
147
+ play_track(@session, @client.playing['spotify_uri']) if @client.playing
148
+ t = Thread.new {
149
+ loop do
150
+ Spotify.session_process_events(@session)
151
+ if @client.skip?
152
+ @@logger.info { 'Skipping track' }
153
+ if @client.up_next
154
+ play_track(@session, @client.up_next['spotify_uri'])
155
+ @client.playing = @client.up_next
156
+ else
157
+ @playing = false
158
+ end
159
+ end
160
+ unless @playing
161
+ @@logger.info { 'Nothing playing, attempting to play next track' }
162
+ if @client.up_next
163
+ play_track(@session, @client.up_next['spotify_uri'])
164
+ @client.playing = @client.up_next
165
+ else
166
+ @playing = false
167
+ end
168
+ end
169
+ sleep(0.05)
170
+ end
171
+ }
171
172
  end
172
- sleep(0.05)
173
173
  end
174
174
  end
@@ -0,0 +1,23 @@
1
+ module PartyGoerPlayer
2
+ class FrameReader
3
+ include Enumerable
4
+ attr_reader :size
5
+
6
+ def initialize(channels, sample_type, frames_count, frames_ptr)
7
+ @channels = channels
8
+ @sample_type = sample_type
9
+ @size = frames_count * @channels
10
+ @pointer = FFI::Pointer.new(@sample_type, frames_ptr)
11
+ end
12
+
13
+ def each
14
+ return enum_for(__method__) unless block_given?
15
+
16
+ ffi_read = :"read_#{@sample_type}"
17
+
18
+ (0...size).each do |index|
19
+ yield @pointer[index].public_send(ffi_read)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -44,4 +44,8 @@ module Support
44
44
  end
45
45
  session
46
46
  end
47
+
48
+ def logger
49
+ @@logger
50
+ end
47
51
  end
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'partygoer-player'
3
+ s.version = '0.0.3'
4
+ s.summary = 'Play your partygoer queue!'
5
+ s.description = 'Uses the spotify gem and partygoer-client to play your ' +
6
+ 'partygoer queue'
7
+ s.authors = ["Andrew Hamon"]
8
+ s.email = 'andrew@hamon.cc'
9
+ s.files = `git ls-files -z`.split "\0"
10
+ s.homepage = 'http://github.com/andrewhamon/partygoer-player'
11
+ s.license = 'MIT'
12
+
13
+ s.add_runtime_dependency 'spotify' , '~> 12.6'
14
+ s.add_runtime_dependency 'plaything', '~> 1.1'
15
+ s.add_runtime_dependency 'partygoer-client', '~> 0.0.4'
16
+
17
+ s.required_ruby_version = '>= 1.9.2'
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: partygoer-player
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Hamon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-10 00:00:00.000000000 Z
11
+ date: 2014-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: spotify
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.1
33
+ version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.1
40
+ version: '1.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: partygoer-client
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -60,7 +60,9 @@ extra_rdoc_files: []
60
60
  files:
61
61
  - ".gitignore"
62
62
  - lib/partygoer-player.rb
63
+ - lib/partygoer-player/framereader.rb
63
64
  - lib/partygoer-player/support.rb
65
+ - partygoer-player.gemspec
64
66
  homepage: http://github.com/andrewhamon/partygoer-player
65
67
  licenses:
66
68
  - MIT