From 3b32462251c01ad1e7ca66b1e778c9a5e07466cf Mon Sep 17 00:00:00 2001 From: Andy Date: Sun, 16 Nov 2025 20:42:14 +0000 Subject: [PATCH] feat(cdm): add per-track quality-based CDM selection during runtime DRM switching Enable quality-based CDM selection during runtime DRM switching by passing track quality to get_cdm() calls. This allows different CDMs to be used for different video quality levels within the same download session. Example configuration: cdm: SERVICE: "<=1080": wv_l3_local # Widevine L3 for SD/HD ">1080": pr_sl3_remote # PlayReady SL3 for 4K --- unshackle/commands/dl.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/unshackle/commands/dl.py b/unshackle/commands/dl.py index 48651d8..5a38b20 100644 --- a/unshackle/commands/dl.py +++ b/unshackle/commands/dl.py @@ -1847,25 +1847,32 @@ class dl: if not drm: return + track_quality = None if isinstance(track, Video) and track.height: - pass + track_quality = track.height if isinstance(drm, Widevine): if not isinstance(self.cdm, (WidevineCdm, DecryptLabsRemoteCDM)) or ( isinstance(self.cdm, DecryptLabsRemoteCDM) and self.cdm.is_playready ): - widevine_cdm = self.get_cdm(self.service, self.profile, drm="widevine") + widevine_cdm = self.get_cdm(self.service, self.profile, drm="widevine", quality=track_quality) if widevine_cdm: - self.log.info("Switching to Widevine CDM for Widevine content") + if track_quality: + self.log.info(f"Switching to Widevine CDM for Widevine {track_quality}p content") + else: + self.log.info("Switching to Widevine CDM for Widevine content") self.cdm = widevine_cdm elif isinstance(drm, PlayReady): if not isinstance(self.cdm, (PlayReadyCdm, DecryptLabsRemoteCDM)) or ( isinstance(self.cdm, DecryptLabsRemoteCDM) and not self.cdm.is_playready ): - playready_cdm = self.get_cdm(self.service, self.profile, drm="playready") + playready_cdm = self.get_cdm(self.service, self.profile, drm="playready", quality=track_quality) if playready_cdm: - self.log.info("Switching to PlayReady CDM for PlayReady content") + if track_quality: + self.log.info(f"Switching to PlayReady CDM for PlayReady {track_quality}p content") + else: + self.log.info("Switching to PlayReady CDM for PlayReady content") self.cdm = playready_cdm if isinstance(drm, Widevine):