transloadit 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.gitignore +3 -1
- data/.travis.yml +4 -4
- data/CHANGELOG.md +26 -0
- data/LICENSE +1 -1
- data/README.md +141 -16
- data/examples/README.md +185 -0
- data/examples/basic/audio-concat-transcoder.rb +40 -0
- data/examples/basic/audio-transcoder.rb +37 -0
- data/examples/basic/image-transcoder.rb +27 -0
- data/examples/basic/main.rb +69 -0
- data/examples/basic/media-transcoder.rb +13 -0
- data/lib/transloadit.rb +31 -0
- data/lib/transloadit/api_model.rb +73 -0
- data/lib/transloadit/assembly.rb +103 -63
- data/lib/transloadit/exception.rb +27 -0
- data/lib/transloadit/request.rb +23 -41
- data/lib/transloadit/response/assembly.rb +25 -0
- data/lib/transloadit/template.rb +63 -0
- data/lib/transloadit/version.rb +1 -1
- data/test/fixtures/cassettes/create_template.yml +48 -0
- data/test/fixtures/cassettes/delete_template.yml +44 -0
- data/test/fixtures/cassettes/fetch_assemblies.yml +44 -0
- data/test/fixtures/cassettes/fetch_assembly_notifications.yml +44 -0
- data/test/fixtures/cassettes/fetch_assembly_ok.yml +36 -0
- data/test/fixtures/cassettes/fetch_billing.yml +44 -0
- data/test/fixtures/cassettes/{fetch_bored.yml → fetch_root.yml} +6 -6
- data/test/fixtures/cassettes/fetch_template.yml +44 -0
- data/test/fixtures/cassettes/fetch_templates.yml +44 -0
- data/test/fixtures/cassettes/rate_limit_fail.yml +105 -0
- data/test/fixtures/cassettes/rate_limit_succeed.yml +79 -0
- data/test/fixtures/cassettes/replay_assembly.yml +49 -0
- data/test/fixtures/cassettes/replay_assembly_notification.yml +48 -0
- data/test/fixtures/cassettes/submit_assembly.yml +1 -36
- data/test/fixtures/cassettes/update_template.yml +48 -0
- data/test/test_helper.rb +4 -0
- data/test/unit/test_transloadit.rb +14 -1
- data/test/unit/transloadit/test_api.rb +50 -0
- data/test/unit/transloadit/test_assembly.rb +178 -47
- data/test/unit/transloadit/test_request.rb +28 -20
- data/test/unit/transloadit/test_response.rb +44 -0
- data/test/unit/transloadit/test_template.rb +118 -0
- data/transloadit.gemspec +3 -3
- metadata +70 -33
@@ -0,0 +1,40 @@
|
|
1
|
+
class AudioConcatTranscoder < MediaTranscoder
|
2
|
+
require 'transloadit'
|
3
|
+
require_relative 'media-transcoder'
|
4
|
+
|
5
|
+
# in this example a file is encoded as an mp3, id3 tags are added, and it is stored in s3
|
6
|
+
def transcode!(files)
|
7
|
+
concat = transloadit_client.step('concat', '/audio/concat', {
|
8
|
+
preset: 'mp3',
|
9
|
+
use: {
|
10
|
+
steps: files.map.each_with_index do |f, i|
|
11
|
+
{ name: ':original', as: "audio_#{i}", fields: "file_#{i}" }
|
12
|
+
end
|
13
|
+
},
|
14
|
+
result: true
|
15
|
+
})
|
16
|
+
store = transloadit_client.step('store', '/s3/store', {
|
17
|
+
key: ENV.fetch('S3_ACCESS_KEY'),
|
18
|
+
secret: ENV.fetch('S3_SECRET_KEY'),
|
19
|
+
bucket: ENV.fetch('S3_BUCKET'),
|
20
|
+
bucket_region: ENV.fetch('S3_REGION'),
|
21
|
+
use: ['concat']
|
22
|
+
})
|
23
|
+
assembly = transloadit_client.assembly(steps: [concat, store])
|
24
|
+
assembly.submit! *open_files(files)
|
25
|
+
end
|
26
|
+
|
27
|
+
def open_files(files)
|
28
|
+
files.map do |f|
|
29
|
+
open(f)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def mp3_metadata
|
34
|
+
meta = { publisher: 'Transloadit', title: '${file.name}' }
|
35
|
+
meta[:album] = 'Transloadit Compilation'
|
36
|
+
meta[:artist] = 'Transloadit'
|
37
|
+
meta[:track] = '1/1'
|
38
|
+
meta
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class AudioTranscoder < MediaTranscoder
|
2
|
+
require 'transloadit'
|
3
|
+
require_relative 'media-transcoder'
|
4
|
+
|
5
|
+
# in this example a file is encoded as an mp3, id3 tags are added, and it is stored in s3
|
6
|
+
def transcode!(file)
|
7
|
+
encode_mp3 = transloadit_client.step('mp3_encode', '/audio/encode', {
|
8
|
+
use: ':original',
|
9
|
+
preset: 'mp3',
|
10
|
+
ffmpeg_stack: 'v2.2.3',
|
11
|
+
result: true
|
12
|
+
})
|
13
|
+
write_metadata = transloadit_client.step('mp3', '/meta/write', {
|
14
|
+
use: 'mp3_encode',
|
15
|
+
ffmpeg_stack: 'v2.2.3',
|
16
|
+
result: true,
|
17
|
+
data_to_write: mp3_metadata
|
18
|
+
})
|
19
|
+
store = transloadit_client.step('store', '/s3/store', {
|
20
|
+
key: ENV.fetch('S3_ACCESS_KEY'),
|
21
|
+
secret: ENV.fetch('S3_SECRET_KEY'),
|
22
|
+
bucket: ENV.fetch('S3_BUCKET'),
|
23
|
+
bucket_region: ENV.fetch('S3_REGION'),
|
24
|
+
use: ['mp3']
|
25
|
+
})
|
26
|
+
assembly = transloadit_client.assembly(steps: [encode_mp3, write_metadata, store])
|
27
|
+
assembly.submit! open(file)
|
28
|
+
end
|
29
|
+
|
30
|
+
def mp3_metadata
|
31
|
+
meta = { publisher: 'Transloadit', title: '${file.name}' }
|
32
|
+
meta[:album] = 'Transloadit Compilation'
|
33
|
+
meta[:artist] = 'Transloadit'
|
34
|
+
meta[:track] = '1/1'
|
35
|
+
meta
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class ImageTranscoder < MediaTranscoder
|
2
|
+
require 'transloadit'
|
3
|
+
require_relative 'media-transcoder'
|
4
|
+
|
5
|
+
# in this example a file is submitted, optimized, and then stored in s3
|
6
|
+
def transcode!(file)
|
7
|
+
optimize = transloadit_client.step('image', '/image/optimize', {
|
8
|
+
progressive: true,
|
9
|
+
use: ':original',
|
10
|
+
result: true
|
11
|
+
})
|
12
|
+
store = transloadit_client.step('store', '/s3/store', {
|
13
|
+
key: ENV.fetch('S3_ACCESS_KEY'),
|
14
|
+
secret: ENV.fetch('S3_SECRET_KEY'),
|
15
|
+
bucket: ENV.fetch('S3_BUCKET'),
|
16
|
+
bucket_region: ENV.fetch('S3_REGION'),
|
17
|
+
use: 'image'
|
18
|
+
})
|
19
|
+
assembly = transloadit_client.assembly(steps: [optimize, store])
|
20
|
+
assembly.submit! open(file)
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_status!(assembly_id)
|
24
|
+
req = Transloadit::Request.new('/assemblies/' + assembly_id.to_s, ENV.fetch('TRANSLOADIT_SECRET'))
|
25
|
+
req.get.extend!(Transloadit::Response::Assembly)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require_relative 'media-transcoder'
|
3
|
+
require_relative 'image-transcoder'
|
4
|
+
require_relative 'audio-transcoder'
|
5
|
+
require_relative 'audio-concat-transcoder'
|
6
|
+
|
7
|
+
p 'starting image transcoding job...'
|
8
|
+
p 'fetching image from the cat api...'
|
9
|
+
|
10
|
+
open('http://thecatapi.com/api/images/get') do |f|
|
11
|
+
p 'starting transcoding job...'
|
12
|
+
image_transcoder = ImageTranscoder.new
|
13
|
+
response = image_transcoder.transcode!(f)
|
14
|
+
|
15
|
+
# if you are using rails one thing you can do would be to start an ActiveJob process that recursively
|
16
|
+
# checks on the status of the assembly until it is finished
|
17
|
+
while !response.finished?
|
18
|
+
sleep 1
|
19
|
+
p 'checking job status...'
|
20
|
+
response = image_transcoder.get_status!(response[:assembly_id])
|
21
|
+
end
|
22
|
+
p response[:message]
|
23
|
+
p response[:results]['image'][0]['url']
|
24
|
+
end
|
25
|
+
|
26
|
+
p 'starting audio transcoding job...'
|
27
|
+
p 'fetching soundbite from nasa...'
|
28
|
+
p "\n"
|
29
|
+
|
30
|
+
open('http://www.nasa.gov/640379main_Computers_are_in_Control.m4r') do |f|
|
31
|
+
p 'starting transcoding job...'
|
32
|
+
audio_transcoder = AudioTranscoder.new
|
33
|
+
response = audio_transcoder.transcode!(f)
|
34
|
+
|
35
|
+
# if you are using rails one thing you can do would be to start an ActiveJob process that recursively
|
36
|
+
# checks on the status of the assembly until it is finished
|
37
|
+
while !response.finished?
|
38
|
+
sleep 1
|
39
|
+
p 'checking job status...'
|
40
|
+
response = audio_transcoder.get_status!(response[:assembly_id])
|
41
|
+
end
|
42
|
+
p response[:message]
|
43
|
+
p response[:results]['mp3'][0]['url']
|
44
|
+
p "\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
p 'starting audio concat transcoding job...'
|
48
|
+
p 'fetching 3 soundbites from nasa...'
|
49
|
+
|
50
|
+
files = [
|
51
|
+
'http://www.nasa.gov/mp3/640148main_APU%20Shutdown.mp3',
|
52
|
+
'http://www.nasa.gov/mp3/640164main_Go%20for%20Deploy.mp3',
|
53
|
+
'http://www.nasa.gov/mp3/640165main_Lookin%20At%20It.mp3'
|
54
|
+
]
|
55
|
+
|
56
|
+
p 'starting transcoding job...'
|
57
|
+
audio_concat_transcoder = AudioConcatTranscoder.new
|
58
|
+
response = audio_concat_transcoder.transcode!(files)
|
59
|
+
|
60
|
+
# if you are using rails one thing you can do would be to start an ActiveJob process that recursively
|
61
|
+
# checks on the status of the assembly until it is finished
|
62
|
+
while !response.finished?
|
63
|
+
sleep 1
|
64
|
+
p 'checking job status...'
|
65
|
+
response = audio_concat_transcoder.get_status!(response[:assembly_id])
|
66
|
+
end
|
67
|
+
p response[:message]
|
68
|
+
p response[:results]['concat'][0]['url']
|
69
|
+
p "\n"
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class MediaTranscoder
|
2
|
+
def transloadit_client
|
3
|
+
@transloadit ||= Transloadit.new({
|
4
|
+
key: ENV.fetch('TRANSLOADIT_KEY'),
|
5
|
+
secret: ENV.fetch('TRANSLOADIT_SECRET')
|
6
|
+
})
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_status!(assembly_id)
|
10
|
+
req = Transloadit::Request.new('/assemblies/' + assembly_id.to_s, ENV.fetch('TRANSLOADIT_SECRET'))
|
11
|
+
req.get.extend!(Transloadit::Response::Assembly)
|
12
|
+
end
|
13
|
+
end
|
data/lib/transloadit.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
require 'multi_json'
|
2
|
+
require 'date'
|
2
3
|
|
3
4
|
#
|
4
5
|
# Implements the Transloadit REST API in Ruby. Check the {file:README.md README}
|
5
6
|
# for usage instructions.
|
6
7
|
#
|
7
8
|
class Transloadit
|
9
|
+
autoload :ApiModel, 'transloadit/api_model'
|
8
10
|
autoload :Assembly, 'transloadit/assembly'
|
11
|
+
autoload :Exception, 'transloadit/exception'
|
9
12
|
autoload :Request, 'transloadit/request'
|
10
13
|
autoload :Response, 'transloadit/response'
|
11
14
|
autoload :Step, 'transloadit/step'
|
15
|
+
autoload :Template, 'transloadit/template'
|
12
16
|
autoload :VERSION, 'transloadit/version'
|
13
17
|
|
14
18
|
# @return [String] your Transloadit auth key
|
@@ -75,6 +79,33 @@ class Transloadit
|
|
75
79
|
Transloadit::Assembly.new(self, options)
|
76
80
|
end
|
77
81
|
|
82
|
+
#
|
83
|
+
# Creates a Transloadit::Template instance ready to interact with its corresponding REST API.
|
84
|
+
#
|
85
|
+
# See the Transloadit {documentation}[https://transloadit.com/docs/api-docs/#template-api]
|
86
|
+
# for futher information on Templates and available endpoints.
|
87
|
+
#
|
88
|
+
def template(options = {})
|
89
|
+
Transloadit::Template.new(self, options)
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Gets user billing reports for specified month and year.
|
94
|
+
# Defaults to current month or year if corresponding param is not specified.
|
95
|
+
#
|
96
|
+
# @param [Integer] month the month for which billing reports should be retrieved.
|
97
|
+
# defaults to current month if not specified.
|
98
|
+
# @param [Integer] year the year for which billing reports should be retrieved.
|
99
|
+
# defaults to current year if not specified.
|
100
|
+
#
|
101
|
+
def bill(month = Date.today.month, year = Date.today.year)
|
102
|
+
# convert month to 2 digit format
|
103
|
+
month = format '%02d', month
|
104
|
+
path = "bill/#{year}-#{month}"
|
105
|
+
|
106
|
+
Transloadit::Request.new(path, self.secret).get({ :auth => self.to_hash })
|
107
|
+
end
|
108
|
+
|
78
109
|
#
|
79
110
|
# @return [String] a human-readable version of the Transloadit.
|
80
111
|
#
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'transloadit'
|
2
|
+
|
3
|
+
#
|
4
|
+
# Represents an API class that more Transloadit specific API classes
|
5
|
+
# would inherit from.
|
6
|
+
#
|
7
|
+
class Transloadit::ApiModel
|
8
|
+
# @return [Transloadit] the associated Transloadit instance
|
9
|
+
attr_reader :transloadit
|
10
|
+
|
11
|
+
# @return [Hash] the options describing the Assembly
|
12
|
+
attr_accessor :options
|
13
|
+
|
14
|
+
#
|
15
|
+
# Creates a new API instance authenticated using the given +transloadit+
|
16
|
+
# instance.
|
17
|
+
#
|
18
|
+
# @param [Transloadit] transloadit the associated Transloadit instance
|
19
|
+
# @param [Hash] options the configuration for the API;
|
20
|
+
#
|
21
|
+
def initialize(transloadit, options = {})
|
22
|
+
self.transloadit = transloadit
|
23
|
+
self.options = options
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# @return [String] a human-readable version of the API
|
28
|
+
#
|
29
|
+
def inspect
|
30
|
+
self.to_hash.inspect
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @return [Hash] a Transloadit-compatible Hash of the API's contents
|
35
|
+
#
|
36
|
+
def to_hash
|
37
|
+
self.options.merge(
|
38
|
+
:auth => self.transloadit.to_hash,
|
39
|
+
).delete_if {|_,v| v.nil?}
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# @return [String] JSON-encoded String containing the API's contents
|
44
|
+
#
|
45
|
+
def to_json
|
46
|
+
MultiJson.dump(self.to_hash)
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
attr_writer :transloadit
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
#
|
56
|
+
# Performs http request in favour of it's caller
|
57
|
+
#
|
58
|
+
# @param [String] path url path to which request is made
|
59
|
+
# @param [Hash] params POST/GET data to submit with the request
|
60
|
+
# @param [String] method http request method. This could be 'post' or 'get'
|
61
|
+
# @param [Hash] extra_params additional POST/GET data to submit with the request
|
62
|
+
#
|
63
|
+
# @return [Transloadit::Response] the response
|
64
|
+
#
|
65
|
+
def _do_request(path, params = nil, method = 'get', extra_params = nil)
|
66
|
+
if !params.nil?
|
67
|
+
params = self.to_hash.update(params)
|
68
|
+
params = { :params => params } if ['post', 'put', 'delete'].include? method
|
69
|
+
params.merge!(extra_params) if !extra_params.nil?
|
70
|
+
end
|
71
|
+
Transloadit::Request.new(path, self.transloadit.secret).public_send(method, params)
|
72
|
+
end
|
73
|
+
end
|
data/lib/transloadit/assembly.rb
CHANGED
@@ -1,34 +1,13 @@
|
|
1
1
|
require 'transloadit'
|
2
2
|
|
3
3
|
#
|
4
|
-
# Represents
|
5
|
-
# Assembly can contain one or more Steps for processing or point to a
|
6
|
-
# server-side template. It's submitted along with a list of files to process,
|
7
|
-
# at which point Transloadit will process and store the files according to the
|
8
|
-
# rules in the Assembly.
|
4
|
+
# Represents an Assembly API ready to make calls to the REST API endpoints.
|
9
5
|
#
|
10
|
-
# See the Transloadit {documentation}[
|
11
|
-
# for futher information on Assemblies and
|
6
|
+
# See the Transloadit {documentation}[https://transloadit.com/docs/api-docs/#assembly-api]
|
7
|
+
# for futher information on Assemblies and available endpoints.
|
12
8
|
#
|
13
|
-
class Transloadit::Assembly
|
14
|
-
|
15
|
-
attr_reader :transloadit
|
16
|
-
|
17
|
-
# @return [Hash] the options describing the Assembly
|
18
|
-
attr_accessor :options
|
19
|
-
|
20
|
-
#
|
21
|
-
# Creates a new Assembly authenticated using the given +transloadit+
|
22
|
-
# instance.
|
23
|
-
#
|
24
|
-
# @param [Transloadit] transloadit the associated Transloadit instance
|
25
|
-
# @param [Hash] options the configuration for the Assembly;
|
26
|
-
# see {Transloadit#assembly}
|
27
|
-
#
|
28
|
-
def initialize(transloadit, options = {})
|
29
|
-
self.transloadit = transloadit
|
30
|
-
self.options = options
|
31
|
-
end
|
9
|
+
class Transloadit::Assembly < Transloadit::ApiModel
|
10
|
+
DEFAULT_TRIES = 3
|
32
11
|
|
33
12
|
#
|
34
13
|
# @return [Hash] the processing steps, formatted for sending to Transloadit
|
@@ -38,41 +17,106 @@ class Transloadit::Assembly
|
|
38
17
|
end
|
39
18
|
|
40
19
|
#
|
41
|
-
#
|
42
|
-
#
|
20
|
+
# Creates a Transloadit::Assembly and sends to the REST API. An
|
21
|
+
# Assembly can contain one or more Steps for processing or point to a
|
22
|
+
# server-side template. It's submitted along with a list of files to process,
|
23
|
+
# at which point Transloadit will process and store the files according to the
|
24
|
+
# rules in the Assembly.
|
25
|
+
# See the Transloadit {documentation}[http://transloadit.com/docs/building-assembly-instructions]
|
26
|
+
# for futher information on Assemblies and their parameters.
|
27
|
+
#
|
28
|
+
# Accepts as many IO objects as you wish to process in the assembly.
|
29
|
+
# The last argument is an optional Hash
|
43
30
|
# of parameters to send along with the request.
|
44
31
|
#
|
45
|
-
# @overload
|
32
|
+
# @overload create!(*ios)
|
46
33
|
# @param [Array<IO>] *ios the files for the assembly to process
|
47
34
|
#
|
48
|
-
# @overload
|
35
|
+
# @overload create!(*ios, params = {})
|
49
36
|
# @param [Array<IO>] *ios the files for the assembly to process
|
50
|
-
# @param [Hash] params additional POST data to submit with the request
|
37
|
+
# @param [Hash] params additional POST data to submit with the request;
|
38
|
+
# for a full list of parameters, see the official documentation
|
39
|
+
# on {templates}[http://transloadit.com/docs/templates].
|
40
|
+
# @option params [Step, Array<Step>] :steps the steps to perform in this
|
41
|
+
# assembly
|
42
|
+
# @option params [String] :notify_url A URL to be POSTed when the assembly
|
43
|
+
# has finished processing
|
44
|
+
# @option params [String] :template_id the ID of a
|
45
|
+
# {template}[https://transloadit.com/templates] to use instead of
|
46
|
+
# specifying params here directly
|
47
|
+
#
|
48
|
+
def create!(*ios, **params)
|
49
|
+
params[:steps] = _wrap_steps_in_hash(params[:steps]) if !params[:steps].nil?
|
50
|
+
|
51
|
+
extra_params = {}
|
52
|
+
extra_params.merge!(self.options[:fields]) if self.options[:fields]
|
53
|
+
|
54
|
+
trials = self.options[:tries] || DEFAULT_TRIES
|
55
|
+
(1..trials).each do |trial|
|
56
|
+
# update the payload with file entries
|
57
|
+
ios.each_with_index {|f, i| extra_params.update :"file_#{i}" => f }
|
58
|
+
|
59
|
+
response = _do_request(
|
60
|
+
'/assemblies',params,'post', extra_params
|
61
|
+
).extend!(Transloadit::Response::Assembly)
|
62
|
+
|
63
|
+
return response unless response.rate_limit?
|
64
|
+
|
65
|
+
_handle_rate_limit!(response, ios, trial < trials)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# alias for create!
|
71
|
+
# keeping this method for backward compatibility
|
51
72
|
#
|
52
73
|
def submit!(*ios)
|
53
|
-
|
54
|
-
|
55
|
-
|
74
|
+
warn "#{caller(1)[0]}: warning: Transloadit::Assembly#submit!"\
|
75
|
+
" is deprecated. use Transloadit::Assembly#create! instead"
|
76
|
+
self.create!(*ios)
|
77
|
+
end
|
56
78
|
|
57
|
-
|
58
|
-
|
79
|
+
#
|
80
|
+
# Returns a list of all assemblies
|
81
|
+
# @param [Hash] additional GET data to submit with the request
|
82
|
+
#
|
83
|
+
def list(params = {})
|
84
|
+
_do_request('/assemblies', params)
|
85
|
+
end
|
59
86
|
|
60
|
-
|
61
|
-
|
87
|
+
#
|
88
|
+
# Returns a single assembly object specified by the assembly id
|
89
|
+
# @param [String] id id of the desired assembly
|
90
|
+
#
|
91
|
+
def get(id)
|
92
|
+
_do_request("/assemblies/#{id}").extend!(Transloadit::Response::Assembly)
|
93
|
+
end
|
62
94
|
|
63
|
-
|
64
|
-
|
65
|
-
|
95
|
+
#
|
96
|
+
# Replays an assembly specified by the id
|
97
|
+
# @param [String] id id of the desired assembly
|
98
|
+
# @param [Hash] params additional POST data to submit with the request
|
99
|
+
#
|
100
|
+
def replay(id, params = {})
|
101
|
+
params.merge!({ :wait => false })
|
102
|
+
_do_request("/assemblies/#{id}/replay", params, 'post').extend!(Transloadit::Response::Assembly)
|
103
|
+
end
|
66
104
|
|
67
|
-
|
68
|
-
|
105
|
+
#
|
106
|
+
# Returns all assembly notifications
|
107
|
+
# @param [Hash] params additional GET data to submit with the request
|
108
|
+
#
|
109
|
+
def get_notifications(params = {})
|
110
|
+
_do_request "/assembly_notifications", params
|
69
111
|
end
|
70
112
|
|
71
113
|
#
|
72
|
-
#
|
114
|
+
# Replays an assembly notification by the id
|
115
|
+
# @param [String] id id of the desired assembly
|
116
|
+
# @param [Hash] params additional POST data to submit with the request
|
73
117
|
#
|
74
|
-
def
|
75
|
-
|
118
|
+
def replay_notification(id, params = {})
|
119
|
+
_do_request("/assembly_notifications/#{id}/replay", params, 'post')
|
76
120
|
end
|
77
121
|
|
78
122
|
#
|
@@ -85,17 +129,6 @@ class Transloadit::Assembly
|
|
85
129
|
).delete_if {|k,v| v.nil?}
|
86
130
|
end
|
87
131
|
|
88
|
-
#
|
89
|
-
# @return [String] JSON-encoded String containing the Assembly's contents
|
90
|
-
#
|
91
|
-
def to_json
|
92
|
-
MultiJson.dump(self.to_hash)
|
93
|
-
end
|
94
|
-
|
95
|
-
protected
|
96
|
-
|
97
|
-
attr_writer :transloadit
|
98
|
-
|
99
132
|
private
|
100
133
|
|
101
134
|
#
|
@@ -116,13 +149,20 @@ class Transloadit::Assembly
|
|
116
149
|
end
|
117
150
|
|
118
151
|
#
|
119
|
-
#
|
120
|
-
#
|
152
|
+
# Stays idle for certain time and then reopens assembly files for reprocessing.
|
153
|
+
# Should be called when assembly rate limit is reached.
|
121
154
|
#
|
122
|
-
# @param
|
123
|
-
# @
|
155
|
+
# @param [Response] response assembly response that comes with a rate limit
|
156
|
+
# @param [Array<IO>] ios the files sent for the assembly to process.
|
124
157
|
#
|
125
|
-
def
|
126
|
-
|
158
|
+
def _handle_rate_limit!(response, ios, is_retrying)
|
159
|
+
if is_retrying
|
160
|
+
warn "Rate limit reached. Waiting for #{response.wait_time} seconds before retrying."
|
161
|
+
sleep response.wait_time
|
162
|
+
# RestClient closes file streams at the end of a request.
|
163
|
+
ios.collect! {|file| open file.path }
|
164
|
+
else
|
165
|
+
raise Transloadit::Exception::RateLimitReached.new(response)
|
166
|
+
end
|
127
167
|
end
|
128
168
|
end
|