opentok 3.0.3 → 3.1.0

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