opentok 3.0.3 → 3.1.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +249 -14
  3. data/lib/opentok/archive.rb +45 -4
  4. data/lib/opentok/archives.rb +62 -5
  5. data/lib/opentok/broadcast.rb +118 -0
  6. data/lib/opentok/broadcasts.rb +149 -0
  7. data/lib/opentok/client.rb +206 -3
  8. data/lib/opentok/connections.rb +28 -0
  9. data/lib/opentok/exceptions.rb +6 -0
  10. data/lib/opentok/opentok.rb +40 -8
  11. data/lib/opentok/session.rb +5 -0
  12. data/lib/opentok/signals.rb +47 -0
  13. data/lib/opentok/sip.rb +35 -0
  14. data/lib/opentok/stream.rb +46 -0
  15. data/lib/opentok/stream_list.rb +18 -0
  16. data/lib/opentok/streams.rb +79 -0
  17. data/lib/opentok/version.rb +1 -1
  18. data/spec/cassettes/OpenTok_Archives/calls_layout_on_archive_object.yml +45 -0
  19. data/spec/cassettes/OpenTok_Archives/changes_the_layout_of_an_archive.yml +36 -0
  20. data/spec/cassettes/OpenTok_Archives/should_create_hd_archives.yml +52 -0
  21. data/spec/cassettes/OpenTok_Broadcasts/calls_layout_on_broadcast_object.yml +55 -0
  22. data/spec/cassettes/OpenTok_Broadcasts/changes_the_layout_of_a_broadcast.yml +36 -0
  23. data/spec/cassettes/OpenTok_Broadcasts/fetches_a_hls_broadcast_url.yml +50 -0
  24. data/spec/cassettes/OpenTok_Broadcasts/finds_a_broadcast.yml +55 -0
  25. data/spec/cassettes/OpenTok_Broadcasts/starts_a_rtmp_broadcast.yml +59 -0
  26. data/spec/cassettes/OpenTok_Broadcasts/stops_a_broadcast.yml +45 -0
  27. data/spec/cassettes/OpenTok_Connections/forces_a_connection_to_be_terminated.yml +36 -0
  28. data/spec/cassettes/OpenTok_Signals/receives_a_valid_response_for_a_connection.yml +37 -0
  29. data/spec/cassettes/OpenTok_Signals/receives_a_valid_response_for_all_connections.yml +37 -0
  30. data/spec/cassettes/OpenTok_Streams/get_all_streams_information.yml +53 -0
  31. data/spec/cassettes/OpenTok_Streams/get_specific_stream_information.yml +42 -0
  32. data/spec/cassettes/OpenTok_Streams/layout_working_on_two_stream_list.yml +36 -0
  33. data/spec/opentok/archives_spec.rb +73 -0
  34. data/spec/opentok/broadcasts_spec.rb +171 -0
  35. data/spec/opentok/connection_spec.rb +38 -0
  36. data/spec/opentok/signal_spec.rb +50 -0
  37. data/spec/opentok/streams_spec.rb +75 -0
  38. metadata +48 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 679a364a592829ee29acad18146e680f82d2a3de
4
- data.tar.gz: 1d822425e30d6aa05e41768348fd9863b85677a4
3
+ metadata.gz: 4baddcff5e72cad62caf5c0046c8a2eb3cc375b3
4
+ data.tar.gz: 59b84a91a65d5841f76f4251a26ea99739386117
5
5
  SHA512:
6
- metadata.gz: 0e0fdf3a74c811f22c535c1829eb9109ce7f8e2c45ab711796ee97a5891658aa2ab3d5625f9ddf953ddcbb27241ddb339261fec7d5321145ed012469cc896a1f
7
- data.tar.gz: '0741182e612a82221688abda4226a5138e1051a47ad5d0f8a3e59005461935a2af711ba338721d37d2a42954e4113f43733ec2cbfca0c0a0ee77d83222701319'
6
+ metadata.gz: 5bdaf9b065a6e5449b9753d42e3fd906e9afa66635d71b74ae0f2965bc34e138de2a253f4707d0bbbe3fe972584db3f9f235129c55ec1dfb09b4669ef2de0eb1
7
+ data.tar.gz: ad070ca9e3e516b96c9cbd8aff45ccd9b1f593f657688f8b1c90894c1b72bcb5c9dc53ccea0d19c7ef7d813951645709a6daa3855362625bd3e976be87118f80
data/README.md CHANGED
@@ -3,10 +3,14 @@
3
3
  [![Build Status](https://travis-ci.org/opentok/OpenTok-Ruby-SDK.png)](https://travis-ci.org/opentok/OpenTok-Ruby-SDK)
4
4
 
5
5
  The OpenTok Ruby SDK lets you generate
6
- [sessions](http://www.tokbox.com/opentok/tutorials/create-session/) and
7
- [tokens](http://www.tokbox.com/opentok/tutorials/create-token/) for
8
- [OpenTok](http://www.tokbox.com/) applications, and
9
- [archive](https://tokbox.com/opentok/tutorials/archiving) OpenTok sessions.
6
+ [sessions](https://tokbox.com/developer/guides/create-session/) and
7
+ [tokens](https://tokbox.com/developer/guides/create-token/) for
8
+ [OpenTok](http://www.tokbox.com/) applications. It also includes methods for
9
+ working with OpenTok [archives](https://tokbox.com/developer/guides/archiving),
10
+ working with OpenTok [live streaming
11
+ broadcasts](https://tokbox.com/developer/guides/broadcast/live-streaming/),
12
+ working with OpenTok [SIP interconnect](https://tokbox.com/developer/guides/sip),
13
+ and [disconnecting clients from sessions](https://tokbox.com/developer/guides/moderation/rest/).
10
14
 
11
15
  # Installation
12
16
 
@@ -17,7 +21,7 @@ Bundler helps manage dependencies for Ruby projects. Find more info here: <http:
17
21
  Add this gem to your `Gemfile`:
18
22
 
19
23
  ```ruby
20
- gem "opentok", "~> 3.0.3"
24
+ gem "opentok", "~> 3.1.0"
21
25
  ```
22
26
 
23
27
  Allow bundler to install the change.
@@ -47,11 +51,19 @@ opentok = OpenTok::OpenTok.new api_key, api_secret
47
51
 
48
52
  ## Creating Sessions
49
53
 
50
- To create an OpenTok Session, use the `OpenTok#create_session(properties)` method. The
51
- `properties` parameter is an optional Hash used to specify whether you are creating a session that
52
- uses the OpenTok Media Server and specifying a location hint. The `session_id` method of the
53
- returned `OpenTok::Session` instance is useful to get a sessionId that can be saved to a persistent
54
- store (e.g. database).
54
+ To create an OpenTok Session, use the `OpenTok#create_session(properties)` method.
55
+ The `properties` parameter is an optional Hash used to specify the following:
56
+
57
+ * Whether the session uses the [OpenTok Media
58
+ Router](https://tokbox.com/developer/guides/create-session/#media-mode),
59
+ which is required for some OpenTok features (such as archiving)
60
+
61
+ * A location hint for the OpenTok server.
62
+
63
+ * Whether the session is automatically archived.
64
+
65
+ The `session_id` method of the returned `OpenTok::Session` instance is useful to
66
+ get a sessionId that can be saved to a persistent store (such as a database).
55
67
 
56
68
  ```ruby
57
69
  # Create a session that will attempt to transmit streams directly between clients.
@@ -96,8 +108,37 @@ token = session.generate_token({
96
108
  });
97
109
  ```
98
110
 
111
+ ## Working with Streams
112
+
113
+ Use this method to get information for an OpenTok stream or for all streams in a session.
114
+ For example, you can call this method to get information about layout classes used by an
115
+ OpenTok stream.
116
+
117
+ To get information of a specific stream in a session, call
118
+ `opentok.streams.find(session_id, stream_id)`. The return object is a `Stream` object and
119
+ you can access various stream properties as shown in the following example (using RSpec notations):
120
+
121
+ ```ruby
122
+ expect(stream).to be_an_instance_of OpenTok::Stream
123
+ expect(stream.videoType).to eq 'camera'
124
+ expect(stream.layoutClassList.count).to eq 1
125
+ expect(stream.layoutClassList.first).to eq "full"
126
+ ```
127
+
128
+ To get information on all streams in a session, call `opentok.streams.all(session_id)`.
129
+ The return value is a `StreamList` object:
130
+
131
+ ```ruby
132
+ expect(all_streams).to be_an_instance_of OpenTok::StreamList
133
+ expect(all_streams.total).to eq 2
134
+ expect(all_streams[0].layoutClassList[1]).to eq "focus"
135
+ ```
136
+
99
137
  ## Working with Archives
100
138
 
139
+ You can only archive sessions that use the OpenTok Media Router
140
+ (sessions with the media mode set to routed).
141
+
101
142
  You can start the recording of an OpenTok Session using the `opentok.archives.create(session_id,
102
143
  options)` method. This will return an `OpenTok::Archive` instance. The parameter `options` is an
103
144
  optional Hash used to set the `has_audio`, `has_video`, and `name` options. Note that you can
@@ -127,6 +168,19 @@ archive = opentok.archives.create session_id :output_mode => :individual
127
168
  The `:output_mode => :composed` setting (the default) causes all streams in the archive to be
128
169
  recorded to a single (composed) file.
129
170
 
171
+ For composed archives you can set the resolution of the archive, either "640x480" (SD, the default)
172
+ or "1280x720" (HD). The `resolution` parameter is optional and could be included in the options
173
+ hash (second argument) of the `opentok.archives.create()` method.
174
+
175
+ ```ruby
176
+ opts = {
177
+ :output_mode => :composed,
178
+ :resolution => "1280x720"
179
+ }
180
+
181
+ archive = opentok.archives.create session_id, opts
182
+ ```
183
+
130
184
  You can stop the recording of a started Archive using the `opentok.archives.stop_by_id(archive_id)`
131
185
  method. You can also do this using the `Archive#stop()` method.
132
186
 
@@ -175,14 +229,194 @@ Note that you can also create an automatically archived session, by passing in `
175
229
  as the `:archive_mode` property of the `options` parameter passed into the
176
230
  `OpenTok#create_session()` method (see "Creating Sessions," above).
177
231
 
232
+ You can set the [layout](https://tokbox.com/developer/rest/#change_composed_archive_layout) of an archive:
233
+
234
+ ```ruby
235
+ opts = { :type => "verticalPresentation" }
236
+ opentok.archives.layout(archive_id, opts)
237
+ ```
238
+
239
+ The hash `opts` has two entries:
240
+
241
+ * The `type` is the layout type for the archive. Valid values are "bestFit" (best fit)
242
+ "custom" (custom), "horizontalPresentation" (horizontal presentation),
243
+ "pip" (picture-in-picture), and "verticalPresentation" (vertical presentation)).
244
+
245
+ * If you specify a "custom" layout type, set the `stylesheet` property.
246
+ (For other layout types, do not set the stylesheet property.)
247
+
248
+ See [Customizing the video layout for composed archives](https://tokbox.com/developer/guides/archiving/layout-control.html)
249
+ for more details.
250
+
251
+ You can set the initial layout class for a client's streams by setting the layout option when you
252
+ create the token for the client, using the `opentok.generate_token` method. And you can also change
253
+ the layout classes of a stream as follows:
254
+
255
+ ```ruby
256
+ streams_list = {
257
+ :items => [
258
+ {
259
+ :id => "8b732909-0a06-46a2-8ea8-074e64d43422",
260
+ :layoutClassList => ["full"]
261
+ },
262
+ {
263
+ :id => "8b732909-0a06-46a2-8ea8-074e64d43423",
264
+ :layoutClassList => ["full", "focus"]
265
+ }
266
+ ]
267
+ }
268
+ response = opentok.streams.layout(session_id, streams_list)
269
+ ```
270
+
271
+ For more information on setting stream layout classes, see the
272
+ [Changing the composed archive layout classes for an OpenTok
273
+ stream](https://tokbox.com/developer/rest/#change-stream-layout-classes-composed).
274
+
275
+ Please keep in mind that the `streams.layout` method applies to archive and broadcast streams only.
276
+
178
277
  For more information on archiving, see the
179
278
  [OpenTok archiving](https://tokbox.com/opentok/tutorials/archiving/) programming guide.
180
279
 
280
+ ## Signaling
181
281
 
182
- ## Initiating a SIP call
282
+ You can send a signal using the `opentok.signals.send(session_id, connection_id, opts)` method.
283
+ If `connection_id` is nil or an empty string, then the signal is send to all valid connections in
284
+ the session.
285
+
286
+ An example of `opts` field can be as follows:
287
+
288
+ ```ruby
289
+ opts = { :type => "chat",
290
+ :data => "Hello"
291
+ }
292
+ ```
293
+
294
+ The maximum length of the `type` string is 128 bytes, and it must contain only letters
295
+ (A-Z and a-z), numbers (0-9), '-', '_', and '~'.
296
+
297
+ The `data` string must not exceed the maximum size (8 kB).
298
+
299
+ The `connection_id` and `opts` parameter are jointly optional by default. Hence you can also
300
+ use `opentok.signals.send(session_id)`
301
+
302
+ For more information on signaling, see the
303
+ [OpenTok Signaling](https://tokbox.com/developer/guides/signaling/js/) programming guide.
304
+
305
+ ## Broadcasting
306
+
307
+ You can broadcast your streams to a HLS or RTMP servers.
308
+
309
+ To successfully start broadcasting a session, at least one publishing client must be connected to
310
+ the session.
311
+
312
+ You can only have one active live streaming broadcast at a time for a session (however, having more
313
+ than one would not be useful).
314
+
315
+ The live streaming broadcast can target one HLS endpoint and up to five RTMP servers simultaneously
316
+ for a session.
317
+
318
+ You can only start live streaming for sessions that use the OpenTok Media Router (with the
319
+ media mode set to routed). You cannot use live streaming with sessions that have the media mode set
320
+ to relayed.
321
+
322
+ To create a HLS only broadcast:
323
+ ```ruby
324
+ opts = {
325
+ :outputs => {
326
+ :hls => {}
327
+ }
328
+ }
329
+ broadcast = opentok.broadcasts.create(session_id, opts)
330
+
331
+ # HLS + RTMP
332
+ opts = {
333
+ :outputs => {
334
+ :hls => {},
335
+ :rtmp => [
336
+ {
337
+ :id => "myOpentokStream",
338
+ :serverUrl => "rtmp://x.rtmp.youtube.com/live123",
339
+ :streamName => "66c9-jwuh-pquf-9x00"
340
+ }
341
+ ]
342
+ }
343
+ }
344
+ broadcast = opentok.broadcasts.create(session_id, opts)
345
+ ```
346
+
347
+ The returned Broadcast object has information about the broadcast, like id, sessionId , projectId,
348
+ createdAt, updatedAt, resolution, status, and a Hash of broadcastUrls. The broadcastUrls
349
+ consists of an HLS URL and an array of RTMP objects. The RTMP objects resembles the `rtmp` value
350
+ in `opts` in the example above.
351
+
352
+ For more information on broadcast, see the
353
+ [OpenTok Broadcast guide](https://tokbox.com/developer/rest/#start_broadcast) programming guide.
183
354
 
184
- You can initiate a SIP call using the `opentok.sip.dial(session_id, token, sip_uri, opts)` method. This requires a SIP url. You will often need to pass options for authenticating to the SIP provider and specifying encrypted session establishment.
355
+ To get information about a broadcast stream
356
+ ```ruby
357
+ my_broadcast = opentok.broadcasts.find broadcast_id
358
+ ```
359
+ The Broadcast object returned has properties describing the broadcast, like id, sessionId,
360
+ projectId, createdAt, updatedAt, resolution, status, and a Hash of broadcastUrls. The broadcastUrls
361
+ consists of an HLS URL and an array of RTMP objects. The RTMP objects resembles the `rtmp` value
362
+ in `opts` in the example above.
363
+
364
+ To stop a broadcast:
365
+
366
+ ```ruby
367
+ my_broadcast = opentok.broadcasts.stop broadcast_id
368
+
369
+ # stop at a broadcast object level too
370
+ #
371
+ my_broadcast = opentok.broadcasts.find broadcast_id
372
+ ret_broadcast = my_broadcast.stop
373
+
374
+ # Both the above returned objects has the "broadcastUrls" property as a nil value and the status
375
+ # property value is "stopped"
376
+ ```
377
+
378
+
379
+ To change the layout of a broadcast dynamically
380
+ ```ruby
381
+ opentok.broadcasts.layout(started_broadcast_id, {
382
+ :type => "verticalPresentation"
383
+ })
384
+
385
+ # On an object level
386
+ my_broadcast = opentok.broadcasts.find broadcast_id
387
+ my_broadcast.layout(
388
+ :type => 'pip',
389
+ )
390
+
391
+ # the returned value is true if successful
392
+ ```
393
+
394
+ The hash above has two entries.
395
+
396
+ * The `type` is the layout type for the archive. Valid values are "bestFit" (best fit),
397
+ "custom" (custom), "horizontalPresentation" (horizontal presentation),
398
+ "pip" (picture-in-picture), and "verticalPresentation" (vertical presentation).
399
+
400
+ * If you specify a "custom" layout type, set the `stylesheet` property. (For other layout types,
401
+ do not set the stylesheet property.)
402
+
403
+ Refer to [Customizing the video layout for composed
404
+ archives](https://tokbox.com/developer/guides/archiving/layout-control.html)
405
+ for more details.
406
+
407
+ You can also change the layout of an individual stream dynamically. Refer to
408
+ [working with Streams](#working-with-streams).
409
+
410
+ ## Force disconnect
411
+
412
+ You can cause a client to be forced to disconnect from a session by using the
413
+ `opentok.connections.forceDisconnect(session_id, connection_id)` method.
414
+
415
+ ## Initiating a SIP call
185
416
 
417
+ You can initiate a SIP call using the `opentok.sip.dial(session_id, token, sip_uri, opts)` method.
418
+ This requires a SIP URL. You will often need to pass options for authenticating to the SIP provider
419
+ and specifying encrypted session establishment.
186
420
 
187
421
  ```ruby
188
422
  opts = { "auth" => { "username" => sip_username,
@@ -193,7 +427,7 @@ response = opentok.sip.dial(session_id, token, "sip:+15128675309@acme.pstn.examp
193
427
  ```
194
428
 
195
429
  For more information on SIP Interconnect, see the
196
- [OpenTok SIP Interconnect](https://tokbox.com/developer/guides/sip/) programming guide.
430
+ [OpenTok SIP Interconnect](https://tokbox.com/developer/guides/sip/) developer guide.
197
431
 
198
432
 
199
433
  # Samples
@@ -210,7 +444,8 @@ Reference documentation is available at <http://www.tokbox.com//opentok/librarie
210
444
 
211
445
  # Requirements
212
446
 
213
- You need an OpenTok API key and API secret, which you can obtain at <https://dashboard.tokbox.com>.
447
+ You need an OpenTok API key and API secret, which you can obtain by logging into your
448
+ [TokBox account](https://tokbox.com/account).
214
449
 
215
450
  The OpenTok Ruby SDK requires Ruby 1.9.3 or greater.
216
451
 
@@ -54,8 +54,8 @@ module OpenTok
54
54
  # * "started" -- The archive started and is in the process of being recorded.
55
55
  # * "stopped" -- The archive stopped recording.
56
56
  # * "uploaded" -- The archive is available for download from the the upload target
57
- # Amazon S3 bucket or Windows Azure container you set at the OpenTok dashboard
58
- # (https://dashboard.tokbox.com).
57
+ # Amazon S3 bucket or Windows Azure container you set for your
58
+ # {https://tokbox.com/account OpenTok project}.
59
59
  #
60
60
  # @attr [string] url
61
61
  # The download URL of the available MP4 file. This is only set for an archive with the status set to
@@ -71,14 +71,14 @@ module OpenTok
71
71
  @json = json
72
72
  end
73
73
 
74
- # A JSON encoded string representation of the archive
74
+ # A JSON-encoded string representation of the archive.
75
75
  def to_json
76
76
  @json.to_json
77
77
  end
78
78
 
79
79
  # Stops an OpenTok archive that is being recorded.
80
80
  #
81
- # Archives automatically stop recording after 90 minutes or when all clients have disconnected
81
+ # Archives automatically stop recording after 120 minutes or when all clients have disconnected
82
82
  # from the session being archived.
83
83
  def stop
84
84
  # TODO: validate returned json fits schema
@@ -95,6 +95,47 @@ module OpenTok
95
95
  @json = @interface.delete_by_id @json['id']
96
96
  end
97
97
 
98
+ # Sets the layout type for a composed archive. For a description of layout types, see
99
+ # {https://tokbox.com/developer/guides/archiving/layout-control.html Customizing
100
+ # the video layout for composed archives}.
101
+ #
102
+ # @option options [String] :type
103
+ # The layout type. Set this to "bestFit", "pip", "verticalPresentation",
104
+ # "horizontalPresentation", "focus", or "custom".
105
+ #
106
+ # @option options [String] :stylesheet
107
+ # The stylesheet for a custom layout. Set this parameter
108
+ # if you set <code>type</code> to <code>"custom"</code>. Otherwise, leave it undefined.
109
+ #
110
+ # @raise [ArgumentError] The archive_id or options parameter is empty. Or the "custom"
111
+ # type was specified without a stylesheet option. Or a stylesheet was passed in for a
112
+ # type other than custom. Or an invalid type was passed in.
113
+ #
114
+ # @raise [OpenTokAuthenticationError]
115
+ # Authentication failed.
116
+ #
117
+ # @raise [ArgumentError]
118
+ # The archive_id or options parameter is empty.
119
+ #
120
+ # @raise [ArgumentError]
121
+ # The "custom" type was specified without a stylesheet option.
122
+ #
123
+ # @raise [ArgumentError]
124
+ # A stylesheet was passed in for a type other than custom. Or an invalid type was passed in.
125
+ #
126
+ # @raise [ArgumentError]
127
+ # An invalid layout type was passed in.
128
+ #
129
+ # @raise [OpenTokError]
130
+ # OpenTok server error.
131
+ #
132
+ # @raise [OpenTokArchiveError]
133
+ # Setting the layout failed.
134
+ def layout(opts= {})
135
+ # TODO: validate returned json fits schema
136
+ @json = @interface.layout(@json['id'], opts)
137
+ end
138
+
98
139
  # @private ignore
99
140
  def method_missing(method, *args, &block)
100
141
  camelized_method = method.to_s.camelize(:lower)
@@ -24,8 +24,8 @@ module OpenTok
24
24
  # {https://tokbox.com/opentok/tutorials/archiving OpenTok archiving} programming guide.
25
25
  #
26
26
  # @param [String] session_id The session ID of the OpenTok session to archive.
27
- # @param [Hash] options A hash with the key 'name', 'has_audio', and 'has_video' (or
28
- # :name.
27
+ # @param [Hash] options A hash with the keys 'name', 'has_audio', 'has_video',
28
+ # and 'output_mode'.
29
29
  # @option options [String] :name This is the name of the archive. You can use this name
30
30
  # to identify the archive. It is a property of the Archive object, and it is a property
31
31
  # of archive-related events in the OpenTok client SDKs.
@@ -44,6 +44,10 @@ module OpenTok
44
44
  # (<code>:individual</code>). For more information on archiving and the archive file
45
45
  # formats, see the {https://tokbox.com/opentok/tutorials/archiving OpenTok archiving}
46
46
  # programming guide.
47
+ # @option options [String] :resolution The resolution of the archive, either "640x480" (SD, the
48
+ # default) or "1280x720" (HD). This property only applies to composed archives. If you set
49
+ # this property and set the outputMode property to "individual", the call the method
50
+ # results in an error.
47
51
  #
48
52
  # @return [Archive] The Archive object, which includes properties defining the archive,
49
53
  # including the archive ID.
@@ -58,9 +62,11 @@ module OpenTok
58
62
  # @raise [OpenTokArchiveError] The archive could not be started.
59
63
  def create(session_id, options = {})
60
64
  raise ArgumentError, "session_id not provided" if session_id.to_s.empty?
65
+ raise ArgumentError,
66
+ "Resolution cannot be supplied for individual output mode" if options.key?(:resolution) and options[:output_mode] == :individual
61
67
 
62
68
  # normalize opts so all keys are symbols and only include valid_opts
63
- valid_opts = [ :name, :has_audio, :has_video, :output_mode ]
69
+ valid_opts = [ :name, :has_audio, :has_video, :output_mode, :resolution ]
64
70
  opts = options.inject({}) do |m,(k,v)|
65
71
  if valid_opts.include? k.to_sym
66
72
  m[k.to_sym] = v
@@ -97,7 +103,7 @@ module OpenTok
97
103
  # @option options [integer] :count Optional. The number of archives to be returned. The maximum
98
104
  # number of archives returned is 1000.
99
105
  # @option options [String] :session_id Optional. The session ID that archives belong to. This is
100
- # useful when listing multiple archives for an {https://tokbox.com/developer/guides/archiving/#automatic-archives automatically archived session}
106
+ # useful when listing multiple archives for an {https://tokbox.com/developer/guides/archiving/#automatic-archives automatically archived session}.
101
107
  #
102
108
  # @return [ArchiveList] An ArchiveList object, which is an array of Archive objects.
103
109
  def all(options = {})
@@ -108,7 +114,7 @@ module OpenTok
108
114
 
109
115
  # Stops an OpenTok archive that is being recorded.
110
116
  #
111
- # Archives automatically stop recording after 90 minutes or when all clients have disconnected
117
+ # Archives automatically stop recording after 120 minutes or when all clients have disconnected
112
118
  # from the session being archived.
113
119
  #
114
120
  # @param [String] archive_id The archive ID of the archive you want to stop recording.
@@ -146,5 +152,56 @@ module OpenTok
146
152
  (200..300).include? response.code
147
153
  end
148
154
 
155
+ # Sets the layout type for a composed archive. For a description of layout types, see
156
+ # {https://tokbox.com/developer/guides/archiving/layout-control.html Customizing
157
+ # the video layout for composed archives}.
158
+ #
159
+ # @param [String] archive_id
160
+ # The archive ID.
161
+ #
162
+ # @option options [String] :type
163
+ # The layout type. Set this to "bestFit", "pip", "verticalPresentation",
164
+ # "horizontalPresentation", "focus", or "custom".
165
+ #
166
+ # @option options [String] :stylesheet
167
+ # The stylesheet for a custom layout. Set this parameter
168
+ # if you set <code>type</code> to <code>"custom"</code>. Otherwise, leave it undefined.
169
+ #
170
+ # @raise [ArgumentError]
171
+ # The archive_id or options parameter is empty. Or the "custom"
172
+ # type was specified without a stylesheet option. Or a stylesheet was passed in for a
173
+ # type other than custom. Or an invalid type was passed in.
174
+ #
175
+ # @raise [OpenTokAuthenticationError]
176
+ # Authentication failed.
177
+ #
178
+ # @raise [ArgumentError]
179
+ # The archive_id or options parameter is empty.
180
+ #
181
+ # @raise [ArgumentError]
182
+ # The "custom" type was specified without a stylesheet option.
183
+ #
184
+ # @raise [ArgumentError]
185
+ # A stylesheet was passed in for a type other than custom. Or an invalid type was passed in.
186
+ #
187
+ # @raise [ArgumentError]
188
+ # An invalid layout type was passed in.
189
+ #
190
+ # @raise [OpenTokError]
191
+ # OpenTok server error.
192
+ #
193
+ # @raise [OpenTokArchiveError]
194
+ # Setting the layout failed.
195
+ def layout(archive_id, options = {})
196
+ raise ArgumentError, "option parameter is empty" if options.empty?
197
+ raise ArgumentError, "archive_id not provided" if archive_id.to_s.empty?
198
+ type = options[:type]
199
+ raise ArgumentError, "custom type must have a stylesheet" if (type.eql? "custom") && (!options.key? :stylesheet)
200
+ valid_non_custom_type = ["bestFit","horizontalPresentation","pip", "verticalPresentation", ""].include? type
201
+ raise ArgumentError, "type is not valid or stylesheet not needed" if !valid_non_custom_type
202
+ raise ArgumentError, "type is not valid or stylesheet not needed" if valid_non_custom_type and options.key? :stylesheet
203
+ response = @client.layout_archive(archive_id, options)
204
+ (200..300).include? response.code
205
+ end
149
206
  end
150
207
  end