Last active
August 12, 2025 01:36
-
-
Save 3zcurdia/84f9bcbbdd6b1ec97eaeb0d1c653af1f to your computer and use it in GitHub Desktop.
Extract subs from mkv and converts from vobsub to srt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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