|
|
@@ -1,20 +1,22 @@
|
|
|
-import subprocess, logging
|
|
|
+import logging
|
|
|
from .consts import Consts
|
|
|
from .tag import Tag
|
|
|
from .probe import Probe
|
|
|
+from .proc import Proc
|
|
|
|
|
|
class Lang:
|
|
|
+ sdh_title = 'SDH'
|
|
|
+
|
|
|
def __init__(self, propeditExec='mkvpropedit', logLevel=logging.WARN):
|
|
|
# Logging
|
|
|
self.logger = logging.getLogger(__name__)
|
|
|
self.logger.setLevel(logLevel)
|
|
|
|
|
|
- # Executable path
|
|
|
- self.propedit_exec = propeditExec
|
|
|
-
|
|
|
# Module init
|
|
|
+ self.propedit_exec = propeditExec
|
|
|
self.tags = Tag(logLevel=logLevel)
|
|
|
self.probes = Probe(logLevel=logLevel)
|
|
|
+ self.proc = Proc(logLevel=logLevel)
|
|
|
|
|
|
def lang(self, media):
|
|
|
self.logger.info(f"Processing {len(media)} files")
|
|
|
@@ -38,32 +40,36 @@ class Lang:
|
|
|
continue
|
|
|
|
|
|
# Find missing and undefined languages for subtitle and audio streams
|
|
|
- updates = []
|
|
|
+ # Find hearing_impaired subtitles without SDH title
|
|
|
+ add_lang = []
|
|
|
+ add_sdh = []
|
|
|
for stream in streams:
|
|
|
- if 'codec_type' not in stream or stream['codec_type'] not in Consts.lang_codecs:
|
|
|
+ if stream.get('codec_type') not in Consts.lang_codecs:
|
|
|
self.logger.debug(f"Skipping missing or ignored codec_type: {file['name']}:{stream['index']}")
|
|
|
continue
|
|
|
+ if stream.get('tags', {}).get('language') in [ None, Consts.lang_undef ]:
|
|
|
+ self.logger.info(f"Missing/undefined language in {file['name']}:{stream['index']}:{stream['codec_type']}")
|
|
|
+ add_lang.append(int(stream['index']))
|
|
|
+ title = stream.get('tags', {}).get('title')
|
|
|
if (
|
|
|
- 'tags' not in stream or
|
|
|
- 'language' not in stream['tags'] or
|
|
|
- stream['tags']['language'] in [ None, 'und' ]
|
|
|
+ stream.get('disposition', {}).get('hearing_impaired') == 1
|
|
|
+ and (not title or self.sdh_title not in title)
|
|
|
):
|
|
|
- self.logger.debug(f"Missing or undefined language in {file['name']}:{stream['codec_type']}:{stream['index']}")
|
|
|
- updates.append(int(stream['index']))
|
|
|
+ self.logger.info(f"Missing SDH title for hearing-impaired track {file['name']}:{stream['index']}:{stream['codec_type']}")
|
|
|
+ add_sdh.append(int(stream['index']))
|
|
|
+ del title
|
|
|
|
|
|
# mkvpropedit
|
|
|
- if updates:
|
|
|
+ if add_lang or add_sdh:
|
|
|
+ # Remember mkvpropedit starts counting at 1
|
|
|
args = [ self.propedit_exec, file['path'] ]
|
|
|
- for index in updates:
|
|
|
+ for index in add_lang:
|
|
|
self.logger.info(f"Setting lang ({Consts.lang_default}): {file['name']}:{index}")
|
|
|
- # mkvpropedit starts counting at 1
|
|
|
args.extend([ '--edit', f"track:{index + 1}", '--set', f"language={Consts.lang_default}" ])
|
|
|
-
|
|
|
- self.logger.debug(f"propedit command: {args}")
|
|
|
- propedit = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
|
|
- self.logger.debug(f"propedit result: {propedit}")
|
|
|
- if propedit.returncode != 0:
|
|
|
- self.logger.error(f"propedit error ({propedit.returncode}): {propedit.stdout.decode('utf-8')}")
|
|
|
+ for index in add_sdh:
|
|
|
+ self.logger.info(f"Setting hearing-impaired title ({self.sdh_title}): {file['name']}:{index}")
|
|
|
+ args.extend([ '--edit', f"track:{index + 1}", '--set', f"name={self.sdh_title}" ])
|
|
|
+ if self.proc.run(args)['code'] != 0:
|
|
|
continue
|
|
|
|
|
|
# Set tag
|