wgif 0.0.1.pre
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 +17 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/Brewfile +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +90 -0
- data/Rakefile +5 -0
- data/bin/wgif +4 -0
- data/lib/wgif.rb +9 -0
- data/lib/wgif/cli.rb +125 -0
- data/lib/wgif/download_bar.rb +28 -0
- data/lib/wgif/downloader.rb +84 -0
- data/lib/wgif/exceptions.rb +24 -0
- data/lib/wgif/gif_maker.rb +19 -0
- data/lib/wgif/installer.rb +34 -0
- data/lib/wgif/version.rb +3 -0
- data/lib/wgif/video.rb +58 -0
- data/lib/wgif/video_cache.rb +18 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/wgif/cli_spec.rb +191 -0
- data/spec/wgif/download_bar_spec.rb +38 -0
- data/spec/wgif/downloader_spec.rb +72 -0
- data/spec/wgif/gif_maker_spec.rb +26 -0
- data/spec/wgif/installer_spec.rb +82 -0
- data/spec/wgif/video_cache_spec.rb +16 -0
- data/spec/wgif/video_spec.rb +76 -0
- data/wgif.gemspec +34 -0
- metadata +222 -0
@@ -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
|