From 4ab02216cdfde52c9828c48644accde08c85e575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wanlin=20Wang=20=E7=8E=8B=E4=B8=87=E9=9C=96?= Date: Thu, 25 Jul 2024 17:20:26 +0800 Subject: [PATCH] Add ytInitialPlayerResponse checker to let user easily know problem --- src/you_get/extractors/youtube.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/you_get/extractors/youtube.py b/src/you_get/extractors/youtube.py index dd06daf8..2e31e646 100644 --- a/src/you_get/extractors/youtube.py +++ b/src/you_get/extractors/youtube.py @@ -175,6 +175,16 @@ class YouTube(VideoExtractor): pass # FIXME: show DASH stream sizes (by default) for playlist videos + def check_playability_response(self, ytInitialPlayerResponse): + STATUS_OK = "OK" + + playerResponseStatus = ytInitialPlayerResponse["playabilityStatus"]["status"] + if playerResponseStatus != STATUS_OK: + reason = ytInitialPlayerResponse["playabilityStatus"].get("reason", "") + raise AssertionError( + f"Server refused to provide video details. Returned status: {playerResponseStatus}, reason: {reason}." + ) + def prepare(self, **kwargs): assert self.url or self.vid @@ -202,6 +212,7 @@ class YouTube(VideoExtractor): logging.debug('Loading ytInitialPlayerResponse...') ytInitialPlayerResponse = json.loads(re.search('ytInitialPlayerResponse\s*=\s*([^\n]+?});(\n||var )', video_page).group(1)) + self.check_playability_response(ytInitialPlayerResponse) # Get the video title self.title = ytInitialPlayerResponse["videoDetails"]["title"]