From 5f47e1a71b641b4fec1da343d3bb18c95f876d5a Mon Sep 17 00:00:00 2001 From: Lomanic Date: Thu, 1 Apr 2021 00:31:33 +0200 Subject: [PATCH] Fix extracting with cookie consent page in EU Fix #27 use maintained yt-dlp lib instead of youtube-dlc Because of the following changes in YT, we have to switch to a maintained library https://github.com/ytdl-org/youtube-dl/issues/28604 While yt-dlp is not fixed today, youtube-dl is fixed in master and as yt-dlp is quick to merge upstream changes back to their repo, we can hope the issue will also be fixed there timely. For requests sent by us directly, we include the cookies. Ref https://github.com/ytdl-org/youtube-dl/issues/28604 --- extractors/channel.py | 2 +- extractors/search.py | 6 +++--- extractors/video.py | 6 +++--- index.py | 2 +- requirements.txt | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/extractors/channel.py b/extractors/channel.py index 8c78ec3..0270631 100644 --- a/extractors/channel.py +++ b/extractors/channel.py @@ -18,7 +18,7 @@ def extract_channel(ucid): return channel_cache[ucid] channel_type = "channel" if len(ucid) == 24 and ucid[:2] == "UC" else "user" - with requests.get("https://www.youtube.com/{}/{}/videos?hl=en".format(channel_type, ucid)) as r: + with requests.get("https://www.youtube.com/{}/{}/videos?hl=en".format(channel_type, ucid), cookies={"CONSENT": "YES+cb.20210328-17-p0.en+FX+101"}) as r: r.raise_for_status() yt_initial_data = extract_yt_initial_data(r.content.decode("utf8")) diff --git a/extractors/search.py b/extractors/search.py index d2ffc0a..64cf21c 100644 --- a/extractors/search.py +++ b/extractors/search.py @@ -1,6 +1,6 @@ import requests import traceback -import youtube_dlc +import yt_dlp from tools.converters import * from tools.extractors import extract_yt_initial_data from cachetools import TTLCache @@ -13,11 +13,11 @@ ytdl_opts = { "playlist_items": "1-100", "extract_flat": "in_playlist" } -ytdl = youtube_dlc.YoutubeDL(ytdl_opts) +ytdl = yt_dlp.YoutubeDL(ytdl_opts) def extract_search(q): try: - with requests.get("https://www.youtube.com/results", params={"q": q, "hl": "en"}) as r: + with requests.get("https://www.youtube.com/results", params={"q": q, "hl": "en"}, cookies={"CONSENT": "YES+cb.20210328-17-p0.en+FX+101"}) as r: r.raise_for_status() content = r.content.decode("utf8") yt_initial_data = extract_yt_initial_data(content) diff --git a/extractors/video.py b/extractors/video.py index 11d7d73..3d6ebc9 100644 --- a/extractors/video.py +++ b/extractors/video.py @@ -4,7 +4,7 @@ import json import os import re import traceback -import youtube_dlc +import yt_dlp import urllib.error from tools.converters import * from tools.extractors import extract_yt_initial_data, extract_yt_initial_player_response @@ -24,7 +24,7 @@ ytdl_opts = { "writesubtitles": True, "allsubtitles": True, } -ytdl = youtube_dlc.YoutubeDL(ytdl_opts) +ytdl = yt_dlp.YoutubeDL(ytdl_opts) def format_order(format): # most significant to least significant @@ -185,7 +185,7 @@ def extract_video(id): return result - except youtube_dlc.DownloadError as e: + except yt_dlp.DownloadError as e: files.clean_up_temp_files(id) if isinstance(e.exc_info[1], urllib.error.HTTPError): diff --git a/index.py b/index.py index 2e8f098..43296cc 100644 --- a/index.py +++ b/index.py @@ -2,7 +2,7 @@ import cherrypy import json import pathlib import requests -import youtube_dlc +import yt_dlp from extractors.video import extract_video from extractors.channel import extract_channel, extract_channel_videos, extract_channel_latest from extractors.manifest import extract_manifest diff --git a/requirements.txt b/requirements.txt index 1454d70..ddf128a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ cherrypy -youtube-dlc +yt-dlp cachetools python-dateutil requests