probe.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import sys, subprocess, logging
  2. def probe(path, ffprobe_exec='ffprobe', logger=None):
  3. streams = []
  4. # Logging
  5. if not logger:
  6. logger = logging.getLogger(__name__)
  7. logging.basicConfig(level=logging.WARN, stream=sys.stderr)
  8. # ffprobe
  9. args = [ ffprobe_exec, '-hide_banner', '-show_streams', path ]
  10. logger.debug(f"ffprobe command: {args}")
  11. probe = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  12. logger.debug(f"ffprobe result: {probe}")
  13. data = probe.stdout.decode('utf-8')
  14. if probe.returncode != 0:
  15. logger.error(f"ffprobe error ({probe.returncode}): {probe.stderr.decode('utf-8')}")
  16. logger.debug(f"ffprobe stdout: {data}")
  17. sys.exit(probe.returncode)
  18. # Parse streams
  19. stream = None
  20. for line in data.splitlines():
  21. if line == "[STREAM]":
  22. logger.debug('Stream start')
  23. stream = {}
  24. elif line == "[/STREAM]":
  25. logger.debug('Stream end')
  26. streams.append(stream)
  27. steam = None
  28. elif stream is not None:
  29. logger.debug(f"\tStream data: {line}")
  30. try:
  31. (key, val) = line.split('=', 1)
  32. except ValueError:
  33. logger.error(f"Skipping unexpected stream data: {line}")
  34. continue
  35. stream[key] = val
  36. # Return
  37. return streams