Class: Dvdvrconv::Dvdvr

Inherits:
Object
  • Object
show all
Defined in:
lib/dvdvrconv/dvdvr.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDvdvr

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

#vrdiscObject

Returns the value of attribute vrdisc.



31
32
33
# File 'lib/dvdvrconv/dvdvr.rb', line 31

def vrdisc
  @vrdisc
end

Instance Method Details

#adjust_titleObject

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_nameObject

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]. .... ]

Parameters:

  • file_name (String)

    concat list name.

  • contents (String)

    concatenate file names.

  • base_name (String)

    output vob 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_vrdiscObject



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_listObject

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_infoObject

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_vobObject

Rename vob file to a customized title name.

required value:

@vrdisc.vob_titles

Parameters:

  • file_titles (String)

    is Array. Includes pair of source and destination filename.

    • [src, dst], [src, dst], [src, dst], .…


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_cmdObject

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_infoObject

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

#vob2mp4Object

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

#vro2vobObject

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