1
0
mirror of https://github.com/yt-dlp/yt-dlp.git synced 2025-08-08 13:38:29 +00:00

[ie/TVer] Extract Streaks API info (#13885)

Closes #13874
Authored by: bashonly
This commit is contained in:
bashonly 2025-07-30 18:15:59 -05:00 committed by GitHub
parent 42ca3d601e
commit 70d7687487
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 22 additions and 7 deletions

View File

@ -33,16 +33,20 @@ def _extract_from_streaks_api(self, project_id, media_id, headers=None, query=No
**(headers or {}), **(headers or {}),
}) })
except ExtractorError as e: except ExtractorError as e:
if isinstance(e.cause, HTTPError) and e.cause.status in {403, 404}: if isinstance(e.cause, HTTPError) and e.cause.status in (403, 404):
error = self._parse_json(e.cause.response.read().decode(), media_id, fatal=False) error = self._parse_json(e.cause.response.read().decode(), media_id, fatal=False)
message = traverse_obj(error, ('message', {str})) message = traverse_obj(error, ('message', {str}))
code = traverse_obj(error, ('code', {str})) code = traverse_obj(error, ('code', {str}))
error_id = traverse_obj(error, ('id', {int}))
if code == 'REQUEST_FAILED': if code == 'REQUEST_FAILED':
self.raise_geo_restricted(message, countries=self._GEO_COUNTRIES) if error_id == 124:
elif code == 'MEDIA_NOT_FOUND': self.raise_geo_restricted(countries=self._GEO_COUNTRIES)
raise ExtractorError(message, expected=True) elif error_id == 126:
elif code or message: raise ExtractorError('Access is denied (possibly due to invalid/missing API key)')
raise ExtractorError(join_nonempty(code, message, delim=': ')) if code == 'MEDIA_NOT_FOUND':
raise ExtractorError(join_nonempty(code, message, delim=': '), expected=True)
if code or message:
raise ExtractorError(join_nonempty(code, error_id, message, delim=': '))
raise raise
streaks_id = response['id'] streaks_id = response['id']

View File

@ -1,3 +1,5 @@
import datetime as dt
from .streaks import StreaksBaseIE from .streaks import StreaksBaseIE
from ..utils import ( from ..utils import (
ExtractorError, ExtractorError,
@ -7,6 +9,7 @@
smuggle_url, smuggle_url,
str_or_none, str_or_none,
strip_or_none, strip_or_none,
time_seconds,
update_url_query, update_url_query,
) )
from ..utils.traversal import require, traverse_obj from ..utils.traversal import require, traverse_obj
@ -96,6 +99,7 @@ class TVerIE(StreaksBaseIE):
'Referer': 'https://tver.jp/', 'Referer': 'https://tver.jp/',
} }
_PLATFORM_QUERY = {} _PLATFORM_QUERY = {}
_STREAKS_API_INFO = {}
def _real_initialize(self): def _real_initialize(self):
session_info = self._download_json( session_info = self._download_json(
@ -105,6 +109,9 @@ def _real_initialize(self):
'platform_uid': 'platform_uid', 'platform_uid': 'platform_uid',
'platform_token': 'platform_token', 'platform_token': 'platform_token',
})) }))
self._STREAKS_API_INFO = self._download_json(
'https://player.tver.jp/player/streaks_info_v2.json', None,
'Downloading STREAKS API info', 'Unable to download STREAKS API info')
def _call_platform_api(self, path, video_id, note=None, fatal=True, query=None): def _call_platform_api(self, path, video_id, note=None, fatal=True, query=None):
return self._download_json( return self._download_json(
@ -223,10 +230,14 @@ def _real_extract(self, url):
'ie_key': 'BrightcoveNew', 'ie_key': 'BrightcoveNew',
} }
project_id = video_info['streaks']['projectID']
key_idx = dt.datetime.fromtimestamp(time_seconds(hours=9), dt.timezone.utc).month % 6 or 6
return { return {
**self._extract_from_streaks_api(video_info['streaks']['projectID'], streaks_id, { **self._extract_from_streaks_api(project_id, streaks_id, {
'Origin': 'https://tver.jp', 'Origin': 'https://tver.jp',
'Referer': 'https://tver.jp/', 'Referer': 'https://tver.jp/',
'X-Streaks-Api-Key': self._STREAKS_API_INFO[project_id]['api_key'][f'key0{key_idx}'],
}), }),
**metadata, **metadata,
'id': video_id, 'id': video_id,