Skip to content

Instantly share code, notes, and snippets.

@kaecy
Last active June 9, 2023 13:22
Show Gist options
  • Save kaecy/ed63f0d8f490ac069aa8dd83affafe4d to your computer and use it in GitHub Desktop.
Save kaecy/ed63f0d8f490ac069aa8dd83affafe4d to your computer and use it in GitHub Desktop.
Uses ffmpeg and ffprobe to extract all subtitle files, make sure you have them installed. Experimental.

Use

> subs.py "Revolution Today.mkv"

Subs
SUBRIP  ENG Revolution Today
SUBRIP  ENG Revolution Today
SUBRIP  CHI Revolution Today
SUBRIP  CHI Revolution Today
SUBRIP  DAN Revolution Today
SUBRIP  GER Revolution Today
SUBRIP  SPA Revolution Today
SUBRIP  SPA Revolution Today
SUBRIP  FRE Revolution Today
SUBRIP  ITA Revolution Today
SUBRIP  JPN Revolution Today
SUBRIP  KOR Revolution Today
SUBRIP  DUT Revolution Today
SUBRIP  NOR Revolution Today
SUBRIP  POL Revolution Today
SUBRIP  POR Revolution Today
SUBRIP  POR Revolution Today
SUBRIP  FIN Revolution Today
SUBRIP  SWE Revolution Today

> subs.py extract "Revolution Today.mkv"

Extracting Revolusion Today.eng.srt
Extracting Revolusion Today.eng.2.srt
Extracting Revolusion Today.chi.srt
Extracting Revolusion Today.chi.2.srt
Extracting Revolusion Today.dan.srt
Extracting Revolusion Today.ger.srt
Extracting Revolusion Today.spa.srt
Extracting Revolusion Today.spa.2.srt
Extracting Revolusion Today.fre.srt
Extracting Revolusion Today.ita.srt
Extracting Revolusion Today.jpn.srt
Extracting Revolusion Today.kor.srt
Extracting Revolusion Today.dut.srt
Extracting Revolusion Today.nor.srt
Extracting Revolusion Today.pol.srt
Extracting Revolusion Today.por.srt
Extracting Revolusion Today.por.2.srt
Extracting Revolusion Today.fin.srt
Extracting Revolusion Today.swe.srt
import subprocess
import sys
import json
def probe(filename):
args = ["ffprobe", "-hide_banner"]
args.append(filename) # input file
args.extend([
"-select_streams", "s", "-show_entries",
"stream=index,codec_type,codec_name:stream_tags=language,title",
"-of", "json"
])
process = subprocess.run(args, capture_output=True)
if process.stdout:
return json.loads(process.stdout.decode())
def getSubtitleExtension(codec_name):
if codec_name == "subrip":
return "srt"
elif codec_name == "ass":
return "ass"
else:
return "und"
def inspectSubtitles(filename, probeData):
print("Subs")
for stream in probeData["streams"]:
if stream['codec_type'] == "subtitle":
o = stream['codec_name'].upper()
if "tags" in stream:
if "language" in stream['tags']:
o += " " + stream['tags']['language'].upper()
if "title" in stream['tags']:
o += " " + stream['tags']['title']
else:
o += " " + "Undefined"
print(o)
def extractSubtitles(filename, probeData):
rootName = filename.split(".")[0]
track = dict()
ffargs = ["ffmpeg", "-hide_banner", "-loglevel", "warning", "-i", filename]
for sub in probeData['streams']:
lang = "und"
if "language" in sub['tags']:
lang = sub['tags']['language']
if lang not in track: track[lang] = 1
else: track[lang] += 1
ext = getSubtitleExtension(sub['codec_name'])
if track[lang] > 1:
subtitleFn = rootName + "." + lang + "." + str(track[lang]) + "." +\
ext
else:
subtitleFn = rootName + "." + lang + "." + ext
args = ffargs.copy()
args.extend(["-map", "0:" + str(sub['index']), subtitleFn])
print("Extracting", subtitleFn)
subprocess.run(args)
if __name__ == "__main__":
if len(sys.argv)-1 == 1:
inspectSubtitles(sys.argv[1], probe(sys.argv[1]))
if len(sys.argv)-1 == 2:
if sys.argv[1] == "extract":
extractSubtitles(sys.argv[2], probe(sys.argv[2]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment