diff --git a/unshackle/commands/dl.py b/unshackle/commands/dl.py index 06fa306..9a97711 100644 --- a/unshackle/commands/dl.py +++ b/unshackle/commands/dl.py @@ -628,12 +628,17 @@ class dl: "device_type": self.cdm.device_type.name, } else: - self.log.info( - f"Loaded PlayReady CDM: {self.cdm.certificate_chain.get_name()} (L{self.cdm.security_level})" - ) + # Handle both local PlayReady CDM and RemoteCdm (which has certificate_chain=None) + is_remote = self.cdm.certificate_chain is None and hasattr(self.cdm, "device_name") + if is_remote: + cdm_name = self.cdm.device_name + self.log.info(f"Loaded PlayReady Remote CDM: {cdm_name} (L{self.cdm.security_level})") + else: + cdm_name = self.cdm.certificate_chain.get_name() if self.cdm.certificate_chain else "Unknown" + self.log.info(f"Loaded PlayReady CDM: {cdm_name} (L{self.cdm.security_level})") cdm_info = { "type": "PlayReady", - "certificate": self.cdm.certificate_chain.get_name(), + "certificate": cdm_name, "security_level": self.cdm.security_level, } diff --git a/unshackle/commands/serve.py b/unshackle/commands/serve.py index d7e5d4d..9276976 100644 --- a/unshackle/commands/serve.py +++ b/unshackle/commands/serve.py @@ -166,10 +166,26 @@ def serve( if "playready_devices" not in user_config: user_config["playready_devices"] = prd_device_names + def create_serve_authentication(serve_playready_flag: bool): + @web.middleware + async def serve_authentication(request: web.Request, handler) -> web.Response: + if serve_playready_flag and request.path in ("/playready", "/playready/"): + response = await handler(request) + else: + response = await pywidevine_serve.authentication(request, handler) + + if serve_playready_flag and request.path.startswith("/playready"): + from pyplayready import __version__ as pyplayready_version + response.headers["Server"] = f"https://git.gay/ready-dl/pyplayready serve v{pyplayready_version}" + + return response + return serve_authentication + if no_key: app = web.Application(middlewares=[cors_middleware]) else: - app = web.Application(middlewares=[cors_middleware, pywidevine_serve.authentication]) + serve_auth = create_serve_authentication(serve_playready and bool(prd_devices)) + app = web.Application(middlewares=[cors_middleware, serve_auth]) app["config"] = serve_config app["debug_api"] = debug_api @@ -203,6 +219,14 @@ def serve( playready_app.on_cleanup.append(pyplayready_serve._cleanup) playready_app.add_routes(pyplayready_serve.routes) + async def playready_ping(_: web.Request) -> web.Response: + from pyplayready import __version__ as pyplayready_version + response = web.json_response({"message": "OK"}) + response.headers["Server"] = f"https://git.gay/ready-dl/pyplayready serve v{pyplayready_version}" + return response + + app.router.add_route("*", "/playready", playready_ping) + app.add_subapp("/playready", playready_app) log.info(f"PlayReady CDM endpoints available at http://{host}:{port}/playready/") elif serve_playready: