rev-api 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +22 -22
  3. data/.ruby-gemset +1 -1
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +8 -8
  6. data/Gemfile +3 -3
  7. data/LICENSE +191 -191
  8. data/README.md +131 -131
  9. data/Rakefile +13 -13
  10. data/examples/cli.rb +270 -270
  11. data/lib/rev-api.rb +26 -26
  12. data/lib/rev-api/api.rb +326 -326
  13. data/lib/rev-api/api_serializable.rb +30 -30
  14. data/lib/rev-api/exceptions.rb +97 -97
  15. data/lib/rev-api/http_client.rb +97 -97
  16. data/lib/rev-api/models/order.rb +129 -130
  17. data/lib/rev-api/models/order_request.rb +276 -276
  18. data/lib/rev-api/version.rb +3 -3
  19. data/rev-api.gemspec +33 -33
  20. data/spec/fixtures/api_cassettes/cancel_order.yml +38 -38
  21. data/spec/fixtures/api_cassettes/cancel_order_not_allowed.yml +40 -40
  22. data/spec/fixtures/api_cassettes/get_attachment_content.yml +399 -399
  23. data/spec/fixtures/api_cassettes/get_attachment_content_as_pdf.yml +399 -399
  24. data/spec/fixtures/api_cassettes/get_attachment_content_as_text.yml +65 -65
  25. data/spec/fixtures/api_cassettes/get_attachment_content_as_youtube_transcript.yml +66 -66
  26. data/spec/fixtures/api_cassettes/get_attachment_content_unacceptable_representation.yml +42 -42
  27. data/spec/fixtures/api_cassettes/get_attachment_content_with_invalid_id.yml +42 -42
  28. data/spec/fixtures/api_cassettes/get_attachment_metadata.yml +42 -42
  29. data/spec/fixtures/api_cassettes/get_attachment_with_invalid_id.yml +40 -40
  30. data/spec/fixtures/api_cassettes/get_orders.yml +122 -122
  31. data/spec/fixtures/api_cassettes/get_orders_with_clientRef.yml +41 -41
  32. data/spec/fixtures/api_cassettes/get_tc_order.yml +44 -44
  33. data/spec/fixtures/api_cassettes/get_third_page_of_orders.yml +52 -52
  34. data/spec/fixtures/api_cassettes/link_input.yml +44 -44
  35. data/spec/fixtures/api_cassettes/link_input_with_all_attributes.yml +44 -44
  36. data/spec/fixtures/api_cassettes/link_input_with_spaces_in_filename.yml +45 -45
  37. data/spec/fixtures/api_cassettes/not_found_order.yml +42 -42
  38. data/spec/fixtures/api_cassettes/submit_cp_order.yml +45 -45
  39. data/spec/fixtures/api_cassettes/submit_su_order.yml +45 -45
  40. data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +45 -45
  41. data/spec/fixtures/api_cassettes/submit_tc_order_with_invalid_request.yml +45 -45
  42. data/spec/fixtures/api_cassettes/submit_tc_order_without_specifying_payment.yml +45 -45
  43. data/spec/fixtures/api_cassettes/unauthorized.yml +42 -42
  44. data/spec/fixtures/api_cassettes/upload_input.yml +90 -90
  45. data/spec/fixtures/api_cassettes/upload_input_with_invalid_content_type.yml +91 -91
  46. data/spec/lib/rev/api_spec.rb +24 -24
  47. data/spec/lib/rev/cancel_order_spec.rb +24 -24
  48. data/spec/lib/rev/exceptions_spec.rb +8 -8
  49. data/spec/lib/rev/get_attachment_content_spec.rb +79 -79
  50. data/spec/lib/rev/get_attachment_metadata_spec.rb +33 -33
  51. data/spec/lib/rev/get_order_spec.rb +52 -52
  52. data/spec/lib/rev/get_orders_spec.rb +62 -62
  53. data/spec/lib/rev/http_client_spec.rb +32 -32
  54. data/spec/lib/rev/models/order_spec.rb +58 -58
  55. data/spec/lib/rev/post_inputs_spec.rb +94 -94
  56. data/spec/lib/rev/post_order_spec.rb +163 -163
  57. data/spec/spec_helper.rb +47 -47
  58. data/spec/test_helpers.rb +5 -5
  59. metadata +36 -78
data/README.md CHANGED
@@ -1,131 +1,131 @@
1
- [![Gem Version](https://badge.fury.io/rb/rev-api.png)](http://badge.fury.io/rb/rev-api)
2
- [![Build Status](https://secure.travis-ci.org/revdotcom/rev-ruby-sdk.png?branch=master)](https://secure.travis-ci.org/revdotcom/rev-ruby-sdk)
3
- [![Dependency Status](https://gemnasium.com/revdotcom/rev-ruby-sdk.png?travis)](https://gemnasium.com/revdotcom/rev-ruby-sdk)
4
- [![Code Climate](https://codeclimate.com/github/revdotcom/rev-ruby-sdk.png)](https://codeclimate.com/github/revdotcom/rev-ruby-sdk)
5
-
6
- [Reference](https://www.rev.com/api/docs) | [RDocs](http://rubydoc.info/github/revdotcom/rev-ruby-sdk/master/frames)
7
-
8
- rev-ruby-sdk
9
- ------------
10
-
11
- ### Background
12
-
13
- Rev.com provides transcription, caption and translation services powered by humans. The Rev.com API allows you to tap transcription
14
- and caption services with no manual steps. It's a RESTful API, documented at <https://www.rev.com/api/docs>.
15
-
16
- The Ruby SDK for the Rev API provides a convenient Ruby wrapper for the Rev.com API. All operations of the API, as described
17
- at <https://www.rev.com/api/operations>, are supported.
18
-
19
- ### Install
20
-
21
- ```shell
22
- gem install rev-api
23
- ```
24
-
25
- or put it into your Gemfile.
26
-
27
- When you need it:
28
-
29
- ```ruby
30
- require 'rev-api'
31
- ```
32
-
33
- ### Authentication
34
-
35
- If you are building a new API client, you must first obtain a client API key, which you can do at <https://www.rev.com/api>.
36
-
37
- All operations in the API are performed on behalf of a Rev customer, identified by their user API key. The client key / user
38
- key pair is used to authenticate each API operation. Once you have the two keys, you can create a new Rev.com API client:
39
-
40
-
41
- ```ruby
42
- require 'rev-api'
43
-
44
- rev_client = Rev.new('your_client_key', 'your_user_key')
45
- ```
46
-
47
- You can read more about authentication in the Rev.com API at <https://www.rev.com/api/security>
48
-
49
- ### Sandbox
50
-
51
- All operations can be executed against either the production or the sandbox environment. The sandbox environment allows you
52
- to test your API client without actually paying for orders and having them worked on.
53
-
54
- By default, the Rev.com API client executes against the production environment. To go against the sandbox instead,
55
- initialize the client this way:
56
-
57
- ```ruby
58
- require 'rev-api'
59
-
60
- rev_client = Rev.new('your_client_key', 'your_user_key', Rev::Api::SANDBOX_HOST)
61
- ```
62
-
63
- ### Usage
64
-
65
- The snippets below assume you've initialized `rev_client`:
66
-
67
- ```ruby
68
- rev_client = Rev.new('your_client_key', 'your_user_key')
69
- ```
70
-
71
- #### Listing orders
72
-
73
- ```ruby
74
- orders_page = rev_client.get_orders_page(1) # get a single page of orders
75
- all_orders = rev_client.get_all_orders # get first page of orders history
76
- orders_by_client_ref = rev_client.get_orders_by_client_ref('some_ref') # get orders with reference id of 'some_ref'
77
- ```
78
-
79
- #### Get a single order by order number
80
-
81
- ```ruby
82
- some_order = rev_client.get_order('TCxxxxxxxx')
83
- puts "Original comment: #{some_order.comments.first.text}"
84
- ```
85
-
86
- #### Cancel an order given an order number
87
-
88
- ```ruby
89
- rev_client.cancel_order('TCxxxxxxxx')
90
- ```
91
-
92
- #### Print out the text of all transcripts in an order
93
-
94
- ```ruby
95
- order = rev_client.get_order('TCxxxxxxx')
96
-
97
- order.transcripts.each do |t|
98
- puts rev_client.get_attachment_content_as_string t.id
99
- puts
100
- end
101
- ```
102
-
103
- Refer to `cli.rb` in the `examples` directory for a full example illustrating placing orders, handling error responses, etc.
104
-
105
- ### Documentation
106
-
107
- [YARD documentation](http://rubydoc.info/github/revdotcom/rev-ruby-sdk/master/frames) can be generated locally by running `rake yard` command, and will be placed in the `doc` directory.
108
-
109
- You can find API documentation at <https://www.rev.com/api/docs>.
110
-
111
- ### Support
112
-
113
- If you have any questions or suggestions for improvement, email us directly at api[at]rev[dot]com.
114
-
115
- ### Compatibility
116
-
117
- - MRI 2.0.0
118
-
119
- ### Tests
120
-
121
- Minitest suite might be run using `rake test` command.
122
- Current stack:
123
-
124
- - minitest
125
- - webmock
126
- - vcr
127
- - turn
128
-
129
- ### Dependencies
130
-
131
- - httparty
1
+ [![Gem Version](https://badge.fury.io/rb/rev-api.png)](http://badge.fury.io/rb/rev-api)
2
+ [![Build Status](https://secure.travis-ci.org/revdotcom/rev-ruby-sdk.png?branch=master)](https://secure.travis-ci.org/revdotcom/rev-ruby-sdk)
3
+ [![Dependency Status](https://gemnasium.com/revdotcom/rev-ruby-sdk.png?travis)](https://gemnasium.com/revdotcom/rev-ruby-sdk)
4
+ [![Code Climate](https://codeclimate.com/github/revdotcom/rev-ruby-sdk.png)](https://codeclimate.com/github/revdotcom/rev-ruby-sdk)
5
+
6
+ [Reference](https://www.rev.com/api/docs) | [RDocs](http://rubydoc.info/github/revdotcom/rev-ruby-sdk/master/frames)
7
+
8
+ rev-ruby-sdk
9
+ ------------
10
+
11
+ ### Background
12
+
13
+ Rev.com provides transcription, caption and translation services powered by humans. The Rev.com API allows you to tap transcription
14
+ and caption services with no manual steps. It's a RESTful API, documented at <https://www.rev.com/api/docs>.
15
+
16
+ The Ruby SDK for the Rev API provides a convenient Ruby wrapper for the Rev.com API. All operations of the API, as described
17
+ at <https://www.rev.com/api/operations>, are supported.
18
+
19
+ ### Install
20
+
21
+ ```shell
22
+ gem install rev-api
23
+ ```
24
+
25
+ or put it into your Gemfile.
26
+
27
+ When you need it:
28
+
29
+ ```ruby
30
+ require 'rev-api'
31
+ ```
32
+
33
+ ### Authentication
34
+
35
+ If you are building a new API client, you must first obtain a client API key, which you can do at <https://www.rev.com/api>.
36
+
37
+ All operations in the API are performed on behalf of a Rev customer, identified by their user API key. The client key / user
38
+ key pair is used to authenticate each API operation. Once you have the two keys, you can create a new Rev.com API client:
39
+
40
+
41
+ ```ruby
42
+ require 'rev-api'
43
+
44
+ rev_client = Rev.new('your_client_key', 'your_user_key')
45
+ ```
46
+
47
+ You can read more about authentication in the Rev.com API at <https://www.rev.com/api/security>
48
+
49
+ ### Sandbox
50
+
51
+ All operations can be executed against either the production or the sandbox environment. The sandbox environment allows you
52
+ to test your API client without actually paying for orders and having them worked on.
53
+
54
+ By default, the Rev.com API client executes against the production environment. To go against the sandbox instead,
55
+ initialize the client this way:
56
+
57
+ ```ruby
58
+ require 'rev-api'
59
+
60
+ rev_client = Rev.new('your_client_key', 'your_user_key', Rev::Api::SANDBOX_HOST)
61
+ ```
62
+
63
+ ### Usage
64
+
65
+ The snippets below assume you've initialized `rev_client`:
66
+
67
+ ```ruby
68
+ rev_client = Rev.new('your_client_key', 'your_user_key')
69
+ ```
70
+
71
+ #### Listing orders
72
+
73
+ ```ruby
74
+ orders_page = rev_client.get_orders_page(1) # get a single page of orders
75
+ all_orders = rev_client.get_all_orders # get first page of orders history
76
+ orders_by_client_ref = rev_client.get_orders_by_client_ref('some_ref') # get orders with reference id of 'some_ref'
77
+ ```
78
+
79
+ #### Get a single order by order number
80
+
81
+ ```ruby
82
+ some_order = rev_client.get_order('TCxxxxxxxx')
83
+ puts "Original comment: #{some_order.comments.first.text}"
84
+ ```
85
+
86
+ #### Cancel an order given an order number
87
+
88
+ ```ruby
89
+ rev_client.cancel_order('TCxxxxxxxx')
90
+ ```
91
+
92
+ #### Print out the text of all transcripts in an order
93
+
94
+ ```ruby
95
+ order = rev_client.get_order('TCxxxxxxx')
96
+
97
+ order.transcripts.each do |t|
98
+ puts rev_client.get_attachment_content_as_string t.id
99
+ puts
100
+ end
101
+ ```
102
+
103
+ Refer to `cli.rb` in the `examples` directory for a full example illustrating placing orders, handling error responses, etc.
104
+
105
+ ### Documentation
106
+
107
+ [YARD documentation](http://rubydoc.info/github/revdotcom/rev-ruby-sdk/master/frames) can be generated locally by running `rake yard` command, and will be placed in the `doc` directory.
108
+
109
+ You can find API documentation at <https://www.rev.com/api/docs>.
110
+
111
+ ### Support
112
+
113
+ If you have any questions or suggestions for improvement, email us directly at api[at]rev[dot]com.
114
+
115
+ ### Compatibility
116
+
117
+ - MRI 2.0.0
118
+
119
+ ### Tests
120
+
121
+ Minitest suite might be run using `rake test` command.
122
+ Current stack:
123
+
124
+ - minitest
125
+ - webmock
126
+ - vcr
127
+ - turn
128
+
129
+ ### Dependencies
130
+
131
+ - httparty
data/Rakefile CHANGED
@@ -1,14 +1,14 @@
1
- require 'rake/testtask'
2
- require 'yard'
3
- require 'rubygems/tasks'
4
-
5
- Rake::TestTask.new do |t|
6
- t.test_files = FileList['spec/lib/rev/**/*_spec.rb']
7
- t.verbose = true
8
- end
9
-
10
- YARD::Rake::YardocTask.new
11
-
12
- Gem::Tasks.new
13
-
1
+ require 'rake/testtask'
2
+ require 'yard'
3
+ require 'rubygems/tasks'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.test_files = FileList['spec/lib/rev/**/*_spec.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ YARD::Rake::YardocTask.new
11
+
12
+ Gem::Tasks.new
13
+
14
14
  task :default => :test
@@ -1,270 +1,270 @@
1
- require 'rev-api'
2
- require 'optparse'
3
- require 'pp'
4
-
5
- # An example app using the official Ruby SDK for the Rev.com API
6
- # This ruby script sets up a basic command line interface (CLI)
7
- # that prompts a user to authenticate on the web, then
8
- # allows them to type commands to manipulate their orders.
9
- #
10
- # To start, run:
11
- # ruby examples/cli.rb --sandbox --client-key your_client_key --user-key your_user_key
12
-
13
- class RevCLI
14
- COMMANDS = %w{help get get_by_client_ref list transcripts captions dl_transcripts dl_captions dl_sources place_tc place_cp cancel}
15
-
16
- def initialize
17
- options = { :environment => Rev::Api::PRODUCTION_HOST, :verbatim => false, :timestamps => false }
18
- optparse = OptionParser.new do |opts|
19
- opts.banner = "Usage: cli.rb [options]. You will be prompted for command then."
20
-
21
- opts.on("--client-key CLIENT-KEY", "Use CLIENT-KEY as the API Client Key for Authorization") do |client_key|
22
- options[:client_key] = client_key
23
- end
24
-
25
- opts.on("--user-key USER-KEY", "Use USER-KEY as the API User Key for Authorization") do |user_key|
26
- options[:user_key] = user_key
27
- end
28
-
29
- opts.on("--sandbox", "Execute against the Sandbox environment rather than production") do
30
- options[:environment] = Rev::Api::SANDBOX_HOST
31
- end
32
-
33
- opts.on("--[no-]verbatim", "Request verbatim transcription") do |v|
34
- options[:verbatim] = v
35
- end
36
-
37
- opts.on("--[no-]timestamps", "Request timestamps transcription") do |t|
38
- options[:timestamps] = t
39
- end
40
- end
41
- optparse.parse!
42
-
43
- raise OptionParser::MissingArgument, "--client-key" if options[:client_key].nil?
44
- raise OptionParser::MissingArgument, "--user-key" if options[:user_key].nil?
45
-
46
- @rev_client = Rev.new(options[:client_key], options[:user_key], options[:environment])
47
- end
48
-
49
- def command_loop
50
- puts "Enter a command or 'help' or 'exit'"
51
- command_line = ''
52
-
53
- while command_line.strip != 'exit'
54
- begin
55
- execute_command(command_line)
56
- rescue RuntimeError => e
57
- puts "Command Line Error! #{e.class}: #{e}"
58
- puts e.backtrace
59
- end
60
- print '> '
61
- command_line = gets.strip
62
- end
63
-
64
- puts 'Goodbye!'
65
- exit(0)
66
- end
67
-
68
- def execute_command(cmd_line)
69
- command = cmd_line.split
70
- method = command.first
71
- if COMMANDS.include? method
72
- begin
73
- send(method.to_sym, command[1..-1])
74
- rescue Rev::BadRequestError => e
75
- puts "Server returned error with code #{e.code}, message #{e.message}"
76
- rescue Rev::ApiError => e
77
- puts "Server returned error with message #{e.message}"
78
- end
79
- elsif command.first && !command.first.strip.empty?
80
- puts 'Invalid command. Type \'help\' to see commands.'
81
- end
82
- end
83
-
84
- def get(args)
85
- order_num = args[0]
86
- order = @rev_client.get_order order_num
87
- pp order
88
- end
89
-
90
- def list(args)
91
- orders = @rev_client.get_all_orders
92
- orders.each { |o| puts("#{o.order_number}") }
93
-
94
- puts 'There are no orders placed so far.' if orders.empty?
95
- end
96
-
97
- def get_by_client_ref(args)
98
- # client ref can contain spaces, so we have to join client ref from pieces
99
- if (args.last == '0' || args.last.to_i > 0)
100
- client_ref = args[0..-2].join(' ')
101
- else
102
- client_ref = args.join(' ')
103
- end
104
-
105
- client_ref = client_ref.gsub('\'', '').gsub('"', '')
106
- page = args.last.nil? ? 0: args.last.to_i
107
-
108
- orders_first_page = @rev_client.get_orders_by_client_ref(client_ref, page)
109
- puts "Found #{orders_first_page.total_count} order(s), showing page #{page}. Pass page number as second argument"
110
- orders_first_page.orders.each { |o| puts ("#{o.client_ref}: #{o.order_number}") }
111
-
112
- puts "There are no orders associated with the given client reference: #{client_ref}" if orders_first_page.orders.empty?
113
- end
114
-
115
- def transcripts(args)
116
- begin
117
- order_num = args[0]
118
- order = @rev_client.get_order order_num
119
-
120
- if order.transcripts.empty?
121
- puts "There are no transcripts for order #{order_num}"
122
- return
123
- end
124
-
125
- order.transcripts.each do |t|
126
- puts "Contents of #{t.name}"
127
- puts "-----------------------------------"
128
- puts @rev_client.get_attachment_content_as_string t.id
129
- puts
130
- end
131
- rescue Rev::BadRequestError => e
132
- puts "Displaying transcripts failed with error code #{e.code}, message #{e.message}"
133
- end
134
- end
135
-
136
- def captions(args)
137
- begin
138
- order_num = args[0]
139
- order = @rev_client.get_order order_num
140
-
141
- if order.captions.empty?
142
- puts "There are no captions for order #{order_num}"
143
- return
144
- end
145
-
146
- order.captions.each do |t|
147
- puts "Contents of #{t.name}"
148
- puts "-----------------------------------"
149
- puts @rev_client.get_attachment_content(t.id).body
150
- puts
151
- end
152
- rescue Rev::BadRequestError => e
153
- puts "Displaying captions failed with error code #{e.code}, message #{e.message}"
154
- end
155
- end
156
-
157
- def dl_transcripts(args)
158
- begin
159
- order_num = args[0]
160
- order = @rev_client.get_order order_num
161
-
162
- if order.transcripts.empty?
163
- puts "There are no transcripts for order #{order_num}"
164
- return
165
- end
166
-
167
- filenames = order.transcripts.map { |t| t.name}.join(',')
168
- puts "Downloading files: #{filenames}"
169
- order.transcripts.each do |t|
170
- @rev_client.save_attachment_content t.id, t.name
171
- end
172
- rescue Rev::BadRequestError => e
173
- puts "Downloading transcripts failed with error code #{e.code}, message #{e.message}"
174
- end
175
- end
176
-
177
- def dl_captions(args)
178
- begin
179
- order_num = args[0]
180
- order = @rev_client.get_order order_num
181
-
182
- if order.captions.empty?
183
- puts "There are no captions for order #{order_num}"
184
- return
185
- end
186
-
187
- filenames = order.captions.map { |t| t.name}.join(',')
188
- puts "Downloading files: #{filenames}"
189
- order.captions.each do |t|
190
- @rev_client.save_attachment_content t.id, t.name
191
- end
192
- rescue Rev::BadRequestError => e
193
- puts "Downloading captions failed with error code #{e.code}, message #{e.message}"
194
- end
195
- end
196
-
197
- def dl_sources(args)
198
- begin
199
- order_num = args[0]
200
- order = @rev_client.get_order order_num
201
-
202
- if order.sources.empty?
203
- puts "There are no source files for order #{order_num}"
204
- return
205
- end
206
-
207
- filenames = order.sources.map { |t| t.name }.join(',')
208
- puts "Downloading files: #{filenames}"
209
- order.sources.each do |t|
210
- @rev_client.save_attachment_content t.id, t.name
211
- end
212
- rescue Rev::BadRequestError => e
213
- puts "Downloading sources failed with error code #{e.code}, message #{e.message}"
214
- end
215
- end
216
-
217
- def cancel(args)
218
- begin
219
- order_num = args[0]
220
- @rev_client.cancel_order order_num
221
- puts "Order #{order_num} cancelled"
222
- rescue Rev::BadRequestError => e
223
- puts "Cancelling order failed with error code #{e.code}, message #{e.message}"
224
- end
225
- end
226
-
227
- def place_tc(args)
228
- input_urls = upload(args, 'audio/mpeg')
229
- inputs = input_urls.map { |url| Rev::Input.new(:uri => url, :audio_length_seconds => 180) }
230
- tc_options = Rev::TranscriptionOptions.new(inputs)
231
- place_helper(inputs, { :transcription_options => tc_options })
232
- end
233
-
234
- def place_cp(args)
235
- input_urls = upload(args, 'video/mpeg')
236
- inputs = input_urls.map { |url| Rev::Input.new(:uri => url, :video_length_seconds => 180) }
237
- cp_options = Rev::CaptionOptions.new(inputs, {:output_file_formats => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc]] })
238
- place_helper(inputs, { :caption_options => cp_options })
239
- end
240
-
241
- def help(*args)
242
- puts "commands are: #{COMMANDS.join(' ')} exit"
243
- end
244
-
245
- private
246
-
247
- def upload(args, type)
248
- input_urls = args.map do |f|
249
- puts "Uploading #{f}"
250
- @rev_client.upload_input(f, type)
251
- end
252
- input_urls
253
- end
254
-
255
- def place_helper(inputs, options)
256
- options = options.merge({ :client_ref => 'XB432423', :comment => 'Please work quickly' })
257
- request = Rev::OrderRequest.new(options)
258
-
259
- begin
260
- new_order = @rev_client.submit_order(request)
261
- puts "New order: #{new_order}"
262
- rescue Rev::BadRequestError => e
263
- puts "Order placement failed with error code #{e.code}, message #{e.message}"
264
- end
265
- end
266
-
267
- end
268
-
269
- cli = RevCLI.new
270
- cli.command_loop
1
+ require 'rev-api'
2
+ require 'optparse'
3
+ require 'pp'
4
+
5
+ # An example app using the official Ruby SDK for the Rev.com API
6
+ # This ruby script sets up a basic command line interface (CLI)
7
+ # that prompts a user to authenticate on the web, then
8
+ # allows them to type commands to manipulate their orders.
9
+ #
10
+ # To start, run:
11
+ # ruby examples/cli.rb --sandbox --client-key your_client_key --user-key your_user_key
12
+
13
+ class RevCLI
14
+ COMMANDS = %w{help get get_by_client_ref list transcripts captions dl_transcripts dl_captions dl_sources place_tc place_cp cancel}
15
+
16
+ def initialize
17
+ options = { :environment => Rev::Api::PRODUCTION_HOST, :verbatim => false, :timestamps => false }
18
+ optparse = OptionParser.new do |opts|
19
+ opts.banner = "Usage: cli.rb [options]. You will be prompted for command then."
20
+
21
+ opts.on("--client-key CLIENT-KEY", "Use CLIENT-KEY as the API Client Key for Authorization") do |client_key|
22
+ options[:client_key] = client_key
23
+ end
24
+
25
+ opts.on("--user-key USER-KEY", "Use USER-KEY as the API User Key for Authorization") do |user_key|
26
+ options[:user_key] = user_key
27
+ end
28
+
29
+ opts.on("--sandbox", "Execute against the Sandbox environment rather than production") do
30
+ options[:environment] = Rev::Api::SANDBOX_HOST
31
+ end
32
+
33
+ opts.on("--[no-]verbatim", "Request verbatim transcription") do |v|
34
+ options[:verbatim] = v
35
+ end
36
+
37
+ opts.on("--[no-]timestamps", "Request timestamps transcription") do |t|
38
+ options[:timestamps] = t
39
+ end
40
+ end
41
+ optparse.parse!
42
+
43
+ raise OptionParser::MissingArgument, "--client-key" if options[:client_key].nil?
44
+ raise OptionParser::MissingArgument, "--user-key" if options[:user_key].nil?
45
+
46
+ @rev_client = Rev.new(options[:client_key], options[:user_key], options[:environment])
47
+ end
48
+
49
+ def command_loop
50
+ puts "Enter a command or 'help' or 'exit'"
51
+ command_line = ''
52
+
53
+ while command_line.strip != 'exit'
54
+ begin
55
+ execute_command(command_line)
56
+ rescue RuntimeError => e
57
+ puts "Command Line Error! #{e.class}: #{e}"
58
+ puts e.backtrace
59
+ end
60
+ print '> '
61
+ command_line = gets.strip
62
+ end
63
+
64
+ puts 'Goodbye!'
65
+ exit(0)
66
+ end
67
+
68
+ def execute_command(cmd_line)
69
+ command = cmd_line.split
70
+ method = command.first
71
+ if COMMANDS.include? method
72
+ begin
73
+ send(method.to_sym, command[1..-1])
74
+ rescue Rev::BadRequestError => e
75
+ puts "Server returned error with code #{e.code}, message #{e.message}"
76
+ rescue Rev::ApiError => e
77
+ puts "Server returned error with message #{e.message}"
78
+ end
79
+ elsif command.first && !command.first.strip.empty?
80
+ puts 'Invalid command. Type \'help\' to see commands.'
81
+ end
82
+ end
83
+
84
+ def get(args)
85
+ order_num = args[0]
86
+ order = @rev_client.get_order order_num
87
+ pp order
88
+ end
89
+
90
+ def list(args)
91
+ orders = @rev_client.get_all_orders
92
+ orders.each { |o| puts("#{o.order_number}") }
93
+
94
+ puts 'There are no orders placed so far.' if orders.empty?
95
+ end
96
+
97
+ def get_by_client_ref(args)
98
+ # client ref can contain spaces, so we have to join client ref from pieces
99
+ if (args.last == '0' || args.last.to_i > 0)
100
+ client_ref = args[0..-2].join(' ')
101
+ else
102
+ client_ref = args.join(' ')
103
+ end
104
+
105
+ client_ref = client_ref.gsub('\'', '').gsub('"', '')
106
+ page = args.last.nil? ? 0: args.last.to_i
107
+
108
+ orders_first_page = @rev_client.get_orders_by_client_ref(client_ref, page)
109
+ puts "Found #{orders_first_page.total_count} order(s), showing page #{page}. Pass page number as second argument"
110
+ orders_first_page.orders.each { |o| puts ("#{o.client_ref}: #{o.order_number}") }
111
+
112
+ puts "There are no orders associated with the given client reference: #{client_ref}" if orders_first_page.orders.empty?
113
+ end
114
+
115
+ def transcripts(args)
116
+ begin
117
+ order_num = args[0]
118
+ order = @rev_client.get_order order_num
119
+
120
+ if order.transcripts.empty?
121
+ puts "There are no transcripts for order #{order_num}"
122
+ return
123
+ end
124
+
125
+ order.transcripts.each do |t|
126
+ puts "Contents of #{t.name}"
127
+ puts "-----------------------------------"
128
+ puts @rev_client.get_attachment_content_as_string t.id
129
+ puts
130
+ end
131
+ rescue Rev::BadRequestError => e
132
+ puts "Displaying transcripts failed with error code #{e.code}, message #{e.message}"
133
+ end
134
+ end
135
+
136
+ def captions(args)
137
+ begin
138
+ order_num = args[0]
139
+ order = @rev_client.get_order order_num
140
+
141
+ if order.captions.empty?
142
+ puts "There are no captions for order #{order_num}"
143
+ return
144
+ end
145
+
146
+ order.captions.each do |t|
147
+ puts "Contents of #{t.name}"
148
+ puts "-----------------------------------"
149
+ puts @rev_client.get_attachment_content(t.id).body
150
+ puts
151
+ end
152
+ rescue Rev::BadRequestError => e
153
+ puts "Displaying captions failed with error code #{e.code}, message #{e.message}"
154
+ end
155
+ end
156
+
157
+ def dl_transcripts(args)
158
+ begin
159
+ order_num = args[0]
160
+ order = @rev_client.get_order order_num
161
+
162
+ if order.transcripts.empty?
163
+ puts "There are no transcripts for order #{order_num}"
164
+ return
165
+ end
166
+
167
+ filenames = order.transcripts.map { |t| t.name}.join(',')
168
+ puts "Downloading files: #{filenames}"
169
+ order.transcripts.each do |t|
170
+ @rev_client.save_attachment_content t.id, t.name
171
+ end
172
+ rescue Rev::BadRequestError => e
173
+ puts "Downloading transcripts failed with error code #{e.code}, message #{e.message}"
174
+ end
175
+ end
176
+
177
+ def dl_captions(args)
178
+ begin
179
+ order_num = args[0]
180
+ order = @rev_client.get_order order_num
181
+
182
+ if order.captions.empty?
183
+ puts "There are no captions for order #{order_num}"
184
+ return
185
+ end
186
+
187
+ filenames = order.captions.map { |t| t.name}.join(',')
188
+ puts "Downloading files: #{filenames}"
189
+ order.captions.each do |t|
190
+ @rev_client.save_attachment_content t.id, t.name
191
+ end
192
+ rescue Rev::BadRequestError => e
193
+ puts "Downloading captions failed with error code #{e.code}, message #{e.message}"
194
+ end
195
+ end
196
+
197
+ def dl_sources(args)
198
+ begin
199
+ order_num = args[0]
200
+ order = @rev_client.get_order order_num
201
+
202
+ if order.sources.empty?
203
+ puts "There are no source files for order #{order_num}"
204
+ return
205
+ end
206
+
207
+ filenames = order.sources.map { |t| t.name }.join(',')
208
+ puts "Downloading files: #{filenames}"
209
+ order.sources.each do |t|
210
+ @rev_client.save_attachment_content t.id, t.name
211
+ end
212
+ rescue Rev::BadRequestError => e
213
+ puts "Downloading sources failed with error code #{e.code}, message #{e.message}"
214
+ end
215
+ end
216
+
217
+ def cancel(args)
218
+ begin
219
+ order_num = args[0]
220
+ @rev_client.cancel_order order_num
221
+ puts "Order #{order_num} cancelled"
222
+ rescue Rev::BadRequestError => e
223
+ puts "Cancelling order failed with error code #{e.code}, message #{e.message}"
224
+ end
225
+ end
226
+
227
+ def place_tc(args)
228
+ input_urls = upload(args, 'audio/mpeg')
229
+ inputs = input_urls.map { |url| Rev::Input.new(:uri => url, :audio_length_seconds => 180) }
230
+ tc_options = Rev::TranscriptionOptions.new(inputs)
231
+ place_helper(inputs, { :transcription_options => tc_options })
232
+ end
233
+
234
+ def place_cp(args)
235
+ input_urls = upload(args, 'video/mpeg')
236
+ inputs = input_urls.map { |url| Rev::Input.new(:uri => url, :video_length_seconds => 180) }
237
+ cp_options = Rev::CaptionOptions.new(inputs, {:output_file_formats => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc]] })
238
+ place_helper(inputs, { :caption_options => cp_options })
239
+ end
240
+
241
+ def help(*args)
242
+ puts "commands are: #{COMMANDS.join(' ')} exit"
243
+ end
244
+
245
+ private
246
+
247
+ def upload(args, type)
248
+ input_urls = args.map do |f|
249
+ puts "Uploading #{f}"
250
+ @rev_client.upload_input(f, type)
251
+ end
252
+ input_urls
253
+ end
254
+
255
+ def place_helper(inputs, options)
256
+ options = options.merge({ :client_ref => 'XB432423', :comment => 'Please work quickly' })
257
+ request = Rev::OrderRequest.new(options)
258
+
259
+ begin
260
+ new_order = @rev_client.submit_order(request)
261
+ puts "New order: #{new_order}"
262
+ rescue Rev::BadRequestError => e
263
+ puts "Order placement failed with error code #{e.code}, message #{e.message}"
264
+ end
265
+ end
266
+
267
+ end
268
+
269
+ cli = RevCLI.new
270
+ cli.command_loop