diff --git a/unshackle/core/titles/episode.py b/unshackle/core/titles/episode.py index f66bcb7..16ecab6 100644 --- a/unshackle/core/titles/episode.py +++ b/unshackle/core/titles/episode.py @@ -89,7 +89,17 @@ class Episode(Title): def get_filename(self, media_info: MediaInfo, folder: bool = False, show_service: bool = True) -> str: primary_video_track = next(iter(media_info.video_tracks), None) - primary_audio_track = next(iter(media_info.audio_tracks), None) + primary_audio_track = None + if media_info.audio_tracks: + sorted_audio = sorted( + media_info.audio_tracks, + key=lambda x: ( + float(x.bit_rate) if x.bit_rate else 0, + bool(x.format_additionalfeatures and "JOC" in x.format_additionalfeatures) + ), + reverse=True + ) + primary_audio_track = sorted_audio[0] unique_audio_languages = len({x.language.split("-")[0] for x in media_info.audio_tracks if x.language}) # Title [Year] SXXEXX Name (or Title [Year] SXX if folder) diff --git a/unshackle/core/titles/movie.py b/unshackle/core/titles/movie.py index 3d552d2..2e1d8bb 100644 --- a/unshackle/core/titles/movie.py +++ b/unshackle/core/titles/movie.py @@ -52,7 +52,17 @@ class Movie(Title): def get_filename(self, media_info: MediaInfo, folder: bool = False, show_service: bool = True) -> str: primary_video_track = next(iter(media_info.video_tracks), None) - primary_audio_track = next(iter(media_info.audio_tracks), None) + primary_audio_track = None + if media_info.audio_tracks: + sorted_audio = sorted( + media_info.audio_tracks, + key=lambda x: ( + float(x.bit_rate) if x.bit_rate else 0, + bool(x.format_additionalfeatures and "JOC" in x.format_additionalfeatures) + ), + reverse=True + ) + primary_audio_track = sorted_audio[0] unique_audio_languages = len({x.language.split("-")[0] for x in media_info.audio_tracks if x.language}) # Name (Year) diff --git a/unshackle/core/tracks/audio.py b/unshackle/core/tracks/audio.py index ff5de9f..0069efa 100644 --- a/unshackle/core/tracks/audio.py +++ b/unshackle/core/tracks/audio.py @@ -12,6 +12,7 @@ class Audio(Track): AAC = "AAC" # https://wikipedia.org/wiki/Advanced_Audio_Coding AC3 = "DD" # https://wikipedia.org/wiki/Dolby_Digital EC3 = "DD+" # https://wikipedia.org/wiki/Dolby_Digital_Plus + AC4 = "AC-4" # https://wikipedia.org/wiki/Dolby_AC-4 OPUS = "OPUS" # https://wikipedia.org/wiki/Opus_(audio_format) OGG = "VORB" # https://wikipedia.org/wiki/Vorbis DTS = "DTS" # https://en.wikipedia.org/wiki/DTS_(company)#DTS_Digital_Surround @@ -31,6 +32,8 @@ class Audio(Track): return Audio.Codec.AC3 if mime == "ec-3": return Audio.Codec.EC3 + if mime == "ac-4": + return Audio.Codec.AC4 if mime == "opus": return Audio.Codec.OPUS if mime == "dtsc": @@ -60,6 +63,8 @@ class Audio(Track): return Audio.Codec.AC3 if profile.startswith("ddplus"): return Audio.Codec.EC3 + if profile.startswith("ac4"): + return Audio.Codec.AC4 if profile.startswith("playready-oggvorbis"): return Audio.Codec.OGG raise ValueError(f"The Content Profile '{profile}' is not a supported Audio Codec")