feat(tracks): add edition tags to output filenames

Extend track.edition to support a list of tags (e.g., ["IMAX", "3D"]) that are inserted into the output filename before the resolution.
This commit is contained in:
Andy
2026-02-26 11:11:00 -07:00
parent 6cdfd2828b
commit eeec4e1f1b
6 changed files with 21 additions and 6 deletions

View File

@@ -158,6 +158,11 @@ class Episode(Title):
if getattr(config, "repack", False): if getattr(config, "repack", False):
name += " REPACK" name += " REPACK"
if self.tracks:
first_track = next(iter(self.tracks), None)
if first_track and first_track.edition:
name += " " + " ".join(first_track.edition)
if primary_video_track: if primary_video_track:
resolution_token = _get_resolution_token(primary_video_track) resolution_token = _get_resolution_token(primary_video_track)
if resolution_token: if resolution_token:
@@ -286,4 +291,4 @@ class Series(SortedKeyList, ABC):
return tree return tree
__all__ = ("Episode", "Series") __all__ = ("Episode", "Series")

View File

@@ -93,6 +93,11 @@ class Movie(Title):
if getattr(config, "repack", False): if getattr(config, "repack", False):
name += " REPACK" name += " REPACK"
if self.tracks:
first_track = next(iter(self.tracks), None)
if first_track and first_track.edition:
name += " " + " ".join(first_track.edition)
if primary_video_track: if primary_video_track:
resolution_token = _get_resolution_token(primary_video_track) resolution_token = _get_resolution_token(primary_video_track)
if resolution_token: if resolution_token:

View File

@@ -103,6 +103,11 @@ class Song(Title):
if getattr(config, "repack", False): if getattr(config, "repack", False):
name += " REPACK" name += " REPACK"
if self.tracks:
first_track = next(iter(self.tracks), None)
if first_track and first_track.edition:
name += " " + " ".join(first_track.edition)
# Service (use track source if available) # Service (use track source if available)
if show_service: if show_service:
source_name = None source_name = None

View File

@@ -151,7 +151,7 @@ class Audio(Track):
), ),
f"{self.bitrate // 1000} kb/s" if self.bitrate else None, f"{self.bitrate // 1000} kb/s" if self.bitrate else None,
self.get_track_name(), self.get_track_name(),
self.edition, ", ".join(self.edition) if self.edition else None,
], ],
) )
) )

View File

@@ -66,8 +66,8 @@ class Track:
raise TypeError(f"Expected name to be a {str}, not {type(name)}") raise TypeError(f"Expected name to be a {str}, not {type(name)}")
if not isinstance(id_, (str, type(None))): if not isinstance(id_, (str, type(None))):
raise TypeError(f"Expected id_ to be a {str}, not {type(id_)}") raise TypeError(f"Expected id_ to be a {str}, not {type(id_)}")
if not isinstance(edition, (str, type(None))): if not isinstance(edition, (str, list, type(None))):
raise TypeError(f"Expected edition to be a {str}, not {type(edition)}") raise TypeError(f"Expected edition to be a {str}, {list}, or None, not {type(edition)}")
if not isinstance(downloader, (Callable, type(None))): if not isinstance(downloader, (Callable, type(None))):
raise TypeError(f"Expected downloader to be a {Callable}, not {type(downloader)}") raise TypeError(f"Expected downloader to be a {Callable}, not {type(downloader)}")
if not isinstance(downloader_args, (dict, type(None))): if not isinstance(downloader_args, (dict, type(None))):
@@ -103,7 +103,7 @@ class Track:
self.needs_repack = needs_repack self.needs_repack = needs_repack
self.name = name self.name = name
self.drm = drm self.drm = drm
self.edition: str = edition self.edition: list[str] = [edition] if isinstance(edition, str) else (edition or [])
self.downloader = downloader self.downloader = downloader
self.downloader_args = downloader_args self.downloader_args = downloader_args
self.from_file = from_file self.from_file = from_file

View File

@@ -291,7 +291,7 @@ class Video(Track):
], ],
) )
), ),
self.edition, ", ".join(self.edition) if self.edition else None,
], ],
) )
) )