wgif 0.0.1.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'wgif/gif_maker'
3
+ require 'wgif/video'
4
+
5
+ describe WGif::GifMaker do
6
+ let(:gif_maker) { described_class.new }
7
+ let(:image) { double(Magick::Image) }
8
+ let(:images) { double(Magick::ImageList, each: nil) }
9
+
10
+ before do
11
+ Magick::ImageList.stub(:new).and_return(images)
12
+ end
13
+
14
+ it 'converts a directory of frames to a gif' do
15
+ images.should_receive(:coalesce)
16
+ images.should_receive(:optimize_layers)
17
+ images.should_receive(:write).with('bjork.gif')
18
+ gif_maker.make_gif([], 'bjork.gif', '500')
19
+ end
20
+
21
+ it 'resizes the image' do
22
+ expect(image).to receive(:change_geometry).with('500')
23
+ gif_maker.resize([image], '500')
24
+ end
25
+
26
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+ require 'wgif/installer'
3
+
4
+ describe WGif::Installer do
5
+ let(:installer) { described_class.new }
6
+
7
+ before do
8
+ @mock_stdout = StringIO.new
9
+ @real_stdout, $stdout = $stdout, @mock_stdout
10
+ end
11
+
12
+ after do
13
+ $stdout = @real_stdout
14
+ end
15
+
16
+ context 'checking for Homebrew' do
17
+
18
+ it 'finds Homebrew when it exists' do
19
+ expect(Kernel).to receive(:system).with('brew info > /dev/null').
20
+ and_return(true)
21
+ expect(installer.homebrew_installed?).to eq(true)
22
+ end
23
+
24
+ it 'returns false when Homebrew does not exist' do
25
+ expect(Kernel).to receive(:system).with('brew info > /dev/null').
26
+ and_return(false)
27
+ expect(installer.homebrew_installed?).to eq(false)
28
+ end
29
+
30
+ end
31
+
32
+ context 'installing dependencies' do
33
+
34
+ it 'does not install dependencies if they are found' do
35
+ expect(Kernel).to receive(:system).with('which ffmpeg > /dev/null').
36
+ and_return(true)
37
+ expect(Kernel).not_to receive(:system).with('brew install ffmpeg > /dev/null')
38
+ installer.install('ffmpeg', 'ffmpeg')
39
+ end
40
+
41
+ it 'installs dependencies' do
42
+ expect(Kernel).to receive(:system).with('which ffmpeg > /dev/null').
43
+ and_return(false)
44
+ expect(Kernel).to receive(:system).with('brew install ffmpeg > /dev/null')
45
+ installer.install('ffmpeg', 'ffmpeg')
46
+ end
47
+
48
+ it 'has a list of its dependencies' do
49
+ expect(installer.class::DEPENDENCIES).
50
+ to eq([['ffmpeg', 'ffmpeg'],
51
+ ['imagemagick', 'convert']])
52
+ end
53
+
54
+ it 'checks if a dependency exists' do
55
+ expect(Kernel).to receive(:system).with('which convert > /dev/null')
56
+ installer.installed?('convert')
57
+ end
58
+
59
+ end
60
+
61
+ context 'running' do
62
+
63
+ it 'installs all dependencies' do
64
+ expect(Kernel).to receive(:system).with('brew info > /dev/null').
65
+ and_return(true)
66
+ expect(Kernel).to receive(:system).with('which ffmpeg > /dev/null').
67
+ and_return(true)
68
+ expect(Kernel).to receive(:system).with('which convert > /dev/null').
69
+ and_return(false)
70
+ expect(Kernel).to receive(:system).with('brew install imagemagick > /dev/null')
71
+ installer.run
72
+ end
73
+
74
+ it 'prints a helpful error if homebrew is not found' do
75
+ expect(Kernel).to receive(:system).with('brew info > /dev/null').
76
+ and_return(false)
77
+ expect{ installer.run }.to raise_error(SystemExit)
78
+ expect(@mock_stdout.string).to eq("WGif can't find Homebrew. Visit http://brew.sh/ to get it.\n")
79
+ end
80
+ end
81
+
82
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'wgif/video_cache'
3
+
4
+ describe WGif::VideoCache do
5
+
6
+ let(:cache) { described_class.new }
7
+
8
+ it 'checks for existing video files in /tmp' do
9
+ pathname = double(Pathname)
10
+ expect(Pathname).to receive(:new).and_return(pathname)
11
+ expect(pathname).to receive(:exist?).and_return(true)
12
+ expect(WGif::Video).to receive(:new).with('video', '/tmp/wgif/video')
13
+ cache.get('video')
14
+ end
15
+
16
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+ require 'wgif/video'
3
+
4
+ describe WGif::Video do
5
+ let(:clip) { double(FFMPEG::Movie) }
6
+
7
+ before do
8
+ FFMPEG::Movie.stub(:new).and_return(clip)
9
+ end
10
+
11
+ it 'has a name and filepath' do
12
+ clip.stub(:path).and_return('/tmp/wgif/bjork.mp4')
13
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
14
+ video.name.should eq("bjork")
15
+ video.clip.path.should eq("/tmp/wgif/bjork.mp4")
16
+ end
17
+
18
+ it 'sets up a logger' do
19
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
20
+ video.logger.instance_variable_get(:@logdev).filename.should eq("/tmp/wgif/bjork.log")
21
+ end
22
+
23
+ it 'redirects FFMPEG log output to a file' do
24
+ expect(FFMPEG).to receive(:logger=).with(an_instance_of(Logger))
25
+ video = described_class.new "penguin", "spec/fixtures/penguin.mp4"
26
+ end
27
+
28
+ it 'is trimmable' do
29
+ clip.stub(:duration).and_return(5.0)
30
+ expect(clip).to receive(:transcode)
31
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
32
+ video = video.trim("00:00:00", 5.0)
33
+ video.clip.duration.should eq(5.0)
34
+ end
35
+
36
+ it 'returns its frames' do
37
+ expect(clip).to receive(:transcode)
38
+ FileUtils.stub(:rm)
39
+ fake_frames = ["one", "two", "three"]
40
+ expect(Dir).to receive(:glob).with('/tmp/wgif/frames/*.png').twice.
41
+ and_return(fake_frames)
42
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
43
+ frames = video.to_frames
44
+ frames.count.should eq(3)
45
+ end
46
+
47
+ it 'returns a specific number of frames' do
48
+ frames = '/tmp/wgif/frames/%2d.png'
49
+ options = '-vf fps=5'
50
+ expect(clip).to receive(:transcode).with(frames, options)
51
+ FileUtils.stub(:rm)
52
+ expect(clip).to receive(:duration).and_return 2
53
+ expect(Dir).to receive(:glob).with('/tmp/wgif/frames/*.png').twice
54
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
55
+ frames = video.to_frames(frames: 10)
56
+ end
57
+
58
+ it 'catches transcode errors and raises an exception' do
59
+ expect(clip).to receive(:transcode).and_raise(FFMPEG::Error)
60
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
61
+ expect{ video.trim("00:00:00", 5.0) }.to raise_error(WGif::ClipEncodingException)
62
+ end
63
+
64
+ it 'silences transcode errors from ripping frames' do
65
+ expect(clip).to receive(:transcode).and_raise(FFMPEG::Error.new "no output file created")
66
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
67
+ expect{ video.trim("00:00:00", 5.0) }.not_to raise_error
68
+ end
69
+
70
+ it 'silences transcode errors from ripping frames when input is invalid' do
71
+ message = "no output file created. Invalid data found when processing input"
72
+ expect(clip).to receive(:transcode).and_raise(FFMPEG::Error.new message)
73
+ video = described_class.new "bjork", "/tmp/wgif/bjork.mp4"
74
+ expect{ video.trim("00:00:00", 5.0) }.to raise_error(WGif::ClipEncodingException)
75
+ end
76
+ end
data/wgif.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'wgif/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "wgif"
8
+ spec.version = WGif::VERSION
9
+ spec.authors = ["Connor Mendenhall"]
10
+ spec.email = ["ecmendenhall@gmail.com"]
11
+ spec.description = %q{A command-line tool for creating animated GIFs.}
12
+ spec.summary = %q{A command-line tool for creating animated GIFs from YouTube videos. Uses FFmpeg and ImageMagick.}
13
+ spec.homepage = "https://github.com/ecmendenhall/wgif"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = ["wgif"]
18
+ #spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+
23
+ spec.add_dependency "rmagick"
24
+ spec.add_dependency "ruby-progressbar"
25
+ spec.add_dependency "streamio-ffmpeg"
26
+ spec.add_dependency "typhoeus", "~> 0.6"
27
+ spec.add_dependency "viddl-rb"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.3"
30
+ spec.add_development_dependency "pry"
31
+ spec.add_development_dependency "rake"
32
+ spec.add_development_dependency "rspec", "~> 2.14"
33
+ spec.add_development_dependency "simplecov"
34
+ end
metadata ADDED
@@ -0,0 +1,222 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wgif
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1.pre
5
+ platform: ruby
6
+ authors:
7
+ - Connor Mendenhall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rmagick
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-progressbar
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: streamio-ffmpeg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
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: typhoeus
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: viddl-rb
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
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: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '2.14'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '2.14'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: A command-line tool for creating animated GIFs.
154
+ email:
155
+ - ecmendenhall@gmail.com
156
+ executables:
157
+ - wgif
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - .gitignore
162
+ - .ruby-version
163
+ - .travis.yml
164
+ - Brewfile
165
+ - Gemfile
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/wgif
170
+ - lib/wgif.rb
171
+ - lib/wgif/cli.rb
172
+ - lib/wgif/download_bar.rb
173
+ - lib/wgif/downloader.rb
174
+ - lib/wgif/exceptions.rb
175
+ - lib/wgif/gif_maker.rb
176
+ - lib/wgif/installer.rb
177
+ - lib/wgif/version.rb
178
+ - lib/wgif/video.rb
179
+ - lib/wgif/video_cache.rb
180
+ - spec/spec_helper.rb
181
+ - spec/wgif/cli_spec.rb
182
+ - spec/wgif/download_bar_spec.rb
183
+ - spec/wgif/downloader_spec.rb
184
+ - spec/wgif/gif_maker_spec.rb
185
+ - spec/wgif/installer_spec.rb
186
+ - spec/wgif/video_cache_spec.rb
187
+ - spec/wgif/video_spec.rb
188
+ - wgif.gemspec
189
+ homepage: https://github.com/ecmendenhall/wgif
190
+ licenses:
191
+ - MIT
192
+ metadata: {}
193
+ post_install_message:
194
+ rdoc_options: []
195
+ require_paths:
196
+ - lib
197
+ required_ruby_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ required_rubygems_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '>'
205
+ - !ruby/object:Gem::Version
206
+ version: 1.3.1
207
+ requirements: []
208
+ rubyforge_project:
209
+ rubygems_version: 2.0.3
210
+ signing_key:
211
+ specification_version: 4
212
+ summary: A command-line tool for creating animated GIFs from YouTube videos. Uses
213
+ FFmpeg and ImageMagick.
214
+ test_files:
215
+ - spec/spec_helper.rb
216
+ - spec/wgif/cli_spec.rb
217
+ - spec/wgif/download_bar_spec.rb
218
+ - spec/wgif/downloader_spec.rb
219
+ - spec/wgif/gif_maker_spec.rb
220
+ - spec/wgif/installer_spec.rb
221
+ - spec/wgif/video_cache_spec.rb
222
+ - spec/wgif/video_spec.rb