partygoer-player 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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