diff --git a/yt_dlp/extractor/promodj.py b/yt_dlp/extractor/promodj.py index da1beb8b2b..f42d6ed2db 100644 --- a/yt_dlp/extractor/promodj.py +++ b/yt_dlp/extractor/promodj.py @@ -65,8 +65,8 @@ class PromoDJBaseIE(InfoExtractor): _PAGES = ['featured', 'shop', *_MEDIA_TYPES] _BASE_URL_RE = r'https?://(?:www\.)?promodj\.com' - _NOT_LOGIN_LIST = '|'.join(['radio', *_PAGES]) - _LOGIN_RE = rf'(?!{_NOT_LOGIN_LIST})[\w.-]+' + _NOT_LOGIN_LIST = '|'.join(['radio', 'embed', *_PAGES]) + _LOGIN_RE = rf'(?!(?:{_NOT_LOGIN_LIST})(?:/|$))[\w.-]+' def _set_url_page(self, url, page): parsed_url = urllib.parse.urlparse(url) @@ -247,6 +247,10 @@ class PromoDJUserIE(PromoDJBaseIE): 'id': 'slim96', }, 'playlist_count': 0, + }, { + # login starts with page name + 'url': 'https://promodj.com/radio.remix', + 'only_matching': True, }] def _real_extract(self, url): @@ -288,6 +292,10 @@ class PromoDJUserMediaIE(PromoDJBaseIE): 'id': 'worobyev-video', }, 'playlist_count': 0, + }, { + # login starts with page name + 'url': 'https://promodj.com/radio.remix/music', + 'only_matching': True, }] def _real_extract(self, url): @@ -378,15 +386,18 @@ class PromoDJUserPageIE(PromoDJBaseIE): *PromoDJBaseIE._MEDIA_TYPES, ] _NOT_USER_PAGE_LIST = '|'.join(_USER_PATHS) - _USER_PAGE_RE = rf'(?!{_NOT_USER_PAGE_LIST})[\w-]+' - _VALID_URL = rf'{PromoDJBaseIE._BASE_URL_RE}/(?P{PromoDJBaseIE._LOGIN_RE})/(?P{_USER_PAGE_RE})$' + _VALID_URL = rf'{PromoDJBaseIE._BASE_URL_RE}/(?P{PromoDJBaseIE._LOGIN_RE})/(?P(?!(?:{_NOT_USER_PAGE_LIST})$)[\w-]+$)' _TESTS = [{ 'url': 'https://promodj.com/djperetse/MaxMixes', 'info_dict': { 'id': 'djperetse-MaxMixes', }, 'playlist_count': 5, + }, { + # user page starts with media type (not a real link) + 'url': 'https://promodj.com/djperetse/remixes-best', + 'only_matching': True, }] def _real_extract(self, url):