From ccf5bad2dfe21b6afb490ba52f7160d689851540 Mon Sep 17 00:00:00 2001 From: RjY Date: Mon, 13 Mar 2023 23:23:56 +0000 Subject: [PATCH 1/5] [extractor/discogs] Add extractor --- yt_dlp/extractor/_extractors.py | 1 + yt_dlp/extractor/discogs.py | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 yt_dlp/extractor/discogs.py diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py index 69464b6f002..fcfce7f2895 100644 --- a/yt_dlp/extractor/_extractors.py +++ b/yt_dlp/extractor/_extractors.py @@ -499,6 +499,7 @@ DeuxMNewsIE ) from .digitalconcerthall import DigitalConcertHallIE +from .discogs import DiscogsReleasePlaylistIE from .discovery import DiscoveryIE from .disney import DisneyIE from .dispeak import DigitallySpeakingIE diff --git a/yt_dlp/extractor/discogs.py b/yt_dlp/extractor/discogs.py new file mode 100644 index 00000000000..2117072ea77 --- /dev/null +++ b/yt_dlp/extractor/discogs.py @@ -0,0 +1,36 @@ +from .common import InfoExtractor + + +class DiscogsReleasePlaylistIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?discogs\.com/(?P(release|master))/(?P\d+)' + _TESTS = [{ + 'url': 'https://www.discogs.com/release/1-The-Persuader-Stockholm', + 'info_dict': { + 'id': 'release1', + 'title': 'Stockholm', + }, + 'playlist_mincount': 7, + }, { + 'url': 'https://www.discogs.com/master/113-Vince-Watson-Moments-In-Time', + 'info_dict': { + 'id': 'master113', + 'title': 'Moments In Time', + }, + 'playlist_mincount': 53, + }] + + def _real_extract(self, url): + mobj = self._match_valid_url(url) + playlist_id, playlist_type = mobj.group('id', 'type') + + api = f'https://api.discogs.com/{playlist_type}s/{playlist_id}' + display_id = f'{playlist_type}{playlist_id}' + response = self._download_json(api, display_id) + + playlist_title = response.get('title') + entries = [ + self.url_result(video.get('uri'), video_title=video.get('title')) + for video in response.get('videos') + ] + + return self.playlist_result(entries, display_id, playlist_title) From 841200418338d2fe96e553b16818ee0d392bd010 Mon Sep 17 00:00:00 2001 From: bashonly <88596187+bashonly@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:37:56 +0000 Subject: [PATCH 2/5] Apply suggestions from code review --- yt_dlp/extractor/discogs.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/yt_dlp/extractor/discogs.py b/yt_dlp/extractor/discogs.py index 2117072ea77..9c7066c397f 100644 --- a/yt_dlp/extractor/discogs.py +++ b/yt_dlp/extractor/discogs.py @@ -20,17 +20,14 @@ class DiscogsReleasePlaylistIE(InfoExtractor): }] def _real_extract(self, url): - mobj = self._match_valid_url(url) - playlist_id, playlist_type = mobj.group('id', 'type') + playlist_id, playlist_type = self._match_valid_url(url).group('id', 'type') - api = f'https://api.discogs.com/{playlist_type}s/{playlist_id}' display_id = f'{playlist_type}{playlist_id}' - response = self._download_json(api, display_id) + response = self._download_json( + f'https://api.discogs.com/{playlist_type}s/{playlist_id}', display_id) - playlist_title = response.get('title') entries = [ - self.url_result(video.get('uri'), video_title=video.get('title')) - for video in response.get('videos') - ] + self.url_result(video['uri'], video_title=video.get('title')) + for video in traverse_obj(response, ('videos', lambda _, v: v['uri']))] - return self.playlist_result(entries, display_id, playlist_title) + return self.playlist_result(entries, display_id, response.get('title')) From b50e40577515f043abbe907b04d6a81979bb54a6 Mon Sep 17 00:00:00 2001 From: bashonly <88596187+bashonly@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:42:09 +0000 Subject: [PATCH 3/5] Fix imports --- yt_dlp/extractor/discogs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/yt_dlp/extractor/discogs.py b/yt_dlp/extractor/discogs.py index 9c7066c397f..60ea6b486c9 100644 --- a/yt_dlp/extractor/discogs.py +++ b/yt_dlp/extractor/discogs.py @@ -1,4 +1,5 @@ from .common import InfoExtractor +from ..utils import traverse_obj class DiscogsReleasePlaylistIE(InfoExtractor): From 30d647265a0930ada06d99126fa072bf083c53cc Mon Sep 17 00:00:00 2001 From: bashonly <88596187+bashonly@users.noreply.github.com> Date: Wed, 14 Jun 2023 11:51:56 +0000 Subject: [PATCH 4/5] Apply suggestions from code review --- yt_dlp/extractor/discogs.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/yt_dlp/extractor/discogs.py b/yt_dlp/extractor/discogs.py index 60ea6b486c9..ccfb4864e39 100644 --- a/yt_dlp/extractor/discogs.py +++ b/yt_dlp/extractor/discogs.py @@ -1,4 +1,5 @@ from .common import InfoExtractor +from .youtube import YoutubeIE from ..utils import traverse_obj @@ -28,7 +29,7 @@ def _real_extract(self, url): f'https://api.discogs.com/{playlist_type}s/{playlist_id}', display_id) entries = [ - self.url_result(video['uri'], video_title=video.get('title')) - for video in traverse_obj(response, ('videos', lambda _, v: v['uri']))] + self.url_result(video['uri'], YoutubeIE, video_title=video.get('title')) + for video in traverse_obj(response, ('videos', lambda _, v: YoutubeIE.suitable(v['uri'])))] return self.playlist_result(entries, display_id, response.get('title')) From 94f30991da7e9425b935e8db0cd2a4b21554abb1 Mon Sep 17 00:00:00 2001 From: bashonly <88596187+bashonly@users.noreply.github.com> Date: Wed, 14 Jun 2023 18:23:19 +0000 Subject: [PATCH 5/5] Cleanup `_VALID_URL` regex Co-authored-by: pukkandan --- yt_dlp/extractor/discogs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yt_dlp/extractor/discogs.py b/yt_dlp/extractor/discogs.py index ccfb4864e39..048c62288ca 100644 --- a/yt_dlp/extractor/discogs.py +++ b/yt_dlp/extractor/discogs.py @@ -4,7 +4,7 @@ class DiscogsReleasePlaylistIE(InfoExtractor): - _VALID_URL = r'https?://(?:www\.)?discogs\.com/(?P(release|master))/(?P\d+)' + _VALID_URL = r'https?://(?:www\.)?discogs\.com/(?Prelease|master)/(?P\d+)' _TESTS = [{ 'url': 'https://www.discogs.com/release/1-The-Persuader-Stockholm', 'info_dict': {