Class: Dvdvrconv::Dvdvr
- Inherits:
-
Object
- Object
- Dvdvrconv::Dvdvr
- Defined in:
- lib/dvdvrconv/dvdvr.rb
Instance Attribute Summary collapse
-
#vrdisc ⇒ Object
Returns the value of attribute vrdisc.
Instance Method Summary collapse
-
#adjust_title ⇒ Object
Add sequence number to the duplicate title name.
-
#change_to_title_name ⇒ Object
Change the file name to the title name.
-
#concat_titles(concat_list) ⇒ Object
Concatenate Split Titles.
-
#customize_title(base_dst_name, number_list = []) ⇒ Object
customize the title of vob files.
- #debug_view_vrdisc ⇒ Object
-
#initialize ⇒ Dvdvr
constructor
A new instance of Dvdvr.
-
#make_concat_list ⇒ Object
Make a list of file names to concatenate.
-
#read_info ⇒ Object
Read video information from dvd-ram discs in dvd-vr format.
-
#rename_vob ⇒ Object
Rename vob file to a customized title name.
-
#str_concat_cmd(file_name, base_name) ⇒ Object
Make a concatenation command string for FFmpeg.
-
#str_convert_cmd(file_name) ⇒ Object
File convert command, vob to mp4 for FFmpeg.
-
#str_dvdvr_cmd ⇒ Object
Read VRO file from dvd-ram disc in dvd-vr format, and output vob files.
-
#view_info ⇒ Object
View video information from dvd-ram discs in dvd-vr format.
-
#vob2mp4 ⇒ Object
convert vob to mp4.
-
#vro2vob ⇒ Object
Read VRO file from dvd-ram disc in dvd-vr format, and output vob files.
Constructor Details
#initialize ⇒ Dvdvr
Returns a new instance of Dvdvr.
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/dvdvrconv/dvdvr.rb', line 33 def initialize @vrdisc = Vrdisc.new(nil) if RUBY_PLATFORM =~ /mswin(?!ce)|mingw|cygwin/ @vrdisc.opts_ifo = Dvdvrconv::WIN_DRV_IFO @vrdisc.opts_vro = Dvdvrconv::WIN_DRV_VRO @vrdisc.cmd = Dvdvrconv::WIN_DRV_CMD else @vrdisc.opts_ifo = Dvdvrconv::DRV_IFO @vrdisc.opts_vro = Dvdvrconv::DRV_VRO @vrdisc.cmd = Dvdvrconv::DRV_CMD end end |
Instance Attribute Details
#vrdisc ⇒ Object
Returns the value of attribute vrdisc.
31 32 33 |
# File 'lib/dvdvrconv/dvdvr.rb', line 31 def vrdisc @vrdisc end |
Instance Method Details
#adjust_title ⇒ Object
Add sequence number to the duplicate title name. Replace white space in the title with underscore.
required value:
@vrdisc.title
Output values:
=> @vrdisc.duplicate_name
=> @vrdisc.output_title
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/dvdvrconv/dvdvr.rb', line 117 def adjust_title output_title = [] duplicate_names = [] dup_counter = 0 # Extract duplicate names from title. dup = @vrdisc.title.select { |x| @vrdisc.title.count(x) > 1 } @vrdisc.title.each_index do |idx| # Replace white space in the title with underscore. new_name = @vrdisc.title[idx][0].gsub(/\s/, "_") # Add sequential numbers to duplicate name. if dup.include?(@vrdisc.title[idx]) dup_counter += 1 output_title << format("%s_%02d", new_name, dup_counter) duplicate_names << new_name else output_title << format("%s", new_name) end dup_counter = 0 if dup_counter == @vrdisc.title.count(@vrdisc.title[idx]) end @vrdisc.duplicate_name = duplicate_names.select do |x| duplicate_names.count(x) > 1 end.uniq @vrdisc.output_title = output_title end |
#change_to_title_name ⇒ Object
Change the file name to the title name
required value:
@vrdisc.title
Output values:
=> @vrdisc.vob_titles
164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/dvdvrconv/dvdvr.rb', line 164 def change_to_title_name vob_titles = [] @vrdisc.title.size.times do |x| src = format("%s#%03d", Dvdvrconv::BASE_NAME, x + 1) + ".vob" dst = @vrdisc.output_title[x] + ".vob" vob_titles << [src, dst] end @vrdisc.vob_titles = vob_titles end |
#concat_titles(concat_list) ⇒ Object
Concatenate Split Titles. This method uses FFmpeg’s media file concatenation feature.
required Argument:
concat_list
concat_list is Array. Includes file_name, contents, base_name.
concat_list = [[file_name, contents, base_name], [file_name, contents, base_name]. .... ]
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'lib/dvdvrconv/dvdvr.rb', line 286 def concat_titles(concat_list) puts "----- Concatenate Split Titles -----" concat_list.each do |list| file_name, contents, base_name = list File.write(file_name, contents) puts "concat list= #{file_name}" cmd = str_concat_cmd(file_name, base_name) puts "----- concat vob files -----" puts "run cmd:\n #{cmd}" system(cmd) begin File.delete(file_name) rescue p $! end end end |
#customize_title(base_dst_name, number_list = []) ⇒ Object
customize the title of vob files.
If specify individual file names. Write “base_dst_name” as an Array.
base_dst_name = ["name_one", "name_two"]
number_list = []
=> ["name_one", "name_two"]
If add a sequence number to the file name. Write “base_dst_name” as String.
base_dst_name = "output_name_"
number_list = []
=> ["output_name_01", "output_name_02", ...]
If specify sequence numbers individually. Write “base_dst_name” as String and Write “number_list” as an Array.
base_dst_name = "output_name_"
number_list = [12, 13, 14, 15]
=> ["output_name_12", "output_name_13", "output_name_14", "output_name_15"]
required Argument, value:
base_dst_name, number_list,
@vrdisc.title
Output values:
=> @vrdisc.vob_titles
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/dvdvrconv/dvdvr.rb', line 204 def customize_title(base_dst_name, number_list = []) vob_titles = [] base_dst_name.size.times do |x| break if x > @vrdisc.title.uniq.size - 1 src = @vrdisc.title.uniq[x][0].gsub(/\s/, "_") + ".vob" case base_dst_name when Array dst_name = base_dst_name[x] when String if number_list.size.zero? dst_name = base_dst_name + format("_%02d", x + 1) else dst_name = base_dst_name + format("_%02d", number_list[x]) end end dst = dst_name + ".vob" vob_titles << [src, dst] end @vrdisc.vob_titles = vob_titles end |
#debug_view_vrdisc ⇒ Object
330 331 332 333 334 |
# File 'lib/dvdvrconv/dvdvr.rb', line 330 def debug_view_vrdisc @vrdisc.members.each do |member| puts "#{member} => #{@vrdisc[member]}" end end |
#make_concat_list ⇒ Object
Make a list of file names to concatenate.
required values:
@vrdisc.duplicate_name, @vrdisc.output_title
257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
# File 'lib/dvdvrconv/dvdvr.rb', line 257 def make_concat_list concat_list = [] @vrdisc.duplicate_name.each do |base_name| contents = "" file_name = "concat_#{base_name}.txt" names = @vrdisc.output_title.select { |x| x.match(/#{base_name}_\d\d/) } names.each { |line| contents += %Q[file '#{line}.vob'\n] } concat_list << [file_name, contents, base_name] end concat_list end |
#read_info ⇒ Object
Read video information from dvd-ram discs in dvd-vr format.
required values:
@vrdisc.cmd, @vrdisc.opts_ifo
Get values of the video information:
=> @vrdisc.header
=> @vrdisc.num
=> @vrdisc.title
=> @vrdisc.date
=> @vrdisc.size
76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/dvdvrconv/dvdvr.rb', line 76 def read_info out, err, status = Open3.capture3(@vrdisc.cmd, @vrdisc.opts_ifo) @vrdisc.header = out.scan(/^(.*?)Number/m) # Sets the captured information to @vrdisc. %w(num title date size).each do |item| str = format("%-5s", item) + ":" @vrdisc[item] = out.scan(/#{str}\s(.*?)$/) end out end |
#rename_vob ⇒ Object
Rename vob file to a customized title name.
required value:
@vrdisc.vob_titles
237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/dvdvrconv/dvdvr.rb', line 237 def rename_vob puts "----- output vob file -----" @vrdisc.vob_titles.each do |file_title| src, dst = file_title if File.exist?("#{dst}") puts "Skip => file #{dst} is exist." else File.rename(src, dst) puts " file name: #{dst}" end end end |
#str_concat_cmd(file_name, base_name) ⇒ Object
Make a concatenation command string for FFmpeg.
53 54 55 |
# File 'lib/dvdvrconv/dvdvr.rb', line 53 def str_concat_cmd(file_name, base_name) %Q[ffmpeg -f concat -safe 0 -i #{file_name} -c copy #{base_name}.vob] end |
#str_convert_cmd(file_name) ⇒ Object
File convert command, vob to mp4 for FFmpeg.
-
Change the aspect ratio to 16:9.
-
Delete a closed caption.
60 61 62 |
# File 'lib/dvdvrconv/dvdvr.rb', line 60 def str_convert_cmd(file_name) %Q[ffmpeg -i #{file_name}.vob -filter:v "crop=704:474:0:0" -vcodec libx264 -b:v 500k -aspect 16:9 -acodec copy -bsf:v "filter_units=remove_types=6" #{file_name}.mp4] end |
#str_dvdvr_cmd ⇒ Object
Read VRO file from dvd-ram disc in dvd-vr format, and output vob files.
48 49 50 |
# File 'lib/dvdvrconv/dvdvr.rb', line 48 def str_dvdvr_cmd %Q[#{@vrdisc.cmd} --name=#{Dvdvrconv::BASE_NAME} #{@vrdisc.opts_ifo} #{@vrdisc.opts_vro}] end |
#view_info ⇒ Object
View video information from dvd-ram discs in dvd-vr format.
required values:
@vrdisc.header, @vrdisc.num, @vrdisc.title,
@vrdisc.date, @vrdisc.size
95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/dvdvrconv/dvdvr.rb', line 95 def view_info puts "----- view dvd-vr info -----" puts @vrdisc.header [@vrdisc.num, @vrdisc.title, @vrdisc.date, @vrdisc.size].transpose.each do |x| %w(num title date size).each_with_index do |item, idx| line = format("%-5s", item) + ": #{x.flatten[idx].to_s}\n" puts line end puts "-" end end |
#vob2mp4 ⇒ Object
convert vob to mp4.
required Values:
@vrdisc.vob_titles
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
# File 'lib/dvdvrconv/dvdvr.rb', line 311 def vob2mp4 files = [] @vrdisc.vob_titles.each do |vob_title| files << vob_title[1].gsub(/.vob/, "") end files.each do |file_name| if File.exist?("#{file_name}.mp4") puts "Skip => file #{file_name}.mp4 is exist." else cmd = str_convert_cmd(file_name) puts "----- convert #{file_name}.vob to mp4 file -----" puts "run cmd:\n #{cmd}" system(cmd) end end end |
#vro2vob ⇒ Object
Read VRO file from dvd-ram disc in dvd-vr format, and output vob files.
148 149 150 151 152 153 154 |
# File 'lib/dvdvrconv/dvdvr.rb', line 148 def vro2vob cmd = str_dvdvr_cmd puts "----- convert file VRO to VOB -----" puts "> cmd:\n #{cmd}" system(cmd) puts "" end |