]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/iwara.py
[extractor/adobepass] Handle `Charter_Direct` MSO as `Spectrum` (#6824)
[yt-dlp.git] / yt_dlp / extractor / iwara.py
index 9dbb141fd6126acfe3d309ee7289f2318dfe2475..a5aad26ee8206d287dcb3e5c8538c1f8d12a825b 100644 (file)
@@ -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