active_encode 0.5.0 → 0.6.0

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +72 -0
  3. data/.rubocop.yml +8 -70
  4. data/.rubocop_todo.yml +64 -0
  5. data/Gemfile +3 -3
  6. data/active_encode.gemspec +4 -1
  7. data/app/controllers/active_encode/encode_record_controller.rb +1 -0
  8. data/app/jobs/active_encode/polling_job.rb +1 -1
  9. data/app/models/active_encode/encode_record.rb +1 -0
  10. data/db/migrate/20180822021048_create_active_encode_encode_records.rb +1 -0
  11. data/db/migrate/20190702153755_add_create_options_to_active_encode_encode_records.rb +6 -0
  12. data/db/migrate/20190712174821_add_progress_to_active_encode_encode_records.rb +6 -0
  13. data/lib/active_encode.rb +1 -0
  14. data/lib/active_encode/base.rb +1 -0
  15. data/lib/active_encode/callbacks.rb +1 -0
  16. data/lib/active_encode/core.rb +4 -3
  17. data/lib/active_encode/engine.rb +1 -0
  18. data/lib/active_encode/engine_adapter.rb +1 -0
  19. data/lib/active_encode/engine_adapters.rb +2 -1
  20. data/lib/active_encode/engine_adapters/elastic_transcoder_adapter.rb +25 -24
  21. data/lib/active_encode/engine_adapters/ffmpeg_adapter.rb +43 -58
  22. data/lib/active_encode/engine_adapters/matterhorn_adapter.rb +5 -4
  23. data/lib/active_encode/engine_adapters/test_adapter.rb +5 -4
  24. data/lib/active_encode/engine_adapters/zencoder_adapter.rb +3 -2
  25. data/lib/active_encode/global_id.rb +2 -1
  26. data/lib/active_encode/input.rb +3 -2
  27. data/lib/active_encode/output.rb +3 -2
  28. data/lib/active_encode/persistence.rb +7 -3
  29. data/lib/active_encode/polling.rb +2 -1
  30. data/lib/active_encode/status.rb +1 -0
  31. data/lib/active_encode/technical_metadata.rb +3 -2
  32. data/lib/active_encode/version.rb +2 -1
  33. data/lib/file_locator.rb +7 -8
  34. data/spec/controllers/encode_record_controller_spec.rb +2 -1
  35. data/spec/integration/elastic_transcoder_adapter_spec.rb +26 -26
  36. data/spec/integration/ffmpeg_adapter_spec.rb +26 -22
  37. data/spec/integration/matterhorn_adapter_spec.rb +6 -5
  38. data/spec/integration/zencoder_adapter_spec.rb +15 -14
  39. data/spec/rails_helper.rb +1 -0
  40. data/spec/routing/encode_record_controller_routing_spec.rb +1 -0
  41. data/spec/shared_specs/engine_adapter_specs.rb +1 -1
  42. data/spec/spec_helper.rb +2 -1
  43. data/spec/test_app_templates/lib/generators/test_app_generator.rb +13 -12
  44. data/spec/units/callbacks_spec.rb +3 -2
  45. data/spec/units/core_spec.rb +9 -8
  46. data/spec/units/engine_adapter_spec.rb +1 -0
  47. data/spec/units/file_locator_spec.rb +19 -18
  48. data/spec/units/global_id_spec.rb +4 -3
  49. data/spec/units/input_spec.rb +8 -5
  50. data/spec/units/output_spec.rb +8 -5
  51. data/spec/units/persistence_spec.rb +8 -4
  52. data/spec/units/polling_job_spec.rb +7 -6
  53. data/spec/units/polling_spec.rb +1 -0
  54. data/spec/units/status_spec.rb +3 -3
  55. metadata +37 -7
  56. data/.travis.yml +0 -19
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'rails_helper'
2
3
 
3
4
  describe ActiveEncode::EncodeRecordController, type: :controller, db_clean: true do
4
5
  routes { ActiveEncode::Engine.routes }
5
6
 
6
- let(:encode_record) { ActiveEncode::EncodeRecord.create(id: 1, global_id: "app://ActiveEncode/Encode/1", state: "running", adapter: "ffmpeg", title: "Test", raw_object: raw_object)}
7
+ let(:encode_record) { ActiveEncode::EncodeRecord.create(id: 1, global_id: "app://ActiveEncode/Encode/1", state: "running", adapter: "ffmpeg", title: "Test", raw_object: raw_object, progress: 100) }
7
8
  let(:raw_object) do
8
9
  "{\"input\":{\"url\":\"file:///Users/cjcolvar/Documents/Code/samvera/active_encode/spec/fixtures/fireworks.mp4\",\"width\":960.0,\"height\":540.0,\"frame_rate\":29.671,\"duration\":6024,\"file_size\":1629578,\"audio_codec\":\"mp4a-40-2\",\"video_codec\":\"avc1\",\"audio_bitrate\":69737,\"video_bitrate\":2092780,\"created_at\":\"2018-12-17T16:54:50.401-05:00\",\"updated_at\":\"2018-12-17T16:54:50.401-05:00\",\"id\":\"8156\"},\"options\":{},\"id\":\"35efa965-ec51-409d-9495-2ae9669adbcc\",\"output\":[{\"url\":\"file:///Users/cjcolvar/Documents/Code/samvera/active_encode/.internal_test_app/encodes/35efa965-ec51-409d-9495-2ae9669adbcc/outputs/fireworks-low.mp4\",\"label\":\"low\",\"id\":\"8156-low\",\"created_at\":\"2018-12-17T16:54:50.401-05:00\",\"updated_at\":\"2018-12-17T16:54:59.169-05:00\",\"width\":640.0,\"height\":480.0,\"frame_rate\":29.671,\"duration\":6038,\"file_size\":905987,\"audio_codec\":\"mp4a-40-2\",\"video_codec\":\"avc1\",\"audio_bitrate\":72000,\"video_bitrate\":1126859},{\"url\":\"file:///Users/cjcolvar/Documents/Code/samvera/active_encode/.internal_test_app/encodes/35efa965-ec51-409d-9495-2ae9669adbcc/outputs/fireworks-high.mp4\",\"label\":\"high\",\"id\":\"8156-high\",\"created_at\":\"2018-12-17T16:54:50.401-05:00\",\"updated_at\":\"2018-12-17T16:54:59.169-05:00\",\"width\":1280.0,\"height\":720.0,\"frame_rate\":29.671,\"duration\":6038,\"file_size\":2102027,\"audio_codec\":\"mp4a-40-2\",\"video_codec\":\"avc1\",\"audio_bitrate\":72000,\"video_bitrate\":2721866}],\"state\":\"completed\",\"errors\":[],\"created_at\":\"2018-12-17T16:54:50.401-05:00\",\"updated_at\":\"2018-12-17T16:54:59.169-05:00\",\"current_operations\":[],\"percent_complete\":100,\"global_id\":{\"uri\":\"gid://ActiveEncode/Encode/35efa965-ec51-409d-9495-2ae9669adbcc\"}}"
9
10
  end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'aws-sdk'
3
4
  require 'json'
4
5
  require 'shared_specs/engine_adapter_specs'
5
6
 
6
7
  describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
7
- around(:example) do |example|
8
+ around do |example|
8
9
  # Setting this before each test works around a stubbing + memoization limitation
9
10
  ActiveEncode::Base.engine_adapter = :elastic_transcoder
10
11
  example.run
@@ -22,26 +23,27 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
22
23
  let(:created_job) do
23
24
  j = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_created.json'))
24
25
  j.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_generic.json')))
25
- j.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_submitted.json')))]
26
+ j.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_submitted.json')))]
26
27
 
27
28
  client.stub_responses(:create_job, Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j))
28
29
 
29
30
  ActiveEncode::Base.create(
30
- "spec/fixtures/fireworks.mp4",
31
- pipeline_id: "1471963629141-kmcocm",
32
- masterfile_bucket: "BucketName",
33
- output_key_prefix: "elastic-transcoder-samples/output/hls/",
34
- outputs: [{
35
- key: 'hls0400k/' + "e8fe80f5bsomefilesource_bucket7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a",
36
- preset_id: "1351620000001-200050",
37
- segment_duration: "2",
38
- }])
31
+ "spec/fixtures/fireworks.mp4",
32
+ pipeline_id: "1471963629141-kmcocm",
33
+ masterfile_bucket: "BucketName",
34
+ output_key_prefix: "elastic-transcoder-samples/output/hls/",
35
+ outputs: [{
36
+ key: 'hls0400k/' + "e8fe80f5bsomefilesource_bucket7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a",
37
+ preset_id: "1351620000001-200050",
38
+ segment_duration: "2"
39
+ }]
40
+ )
39
41
  end
40
42
 
41
43
  let(:running_job) do
42
44
  j = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_progressing.json'))
43
45
  j.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_progressing.json')))
44
- j.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_progressing.json')))]
46
+ j.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_progressing.json')))]
45
47
 
46
48
  client.stub_responses(:read_job, Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j))
47
49
  ActiveEncode::Base.find('running-id')
@@ -50,7 +52,7 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
50
52
  let(:canceled_job) do
51
53
  j = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_canceled.json'))
52
54
  j.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_generic.json')))
53
- j.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_canceled.json')))]
55
+ j.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_canceled.json')))]
54
56
 
55
57
  client.stub_responses(:read_job, Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j))
56
58
 
@@ -60,11 +62,11 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
60
62
  let(:cancelling_job) do
61
63
  j1 = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_progressing.json'))
62
64
  j1.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_progressing.json')))
63
- j1.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_progressing.json')))]
65
+ j1.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_progressing.json')))]
64
66
 
65
67
  j2 = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_canceled.json'))
66
68
  j2.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_generic.json')))
67
- j2.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_canceled.json')))]
69
+ j2.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_canceled.json')))]
68
70
 
69
71
  client.stub_responses(:read_job, [Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j1), Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j2)])
70
72
 
@@ -78,7 +80,7 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
78
80
  let(:completed_job) do
79
81
  j = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_completed.json'))
80
82
  j.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_completed.json')))
81
- j.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_completed.json')))]
83
+ j.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_completed.json')))]
82
84
 
83
85
  client.stub_responses(:read_job, Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j))
84
86
  ActiveEncode::Base.find('completed-id')
@@ -87,29 +89,28 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
87
89
  let(:failed_job) do
88
90
  j = Aws::ElasticTranscoder::Types::Job.new JSON.parse(File.read('spec/fixtures/elastic_transcoder/job_failed.json'))
89
91
  j.input = Aws::ElasticTranscoder::Types::JobInput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/input_generic.json')))
90
- j.outputs = [ Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_failed.json')))]
92
+ j.outputs = [Aws::ElasticTranscoder::Types::JobOutput.new(JSON.parse(File.read('spec/fixtures/elastic_transcoder/output_failed.json')))]
91
93
 
92
94
  client.stub_responses(:read_job, Aws::ElasticTranscoder::Types::ReadJobResponse.new(job: j))
93
95
  ActiveEncode::Base.find('failed-id')
94
96
  end
95
97
 
96
- let(:completed_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k", :width=>400, :height=>224, :frame_rate=>25, :file_size=>6901104, :duration=>117353 }] }
97
- let(:completed_tech_metadata) { { :width=>1280, :height=>720, :frame_rate=>25, :file_size=>21069678, :duration=>117312 } }
98
+ let(:completed_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k", width: 400, height: 224, frame_rate: 25, file_size: 6_901_104, duration: 117_353 }] }
99
+ let(:completed_tech_metadata) { { width: 1280, height: 720, frame_rate: 25, file_size: 21_069_678, duration: 117_312 } }
98
100
  let(:failed_tech_metadata) { {} }
99
101
 
100
102
  it_behaves_like "an ActiveEncode::EngineAdapter"
101
103
 
102
104
  describe "#create" do
103
- let(:create_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k" }] }
104
-
105
105
  subject { created_job }
106
+ let(:create_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k" }] }
106
107
 
107
108
  it { is_expected.to be_running }
108
109
  its(:current_operations) { is_expected.to be_empty }
109
110
 
110
111
  it 'output has technical metadata' do
111
112
  subject.output.each do |output|
112
- expected_output = create_output.find {|expected_out| expected_out[:id] == output.id }
113
+ expected_output = create_output.find { |expected_out| expected_out[:id] == output.id }
113
114
  expect(output.as_json.symbolize_keys).to include expected_output
114
115
  end
115
116
  end
@@ -117,10 +118,9 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
117
118
 
118
119
  describe "#find" do
119
120
  context "a running encode" do
120
- let(:running_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k" }] }
121
- let(:running_tech_metadata) { {:width=>1280, :height=>720, :frame_rate=>25, :file_size=>21069678, :duration=>117312} }
122
-
123
121
  subject { running_job }
122
+ let(:running_output) { [{ id: "2", url: "s3://BucketName/elastic-transcoder-samples/output/hls/hls0400k/e8fe80f5b7063b12d567b90c0bdf6322116bba11ac458fe9d62921644159fe4a", label: "hls0400k" }] }
123
+ let(:running_tech_metadata) { { width: 1280, height: 720, frame_rate: 25, file_size: 21_069_678, duration: 117_312 } }
124
124
 
125
125
  its(:current_operations) { is_expected.to be_empty }
126
126
 
@@ -130,7 +130,7 @@ describe ActiveEncode::EngineAdapters::ElasticTranscoderAdapter do
130
130
 
131
131
  it 'output has technical metadata' do
132
132
  subject.output.each do |output|
133
- expected_output = running_output.find {|expected_out| expected_out[:id] == output.id }
133
+ expected_output = running_output.find { |expected_out| expected_out[:id] == output.id }
134
134
  expect(output.as_json.symbolize_keys).to include expected_output
135
135
  end
136
136
  end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'shared_specs/engine_adapter_specs'
3
4
 
4
5
  describe ActiveEncode::EngineAdapters::FfmpegAdapter do
5
- around(:example) do |example|
6
+ around do |example|
6
7
  ActiveEncode::Base.engine_adapter = :ffmpeg
7
8
 
8
9
  Dir.mktmpdir do |dir|
@@ -10,7 +11,7 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
10
11
  example.run
11
12
  Dir.foreach(dir) do |e|
12
13
  next if e == "." || e == ".."
13
- FileUtils.rm_rf(File.join(dir,e))
14
+ FileUtils.rm_rf(File.join(dir, e))
14
15
  end
15
16
  end
16
17
 
@@ -18,9 +19,9 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
18
19
  end
19
20
 
20
21
  let!(:work_dir) { stub_const "ActiveEncode::EngineAdapters::FfmpegAdapter::WORK_DIR", @dir }
21
- let(:file) { "file://#{File.absolute_path "spec/fixtures/fireworks.mp4"}" }
22
+ let(:file) { "file://" + Rails.root.join('..', 'spec', 'fixtures', 'fireworks.mp4').to_s }
22
23
  let(:created_job) do
23
- ActiveEncode::Base.create(file, { outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: "mp4"}, { label: "high", ffmpeg_opt: "-s 1280x720", extension: "mp4"}] })
24
+ ActiveEncode::Base.create(file, outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: "mp4" }, { label: "high", ffmpeg_opt: "-s 1280x720", extension: "mp4" }])
24
25
  end
25
26
  let(:running_job) do
26
27
  allow(Process).to receive(:getpgid).and_return 8888
@@ -35,24 +36,27 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
35
36
  end
36
37
  let(:completed_job) { find_encode "completed-id" }
37
38
  let(:failed_job) { find_encode 'failed-id' }
38
- let(:completed_tech_metadata) { {:audio_bitrate => 171030,
39
- :audio_codec => 'mp4a-40-2',
40
- :duration => 6315,
41
- :file_size => 199160,
42
- :frame_rate => 23.719,
43
- :height => 110.0,
44
- :id => "99999",
45
- :url => "/home/pdinh/Downloads/videoshort.mp4",
46
- :video_bitrate => 74477,
47
- :video_codec => 'avc1',
48
- :width => 200.0
49
- } }
39
+ let(:completed_tech_metadata) do
40
+ {
41
+ audio_bitrate: 171_030,
42
+ audio_codec: 'mp4a-40-2',
43
+ duration: 6315,
44
+ file_size: 199_160,
45
+ frame_rate: 23.719,
46
+ height: 110.0,
47
+ id: "99999",
48
+ url: "/home/pdinh/Downloads/videoshort.mp4",
49
+ video_bitrate: 74_477,
50
+ video_codec: 'avc1',
51
+ width: 200.0
52
+ }
53
+ end
50
54
  let(:completed_output) { [{ id: "99999" }] }
51
- let(:failed_tech_metadata) { { } }
55
+ let(:failed_tech_metadata) { {} }
52
56
 
53
57
  it_behaves_like "an ActiveEncode::EngineAdapter"
54
58
 
55
- def find_encode id
59
+ def find_encode(id)
56
60
  # Precreate ffmpeg output directory and files
57
61
  FileUtils.copy_entry "spec/fixtures/ffmpeg/#{id}", "#{work_dir}/#{id}"
58
62
 
@@ -61,7 +65,7 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
61
65
  FileUtils.touch "#{work_dir}/#{id}/progress"
62
66
  FileUtils.touch Dir.glob("#{work_dir}/#{id}/*.mp4")
63
67
 
64
- # # Stub out system calls
68
+ # Stub out system calls
65
69
  allow_any_instance_of(ActiveEncode::EngineAdapters::FfmpegAdapter).to receive(:`).and_return(1234)
66
70
 
67
71
  ActiveEncode::Base.find(id)
@@ -86,7 +90,7 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
86
90
 
87
91
  context "input file doesn't exist" do
88
92
  let(:missing_file) { "file:///a_bogus_file.mp4" }
89
- let(:missing_job) { ActiveEncode::Base.create(missing_file, { outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: 'mp4' }]}) }
93
+ let(:missing_job) { ActiveEncode::Base.create(missing_file, outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: 'mp4' }]) }
90
94
 
91
95
  it "returns the encode with correct error" do
92
96
  expect(missing_job.errors).to include("#{missing_file} does not exist or is not accessible")
@@ -95,8 +99,8 @@ describe ActiveEncode::EngineAdapters::FfmpegAdapter do
95
99
  end
96
100
 
97
101
  context "input file is not media" do
98
- let(:nonmedia_file) { "file://#{File.absolute_path "spec/integration/ffmpeg_adapter_spec.rb"}" }
99
- let(:nonmedia_job) { ActiveEncode::Base.create(nonmedia_file, { outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: 'mp4' }]}) }
102
+ let(:nonmedia_file) { "file://" + Rails.root.join('Gemfile').to_s }
103
+ let(:nonmedia_job) { ActiveEncode::Base.create(nonmedia_file, outputs: [{ label: "low", ffmpeg_opt: "-s 640x480", extension: 'mp4' }]) }
100
104
 
101
105
  it "returns the encode with correct error" do
102
106
  expect(nonmedia_job.errors).to include("Error inspecting input: #{nonmedia_file}")
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'rubyhorn'
3
4
  require 'shared_specs/engine_adapter_specs'
@@ -26,13 +27,13 @@ describe ActiveEncode::EngineAdapters::MatterhornAdapter do
26
27
  let(:created_job) { ActiveEncode::Base.create(file) }
27
28
  let(:running_job) { ActiveEncode::Base.find('running-id') }
28
29
  let(:canceled_job) { ActiveEncode::Base.find('cancelled-id') }
29
- let(:cancelling_job) { ActiveEncode::Base.find('running-id')}
30
+ let(:cancelling_job) { ActiveEncode::Base.find('running-id') }
30
31
  let(:completed_job) { ActiveEncode::Base.find('completed-id') }
31
32
  let(:failed_job) { ActiveEncode::Base.find('failed-id') }
32
33
 
33
- let(:completed_output) { [{ id: "track-7", checksum: "77de9765545ef63d2c21f7557ead6176", duration: 6337, audio_codec: "AAC", audio_bitrate: 76502.0, video_codec: "AVC", video_bitrate: 2000000.0, frame_rate: 30.0, width: 1308, height: 720, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/b09c765f-b64e-4725-a863-736af66b688c/videoshort.mp4", label: "quality-high" }, { id: "track-8", checksum: "10e13cf51bf8a973011eec6a17ea47ff", duration: 6337, audio_codec: "AAC", audio_bitrate: 76502.0, video_codec: "AVC", video_bitrate: 500000.0, frame_rate: 30.0, width: 654, height: 360, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/8d5cd8a9-ad0e-484a-96f0-05e26a84a8f0/videoshort.mp4", label: "quality-low" }, { id: "track-9", checksum: "f2b16a2606dc76cb53c7017f0e166204", duration: 6337, audio_codec: "AAC", audio_bitrate: 76502.0, video_codec: "AVC", video_bitrate: 1000000.0, frame_rate: 30.0, width: 872, height: 480, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/0f81d426-0e26-4496-8f58-c675c86e6f4e/videoshort.mp4", label: "quality-medium" }] }
34
- let(:completed_tech_metadata) { { } }
35
- let(:failed_tech_metadata) { { checksum: "7ae24368ccb7a6c6422a14ff73f33c9a", duration: 6314, audio_codec: "AAC", audio_bitrate: 171030.0, video_codec: "AVC", video_bitrate: 74477.0, frame_rate: 23.719, width: 200, height: 110 } }
34
+ let(:completed_output) { [{ id: "track-7", checksum: "77de9765545ef63d2c21f7557ead6176", duration: 6337, audio_codec: "AAC", audio_bitrate: 76_502.0, video_codec: "AVC", video_bitrate: 2_000_000.0, frame_rate: 30.0, width: 1308, height: 720, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/b09c765f-b64e-4725-a863-736af66b688c/videoshort.mp4", label: "quality-high" }, { id: "track-8", checksum: "10e13cf51bf8a973011eec6a17ea47ff", duration: 6337, audio_codec: "AAC", audio_bitrate: 76_502.0, video_codec: "AVC", video_bitrate: 500_000.0, frame_rate: 30.0, width: 654, height: 360, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/8d5cd8a9-ad0e-484a-96f0-05e26a84a8f0/videoshort.mp4", label: "quality-low" }, { id: "track-9", checksum: "f2b16a2606dc76cb53c7017f0e166204", duration: 6337, audio_codec: "AAC", audio_bitrate: 76_502.0, video_codec: "AVC", video_bitrate: 1_000_000.0, frame_rate: 30.0, width: 872, height: 480, url: "file:///home/cjcolvar/Code/avalon/avalon/red5/webapps/avalon/streams/f564d9de-9c35-4b74-95f0-f3013f32cc1a/0f81d426-0e26-4496-8f58-c675c86e6f4e/videoshort.mp4", label: "quality-medium" }] }
35
+ let(:completed_tech_metadata) { {} }
36
+ let(:failed_tech_metadata) { { checksum: "7ae24368ccb7a6c6422a14ff73f33c9a", duration: 6314, audio_codec: "AAC", audio_bitrate: 171_030.0, video_codec: "AVC", video_bitrate: 74_477.0, frame_rate: 23.719, width: 200, height: 110 } }
36
37
  let(:failed_errors) { "org.opencastproject.workflow.api.WorkflowOperationException: org.opencastproject.workflow.api.WorkflowOperationException: One of the encoding jobs did not complete successfully" }
37
38
 
38
39
  # Enforce generic behavior
@@ -92,8 +93,8 @@ describe ActiveEncode::EngineAdapters::MatterhornAdapter do
92
93
  end
93
94
 
94
95
  describe "#cancel!" do
95
- let(:encode) { ActiveEncode::Base.create(file) }
96
96
  subject { encode.cancel! }
97
+ let(:encode) { ActiveEncode::Base.create(file) }
97
98
 
98
99
  it { is_expected.to be_a ActiveEncode::Base }
99
100
  its(:id) { is_expected.to eq 'cancelled-id' }
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'zencoder'
3
4
  require 'json'
@@ -24,11 +25,11 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
24
25
  allow(Zencoder::Job).to receive(:progress).and_return(progress_response)
25
26
  end
26
27
 
28
+ subject { ActiveEncode::Base.create(file) }
27
29
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_create.json'))) }
28
30
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_create.json'))) }
29
31
  let(:create_output) { [{ id: "511404522", url: "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/o/20150610/c09b61e4d130ddf923f0653418a80b9c/399ae101c3f99b4f318635e78a4e587a.mp4?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=GY/9LMkQAiDOrMQwS5BkmOE200s%3D&Expires=1434033527", label: nil }] }
30
32
 
31
- subject { ActiveEncode::Base.create(file) }
32
33
  it { is_expected.to be_a ActiveEncode::Base }
33
34
  its(:id) { is_expected.not_to be_empty }
34
35
  it { is_expected.to be_running }
@@ -61,8 +62,8 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
61
62
  end
62
63
 
63
64
  context 'output' do
64
- let(:output) { ActiveEncode::Base.find('166019107').reload.output }
65
65
  subject { output.first }
66
+ let(:output) { ActiveEncode::Base.find('166019107').reload.output }
66
67
 
67
68
  it 'is an array' do
68
69
  expect(output).to be_a Array
@@ -94,12 +95,12 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
94
95
  end
95
96
 
96
97
  context "a running encode" do
98
+ subject { ActiveEncode::Base.find('166019107') }
97
99
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_running.json'))) }
98
100
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_running.json'))) }
99
101
  # let(:running_output) { [{ id: "510582971", url: "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/o/20150609/48a6907086c012f68b9ca43461280515/1726d7ec3e24f2171bd07b2abb807b6c.mp4?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=vSvlxU94wlQLEbpG3Zs8ibp4MoY%3D&Expires=1433953106", label: nil }] }
100
102
  # let(:running_tech_metadata) { { audio_bitrate: "52", audio_codec: "aac", audio_channels: "2", duration: "57992", mime_type: "mpeg4", video_framerate: "29.97", height: "240", video_bitrate: "535", video_codec: "h264", width: "320" } }
101
103
 
102
- subject { ActiveEncode::Base.find('166019107') }
103
104
  it { is_expected.to be_a ActiveEncode::Base }
104
105
  its(:id) { is_expected.to eq '166019107' }
105
106
  it { is_expected.to be_running }
@@ -120,7 +121,7 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
120
121
  its(:width) { is_expected.to eq 320 }
121
122
  its(:height) { is_expected.to eq 240 }
122
123
  its(:frame_rate) { is_expected.to eq 29.97 }
123
- its(:duration) { is_expected.to eq 57992 }
124
+ its(:duration) { is_expected.to eq 57_992 }
124
125
  its(:file_size) { is_expected.to be_blank }
125
126
  its(:checksum) { is_expected.to be_blank }
126
127
  its(:audio_codec) { is_expected.to eq "aac" }
@@ -133,8 +134,8 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
133
134
  end
134
135
 
135
136
  context 'output' do
136
- let(:output) { ActiveEncode::Base.find('166019107').output }
137
137
  subject { output.first }
138
+ let(:output) { ActiveEncode::Base.find('166019107').output }
138
139
 
139
140
  it 'is an array' do
140
141
  expect(output).to be_a Array
@@ -160,10 +161,10 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
160
161
  end
161
162
 
162
163
  context "a cancelled encode" do
164
+ subject { ActiveEncode::Base.find('165866551') }
163
165
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_cancelled.json'))) }
164
166
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_cancelled.json'))) }
165
167
 
166
- subject { ActiveEncode::Base.find('165866551') }
167
168
  it { is_expected.to be_a ActiveEncode::Base }
168
169
  its(:id) { is_expected.to eq '165866551' }
169
170
  it { is_expected.to be_cancelled }
@@ -196,12 +197,12 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
196
197
  end
197
198
 
198
199
  context "a completed encode" do
200
+ subject { ActiveEncode::Base.find('165839139') }
199
201
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_completed.json'))) }
200
202
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_completed.json'))) }
201
203
  let(:completed_output) { { id: "509856876", audio_bitrate: "53", audio_codec: "aac", audio_channels: "2", duration: "5000", mime_type: "mpeg4", video_framerate: "29.97", height: "240", video_bitrate: "549", video_codec: "h264", width: "320", url: "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/o/20150608/ebbe865f8ef1b960d7c2bb0663b88a12/0f1948dcb2fd701fba30ff21908fe460.mp4?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=1LgIyl/el9E7zeyPxzd/%2BNwez6Y%3D&Expires=1433873646", label: nil } }
202
204
  # let(:completed_tech_metadata) { { audio_bitrate: "52", audio_codec: "aac", audio_channels: "2", duration: "57992", mime_type: "mpeg4", video_framerate: "29.97", height: "240", video_bitrate: "535", video_codec: "h264", width: "320" } }
203
205
 
204
- subject { ActiveEncode::Base.find('165839139') }
205
206
  it { is_expected.to be_a ActiveEncode::Base }
206
207
  its(:id) { is_expected.to eq '165839139' }
207
208
  it { is_expected.to be_completed }
@@ -221,7 +222,7 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
221
222
  its(:width) { is_expected.to eq 320 }
222
223
  its(:height) { is_expected.to eq 240 }
223
224
  its(:frame_rate) { is_expected.to eq 29.97 }
224
- its(:duration) { is_expected.to eq 57992 }
225
+ its(:duration) { is_expected.to eq 57_992 }
225
226
  its(:file_size) { is_expected.to be_blank }
226
227
  its(:checksum) { is_expected.to be_blank }
227
228
  its(:audio_codec) { is_expected.to eq "aac" }
@@ -234,8 +235,8 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
234
235
  end
235
236
 
236
237
  context 'output' do
237
- let(:output) { ActiveEncode::Base.find('166019107').reload.output }
238
238
  subject { output.first }
239
+ let(:output) { ActiveEncode::Base.find('166019107').reload.output }
239
240
 
240
241
  it 'is an array' do
241
242
  expect(output).to be_a Array
@@ -261,12 +262,12 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
261
262
  end
262
263
 
263
264
  context "a failed encode" do
265
+ subject { ActiveEncode::Base.find('166079902') }
264
266
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_failed.json'))) }
265
267
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_failed.json'))) }
266
268
  let(:failed_tech_metadata) { { mime_type: "video/mp4", checksum: "7ae24368ccb7a6c6422a14ff73f33c9a", duration: "6314", audio_codec: "AAC", audio_channels: "2", audio_bitrate: "171030.0", video_codec: "AVC", video_bitrate: "74477.0", video_framerate: "23.719", width: "200", height: "110" } }
267
269
  let(:failed_errors) { "The file is an XML file, and doesn't contain audio or video tracks." }
268
270
 
269
- subject { ActiveEncode::Base.find('166079902') }
270
271
  it { is_expected.to be_a ActiveEncode::Base }
271
272
  its(:id) { is_expected.to eq '166079902' }
272
273
  it { is_expected.to be_failed }
@@ -307,12 +308,12 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
307
308
  allow(Zencoder::Job).to receive(:progress).and_return(progress_response)
308
309
  end
309
310
 
311
+ subject { encode.cancel! }
310
312
  let(:cancel_response) { Zencoder::Response.new(code: 200) } # TODO: check that this is the correct response code for a successful cancel
311
313
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_cancelled.json'))) }
312
314
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_cancelled.json'))) }
313
315
 
314
316
  let(:encode) { ActiveEncode::Base.create(file) }
315
- subject { encode.cancel! }
316
317
  it { is_expected.to be_a ActiveEncode::Base }
317
318
  its(:id) { is_expected.to eq '165866551' }
318
319
  it { is_expected.to be_cancelled }
@@ -324,12 +325,12 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
324
325
  allow(Zencoder::Job).to receive(:progress).and_return(progress_response)
325
326
  end
326
327
 
328
+ subject { ActiveEncode::Base.find('166019107').reload }
327
329
  let(:details_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_details_running.json'))) }
328
330
  let(:progress_response) { Zencoder::Response.new(body: JSON.parse(File.read('spec/fixtures/zencoder/job_progress_running.json'))) }
329
331
  # let(:reload_output) { [{ id: "510582971", url: "https://zencoder-temp-storage-us-east-1.s3.amazonaws.com/o/20150609/48a6907086c012f68b9ca43461280515/1726d7ec3e24f2171bd07b2abb807b6c.mp4?AWSAccessKeyId=AKIAI456JQ76GBU7FECA&Signature=vSvlxU94wlQLEbpG3Zs8ibp4MoY%3D&Expires=1433953106", label: nil }] }
330
332
  # let(:reload_tech_metadata) { { audio_bitrate: "52", audio_codec: "aac", audio_channels: "2", duration: "57992", mime_type: "mpeg4", video_framerate: "29.97", height: "240", video_bitrate: "535", video_codec: "h264", width: "320" } }
331
333
 
332
- subject { ActiveEncode::Base.find('166019107').reload }
333
334
  it { is_expected.to be_a ActiveEncode::Base }
334
335
  its(:id) { is_expected.to eq '166019107' }
335
336
  it { is_expected.to be_running }
@@ -349,7 +350,7 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
349
350
  its(:width) { is_expected.to eq 320 }
350
351
  its(:height) { is_expected.to eq 240 }
351
352
  its(:frame_rate) { is_expected.to eq 29.97 }
352
- its(:duration) { is_expected.to eq 57992 }
353
+ its(:duration) { is_expected.to eq 57_992 }
353
354
  its(:file_size) { is_expected.to be_blank }
354
355
  its(:checksum) { is_expected.to be_blank }
355
356
  its(:audio_codec) { is_expected.to eq "aac" }
@@ -362,8 +363,8 @@ describe ActiveEncode::EngineAdapters::ZencoderAdapter do
362
363
  end
363
364
 
364
365
  context 'output' do
365
- let(:output) { ActiveEncode::Base.find('166019107').reload.output }
366
366
  subject { output.first }
367
+ let(:output) { ActiveEncode::Base.find('166019107').reload.output }
367
368
 
368
369
  it 'is an array' do
369
370
  expect(output).to be_a Array
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  require 'engine_cart'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'rails_helper'
2
3
 
3
4
  describe ActiveEncode::EncodeRecordController, type: :routing do