diff --git a/yt_dlp/extractor/iwara.py b/yt_dlp/extractor/iwara.py index 9dbb141fd6..a5aad26ee8 100644 --- a/yt_dlp/extractor/iwara.py +++ b/yt_dlp/extractor/iwara.py @@ -8,6 +8,7 @@ OnDemandPagedList, int_or_none, mimetype2ext, + qualities, traverse_obj, unified_timestamp, ) @@ -64,13 +65,15 @@ def _extract_formats(self, video_id, fileurl): # https://github.com/yt-dlp/yt-dlp/issues/6549#issuecomment-1473771047 x_version = hashlib.sha1('_'.join((paths[-1], q['expires'][0], '5nFp9kmbNnHdAFhaqMvt')).encode()).hexdigest() + preference = qualities(['preview', '360', '540', 'Source']) + files = self._download_json(fileurl, video_id, headers={'X-Version': x_version}) for fmt in files: yield traverse_obj(fmt, { 'format_id': 'name', 'url': ('src', ('view', 'download'), {self._proto_relative_url}), 'ext': ('type', {mimetype2ext}), - 'quality': ('name', {lambda x: int_or_none(x) or 1e4}), + 'quality': ('name', {preference}), 'height': ('name', {int_or_none}), }, get_all=False) @@ -84,6 +87,11 @@ def _real_extract(self, url): elif errmsg: raise ExtractorError(f'Iwara says: {errmsg}') + if not video_data.get('fileUrl'): + if video_data.get('embedUrl'): + return self.url_result(video_data.get('embedUrl')) + raise ExtractorError('This video is unplayable', expected=True) + return { 'id': video_id, 'age_limit': 18 if video_data.get('rating') == 'ecchi' else 0, # ecchi is 'sexy' in Japanese