mkv2m4v 0.2.0 → 0.3.0
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/LICENSE.txt +2 -2
- data/lib/mkv2m4v/transcoder.rb +36 -7
- data/lib/mkv2m4v/version.rb +2 -2
- data/lib/mkv2m4v.rb +1 -1
- data/mkv2m4v.gemspec +1 -1
- metadata +37 -43
data/LICENSE.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2012 Ryan McGeary
|
1
|
+
Copyright (c) 2012-2013 Ryan McGeary
|
2
2
|
|
3
3
|
MIT License
|
4
4
|
|
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
19
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
20
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
21
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/mkv2m4v/transcoder.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require "fileutils"
|
2
2
|
require "colorize"
|
3
|
+
require "shellwords"
|
4
|
+
require "iso639/language"
|
3
5
|
|
4
6
|
module Mkv2m4v
|
5
7
|
class Transcoder
|
@@ -26,7 +28,11 @@ module Mkv2m4v
|
|
26
28
|
|
27
29
|
def extract
|
28
30
|
puts "==> Extracting #{video_id}:video.#{video_ext} #{audio_id}:audio.#{audio_ext} ".magenta
|
29
|
-
|
31
|
+
command = "mkvextract tracks"
|
32
|
+
command << " #{escape(@file.filename)}"
|
33
|
+
command << " #{video_id}:#{escape(video_file)}"
|
34
|
+
command << " #{audio_id}:#{escape(audio_file)}"
|
35
|
+
system command
|
30
36
|
end
|
31
37
|
|
32
38
|
def transcode_avc
|
@@ -42,7 +48,11 @@ module Mkv2m4v
|
|
42
48
|
puts "==> Assuming pass through for AAC audio track".yellow.on_black
|
43
49
|
else
|
44
50
|
puts "==> Transcoding #{audio_format} to Stereo AAC audio track".magenta
|
45
|
-
|
51
|
+
command = "ffmpeg"
|
52
|
+
command << " -i #{escape(audio_file)}"
|
53
|
+
command << " -acodec libfaac -ac 2 -ab 160k"
|
54
|
+
command << " #{escape(audio_basename)}.aac"
|
55
|
+
system command
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
@@ -54,19 +64,24 @@ module Mkv2m4v
|
|
54
64
|
@skip_ac3 = true
|
55
65
|
else
|
56
66
|
puts "==> Transcoding #{audio_format} to Surround AC-3 audio track".magenta
|
57
|
-
|
67
|
+
command = "ffmpeg"
|
68
|
+
command << " -i #{escape(audio_file)}"
|
69
|
+
command << " -acodec ac3 -ac #{max_audio_channels} -ab #{max_audio_bit_rate}k"
|
70
|
+
command << " #{escape(audio_basename)}.ac3"
|
71
|
+
system command
|
58
72
|
end
|
59
73
|
end
|
60
74
|
|
61
75
|
def remux
|
62
76
|
puts "==> Remuxing everything into an M4V container".magenta
|
63
77
|
command = "MP4Box"
|
64
|
-
command << " -add #{video_basename
|
65
|
-
command << " -add #{audio_basename
|
78
|
+
command << " -add #{escape(video_basename)}.h264:lang=#{video_language.alpha3_terminology}:name=\"AVC Video\""
|
79
|
+
command << " -add #{escape(audio_basename)}.aac:lang=#{audio_language.alpha3_terminology}:group=1:delay=84:name=\"Stereo\""
|
66
80
|
unless @skip_ac3
|
67
|
-
command << " -add #{audio_basename
|
81
|
+
command << " -add #{escape(audio_basename)}.ac3:lang=#{audio_language.alpha3_terminology}:group=1:delay=84:disable:name=\"AC3\" "
|
68
82
|
end
|
69
|
-
command << " -new #{m4v_file
|
83
|
+
command << " -new #{escape(m4v_file)}"
|
84
|
+
puts command
|
70
85
|
system command
|
71
86
|
end
|
72
87
|
|
@@ -98,6 +113,10 @@ module Mkv2m4v
|
|
98
113
|
end
|
99
114
|
end
|
100
115
|
|
116
|
+
def video_language
|
117
|
+
@file.ideal_video_track.language || @options[:languages].first || UnknownLanguage
|
118
|
+
end
|
119
|
+
|
101
120
|
def audio_basename
|
102
121
|
::File.join(tmp_dir, "audio")
|
103
122
|
end
|
@@ -118,6 +137,10 @@ module Mkv2m4v
|
|
118
137
|
audio_format.gsub(/\W/, "").downcase
|
119
138
|
end
|
120
139
|
|
140
|
+
def audio_language
|
141
|
+
@file.ideal_audio_track.language || @options[:languages].first || UnknownLanguage
|
142
|
+
end
|
143
|
+
|
121
144
|
def max_audio_channels
|
122
145
|
[@file.ideal_audio_track.channel_count, 6].min
|
123
146
|
end
|
@@ -137,5 +160,11 @@ module Mkv2m4v
|
|
137
160
|
def m4v_file
|
138
161
|
::File.join(dir, ::File.basename(@file.name, ".*") + ".m4v")
|
139
162
|
end
|
163
|
+
|
164
|
+
def escape(str)
|
165
|
+
Shellwords.escape(str)
|
166
|
+
end
|
167
|
+
|
168
|
+
UnknownLanguage = Iso639::Language.new("", "", "", "", "")
|
140
169
|
end
|
141
170
|
end
|
data/lib/mkv2m4v/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Mkv2m4v
|
2
|
-
VERSION = "0.
|
2
|
+
VERSION = "0.3.0"
|
3
3
|
|
4
|
-
VersionDescription = "mkv2m4v #{VERSION} (c) 2012 Ryan McGeary"
|
4
|
+
VersionDescription = "mkv2m4v #{VERSION} (c) 2012-2013 Ryan McGeary"
|
5
5
|
Description = <<EOS
|
6
6
|
mkv2m4v is a command line utility that converts audio and video tracks from a
|
7
7
|
MKV (Matroska Media) container into a format compatible with Apple TVs.
|
data/lib/mkv2m4v.rb
CHANGED
@@ -30,7 +30,7 @@ module Mkv2m4v
|
|
30
30
|
banner [Mkv2m4v::Description, Mkv2m4v::Usage].join("\n")
|
31
31
|
opt :info, "Print media info only"
|
32
32
|
opt :lang, "Preferred languages, comma separated", :type => :string, :default => "English"
|
33
|
-
opt :dir, "Destination directory", :type => :string
|
33
|
+
opt :dir, "Destination directory (default: same dir as source mkv)", :type => :string
|
34
34
|
end
|
35
35
|
parse_languages
|
36
36
|
@filenames = ARGV
|
data/mkv2m4v.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_dependency "trollop", "~> 2.0"
|
21
21
|
gem.add_dependency "mediainfo", "~> 0.7"
|
22
|
-
gem.add_dependency "iso639", "~> 1.
|
22
|
+
gem.add_dependency "iso639", "~> 1.1"
|
23
23
|
gem.add_dependency "colorize", "~> 0.5"
|
24
24
|
|
25
25
|
gem.add_development_dependency "minitest", "~> 4.3"
|
metadata
CHANGED
@@ -2,117 +2,111 @@
|
|
2
2
|
name: mkv2m4v
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ryan McGeary
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
version_requirements: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.0'
|
20
|
-
none: false
|
21
15
|
name: trollop
|
22
16
|
type: :runtime
|
23
|
-
prerelease: false
|
24
17
|
requirement: !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
25
19
|
requirements:
|
26
20
|
- - ~>
|
27
21
|
- !ruby/object:Gem::Version
|
28
22
|
version: '2.0'
|
29
|
-
|
30
|
-
- !ruby/object:Gem::Dependency
|
23
|
+
prerelease: false
|
31
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
32
26
|
requirements:
|
33
27
|
- - ~>
|
34
28
|
- !ruby/object:Gem::Version
|
35
|
-
version: '0
|
36
|
-
|
29
|
+
version: '2.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
37
31
|
name: mediainfo
|
38
32
|
type: :runtime
|
39
|
-
prerelease: false
|
40
33
|
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
41
35
|
requirements:
|
42
36
|
- - ~>
|
43
37
|
- !ruby/object:Gem::Version
|
44
38
|
version: '0.7'
|
45
|
-
|
46
|
-
- !ruby/object:Gem::Dependency
|
39
|
+
prerelease: false
|
47
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
48
42
|
requirements:
|
49
43
|
- - ~>
|
50
44
|
- !ruby/object:Gem::Version
|
51
|
-
version: '
|
52
|
-
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.5
|
55
|
-
none: false
|
45
|
+
version: '0.7'
|
46
|
+
- !ruby/object:Gem::Dependency
|
56
47
|
name: iso639
|
57
48
|
type: :runtime
|
58
|
-
prerelease: false
|
59
49
|
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
60
51
|
requirements:
|
61
52
|
- - ~>
|
62
53
|
- !ruby/object:Gem::Version
|
63
|
-
version: '1.
|
64
|
-
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.0.5
|
67
|
-
none: false
|
68
|
-
- !ruby/object:Gem::Dependency
|
54
|
+
version: '1.1'
|
55
|
+
prerelease: false
|
69
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
70
58
|
requirements:
|
71
59
|
- - ~>
|
72
60
|
- !ruby/object:Gem::Version
|
73
|
-
version: '
|
74
|
-
|
61
|
+
version: '1.1'
|
62
|
+
- !ruby/object:Gem::Dependency
|
75
63
|
name: colorize
|
76
64
|
type: :runtime
|
77
|
-
prerelease: false
|
78
65
|
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
79
67
|
requirements:
|
80
68
|
- - ~>
|
81
69
|
- !ruby/object:Gem::Version
|
82
70
|
version: '0.5'
|
83
|
-
|
84
|
-
- !ruby/object:Gem::Dependency
|
71
|
+
prerelease: false
|
85
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
86
74
|
requirements:
|
87
75
|
- - ~>
|
88
76
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
90
|
-
|
77
|
+
version: '0.5'
|
78
|
+
- !ruby/object:Gem::Dependency
|
91
79
|
name: minitest
|
92
80
|
type: :development
|
93
|
-
prerelease: false
|
94
81
|
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
95
83
|
requirements:
|
96
84
|
- - ~>
|
97
85
|
- !ruby/object:Gem::Version
|
98
86
|
version: '4.3'
|
99
|
-
|
100
|
-
- !ruby/object:Gem::Dependency
|
87
|
+
prerelease: false
|
101
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
102
90
|
requirements:
|
103
91
|
- - ~>
|
104
92
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
106
|
-
|
93
|
+
version: '4.3'
|
94
|
+
- !ruby/object:Gem::Dependency
|
107
95
|
name: rake
|
108
96
|
type: :development
|
109
|
-
prerelease: false
|
110
97
|
requirement: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
111
99
|
requirements:
|
112
100
|
- - ~>
|
113
101
|
- !ruby/object:Gem::Version
|
114
102
|
version: '10.0'
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
105
|
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '10.0'
|
116
110
|
description: ! 'mkv2m4v is a command line utility that converts audio and video tracks
|
117
111
|
from a
|
118
112
|
|
@@ -148,17 +142,17 @@ rdoc_options: []
|
|
148
142
|
require_paths:
|
149
143
|
- lib
|
150
144
|
required_ruby_version: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
151
146
|
requirements:
|
152
147
|
- - ! '>='
|
153
148
|
- !ruby/object:Gem::Version
|
154
149
|
version: '0'
|
155
|
-
none: false
|
156
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
157
152
|
requirements:
|
158
153
|
- - ! '>='
|
159
154
|
- !ruby/object:Gem::Version
|
160
155
|
version: '0'
|
161
|
-
none: false
|
162
156
|
requirements: []
|
163
157
|
rubyforge_project:
|
164
158
|
rubygems_version: 1.8.23
|