ffprober 0.2.0 → 0.2.1
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/ffprober.gemspec +1 -1
- data/lib/ffprober.rb +13 -0
- data/lib/ffprober/ffprobe_version.rb +21 -0
- data/lib/ffprober/parser.rb +14 -50
- data/lib/ffprober/version.rb +1 -1
- data/spec/ffprober/ffprobe_version_spec.rb +38 -0
- data/spec/ffprober_spec.rb +2 -2
- metadata +6 -5
- data/spec/ffprober/parser_spec.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 919d1151ce185635625a4202ef066333408afc39
|
4
|
+
data.tar.gz: 0fc63f7d15e762393ce4a858eca5370ad8bd9084
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62cebe986fd0545a230c2c5ed1701f9dc155cb18c4c12fab95db66eb847a55c682641243d3edfacffde556cad12bb0ea1dedfec4aa94ac854e7e28c89da27dc3
|
7
|
+
data.tar.gz: f6b348f46fd23c2c385fd2d3813c7d17caad9b439a880b443023ba1a464ef1bf0228b595e9a838db9fa8684da1ea090811d0a6ade6719b74688ee18cdee3c5ee
|
data/ffprober.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.summary = %q{a Ruby wrapper for ffprobe (part of ffmpeg)}
|
9
9
|
gem.homepage = "https://github.com/beanieboi/ffprober"
|
10
10
|
|
11
|
-
gem.required_ruby_version = ">= 1.9.
|
11
|
+
gem.required_ruby_version = ">= 1.9.3"
|
12
12
|
gem.rubyforge_project = "ffprober"
|
13
13
|
|
14
14
|
gem.licenses = ['MIT']
|
data/lib/ffprober.rb
CHANGED
@@ -4,7 +4,20 @@ require "ffprober/format"
|
|
4
4
|
require "ffprober/stream"
|
5
5
|
require "ffprober/audio_stream"
|
6
6
|
require "ffprober/video_stream"
|
7
|
+
require "ffprober/ffprobe_version"
|
7
8
|
require "json"
|
8
9
|
|
9
10
|
module Ffprober
|
11
|
+
def self.path
|
12
|
+
name = 'ffprobe'
|
13
|
+
|
14
|
+
if File.executable? name
|
15
|
+
cmd
|
16
|
+
else
|
17
|
+
path = ENV['PATH'].split(File::PATH_SEPARATOR).find { |path|
|
18
|
+
File.executable? File.join(path, name)
|
19
|
+
}
|
20
|
+
path && File.expand_path(name, path)
|
21
|
+
end
|
22
|
+
end
|
10
23
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Ffprober
|
2
|
+
class FfprobeVersion
|
3
|
+
@@version_regex = /^ffprobe version (\d+)\.?(\d+)\.?(|\d+)$/
|
4
|
+
|
5
|
+
MIN_VERSION = Gem::Version.new("0.9.0")
|
6
|
+
MAX_VERSION = Gem::Version.new("1.2.0")
|
7
|
+
|
8
|
+
def self.valid?
|
9
|
+
MIN_VERSION <= parsed_version && parsed_version <= MAX_VERSION
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parsed_version
|
13
|
+
version = `#{Ffprober.path} -version`.match(@@version_regex)
|
14
|
+
raise Errno::ENOENT if version.nil?
|
15
|
+
major, minor, patch = version[1].to_i, version[2].to_i, version[3].to_i
|
16
|
+
Gem::Version.new([major, minor, patch].join("."))
|
17
|
+
rescue Errno::ENOENT => e
|
18
|
+
Gem::Version.new("0.0.0")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/ffprober/parser.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
module Ffprober
|
2
2
|
class Parser
|
3
3
|
@@options = '-v quiet -print_format json -show_format -show_streams'
|
4
|
-
@@version_regex = /^ffprobe version (\d+)\.?(\d+)\.?(|\d+)$/
|
5
4
|
|
6
5
|
class << self
|
7
6
|
def from_file(file_to_parse)
|
8
|
-
unless
|
7
|
+
unless FfprobeVersion.valid?
|
9
8
|
raise ArgumentError.new("no or unsupported ffprobe version found.\
|
10
|
-
(version: #{
|
9
|
+
(version: #{FfprobeVersion.parsed_version.to_s})")
|
11
10
|
end
|
12
11
|
|
13
|
-
json_output = `#{
|
12
|
+
json_output = `#{Ffprober.path} #{@@options} #{file_to_parse}`
|
14
13
|
from_json(json_output)
|
15
14
|
end
|
16
15
|
|
@@ -19,70 +18,35 @@ module Ffprober
|
|
19
18
|
parser.parse(json_to_parse)
|
20
19
|
parser
|
21
20
|
end
|
22
|
-
|
23
|
-
def ffprobe_version_valid?
|
24
|
-
valid_versions.include?(ffprobe_version)
|
25
|
-
end
|
26
|
-
|
27
|
-
def ffprobe_version
|
28
|
-
version = `#{ffprobe_path} -version`.match(@@version_regex)
|
29
|
-
raise Errno::ENOENT if version.nil?
|
30
|
-
major, minor, patch = version[1].to_i, version[2].to_i, version[3].to_i
|
31
|
-
{major: major, minor: minor, patch: patch}
|
32
|
-
rescue Errno::ENOENT => e
|
33
|
-
{major: 0, minor: 0, patch: 0}
|
34
|
-
end
|
35
|
-
|
36
|
-
def valid_versions
|
37
|
-
[
|
38
|
-
{major: 0, minor: 9, patch: 0},
|
39
|
-
{major: 0, minor: 10, patch: 0},
|
40
|
-
{major: 0, minor: 11, patch: 0},
|
41
|
-
{major: 1, minor: 0, patch: 0},
|
42
|
-
{major: 1, minor: 0, patch: 1},
|
43
|
-
{major: 1, minor: 1, patch: 0},
|
44
|
-
{major: 1, minor: 1, patch: 1},
|
45
|
-
{major: 1, minor: 1, patch: 2},
|
46
|
-
{major: 1, minor: 1, patch: 3},
|
47
|
-
{major: 1, minor: 1, patch: 4},
|
48
|
-
{major: 1, minor: 2, patch: 0}
|
49
|
-
]
|
50
|
-
end
|
51
|
-
|
52
|
-
def ffprobe_path
|
53
|
-
name = 'ffprobe'
|
54
|
-
|
55
|
-
if File.executable? name
|
56
|
-
cmd
|
57
|
-
else
|
58
|
-
path = ENV['PATH'].split(File::PATH_SEPARATOR).find { |path|
|
59
|
-
File.executable? File.join(path, name)
|
60
|
-
}
|
61
|
-
path && File.expand_path(name, path)
|
62
|
-
end
|
63
|
-
end
|
64
21
|
end
|
65
22
|
|
66
23
|
def parse(json_to_parse)
|
67
24
|
raise ArgumentError.new("No JSON found") if json_to_parse.nil?
|
68
|
-
@
|
25
|
+
@json_to_parse = json_to_parse
|
26
|
+
end
|
27
|
+
|
28
|
+
def parsed_json
|
29
|
+
@parsed_json ||= JSON.parse(@json_to_parse, symbolize_names: true)
|
69
30
|
end
|
70
31
|
|
71
32
|
def format
|
72
|
-
Ffprober::Format.new(
|
33
|
+
Ffprober::Format.new(parsed_json[:format])
|
73
34
|
end
|
74
35
|
|
75
36
|
def video_streams
|
76
|
-
|
37
|
+
streams.select { |stream| stream[:codec_type] == 'video'}.map do |s|
|
77
38
|
Ffprober::VideoStream.new(s)
|
78
39
|
end
|
79
40
|
end
|
80
41
|
|
81
42
|
def audio_streams
|
82
|
-
|
43
|
+
streams.select { |stream| stream[:codec_type] == 'audio'}.map do |s|
|
83
44
|
Ffprober::AudioStream.new(s)
|
84
45
|
end
|
85
46
|
end
|
86
47
|
|
48
|
+
def streams
|
49
|
+
parsed_json[:streams]
|
50
|
+
end
|
87
51
|
end
|
88
52
|
end
|
data/lib/ffprober/version.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Ffprober::FfprobeVersion do
|
5
|
+
let(:before_one_zero) { Gem::Version.new("0.9.0") }
|
6
|
+
let(:one_zero) { Gem::Version.new("1.0.0") }
|
7
|
+
let(:one_one) { Gem::Version.new("1.1.0") }
|
8
|
+
let(:after_one_zero) { Gem::Version.new("1.9.0") }
|
9
|
+
let(:latest) { Gem::Version.new("1.2") }
|
10
|
+
|
11
|
+
context 'validates the ffprobe version' do
|
12
|
+
it 'detects versions < 0.9' do
|
13
|
+
Ffprober::FfprobeVersion.stub(:parsed_version) { before_one_zero }
|
14
|
+
Ffprober::FfprobeVersion.valid?.should be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'detects versions 1.0' do
|
18
|
+
Ffprober::FfprobeVersion.stub(:parsed_version) { one_zero }
|
19
|
+
Ffprober::FfprobeVersion.valid?.should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'detects versions 1.1' do
|
23
|
+
Ffprober::FfprobeVersion.stub(:parsed_version) { one_one }
|
24
|
+
Ffprober::FfprobeVersion.valid?.should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'detects versions 1.9' do
|
28
|
+
Ffprober::FfprobeVersion.stub(:parsed_version) { after_one_zero }
|
29
|
+
Ffprober::FfprobeVersion.valid?.should be_false
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'detects latest' do
|
33
|
+
Ffprober::FfprobeVersion.stub(:parsed_version) { latest }
|
34
|
+
Ffprober::FfprobeVersion.valid?.should be_true
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/spec/ffprober_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Ffprober do
|
5
|
-
describe "from_file", if: Ffprober::
|
5
|
+
describe "from_file", if: Ffprober::FfprobeVersion.valid? do
|
6
6
|
before :each do
|
7
7
|
@ffprobe = Ffprober::Parser.from_file('spec/assets/301-extracting_a_ruby_gem.m4v')
|
8
8
|
end
|
@@ -24,7 +24,7 @@ describe Ffprober do
|
|
24
24
|
|
25
25
|
describe "if no ffprobe is found" do
|
26
26
|
it "should raise a exception" do
|
27
|
-
Ffprober
|
27
|
+
Ffprober.stub(:path).and_return("nonexistant")
|
28
28
|
lambda { @ffprobe = Ffprober::Parser.from_file('spec/assets/301-extracting_a_ruby_gem.m4v') }.should raise_error
|
29
29
|
end
|
30
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffprober
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- beanieboi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- ffprober.gemspec
|
57
57
|
- lib/ffprober.rb
|
58
58
|
- lib/ffprober/audio_stream.rb
|
59
|
+
- lib/ffprober/ffprobe_version.rb
|
59
60
|
- lib/ffprober/format.rb
|
60
61
|
- lib/ffprober/parser.rb
|
61
62
|
- lib/ffprober/stream.rb
|
@@ -63,7 +64,7 @@ files:
|
|
63
64
|
- lib/ffprober/video_stream.rb
|
64
65
|
- spec/assets/301-extracting_a_ruby_gem.json
|
65
66
|
- spec/assets/301-extracting_a_ruby_gem.m4v
|
66
|
-
- spec/ffprober/
|
67
|
+
- spec/ffprober/ffprobe_version_spec.rb
|
67
68
|
- spec/ffprober_spec.rb
|
68
69
|
- spec/spec_helper.rb
|
69
70
|
homepage: https://github.com/beanieboi/ffprober
|
@@ -78,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
79
|
requirements:
|
79
80
|
- - '>='
|
80
81
|
- !ruby/object:Gem::Version
|
81
|
-
version: 1.9.
|
82
|
+
version: 1.9.3
|
82
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
84
|
requirements:
|
84
85
|
- - '>='
|
@@ -93,6 +94,6 @@ summary: a Ruby wrapper for ffprobe (part of ffmpeg)
|
|
93
94
|
test_files:
|
94
95
|
- spec/assets/301-extracting_a_ruby_gem.json
|
95
96
|
- spec/assets/301-extracting_a_ruby_gem.m4v
|
96
|
-
- spec/ffprober/
|
97
|
+
- spec/ffprober/ffprobe_version_spec.rb
|
97
98
|
- spec/ffprober_spec.rb
|
98
99
|
- spec/spec_helper.rb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require 'spec_helper'
|
3
|
-
|
4
|
-
describe Ffprober::Parser do
|
5
|
-
let(:before_one_zero) { {major: 0, minor: 9, patch: 0} }
|
6
|
-
let(:one_zero) { {major: 1, minor: 0, patch: 0} }
|
7
|
-
let(:one_one) { {major: 1, minor: 1, patch: 0} }
|
8
|
-
let(:after_one_zero) { {major: 1, minor: 9, patch: 0} }
|
9
|
-
|
10
|
-
context 'validates the ffprobe version' do
|
11
|
-
it 'detects versions < 0.9' do
|
12
|
-
Ffprober::Parser.stub(:ffprobe_version) { before_one_zero }
|
13
|
-
Ffprober::Parser.ffprobe_version_valid?.should be_true
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'detects versions 1.0' do
|
17
|
-
Ffprober::Parser.stub(:ffprobe_version) { one_zero }
|
18
|
-
Ffprober::Parser.ffprobe_version_valid?.should be_true
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'detects versions 1.1' do
|
22
|
-
Ffprober::Parser.stub(:ffprobe_version) { one_one }
|
23
|
-
Ffprober::Parser.ffprobe_version_valid?.should be_true
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
it 'detects versions 1.9' do
|
28
|
-
Ffprober::Parser.stub(:ffprobe_version) { after_one_zero }
|
29
|
-
Ffprober::Parser.ffprobe_version_valid?.should be_false
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|