aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Taylor <user234683@users.noreply.github.com>2021-07-28 13:00:25 -0700
committerJesús <heckyel@hyperbola.info>2021-07-28 23:48:54 -0500
commitf27105fa7f92919ea2cecdc87239e62a2a3d23b7 (patch)
tree9084c9b142406e5188279171c5dc29288dec0fcc
parent54b39f13034fdbcf427a21b3be8d56020516a764 (diff)
downloadyt-local-f27105fa7f92919ea2cecdc87239e62a2a3d23b7.tar.lz
yt-local-f27105fa7f92919ea2cecdc87239e62a2a3d23b7.tar.xz
yt-local-f27105fa7f92919ea2cecdc87239e62a2a3d23b7.zip
New age restriction bypass method since get_video_info was disabled
From https://github.com/yt-dlp/yt-dlp/issues/574#issuecomment-887171136 Signed-off-by: Jesús <heckyel@hyperbola.info>
-rw-r--r--youtube/watch.py56
-rw-r--r--youtube/yt_data_extract/watch_extraction.py9
2 files changed, 34 insertions, 31 deletions
diff --git a/youtube/watch.py b/youtube/watch.py
index 3bee71f..38d08f7 100644
--- a/youtube/watch.py
+++ b/youtube/watch.py
@@ -241,33 +241,41 @@ def extract_info(video_id, use_invidious, playlist_id=None, index=None):
# see https://github.com/user234683/youtube-local/issues/22#issuecomment-706395160
if info['age_restricted'] or info['player_urls_missing']:
if info['age_restricted']:
- print('Age restricted video. Fetching get_video_info page')
+ print('Age restricted video. Fetching /youtubei/v1/player page')
else:
- print('Missing player. Fetching get_video_info page')
+ print('Missing player. Fetching /youtubei/v1/player page')
+
+ # https://github.com/yt-dlp/yt-dlp/issues/574#issuecomment-887171136
+ # ANDROID is used instead because its urls don't require decryption
+ # The URLs returned with WEB for videos requiring decryption
+ # couldn't be decrypted with the base.js from the web page for some
+ # reason
+ url ='https://youtubei.googleapis.com/youtubei/v1/player'
+ url += '?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
data = {
- 'video_id': video_id,
- 'eurl': 'https://youtube.googleapis.com/v/' + video_id,
- 'html5': '1',
- # See https://github.com/ytdl-org/youtube-dl/issues/29333#issuecomment-864049544
- 'c': 'TVHTML5',
- 'cver': '6.20180913',
- 'hl': 'en',
+ 'videoId': video_id,
+ 'context': {
+ 'client': {
+ 'clientName': 'ANDROID',
+ 'clientVersion': '16.20',
+ 'clientScreen': 'EMBED',
+ 'gl': 'US',
+ 'hl': 'en',
+ },
+ # https://github.com/yt-dlp/yt-dlp/pull/575#issuecomment-887739287
+ 'thirdParty': {
+ 'embedUrl': 'https://google.com', # Can be any valid URL
+ }
+ }
}
- url = 'https://www.youtube.com/get_video_info?'
- url += urllib.parse.urlencode(data)
- try:
- video_info_page = util.fetch_url(
- url, headers=util.mobile_ua, debug_name='get_video_info',
- report_text='Fetched get_video_info page').decode('utf-8')
- except util.FetchError as e:
- if e.code == '404':
- _add_to_error(info, 'playability_error',
- '\n\nget_video_info not available (404).')
- else:
- raise
- else:
- yt_data_extract.update_with_age_restricted_info(info,
- video_info_page)
+ data = json.dumps(data)
+ content_header = (('Content-Type', 'application/json'),)
+ player_response = util.fetch_url(
+ url, data=data, headers=util.mobile_ua + content_header,
+ debug_name='youtubei_player',
+ report_text='Fetched youtubei player page').decode('utf-8')
+ yt_data_extract.update_with_age_restricted_info(info,
+ player_response)
# signature decryption
decryption_error = decrypt_signatures(info, video_id)
diff --git a/youtube/yt_data_extract/watch_extraction.py b/youtube/yt_data_extract/watch_extraction.py
index 9ad3d43..04380fa 100644
--- a/youtube/yt_data_extract/watch_extraction.py
+++ b/youtube/yt_data_extract/watch_extraction.py
@@ -706,15 +706,10 @@ def get_caption_url(info, language, format, automatic=False, translation_languag
url += '&tlang=' + translation_language
return url
-def update_with_age_restricted_info(info, video_info_page):
- '''Inserts urls from 'player_response' in get_video_info page'''
+def update_with_age_restricted_info(info, player_response):
+ '''Inserts urls from player_response json'''
ERROR_PREFIX = 'Error getting missing player or bypassing age-restriction: '
- video_info = urllib.parse.parse_qs(video_info_page)
- player_response = deep_get(video_info, 'player_response', 0)
- if player_response is None:
- info['playability_error'] = ERROR_PREFIX + 'Could not find player_response in video_info_page'
- return
try:
player_response = json.loads(player_response)
except json.decoder.JSONDecodeError: