vidibus-fileinfo 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Vidibus::Fileinfo [![](http://stillmaintained.com/vidibus/vidibus-fileinfo.png)](http://stillmaintained.com/vidibus/vidibus-fileinfo)
2
+
3
+ Returns information like the width, height and bits about an image or video file.
4
+
5
+ This gem is part of [Vidibus](http://vidibus.org), an open source toolset for building distributed (video) applications.
6
+
7
+ ## Installation
8
+
9
+ Add the dependency to the Gemfile of your application:
10
+
11
+ gem "vidibus-fileinfo"
12
+
13
+ Then call bundle install on your console.
14
+
15
+ ## System requirements
16
+
17
+ In order to perform the file inspection, ImageMagick and FFmpeg executables are required.
18
+
19
+ Unless ruby already knows about those tools, you'll have to define the path somewhere.
20
+ In a Rails environment, a good place would be your development.rb and production.rb.
21
+
22
+ Example for development environment on OSX:
23
+
24
+ ``` shell
25
+ # Set path to ImageMagick and FFmpeg executables
26
+ ENV["PATH"] = "#{ENV["PATH"]}:/opt/local/bin"
27
+ ```
28
+
29
+ Example for production environment on Debian:
30
+
31
+ ``` shell
32
+ # Set path to ImageMagick and FFmpeg executables
33
+ ENV["PATH"] = "#{ENV["PATH"]}:/usr/bin/"
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ Obtaining information from a file is easy:
39
+
40
+ ``` ruby
41
+ Fileinfo("path/to/myfile.png")
42
+ # => {:width => 300, height => 200, ... }
43
+ ```
44
+
45
+ ### Image files
46
+
47
+ For images, a hash with following data will be returned:
48
+
49
+ ``` ruby
50
+ :width # width of image
51
+ :height # height of image
52
+ :size # file size in bytes
53
+ :bit # depth in bit
54
+ :content_type # content type of image, e.g. "jpeg"
55
+ ```
56
+
57
+ This gem currently support these image formats:
58
+
59
+ ```
60
+ jpg, jpeg, png, gif
61
+ ```
62
+
63
+ ### Video files
64
+
65
+ For videos, a different hash will be returned:
66
+
67
+ ``` ruby
68
+ :width # width of video
69
+ :height # height of video
70
+ :size # file size in bytes
71
+ :duration # duration of video in seconds
72
+ :fps # frames per second
73
+ :bitrate # overall bit rate (video + audio)
74
+ :video_codec # codec of video stream, e.g. "h264"
75
+ :audio_codec # codec of audio stream, e.g. "aac"
76
+ :audio_sample_rate # sample rate of audio stream, e.g. 48000
77
+ ```
78
+
79
+ These video formats are currently supported:
80
+
81
+ ```
82
+ avi, flv, h261, h263, h264, ipod, m4v, mov, mp4, mpeg, mxf, ogg
83
+ ```
84
+
85
+ ## Copyright
86
+
87
+ Copyright (c) 2011 Andre Pankratz. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,20 +1,26 @@
1
+ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
+
1
3
  require "bundler"
2
- require "rake/rdoctask"
4
+ require "rdoc/task"
3
5
  require "rspec"
4
6
  require "rspec/core/rake_task"
7
+
8
+ require "vidibus/fileinfo/version"
9
+
5
10
  Bundler::GemHelper.install_tasks
6
11
 
7
- Rspec::Core::RakeTask.new(:rcov) do |t|
12
+ RSpec::Core::RakeTask.new(:rcov) do |t|
8
13
  t.pattern = "spec/**/*_spec.rb"
9
14
  t.rcov = true
10
15
  t.rcov_opts = ["--exclude", "^spec,/gems/"]
11
16
  end
12
17
 
13
18
  Rake::RDocTask.new do |rdoc|
14
- require File.expand_path("../lib/vidibus/fileinfo/version.rb", __FILE__)
15
19
  rdoc.rdoc_dir = "rdoc"
16
- rdoc.title = "vidibus-sysinfo #{Vidibus::Fileinfo::VERSION}"
20
+ rdoc.title = "vidibus-permalink #{Vidibus::Fileinfo::VERSION}"
17
21
  rdoc.rdoc_files.include("README*")
18
22
  rdoc.rdoc_files.include("lib/**/*.rb")
19
23
  rdoc.options << "--charset=utf-8"
20
24
  end
25
+
26
+ task :default => :rcov
@@ -17,6 +17,11 @@ module Vidibus
17
17
  @mime_type ||= Mime::Type.lookup_by_extension(format)
18
18
  end
19
19
 
20
+ def data
21
+ raise PathError unless @path
22
+ @data ||= parse_metadata
23
+ end
24
+
20
25
  protected
21
26
 
22
27
  def check_file
@@ -28,6 +33,38 @@ module Vidibus
28
33
  @processor = Fileinfo.processor(format)
29
34
  extend @processor
30
35
  end
36
+
37
+ def parse_metadata
38
+ @raw_metadata = process_cmd
39
+
40
+ metadata = {}
41
+ @processor::METADATA.each do |attribute|
42
+ begin
43
+ metadata[attribute.to_sym] = send(attribute)
44
+ rescue
45
+ raise DataError, "#{attribute}"
46
+ end
47
+ end
48
+
49
+ validate(metadata)
50
+ metadata
51
+ end
52
+
53
+ def process_cmd
54
+ pid, stdin, stdout, stderr = POSIX::Spawn::popen4(cmd)
55
+ raw_metadata = eval("#{output}.read")
56
+ Process::waitpid(pid)
57
+ raw_metadata
58
+ end
59
+
60
+ def validate(metadata)
61
+ raise DataError unless valid?(metadata)
62
+ end
63
+
64
+ # The video/image file size in bytes.
65
+ def size
66
+ File.size(@path)
67
+ end
31
68
  end
32
69
  end
33
70
  end
@@ -3,36 +3,49 @@ module Vidibus
3
3
  module Processor
4
4
  module Image
5
5
  FORMATS = %w[jpg jpeg png gif]
6
+ METADATA = %w[bit content_type height orientation quality size width]
6
7
 
7
- # Extracts image data through ImageMagick.
8
- def data
9
- raise PathError unless @path
10
- @data ||= begin
11
- result = perform or raise DataError
12
- values = result.to_s.split(" ")
13
- raise DataError unless values.size > 5
14
- dimensions = values[2].split('x').map {|d| d.to_i}
15
- raise DataError unless dimensions.any?
16
- {
17
- :content_type => values[1].downcase,
18
- :width => dimensions[0],
19
- :height => dimensions[1],
20
- :bit => values[4].to_i,
21
- :size => File.size(@path)
22
- }
23
- end
8
+ def cmd
9
+ "identify -verbose #{@path}"
10
+ end
11
+
12
+ def output
13
+ :stdout
14
+ end
15
+
16
+ def valid?(metadata)
17
+ !(metadata[:width].zero? || metadata[:height].zero?)
24
18
  end
25
19
 
26
20
  protected
27
21
 
28
- def perform
29
- result = `#{command}`
30
- raise DataError unless $? == 0
31
- result
22
+ def bit
23
+ /^\s*Depth:\s(\w+)-bit/.match(@raw_metadata)[1].presence.to_i
24
+ end
25
+
26
+ def content_type
27
+ /^\s*Format:\s(\w+)/.match(@raw_metadata)[1].presence.downcase
28
+ end
29
+
30
+ def height
31
+ dimension[1]
32
+ end
33
+
34
+ def width
35
+ dimension[0]
36
+ end
37
+
38
+ def dimension
39
+ str = /^\s*Geometry: (\w+)/.match(@raw_metadata)[1].presence
40
+ str.split("x").map(&:to_i)
41
+ end
42
+
43
+ def orientation
44
+ /^\s*exif:Orientation:\s(\d+)/.match(@raw_metadata)[1].presence.to_i
32
45
  end
33
46
 
34
- def command
35
- "identify #{@path}"
47
+ def quality
48
+ /^\s*Quality: (\d+)/.match(@raw_metadata)[1].presence.to_i
36
49
  end
37
50
  end
38
51
  end
@@ -3,26 +3,60 @@ module Vidibus
3
3
  module Processor
4
4
  module Video
5
5
  FORMATS = %w[avi flv h261 h263 h264 ipod m4v mov mp4 mpeg mxf ogg]
6
+ METADATA = %w[audio_codec audio_sample_rate bitrate duration fps height
7
+ size video_codec width]
6
8
 
7
- # Extracts image data through RVideo, which uses FFmpeg.
8
- def data
9
- raise PathError unless @path
10
- @data ||= begin
11
- rvideo = RVideo::Inspector.new(:file => path)
12
- raise DataError unless rvideo
13
- info = {
14
- :width => rvideo.width().to_i,
15
- :height => rvideo.height().to_i,
16
- :duration => rvideo.duration().to_f/1000,
17
- :size => File.size(path),
18
- :fps => rvideo.fps().to_f
19
- }
20
- raise DataError unless info[:width] > 0 and info[:height] > 0 and info[:duration] > 0
21
- [:bitrate, :audio_sample_rate, :audio_codec, :video_codec].each do |m|
22
- info[m] = rvideo.send(m)
23
- end
24
- info
25
- end
9
+ def cmd
10
+ "ffmpeg -i #{@path}"
11
+ end
12
+
13
+ def output
14
+ :stderr
15
+ end
16
+
17
+ def valid?(metadata)
18
+ !(metadata[:width].zero? || metadata[:height].zero? || metadata[:duration].zero?)
19
+ end
20
+
21
+ protected
22
+
23
+ def audio_codec
24
+ /Audio:\s+([a-z]+),/.match(@raw_metadata)[1].presence
25
+ end
26
+
27
+ def audio_sample_rate
28
+ /(\d+)\sHz/.match(@raw_metadata)[1].presence.to_i
29
+ end
30
+
31
+ def bitrate
32
+ /bitrate:\s(\d+)\skb\/s/.match(@raw_metadata)[1].presence.to_i
33
+ end
34
+
35
+ def duration
36
+ str = /Duration:\s+([0-9\:\.]+),/.match(@raw_metadata)[1].presence
37
+ units = str.split(":").map(&:to_f)
38
+ (units[0] * 60 * 60 * 1000) + (units[1] * 60 * 1000) + (units[2] * 1000) / 1000
39
+ end
40
+
41
+ def fps
42
+ /(\d+)\s+fps,/.match(@raw_metadata)[1].presence.to_f
43
+ end
44
+
45
+ def height
46
+ dimension[1]
47
+ end
48
+
49
+ def width
50
+ dimension[0]
51
+ end
52
+
53
+ def dimension
54
+ str = /^.*Video:.*( \d+x\d+ ).*$/.match(@raw_metadata)[1].strip.presence
55
+ str.split("x").map(&:to_i)
56
+ end
57
+
58
+ def video_codec
59
+ /Video:\s+([a-z0-9]+),/.match(@raw_metadata).presence[1]
26
60
  end
27
61
  end
28
62
  end
@@ -1,5 +1,5 @@
1
1
  module Vidibus
2
2
  module Fileinfo
3
- VERSION = "0.0.1"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
- require "fileinfo/base"
2
- require "fileinfo/processor/image"
3
- require "fileinfo/processor/video"
1
+ require "vidibus/fileinfo/base"
2
+ require "vidibus/fileinfo/processor/image"
3
+ require "vidibus/fileinfo/processor/video"
4
4
 
5
5
  module Vidibus
6
6
  module Fileinfo
@@ -1,6 +1,5 @@
1
+ require "action_dispatch/http/mime_type"
2
+ require "posix/spawn"
1
3
  require "vidibus-core_extensions"
2
- require "action_dispatch/http/mime_type.rb"
3
- require "rvideo"
4
4
 
5
- $:.unshift(File.join(File.dirname(__FILE__), "vidibus"))
6
- require "fileinfo"
5
+ require "vidibus/fileinfo"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vidibus-fileinfo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease: false
4
+ hash: 27
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
8
  - 1
10
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andre Pankratz
@@ -15,12 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-09 00:00:00 +01:00
18
+ date: 2011-09-07 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: actionpack
23
- prerelease: false
24
22
  requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
@@ -32,11 +30,11 @@ dependencies:
32
30
  - 0
33
31
  - 4
34
32
  version: 3.0.4
35
- type: :runtime
36
33
  version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
38
- name: vidibus-core_extensions
34
+ name: actionpack
39
35
  prerelease: false
36
+ type: :runtime
37
+ - !ruby/object:Gem::Dependency
40
38
  requirement: &id002 !ruby/object:Gem::Requirement
41
39
  none: false
42
40
  requirements:
@@ -46,11 +44,11 @@ dependencies:
46
44
  segments:
47
45
  - 0
48
46
  version: "0"
49
- type: :runtime
50
47
  version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: open4
48
+ name: posix-spawn
53
49
  prerelease: false
50
+ type: :runtime
51
+ - !ruby/object:Gem::Dependency
54
52
  requirement: &id003 !ruby/object:Gem::Requirement
55
53
  none: false
56
54
  requirements:
@@ -60,41 +58,41 @@ dependencies:
60
58
  segments:
61
59
  - 0
62
60
  version: "0"
63
- type: :runtime
64
61
  version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: newbamboo-rvideo
62
+ name: vidibus-core_extensions
67
63
  prerelease: false
64
+ type: :runtime
65
+ - !ruby/object:Gem::Dependency
68
66
  requirement: &id004 !ruby/object:Gem::Requirement
69
67
  none: false
70
68
  requirements:
71
69
  - - ">="
72
70
  - !ruby/object:Gem::Version
73
- hash: 3
71
+ hash: 23
74
72
  segments:
73
+ - 1
75
74
  - 0
76
- version: "0"
77
- type: :runtime
75
+ - 0
76
+ version: 1.0.0
78
77
  version_requirements: *id004
79
- - !ruby/object:Gem::Dependency
80
78
  name: bundler
81
79
  prerelease: false
80
+ type: :development
81
+ - !ruby/object:Gem::Dependency
82
82
  requirement: &id005 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
- - - ">="
85
+ - - ~>
86
86
  - !ruby/object:Gem::Version
87
- hash: 23
87
+ hash: 7
88
88
  segments:
89
- - 1
90
- - 0
91
- - 0
92
- version: 1.0.0
93
- type: :development
89
+ - 2
90
+ version: "2"
94
91
  version_requirements: *id005
95
- - !ruby/object:Gem::Dependency
96
- name: rake
92
+ name: rspec
97
93
  prerelease: false
94
+ type: :development
95
+ - !ruby/object:Gem::Dependency
98
96
  requirement: &id006 !ruby/object:Gem::Requirement
99
97
  none: false
100
98
  requirements:
@@ -104,29 +102,25 @@ dependencies:
104
102
  segments:
105
103
  - 0
106
104
  version: "0"
107
- type: :development
108
105
  version_requirements: *id006
109
- - !ruby/object:Gem::Dependency
110
- name: rspec
106
+ name: rr
111
107
  prerelease: false
108
+ type: :development
109
+ - !ruby/object:Gem::Dependency
112
110
  requirement: &id007 !ruby/object:Gem::Requirement
113
111
  none: false
114
112
  requirements:
115
- - - ~>
113
+ - - ">="
116
114
  - !ruby/object:Gem::Version
117
- hash: 62196427
115
+ hash: 3
118
116
  segments:
119
- - 2
120
117
  - 0
121
- - 0
122
- - beta
123
- - 20
124
- version: 2.0.0.beta.20
125
- type: :development
118
+ version: "0"
126
119
  version_requirements: *id007
127
- - !ruby/object:Gem::Dependency
128
- name: rr
120
+ name: rake
129
121
  prerelease: false
122
+ type: :development
123
+ - !ruby/object:Gem::Dependency
130
124
  requirement: &id008 !ruby/object:Gem::Requirement
131
125
  none: false
132
126
  requirements:
@@ -136,11 +130,11 @@ dependencies:
136
130
  segments:
137
131
  - 0
138
132
  version: "0"
139
- type: :development
140
133
  version_requirements: *id008
141
- - !ruby/object:Gem::Dependency
142
- name: relevance-rcov
134
+ name: rcov
143
135
  prerelease: false
136
+ type: :development
137
+ - !ruby/object:Gem::Dependency
144
138
  requirement: &id009 !ruby/object:Gem::Requirement
145
139
  none: false
146
140
  requirements:
@@ -150,9 +144,11 @@ dependencies:
150
144
  segments:
151
145
  - 0
152
146
  version: "0"
153
- type: :development
154
147
  version_requirements: *id009
155
- description: Gets width, height, bits and other figures.
148
+ name: rdoc
149
+ prerelease: false
150
+ type: :development
151
+ description: Returns information like the width, height and bits about an image or video file.
156
152
  email: andre@vidibus.com
157
153
  executables: []
158
154
 
@@ -161,28 +157,15 @@ extensions: []
161
157
  extra_rdoc_files: []
162
158
 
163
159
  files:
164
- - .gitignore
165
- - .rspec
166
- - Gemfile
167
- - LICENSE
168
- - README.rdoc
169
- - Rakefile
170
- - lib/vidibus-fileinfo.rb
171
- - lib/vidibus/fileinfo.rb
172
160
  - lib/vidibus/fileinfo/base.rb
173
161
  - lib/vidibus/fileinfo/processor/image.rb
174
162
  - lib/vidibus/fileinfo/processor/video.rb
175
163
  - lib/vidibus/fileinfo/version.rb
176
- - spec/files/Jim-Marshall.jpg
177
- - spec/files/RevAppTest.mp4
178
- - spec/spec_helper.rb
179
- - spec/support/files.rb
180
- - spec/support/stubs.rb
181
- - spec/vidibus/fileinfo/base_spec.rb
182
- - spec/vidibus/fileinfo/processor/image_spec.rb
183
- - spec/vidibus/fileinfo/processor/video_spec.rb
184
- - spec/vidibus/fileinfo_spec.rb
185
- - vidibus-fileinfo.gemspec
164
+ - lib/vidibus/fileinfo.rb
165
+ - lib/vidibus-fileinfo.rb
166
+ - LICENSE
167
+ - README.md
168
+ - Rakefile
186
169
  has_rdoc: true
187
170
  homepage: https://github.com/vidibus/vidibus-fileinfo
188
171
  licenses: []
@@ -214,8 +197,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
197
  version: 1.3.6
215
198
  requirements: []
216
199
 
217
- rubyforge_project: vidibus-fileinfo
218
- rubygems_version: 1.3.7
200
+ rubyforge_project:
201
+ rubygems_version: 1.6.2
219
202
  signing_key:
220
203
  specification_version: 3
221
204
  summary: Returns information about an image or video file.
data/.gitignore DELETED
@@ -1,6 +0,0 @@
1
- pkg/*
2
- Gemfile.lock
3
- *.gem
4
- .bundle
5
- rdoc
6
- coverage
data/.rspec DELETED
@@ -1 +0,0 @@
1
- --format nested
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source :gemcutter
2
-
3
- # Specify your gem's dependencies in vidibus-fileinfo.gemspec
4
- gemspec
data/README.rdoc DELETED
@@ -1,79 +0,0 @@
1
- = Vidibus::Fileinfo
2
-
3
- Returns various information on image and video files.
4
-
5
- This gem is part of the open source service-oriented {video framework}[http://vidibus.org] Vidibus.
6
-
7
-
8
- == Installation
9
-
10
- Add the dependency to the Gemfile of your application:
11
-
12
- gem "vidibus-fileinfo"
13
-
14
- Then call bundle install on your console.
15
-
16
-
17
- == System requirements
18
-
19
- In order to perform the file inspection, ImageMagick and FFmpeg executables are required.
20
-
21
- Unless ruby already knows about those tools, you'll have to define the path somewhere.
22
- In a Rails environment, a good place would be your development.rb and production.rb.
23
-
24
- Example for development environment on OSX:
25
-
26
- # Set path to ImageMagick and FFmpeg executables
27
- ENV["PATH"] = "#{ENV["PATH"]}:/opt/local/bin"
28
-
29
- Example for production environment on Debian:
30
-
31
- # Set path to ImageMagick and FFmpeg executables
32
- ENV["PATH"] = "#{ENV["PATH"]}:/usr/bin/"
33
-
34
-
35
- == Usage
36
-
37
- Obtaining information from a file is easy:
38
-
39
- Fileinfo("path/to/myfile.png")
40
- # => {:width => 300, height => 200, ... }
41
-
42
-
43
- === Image files
44
-
45
- For images, a hash with following data will be returned:
46
-
47
- :width # width of image
48
- :height # height of image
49
- :size # file size in bytes
50
- :bit # depth in bit
51
- :content_type # content type of image, e.g. "jpeg"
52
-
53
- This gem currently support these image formats:
54
-
55
- jpg, jpeg, png, gif
56
-
57
-
58
- === Video files
59
-
60
- For videos, a different hash will be returned:
61
-
62
- :width # width of video
63
- :height # height of video
64
- :size # file size in bytes
65
- :duration # duration of video in seconds
66
- :fps # frames per second
67
- :bitrate # overall bit rate (video + audio)
68
- :video_codec # codec of video stream, e.g. "h264"
69
- :audio_codec # codec of audio stream, e.g. "aac"
70
- :audio_sample_rate # sample rate of audio stream, e.g. 48000
71
-
72
- These video formats are currently supported:
73
-
74
- avi, flv, h261, h263, h264, ipod, m4v, mov, mp4, mpeg, mxf, ogg
75
-
76
-
77
- == Copyright
78
-
79
- Copyright (c) 2011 Andre Pankratz. See LICENSE for details.
Binary file
Binary file
data/spec/spec_helper.rb DELETED
@@ -1,14 +0,0 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
-
4
- require "rubygems"
5
- require "rspec"
6
- require "rr"
7
- require "vidibus-fileinfo"
8
-
9
- require "support/stubs"
10
- require "support/files"
11
-
12
- RSpec.configure do |config|
13
- config.mock_with :rr
14
- end
@@ -1,9 +0,0 @@
1
- FILES_DIR = File.join(File.dirname(__FILE__), "..", "files")
2
-
3
- def jpg_path
4
- @jpg_path ||= File.join(FILES_DIR, "Jim-Marshall.jpg")
5
- end
6
-
7
- def mp4_path
8
- @mp4_path ||= File.join(FILES_DIR, "RevAppTest.mp4")
9
- end
@@ -1,4 +0,0 @@
1
- def stub_file(path)
2
- stub(File).exist?(path) {true}
3
- stub(File).file?(path) {true}
4
- end
@@ -1,65 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Vidibus::Fileinfo::Base do
4
- let(:subject) {Vidibus::Fileinfo::Base}
5
- let(:jpg_info) {subject.new(jpg_path)}
6
-
7
- describe "initializing" do
8
- it "should require one param" do
9
- expect {subject.new}.to raise_error(ArgumentError)
10
- end
11
-
12
- it "should raise an error if file is not accessible" do
13
- expect {
14
- subject.new("something")
15
- }.to raise_error(Vidibus::Fileinfo::FileAccessError)
16
- end
17
-
18
- it "should raise an error if file is a directory" do
19
- expect {
20
- subject.new(File.dirname(__FILE__))
21
- }.to raise_error(Vidibus::Fileinfo::NoFileError)
22
- end
23
-
24
- it "should raise an error if file format is not supported" do
25
- stub_file("/what.ever")
26
- expect {
27
- subject.new("/what.ever")
28
- }.to raise_error(Vidibus::Fileinfo::UnsupportedFormatError)
29
- end
30
-
31
- it "should pass if file is valid" do
32
- subject.new(jpg_path).should be_true
33
- end
34
-
35
- it "should allow access to the processor's methods" do
36
- jpg_info.should respond_to(:data)
37
- end
38
- end
39
-
40
- describe "#format" do
41
- it "should return the current file's format" do
42
- mock(Vidibus::Fileinfo).format(jpg_path) {"jpg"}
43
- jpg_info.format
44
- end
45
- end
46
-
47
- describe "#mime_type" do
48
- it "should return the current file's mime type" do
49
- mock(Mime::Type).lookup_by_extension("jpg") {"image/jpeg"}
50
- jpg_info.mime_type
51
- end
52
- end
53
-
54
- describe "#path" do
55
- it "should return the current file's path" do
56
- jpg_info.path.should eql(jpg_path)
57
- end
58
- end
59
-
60
- describe "#processor" do
61
- it "should return the matching processor for given file" do
62
- jpg_info.processor.should eql(Vidibus::Fileinfo::Processor::Image)
63
- end
64
- end
65
- end
@@ -1,38 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Vidibus::Fileinfo::Processor::Image do
4
- let(:subject) {Vidibus::Fileinfo::Base.new(jpg_path)}
5
-
6
- describe "FORMATS" do
7
- it "should include various image formats" do
8
- Vidibus::Fileinfo::Processor::Image::FORMATS.should eql(%w[jpg jpeg png gif])
9
- end
10
- end
11
-
12
- describe "#data" do
13
- it "should require @path to be defined" do
14
- subject.instance_variable_set("@path", nil)
15
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::PathError)
16
- end
17
-
18
- it "should raise an error if ImageMagick fails to extract any data" do
19
- stub(subject).perform {""}
20
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
21
- end
22
-
23
- it "should raise an error if ImageMagick fails to extract dimensions" do
24
- stub(subject).perform {"Something"}
25
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
26
- end
27
-
28
- it "should return a hash of image attributes" do
29
- subject.data.should eql({
30
- :content_type => "jpeg",
31
- :width => 30,
32
- :height => 23,
33
- :bit => 8,
34
- :size => 14822
35
- })
36
- end
37
- end
38
- end
@@ -1,57 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Vidibus::Fileinfo::Processor::Video do
4
- let(:subject) {Vidibus::Fileinfo::Base.new(mp4_path)}
5
-
6
- describe "FORMATS" do
7
- it "should include various image formats" do
8
- Vidibus::Fileinfo::Processor::Video::FORMATS.should eql(%w[avi flv h261 h263 h264 ipod m4v mov mp4 mpeg mxf ogg])
9
- end
10
- end
11
-
12
- describe "#data" do
13
- it "should require @path to be defined" do
14
- subject.instance_variable_set("@path", nil)
15
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::PathError)
16
- end
17
-
18
- it "should call RVideo::Inspector.new" do
19
- mock(RVideo::Inspector).new(:file => mp4_path) {OpenStruct.new(:width => "10", :height => "10", :duration => "10")}
20
- subject.data
21
- end
22
-
23
- it "should raise an error if RVideo::Inspector returns nothing" do
24
- stub(RVideo::Inspector).new(:file => mp4_path) {}
25
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
26
- end
27
-
28
- it "should raise an error if RVideo::Inspector fails to extract height" do
29
- stub(RVideo::Inspector).new(:file => mp4_path) {OpenStruct.new(:width => "10", :height => nil, :duration => "10")}
30
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
31
- end
32
-
33
- it "should raise an error if RVideo::Inspector fails to extract width" do
34
- stub(RVideo::Inspector).new(:file => mp4_path) {OpenStruct.new(:width => nil, :height => "10", :duration => "10")}
35
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
36
- end
37
-
38
- it "should raise an error if RVideo::Inspector fails to extract duration" do
39
- stub(RVideo::Inspector).new(:file => mp4_path) {OpenStruct.new(:width => "10", :height => "10", :duration => nil)}
40
- expect {subject.data}.to raise_error(Vidibus::Fileinfo::DataError)
41
- end
42
-
43
- it "should return a hash of image attributes" do
44
- subject.data.should eql({
45
- :video_codec => "mpeg4",
46
- :audio_codec => "aac",
47
- :audio_sample_rate => 48000,
48
- :height => 405,
49
- :width => 720,
50
- :fps => 25.0,
51
- :duration => 1.92,
52
- :bitrate => 602,
53
- :size => 144631
54
- })
55
- end
56
- end
57
- end
@@ -1,131 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Vidibus::Fileinfo do
4
- let(:subject) {Vidibus::Fileinfo}
5
-
6
- describe ".processors" do
7
- it "should return a list of available processor classes" do
8
- subject.processors.should eql([Vidibus::Fileinfo::Processor::Image, Vidibus::Fileinfo::Processor::Video])
9
- end
10
- end
11
-
12
- describe ".formats" do
13
- it "should return a list of processable file formats" do
14
- subject.formats.should eql(%w[avi flv gif h261 h263 h264 ipod jpeg jpg m4v mov mp4 mpeg mxf ogg png])
15
- end
16
- end
17
-
18
- describe ".processor" do
19
- it "should require a format" do
20
- expect {subject.processor}.to raise_error(ArgumentError)
21
- end
22
-
23
- it "should return the image processor for an image format" do
24
- subject.processor("jpg").should eql(Vidibus::Fileinfo::Processor::Image)
25
- end
26
-
27
- it "should return the video processor for a video format" do
28
- subject.processor("mp4").should eql(Vidibus::Fileinfo::Processor::Video)
29
- end
30
-
31
- it "should raise an error for unsupported file formats" do
32
- expect {
33
- subject.processor("xxx")
34
- }.to raise_error(Vidibus::Fileinfo::UnsupportedFormatError)
35
- end
36
- end
37
-
38
- describe ".format" do
39
- it "should require a path" do
40
- expect {subject.format}.to raise_error(ArgumentError)
41
- end
42
-
43
- it "should return the format of a given file path" do
44
- subject.format("/my/face.jpg").should eql("jpg")
45
- end
46
-
47
- it "should return the format in lower case" do
48
- subject.format("/my/face.JPG").should eql("jpg")
49
- end
50
-
51
- it "should raise an error if no format can be detected" do
52
- expect {
53
- subject.format("/my/face")
54
- }.to raise_error(Vidibus::Fileinfo::NoFormatError)
55
- end
56
- end
57
-
58
- describe ".bytes" do
59
- it "should require a value" do
60
- expect {subject.bytes}.to raise_error(ArgumentError)
61
- end
62
-
63
- it "should return input number" do
64
- subject.bytes(1).should eql(1)
65
- end
66
-
67
- it "should return a rounded input float" do
68
- subject.bytes(1.5).should eql(2)
69
- end
70
-
71
- it "should parse '18942'" do
72
- subject.bytes("18942").should eql(18942)
73
- end
74
-
75
- it "should parse '135 B'" do
76
- subject.bytes("135 B").should eql(135)
77
- end
78
-
79
- it "should parse '1 kB'" do
80
- subject.bytes("1 kB").should eql(1024)
81
- end
82
-
83
- it "should parse '2KB'" do
84
- subject.bytes("2KB").should eql(2048)
85
- end
86
-
87
- it "should parse '2.4k'" do
88
- subject.bytes("2.4k").should eql(2458)
89
- end
90
-
91
- it "should parse '0.23 MB'" do
92
- subject.bytes("0.23 MB").should eql(241172)
93
- end
94
-
95
- it "should parse '5 M'" do
96
- subject.bytes("5 M").should eql(5242880)
97
- end
98
-
99
- it "should parse '1.4gb'" do
100
- subject.bytes("1.4482gb").should eql(1554992910)
101
- end
102
-
103
- it "should parse '4G'" do
104
- subject.bytes("4G").should eql(4294967296)
105
- end
106
-
107
- it "should parse '0.0002 TB'" do
108
- subject.bytes("0.0002 TB").should eql(219902326)
109
- end
110
-
111
- it "should parse '4t'" do
112
- subject.bytes("4t").should eql(4398046511104)
113
- end
114
-
115
- it "should raise an error for unsupported values" do
116
- expect {subject.bytes([4.5])}.to raise_error(ArgumentError)
117
- end
118
-
119
- it "should raise an error for unsupported units" do
120
- expect {subject.bytes("5.2 flop/s")}.to raise_error(Vidibus::Fileinfo::UnitError)
121
- end
122
- end
123
- end
124
-
125
- describe "Fileinfo" do
126
- it "should be a shorthand for Vidibus::Fileinfo::Base.new and return file data" do
127
- mock(Vidibus::Fileinfo::Base).new("/my/face.jpg") {OpenStruct.new}
128
- stub.any_instance_of(OpenStruct).data {{:some => "thing"}}
129
- Fileinfo("/my/face.jpg").should eql({:some => "thing"})
130
- end
131
- end
@@ -1,31 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require File.expand_path("../lib/vidibus/fileinfo/version", __FILE__)
3
-
4
- Gem::Specification.new do |s|
5
- s.name = "vidibus-fileinfo"
6
- s.version = Vidibus::Fileinfo::VERSION
7
- s.platform = Gem::Platform::RUBY
8
- s.authors = "Andre Pankratz"
9
- s.email = "andre@vidibus.com"
10
- s.homepage = "https://github.com/vidibus/vidibus-fileinfo"
11
- s.summary = "Returns information about an image or video file."
12
- s.description = "Gets width, height, bits and other figures."
13
-
14
- s.required_rubygems_version = ">= 1.3.6"
15
- s.rubyforge_project = "vidibus-fileinfo"
16
-
17
- s.add_dependency "actionpack", "~> 3.0.4"
18
- s.add_dependency "vidibus-core_extensions"
19
- s.add_dependency "open4"
20
- s.add_dependency "newbamboo-rvideo"
21
-
22
- s.add_development_dependency "bundler", ">= 1.0.0"
23
- s.add_development_dependency "rake"
24
- s.add_development_dependency "rspec", "~> 2.0.0.beta.20"
25
- s.add_development_dependency "rr"
26
- s.add_development_dependency "relevance-rcov"
27
-
28
- s.files = `git ls-files`.split("\n")
29
- s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
30
- s.require_path = 'lib'
31
- end