26 lines
901 B
Python
26 lines
901 B
Python
import json
|
|
import subprocess
|
|
from pathlib import Path
|
|
from typing import Union
|
|
|
|
from unshackle.core import binaries
|
|
|
|
|
|
def ffprobe(uri: Union[bytes, Path]) -> dict:
|
|
"""Use ffprobe on the provided data to get stream information."""
|
|
if not binaries.FFProbe:
|
|
raise EnvironmentError('FFProbe executable "ffprobe" not found but is required.')
|
|
|
|
args = [binaries.FFProbe, "-v", "quiet", "-of", "json", "-show_streams"]
|
|
if isinstance(uri, Path):
|
|
args.extend(
|
|
["-f", "lavfi", "-i", "movie={}[out+subcc]".format(str(uri).replace("\\", "/").replace(":", "\\\\:"))]
|
|
)
|
|
elif isinstance(uri, bytes):
|
|
args.append("pipe:")
|
|
try:
|
|
ff = subprocess.run(args, input=uri if isinstance(uri, bytes) else None, check=True, capture_output=True)
|
|
except subprocess.CalledProcessError:
|
|
return {}
|
|
return json.loads(ff.stdout.decode("utf8"))
|