from pprint import pprint from yt_dlp.extractor.common import InfoExtractor class PlVideoVideoIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?plvideo\.ru/watch\?v=(?P\w+)&?(.+)?' # type: ignore _TESTS = [ { 'url': 'https://plvideo.ru/watch?v=lYmu2gcUKOa9', 'info_dict': { 'id': 'lYmu2gcUKOa9', 'ext': 'mp4', 'title': 'test', } } ] 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["code"] == 200, "Failed to download video JSON" item = result["item"] assert item is not None, "Bad API response" thumbnail = item["cover"]["paths"]["original"]["src"] formats = [] for key, value in item["profiles"].items(): hlsurl = value["hls"] fmt = { 'url': hlsurl, 'ext': 'mp4', 'quality': 0 if len(formats) == 0 else 0 - len(formats), 'thumbnail': thumbnail, 'format_id': key, 'protocol': 'm3u8_native' } formats.append(fmt) return { 'id': video_id, 'title': item["title"], 'formats': formats, }