activejob-ffmpeg 0.0.3
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 +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +11 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +48 -0
- data/Rakefile +6 -0
- data/activejob-ffmpeg.gemspec +27 -0
- data/ci/install_ffmpeg +5 -0
- data/lib/active_job/ffmpeg.rb +41 -0
- data/lib/active_job/ffmpeg/base_job.rb +25 -0
- data/lib/active_job/ffmpeg/encoder/base.rb +93 -0
- data/lib/active_job/ffmpeg/encoder/mp4.rb +50 -0
- data/lib/active_job/ffmpeg/encoder/webm.rb +29 -0
- data/lib/active_job/ffmpeg/version.rb +5 -0
- data/lib/activejob-ffmpeg.rb +1 -0
- data/spec/lib/activejob-ffmpet_spec.rb +133 -0
- data/spec/samples/hoge's title.mp4 +0 -0
- data/spec/samples/sample.mp4 +0 -0
- data/spec/samples/sample_16_9.mp4 +0 -0
- data/spec/spec_helper.rb +18 -0
- metadata +154 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bedb71118c02a03d503b94b2c8faa4d64ed3375a
|
4
|
+
data.tar.gz: ec15cebf580764607e8eaa38b5ccece91554d21a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 139c562453808334ae8310cd0ade7998a28c625415dfcf9ca3bdf9703086e5bc8548a785c04bc6edd1aebf33d555726f9efd4b264d7ae454803ab810033a889e
|
7
|
+
data.tar.gz: 7f26c2a3d8906934d30b7b2c7d41f38455a1374ae0c011424f68b1a52808df51f7e2b02e58a63bd8759fae47e5feea03c3a40d1a7d19c078f3eeffe336dd0861
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 joker1007
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# ActiveJob::Ffmpeg
|
2
|
+
[](http://badge.fury.io/rb/activejob-ffmpeg)
|
3
|
+
[](https://travis-ci.org/joker1007/activejob-ffmpeg)
|
4
|
+
[](https://coveralls.io/r/joker1007/activejob-ffmpeg)
|
5
|
+
|
6
|
+
ActiveJob job definition for ffmpeg.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
gem install:
|
10
|
+
|
11
|
+
$ gem install activejob-ffmpeg
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
gem 'activejob-ffmpeg', github: "joker1007/activejob-ffmpeg"
|
16
|
+
|
17
|
+
And then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
class EncodeJob < ActiveJob::Ffmpeg::BaseJob
|
25
|
+
def on_progress(progress, extra_data = {})
|
26
|
+
p progress
|
27
|
+
end
|
28
|
+
|
29
|
+
def on_complete(encoder, extra_data = {})
|
30
|
+
puts "complete"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
EncodeJob.perform_later(input_filename, output_filename, extra_data, :mp4)
|
35
|
+
```
|
36
|
+
|
37
|
+
Implemented Encoder class is following:
|
38
|
+
|
39
|
+
- mp4
|
40
|
+
- WebM
|
41
|
+
|
42
|
+
## Contributing
|
43
|
+
|
44
|
+
1. Fork it ( https://github.com/[my-github-username]/activejob-ffmpeg/fork )
|
45
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
46
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
47
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
48
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'active_job/ffmpeg/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "activejob-ffmpeg"
|
8
|
+
spec.version = ActiveJob::Ffmpeg::VERSION
|
9
|
+
spec.authors = ["joker1007"]
|
10
|
+
spec.email = ["kakyoin.hierophant@gmail.com"]
|
11
|
+
spec.description = %q{easier way to use ffmpeg in activejob}
|
12
|
+
spec.summary = %q{easier way to use ffmpeg in activejob}
|
13
|
+
spec.homepage = "https://github.com/joker1007/activejob-ffmpeg"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "activejob", ">= 4.2.0.rc3"
|
22
|
+
spec.add_development_dependency "bundler", ">= 1.5"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "tapp"
|
26
|
+
spec.add_development_dependency "coveralls"
|
27
|
+
end
|
data/ci/install_ffmpeg
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require "active_job/ffmpeg/version"
|
2
|
+
|
3
|
+
module ActiveJob
|
4
|
+
module Ffmpeg
|
5
|
+
|
6
|
+
autoload :BaseJob, "#{File.dirname(__FILE__)}/ffmpeg/base_job"
|
7
|
+
|
8
|
+
module Encoder
|
9
|
+
autoload :Base, "#{File.dirname(__FILE__)}/ffmpeg/encoder/base"
|
10
|
+
autoload :MP4, "#{File.dirname(__FILE__)}/ffmpeg/encoder/mp4"
|
11
|
+
autoload :WebM, "#{File.dirname(__FILE__)}/ffmpeg/encoder/webm"
|
12
|
+
end
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def logger
|
16
|
+
@logger ||= Logger.new($stdout)
|
17
|
+
end
|
18
|
+
|
19
|
+
def logger=(logger)
|
20
|
+
@logger = logger
|
21
|
+
end
|
22
|
+
|
23
|
+
def ffmpeg_cmd
|
24
|
+
ENV["FFMPEG"] || "ffmpeg"
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_aspect(filename)
|
28
|
+
return nil unless filename
|
29
|
+
|
30
|
+
aspect = nil
|
31
|
+
ffmpeg = IO.popen("#{ffmpeg_cmd} -i #{filename.shellescape} 2>&1")
|
32
|
+
ffmpeg.each("\r") do |line|
|
33
|
+
if line =~ /Stream.*Video.*, (\d+)x(\d+)[,\s]/
|
34
|
+
aspect = "#{$1}/#{$2}".to_r
|
35
|
+
end
|
36
|
+
end
|
37
|
+
aspect
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_job'
|
2
|
+
require 'active_support/core_ext/hash'
|
3
|
+
|
4
|
+
module ActiveJob
|
5
|
+
module Ffmpeg
|
6
|
+
class BaseJob < ActiveJob::Base
|
7
|
+
def perform(input_filename, output_filename, extra_data = {}, format = :mp4)
|
8
|
+
case format.to_s
|
9
|
+
when "mp4"
|
10
|
+
encoder = Encoder::MP4.new
|
11
|
+
when "webm"
|
12
|
+
encoder = Encoder::WebM.new
|
13
|
+
end
|
14
|
+
|
15
|
+
encoder.on_progress = Proc.new {|progress| on_progress(progress, extra_data)} \
|
16
|
+
if respond_to?(:on_progress)
|
17
|
+
|
18
|
+
encoder.on_complete = Proc.new {|enc| on_complete(enc, extra_data)} \
|
19
|
+
if respond_to?(:on_complete)
|
20
|
+
|
21
|
+
encoder.do_encode(input_filename, output_filename)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
require "open3"
|
3
|
+
|
4
|
+
module ActiveJob
|
5
|
+
module Ffmpeg
|
6
|
+
module Encoder
|
7
|
+
class Base
|
8
|
+
attr_reader :size, :video_bitrate, :audio_bitrate, :audio_sample_rate, :other_options
|
9
|
+
attr_reader :input_filename, :output_filename
|
10
|
+
attr_reader :on_progress, :on_complete
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
raise ArgumentError unless options.is_a?(Hash)
|
14
|
+
merged_options = preset_options.merge(options)
|
15
|
+
@size = merged_options[:size]
|
16
|
+
@aspect = merged_options[:aspect]
|
17
|
+
@video_bitrate = merged_options[:video_bitrate]
|
18
|
+
@audio_bitrate = merged_options[:audio_bitrate]
|
19
|
+
@audio_sample_rate = merged_options[:audio_sample_rate]
|
20
|
+
@other_options = merged_options[:other_options]
|
21
|
+
end
|
22
|
+
|
23
|
+
def preset_options
|
24
|
+
{}
|
25
|
+
end
|
26
|
+
|
27
|
+
def format
|
28
|
+
raise NotImplementedError
|
29
|
+
end
|
30
|
+
|
31
|
+
def vcodec
|
32
|
+
raise NotImplementedError
|
33
|
+
end
|
34
|
+
|
35
|
+
def acodec
|
36
|
+
raise NotImplementedError
|
37
|
+
end
|
38
|
+
|
39
|
+
def aspect(filename = nil)
|
40
|
+
@aspect || Ffmpeg.get_aspect(filename)
|
41
|
+
end
|
42
|
+
|
43
|
+
def on_progress=(progress_proc)
|
44
|
+
raise ArgumentError unless progress_proc.is_a?(Proc)
|
45
|
+
@on_progress = progress_proc
|
46
|
+
end
|
47
|
+
|
48
|
+
def on_complete=(complete_proc)
|
49
|
+
raise ArgumentError unless complete_proc.is_a?(Proc)
|
50
|
+
@on_complete = complete_proc
|
51
|
+
end
|
52
|
+
|
53
|
+
def do_encode(input, output)
|
54
|
+
@input_filename = input
|
55
|
+
@output_filename = output
|
56
|
+
cmd = %W(#{Ffmpeg.ffmpeg_cmd} -y -i #{@input_filename} -f #{format} -s #{size} -aspect #{aspect(@input_filename)} -vcodec #{vcodec} -b:v #{video_bitrate} -acodec #{acodec} -ar #{audio_sample_rate} -b:a #{audio_bitrate})
|
57
|
+
cmd.concat(other_options.split(" "))
|
58
|
+
cmd.reject!(&:empty?)
|
59
|
+
cmd << @output_filename
|
60
|
+
|
61
|
+
if ENV["DEBUG"]
|
62
|
+
Ffmpeg.logger.debug(cmd.map(&:shellescape).join(" "))
|
63
|
+
end
|
64
|
+
|
65
|
+
duration = nil
|
66
|
+
time = nil
|
67
|
+
progress = nil
|
68
|
+
|
69
|
+
Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_th|
|
70
|
+
while line = stderr.gets("\r")
|
71
|
+
if line =~ /Duration:(\s.?(\d*):(\d*):(\d*)\.(\d*))/
|
72
|
+
duration = $2.to_i * 3600 + $3.to_i * 60 + $4.to_i
|
73
|
+
end
|
74
|
+
|
75
|
+
if line =~ /frame=.*time=(\s*(\d*):(\d*):(\d*)\.(\d*))/
|
76
|
+
time = $2.to_i * 3600 + $3.to_i * 60 + $4.to_i
|
77
|
+
end
|
78
|
+
|
79
|
+
if duration && time
|
80
|
+
progress = (time / duration.to_f)
|
81
|
+
on_progress.call(progress) if on_progress
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
wait_th.join
|
86
|
+
end
|
87
|
+
|
88
|
+
on_complete.call(self) if on_complete
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module ActiveJob
|
2
|
+
module Ffmpeg
|
3
|
+
module Encoder
|
4
|
+
class MP4 < Base
|
5
|
+
def initialize(options = {})
|
6
|
+
super
|
7
|
+
@acodec = options[:acodec] || acodec_select
|
8
|
+
end
|
9
|
+
|
10
|
+
def preset_options
|
11
|
+
{
|
12
|
+
:size => "640x480",
|
13
|
+
:video_bitrate => "600k",
|
14
|
+
:audio_bitrate => "128k",
|
15
|
+
:audio_sample_rate => 44100,
|
16
|
+
:other_options => "-partitions all -me_method hex -subq 6 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -maxrate 1000 -level 30 -async 2#{acodec_select == "libfdk_aac" ? " -cutoff 18000" : ""}"
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def vcodec
|
21
|
+
"libx264"
|
22
|
+
end
|
23
|
+
|
24
|
+
def acodec
|
25
|
+
@acodec
|
26
|
+
end
|
27
|
+
|
28
|
+
def format
|
29
|
+
"mp4"
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def acodec_select
|
35
|
+
return @acodec if @acodec
|
36
|
+
@acodec = case `#{Ffmpeg.ffmpeg_cmd} -v quiet -codecs | grep aac`
|
37
|
+
when /libfdk_aac/
|
38
|
+
"libfdk_aac"
|
39
|
+
when /libfaac/
|
40
|
+
"libfaac"
|
41
|
+
when /aac/
|
42
|
+
"aac"
|
43
|
+
when /libvo_aacenc/
|
44
|
+
"libvo_aacenc"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveJob
|
2
|
+
module Ffmpeg
|
3
|
+
module Encoder
|
4
|
+
class WebM < Base
|
5
|
+
def preset_options
|
6
|
+
{
|
7
|
+
:size => "640x480",
|
8
|
+
:video_bitrate => "600k",
|
9
|
+
:audio_bitrate => "128k",
|
10
|
+
:audio_sample_rate => 44100,
|
11
|
+
:other_options => "-aq 3 -partitions all -me_method hex -subq 6 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -async 2"
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def vcodec
|
16
|
+
"libvpx"
|
17
|
+
end
|
18
|
+
|
19
|
+
def acodec
|
20
|
+
"libvorbis"
|
21
|
+
end
|
22
|
+
|
23
|
+
def format
|
24
|
+
"webm"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "active_job/ffmpeg"
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ActiveJob::Ffmpeg do
|
4
|
+
describe ".get_aspect" do
|
5
|
+
subject { ActiveJob::Ffmpeg.get_aspect("#{sample_dir}/sample_16_9.mp4") }
|
6
|
+
|
7
|
+
it { should eq "16/9".to_r }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#do_encode" do
|
11
|
+
context "MP4" do
|
12
|
+
subject(:encoder) { ActiveJob::Ffmpeg::Encoder::MP4.new }
|
13
|
+
|
14
|
+
describe "on_progress callback" do
|
15
|
+
before do
|
16
|
+
encoder.on_progress = Proc.new {|progress| true }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "on_progress receive call" do
|
20
|
+
expect(encoder.on_progress).to receive(:call).with(an_instance_of(Float)).at_least(4).and_call_original
|
21
|
+
encoder.do_encode("#{sample_dir}/sample.mp4", "#{sample_dir}/output.mp4")
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "shellescape" do
|
25
|
+
it "on_progress receive call" do
|
26
|
+
expect(encoder.on_progress).to receive(:call).with(an_instance_of(Float)).at_least(4).and_call_original
|
27
|
+
encoder.do_encode("#{sample_dir}/hoge's title.mp4", "#{sample_dir}/output.mp4")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "on_complete callback" do
|
33
|
+
before do
|
34
|
+
encoder.on_complete = Proc.new {|encoder| true }
|
35
|
+
end
|
36
|
+
|
37
|
+
it "on_complete receive call" do
|
38
|
+
expect(encoder.on_complete).to receive(:call).with(encoder).once
|
39
|
+
encoder.do_encode("#{sample_dir}/sample.mp4", "#{sample_dir}/output.mp4")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "debug log" do
|
44
|
+
before do
|
45
|
+
ENV["DEBUG"] = "1"
|
46
|
+
expect(ActiveJob::Ffmpeg.logger).to be_a(Logger)
|
47
|
+
end
|
48
|
+
|
49
|
+
after do
|
50
|
+
ENV["DEBUG"] = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should call logger.debug" do
|
54
|
+
expect(ActiveJob::Ffmpeg.logger).to receive(:debug)
|
55
|
+
encoder.do_encode("#{sample_dir}/sample.mp4", "#{sample_dir}/output.mp4")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "WebM" do
|
61
|
+
subject(:encoder) { ActiveJob::Ffmpeg::Encoder::WebM.new }
|
62
|
+
|
63
|
+
describe "on_progress callback" do
|
64
|
+
before do
|
65
|
+
encoder.on_progress = Proc.new {|progress| true }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "on_progress receive call" do
|
69
|
+
expect(encoder.on_progress).to receive(:call).with(an_instance_of(Float)).at_least(4)
|
70
|
+
encoder.do_encode("#{sample_dir}/sample.mp4", "#{sample_dir}/output.webm")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "on_complete callback" do
|
75
|
+
before do
|
76
|
+
encoder.on_complete = Proc.new {|encoder| true }
|
77
|
+
end
|
78
|
+
|
79
|
+
it "on_complete receive call" do
|
80
|
+
expect(encoder.on_complete).to receive(:call).with(encoder).once
|
81
|
+
encoder.do_encode("#{sample_dir}/sample.mp4", "#{sample_dir}/output.webm")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe ActiveJob::Ffmpeg::BaseJob do
|
89
|
+
context "When job is performed" do
|
90
|
+
class ::TestJob < ActiveJob::Ffmpeg::BaseJob
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should receive do_encode" do
|
94
|
+
input_filename = "#{sample_dir}/sample.mp4"
|
95
|
+
output_filename = "#{sample_dir}/output.mp4"
|
96
|
+
expect_any_instance_of(ActiveJob::Ffmpeg::Encoder::MP4).to receive(:do_encode).with(input_filename, output_filename).once
|
97
|
+
TestJob.perform_later(input_filename, output_filename)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "Job class has on_progress method" do
|
102
|
+
class ProgressJob < ActiveJob::Ffmpeg::BaseJob
|
103
|
+
|
104
|
+
def on_progress(progress, extra_data = {})
|
105
|
+
true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should receive on_progress" do
|
110
|
+
input_filename = "#{sample_dir}/sample.mp4"
|
111
|
+
output_filename = "#{sample_dir}/output.mp4"
|
112
|
+
expect_any_instance_of(ProgressJob).to receive(:on_progress).with(an_instance_of(Float), {}).at_least(4)
|
113
|
+
ProgressJob.perform_later(input_filename, output_filename)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "Job class has on_complete method" do
|
118
|
+
class CompleteJob < ActiveJob::Ffmpeg::BaseJob
|
119
|
+
|
120
|
+
def on_complete(encoder, extra_data = {})
|
121
|
+
true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should receive on_complete" do
|
126
|
+
input_filename = "#{sample_dir}/sample.mp4"
|
127
|
+
output_filename = "#{sample_dir}/output.mp4"
|
128
|
+
expect_any_instance_of(CompleteJob).to receive(:on_complete).with(an_instance_of(ActiveJob::Ffmpeg::Encoder::MP4), {"id" => 1}).once
|
129
|
+
CompleteJob.perform_later(input_filename, output_filename, {"id" => 1})
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
Binary file
|
Binary file
|
Binary file
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
4
|
+
|
5
|
+
require 'active_job'
|
6
|
+
require 'active_job/ffmpeg'
|
7
|
+
|
8
|
+
require 'tapp'
|
9
|
+
|
10
|
+
$spec_dir = File.dirname(File.expand_path(__FILE__))
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
config.order = :random
|
14
|
+
end
|
15
|
+
|
16
|
+
def sample_dir
|
17
|
+
File.expand_path("../samples", __FILE__)
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activejob-ffmpeg
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- joker1007
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activejob
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.2.0.rc3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.2.0.rc3
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.5'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tapp
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coveralls
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: easier way to use ffmpeg in activejob
|
98
|
+
email:
|
99
|
+
- kakyoin.hierophant@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rspec"
|
106
|
+
- ".travis.yml"
|
107
|
+
- Gemfile
|
108
|
+
- LICENSE.txt
|
109
|
+
- README.md
|
110
|
+
- Rakefile
|
111
|
+
- activejob-ffmpeg.gemspec
|
112
|
+
- ci/install_ffmpeg
|
113
|
+
- lib/active_job/ffmpeg.rb
|
114
|
+
- lib/active_job/ffmpeg/base_job.rb
|
115
|
+
- lib/active_job/ffmpeg/encoder/base.rb
|
116
|
+
- lib/active_job/ffmpeg/encoder/mp4.rb
|
117
|
+
- lib/active_job/ffmpeg/encoder/webm.rb
|
118
|
+
- lib/active_job/ffmpeg/version.rb
|
119
|
+
- lib/activejob-ffmpeg.rb
|
120
|
+
- spec/lib/activejob-ffmpet_spec.rb
|
121
|
+
- spec/samples/hoge's title.mp4
|
122
|
+
- spec/samples/sample.mp4
|
123
|
+
- spec/samples/sample_16_9.mp4
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
homepage: https://github.com/joker1007/activejob-ffmpeg
|
126
|
+
licenses:
|
127
|
+
- MIT
|
128
|
+
metadata: {}
|
129
|
+
post_install_message:
|
130
|
+
rdoc_options: []
|
131
|
+
require_paths:
|
132
|
+
- lib
|
133
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
requirements: []
|
144
|
+
rubyforge_project:
|
145
|
+
rubygems_version: 2.4.2
|
146
|
+
signing_key:
|
147
|
+
specification_version: 4
|
148
|
+
summary: easier way to use ffmpeg in activejob
|
149
|
+
test_files:
|
150
|
+
- spec/lib/activejob-ffmpet_spec.rb
|
151
|
+
- spec/samples/hoge's title.mp4
|
152
|
+
- spec/samples/sample.mp4
|
153
|
+
- spec/samples/sample_16_9.mp4
|
154
|
+
- spec/spec_helper.rb
|