Compare commits

...

11 Commits

Author SHA1 Message Date
voidptr_t
e4cd2de2c9
Merge 7642837a49 into f95a92b3d0 2024-11-17 00:28:45 +01:00
voidptr_t
7642837a49 test 2024-08-05 21:35:32 +03:00
voidptr_t
f2cc0d3060 dimensions 2024-08-05 21:24:12 +03:00
voidptr_t
d61ea9bed7 fix 2024-08-05 21:11:08 +03:00
voidptr_t
a3170778da more info 2024-08-05 21:10:02 +03:00
voidptr_t
c3896d0178 thumbnail 2024-08-04 19:39:33 +03:00
voidptr_t
605741fbe8 fmt 2024-08-04 19:26:38 +03:00
voidptr_t
81059046e4 remove unused whitespaces 2024-08-04 19:20:45 +03:00
voidptr_t
04aba893e3 replace "" with '' 2024-08-04 19:19:51 +03:00
voidptr_t
7f02e044b7 replace [] with .get() 2024-08-04 19:17:35 +03:00
voidptr_t
a85e77a058 [PlVideo (Платформа)] Add extractor 2024-08-04 19:10:44 +03:00
2 changed files with 92 additions and 0 deletions

View File

@ -1553,6 +1553,7 @@ from .pluralsight import (
PluralsightIE,
)
from .plutotv import PlutoTVIE
from .plvideo import PlVideoVideoIE
from .podbayfm import (
PodbayFMChannelIE,
PodbayFMIE,

View File

@ -0,0 +1,91 @@
from yt_dlp.utils._utils import qualities
from .common import InfoExtractor
class PlVideoVideoIE(InfoExtractor):
_VALID_URL = r'https?://(?:www\.)?plvideo\.ru/watch\?v=(?P<id>\w+)&?(.+)?' # type: ignore
_TESTS = [
{
'url': 'https://plvideo.ru/watch?v=lYmu2gcUKOa9',
'md5': 'eb3e7830abb375a782d943f593d2646b',
'info_dict': {
'id': 'lYmu2gcUKOa9',
'ext': 'mp4',
'title': 'Запретная страсть. Премьера 2024. 18+Мелодрама. Триллер. 18+',
'uploader_id': 'y__S081jJiUt',
'uploader': 'Tvoja Mediateka',
'duration': 6238333,
'like_count': int,
'description': str,
'comment_count': int,
'thumbnail': r're:^https?://.*\.jpg',
'type': 'video',
'view_count': int,
'dislike_count': int,
},
},
]
def _quality_to_dimensions(self, quality):
mapped = {
'240p': (426, 240),
'360p': (640, 360),
'468p': (720, 468),
'480p': (720, 480),
'720p': (1280, 720),
'1080p': (1920, 1080),
}
return mapped.get(quality)
def _real_extract(self, url):
video_id = self._match_id(url)
api_url = f'https://api.g1.plvideo.ru/v1/videos/{video_id}?Aud=18'
result = self._download_json(api_url, video_id, 'Downloading video JSON')
assert result.get('code') == 200, 'Failed to download video JSON'
item = result.get('item')
assert item is not None, 'Bad API response'
thumbnail = item.get('cover').get('paths').get('original').get('src')
formats = []
preference = qualities(['240p', '360p', '468p', '480p', '720p', '1080p'])
for key, value in item.get('profiles').items():
hlsurl = value.get('hls')
dimensions = self._quality_to_dimensions(key)
fmt = {
'url': hlsurl,
'ext': 'mp4',
'quality': preference(key),
'width': dimensions[0],
'height': dimensions[1],
'format_id': key,
'protocol': 'm3u8_native',
'aspect_ratio': float(value.get('aspectRatio')),
}
formats.append(fmt)
result = {
'id': video_id,
'title': item.get('title'),
'formats': formats,
'thumbnails': [{'url': thumbnail}],
'uploader': item.get('channel').get('name'),
'duration': item.get('uploadFile').get('videoDuration'),
'uploader_id': item.get('channel').get('id'),
'view_count': item.get('stats').get('viewTotalCount'),
'like_count': item.get('stats').get('likeCount'),
'comment_count': item.get('stats').get('commentCount'),
'dislike_count': item.get('stats').get('dislikeCount'),
'type': item.get('type'),
}
description = item.get('description')
if description:
result['description'] = description
return result