alexa_ruby 1.1.1 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c64a178ea35c5280218a441dcc9993679965990c
4
- data.tar.gz: aaf9815ad8f4fcd99e9a9f623aeb973eb9ffdbdd
3
+ metadata.gz: dd7bd13bd046d4f22c745be4e01c7bafe6970e72
4
+ data.tar.gz: 125194d8fff5eae293104ab729ca1a8f014a9a59
5
5
  SHA512:
6
- metadata.gz: ff171ca1e709b0fde16930e42a9e49f08b5d788eda174de7ea727356b5e82d0a958646d6dbb825b2bf8fb3c33694ecb10d4e9dcc423b06ad1b6a0c040660f928
7
- data.tar.gz: fadf34ec57b1d7aaf6a4b0c9ce9f2cec734a02769c49378e3f58fd2bd00d41a716e8991ca657d7d99092552d81680a0ee10d12b6d6f4c8e31dbfb9f77779f2ba
6
+ metadata.gz: acb690cb6c31f1ce5a721f122fbedad6f513cb3e4f326a23b3882881d623fce35e1f1fc2f360d22306937fe02437b8a1d7ce2179362476cf2b51cd20ec4ecacb
7
+ data.tar.gz: ad3c6b4b4cb8bd191e55354b51c26e983d6c60601a57d5af705776b2a85b435a0247d72582a4ab5948593bf041fec649a44008508b0785b294b5e7c2fb9170d2
data/CHANGELOG ADDED
@@ -0,0 +1,4 @@
1
+ [1.2.0]
2
+ - Add support of ENQUEUE type in AudioPlayer directive
3
+ - Add support of AudioPlayer.ClearQueue directive
4
+ - Minor refactoring
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alexa_ruby (1.0.4)
4
+ alexa_ruby (1.2.0)
5
5
  bundler (>= 1.6.9)
6
6
  oj (~> 3.0)
7
7
  rake
data/README.md CHANGED
@@ -172,14 +172,48 @@ alexa.response.add_card(card)
172
172
 
173
173
  #### Add audio player directive
174
174
 
175
- Supported directives - AudioPlayer.Play and AudioPlayer.Stop.
176
- To start playback call:
175
+ Supported directives:
176
+
177
+ - AudioPlayer.Play
178
+ - AudioPlayer.ClearQueue
179
+ - AudioPlayer.Stop
180
+
181
+ To start the whole new playback call:
177
182
 
178
183
  ```ruby
179
184
  params = { url: 'https://my-site.com/my-stream', token: 'test', offset: 0 }
180
185
  alexa.response.add_audio_player_directive(:start, params)
181
186
  ```
182
187
 
188
+ To enqueue new audio file call:
189
+
190
+ ```ruby
191
+ params = { url: 'https://my-site.com/my-stream', token: 'test', offset: 0, play_behavior: :enqueue }
192
+ alexa.response.add_audio_player_directive(:start, params)
193
+ ```
194
+
195
+ To replace all previously enqueued audio files call:
196
+
197
+ ```ruby
198
+ params = { url: 'https://my-site.com/my-stream', token: 'test', offset: 0, play_behavior: :replace_enqueued }
199
+ alexa.response.add_audio_player_directive(:start, params)
200
+ ```
201
+
202
+ To clear all:
203
+
204
+ ```ruby
205
+ alexa.response.add_audio_player_directive(:clear)
206
+ ```
207
+
208
+ To clear only enqueued tracks and keep the playing one:
209
+
210
+ ```ruby
211
+ alexa.response.add_audio_player_directive(
212
+ :clear,
213
+ clear_behavior: :clear_queue
214
+ )
215
+ ```
216
+
183
217
  To stop playback call:
184
218
 
185
219
  ```ruby
@@ -4,45 +4,78 @@ module AlexaRuby
4
4
  # Build an AudioPlayer.Play directive
5
5
  #
6
6
  # @param params [Hash] optional request parameters:
7
+ # behavior [Symbol] playback behavior
7
8
  # url [String] streaming URL
8
9
  # token [String] streaming service token
10
+ # previous_token [String] previous played audio token
9
11
  # offset [Integer] playback offset
10
12
  # @return [Hash] AudioPlayer.Play directive
11
13
  # @raise [ArgumentError] if audio URL isn't valid
12
- def play_directive(params)
13
- url = params[:url]
14
- if invalid_url?(url)
14
+ def play(params)
15
+ @opts = params
16
+ if invalid_url?(@opts[:url])
15
17
  raise ArgumentError, 'Audio URL must be a valid ' \
16
18
  'SSL-enabled (HTTPS) endpoint'
17
19
  end
18
- token = token(params[:token])
19
- offset = params[:offset] || 0
20
- build_directive('AudioPlayer.Play', url, token, offset)
20
+ play_directive
21
21
  end
22
22
 
23
23
  # Build AudioPlayer.Stop directive
24
24
  #
25
25
  # @return [Hash] AudioPlayer.Stop directive
26
- def stop_directive
27
- build_directive('AudioPlayer.Stop')
26
+ def stop
27
+ { type: 'AudioPlayer.Stop' }
28
+ end
29
+
30
+ # Build AudioPlayer.ClearQueue directive
31
+ #
32
+ # @param behavior [Symbol] clearing behavior
33
+ # @return [Hash] AudioPlayer.ClearQueue directive
34
+ def clear_queue(behavior = :clear_all)
35
+ clear_behavior =
36
+ case behavior
37
+ when :clear_all
38
+ 'CLEAR_ALL'
39
+ when :clear_queue
40
+ 'CLEAR_ENQUEUED'
41
+ else
42
+ 'CLEAR_ALL'
43
+ end
44
+ { type: 'AudioPlayer.ClearQueue', clearBehavior: clear_behavior }
28
45
  end
29
46
 
30
47
  private
31
48
 
32
- # Set play directive parameters
49
+ # Define playback behavior
50
+ #
51
+ # @param behavior [Symbol] playback behavior
52
+ # @return [String] Amazon behavior type
53
+ def playback_behavior(behavior)
54
+ case behavior
55
+ when :replace_all
56
+ 'REPLACE_ALL'
57
+ when :enqueue
58
+ 'ENQUEUE'
59
+ when :replace_enqueued
60
+ 'REPLACE_ENQUEUED'
61
+ else
62
+ 'REPLACE_ALL'
63
+ end
64
+ end
65
+
66
+ # Build play directive
33
67
  #
34
- # @param type [String] directive type, can be Play or Stop
35
- # @param url [String] streaming service URL
36
- # @param token [String] streaming service token
37
- # @param offset [Integer] playback offset
38
- def build_directive(type, url = nil, token = nil, offset = nil)
39
- directive = { type: type }
40
- return directive if type == 'AudioPlayer.Stop'
41
- directive[:playBehavior] = 'REPLACE_ALL'
42
- directive[:audioItem] = { stream: {} }
43
- directive[:audioItem][:stream][:url] = url
44
- directive[:audioItem][:stream][:token] = token
45
- directive[:audioItem][:stream][:offsetInMilliseconds] = offset
68
+ # @return [Hash] ready to use AudioPlayer.Play directive
69
+ def play_directive
70
+ directive = { type: 'AudioPlayer.Play' }
71
+ directive[:playBehavior] = playback_behavior(@opts[:play_behavior])
72
+ directive[:audioItem] = { stream: { url: @opts[:url] } }
73
+ stream = directive[:audioItem][:stream]
74
+ stream[:token] = token(@opts[:token])
75
+ stream[:offsetInMilliseconds] = @opts[:offset] || 0
76
+ if @opts[:behavior] == :enqueue
77
+ stream[:expectedPreviousToken] = @opts[:previous_token]
78
+ end
46
79
  directive
47
80
  end
48
81
 
@@ -22,12 +22,7 @@ module AlexaRuby
22
22
  # @raise [ArgumentError] if session key is already added and
23
23
  # rewrite is set to false
24
24
  def add_session_attribute(key, value, rewrite = false)
25
- unless rewrite
26
- if @resp[:sessionAttributes].key?(key)
27
- raise ArgumentError, 'Duplicate session attributes not allowed'
28
- end
29
- end
30
- @resp[:sessionAttributes][key] = value
25
+ session_attribute(key, value, rewrite)
31
26
  end
32
27
 
33
28
  # Add pack of session attributes and overwrite all existing ones
@@ -75,14 +70,16 @@ module AlexaRuby
75
70
  # url [String] streaming URL
76
71
  # token [String] streaming service token
77
72
  # offset [Integer] playback offset
73
+ # replace_all [Boolean] true if stream must replace all previous
78
74
  def add_audio_player_directive(directive, params = {})
79
- player = AudioPlayer.new
80
75
  @resp[:response][:directives] = [
81
76
  case directive.to_sym
82
77
  when :start
83
- player.play_directive(params)
78
+ AudioPlayer.new.play(params)
84
79
  when :stop
85
- player.stop_directive
80
+ AudioPlayer.new.stop
81
+ when :clear
82
+ AudioPlayer.new.clear_queue(params[:clear_behavior])
86
83
  end
87
84
  ]
88
85
  end
@@ -153,18 +150,34 @@ module AlexaRuby
153
150
 
154
151
  private
155
152
 
153
+ # Add one session attribute
154
+ #
155
+ # @param key [String] atrribute key
156
+ # @param value [String] attribute value
157
+ # @param rewrite [Boolean] rewrite if key already exists?
158
+ # @raise [ArgumentError] if session key is already added and
159
+ # rewrite is set to false
160
+ def session_attribute(key, value, rewrite = false)
161
+ unless rewrite
162
+ if @resp[:sessionAttributes].key?(key)
163
+ raise ArgumentError, 'Duplicate session attributes not allowed'
164
+ end
165
+ end
166
+ @resp[:sessionAttributes][key] = value
167
+ end
168
+
156
169
  # Add pack of session attributes.
157
170
  # By default all existing session attributes would be overwritten
158
171
  #
159
172
  # @param attributes [Hash] pack of session attributes
160
173
  # @param merge [Boolean] merge attributes with existing ones?
161
174
  def session_attributes(attributes, merge)
162
- if merge
163
- attributes.each { |k, v| add_session_attribute(k, v, true) }
164
- else
175
+ rewrite = true
176
+ unless merge
165
177
  @resp[:sessionAttributes] = {}
166
- attributes.each { |k, v| add_session_attribute(k, v, false) }
178
+ rewrite = false
167
179
  end
180
+ attributes.each { |k, v| session_attribute(k, v, rewrite) }
168
181
  end
169
182
 
170
183
  # Build speech object
@@ -173,13 +186,8 @@ module AlexaRuby
173
186
  # @param ssml [Boolean] is it an SSML speech or not
174
187
  # @return [Hash] speech object
175
188
  def build_speech(speech, ssml)
176
- obj = {}
177
- obj[:type] = ssml ? 'SSML' : 'PlainText'
178
- if ssml
179
- obj[:ssml] = fix_ssml(speech)
180
- else
181
- obj[:text] = speech
182
- end
189
+ obj = { type: ssml ? 'SSML' : 'PlainText' }
190
+ ssml ? obj[:ssml] = fix_ssml(speech) : obj[:text] = speech
183
191
  obj
184
192
  end
185
193
 
@@ -1,3 +1,3 @@
1
1
  module AlexaRuby
2
- VERSION = '1.1.1'.freeze
2
+ VERSION = '1.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alexa_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Mulev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-16 00:00:00.000000000 Z
11
+ date: 2017-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,6 +99,7 @@ executables: []
99
99
  extensions: []
100
100
  extra_rdoc_files: []
101
101
  files:
102
+ - CHANGELOG
102
103
  - Gemfile
103
104
  - Gemfile.lock
104
105
  - LICENSE
@@ -141,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
142
  version: '0'
142
143
  requirements: []
143
144
  rubyforge_project:
144
- rubygems_version: 2.6.12
145
+ rubygems_version: 2.2.2
145
146
  signing_key:
146
147
  specification_version: 4
147
148
  summary: Ruby toolkit for Amazon Alexa API