7cd24f3a31
AudioTrack, VideoTrack, SubtitleTrack and MediaInfo are snapshots of a single ffprobe run — model them as proper immutable value objects. - @dataclass(frozen=True) on all four - MediaInfo track collections become tuple[...] instead of list[...] - ffprobe adapter rewritten to build tuples up-front instead of appending/setattr'ing on a constructed instance
63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
"""VideoTrack — a single video stream as reported by ffprobe."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from dataclasses import dataclass
|
||
|
||
|
||
@dataclass(frozen=True)
|
||
class VideoTrack:
|
||
"""A single video track as reported by ffprobe.
|
||
|
||
A media file typically has one video track but can have several (alt
|
||
camera angles, attached thumbnail images reported as still-image streams,
|
||
etc.), hence the list[VideoTrack] on MediaInfo.
|
||
"""
|
||
|
||
index: int
|
||
codec: str | None # h264, hevc, av1, …
|
||
width: int | None
|
||
height: int | None
|
||
is_default: bool = False
|
||
|
||
@property
|
||
def resolution(self) -> str | None:
|
||
"""
|
||
Best-effort resolution string: 2160p, 1080p, 720p, …
|
||
|
||
Width takes priority over height to handle widescreen/cinema crops
|
||
(e.g. 1920×960 scope → 1080p, not 720p). Falls back to height when
|
||
width is unavailable.
|
||
"""
|
||
match (self.width, self.height):
|
||
case (None, None):
|
||
return None
|
||
case (w, h) if w is not None:
|
||
match True:
|
||
case _ if w >= 3840:
|
||
return "2160p"
|
||
case _ if w >= 1920:
|
||
return "1080p"
|
||
case _ if w >= 1280:
|
||
return "720p"
|
||
case _ if w >= 720:
|
||
return "576p"
|
||
case _ if w >= 640:
|
||
return "480p"
|
||
case _:
|
||
return f"{h}p" if h else f"{w}w"
|
||
case (None, h):
|
||
match True:
|
||
case _ if h >= 2160:
|
||
return "2160p"
|
||
case _ if h >= 1080:
|
||
return "1080p"
|
||
case _ if h >= 720:
|
||
return "720p"
|
||
case _ if h >= 576:
|
||
return "576p"
|
||
case _ if h >= 480:
|
||
return "480p"
|
||
case _:
|
||
return f"{h}p"
|