From 78352870bfe345279c49f39faac08c4874f8a17d Mon Sep 17 00:00:00 2001 From: anderstornkvist Date: Tue, 19 Jan 2021 10:40:25 +0100 Subject: [PATCH 1/2] [box] extract mpd format for box --- youtube_dl/extractor/box.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/youtube_dl/extractor/box.py b/youtube_dl/extractor/box.py index aae82d1af..40453f9a0 100644 --- a/youtube_dl/extractor/box.py +++ b/youtube_dl/extractor/box.py @@ -8,7 +8,7 @@ from .common import InfoExtractor from ..utils import ( determine_ext, parse_iso8601, - # try_get, + try_get, update_url_query, ) @@ -51,7 +51,7 @@ class BoxIE(InfoExtractor): 'BoxApi': 'shared_link=' + shared_link, 'X-Rep-Hints': '[dash]', # TODO: extract `hls` formats }, query={ - 'fields': 'authenticated_download_url,created_at,created_by,description,extension,is_download_available,name,representations,size' + 'fields': 'permissions,authenticated_download_url,created_at,created_by,description,extension,is_download_available,name,representations,size' }) title = f['name'] @@ -62,20 +62,24 @@ class BoxIE(InfoExtractor): formats = [] - # for entry in (try_get(f, lambda x: x['representations']['entries'], list) or []): - # entry_url_template = try_get( - # entry, lambda x: x['content']['url_template']) - # if not entry_url_template: - # continue - # representation = entry.get('representation') - # if representation == 'dash': - # TODO: append query to every fragment URL - # formats.extend(self._extract_mpd_formats( - # entry_url_template.replace('{+asset_path}', 'manifest.mpd'), - # file_id, query=query)) + for entry in (try_get(f, lambda x: x['representations']['entries'], list) or []): + entry_url_template = try_get( + entry, lambda x: x['content']['url_template']) + if not entry_url_template: + continue + representation = entry.get('representation') + if representation == 'dash': + extracted = self._extract_mpd_formats( + entry_url_template.replace('{+asset_path}', 'manifest.mpd'), + file_id, query=query) + for extracted_format in extracted: + for fragment in extracted_format['fragments']: + fragment['path'] = update_url_query(fragment['path'], query) + formats.extend(extracted) authenticated_download_url = f.get('authenticated_download_url') - if authenticated_download_url and f.get('is_download_available'): + permissions = f.get('permissions') or {} + if authenticated_download_url and f.get('is_download_available') and permissions.get('can_download', True): formats.append({ 'ext': f.get('extension') or determine_ext(title), 'filesize': f.get('size'), From 0cca4de1ae173b4f2623ce317acfb9a1a0c15ab0 Mon Sep 17 00:00:00 2001 From: anderstornkvist Date: Tue, 19 Jan 2021 10:41:04 +0100 Subject: [PATCH 2/2] [box] allow subdomain for box without file id in url --- youtube_dl/extractor/box.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/youtube_dl/extractor/box.py b/youtube_dl/extractor/box.py index 40453f9a0..c7ee58eb5 100644 --- a/youtube_dl/extractor/box.py +++ b/youtube_dl/extractor/box.py @@ -14,7 +14,7 @@ from ..utils import ( class BoxIE(InfoExtractor): - _VALID_URL = r'https?://(?:[^.]+\.)?app\.box\.com/s/(?P[^/]+)/file/(?P\d+)' + _VALID_URL = r'https?://(?P(?:[^.]+\.)?)app\.box\.com/s/(?P[^/]+)(?:/file/(?P\d+))?' _TEST = { 'url': 'https://mlssoccer.app.box.com/s/0evd2o3e08l60lr4ygukepvnkord1o1x/file/510727257538', 'md5': '1f81b2fd3960f38a40a3b8823e5fcd43', @@ -30,20 +30,22 @@ class BoxIE(InfoExtractor): } def _real_extract(self, url): - shared_name, file_id = re.match(self._VALID_URL, url).groups() + prefix, shared_name, file_id = re.match(self._VALID_URL, url).groups() webpage = self._download_webpage(url, file_id) + if not file_id: + file_id = re.search(r'"typedID":\s*"f_(\d+)"', webpage).group(1) request_token = self._parse_json(self._search_regex( r'Box\.config\s*=\s*({.+?});', webpage, 'Box config'), file_id)['requestToken'] access_token = self._download_json( - 'https://app.box.com/app-api/enduserapp/elements/tokens', file_id, + 'https://' + prefix + 'app.box.com/app-api/enduserapp/elements/tokens', file_id, 'Downloading token JSON metadata', data=json.dumps({'fileIDs': [file_id]}).encode(), headers={ 'Content-Type': 'application/json', 'X-Request-Token': request_token, 'X-Box-EndUser-API': 'sharedName=' + shared_name, })[file_id]['read'] - shared_link = 'https://app.box.com/s/' + shared_name + shared_link = 'https://' + prefix + 'app.box.com/s/' + shared_name f = self._download_json( 'https://api.box.com/2.0/files/' + file_id, file_id, 'Downloading file JSON metadata', headers={