From 5c7adfdc5282bbd60851b8b9996ed8757af70f12 Mon Sep 17 00:00:00 2001 From: horny-is-back Date: Wed, 10 Jul 2024 14:26:51 +0200 Subject: [PATCH 1/4] Create vrporn.py --- yt_dlp/extractor/vrporn.py | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 yt_dlp/extractor/vrporn.py diff --git a/yt_dlp/extractor/vrporn.py b/yt_dlp/extractor/vrporn.py new file mode 100644 index 0000000000..2b9adf4434 --- /dev/null +++ b/yt_dlp/extractor/vrporn.py @@ -0,0 +1,100 @@ +import json + +from .common import InfoExtractor + + +class VRPornIE(InfoExtractor): +    _VALID_URL = r"https?://(?:www\.)?vrporn\.com/(?P.+)/" +    _LOGIN_URL = "https://vrporn.com/api/playa/v2/auth/sign-in-password" +    _SINGLE_VIDEO_URL = "https://vrporn.com/api/playa/v2/video/" +    _NETRC_MACHINE = "vrporn" +    _USERTOKEN = None +    _TESTS = [ +        { +            "url": "https://vrporn.com/milkmans-diaries/", +            "only_matching": True, +        }, +        { +            "url": "https://vrporn.com/what-a-fellin/", +            "only_matching": True, +        }, +    ] + +    def _perform_login(self, username, password): +        user_data = self._download_json( +            self._LOGIN_URL, +            None, +            note="Logging in", +            data=json.dumps( +                { +                    "login": username, +                    "password": password, +                } +            ).encode(), +            headers={ +                "Content-Type": "application/json", +            }, +        ) +        self._USERTOKEN = user_data["data"]["access_token"] + +    def _real_extract(self, url): +        mobj = self._match_valid_url(url) +        display_id = mobj.group("display_id") + +        webpage, _ = self._download_webpage_handle(url, display_id) + +        video_id = self._search_regex( +            r"shortlink.+href=[\'\"]https://vrporn\.com/\?p=([0-9]+)[\'\"]", +            webpage, +            "id", +        ) + +        headers = { +            "Content-Type": "application/json", +        } +        if self._USERTOKEN: +            headers.update( +                { +                    "Authorization": f"Bearer {self._USERTOKEN}", +                } +            ) + +        video_data = self._download_json( +            self._SINGLE_VIDEO_URL + video_id, +            None, +            query={"asd": "asd"}, +            note="fetching formats", +            headers=headers, +        ) + +        title = video_data["data"]["title"] + +        formats = [] + +        duration = "" + +        for detail in video_data["data"]["details"]: +            type = detail["type"] +            duration = detail["duration_seconds"] + +            for link in detail["links"]: +                if link["is_download"]: +                    formats.append( +                        { +                            "url": link["url"], +                            "format_id": f'{type}-{link["quality_name"]}-{link["stereo"]}-{link["projection"]}', +                            "quality": link["quality_name"], +                            "resolution": link["quality_name"], +                        } +                    ) + +        return { +            "id": video_id, +            "display_id": display_id, +            "title": title, +            "duration": duration, +            "formats": formats, +            "age_limit": 18, +        } + + From ac857fd12038092eeb11dfc46971b13e802aeb81 Mon Sep 17 00:00:00 2001 From: horny-is-back Date: Wed, 10 Jul 2024 14:27:41 +0200 Subject: [PATCH 2/4] Update _extractors.py --- yt_dlp/extractor/_extractors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index fc917ff06b..40a390459a 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -2382,6 +2382,7 @@ from .voxmedia import ( VoxMediaIE, VoxMediaVolumeIE, ) +from .vrporn import VRPornIE from .vrt import ( VRTIE, DagelijkseKostIE, From 07cc6d28282ac4354d30943682b32dd14684f364 Mon Sep 17 00:00:00 2001 From: horny-is-back Date: Wed, 10 Jul 2024 15:02:39 +0200 Subject: [PATCH 3/4] tests + `hatch fmt --check` passing --- yt_dlp/extractor/vrporn.py | 95 ++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 40 deletions(-) diff --git a/yt_dlp/extractor/vrporn.py b/yt_dlp/extractor/vrporn.py index 2b9adf4434..d5dadb8931 100644 --- a/yt_dlp/extractor/vrporn.py +++ b/yt_dlp/extractor/vrporn.py @@ -4,19 +4,35 @@ from .common import InfoExtractor class VRPornIE(InfoExtractor): -    _VALID_URL = r"https?://(?:www\.)?vrporn\.com/(?P.+)/" -    _LOGIN_URL = "https://vrporn.com/api/playa/v2/auth/sign-in-password" -    _SINGLE_VIDEO_URL = "https://vrporn.com/api/playa/v2/video/" -    _NETRC_MACHINE = "vrporn" +    _VALID_URL = r'https?://(?:www\.)?vrporn\.com/(?P.+)/' +    _LOGIN_URL = 'https://vrporn.com/api/playa/v2/auth/sign-in-password' +    _SINGLE_VIDEO_URL = 'https://vrporn.com/api/playa/v2/video/' +    _NETRC_MACHINE = 'vrporn'     _USERTOKEN = None     _TESTS = [         { -            "url": "https://vrporn.com/milkmans-diaries/", -            "only_matching": True, +            'url': 'https://vrporn.com/milkmans-diaries/', +            'md5': 'd50ab6c2b4adbe4fcd3f46e40984c7c8', +            'info_dict': { +                'id': '865690', +                'ext': 'mp4', +                'duration': 60, +                'age_limit': 18, +                'title': "Milkman's Diaries", +                'display_id': 'milkmans-diaries', +            },         },         { -            "url": "https://vrporn.com/what-a-fellin/", -            "only_matching": True, +            'url': 'https://vrporn.com/what-a-fellin/', +            'md5': 'eebd569dfea62c398947dbdc422ae0f0', +            'info_dict': { +                'id': '852931', +                'ext': 'mp4', +                'duration': 60, +                'age_limit': 18, +                'title': 'What A Feelin', +                'display_id': 'what-a-fellin', +            },         },     ] @@ -24,77 +40,76 @@ class VRPornIE(InfoExtractor):         user_data = self._download_json(             self._LOGIN_URL,             None, -            note="Logging in", +            note='Logging in',             data=json.dumps(                 { -                    "login": username, -                    "password": password, -                } +                    'login': username, +                    'password': password, +                },             ).encode(),             headers={ -                "Content-Type": "application/json", +                'Content-Type': 'application/json',             },         ) -        self._USERTOKEN = user_data["data"]["access_token"] +        self._USERTOKEN = user_data['data']['access_token']     def _real_extract(self, url):         mobj = self._match_valid_url(url) -        display_id = mobj.group("display_id") +        display_id = mobj.group('display_id')         webpage, _ = self._download_webpage_handle(url, display_id)         video_id = self._search_regex(             r"shortlink.+href=[\'\"]https://vrporn\.com/\?p=([0-9]+)[\'\"]",             webpage, -            "id", +            'id',         )         headers = { -            "Content-Type": "application/json", +            'Content-Type': 'application/json',         }         if self._USERTOKEN:             headers.update(                 { -                    "Authorization": f"Bearer {self._USERTOKEN}", -                } +                    'Authorization': f'Bearer {self._USERTOKEN}', +                },             )         video_data = self._download_json(             self._SINGLE_VIDEO_URL + video_id,             None, -            query={"asd": "asd"}, -            note="fetching formats", +            query={'asd': 'asd'}, +            note='fetching formats',             headers=headers,         ) -        title = video_data["data"]["title"] +        title = video_data['data']['title']         formats = [] -        duration = "" +        duration = '' -        for detail in video_data["data"]["details"]: -            type = detail["type"] -            duration = detail["duration_seconds"] +        for detail in video_data['data']['details']: +            video_type = detail['type'] +            duration = detail['duration_seconds'] -            for link in detail["links"]: -                if link["is_download"]: +            for link in detail['links']: +                if link['is_download']:                     formats.append(                         { -                            "url": link["url"], -                            "format_id": f'{type}-{link["quality_name"]}-{link["stereo"]}-{link["projection"]}', -                            "quality": link["quality_name"], -                            "resolution": link["quality_name"], -                        } +                            'url': link['url'], +                            'format_id': f'{video_type}-{link["quality_name"]}-{link["stereo"]}-{link["projection"]}', +                            'quality': link['quality_name'], +                            'resolution': link['quality_name'], +                        },                     )         return { -            "id": video_id, -            "display_id": display_id, -            "title": title, -            "duration": duration, -            "formats": formats, -            "age_limit": 18, +            'id': video_id, +            'display_id': display_id, +            'title': title, +            'duration': duration, +            'formats': formats, +            'age_limit': 18,         } - From 935a5eee82cfe20ff2aa38ca0398aa3bd33a07b9 Mon Sep 17 00:00:00 2001 From: horny-is-back Date: Thu, 29 Aug 2024 16:20:32 +0200 Subject: [PATCH 4/4] Add files via upload --- yt_dlp/extractor/vrporn.py | 193 ++++++++++++++++++------------------- 1 file changed, 96 insertions(+), 97 deletions(-) diff --git a/yt_dlp/extractor/vrporn.py b/yt_dlp/extractor/vrporn.py index d5dadb8931..d89db998aa 100644 --- a/yt_dlp/extractor/vrporn.py +++ b/yt_dlp/extractor/vrporn.py @@ -4,112 +4,111 @@ from .common import InfoExtractor class VRPornIE(InfoExtractor): -    _VALID_URL = r'https?://(?:www\.)?vrporn\.com/(?P.+)/' -    _LOGIN_URL = 'https://vrporn.com/api/playa/v2/auth/sign-in-password' -    _SINGLE_VIDEO_URL = 'https://vrporn.com/api/playa/v2/video/' -    _NETRC_MACHINE = 'vrporn' -    _USERTOKEN = None -    _TESTS = [ -        { -            'url': 'https://vrporn.com/milkmans-diaries/', -            'md5': 'd50ab6c2b4adbe4fcd3f46e40984c7c8', -            'info_dict': { -                'id': '865690', -                'ext': 'mp4', -                'duration': 60, -                'age_limit': 18, -                'title': "Milkman's Diaries", -                'display_id': 'milkmans-diaries', -            }, -        }, -        { -            'url': 'https://vrporn.com/what-a-fellin/', -            'md5': 'eebd569dfea62c398947dbdc422ae0f0', -            'info_dict': { -                'id': '852931', -                'ext': 'mp4', -                'duration': 60, -                'age_limit': 18, -                'title': 'What A Feelin', -                'display_id': 'what-a-fellin', -            }, -        }, -    ] + _VALID_URL = r'https?://(?:www\.)?vrporn\.com/(?P.+)/' + _LOGIN_URL = 'https://vrporn.com/api/playa/v2/auth/sign-in-password' + _SINGLE_VIDEO_URL = 'https://vrporn.com/api/playa/v2/video/' + _NETRC_MACHINE = 'vrporn' + _USERTOKEN = None + _TESTS = [ + { + 'url': 'https://vrporn.com/milkmans-diaries/', + 'md5': 'd50ab6c2b4adbe4fcd3f46e40984c7c8', + 'info_dict': { + 'id': '865690', + 'ext': 'mp4', + 'duration': 60, + 'age_limit': 18, + 'title': "Milkman's Diaries", + 'display_id': 'milkmans-diaries', + }, + }, + { + 'url': 'https://vrporn.com/what-a-fellin/', + 'md5': 'eebd569dfea62c398947dbdc422ae0f0', + 'info_dict': { + 'id': '852931', + 'ext': 'mp4', + 'duration': 60, + 'age_limit': 18, + 'title': 'What A Feelin', + 'display_id': 'what-a-fellin', + }, + }, + ] -    def _perform_login(self, username, password): -        user_data = self._download_json( -            self._LOGIN_URL, -            None, -            note='Logging in', -            data=json.dumps( -                { -                    'login': username, -                    'password': password, -                }, -            ).encode(), -            headers={ -                'Content-Type': 'application/json', -            }, -        ) -        self._USERTOKEN = user_data['data']['access_token'] + def _perform_login(self, username, password): + user_data = self._download_json( + self._LOGIN_URL, + None, + note='Logging in', + data=json.dumps( + { + 'login': username, + 'password': password, + }, + ).encode(), + headers={ + 'Content-Type': 'application/json', + }, + ) + self._USERTOKEN = user_data['data']['access_token'] -    def _real_extract(self, url): -        mobj = self._match_valid_url(url) -        display_id = mobj.group('display_id') + def _real_extract(self, url): + mobj = self._match_valid_url(url) + display_id = mobj.group('display_id') -        webpage, _ = self._download_webpage_handle(url, display_id) + webpage, _ = self._download_webpage_handle(url, display_id) -        video_id = self._search_regex( -            r"shortlink.+href=[\'\"]https://vrporn\.com/\?p=([0-9]+)[\'\"]", -            webpage, -            'id', -        ) + video_id = self._search_regex( + r"shortlink.+href=[\'\"]https://vrporn\.com/\?p=([0-9]+)[\'\"]", + webpage, + 'id', + ) -        headers = { -            'Content-Type': 'application/json', -        } -        if self._USERTOKEN: -            headers.update( -                { -                    'Authorization': f'Bearer {self._USERTOKEN}', -                }, -            ) + headers = { + 'Content-Type': 'application/json', + } + if self._USERTOKEN: + headers.update( + { + 'Authorization': f'Bearer {self._USERTOKEN}', + }, + ) -        video_data = self._download_json( -            self._SINGLE_VIDEO_URL + video_id, -            None, -            query={'asd': 'asd'}, -            note='fetching formats', -            headers=headers, -        ) + video_data = self._download_json( + self._SINGLE_VIDEO_URL + video_id, + None, + query={'asd': 'asd'}, + note='fetching formats', + headers=headers, + ) -        title = video_data['data']['title'] + title = video_data['data']['title'] -        formats = [] + formats = [] -        duration = '' + duration = '' -        for detail in video_data['data']['details']: -            video_type = detail['type'] -            duration = detail['duration_seconds'] + for detail in video_data['data']['details']: + video_type = detail['type'] + duration = detail['duration_seconds'] -            for link in detail['links']: -                if link['is_download']: -                    formats.append( -                        { -                            'url': link['url'], -                            'format_id': f'{video_type}-{link["quality_name"]}-{link["stereo"]}-{link["projection"]}', -                            'quality': link['quality_name'], -                            'resolution': link['quality_name'], -                        }, -                    ) - -        return { -            'id': video_id, -            'display_id': display_id, -            'title': title, -            'duration': duration, -            'formats': formats, -            'age_limit': 18, -        } + for link in detail['links']: + if link['is_download']: + formats.append( + { + 'url': link['url'], + 'format_id': f'{video_type}-{link["quality_name"]}-{link["stereo"]}-{link["projection"]}', + 'quality': link['quality_name'], + 'resolution': link['quality_name'], + }, + ) + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'duration': duration, + 'formats': formats, + 'age_limit': 18, + }