mkv2m4v 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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.
@@ -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
- system "mkvextract tracks #{@file.filename.inspect} #{video_id}:#{video_file} #{audio_id}:#{audio_file}"
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
- system "ffmpeg -i #{audio_file.inspect} -acodec libfaac -ac 2 -ab 160k #{audio_basename}.aac"
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
- system "ffmpeg -i #{audio_file.inspect} -acodec ac3 -ac #{max_audio_channels} -ab #{max_audio_bit_rate}k #{audio_basename}.ac3"
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.inspect}.h264:lang=en:name=\"AVC Video\" "
65
- command << " -add #{audio_basename.inspect}.aac:lang=en:group=1:delay=84:name=\"Stereo\" "
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.inspect}.ac3:lang=en:group=1:delay=84:disable:name=\"AC3\" "
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.inspect}"
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
@@ -1,7 +1,7 @@
1
1
  module Mkv2m4v
2
- VERSION = "0.2.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.0", ">= 1.0.5"
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.2.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: 2012-12-28 00:00:00.000000000 Z
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
- none: false
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.7'
36
- none: false
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
- none: false
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: '1.0'
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.0'
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: '0.5'
74
- none: false
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
- none: false
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: '4.3'
90
- none: false
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
- none: false
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: '10.0'
106
- none: false
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