rev-api 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -1
  3. data/.gitignore +21 -21
  4. data/.ruby-gemset +1 -1
  5. data/.ruby-version +1 -1
  6. data/.travis.yml +8 -8
  7. data/Gemfile +3 -3
  8. data/LICENSE +191 -191
  9. data/README.md +132 -132
  10. data/Rakefile +13 -13
  11. data/examples/cli.rb +270 -270
  12. data/lib/rev-api.rb +25 -25
  13. data/lib/rev-api/api.rb +326 -326
  14. data/lib/rev-api/api_serializable.rb +30 -30
  15. data/lib/rev-api/exceptions.rb +97 -100
  16. data/lib/rev-api/http_client.rb +97 -97
  17. data/lib/rev-api/models/order.rb +130 -138
  18. data/lib/rev-api/models/order_request.rb +194 -222
  19. data/lib/rev-api/version.rb +3 -3
  20. data/rev-api.gemspec +34 -34
  21. data/spec/fixtures/api_cassettes/cancel_order.yml +38 -38
  22. data/spec/fixtures/api_cassettes/cancel_order_not_allowed.yml +40 -40
  23. data/spec/fixtures/api_cassettes/get_attachment_content.yml +399 -399
  24. data/spec/fixtures/api_cassettes/get_attachment_content_as_pdf.yml +399 -399
  25. data/spec/fixtures/api_cassettes/get_attachment_content_as_text.yml +65 -65
  26. data/spec/fixtures/api_cassettes/get_attachment_content_as_youtube_transcript.yml +66 -66
  27. data/spec/fixtures/api_cassettes/get_attachment_content_unacceptable_representation.yml +42 -42
  28. data/spec/fixtures/api_cassettes/get_attachment_content_with_invalid_id.yml +42 -42
  29. data/spec/fixtures/api_cassettes/get_attachment_metadata.yml +42 -42
  30. data/spec/fixtures/api_cassettes/get_attachment_with_invalid_id.yml +40 -40
  31. data/spec/fixtures/api_cassettes/get_orders.yml +122 -122
  32. data/spec/fixtures/api_cassettes/get_orders_with_clientRef.yml +41 -41
  33. data/spec/fixtures/api_cassettes/get_tc_order.yml +44 -44
  34. data/spec/fixtures/api_cassettes/get_third_page_of_orders.yml +52 -58
  35. data/spec/fixtures/api_cassettes/link_input.yml +44 -44
  36. data/spec/fixtures/api_cassettes/link_input_with_all_attributes.yml +44 -44
  37. data/spec/fixtures/api_cassettes/link_input_with_spaces_in_filename.yml +45 -45
  38. data/spec/fixtures/api_cassettes/not_found_order.yml +42 -42
  39. data/spec/fixtures/api_cassettes/submit_cp_order.yml +45 -45
  40. data/spec/fixtures/api_cassettes/submit_su_order.yml +45 -45
  41. data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +45 -45
  42. data/spec/fixtures/api_cassettes/submit_tc_order_with_invalid_request.yml +45 -45
  43. data/spec/fixtures/api_cassettes/submit_tc_order_without_specifying_payment.yml +45 -45
  44. data/spec/fixtures/api_cassettes/unauthorized.yml +42 -42
  45. data/spec/fixtures/api_cassettes/upload_input.yml +90 -90
  46. data/spec/fixtures/api_cassettes/upload_input_with_invalid_content_type.yml +91 -91
  47. data/spec/lib/rev/api_spec.rb +24 -24
  48. data/spec/lib/rev/cancel_order_spec.rb +24 -24
  49. data/spec/lib/rev/exceptions_spec.rb +8 -8
  50. data/spec/lib/rev/get_attachment_content_spec.rb +79 -79
  51. data/spec/lib/rev/get_attachment_metadata_spec.rb +33 -33
  52. data/spec/lib/rev/get_order_spec.rb +52 -68
  53. data/spec/lib/rev/get_orders_spec.rb +62 -62
  54. data/spec/lib/rev/http_client_spec.rb +32 -32
  55. data/spec/lib/rev/models/order_request_spec.rb +0 -7
  56. data/spec/lib/rev/models/order_spec.rb +58 -58
  57. data/spec/lib/rev/post_inputs_spec.rb +94 -94
  58. data/spec/lib/rev/post_order_spec.rb +163 -195
  59. data/spec/spec_helper.rb +49 -49
  60. metadata +38 -41
  61. data/spec/fixtures/api_cassettes/get_tr_order.yml +0 -44
  62. data/spec/fixtures/api_cassettes/submit_tr_order.yml +0 -44
@@ -1,138 +1,130 @@
1
- require 'rev-api/api_serializable'
2
-
3
- module Rev
4
- # Represents Translation, Caption, or Transcription order.
5
- # Should have TranslationInfo, CaptionInfo, or TranscriptionInfo, list
6
- # of comments and attachments. Attributes names reflect
7
- # API exposed names, but occasional hyphens are replaced
8
- # with underscores
9
- class Order < ApiSerializable
10
- attr_reader :order_number, :price, :status, :attachments, :comments,
11
- :translation, :transcription, :caption, :client_ref
12
-
13
- # @param fields [Hash] hash of order fields parsed from JSON API response
14
- def initialize(fields)
15
- super fields
16
- @attachments = fields['attachments'].map { |attachment_fields| Attachment.new(attachment_fields) }
17
- @comments = fields['comments'].map { |comment_fields| Comment.new(comment_fields) }
18
- @translation = TranslationInfo.new(fields['translation']) if fields['translation']
19
- @transcription = TranscriptionInfo.new(fields['transcription']) if fields['transcription']
20
- @caption = CaptionInfo.new(fields['caption']) if fields['caption']
21
- end
22
-
23
- # @return [Array of Attachment] with the kind of "transcript"
24
- def transcripts
25
- @attachments.select { |a| a.kind == Attachment::KINDS[:transcript]}
26
- end
27
-
28
- # @return [Array of Attachment] with the kind of "translation"
29
- def translations
30
- @attachments.select { |a| a.kind == Attachment::KINDS[:translation]}
31
- end
32
-
33
- # @return [Array of Attachment] with the kind of "caption"
34
- def captions
35
- @attachments.select { |a| a.kind == Attachment::KINDS[:caption] }
36
- end
37
-
38
- # @return [Array of Attachment] with the kind of "sources"
39
- def sources
40
- @attachments.select { |a| a.kind == Attachment::KINDS[:media]}
41
- end
42
- end
43
-
44
- # Order comment, containing author, creation timestamp and text
45
- class Comment < ApiSerializable
46
- require 'date'
47
-
48
- attr_reader :by, :timestamp, :text
49
-
50
- # @param fields [Hash] hash of comment fields parsed from JSON API response
51
- def initialize(fields)
52
- super fields
53
- @timestamp = Date.iso8601(fields['timestamp'])
54
- @text = fields['text'] ? fields['text'] : String.new # right now API gives no 'text' field if text is empty
55
- end
56
- end
57
-
58
- # Additional information specific to translation orders,
59
- # such as word count, languages
60
- class TranslationInfo < ApiSerializable
61
- attr_reader :total_word_count, :source_language_code,
62
- :destination_language_code
63
- end
64
-
65
- # Additional information specific to transcription orders,
66
- # such as total length in minutes, verbatim and timestamps flags
67
- class TranscriptionInfo < ApiSerializable
68
- attr_reader :total_length_seconds, :verbatim, :timestamps
69
-
70
- # @deprecated use :total_length_seconds instead
71
- attr_reader :total_length
72
- end
73
-
74
- # Additional information specific to caption orders
75
- class CaptionInfo < ApiSerializable
76
- attr_reader :total_length_seconds
77
-
78
- # @deprecated use :total_length_seconds instead
79
- attr_reader :total_length
80
- end
81
-
82
- # Represents order attachment - logical document associated with order
83
- class Attachment < ApiSerializable
84
- attr_reader :kind, :name, :id, :audio_length_seconds, :word_count, :links, :video_length_seconds
85
-
86
- KINDS = {
87
- :transcript => 'transcript',
88
- :translation => 'translation',
89
- :caption => 'caption',
90
- :media => 'media'
91
- }
92
-
93
- # List of supported mime-types used to request attachment's content
94
- # within 'Accept' header
95
- REPRESENTATIONS = {
96
- # Supported by :transcript and :translation
97
- :docx => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
98
- :doc => 'application/msword',
99
- :pdf => 'application/pdf',
100
- :txt => 'text/plain',
101
- :youtube => 'text/plain; format=youtube-transcript',
102
-
103
- # Supported by :caption
104
- :srt => 'application/x-subrip',
105
- :scc => 'text/x-scc',
106
- :ttml => 'application/ttml+xml',
107
- :qt => 'application/x-quicktime-timedtext'
108
- }
109
-
110
- # @param fields [Hash] fields of attachment fields parsed from JSON API response
111
- def initialize(fields)
112
- super fields
113
- @links = fields['links'].map { |link_fields| Link.new(link_fields) }
114
- end
115
-
116
- # @param ext [Symbol] extension
117
- # @return [String] mime-type for requested extension
118
- def self.representation_mime(ext)
119
- REPRESENTATIONS[ext]
120
- end
121
- end
122
-
123
- # Link to actual file represented by attachment
124
- class Link < ApiSerializable
125
- attr_reader :rel, :href, :content_type
126
- end
127
-
128
- # Represents a paginated list of orders, including padination info.
129
- class OrdersListPage < ApiSerializable
130
- attr_reader :total_count, :results_per_page, :page, :orders
131
-
132
- # @param fields [Hash] hash of OrdersListPage fields parsed from JSON API response
133
- def initialize(fields)
134
- super fields
135
- @orders = fields['orders'].map { |order_fields| Order.new(order_fields) }
136
- end
137
- end
138
- end
1
+ require 'rev-api/api_serializable'
2
+
3
+ module Rev
4
+ # Represents a Caption or Transcription order.
5
+ # Should have CaptionInfo or TranscriptionInfo, list
6
+ # of comments and attachments. Attributes names reflect
7
+ # API exposed names, but occasional hyphens are replaced
8
+ # with underscores
9
+ class Order < ApiSerializable
10
+ attr_reader :order_number, :price, :status, :attachments, :comments,
11
+ :transcription, :caption, :client_ref
12
+
13
+ # @param fields [Hash] hash of order fields parsed from JSON API response
14
+ def initialize(fields)
15
+ super fields
16
+ @attachments = fields['attachments'].map { |attachment_fields| Attachment.new(attachment_fields) }
17
+ @comments = fields['comments'].map { |comment_fields| Comment.new(comment_fields) }
18
+ @transcription = TranscriptionInfo.new(fields['transcription']) if fields['transcription']
19
+ @caption = CaptionInfo.new(fields['caption']) if fields['caption']
20
+ end
21
+
22
+ # @return [Array of Attachment] with the kind of "transcript"
23
+ def transcripts
24
+ @attachments.select { |a| a.kind == Attachment::KINDS[:transcript]}
25
+ end
26
+
27
+ # @return [Array of Attachment] with the kind of "caption"
28
+ def captions
29
+ @attachments.select { |a| a.kind == Attachment::KINDS[:caption] }
30
+ end
31
+
32
+ # @return [Array of Attachment] with the kind of "sources"
33
+ def sources
34
+ @attachments.select { |a| a.kind == Attachment::KINDS[:media]}
35
+ end
36
+ end
37
+
38
+ # Order comment, containing author, creation timestamp and text
39
+ class Comment < ApiSerializable
40
+ require 'date'
41
+
42
+ attr_reader :by, :timestamp, :text
43
+
44
+ # @param fields [Hash] hash of comment fields parsed from JSON API response
45
+ def initialize(fields)
46
+ super fields
47
+ @timestamp = Date.iso8601(fields['timestamp'])
48
+ @text = fields['text'] ? fields['text'] : String.new # right now API gives no 'text' field if text is empty
49
+ end
50
+ end
51
+
52
+ # Additional information specific to transcription orders,
53
+ # such as total length in minutes, verbatim and timestamps flags
54
+ class TranscriptionInfo < ApiSerializable
55
+ attr_reader :total_length_seconds, :verbatim, :timestamps
56
+
57
+ # @deprecated use :total_length_seconds instead
58
+ attr_reader :total_length
59
+ end
60
+
61
+ # Additional information specific to caption orders
62
+ class CaptionInfo < ApiSerializable
63
+ attr_reader :total_length_seconds
64
+
65
+ # @deprecated use :total_length_seconds instead
66
+ attr_reader :total_length
67
+ end
68
+
69
+ # Represents order attachment - logical document associated with order
70
+ class Attachment < ApiSerializable
71
+ attr_reader :kind, :name, :id, :audio_length_seconds, :links, :video_length_seconds
72
+
73
+ KINDS = {
74
+ :transcript => 'transcript',
75
+ :caption => 'caption',
76
+ :media => 'media'
77
+ }
78
+
79
+ # List of supported mime-types used to request attachment's content
80
+ # within 'Accept' header
81
+ REPRESENTATIONS = {
82
+ # Supported by :transcript
83
+ :docx => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
84
+ :doc => 'application/msword',
85
+ :pdf => 'application/pdf',
86
+ :txt => 'text/plain',
87
+ :youtube => 'text/plain; format=youtube-transcript',
88
+
89
+ # Supported by :caption
90
+ :srt => 'application/x-subrip',
91
+ :scc => 'text/x-scc',
92
+ :mcc => 'text/x-mcc',
93
+ :ttml => 'application/ttml+xml',
94
+ :qt => 'application/x-quicktime-timedtext',
95
+ :vtt => 'text/vtt',
96
+ :dfxp => 'application/ttaf+xml',
97
+ :cap => 'application/x-cheetah-cap',
98
+ :stl => 'text/x-stl',
99
+ :avidds => 'text/vnd.avid-ds'
100
+ }
101
+
102
+ # @param fields [Hash] fields of attachment fields parsed from JSON API response
103
+ def initialize(fields)
104
+ super fields
105
+ @links = fields['links'].map { |link_fields| Link.new(link_fields) }
106
+ end
107
+
108
+ # @param ext [Symbol] extension
109
+ # @return [String] mime-type for requested extension
110
+ def self.representation_mime(ext)
111
+ REPRESENTATIONS[ext]
112
+ end
113
+ end
114
+
115
+ # Link to actual file represented by attachment
116
+ class Link < ApiSerializable
117
+ attr_reader :rel, :href, :content_type
118
+ end
119
+
120
+ # Represents a paginated list of orders, including padination info.
121
+ class OrdersListPage < ApiSerializable
122
+ attr_reader :total_count, :results_per_page, :page, :orders
123
+
124
+ # @param fields [Hash] hash of OrdersListPage fields parsed from JSON API response
125
+ def initialize(fields)
126
+ super fields
127
+ @orders = fields['orders'].map { |order_fields| Order.new(order_fields) }
128
+ end
129
+ end
130
+ end
@@ -1,222 +1,194 @@
1
- require 'rev-api/api_serializable'
2
-
3
- module Rev
4
- # OrderRequest is used for constructing order 'spec' in consumer code and passing it into.
5
- # It consists of three main elements: :payment, :transcription_options and :notification.
6
- # You can also supply reference number, customer comment, and whether standard turnaround time is not required
7
- #
8
- # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/ordersposttranslation, https://www.rev.com/api/orderspostcaption
9
- class OrderRequest < ApiSerializable
10
- # see {Rev::Payment}
11
- attr_reader :payment
12
-
13
- # see {Rev::TranscriptionOptions}
14
- attr_reader :transcription_options
15
-
16
- # see {Rev::TranslationOptions}
17
- attr_reader :translation_options
18
-
19
- # see {Rev::CaptionOptions}
20
- attr_reader :caption_options
21
-
22
- # see {Rev::Notification}
23
- attr_reader :notification
24
-
25
- # a reference number for the order meaningful for the client (optional)
26
- attr_reader :client_ref
27
-
28
- # a comment with any special messages about the order (optional)
29
- attr_reader :comment
30
-
31
- # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
32
- attr_reader :non_standard_tat_guarantee
33
-
34
- # @param payment [Payment] payment info
35
- # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
36
- # @deprecated payment always defaults to :account_balance
37
- def self.new_with_payment(payment, fields = {})
38
- fields = { :non_standard_tat_guarantee => false }.merge(fields)
39
- super fields
40
- @payment = payment
41
- end
42
-
43
- # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
44
- def initialize(fields = {})
45
- fields = { :non_standard_tat_guarantee => false }.merge(fields)
46
- @payment = Rev::Payment.with_account_balance
47
- super fields
48
- end
49
- end
50
-
51
- # Payment Info. Payment can only be done by debiting the user's account balance.
52
- # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
53
- class Payment < ApiSerializable
54
- attr_accessor :type
55
-
56
- # use to correctly set payment type
57
- TYPES = {
58
- :account_balance => 'AccountBalance'
59
- }
60
-
61
- CC_ON_FILE_ID = 1
62
-
63
- # @param type [String] payment method
64
- def initialize(type)
65
- @type = type
66
- end
67
-
68
- class << self
69
- def with_account_balance()
70
- Payment::new(TYPES[:account_balance])
71
- end
72
- end
73
- end
74
-
75
- # Billing address
76
- class BillingAddress < ApiSerializable
77
- attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
78
- end
79
-
80
- # Superclass for the business-line options that handles capture and common validation of inputs.
81
- class InputOptions < ApiSerializable
82
- # Mandatory, contains list of inputs. Must have at least one element.
83
- attr_reader :inputs
84
-
85
- # @param inputs [Array] list of inputs
86
- # @param info [Hash] of fields to initialize instance.
87
- def initialize(inputs, info = {})
88
- super info
89
- raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
90
- @inputs = inputs
91
- end
92
-
93
- private
94
-
95
- def validate_inputs(inputs)
96
- !inputs.nil? && inputs.length > 0
97
- end
98
- end
99
-
100
- # Transcription options. This section contains the input media that must be transferred to our servers
101
- # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
102
- # @see https://www.rev.com/api/ordersposttranscription
103
- class TranscriptionOptions < InputOptions
104
- # Optional, should we transcribe the provided files verbatim? If true,
105
- # all filler words (i.e. umm, huh) will be included.
106
- attr_reader :verbatim
107
-
108
- # Optional, should we include timestamps?
109
- attr_reader :timestamps
110
-
111
- # @param inputs [Array] list of inputs
112
- # @param info [Hash] of fields to initialize instance. May contain:
113
- # - :verbatim => true/false
114
- # - :timestamps => true/false
115
- def initialize(inputs, info = {})
116
- super inputs, info
117
- end
118
- end
119
-
120
- # Translation options. This section contains the input media that must be transferred to our
121
- # servers using a POST to /inputs, and are referenced using the URIs returned by that call.
122
- # For each media, word count must be specified. The language code for the source and desitination
123
- # languages must also be specified.
124
- # @see https://www.rev.com/api/ordersposttranslation
125
- class TranslationOptions < InputOptions
126
- # Mandatory, source language code
127
- attr_reader :source_language_code
128
-
129
- # Mandatory, destination language code
130
- attr_reader :destination_language_code
131
-
132
- # @param inputs [Array] list of inputs
133
- # @param info [Hash] of fields to initialize instance. May contain:
134
- # - :source_language_code
135
- # - :destination_language_code
136
- # @note For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
137
- def initialize(inputs, info = {})
138
- super inputs, info
139
- end
140
- end
141
-
142
- # Caption options. This section contains the input media that must be transferred to our servers
143
- # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
144
- # @see https://www.rev.com/api/orderspostcaption
145
- class CaptionOptions < InputOptions
146
- # Array of file formats the captions should be delivered as. (Optional, default is SubRip)
147
- attr_reader :output_file_formats
148
-
149
- # Optional, Array of language codes to request foreign language subtitles
150
- attr_reader :subtitle_languages
151
-
152
- # All supported output file formats
153
- OUTPUT_FILE_FORMATS = {
154
- :subrip => 'SubRip',
155
- :scc => 'Scc',
156
- :mcc => 'Mcc',
157
- :ttml => 'Ttml',
158
- :qttext => 'QTtext',
159
- :transcript => 'Transcript',
160
- :webvtt => 'WebVtt',
161
- :dfxp => 'Dfxp',
162
- :cheetahcap => 'CheetahCap'
163
- }
164
-
165
- # @param inputs [Array] list of inputs
166
- # @param info [Hash] of fields to initialize instance. May contain:
167
- # - :subtitle_languages
168
- # @see TranslationOptions for a list of language codes.
169
- def initialize(inputs, info = {})
170
- super(inputs, info)
171
- raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
172
- end
173
-
174
- private
175
-
176
- def validate_output_formats(formats)
177
- formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
178
- end
179
- end
180
-
181
- # Input for order (aka source file)
182
- class Input < ApiSerializable
183
- # Mandatory when used with {Rev::OrderRequest::TranslationInfo}, length of document, in words
184
- attr_reader :word_length
185
-
186
- # Length of audio in seconds (mandatory in case of inability to determine it automatically).
187
- # Used within {Rev::OrderRequest::TranscriptionInfo}
188
- attr_reader :audio_length_seconds
189
-
190
- # Length of video in seconds (mandatory in case of inability to determine it automatically).
191
- # Used within {Rev::OrderRequest::CaptionInfo}
192
- attr_reader :video_length_seconds
193
-
194
- # Mandatory, URI of the media, as returned from the call to POST /inputs.
195
- # :external_link might substitute :uri for Transcription or Caption.
196
- attr_reader :uri
197
-
198
- # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
199
- attr_reader :external_link
200
- end
201
-
202
- # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
203
- # a new status (eg being transcribed or reviewed) and when it is complete.
204
- class Notification < ApiSerializable
205
- attr_reader :url, :level
206
-
207
- # Notification levels
208
- LEVELS = {
209
- :detailed => 'Detailed',
210
- :final_only => 'FinalOnly'
211
- }
212
-
213
- # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
214
- # @param level [String] Optional, specifies which notifications are sent:
215
- # - :detailed - a notification is sent whenever the order is in a new status or has a new comment
216
- # - :final_only - (the default), notification is sent only when the order is complete
217
- def initialize(url, level = nil)
218
- @url = url
219
- @level = level ? level : LEVELS[:final_only]
220
- end
221
- end
222
- end
1
+ require 'rev-api/api_serializable'
2
+
3
+ module Rev
4
+ # OrderRequest is used for constructing order 'spec' in consumer code and passing it into.
5
+ # It consists of three main elements: :payment, :transcription_options and :notification.
6
+ # You can also supply reference number, customer comment, and whether standard turnaround time is not required
7
+ #
8
+ # @note https://www.rev.com/api/ordersposttranscription, https://www.rev.com/api/orderspostcaption
9
+ class OrderRequest < ApiSerializable
10
+ # see {Rev::Payment}
11
+ attr_reader :payment
12
+
13
+ # see {Rev::TranscriptionOptions}
14
+ attr_reader :transcription_options
15
+
16
+ # see {Rev::CaptionOptions}
17
+ attr_reader :caption_options
18
+
19
+ # see {Rev::Notification}
20
+ attr_reader :notification
21
+
22
+ # a reference number for the order meaningful for the client (optional)
23
+ attr_reader :client_ref
24
+
25
+ # a comment with any special messages about the order (optional)
26
+ attr_reader :comment
27
+
28
+ # a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
29
+ attr_reader :non_standard_tat_guarantee
30
+
31
+ # @param payment [Payment] payment info
32
+ # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
33
+ # @deprecated payment always defaults to :account_balance
34
+ def self.new_with_payment(payment, fields = {})
35
+ fields = { :non_standard_tat_guarantee => false }.merge(fields)
36
+ super fields
37
+ @payment = payment
38
+ end
39
+
40
+ # @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
41
+ def initialize(fields = {})
42
+ fields = { :non_standard_tat_guarantee => false }.merge(fields)
43
+ @payment = Rev::Payment.with_account_balance
44
+ super fields
45
+ end
46
+ end
47
+
48
+ # Payment Info. Payment can only be done by debiting the user's account balance.
49
+ # @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
50
+ class Payment < ApiSerializable
51
+ attr_accessor :type
52
+
53
+ # use to correctly set payment type
54
+ TYPES = {
55
+ :account_balance => 'AccountBalance'
56
+ }
57
+
58
+ CC_ON_FILE_ID = 1
59
+
60
+ # @param type [String] payment method
61
+ def initialize(type)
62
+ @type = type
63
+ end
64
+
65
+ class << self
66
+ def with_account_balance()
67
+ Payment::new(TYPES[:account_balance])
68
+ end
69
+ end
70
+ end
71
+
72
+ # Billing address
73
+ class BillingAddress < ApiSerializable
74
+ attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
75
+ end
76
+
77
+ # Superclass for the business-line options that handles capture and common validation of inputs.
78
+ class InputOptions < ApiSerializable
79
+ # Mandatory, contains list of inputs. Must have at least one element.
80
+ attr_reader :inputs
81
+
82
+ # @param inputs [Array] list of inputs
83
+ # @param info [Hash] of fields to initialize instance.
84
+ def initialize(inputs, info = {})
85
+ super info
86
+ raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
87
+ @inputs = inputs
88
+ end
89
+
90
+ private
91
+
92
+ def validate_inputs(inputs)
93
+ !inputs.nil? && inputs.length > 0
94
+ end
95
+ end
96
+
97
+ # Transcription options. This section contains the input media that must be transferred to our servers
98
+ # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
99
+ # @see https://www.rev.com/api/ordersposttranscription
100
+ class TranscriptionOptions < InputOptions
101
+ # Optional, should we transcribe the provided files verbatim? If true,
102
+ # all filler words (i.e. umm, huh) will be included.
103
+ attr_reader :verbatim
104
+
105
+ # Optional, should we include timestamps?
106
+ attr_reader :timestamps
107
+
108
+ # @param inputs [Array] list of inputs
109
+ # @param info [Hash] of fields to initialize instance. May contain:
110
+ # - :verbatim => true/false
111
+ # - :timestamps => true/false
112
+ def initialize(inputs, info = {})
113
+ super inputs, info
114
+ end
115
+ end
116
+
117
+ # Caption options. This section contains the input media that must be transferred to our servers
118
+ # using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
119
+ # @see https://www.rev.com/api/orderspostcaption
120
+ class CaptionOptions < InputOptions
121
+ # Array of file formats the captions should be delivered as. (Optional, default is SubRip)
122
+ attr_reader :output_file_formats
123
+
124
+ # Optional, Array of language codes to request foreign language subtitles
125
+ attr_reader :subtitle_languages
126
+
127
+ # All supported output file formats
128
+ OUTPUT_FILE_FORMATS = {
129
+ :subrip => 'SubRip',
130
+ :scc => 'Scc',
131
+ :mcc => 'Mcc',
132
+ :ttml => 'Ttml',
133
+ :qttext => 'QTtext',
134
+ :transcript => 'Transcript',
135
+ :webvtt => 'WebVtt',
136
+ :dfxp => 'Dfxp',
137
+ :cheetahcap => 'CheetahCap'
138
+ }
139
+
140
+ # @param inputs [Array] list of inputs
141
+ # @param info [Hash] of fields to initialize instance. May contain:
142
+ # - :subtitle_languages
143
+ # @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
144
+ def initialize(inputs, info = {})
145
+ super(inputs, info)
146
+ raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
147
+ end
148
+
149
+ private
150
+
151
+ def validate_output_formats(formats)
152
+ formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
153
+ end
154
+ end
155
+
156
+ # Input for order (aka source file)
157
+ class Input < ApiSerializable
158
+ # Length of audio in seconds (mandatory in case of inability to determine it automatically).
159
+ # Used within {Rev::OrderRequest::TranscriptionInfo}
160
+ attr_reader :audio_length_seconds
161
+
162
+ # Length of video in seconds (mandatory in case of inability to determine it automatically).
163
+ # Used within {Rev::OrderRequest::CaptionInfo}
164
+ attr_reader :video_length_seconds
165
+
166
+ # Mandatory, URI of the media, as returned from the call to POST /inputs.
167
+ # :external_link might substitute :uri for Transcription or Caption.
168
+ attr_reader :uri
169
+
170
+ # External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
171
+ attr_reader :external_link
172
+ end
173
+
174
+ # Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
175
+ # a new status (eg being transcribed or reviewed) and when it is complete.
176
+ class Notification < ApiSerializable
177
+ attr_reader :url, :level
178
+
179
+ # Notification levels
180
+ LEVELS = {
181
+ :detailed => 'Detailed',
182
+ :final_only => 'FinalOnly'
183
+ }
184
+
185
+ # @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
186
+ # @param level [String] Optional, specifies which notifications are sent:
187
+ # - :detailed - a notification is sent whenever the order is in a new status or has a new comment
188
+ # - :final_only - (the default), notification is sent only when the order is complete
189
+ def initialize(url, level = nil)
190
+ @url = url
191
+ @level = level ? level : LEVELS[:final_only]
192
+ end
193
+ end
194
+ end