Skip to content

Instantly share code, notes, and snippets.

@3zcurdia
Last active August 12, 2025 01:36
Show Gist options
  • Save 3zcurdia/84f9bcbbdd6b1ec97eaeb0d1c653af1f to your computer and use it in GitHub Desktop.
Save 3zcurdia/84f9bcbbdd6b1ec97eaeb0d1c653af1f to your computer and use it in GitHub Desktop.
Extract subs from mkv and converts from vobsub to srt
#!/usr/bin/env ruby
# Usage: extract_subs movie.mkv
ENGLISH_VARIATIONS = %w[eng en english].freeze
file = ARGV[0]
abort("Usage: #{$0} file.mkv") unless file && File.exist?(file)
# Run mkvinfo and capture output
mkvinfo_output = `mkvinfo "#{file}"`
subtitle_tracks = []
current_track_id = nil
current_language = nil
current_type = nil
mkvinfo_output.each_line do |line|
stripped = line.strip
if stripped =~ /\+ Track number: \d+ \(track ID for mkvmerge & mkvextract: (\d+)\)/
current_track_id = Regexp.last_match(1)
current_language = nil
current_type = nil
end
if stripped =~ /\+ Track type: (\w+)/
current_type = Regexp.last_match(1).downcase
end
if stripped =~ /\+ Language: (\w+)/
current_language = Regexp.last_match(1).downcase
end
if stripped =~ /^\| \+ Track$/ || stripped =~ /^\+ Track$/ || stripped =~ /^\| \+ EBML void/
if current_type == 'subtitles' && current_track_id && current_language
subtitle_tracks << [current_track_id, current_language]
end
current_track_id = nil
current_language = nil
current_type = nil
end
end
if current_type == 'subtitles' && current_track_id && current_language
subtitle_tracks << [current_track_id, current_language]
end
subtitle_tracks.each do |track_id, lang|
puts ">>> Extracting subtitles #{track_id}:#{lang}"
system('mkvextract', 'tracks', file, "#{track_id}:#{lang}")
puts ">>> Converting VobSub #{lang} to SRT"
if ENGLISH_VARIATIONS.include?(lang)
system('vobsub2srt', lang)
else
system('vobsub2srt', lang, '--lang', lang)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment