flatiron-video-uploader 0.0.14 → 0.0.15
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/lib/flatiron-video-uploader/runner.rb +174 -29
- data/lib/flatiron-video-uploader/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbf49b7dad7ca4f46930c7cee3a4e412bebeba79
|
4
|
+
data.tar.gz: a543bc4193426d29add0b8cdbd0aad803db531db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db45b8fcb6248657b56be6e8a6f0269100846a43cd31f64ffdb422e29b57d4e7edbe1b98312db71ec20dcc700c5033d1bf73506b5f5e37eed025075affe8c9a4
|
7
|
+
data.tar.gz: 81e34fefc754cac995134160804437dc3470b20932ded44e75810255b37de9f851879d44927fa30f5eaa83036ca8e3fc557bf985ceedbda86fbbf34b0b02dddd
|
@@ -1,3 +1,39 @@
|
|
1
|
+
PART_SIZE=1024*1024*50
|
2
|
+
class File
|
3
|
+
def each_part(current_part=1,part_size=PART_SIZE)
|
4
|
+
(current_part-1).times do
|
5
|
+
read(part_size)
|
6
|
+
end
|
7
|
+
yield read(part_size) until eof?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def mark_as_complete(s3,input_opts,lock_hash)
|
12
|
+
input_opts = input_opts.merge({
|
13
|
+
:upload_id => lock_hash["upload_id"]
|
14
|
+
})
|
15
|
+
|
16
|
+
parts_resp = s3.list_parts(input_opts)
|
17
|
+
|
18
|
+
input_opts = input_opts.merge(
|
19
|
+
:multipart_upload => {
|
20
|
+
:parts =>
|
21
|
+
parts_resp.parts.map do |part|
|
22
|
+
{ :part_number => part.part_number,
|
23
|
+
:etag => part.etag }
|
24
|
+
end
|
25
|
+
}
|
26
|
+
)
|
27
|
+
|
28
|
+
begin
|
29
|
+
tries ||=3
|
30
|
+
mpu_complete_response = s3.complete_multipart_upload(input_opts)
|
31
|
+
return mpu_complete_response
|
32
|
+
rescue Exception => e
|
33
|
+
retry unless (tries-=1).zero?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
1
37
|
Faraday.default_adapter = :httpclient
|
2
38
|
module FlatironVideoUploader
|
3
39
|
class Runner
|
@@ -125,7 +161,7 @@ module FlatironVideoUploader
|
|
125
161
|
end
|
126
162
|
youtube = client.discovered_api("youtube","v3")
|
127
163
|
|
128
|
-
s3 = Aws::S3::
|
164
|
+
s3 = Aws::S3::Client.new(
|
129
165
|
# credentials: Aws::Credentials.new('AKIAJY4YSCUKNRWWASIA', 'lXp+rsDPaHcoaEay3XcjfAnE1l1W8BRWOrdLfsPH'),
|
130
166
|
credentials: Aws::Credentials.new(token_response['amazon_s3_key'], token_response['amazon_s3_secret']),
|
131
167
|
region: 'us-east-1'
|
@@ -144,33 +180,37 @@ module FlatironVideoUploader
|
|
144
180
|
}
|
145
181
|
|
146
182
|
puts "\n\nOK, about to upload the video. This will take a while"
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
:
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
183
|
+
begin
|
184
|
+
video_to_upload = Google::APIClient::UploadIO.new(file, 'video/*')
|
185
|
+
|
186
|
+
video_to_upload.chunk_size =10000000
|
187
|
+
progressbar = ProgressBar.create(:title => "Youtube Upload", :total =>video_to_upload.length)
|
188
|
+
videos_insert_response = client.execute(
|
189
|
+
:api_method => youtube.videos.insert,
|
190
|
+
:body_object => body,
|
191
|
+
:media => video_to_upload,
|
192
|
+
:retries => 0,
|
193
|
+
:parameters => {
|
194
|
+
:uploadType => 'resumable',
|
195
|
+
:part => body.keys.join(','),
|
196
|
+
}
|
197
|
+
)
|
198
|
+
while !videos_insert_response.resumable_upload.complete? do
|
199
|
+
progressbar.progress += video_to_upload.chunk_size
|
200
|
+
videos_insert_response = client.execute(videos_insert_response.resumable_upload)
|
201
|
+
end
|
202
|
+
progressbar.finish
|
203
|
+
puts "Uploaded wooooooooo. The id is #{videos_insert_response.data.id}"
|
204
|
+
puts "\n\n"
|
205
|
+
puts "#"*30
|
206
|
+
puts "Place this in todays schedule on github\n\n\n"
|
207
|
+
command = "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/#{videos_insert_response.data.id}?rel=0&modestbranding=1\" frameborder=\"0\" allowfullscreen></iframe><p><a href=\"https://www.youtube.com/watch?v=#{videos_insert_response.data.id}\">#{video_title}</a></p>"
|
208
|
+
puts command
|
209
|
+
puts "\n\n"
|
210
|
+
puts "#"*30
|
211
|
+
rescue Exception => e
|
212
|
+
exit
|
164
213
|
end
|
165
|
-
progressbar.finish
|
166
|
-
puts "Uploaded wooooooooo. The id is #{videos_insert_response.data.id}"
|
167
|
-
puts "\n\n"
|
168
|
-
puts "#"*30
|
169
|
-
puts "Place this in todays schedule on github\n\n\n"
|
170
|
-
command = "<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/#{videos_insert_response.data.id}?rel=0&modestbranding=1\" frameborder=\"0\" allowfullscreen></iframe><p><a href=\"https://www.youtube.com/watch?v=#{videos_insert_response.data.id}\">#{video_title}</a></p>"
|
171
|
-
puts command
|
172
|
-
puts "\n\n"
|
173
|
-
puts "#"*30
|
174
214
|
TerminalNotifier.notify("Finished Uploading Video to Youtube. Click to copy embed ", :title => "Video Uploader", :execute => `echo '#{command}' | pbcopy`)
|
175
215
|
# rescue Google::APIClient::TransmissionError => e
|
176
216
|
# binding.pry
|
@@ -189,9 +229,113 @@ module FlatironVideoUploader
|
|
189
229
|
movie_transcode_thread.join
|
190
230
|
|
191
231
|
puts "\nDone transcoding. Let's upload to S3"
|
232
|
+
bucket = 'flatiron-school-learn-videos'
|
233
|
+
key = "lecture-videos/#{videos_insert_response.data.id}.mp4"
|
234
|
+
lock_file = File.open("/tmp/flatiron-uploader.lock","a+")
|
235
|
+
lock_file.sync=true
|
236
|
+
exit unless lock_file.flock( File::LOCK_NB | File::LOCK_EX )
|
237
|
+
|
238
|
+
file_name = "/tmp/transcoded.mp4"
|
239
|
+
File.open('/tmp/transcoded.mp4', 'rb') do |file|
|
240
|
+
if file.size > PART_SIZE
|
241
|
+
puts "File size over #{PART_SIZE} bytes, using multipart upload..."
|
242
|
+
input_opts = {
|
243
|
+
bucket: bucket,
|
244
|
+
key: key,
|
245
|
+
}
|
246
|
+
input_opts_with_acl = input_opts.merge({acl: "public-read"})
|
247
|
+
lock_hash = {}
|
248
|
+
total_parts = file.size.to_f / PART_SIZE
|
249
|
+
current_part=1
|
250
|
+
begin
|
251
|
+
existing_file = lock_file.read
|
252
|
+
lock_hash = JSON.parse existing_file
|
253
|
+
if lock_hash["file_name"]==file_name && lock_hash["file_size"]==file.size && lock_hash["key"]==key && lock_hash["total_parts"] == total_parts
|
254
|
+
binding.pry
|
255
|
+
current_part = lock_hash["current_part"]
|
256
|
+
else
|
257
|
+
input_opts_with_upload = input_opts.merge({
|
258
|
+
:upload_id => lock_hash["upload_id"],
|
259
|
+
:key => lock_hash["key"],
|
260
|
+
})
|
261
|
+
s3.abort_multipart_upload(input_opts_with_upload)
|
262
|
+
binding.pry
|
263
|
+
lock_file.truncate(0)
|
264
|
+
mpu_create_response = s3.create_multipart_upload(input_opts_with_acl)
|
265
|
+
lock_hash = {"total_parts"=> total_parts,
|
266
|
+
"current_part" => current_part,
|
267
|
+
"file_name" =>file_name,
|
268
|
+
"file_size" => file.size,
|
269
|
+
"key" => key,
|
270
|
+
"upload_id" =>mpu_create_response.upload_id,
|
271
|
+
}
|
272
|
+
lock_file.puts lock_hash.to_json
|
273
|
+
end
|
274
|
+
rescue StandardError => e
|
275
|
+
mpu_create_response = s3.create_multipart_upload(input_opts_with_acl)
|
276
|
+
lock_hash = {"total_parts"=> total_parts,
|
277
|
+
"current_part" => current_part,
|
278
|
+
"file_name" =>file_name,
|
279
|
+
"file_size" => file.size,
|
280
|
+
"key" => key,
|
281
|
+
"upload_id" =>mpu_create_response.upload_id,
|
282
|
+
}
|
283
|
+
lock_file.puts lock_hash.to_json
|
284
|
+
end
|
285
|
+
file.each_part(current_part) do |part|
|
286
|
+
|
287
|
+
begin
|
288
|
+
tries ||=3
|
289
|
+
part_response = s3.upload_part({
|
290
|
+
body: part,
|
291
|
+
bucket: bucket,
|
292
|
+
key: key,
|
293
|
+
part_number: current_part,
|
294
|
+
upload_id: lock_hash["upload_id"],
|
295
|
+
})
|
296
|
+
|
297
|
+
percent_complete = (current_part.to_f / total_parts.to_f) * 100
|
298
|
+
percent_complete = 100 if percent_complete > 100
|
299
|
+
percent_complete = sprintf('%.2f', percent_complete.to_f)
|
300
|
+
puts "percent complete: #{percent_complete}"
|
301
|
+
current_part = current_part + 1
|
302
|
+
lock_hash["current_part"]=current_part
|
303
|
+
lock_file.truncate(0)
|
304
|
+
lock_file.puts lock_hash.to_json
|
305
|
+
rescue Exception => e
|
306
|
+
if e.class == Interrupt
|
307
|
+
puts "LEaving"
|
308
|
+
lock_file.truncate(0)
|
309
|
+
lock_file.puts lock_hash.to_json
|
310
|
+
File.delete(lock_file.path)
|
311
|
+
exit
|
312
|
+
end
|
313
|
+
puts "trying again"
|
314
|
+
# input_opts = input_opts.merge({
|
315
|
+
# :upload_id => mpu_create_response.upload_id,
|
316
|
+
# })
|
317
|
+
lock_file.truncate(0)
|
318
|
+
lock_file.puts lock_hash.to_json
|
319
|
+
|
320
|
+
retry unless (tries-=1).zero?
|
321
|
+
puts "Couldn't get it to work, exiting"
|
192
322
|
|
193
|
-
|
194
|
-
|
323
|
+
File.delete(lock_file.path)
|
324
|
+
exit
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
mark_as_complete(s3,input_opts,lock_hash)
|
329
|
+
File.delete(lock_file.path)
|
330
|
+
else
|
331
|
+
s3.put_object(bucket: bucket, key: key, body: file, acl: 'public-read')
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
|
336
|
+
# obj = s3.bucket('flatiron-school-learn-videos').object("lecture-videos/#{videos_insert_response.data.id}.mp4")
|
337
|
+
# obj.initiate_multipart_upload(options)
|
338
|
+
# obj.upload_file('/tmp/transcoded.mp4', acl:'public-read')
|
195
339
|
raw_upload_thread.join unless raw_upload_thread.nil?
|
196
340
|
puts "All Done!"
|
197
341
|
TerminalNotifier.notify("All Done!", :title =>"Video Uploader")
|
@@ -199,3 +343,4 @@ module FlatironVideoUploader
|
|
199
343
|
end
|
200
344
|
end
|
201
345
|
end
|
346
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flatiron-video-uploader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Burgess
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|