Skip to content

Instantly share code, notes, and snippets.

@cleverdevil
Last active September 11, 2024 21:23
Show Gist options
  • Save cleverdevil/d021b8f1f4c26f7dc147a54f4a0041b1 to your computer and use it in GitHub Desktop.
Save cleverdevil/d021b8f1f4c26f7dc147a54f4a0041b1 to your computer and use it in GitHub Desktop.
Dolby Vision report script. Walks a directory tree of video files and reports on Dolby Vision profiles and enhancement layers.
import os
import pathlib
import subprocess
import json
root = '/volume1/Media/Movies'
dovi_metadata = {'videos': [], 'total': 0, 'total_dovi': 0, 'total_p7_fel': 0}
def add_metadata(video, is_dovi=False, dovi_profile=None, dovi_el_type=None):
dovi_metadata['total'] += 1
metadata = {
'name': video,
'dovi': is_dovi
}
if is_dovi:
dovi_metadata['total_dovi'] += 1
metadata['dovi_profile'] = dovi_profile
if dovi_el_type:
metadata['dovi_el_type'] = dovi_el_type
if dovi_el_type == 'FEL':
dovi_metadata['total_p7_fel'] += 1
dovi_metadata['videos'].append(metadata)
for name in os.listdir(root):
path = pathlib.Path(f'{root}/{name}')
if not path.is_dir():
continue
files = os.listdir(path)
for fn in files:
if fn.lower().endswith(('mp4', 'mkv')):
movie = f'{root}/{name}/{fn}'
ffmpeg = [
'ffmpeg6',
'-i', f'{movie}', '-c:v', 'copy', '-to', '1', '-f', 'hevc', '-y', '-'
]
ffmpeg_result = subprocess.run(ffmpeg, capture_output=True)
dovi_tool = ['dovi_tool', 'extract-rpu', '-', '-o', '/tmp/RPU.bin']
dovi_result = subprocess.run(dovi_tool, input=ffmpeg_result.stdout, capture_output=True)
if dovi_result.returncode != 0:
add_metadata(movie)
continue
dovi_tool = ['dovi_tool', 'info', '-i', '/tmp/RPU.bin', '-f', '0']
dovi_result = subprocess.run(dovi_tool, capture_output=True)
if dovi_result.returncode != 0:
add_metadata(movie)
continue
output = dovi_result.stdout.decode('utf-8')
metadata = json.loads(output.split('\n', 1)[1])
add_metadata(
video=movie,
is_dovi=True,
dovi_profile=metadata['dovi_profile'],
dovi_el_type=metadata.get('el_type')
)
dovi_metadata['videos'].sort(key=lambda x: x['name'])
with open('report.json', 'w') as f:
f.write(json.dumps(dovi_metadata, indent=2))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment