aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yt_dlp/extractor/_extractors.py5
-rw-r--r--yt_dlp/extractor/huya.py80
2 files changed, 83 insertions, 2 deletions
diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
index 4302076f0..8903bf8fc 100644
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -823,7 +823,10 @@ from .hungama import (
HungamaIE,
HungamaSongIE,
)
-from .huya import HuyaLiveIE
+from .huya import (
+ HuyaLiveIE,
+ HuyaVideoIE,
+)
from .hypem import HypemIE
from .hypergryph import MonsterSirenHypergryphMusicIE
from .hytale import HytaleIE
diff --git a/yt_dlp/extractor/huya.py b/yt_dlp/extractor/huya.py
index 5663a78a3..f79e032e4 100644
--- a/yt_dlp/extractor/huya.py
+++ b/yt_dlp/extractor/huya.py
@@ -8,15 +8,19 @@ from .common import InfoExtractor
from ..utils import (
ExtractorError,
int_or_none,
+ parse_duration,
str_or_none,
try_get,
unescapeHTML,
+ unified_strdate,
update_url_query,
+ url_or_none,
)
+from ..utils.traversal import traverse_obj
class HuyaLiveIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.|m\.)?huya\.com/(?P<id>[^/#?&]+)(?:\D|$)'
+ _VALID_URL = r'https?://(?:www\.|m\.)?huya\.com/(?!(?:video/play/))(?P<id>[^/#?&]+)(?:\D|$)'
IE_NAME = 'huya:live'
IE_DESC = 'huya.com'
TESTS = [{
@@ -24,6 +28,7 @@ class HuyaLiveIE(InfoExtractor):
'info_dict': {
'id': '572329',
'title': str,
+ 'ext': 'flv',
'description': str,
'is_live': True,
'view_count': int,
@@ -131,3 +136,76 @@ class HuyaLiveIE(InfoExtractor):
fm = base64.b64decode(params['fm']).decode().split('_', 1)[0]
ss = hashlib.md5('|'.join([params['seqid'], params['ctype'], params['t']]))
return fm, ss
+
+
+class HuyaVideoIE(InfoExtractor):
+ _VALID_URL = r'https?://(?:www\.)?huya\.com/video/play/(?P<id>\d+)\.html'
+ IE_NAME = 'huya:video'
+ IE_DESC = '虎牙视频'
+
+ _TESTS = [{
+ 'url': 'https://www.huya.com/video/play/1002412640.html',
+ 'info_dict': {
+ 'id': '1002412640',
+ 'ext': 'mp4',
+ 'title': '8月3日',
+ 'thumbnail': r're:https?://.*\.jpg',
+ 'duration': 14,
+ 'uploader': '虎牙-ATS欧卡车队青木',
+ 'uploader_id': '1564376151',
+ 'upload_date': '20240803',
+ 'view_count': int,
+ 'comment_count': int,
+ 'like_count': int,
+ },
+ },
+ {
+ 'url': 'https://www.huya.com/video/play/556054543.html',
+ 'info_dict': {
+ 'id': '556054543',
+ 'ext': 'mp4',
+ 'title': '我不挑事 也不怕事',
+ 'thumbnail': r're:https?://.*\.jpg',
+ 'duration': 1864,
+ 'uploader': '卡尔',
+ 'uploader_id': '367138632',
+ 'upload_date': '20210811',
+ 'view_count': int,
+ 'comment_count': int,
+ 'like_count': int,
+ },
+ }]
+
+ def _real_extract(self, url: str):
+ video_id = self._match_id(url)
+ video_data = self._download_json(
+ 'https://liveapi.huya.com/moment/getMomentContent', video_id,
+ query={'videoId': video_id})['data']['moment']['videoInfo']
+
+ formats = []
+ for definition in traverse_obj(video_data, ('definitions', lambda _, v: url_or_none(v['url']))):
+ formats.append({
+ 'url': definition['url'],
+ **traverse_obj(definition, {
+ 'format_id': ('defName', {str}),
+ 'width': ('width', {int_or_none}),
+ 'height': ('height', {int_or_none}),
+ 'filesize': ('size', {int_or_none}),
+ }),
+ })
+
+ return {
+ 'id': video_id,
+ 'formats': formats,
+ **traverse_obj(video_data, {
+ 'title': ('videoTitle', {str}),
+ 'thumbnail': ('videoCover', {url_or_none}),
+ 'duration': ('videoDuration', {parse_duration}),
+ 'uploader': ('nickName', {str}),
+ 'uploader_id': ('uid', {str_or_none}),
+ 'upload_date': ('videoUploadTime', {unified_strdate}),
+ 'view_count': ('videoPlayNum', {int_or_none}),
+ 'comment_count': ('videoCommentNum', {int_or_none}),
+ 'like_count': ('favorCount', {int_or_none}),
+ }),
+ }