require "opentok/client" require "opentok/archive" require "opentok/archive_list" module OpenTok # A class for working with OpenTok archives. class Archives # @private def initialize(client) @client = client end # Starts archiving an OpenTok session. # # Clients must be actively connected to the OpenTok session for you to successfully start # recording an archive. # # You can only record one archive at a time for a given session. You can only record archives # of sessions that use the OpenTok Media Router (sessions with the media mode set to routed); # you cannot archive sessions with the media mode set to relayed. # # For more information on archiving, see the # {https://tokbox.com/opentok/tutorials/archiving OpenTok archiving} programming guide. # # @param [String] session_id The session ID of the OpenTok session to archive. # @param [Hash] options A hash with the key 'name', 'has_audio', and 'has_video' (or # :name. # @option options [String] :name This is the name of the archive. You can use this name # to identify the archive. It is a property of the Archive object, and it is a property # of archive-related events in the OpenTok client SDKs. # @option options [true, false] :has_audio Whether the archive will include an audio track # (true) or not false). The default value is true # (an audio track is included). If you set both has_audio and # has_video to false, the call to the create() # method results in an error. # @option options [true, false] :has_video Whether the archive will include a video track # (true) or not false). The default value is true # (a video track is included). If you set both has_audio and # has_video to false, the call to the create() # method results in an error. # @option options [String] :output_mode Whether all streams in the archive are recorded # to a single file (:composed, the default) or to individual files # (:individual). For more information on archiving and the archive file # formats, see the {https://tokbox.com/opentok/tutorials/archiving OpenTok archiving} # programming guide. # # @return [Archive] The Archive object, which includes properties defining the archive, # including the archive ID. # # @raise [OpenTokArchiveError] The archive could not be started. The request was invalid or # the session has no connected clients. # @raise [OpenTokAuthenticationError] Authentication failed while starting an archive. # Invalid API key. # @raise [OpenTokArchiveError] The archive could not be started. The session ID does not exist. # @raise [OpenTokArchiveError] The archive could not be started. The session could be # peer-to-peer or the session is already being recorded. # @raise [OpenTokArchiveError] The archive could not be started. def create(session_id, options = {}) raise ArgumentError, "session_id not provided" if session_id.to_s.empty? # normalize opts so all keys are symbols and only include valid_opts valid_opts = [ :name, :has_audio, :has_video, :output_mode ] opts = options.inject({}) do |m,(k,v)| if valid_opts.include? k.to_sym m[k.to_sym] = v end m end archive_json = @client.start_archive(session_id, opts) Archive.new self, archive_json end # Gets an Archive object for the given archive ID. # # @param [String] archive_id The archive ID. # # @return [Archive] The Archive object. # @raise [OpenTokArchiveError] The archive could not be retrieved. The archive ID is invalid. # @raise [OpenTokAuthenticationError] Authentication failed while retrieving the archive. # Invalid API key. # @raise [OpenTokArchiveError] The archive could not be retrieved. def find(archive_id) raise ArgumentError, "archive_id not provided" if archive_id.to_s.empty? archive_json = @client.get_archive(archive_id.to_s) Archive.new self, archive_json end # Returns an ArchiveList, which is an array of archives that are completed and in-progress, # for your API key. # # @param [Hash] options A hash with keys defining which range of archives to retrieve. # @option options [integer] :offset Optional. The index offset of the first archive. 0 is offset # of the most recently started archive. 1 is the offset of the archive that started prior to # the most recent archive. If you do not specify an offset, 0 is used. # @option options [integer] :count Optional. The number of archives to be returned. The maximum # number of archives returned is 1000. # @option options [String] :session_id Optional. The session ID that archives belong to. This is # useful when listing multiple archives for an {https://tokbox.com/developer/guides/archiving/#automatic-archives automatically archived session} # # @return [ArchiveList] An ArchiveList object, which is an array of Archive objects. def all(options = {}) raise ArgumentError, "Limit is invalid" unless options[:count].nil? or (0..1000).include? options[:count] archive_list_json = @client.list_archives(options[:offset], options[:count], options[:sessionId]) ArchiveList.new self, archive_list_json end # Stops an OpenTok archive that is being recorded. # # Archives automatically stop recording after 90 minutes or when all clients have disconnected # from the session being archived. # # @param [String] archive_id The archive ID of the archive you want to stop recording. # # @return [Archive] The Archive object corresponding to the archive being stopped. # # @raise [OpenTokArchiveError] The archive could not be stopped. The request was invalid. # @raise [OpenTokAuthenticationError] Authentication failed while stopping an archive. # @raise [OpenTokArchiveError] The archive could not be stopped. The archive ID does not exist. # @raise [OpenTokArchiveError] The archive could not be stopped. The archive is not currently # recording. # @raise [OpenTokArchiveError] The archive could not be started. def stop_by_id(archive_id) raise ArgumentError, "archive_id not provided" if archive_id.to_s.empty? archive_json = @client.stop_archive(archive_id) Archive.new self, archive_json end # Deletes an OpenTok archive. # # You can only delete an archive which has a status of "available", "uploaded", or "deleted". # Deleting an archive removes its record from the list of archives. For an "available" archive, # it also removes the archive file, making it unavailable for download. For a "deleted" # archive, the archive remains deleted. # # @param [String] archive_id The archive ID of the archive you want to delete. # # @raise [OpenTokAuthenticationError] Authentication failed or an invalid archive ID was given. # @raise [OpenTokArchiveError] The archive could not be deleted. The status must be # 'available', 'deleted', or 'uploaded'. # @raise [OpenTokArchiveError] The archive could not be deleted. def delete_by_id(archive_id) raise ArgumentError, "archive_id not provided" if archive_id.to_s.empty? response = @client.delete_archive(archive_id) (200..300).include? response.code end end end