Просмотр исходного кода

Ingest JSON. Less parsing, better tags access

ZiB 9 месяцев назад
Родитель
Сommit
cd62352e58
4 измененных файлов с 38 добавлено и 37 удалено
  1. 1 1
      zz_remux/pyproject.toml
  2. 5 1
      zz_remux/zz_remux/lang.py
  3. 10 5
      zz_remux/zz_remux/mux.py
  4. 22 30
      zz_remux/zz_remux/probe.py

+ 1 - 1
zz_remux/pyproject.toml

@@ -7,7 +7,7 @@ source = "src"
 
 [project]
 name = "zz_remux"
-version = "0.0.1"
+version = "0.0.2"
 
 description = "Runs mkvmerge, mkvpropedit, and ffprobe in useful ways"
 keywords = ["mkvmerge", "mkvpropedit", "ffprobe", "subtitles", "mkv", "srt"]

+ 5 - 1
zz_remux/zz_remux/lang.py

@@ -43,7 +43,11 @@ class Lang:
         if 'codec_type' not in stream or stream['codec_type'] not in Consts.lang_codecs:
           self.logger.debug(f"Skipping missing or ignored codec_type: {file['name']}:{stream['index']}")
           continue
-        if 'TAG:language' not in stream or stream['TAG:language'] in [ None, 'und' ]:
+        if (
+          'tags' not in stream or
+          'language' not in stream['tags'] or
+          stream['tags']['language'] in [ None, 'und' ]
+        ):
           self.logger.debug(f"Missing or undefined language in {file['name']}:{stream['codec_type']}:{stream['index']}")
           updates.append(int(stream['index']))
 

+ 10 - 5
zz_remux/zz_remux/mux.py

@@ -82,14 +82,19 @@ class Mux:
 
       # Verify
       err = None
-      if merge.returncode != 0:
-        err = f"Non-zero exit code: {merge.returncode}"
+      if not merge or not hasattr(merge, 'returncode'):
+        err = 'Unknown'
+      elif merge.returncode != 0:
+        err = merge.returncode
       elif not temp.exists():
-        err = 'file missing'
+        err = 'File missing'
       elif temp.stat().st_size < (Consts.min_size * size):
-        err = 'file too small'
+        err = 'File too small'
       if err is not None:
-        self.logger.error(f"Mux error ({err}):\n{merge.stdout.decode('utf-8')}")
+        eout = '<No output>'
+        if merge and hasattr(merge, 'stdout'):
+          eout = merge.stdout.decode('utf-8')
+        self.logger.error(f"Mux error ({videos[0]['group']}): {err}\n{eout}")
         continue
 
       # Set tag

+ 22 - 30
zz_remux/zz_remux/probe.py

@@ -1,4 +1,4 @@
-import subprocess, logging
+import json, subprocess, logging
 
 class Probe:
   encoding     = 'utf-8'
@@ -13,7 +13,7 @@ class Probe:
 
   def probe(self, path):
     self.logger.debug(f"Probing: {path}")
-    streams = []
+    streams = {}
 
     # Sanity
     if not path.exists():
@@ -21,38 +21,30 @@ class Probe:
       return streams
 
     # ffprobe
-    args = [ self.ffprobe_exec, '-hide_banner', '-show_streams', path ]
+    args = [ self.ffprobe_exec, '-hide_banner', '-show_streams', '-print_format', 'json',  path ]
     self.logger.debug(f"ffprobe command: {args}")
     probe = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     self.logger.debug(f"ffprobe result: {probe}")
-    data = probe.stdout.decode(self.encoding)
-    if probe.returncode != 0:
-      self.logger.error(f"ffprobe error ({probe.returncode}): {probe.stderr.decode(self.encoding)}")
-      self.logger.debug(f"ffprobe stdout: {data}")
-      return streams
+    try:
+      data = probe.stdout.decode(self.encoding)
+      streams = json.loads(data)['streams']
+    except:
+      pass
 
-    # Parse streams
-    prefix = None
-    stream = None
-    for line in data.splitlines():
-      if line == "[STREAM]":
-        stream = {}
-      elif line == "[/STREAM]":
-        streams.append(stream)
-        steam = None
-      elif line == "[SIDE_DATA]":
-        prefix = 'SIDE_DATA'
-      elif line == "[/SIDE_DATA]":
-        prefix = None
-      elif stream is not None:
-        try:
-          (key, val) = line.split('=', 1)
-          if prefix is not None:
-            key = f"{prefix}:{key}"
-        except ValueError:
-          self.logger.error(f"Skipping unexpected stream data ({path}): {line}")
-          continue
-        stream[key] = val
+    # Verify
+    err = None
+    if not probe or not hasattr(probe, 'returncode'):
+      err = 'Unknown'
+    elif probe.returncode != 0:
+      err = probe.returncode
+    elif not streams or len(streams) < 1:
+      err = f'Unable to parse stream data'
+    if err is not None:
+      eout = '<No output>'
+      if probe and hasattr(probe, 'stderr'):
+        eout = probe.stderr.decode('utf-8')
+      self.logger.error(f"ffprobe error ({path}): {err}\n{eout}")
+      return streams
 
     # Return
     return streams