ffprober 0.4.6 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f48bb0db1f7f7a981b59f158ab245b6570f173f6
4
- data.tar.gz: d6c4ab9014aaf6f000ae11db448620f15002fe7d
3
+ metadata.gz: 0f39ab8330d7d9b69833af671fe9c2c6d5584821
4
+ data.tar.gz: 7425cb1dd0befdc48e282f2bd34e3a60f1d82521
5
5
  SHA512:
6
- metadata.gz: 2996def445326304ff4ccafa381a855a43f5503a244b22bde01c5731c8b48aa50faae084b9e9985684710534cd2003ea1ca06c3837d1b029cf173045c1a42b4f
7
- data.tar.gz: e2dd182e05eeaaeff74d9c59bff424358a9ff831a07b7ccf530ed76612c76dd1af82c5be850d03ccf7110a0ea3f33ca131e0352cd136c11223efa5a8e61ca7a3
6
+ metadata.gz: a72e307e9379573aa6a068add8e04e00760f3c195c822d208c120e3af0b5dfd1b706daed1685e3d58aef5ee9d2fc6f3a5970b9c3be9abdb1b205c5dfb7699cb4
7
+ data.tar.gz: 067184e0af61e726393c57ee5b829c96cb7f6f9b87cd0e7c58aee460ba8bf662caf566b1162fe4cb2f78589dc7d2b23ded8fe5d3a3620e17ec9943ed52748298
@@ -1 +1 @@
1
- 2.2.1
1
+ 2.3.0
@@ -1,6 +1,13 @@
1
1
  language: ruby
2
2
 
3
- script: rspec spec
3
+ before_install:
4
+ - gem install bundler
5
+
6
+ before_script:
7
+ - echo $PATH
8
+ - cp test/ffprobe /home/travis/bin
9
+
10
+ script: rake
4
11
 
5
12
  sudo: false
6
13
 
@@ -14,9 +21,14 @@ addons:
14
21
  repo_token: e319ec7d18fb8e1f05b460c3ef8fac58af3844d7bfa3d44de6b82eb874bb3e31
15
22
 
16
23
  rvm:
17
- - 2.0.0
18
- - 2.1.0
19
- - 2.2.1
24
+ - 2.0.0-p648
25
+ - 2.1.8
26
+ - 2.2.4
27
+ - 2.3.0
20
28
  - rbx-2
21
29
  - ruby-head
22
30
  - jruby-head
31
+
32
+ matrix:
33
+ allow_failures:
34
+ - rvm: rbx-2
data/Changes.md CHANGED
@@ -1,3 +1,15 @@
1
+ 0.5.1 / 2016-02-07
2
+ ===================
3
+
4
+ * expose parsed json via ffprober.json
5
+
6
+ 0.5.0 / unreleased
7
+ ===================
8
+
9
+ * autoload, reduce initial object count by 3k
10
+ * refactorings, clean up warnings etc.
11
+ * remove check for maximum ffprober version, makes upgrading ffmpeg way easier
12
+
1
13
  0.4.6 / 2015-11-12
2
14
  ===================
3
15
 
data/Gemfile CHANGED
@@ -1,8 +1,9 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "pry"
4
- gem "rubocop"
5
- gem "codeclimate-test-reporter", require: nil
3
+ # gem "pry"
4
+ # gem "rubocop"
5
+ # gem "codeclimate-test-reporter", require: false
6
+ # gem 'simplecov', require: false
6
7
 
7
8
  # Specify your gem's dependencies in ffprober.gemspec
8
9
  gemspec
data/Rakefile CHANGED
@@ -1 +1,10 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task default: :test
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ffprober"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -1,4 +1,4 @@
1
1
  require_relative "../lib/ffprober"
2
2
 
3
- parser = Ffprober::Parser.from_file("../spec/assets/sample video.m4v")
3
+ parser = Ffprober::Parser.from_file("../spec/assets/s'ample video.m4v")
4
4
  puts parser.video_streams.inspect
@@ -22,5 +22,5 @@ Gem::Specification.new do |spec|
22
22
  spec.required_ruby_version = '~> 2.0'
23
23
 
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
- spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "minitest"
26
26
  end
@@ -1,23 +1,34 @@
1
1
  require_relative "ffprober/version"
2
- require_relative "ffprober/dynamic_initializer"
3
- require_relative "ffprober/parser"
4
- require_relative "ffprober/format"
5
- require_relative "ffprober/stream"
6
- require_relative "ffprober/audio_stream"
7
- require_relative "ffprober/data_stream"
8
- require_relative "ffprober/video_stream"
9
- require_relative "ffprober/subtitle_stream"
10
- require_relative "ffprober/chapter"
11
- require_relative "ffprober/ffprobe_version"
12
- require_relative "ffprober/wrapper"
13
- require_relative "ffprober/errors"
14
2
 
15
- require_relative "ffprober/ffmpeg/finder"
16
- require_relative "ffprober/ffmpeg/version"
17
- require_relative "ffprober/ffmpeg/version_validator"
18
- require_relative "ffprober/parsers/file"
19
- require_relative "ffprober/parsers/json"
20
- require "json"
3
+ autoload :JSON, "json"
21
4
 
22
5
  module Ffprober
6
+ class EmptyInput < StandardError; end
7
+ class InvalidInputFileError < StandardError; end
8
+ class NoFfprobeFound < StandardError; end
9
+ class UnsupportedVersion < StandardError; end
10
+
11
+ autoload :AudioStream, "ffprober/audio_stream"
12
+ autoload :Chapter, "ffprober/chapter"
13
+ autoload :DataStream, "ffprober/data_stream"
14
+ autoload :DynamicInitializer, "ffprober/dynamic_initializer"
15
+ autoload :FfprobeVersion, "ffprober/ffprobe_version"
16
+ autoload :Format, "ffprober/format"
17
+ autoload :Parser, "ffprober/parser"
18
+ autoload :Stream, "ffprober/stream"
19
+ autoload :SubtitleStream, "ffprober/subtitle_stream"
20
+ autoload :VideoStream, "ffprober/video_stream"
21
+ autoload :Wrapper, "ffprober/wrapper"
22
+
23
+ module Ffmpeg
24
+ autoload :Exec, "ffprober/ffmpeg/exec"
25
+ autoload :Finder, "ffprober/ffmpeg/finder"
26
+ autoload :Version, "ffprober/ffmpeg/version"
27
+ autoload :VersionValidator, "ffprober/ffmpeg/version_validator"
28
+ end
29
+
30
+ module Parsers
31
+ autoload :File, "ffprober/parsers/file"
32
+ autoload :Json, "ffprober/parsers/json"
33
+ end
23
34
  end
@@ -0,0 +1,35 @@
1
+ module Ffprober
2
+ module Ffmpeg
3
+ class Exec
4
+ CHAPTER_SUPPORT = Gem::Version.new("2.0.0")
5
+
6
+ def initialize(ffprobe_finder=Ffprober::Ffmpeg::Finder)
7
+ @ffprobe_finder = ffprobe_finder
8
+ end
9
+
10
+ def json_output(file_to_parse)
11
+ `#{@ffprobe_finder.path} #{ffprobe_options} #{Shellwords.escape(file_to_parse)}`
12
+ end
13
+
14
+ def ffprobe_version_output
15
+ @ffprobe_version_output ||= begin
16
+ if @ffprobe_finder.path.nil?
17
+ ""
18
+ else
19
+ `#{@ffprobe_finder.path} -version`
20
+ end
21
+ end
22
+ end
23
+
24
+ def ffprobe_options
25
+ options = "-v quiet -print_format json -show_format -show_streams"
26
+ options << " -show_chapters" if ffprobe_version.version >= CHAPTER_SUPPORT
27
+ options
28
+ end
29
+
30
+ def ffprobe_version
31
+ Ffprober::Ffmpeg::Version.new(self)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,14 +1,11 @@
1
1
  module Ffprober
2
2
  module Ffmpeg
3
3
  class Finder
4
- def self.path
5
- @path ||= begin
6
- path = ENV["PATH"].split(File::PATH_SEPARATOR).detect do |path_to_check|
7
- File.executable?(File.join(path_to_check, executable_name))
8
- end
4
+ SEARCH_PATHS = ENV["PATH"]
9
5
 
10
- path && File.expand_path(executable_name, path)
11
- end
6
+ def self.path
7
+ fail Ffprober::NoFfprobeFound if executable_path.nil?
8
+ @path ||= File.expand_path(executable_name, executable_path)
12
9
  end
13
10
 
14
11
  def self.executable_name
@@ -18,6 +15,14 @@ module Ffprober
18
15
  def self.windows?
19
16
  !!(RUBY_PLATFORM =~ /(mingw|mswin)/)
20
17
  end
18
+
19
+ def self.executable_path
20
+ @@executable_path ||= begin
21
+ SEARCH_PATHS.split(File::PATH_SEPARATOR).detect do |path_to_check|
22
+ File.executable?(File.join(path_to_check, executable_name))
23
+ end
24
+ end
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -1,8 +1,13 @@
1
1
  module Ffprober
2
2
  module Ffmpeg
3
3
  class Version
4
+ def initialize(ffprobe_exec=Ffprober::Ffmpeg::Exec.new)
5
+ @ffprobe_exec = ffprobe_exec
6
+ end
7
+
4
8
  VERSION_REGEX = /^(ffprobe|avprobe|ffmpeg) version (\d+)\.?(\d+)\.?(\d+)*/
5
9
  NIGHTLY_REGEX = /^(ffprobe|avprobe|ffmpeg) version (N|git)-/
10
+ VERSION_FALLBACK = [0, 0, 0]
6
11
 
7
12
  def version
8
13
  @version ||= Gem::Version.new(parse_version.join("."))
@@ -18,16 +23,12 @@ module Ffprober
18
23
  @parse_version ||= begin
19
24
  ffprobe_version_output.match(VERSION_REGEX) do |match|
20
25
  [match[2].to_i, match[3].to_i, match[4].to_i]
21
- end || [0, 0, 0]
26
+ end || VERSION_FALLBACK
22
27
  end
23
28
  end
24
29
 
25
30
  def ffprobe_version_output
26
- @ffprobe_version_output ||= ffprobe_finder.path.nil? ? "" : `#{ffprobe_finder.path} -version`
27
- end
28
-
29
- def ffprobe_finder
30
- Ffprober::Ffmpeg::Finder
31
+ @ffprobe_exec.ffprobe_version_output
31
32
  end
32
33
 
33
34
  def to_s
@@ -2,7 +2,6 @@ module Ffprober
2
2
  module Ffmpeg
3
3
  class VersionValidator
4
4
  MIN_VERSION = Gem::Version.new("0.9.0")
5
- MAX_VERSION = Gem::Version.new("2.8.1")
6
5
 
7
6
  def initialize(ffmpeg_version)
8
7
  @ffmpeg_version = ffmpeg_version
@@ -15,8 +14,7 @@ module Ffprober
15
14
  private
16
15
 
17
16
  def version_requirement_statisfied?
18
- version = ffmpeg_version.version
19
- (MIN_VERSION <= version && version <= MAX_VERSION)
17
+ MIN_VERSION <= ffmpeg_version.version
20
18
  end
21
19
 
22
20
  def ffmpeg_version
@@ -1,21 +1,31 @@
1
1
  module Ffprober
2
2
  class FfprobeVersion
3
+ def self.invalid?
4
+ !new.valid?
5
+ end
6
+
3
7
  def self.valid?
4
8
  new.valid?
9
+ rescue NoFfprobeFound
10
+ false
5
11
  end
6
12
 
7
13
  def valid?
8
14
  validator.valid?
9
15
  end
10
16
 
11
- private
12
-
13
- def validator
14
- Ffprober::Ffmpeg::VersionValidator.new(version)
17
+ def self.version
18
+ new.version
15
19
  end
16
20
 
17
21
  def version
18
22
  Ffprober::Ffmpeg::Version.new
19
23
  end
24
+
25
+ private
26
+
27
+ def validator
28
+ Ffprober::Ffmpeg::VersionValidator.new(version)
29
+ end
20
30
  end
21
31
  end
@@ -3,8 +3,12 @@ require "shellwords"
3
3
  module Ffprober
4
4
  class Parser
5
5
  def self.from_file(file_to_parse)
6
- unless FfprobeVersion.valid?
7
- fail ArgumentError.new("no or unsupported ffprobe version found. (version: #{Ffprober::Ffmpeg::Version.new})")
6
+ if FfprobeVersion.invalid?
7
+ fail UnsupportedVersion, "found version: #{FfprobeVersion.version}"
8
+ end
9
+
10
+ if File.zero?(file_to_parse)
11
+ fail EmptyInput, file_to_parse
8
12
  end
9
13
 
10
14
  file_parser = Ffprober::Parsers::File.new(file_to_parse)
@@ -1,33 +1,17 @@
1
1
  module Ffprober
2
2
  module Parsers
3
3
  class File
4
- def initialize(file_to_parse)
4
+ def initialize(file_to_parse, exec=Ffprober::Ffmpeg::Exec.new)
5
5
  unless ::File.exist?(file_to_parse)
6
6
  fail ArgumentError.new("File not found #{file_to_parse}")
7
7
  end
8
8
 
9
9
  @file_to_parse = file_to_parse
10
+ @exec = exec
10
11
  end
11
12
 
12
13
  def load
13
- json_output = `#{ffprobe_finder.path} #{options} #{Shellwords.escape(@file_to_parse)}`
14
- Ffprober::Parsers::Json.new(json_output)
15
- end
16
-
17
- private
18
-
19
- def options
20
- options = "-v quiet -print_format json -show_format -show_streams"
21
- options << " -show_chapters" if ffprobe_version.version >= Gem::Version.new("2.0.0")
22
- options
23
- end
24
-
25
- def ffprobe_version
26
- Ffprober::Ffmpeg::Version.new
27
- end
28
-
29
- def ffprobe_finder
30
- Ffprober::Ffmpeg::Finder
14
+ Ffprober::Parsers::Json.new(@exec.json_output(@file_to_parse))
31
15
  end
32
16
  end
33
17
  end
@@ -1,3 +1,3 @@
1
1
  module Ffprober
2
- VERSION = "0.4.6"
2
+ VERSION = "0.5.1"
3
3
  end
@@ -1,5 +1,7 @@
1
1
  module Ffprober
2
2
  class Wrapper
3
+ attr_reader :json
4
+
3
5
  def initialize(json)
4
6
  @json = json
5
7
  end
@@ -37,9 +39,5 @@ module Ffprober
37
39
  def streams
38
40
  json[:streams]
39
41
  end
40
-
41
- def json
42
- @json
43
- end
44
42
  end
45
43
  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.4.6
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - beanieboi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-12 00:00:00.000000000 Z
11
+ date: 2016-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -25,19 +25,19 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '10.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rspec
28
+ name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.0'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '3.0'
40
+ version: '0'
41
41
  description: a Ruby wrapper for ffprobe
42
42
  email:
43
43
  - beanie@benle.de
@@ -57,6 +57,8 @@ files:
57
57
  - LICENSE
58
58
  - README.md
59
59
  - Rakefile
60
+ - bin/console
61
+ - bin/setup
60
62
  - examples/from_file.rb
61
63
  - ffprober.gemspec
62
64
  - lib/ffprober.rb
@@ -64,7 +66,7 @@ files:
64
66
  - lib/ffprober/chapter.rb
65
67
  - lib/ffprober/data_stream.rb
66
68
  - lib/ffprober/dynamic_initializer.rb
67
- - lib/ffprober/errors.rb
69
+ - lib/ffprober/ffmpeg/exec.rb
68
70
  - lib/ffprober/ffmpeg/finder.rb
69
71
  - lib/ffprober/ffmpeg/version.rb
70
72
  - lib/ffprober/ffmpeg/version_validator.rb
@@ -98,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
100
  version: '0'
99
101
  requirements: []
100
102
  rubyforge_project:
101
- rubygems_version: 2.4.5
103
+ rubygems_version: 2.5.1
102
104
  signing_key:
103
105
  specification_version: 4
104
106
  summary: a Ruby wrapper for ffprobe (part of ffmpeg)
@@ -1,5 +0,0 @@
1
- module Ffprober
2
- module Errors
3
- class InvalidInputFileError < ::StandardError; end
4
- end
5
- end