diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index 9b73fcd75..19ba29831 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -1601,6 +1601,7 @@ from .puhutv import ( ) from .puls4 import Puls4IE from .pyvideo import PyvideoIE +from .plvideo import PlVideoVideoIE from .qdance import QDanceIE from .qingting import QingTingIE from .qqmusic import ( diff --git a/yt_dlp/extractor/plvideo.py b/yt_dlp/extractor/plvideo.py new file mode 100644 index 000000000..d052e48bd --- /dev/null +++ b/yt_dlp/extractor/plvideo.py @@ -0,0 +1,55 @@ + +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, + } + + + +