vollbremsung 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +34 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +4 -0
- data/Rakefile +0 -0
- data/bin/vollbremsung +218 -0
- data/lib/vollbremsung.rb +14 -0
- data/vollbremsung.gemspec +23 -0
- metadata +66 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NmFlZDEyNzA5YWQ0NTdlZWQyMzc2ODA0ODkyMGY5NDQzZDE1NjBkNQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ODVmMDRiNTkwMDlmOTg4OWNkNDUxNzgxY2UxMDhjMTQ4NDE2ZGFiNw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
NDQzYTk3NzllODgzNjdkNzNiZDQ2NTVmNWY3MDZkNTY2YzI2NmQxNmMzYmU1
|
10
|
+
MzA0YWU0OTQwNTJlMWJlOTg5ZWJhZWZiZTg1YjBjYzg4Y2U1ODQ3NzE4ODI1
|
11
|
+
ZGI4NWYwMDZkZDI4MzYxNTYzNGU3MDIzNjkxYTFmMDdjNjViMjM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDVhOTNkMGI1NDgxM2U3ZDA1NmY0NWQ1NjI3YmY1M2IzYThhODJiOWIxNjVh
|
14
|
+
ZGM1MzIwNTFlYjk5ZmYyZmJjZjQyOTNkNjA1MjM3NmQ0Yzg1N2RmOTgyMDVl
|
15
|
+
NjhmZTVlYjMxMWVmODhiOTI0ZDIzMDMyYTExZDliODdjNjc3ZDg=
|
data/.gitignore
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
/.config
|
4
|
+
/coverage/
|
5
|
+
/InstalledFiles
|
6
|
+
/pkg/
|
7
|
+
/spec/reports/
|
8
|
+
/test/tmp/
|
9
|
+
/test/version_tmp/
|
10
|
+
/tmp/
|
11
|
+
|
12
|
+
## Specific to RubyMotion:
|
13
|
+
.dat*
|
14
|
+
.repl_history
|
15
|
+
build/
|
16
|
+
|
17
|
+
## Documentation cache and generated files:
|
18
|
+
/.yardoc/
|
19
|
+
/_yardoc/
|
20
|
+
/doc/
|
21
|
+
/rdoc/
|
22
|
+
|
23
|
+
## Environment normalisation:
|
24
|
+
/.bundle/
|
25
|
+
/lib/bundler/man/
|
26
|
+
|
27
|
+
# for a library or gem, you might want to ignore these files since the code is
|
28
|
+
# intended to run in multiple environments; otherwise, check them in:
|
29
|
+
# Gemfile.lock
|
30
|
+
# .ruby-version
|
31
|
+
# .ruby-gemset
|
32
|
+
|
33
|
+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
34
|
+
.rvmrc
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Maximilian Irro
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
File without changes
|
data/bin/vollbremsung
ADDED
@@ -0,0 +1,218 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- encoding : utf-8 -*-
|
3
|
+
|
4
|
+
require 'mkmf' # part of stdlib
|
5
|
+
require 'open3'
|
6
|
+
require 'json'
|
7
|
+
require 'handbrake'
|
8
|
+
require 'vollbremsung'
|
9
|
+
|
10
|
+
def log(msg)
|
11
|
+
puts Time.new.strftime("%Y-%m-%d %H:%M:%S") + " #{msg}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def ffprobe(file)
|
15
|
+
stdout,stderr,status = Open3.capture3("ffprobe -v quiet -print_format json -show_format -show_streams \"#{file}\"")
|
16
|
+
if status.success?
|
17
|
+
return JSON.parse(stdout)
|
18
|
+
else
|
19
|
+
STDERR.puts stderr
|
20
|
+
return nil
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
options = {}
|
25
|
+
begin
|
26
|
+
require 'optparse'
|
27
|
+
OptionParser.new do |opts|
|
28
|
+
opts.banner = Vollbremsung::USAGE
|
29
|
+
opts.separator ""
|
30
|
+
|
31
|
+
opts.on("-d", "--delete", "Delete source files after successful encoding") do |flag|
|
32
|
+
options[:delete] = true
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-m", "--move", "Move source files to <FILENAME>.old after successful encoding") do |flag|
|
36
|
+
options[:move] = true
|
37
|
+
end
|
38
|
+
|
39
|
+
opts.on("-r", "--recursive", "Process all file in subdirectories recursively as well") do |flag|
|
40
|
+
options[:recursive] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on("-t", "--title", "Set the mp4 title to the filename") do |flag|
|
44
|
+
options[:title] = true
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
48
|
+
puts opts
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
end.parse! # do the parsing. do it now!
|
52
|
+
rescue LoadError
|
53
|
+
puts "Option parsing not supported on your system. All options will be ignored."
|
54
|
+
puts "To enable support run 'gem install optparse'"
|
55
|
+
options[:delete] = false
|
56
|
+
options[:move] = false
|
57
|
+
options[:recursive] = false
|
58
|
+
options[:title] = false
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
if ARGV[0].nil?
|
63
|
+
puts "No target directory provided."
|
64
|
+
puts Vollbremsung::USAGE
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
|
68
|
+
TARGET_PATH = ARGV[0]
|
69
|
+
|
70
|
+
unless File.exists?(TARGET_PATH)
|
71
|
+
puts "The target path you provided does not exists."
|
72
|
+
exit 1
|
73
|
+
end
|
74
|
+
|
75
|
+
if options[:move] && options[:delete]
|
76
|
+
puts "--delete (-d) and --move (-m) are mutually exclusive - choose one!"
|
77
|
+
puts "It is not possible to delete and move the source files at the same time."
|
78
|
+
exit 1
|
79
|
+
end
|
80
|
+
|
81
|
+
unless find_executable('HandbrakeCLI') || find_executable('HandBrakeCLI')
|
82
|
+
puts "It seems you do not have HandbrakeCLI installed or it is not available in your $PATH."
|
83
|
+
puts "Install it an run again"
|
84
|
+
exit 1
|
85
|
+
end
|
86
|
+
|
87
|
+
unless find_executable 'ffprobe'
|
88
|
+
puts "It seems you do not have ffprobe installed or it is not available in your $PATH."
|
89
|
+
puts "ffprobe is part of ffmpeg. Install it for your system and run again."
|
90
|
+
exit 1
|
91
|
+
end
|
92
|
+
|
93
|
+
File.delete 'mkmf.log' # find_executable seems to create such file in case executable is not found
|
94
|
+
|
95
|
+
#StreamStruct = Struct.new(:count,:names)
|
96
|
+
|
97
|
+
#HANDBRAKE_OPTIONS = "--encoder x264 --quality 20.0 --aencode faac -B 160 --mixdown dpl2 --arate Auto -D 0.0 --format mp4 --markers --audio-copy-mask aac,ac3,dtshd,dts,mp3 --audio-fallback ffac3 --x264-preset veryfast --loose-anamorphic --modulus 2"
|
98
|
+
|
99
|
+
log "probing for target files..."
|
100
|
+
target_files = []
|
101
|
+
log "Files found:"
|
102
|
+
if File.directory?(TARGET_PATH)
|
103
|
+
|
104
|
+
scope = options[:recursive] ? "/**/*" : "/*"
|
105
|
+
|
106
|
+
Dir[TARGET_PATH + scope].sort.each do |file|
|
107
|
+
unless File.directory?(file)
|
108
|
+
if Vollbremsung::CONVERT_TYPES.include?(File.extname(file).downcase[1..-1])
|
109
|
+
puts "* " + file[TARGET_PATH.length+1..-1]
|
110
|
+
target_files << file
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
else
|
116
|
+
puts "* " + TARGET_PATH
|
117
|
+
target_files << File.absolute_path(TARGET_PATH)
|
118
|
+
end
|
119
|
+
|
120
|
+
target_files.each do |infile|
|
121
|
+
|
122
|
+
metadata = ffprobe(infile)
|
123
|
+
if metadata.nil?
|
124
|
+
log "ERROR retrieving metadata -- skipping this file"
|
125
|
+
next
|
126
|
+
end
|
127
|
+
|
128
|
+
astreams = Vollbremsung::StreamDescr.new
|
129
|
+
sstreams = Vollbremsung::StreamDescr.new
|
130
|
+
|
131
|
+
metadata['streams'].each do |stream|
|
132
|
+
case stream['codec_type']
|
133
|
+
when 'audio'
|
134
|
+
astreams.count += 1
|
135
|
+
astreams.names << stream['tags']['title'] unless stream['tags'].nil? || stream['tags']['title'].nil?
|
136
|
+
when 'subtitle'
|
137
|
+
sstreams.count += 1
|
138
|
+
sstreams.names << stream['tags']['title'] unless stream['tags'].nil? || stream['tags']['title'].nil?
|
139
|
+
else
|
140
|
+
# this is attachment stuff, like typefonts --> ignore
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
infile_basename = File.basename(infile)
|
146
|
+
infile_basename_noext = File.basename(infile, File.extname(infile)) # without ext
|
147
|
+
infile_dirname = File.dirname(infile)
|
148
|
+
infile_path_noext = File.join(infile_dirname, infile_basename_noext)
|
149
|
+
infile_relative_path = #File.directory?(TARGET_PATH) ? infile[TARGET_PATH.length+1..-1] : File.basename(TARGET_PATH)
|
150
|
+
if File.directory?(TARGET_PATH)
|
151
|
+
infile[TARGET_PATH.length+1..-1]
|
152
|
+
else
|
153
|
+
File.basename(TARGET_PATH)
|
154
|
+
end
|
155
|
+
|
156
|
+
outfile = "#{infile_path_noext}.mp4"
|
157
|
+
|
158
|
+
log "processing: #{infile_relative_path}"
|
159
|
+
|
160
|
+
#%x( #{HANDBRAKE_CLI} #{HANDBRAKE_OPTIONS} --audio #{(1..astreams.count).to_a.join(',')} --aname #{astreams.names.join(',')} --subtitle #{(1..sstreams.count).to_a.join(',')} -i \"#{infile}\" -o \"#{outfile}\" 2>&1 )
|
161
|
+
|
162
|
+
success = false
|
163
|
+
begin
|
164
|
+
HandBrake::CLI.new.input(infile).encoder('x264').quality('20.0').aencoder('faac').
|
165
|
+
ab('160').mixdown('dpl2').arate('Auto').drc('0.0').format('mp4').markers.
|
166
|
+
audio_copy_mask('aac,ac3,dtshd,dts,mp3').audio_fallback('ffac3').x264_preset('veryfast').
|
167
|
+
loose_anamorphic.modulus('2').audio((1..astreams.count).to_a.join(',')).aname(astreams.names.join(',')).
|
168
|
+
subtitle((1..sstreams.count).to_a.join(',')).output(outfile)
|
169
|
+
|
170
|
+
# if we make it here, encoding went well
|
171
|
+
log "SUCCESS: encoding done"
|
172
|
+
success = true
|
173
|
+
rescue
|
174
|
+
log "ERROR: Handbrake exited with an error"
|
175
|
+
end # HandBrake::CLI
|
176
|
+
|
177
|
+
if success
|
178
|
+
infile_size = File.size(infile)
|
179
|
+
outfile_size = File.size(outfile)
|
180
|
+
|
181
|
+
log "compression ratio: %.2f" % (outfile_size.to_f / infile_size.to_f)
|
182
|
+
|
183
|
+
if options[:title]
|
184
|
+
log "setting mp4 title"
|
185
|
+
|
186
|
+
infile_noext = File.join( File.dirname(infile), File.basename(infile,File.extname(infile)))
|
187
|
+
tmpfile = infile_noext + ".tmp.mp4"
|
188
|
+
|
189
|
+
%x( ffmpeg -i \"#{outfile}\" -metadata title=\"#{infile_basename_noext}\" #{Vollbremsung::FFMPEG_OPTIONS} \"#{tmpfile}\" 2>&1 )
|
190
|
+
|
191
|
+
if $?.exitstatus == 0
|
192
|
+
begin
|
193
|
+
File.delete outfile
|
194
|
+
File.rename tmpfile, outfile
|
195
|
+
rescue
|
196
|
+
log "ERROR: moving #{tmpfile} to #{outfile}"
|
197
|
+
end
|
198
|
+
else
|
199
|
+
log "ERROR: mp4 title could not be changed"
|
200
|
+
end
|
201
|
+
end # if options[:title]
|
202
|
+
|
203
|
+
if options[:move]
|
204
|
+
log "moving source file to *.old"
|
205
|
+
File.rename(infile, "#{infile}.old") rescue log "ERROR: renaming source file"
|
206
|
+
elsif options[:delete]
|
207
|
+
log "deleting source file"
|
208
|
+
File.delete(infile) rescue log "ERROR: deleting source file"
|
209
|
+
end
|
210
|
+
|
211
|
+
end # if success
|
212
|
+
end # target_files.each
|
213
|
+
|
214
|
+
if target_files.empty?
|
215
|
+
log "nothing to do"
|
216
|
+
else
|
217
|
+
log "all items processed"
|
218
|
+
end
|
data/lib/vollbremsung.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Vollbremsung
|
2
|
+
|
3
|
+
USAGE = "Usage: vollbremsung [options] <target>"
|
4
|
+
VERSION = '0.0.8'
|
5
|
+
CONVERT_TYPES = ['mkv','avi','mov','flv','mpg','wmv']
|
6
|
+
FFMPEG_OPTIONS = "-map 0 -acodec copy -vcodec copy -scodec copy"
|
7
|
+
|
8
|
+
class StreamDescr < Struct.new(:count,:names)
|
9
|
+
def initialize
|
10
|
+
super(0,[])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vollbremsung'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'vollbremsung'
|
8
|
+
spec.version = Vollbremsung::VERSION
|
9
|
+
spec.date = '2014-08-13'
|
10
|
+
spec.summary = "Handbrake bulk encoding tool"
|
11
|
+
spec.description = "Handbrake bulk encoding tool"
|
12
|
+
spec.author = "Maximilian Irro"
|
13
|
+
spec.email = 'max@disposia.org'
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
15
|
+
spec.executables = ['vollbremsung']
|
16
|
+
spec.homepage = 'https://github.com/mpgirro/vollbremsung'
|
17
|
+
spec.license = 'MIT'
|
18
|
+
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.required_ruby_version = '>= 1.9.3'
|
22
|
+
spec.add_dependency 'handbrake', '~> 0'
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vollbremsung
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.8
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Maximilian Irro
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: handbrake
|
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
|
+
description: Handbrake bulk encoding tool
|
28
|
+
email: max@disposia.org
|
29
|
+
executables:
|
30
|
+
- vollbremsung
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- .gitignore
|
35
|
+
- Gemfile
|
36
|
+
- LICENSE
|
37
|
+
- README.md
|
38
|
+
- Rakefile
|
39
|
+
- bin/vollbremsung
|
40
|
+
- lib/vollbremsung.rb
|
41
|
+
- vollbremsung.gemspec
|
42
|
+
homepage: https://github.com/mpgirro/vollbremsung
|
43
|
+
licenses:
|
44
|
+
- MIT
|
45
|
+
metadata: {}
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.9.3
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ! '>='
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0'
|
60
|
+
requirements: []
|
61
|
+
rubyforge_project:
|
62
|
+
rubygems_version: 2.4.1
|
63
|
+
signing_key:
|
64
|
+
specification_version: 4
|
65
|
+
summary: Handbrake bulk encoding tool
|
66
|
+
test_files: []
|