rev-api 2.3.0 → 2.3.1
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 +4 -4
- data/.gitignore +22 -22
- data/.ruby-gemset +1 -1
- data/.ruby-version +1 -1
- data/.travis.yml +8 -8
- data/Gemfile +3 -3
- data/LICENSE +191 -191
- data/README.md +131 -131
- data/Rakefile +13 -13
- data/examples/cli.rb +270 -270
- data/lib/rev-api.rb +26 -26
- data/lib/rev-api/api.rb +326 -326
- data/lib/rev-api/api_serializable.rb +30 -30
- data/lib/rev-api/exceptions.rb +97 -97
- data/lib/rev-api/http_client.rb +97 -97
- data/lib/rev-api/models/order.rb +129 -130
- data/lib/rev-api/models/order_request.rb +276 -276
- data/lib/rev-api/version.rb +3 -3
- data/rev-api.gemspec +33 -33
- data/spec/fixtures/api_cassettes/cancel_order.yml +38 -38
- data/spec/fixtures/api_cassettes/cancel_order_not_allowed.yml +40 -40
- data/spec/fixtures/api_cassettes/get_attachment_content.yml +399 -399
- data/spec/fixtures/api_cassettes/get_attachment_content_as_pdf.yml +399 -399
- data/spec/fixtures/api_cassettes/get_attachment_content_as_text.yml +65 -65
- data/spec/fixtures/api_cassettes/get_attachment_content_as_youtube_transcript.yml +66 -66
- data/spec/fixtures/api_cassettes/get_attachment_content_unacceptable_representation.yml +42 -42
- data/spec/fixtures/api_cassettes/get_attachment_content_with_invalid_id.yml +42 -42
- data/spec/fixtures/api_cassettes/get_attachment_metadata.yml +42 -42
- data/spec/fixtures/api_cassettes/get_attachment_with_invalid_id.yml +40 -40
- data/spec/fixtures/api_cassettes/get_orders.yml +122 -122
- data/spec/fixtures/api_cassettes/get_orders_with_clientRef.yml +41 -41
- data/spec/fixtures/api_cassettes/get_tc_order.yml +44 -44
- data/spec/fixtures/api_cassettes/get_third_page_of_orders.yml +52 -52
- data/spec/fixtures/api_cassettes/link_input.yml +44 -44
- data/spec/fixtures/api_cassettes/link_input_with_all_attributes.yml +44 -44
- data/spec/fixtures/api_cassettes/link_input_with_spaces_in_filename.yml +45 -45
- data/spec/fixtures/api_cassettes/not_found_order.yml +42 -42
- data/spec/fixtures/api_cassettes/submit_cp_order.yml +45 -45
- data/spec/fixtures/api_cassettes/submit_su_order.yml +45 -45
- data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +45 -45
- data/spec/fixtures/api_cassettes/submit_tc_order_with_invalid_request.yml +45 -45
- data/spec/fixtures/api_cassettes/submit_tc_order_without_specifying_payment.yml +45 -45
- data/spec/fixtures/api_cassettes/unauthorized.yml +42 -42
- data/spec/fixtures/api_cassettes/upload_input.yml +90 -90
- data/spec/fixtures/api_cassettes/upload_input_with_invalid_content_type.yml +91 -91
- data/spec/lib/rev/api_spec.rb +24 -24
- data/spec/lib/rev/cancel_order_spec.rb +24 -24
- data/spec/lib/rev/exceptions_spec.rb +8 -8
- data/spec/lib/rev/get_attachment_content_spec.rb +79 -79
- data/spec/lib/rev/get_attachment_metadata_spec.rb +33 -33
- data/spec/lib/rev/get_order_spec.rb +52 -52
- data/spec/lib/rev/get_orders_spec.rb +62 -62
- data/spec/lib/rev/http_client_spec.rb +32 -32
- data/spec/lib/rev/models/order_spec.rb +58 -58
- data/spec/lib/rev/post_inputs_spec.rb +94 -94
- data/spec/lib/rev/post_order_spec.rb +163 -163
- data/spec/spec_helper.rb +47 -47
- data/spec/test_helpers.rb +5 -5
- metadata +36 -78
@@ -1,276 +1,276 @@
|
|
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
|
-
|
10
|
-
GLOSSARY_ENTRIES_LIMIT = 1000
|
11
|
-
GLOSSARY_ENTRY_LENGTH_LIMIT = 255
|
12
|
-
SPEAKER_ENTRIES_LIMIT = 100
|
13
|
-
SPEAKER_ENTRY_LENGTH_LIMIT = 15
|
14
|
-
|
15
|
-
class OrderRequest < ApiSerializable
|
16
|
-
# see {Rev::Payment}
|
17
|
-
attr_reader :payment
|
18
|
-
|
19
|
-
# see {Rev::TranscriptionOptions}
|
20
|
-
attr_reader :transcription_options
|
21
|
-
|
22
|
-
# see {Rev::CaptionOptions}
|
23
|
-
attr_reader :caption_options
|
24
|
-
|
25
|
-
# see {Rev::Notification}
|
26
|
-
attr_reader :notification
|
27
|
-
|
28
|
-
# a reference number for the order meaningful for the client (optional)
|
29
|
-
attr_reader :client_ref
|
30
|
-
|
31
|
-
# a comment with any special messages about the order (optional)
|
32
|
-
attr_reader :comment
|
33
|
-
|
34
|
-
# a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
|
35
|
-
attr_reader :non_standard_tat_guarantee
|
36
|
-
|
37
|
-
# @param payment [Payment] payment info
|
38
|
-
# @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
|
39
|
-
# @deprecated payment always defaults to :account_balance
|
40
|
-
def self.new_with_payment(payment, fields = {})
|
41
|
-
fields = { :non_standard_tat_guarantee => false }.merge(fields)
|
42
|
-
super fields
|
43
|
-
@payment = payment
|
44
|
-
end
|
45
|
-
|
46
|
-
# @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
|
47
|
-
def initialize(fields = {})
|
48
|
-
fields = { :non_standard_tat_guarantee => false }.merge(fields)
|
49
|
-
@payment = Rev::Payment.with_account_balance
|
50
|
-
super fields
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Payment Info. Payment can only be done by debiting the user's account balance.
|
55
|
-
# @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
|
56
|
-
class Payment < ApiSerializable
|
57
|
-
attr_accessor :type
|
58
|
-
|
59
|
-
# use to correctly set payment type
|
60
|
-
TYPES = {
|
61
|
-
:account_balance => 'AccountBalance'
|
62
|
-
}
|
63
|
-
|
64
|
-
CC_ON_FILE_ID = 1
|
65
|
-
|
66
|
-
# @param type [String] payment method
|
67
|
-
def initialize(type)
|
68
|
-
@type = type
|
69
|
-
end
|
70
|
-
|
71
|
-
class << self
|
72
|
-
def with_account_balance()
|
73
|
-
Payment::new(TYPES[:account_balance])
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
# Billing address
|
79
|
-
class BillingAddress < ApiSerializable
|
80
|
-
attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
|
81
|
-
end
|
82
|
-
|
83
|
-
# Superclass for the business-line options that handles capture and common validation of inputs.
|
84
|
-
class InputOptions < ApiSerializable
|
85
|
-
# Mandatory, contains list of inputs. Must have at least one element.
|
86
|
-
attr_reader :inputs
|
87
|
-
|
88
|
-
# @param inputs [Array] list of inputs
|
89
|
-
# @param info [Hash] of fields to initialize instance.
|
90
|
-
def initialize(inputs, info = {})
|
91
|
-
super info
|
92
|
-
raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
|
93
|
-
@inputs = inputs
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def validate_inputs(inputs)
|
99
|
-
!inputs.nil? && inputs.length > 0
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# Transcription options. This section contains the input media that must be transferred to our servers
|
104
|
-
# using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
|
105
|
-
# @see https://www.rev.com/api/ordersposttranscription
|
106
|
-
class TranscriptionOptions < InputOptions
|
107
|
-
# Optional, should we transcribe the provided files verbatim? If true,
|
108
|
-
# all filler words (i.e. umm, huh) will be included.
|
109
|
-
attr_reader :verbatim
|
110
|
-
|
111
|
-
# Optional, should we include timestamps?
|
112
|
-
attr_reader :timestamps
|
113
|
-
|
114
|
-
# @param inputs [Array] list of inputs
|
115
|
-
# @param info [Hash] of fields to initialize instance. May contain:
|
116
|
-
# - :verbatim => true/false
|
117
|
-
# - :timestamps => true/false
|
118
|
-
def initialize(inputs, info = {})
|
119
|
-
super inputs, info
|
120
|
-
options_validation(inputs)
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
|
125
|
-
def options_validation(inputs)
|
126
|
-
inputs.each { |input|
|
127
|
-
input.validate_glossary
|
128
|
-
input.validate_speakers
|
129
|
-
input.validate_accents
|
130
|
-
}
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
# Caption options. This section contains the input media that must be transferred to our servers
|
135
|
-
# using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
|
136
|
-
# @see https://www.rev.com/api/orderspostcaption
|
137
|
-
class CaptionOptions < InputOptions
|
138
|
-
# Array of file formats the captions should be delivered as. (Optional, default is SubRip)
|
139
|
-
attr_reader :output_file_formats
|
140
|
-
|
141
|
-
# Optional, Array of language codes to request foreign language subtitles
|
142
|
-
attr_reader :subtitle_languages
|
143
|
-
|
144
|
-
# All supported output file formats
|
145
|
-
OUTPUT_FILE_FORMATS = {
|
146
|
-
:subrip => 'SubRip',
|
147
|
-
:scc => 'Scc',
|
148
|
-
:mcc => 'Mcc',
|
149
|
-
:ttml => 'Ttml',
|
150
|
-
:qttext => 'QTtext',
|
151
|
-
:transcript => 'Transcript',
|
152
|
-
:webvtt => 'WebVtt',
|
153
|
-
:dfxp => 'Dfxp',
|
154
|
-
:cheetahcap => 'CheetahCap'
|
155
|
-
}
|
156
|
-
|
157
|
-
# @param inputs [Array] list of inputs
|
158
|
-
# @param info [Hash] of fields to initialize instance. May contain:
|
159
|
-
# - :subtitle_languages
|
160
|
-
# @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
|
161
|
-
def initialize(inputs, info = {})
|
162
|
-
super(inputs, info)
|
163
|
-
raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
|
164
|
-
options_validation(inputs)
|
165
|
-
end
|
166
|
-
|
167
|
-
private
|
168
|
-
|
169
|
-
def validate_output_formats(formats)
|
170
|
-
formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
|
171
|
-
end
|
172
|
-
|
173
|
-
def options_validation(inputs)
|
174
|
-
inputs.each { |input|
|
175
|
-
input.validate_glossary
|
176
|
-
input.validate_speakers
|
177
|
-
}
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
# Input for order (aka source file)
|
182
|
-
class Input < ApiSerializable
|
183
|
-
# Length of audio in seconds (mandatory in case of inability to determine it automatically).
|
184
|
-
# Used within {Rev::OrderRequest::TranscriptionInfo}
|
185
|
-
attr_reader :audio_length_seconds
|
186
|
-
|
187
|
-
# Length of video in seconds (mandatory in case of inability to determine it automatically).
|
188
|
-
# Used within {Rev::OrderRequest::CaptionInfo}
|
189
|
-
attr_reader :video_length_seconds
|
190
|
-
|
191
|
-
# Mandatory, URI of the media, as returned from the call to POST /inputs.
|
192
|
-
# :external_link might substitute :uri for Transcription or Caption.
|
193
|
-
attr_reader :uri
|
194
|
-
|
195
|
-
# External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
|
196
|
-
attr_reader :external_link
|
197
|
-
|
198
|
-
# Optional, list of glossary entries.
|
199
|
-
attr_reader :glossary
|
200
|
-
|
201
|
-
# Optional, list of speaker names.
|
202
|
-
attr_reader :speakers
|
203
|
-
|
204
|
-
# Optional, list of accents.
|
205
|
-
attr_reader :accents
|
206
|
-
|
207
|
-
SUPPORTED_ACCENTS = {
|
208
|
-
:american_neutral => 'AmericanNeutral',
|
209
|
-
:american_southern => 'AmericanSouthern',
|
210
|
-
:asian => 'Asian',
|
211
|
-
:australian => 'Australian',
|
212
|
-
:british => 'British',
|
213
|
-
:indian => 'Indian',
|
214
|
-
:other => 'Other',
|
215
|
-
:unknown => 'Unknown'
|
216
|
-
}
|
217
|
-
|
218
|
-
def validate_glossary
|
219
|
-
if glossary
|
220
|
-
if glossary.length > GLOSSARY_ENTRIES_LIMIT
|
221
|
-
raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries")
|
222
|
-
end
|
223
|
-
glossary.each { |term|
|
224
|
-
if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT
|
225
|
-
raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters")
|
226
|
-
end
|
227
|
-
}
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
def validate_speakers
|
232
|
-
if speakers
|
233
|
-
if speakers.length > SPEAKER_ENTRIES_LIMIT
|
234
|
-
raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries")
|
235
|
-
end
|
236
|
-
speakers.each { |speaker|
|
237
|
-
if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT
|
238
|
-
raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters")
|
239
|
-
end
|
240
|
-
}
|
241
|
-
end
|
242
|
-
end
|
243
|
-
|
244
|
-
def validate_accents
|
245
|
-
if accents
|
246
|
-
if accents.length > SUPPORTED_ACCENTS.length
|
247
|
-
raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.")
|
248
|
-
end
|
249
|
-
if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) }
|
250
|
-
raise(ArgumentError, 'Unsupported accent provided')
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
# Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
|
257
|
-
# a new status (eg being transcribed or reviewed) and when it is complete.
|
258
|
-
class Notification < ApiSerializable
|
259
|
-
attr_reader :url, :level
|
260
|
-
|
261
|
-
# Notification levels
|
262
|
-
LEVELS = {
|
263
|
-
:detailed => 'Detailed',
|
264
|
-
:final_only => 'FinalOnly'
|
265
|
-
}
|
266
|
-
|
267
|
-
# @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
|
268
|
-
# @param level [String] Optional, specifies which notifications are sent:
|
269
|
-
# - :detailed - a notification is sent whenever the order is in a new status or has a new comment
|
270
|
-
# - :final_only - (the default), notification is sent only when the order is complete
|
271
|
-
def initialize(url, level = nil)
|
272
|
-
@url = url
|
273
|
-
@level = level ? level : LEVELS[:final_only]
|
274
|
-
end
|
275
|
-
end
|
276
|
-
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
|
+
|
10
|
+
GLOSSARY_ENTRIES_LIMIT = 1000
|
11
|
+
GLOSSARY_ENTRY_LENGTH_LIMIT = 255
|
12
|
+
SPEAKER_ENTRIES_LIMIT = 100
|
13
|
+
SPEAKER_ENTRY_LENGTH_LIMIT = 15
|
14
|
+
|
15
|
+
class OrderRequest < ApiSerializable
|
16
|
+
# see {Rev::Payment}
|
17
|
+
attr_reader :payment
|
18
|
+
|
19
|
+
# see {Rev::TranscriptionOptions}
|
20
|
+
attr_reader :transcription_options
|
21
|
+
|
22
|
+
# see {Rev::CaptionOptions}
|
23
|
+
attr_reader :caption_options
|
24
|
+
|
25
|
+
# see {Rev::Notification}
|
26
|
+
attr_reader :notification
|
27
|
+
|
28
|
+
# a reference number for the order meaningful for the client (optional)
|
29
|
+
attr_reader :client_ref
|
30
|
+
|
31
|
+
# a comment with any special messages about the order (optional)
|
32
|
+
attr_reader :comment
|
33
|
+
|
34
|
+
# a boolean flag specifying whether normal turnaround time is not required, defaults to false (optional)
|
35
|
+
attr_reader :non_standard_tat_guarantee
|
36
|
+
|
37
|
+
# @param payment [Payment] payment info
|
38
|
+
# @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
|
39
|
+
# @deprecated payment always defaults to :account_balance
|
40
|
+
def self.new_with_payment(payment, fields = {})
|
41
|
+
fields = { :non_standard_tat_guarantee => false }.merge(fields)
|
42
|
+
super fields
|
43
|
+
@payment = payment
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param fields [Hash] of fields to initialize instance. See instance attributes for available fields.
|
47
|
+
def initialize(fields = {})
|
48
|
+
fields = { :non_standard_tat_guarantee => false }.merge(fields)
|
49
|
+
@payment = Rev::Payment.with_account_balance
|
50
|
+
super fields
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Payment Info. Payment can only be done by debiting the user's account balance.
|
55
|
+
# @deprecated setting the payment is no longer necessary. All orders now default to :account_balance
|
56
|
+
class Payment < ApiSerializable
|
57
|
+
attr_accessor :type
|
58
|
+
|
59
|
+
# use to correctly set payment type
|
60
|
+
TYPES = {
|
61
|
+
:account_balance => 'AccountBalance'
|
62
|
+
}
|
63
|
+
|
64
|
+
CC_ON_FILE_ID = 1
|
65
|
+
|
66
|
+
# @param type [String] payment method
|
67
|
+
def initialize(type)
|
68
|
+
@type = type
|
69
|
+
end
|
70
|
+
|
71
|
+
class << self
|
72
|
+
def with_account_balance()
|
73
|
+
Payment::new(TYPES[:account_balance])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Billing address
|
79
|
+
class BillingAddress < ApiSerializable
|
80
|
+
attr_reader :street, :street2, :city, :state, :zip, :country_alpha2
|
81
|
+
end
|
82
|
+
|
83
|
+
# Superclass for the business-line options that handles capture and common validation of inputs.
|
84
|
+
class InputOptions < ApiSerializable
|
85
|
+
# Mandatory, contains list of inputs. Must have at least one element.
|
86
|
+
attr_reader :inputs
|
87
|
+
|
88
|
+
# @param inputs [Array] list of inputs
|
89
|
+
# @param info [Hash] of fields to initialize instance.
|
90
|
+
def initialize(inputs, info = {})
|
91
|
+
super info
|
92
|
+
raise(ArgumentError, "inputs must have at least one element") unless validate_inputs(inputs)
|
93
|
+
@inputs = inputs
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def validate_inputs(inputs)
|
99
|
+
!inputs.nil? && inputs.length > 0
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Transcription options. This section contains the input media that must be transferred to our servers
|
104
|
+
# using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
|
105
|
+
# @see https://www.rev.com/api/ordersposttranscription
|
106
|
+
class TranscriptionOptions < InputOptions
|
107
|
+
# Optional, should we transcribe the provided files verbatim? If true,
|
108
|
+
# all filler words (i.e. umm, huh) will be included.
|
109
|
+
attr_reader :verbatim
|
110
|
+
|
111
|
+
# Optional, should we include timestamps?
|
112
|
+
attr_reader :timestamps
|
113
|
+
|
114
|
+
# @param inputs [Array] list of inputs
|
115
|
+
# @param info [Hash] of fields to initialize instance. May contain:
|
116
|
+
# - :verbatim => true/false
|
117
|
+
# - :timestamps => true/false
|
118
|
+
def initialize(inputs, info = {})
|
119
|
+
super inputs, info
|
120
|
+
options_validation(inputs)
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def options_validation(inputs)
|
126
|
+
inputs.each { |input|
|
127
|
+
input.validate_glossary
|
128
|
+
input.validate_speakers
|
129
|
+
input.validate_accents
|
130
|
+
}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Caption options. This section contains the input media that must be transferred to our servers
|
135
|
+
# using a POST to /inputs, and are referenced using the URIs returned by that call. We also support external links.
|
136
|
+
# @see https://www.rev.com/api/orderspostcaption
|
137
|
+
class CaptionOptions < InputOptions
|
138
|
+
# Array of file formats the captions should be delivered as. (Optional, default is SubRip)
|
139
|
+
attr_reader :output_file_formats
|
140
|
+
|
141
|
+
# Optional, Array of language codes to request foreign language subtitles
|
142
|
+
attr_reader :subtitle_languages
|
143
|
+
|
144
|
+
# All supported output file formats
|
145
|
+
OUTPUT_FILE_FORMATS = {
|
146
|
+
:subrip => 'SubRip',
|
147
|
+
:scc => 'Scc',
|
148
|
+
:mcc => 'Mcc',
|
149
|
+
:ttml => 'Ttml',
|
150
|
+
:qttext => 'QTtext',
|
151
|
+
:transcript => 'Transcript',
|
152
|
+
:webvtt => 'WebVtt',
|
153
|
+
:dfxp => 'Dfxp',
|
154
|
+
:cheetahcap => 'CheetahCap'
|
155
|
+
}
|
156
|
+
|
157
|
+
# @param inputs [Array] list of inputs
|
158
|
+
# @param info [Hash] of fields to initialize instance. May contain:
|
159
|
+
# - :subtitle_languages
|
160
|
+
# @see For language codes refer to http://www.loc.gov/standards/iso639-2/php/code_list.php
|
161
|
+
def initialize(inputs, info = {})
|
162
|
+
super(inputs, info)
|
163
|
+
raise(ArgumentError, "invalid format(s)") unless validate_output_formats(info[:output_file_formats])
|
164
|
+
options_validation(inputs)
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
def validate_output_formats(formats)
|
170
|
+
formats.nil? || formats.select{|f| !OUTPUT_FILE_FORMATS.has_value?(f) }.empty?
|
171
|
+
end
|
172
|
+
|
173
|
+
def options_validation(inputs)
|
174
|
+
inputs.each { |input|
|
175
|
+
input.validate_glossary
|
176
|
+
input.validate_speakers
|
177
|
+
}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# Input for order (aka source file)
|
182
|
+
class Input < ApiSerializable
|
183
|
+
# Length of audio in seconds (mandatory in case of inability to determine it automatically).
|
184
|
+
# Used within {Rev::OrderRequest::TranscriptionInfo}
|
185
|
+
attr_reader :audio_length_seconds
|
186
|
+
|
187
|
+
# Length of video in seconds (mandatory in case of inability to determine it automatically).
|
188
|
+
# Used within {Rev::OrderRequest::CaptionInfo}
|
189
|
+
attr_reader :video_length_seconds
|
190
|
+
|
191
|
+
# Mandatory, URI of the media, as returned from the call to POST /inputs.
|
192
|
+
# :external_link might substitute :uri for Transcription or Caption.
|
193
|
+
attr_reader :uri
|
194
|
+
|
195
|
+
# External URL, if sources wasn't POSTed as input (YouTube, Vimeo, Dropbox, etc)
|
196
|
+
attr_reader :external_link
|
197
|
+
|
198
|
+
# Optional, list of glossary entries.
|
199
|
+
attr_reader :glossary
|
200
|
+
|
201
|
+
# Optional, list of speaker names.
|
202
|
+
attr_reader :speakers
|
203
|
+
|
204
|
+
# Optional, list of accents.
|
205
|
+
attr_reader :accents
|
206
|
+
|
207
|
+
SUPPORTED_ACCENTS = {
|
208
|
+
:american_neutral => 'AmericanNeutral',
|
209
|
+
:american_southern => 'AmericanSouthern',
|
210
|
+
:asian => 'Asian',
|
211
|
+
:australian => 'Australian',
|
212
|
+
:british => 'British',
|
213
|
+
:indian => 'Indian',
|
214
|
+
:other => 'Other',
|
215
|
+
:unknown => 'Unknown'
|
216
|
+
}
|
217
|
+
|
218
|
+
def validate_glossary
|
219
|
+
if glossary
|
220
|
+
if glossary.length > GLOSSARY_ENTRIES_LIMIT
|
221
|
+
raise(ArgumentError, "Glossary must not exceed #{GLOSSARY_ENTRIES_LIMIT} entries")
|
222
|
+
end
|
223
|
+
glossary.each { |term|
|
224
|
+
if term.length > GLOSSARY_ENTRY_LENGTH_LIMIT
|
225
|
+
raise(ArgumentError, "Glossary entries cannot exceed #{GLOSSARY_ENTRY_LENGTH_LIMIT} characters")
|
226
|
+
end
|
227
|
+
}
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def validate_speakers
|
232
|
+
if speakers
|
233
|
+
if speakers.length > SPEAKER_ENTRIES_LIMIT
|
234
|
+
raise(ArgumentError, "Speaker list must not exceed #{SPEAKER_ENTRIES_LIMIT} entries")
|
235
|
+
end
|
236
|
+
speakers.each { |speaker|
|
237
|
+
if speaker.length > SPEAKER_ENTRY_LENGTH_LIMIT
|
238
|
+
raise(ArgumentError, "Speaker name cannot exceed #{SPEAKER_ENTRY_LENGTH_LIMIT} characters")
|
239
|
+
end
|
240
|
+
}
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def validate_accents
|
245
|
+
if accents
|
246
|
+
if accents.length > SUPPORTED_ACCENTS.length
|
247
|
+
raise(ArgumentError, "Length of accents list cannot exceed number of supported accents.")
|
248
|
+
end
|
249
|
+
if accents.any?{ |accent| !Rev::Input::SUPPORTED_ACCENTS.has_value?(accent) }
|
250
|
+
raise(ArgumentError, 'Unsupported accent provided')
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# Notification Info. Optionally you may request that an HTTP post be made to a url of your choice when the order enters
|
257
|
+
# a new status (eg being transcribed or reviewed) and when it is complete.
|
258
|
+
class Notification < ApiSerializable
|
259
|
+
attr_reader :url, :level
|
260
|
+
|
261
|
+
# Notification levels
|
262
|
+
LEVELS = {
|
263
|
+
:detailed => 'Detailed',
|
264
|
+
:final_only => 'FinalOnly'
|
265
|
+
}
|
266
|
+
|
267
|
+
# @param url [String] The url for notifications. Mandatory if the notifications element is used. Updates will be posted to this URL
|
268
|
+
# @param level [String] Optional, specifies which notifications are sent:
|
269
|
+
# - :detailed - a notification is sent whenever the order is in a new status or has a new comment
|
270
|
+
# - :final_only - (the default), notification is sent only when the order is complete
|
271
|
+
def initialize(url, level = nil)
|
272
|
+
@url = url
|
273
|
+
@level = level ? level : LEVELS[:final_only]
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|