From b8e2f3da3f7b18644ff9206b26cce039b59a580c Mon Sep 17 00:00:00 2001 From: Andy Date: Thu, 22 Jan 2026 20:21:00 -0700 Subject: [PATCH] feat(titles): use track source attribute for service name in filenames Allow services to set a custom `source` attribute on tracks, which will be used in the filename instead of the service class name. --- unshackle/core/titles/episode.py | 9 +++++++-- unshackle/core/titles/movie.py | 9 +++++++-- unshackle/core/titles/song.py | 9 +++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/unshackle/core/titles/episode.py b/unshackle/core/titles/episode.py index f578342..3522e65 100644 --- a/unshackle/core/titles/episode.py +++ b/unshackle/core/titles/episode.py @@ -155,9 +155,14 @@ class Episode(Title): resolution = int(primary_video_track.width * (9 / 16)) name += f" {resolution}p" - # Service + # Service (use track source if available) if show_service: - name += f" {self.service.__name__}" + source_name = None + if self.tracks: + first_track = next(iter(self.tracks), None) + if first_track and hasattr(first_track, "source") and first_track.source: + source_name = first_track.source + name += f" {source_name or self.service.__name__}" # 'WEB-DL' name += " WEB-DL" diff --git a/unshackle/core/titles/movie.py b/unshackle/core/titles/movie.py index fb1b22d..4e1d02c 100644 --- a/unshackle/core/titles/movie.py +++ b/unshackle/core/titles/movie.py @@ -90,9 +90,14 @@ class Movie(Title): resolution = int(primary_video_track.width * (9 / 16)) name += f" {resolution}p" - # Service + # Service (use track source if available) if show_service: - name += f" {self.service.__name__}" + source_name = None + if self.tracks: + first_track = next(iter(self.tracks), None) + if first_track and hasattr(first_track, "source") and first_track.source: + source_name = first_track.source + name += f" {source_name or self.service.__name__}" # 'WEB-DL' name += " WEB-DL" diff --git a/unshackle/core/titles/song.py b/unshackle/core/titles/song.py index 2e0a818..303b336 100644 --- a/unshackle/core/titles/song.py +++ b/unshackle/core/titles/song.py @@ -101,9 +101,14 @@ class Song(Title): name = str(self).split(" / ")[1] if config.scene_naming: - # Service + # Service (use track source if available) if show_service: - name += f" {self.service.__name__}" + source_name = None + if self.tracks: + first_track = next(iter(self.tracks), None) + if first_track and hasattr(first_track, "source") and first_track.source: + source_name = first_track.source + name += f" {source_name or self.service.__name__}" # 'WEB-DL' name += " WEB-DL"