vcs_ruby 0.8.2 → 0.8.4
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.
- data/bin/vcs.rb +2 -2
- data/lib/command.rb +16 -6
- data/lib/ffmpeg.rb +131 -4
- data/lib/font.rb +7 -2
- data/lib/libav.rb +5 -5
- data/lib/mplayer.rb +5 -1
- data/lib/thumbnail.rb +22 -4
- data/lib/tools.rb +5 -1
- data/lib/version.info +1 -1
- metadata +2 -2
data/bin/vcs.rb
CHANGED
@@ -137,7 +137,7 @@ begin
|
|
137
137
|
sheet.initialize_filename(options[:output][index]) if options[:output][index]
|
138
138
|
sheet.build
|
139
139
|
end
|
140
|
-
rescue Exception => e
|
141
|
-
STDERR.puts "ERROR: #{e.message}"
|
140
|
+
#rescue Exception => e
|
141
|
+
# STDERR.puts "ERROR: #{e.message}"
|
142
142
|
end
|
143
143
|
|
data/lib/command.rb
CHANGED
@@ -4,23 +4,33 @@
|
|
4
4
|
|
5
5
|
module VCSRuby
|
6
6
|
class Command
|
7
|
-
attr_reader :name
|
7
|
+
attr_reader :name
|
8
8
|
def initialize name, command
|
9
9
|
@name = name
|
10
10
|
@command = which(command)
|
11
11
|
@available = !!@command
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def available?
|
15
|
+
@available
|
16
|
+
end
|
16
17
|
|
18
|
+
def execute parameter, streams = 0
|
19
|
+
raise "Command '#{name}' not available" unless available?
|
20
|
+
result = nil
|
17
21
|
if Tools::windows?
|
18
|
-
|
22
|
+
streams = '2> nul' if streams === 0
|
23
|
+
|
24
|
+
result = `cmd /C #{@command} #{parameter} #{streams}`
|
19
25
|
else
|
20
|
-
|
26
|
+
streams = "2> /dev/null" if streams === 0
|
27
|
+
|
28
|
+
result =`#{@command} #{parameter} #{streams}`
|
21
29
|
end
|
22
|
-
end
|
23
30
|
|
31
|
+
raise "#{@command} failed with return value '#{$?}'"unless $? == 0
|
32
|
+
return result
|
33
|
+
end
|
24
34
|
private
|
25
35
|
# http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
|
26
36
|
def which cmd
|
data/lib/ffmpeg.rb
CHANGED
@@ -2,24 +2,151 @@
|
|
2
2
|
# FFmpeg Abstraction
|
3
3
|
#
|
4
4
|
|
5
|
-
require 'command'
|
6
5
|
require 'capturer'
|
6
|
+
require 'command'
|
7
|
+
require 'time_index'
|
7
8
|
|
8
9
|
module VCSRuby
|
9
10
|
class FFmpeg < Capturer
|
11
|
+
|
12
|
+
CODEC = 3
|
13
|
+
DIMENSION = 5
|
14
|
+
FPS = 7
|
15
|
+
|
10
16
|
def initialize video
|
11
17
|
@video = video
|
12
|
-
@
|
18
|
+
@ffmpeg = Command.new :ffmpeg, 'ffmpeg'
|
19
|
+
@ffprobe = Command.new :ffmpeg, 'ffprobe'
|
20
|
+
detect_version
|
13
21
|
end
|
14
22
|
|
15
23
|
def name
|
16
24
|
:ffmpeg
|
17
25
|
end
|
18
26
|
|
27
|
+
def available?
|
28
|
+
@ffmpeg.available? && !libav?
|
29
|
+
end
|
30
|
+
|
31
|
+
def libav?
|
32
|
+
@libav
|
33
|
+
end
|
34
|
+
|
35
|
+
def detect_version
|
36
|
+
info = @ffmpeg.execute('-version')
|
37
|
+
match = /avconv ([\d|.|-|:]*)/.match(info)
|
38
|
+
@libav = true if match
|
39
|
+
match = /ffmpeg version ([\d|.]*)/.match(info)
|
40
|
+
if match
|
41
|
+
@version = match[1]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
19
45
|
def length
|
20
|
-
|
21
|
-
match = /Duration: ([\d|:|.]*)/.match(
|
46
|
+
load_probe
|
47
|
+
match = /Duration: ([\d|:|.]*)/.match(@cache)
|
22
48
|
return TimeIndex.new match[1]
|
23
49
|
end
|
50
|
+
|
51
|
+
def width
|
52
|
+
load_probe
|
53
|
+
@width
|
54
|
+
end
|
55
|
+
|
56
|
+
def height
|
57
|
+
load_probe
|
58
|
+
@height
|
59
|
+
end
|
60
|
+
|
61
|
+
def par
|
62
|
+
load_probe
|
63
|
+
@par
|
64
|
+
end
|
65
|
+
|
66
|
+
def dar
|
67
|
+
load_probe
|
68
|
+
@dar
|
69
|
+
end
|
70
|
+
|
71
|
+
def fps
|
72
|
+
load_probe
|
73
|
+
@fps
|
74
|
+
end
|
75
|
+
|
76
|
+
def video_codec
|
77
|
+
load_probe
|
78
|
+
|
79
|
+
@video_codec
|
80
|
+
end
|
81
|
+
|
82
|
+
def audio_codec
|
83
|
+
load_probe
|
84
|
+
|
85
|
+
@audio_codec
|
86
|
+
end
|
87
|
+
|
88
|
+
def grab time, image_path
|
89
|
+
@ffmpeg.execute "-y -ss #{time.total_seconds} -i \"#{@video}\" -an -dframes 1 -vframes 1 -vcodec png -f rawvideo \"#{image_path}\""
|
90
|
+
end
|
91
|
+
|
92
|
+
def to_s
|
93
|
+
"FFmpeg #{@version}"
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
def load_probe
|
98
|
+
return if @cache
|
99
|
+
|
100
|
+
@cache = @ffprobe.execute("\"#{@video}\"", "2>&1")
|
101
|
+
puts @cache if Tools.verbose?
|
102
|
+
|
103
|
+
parse_video_streams
|
104
|
+
parse_audio_streams
|
105
|
+
end
|
106
|
+
|
107
|
+
def parse_video_streams
|
108
|
+
video_stream = split_stream_line(is_stream?(@cache, /Video/).first)
|
109
|
+
|
110
|
+
dimensions = /(\d*)x(\d*) \[PAR (\d*:\d*) DAR (\d*:\d*)\]/.match(video_stream[DIMENSION])
|
111
|
+
|
112
|
+
if dimensions
|
113
|
+
@par = dimensions[3]
|
114
|
+
@dar = dimensions[4]
|
115
|
+
else
|
116
|
+
dimensions = /(\d*)x(\d*)/.match(video_stream[DIMENSION])
|
117
|
+
end
|
118
|
+
|
119
|
+
if dimensions
|
120
|
+
@width = dimensions[1].to_i
|
121
|
+
@height = dimensions[2].to_i
|
122
|
+
end
|
123
|
+
|
124
|
+
fps = /([\d|.]+) fps/.match(video_stream[FPS])
|
125
|
+
@fps = fps ? fps[1].to_f : 0.0
|
126
|
+
|
127
|
+
@video_codec = video_stream[CODEC]
|
128
|
+
end
|
129
|
+
|
130
|
+
def parse_audio_streams
|
131
|
+
audio_stream = split_stream_line(is_stream?(@cache, /Audio/).first)
|
132
|
+
|
133
|
+
@audio_codec = audio_stream[CODEC]
|
134
|
+
end
|
135
|
+
|
136
|
+
def is_stream? probe, regex
|
137
|
+
streams(probe).select{ |s| s =~ regex }
|
138
|
+
end
|
139
|
+
|
140
|
+
def streams probe
|
141
|
+
@cache.split(/\r?\n/).map(&:strip).select{|l| l.start_with? 'Stream' }
|
142
|
+
end
|
143
|
+
|
144
|
+
def split_stream_line line
|
145
|
+
parts = line.split(',')
|
146
|
+
stream = parts.shift
|
147
|
+
result = stream.split(':')
|
148
|
+
result += parts
|
149
|
+
return result.map(&:strip)
|
150
|
+
end
|
24
151
|
end
|
25
152
|
end
|
data/lib/font.rb
CHANGED
@@ -15,8 +15,13 @@ module VCSRuby
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def find_path
|
18
|
-
|
19
|
-
|
18
|
+
if Tools::windows?
|
19
|
+
Dir.entries File.join(ENV['windir'], 'fonts')
|
20
|
+
''
|
21
|
+
else
|
22
|
+
font = `fc-list | grep #{name}`
|
23
|
+
font.split(':').first.strip
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
27
|
def line_height
|
data/lib/libav.rb
CHANGED
@@ -25,13 +25,13 @@ module VCSRuby
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def available?
|
28
|
-
@avconv.available && @avprobe.available
|
28
|
+
@avconv.available? && @avprobe.available?
|
29
29
|
end
|
30
30
|
|
31
31
|
def detect_version
|
32
|
-
info = @avconv.execute(
|
32
|
+
info = @avconv.execute('-version')
|
33
33
|
match = /avconv ([\d|.|-|:]*)/.match(info)
|
34
|
-
@version = match[1]
|
34
|
+
@version = match[1] if match
|
35
35
|
end
|
36
36
|
|
37
37
|
def length
|
@@ -78,7 +78,7 @@ module VCSRuby
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def grab time, image_path
|
81
|
-
@avconv.execute "-y -ss #{time.total_seconds} -i
|
81
|
+
@avconv.execute "-y -ss #{time.total_seconds} -i \"#{@video}\" -an -dframes 1 -vframes 1 -vcodec png -f rawvideo \"#{image_path}\""
|
82
82
|
end
|
83
83
|
|
84
84
|
def to_s
|
@@ -89,7 +89,7 @@ private
|
|
89
89
|
def load_probe
|
90
90
|
return if @cache
|
91
91
|
|
92
|
-
@cache = @avprobe.execute("
|
92
|
+
@cache = @avprobe.execute("\"#{@video}\"", "2>&1")
|
93
93
|
puts @cache if Tools.verbose?
|
94
94
|
|
95
95
|
parse_video_streams
|
data/lib/mplayer.rb
CHANGED
@@ -9,11 +9,15 @@ module VCSRuby
|
|
9
9
|
class MPlayer < Capturer
|
10
10
|
def initialize video
|
11
11
|
@video = video
|
12
|
-
@
|
12
|
+
@mplayer = Command.new :mplayer, 'mplayer'
|
13
13
|
end
|
14
14
|
|
15
15
|
def name
|
16
16
|
:mplayer
|
17
17
|
end
|
18
|
+
|
19
|
+
def available?
|
20
|
+
@mplayer.available? && false
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
data/lib/thumbnail.rb
CHANGED
@@ -14,8 +14,7 @@ module VCSRuby
|
|
14
14
|
@capper = capper
|
15
15
|
@video = video
|
16
16
|
@configuration = configuration
|
17
|
-
|
18
|
-
@filters = [method(:resize_filter), method(:timestamp_filter), method(:softshadow_filter)]
|
17
|
+
@filters = [ method(:resize_filter), method(:timestamp_filter), method(:softshadow_filter) ]
|
19
18
|
end
|
20
19
|
|
21
20
|
def capture
|
@@ -93,10 +92,29 @@ private
|
|
93
92
|
convert.repage.+
|
94
93
|
end
|
95
94
|
|
96
|
-
def polaroid_filter
|
95
|
+
def polaroid_filter convert
|
96
|
+
border = 8
|
97
|
+
convert.stack do |a|
|
98
|
+
a.fill 'White'
|
99
|
+
a.background 'White'
|
100
|
+
a.bordercolor 'White'
|
101
|
+
a.mattecolor 'White'
|
102
|
+
a.frame "#{border}x#{border}"
|
103
|
+
a.stack do |b|
|
104
|
+
b.flip
|
105
|
+
b.splice "0x#{border*5}"
|
106
|
+
end
|
107
|
+
a.flip
|
108
|
+
a.bordercolor 'Grey60'
|
109
|
+
a.border 1
|
110
|
+
a.repage.+
|
111
|
+
end
|
97
112
|
end
|
98
113
|
|
99
|
-
def random_rotation_filter
|
114
|
+
def random_rotation_filter convert
|
115
|
+
angle = Random::rand(-18..18)
|
116
|
+
convert.background 'None'
|
117
|
+
convert.rotate angle
|
100
118
|
end
|
101
119
|
|
102
120
|
def film_filter
|
data/lib/tools.rb
CHANGED
@@ -5,7 +5,11 @@
|
|
5
5
|
module VCSRuby
|
6
6
|
class Tools
|
7
7
|
def self.windows?
|
8
|
-
|
8
|
+
return ((RUBY_PLATFORM =~ /win32/ or RUBY_PLATFORM =~ /mingw32/) or (RbConfig::CONFIG['host_os'] =~ /mswin|windows/i))
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.linux?
|
12
|
+
return ((RUBY_PLATFORM =~ /linux/) or (RbConfig::CONFIG['host_os'] =~ /linux/i))
|
9
13
|
end
|
10
14
|
|
11
15
|
def self.verbose= verbose
|
data/lib/version.info
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.8.
|
1
|
+
0.8.5
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcs_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-04-
|
12
|
+
date: 2016-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mini_magick
|