[soundcloud] Generalize playlist entries extraction (#10733)
This commit is contained in:
		| @@ -260,7 +260,20 @@ class SoundcloudIE(InfoExtractor): | ||||
|         return self._extract_info_dict(info, full_title, secret_token=token) | ||||
|  | ||||
|  | ||||
| class SoundcloudSetIE(SoundcloudIE): | ||||
| class SoundcloudBaseIE(SoundcloudIE): | ||||
|     @staticmethod | ||||
|     def _extract_id(e): | ||||
|         return compat_str(e['id']) if e.get('id') else None | ||||
|  | ||||
|     def _extract_track_entries(self, tracks): | ||||
|         return [ | ||||
|             self.url_result( | ||||
|                 track['permalink_url'], SoundcloudIE.ie_key(), | ||||
|                 video_id=self._extract_id(track)) | ||||
|             for track in tracks if track.get('permalink_url')] | ||||
|  | ||||
|  | ||||
| class SoundcloudSetIE(SoundcloudBaseIE): | ||||
|     _VALID_URL = r'https?://(?:(?:www|m)\.)?soundcloud\.com/(?P<uploader>[\w\d-]+)/sets/(?P<slug_title>[\w\d-]+)(?:/(?P<token>[^?/]+))?' | ||||
|     IE_NAME = 'soundcloud:set' | ||||
|     _TESTS = [{ | ||||
| @@ -299,7 +312,7 @@ class SoundcloudSetIE(SoundcloudIE): | ||||
|             msgs = (compat_str(err['error_message']) for err in info['errors']) | ||||
|             raise ExtractorError('unable to download video webpage: %s' % ','.join(msgs)) | ||||
|  | ||||
|         entries = [self.url_result(track['permalink_url'], 'Soundcloud') for track in info['tracks']] | ||||
|         entries = self._extract_track_entries(info['tracks']) | ||||
|  | ||||
|         return { | ||||
|             '_type': 'playlist', | ||||
| @@ -309,7 +322,7 @@ class SoundcloudSetIE(SoundcloudIE): | ||||
|         } | ||||
|  | ||||
|  | ||||
| class SoundcloudUserIE(SoundcloudIE): | ||||
| class SoundcloudUserIE(SoundcloudBaseIE): | ||||
|     _VALID_URL = r'''(?x) | ||||
|                         https?:// | ||||
|                             (?:(?:www|m)\.)?soundcloud\.com/ | ||||
| @@ -326,21 +339,21 @@ class SoundcloudUserIE(SoundcloudIE): | ||||
|             'id': '114582580', | ||||
|             'title': 'The Akashic Chronicler (All)', | ||||
|         }, | ||||
|         'playlist_mincount': 111, | ||||
|         'playlist_mincount': 74, | ||||
|     }, { | ||||
|         'url': 'https://soundcloud.com/the-akashic-chronicler/tracks', | ||||
|         'info_dict': { | ||||
|             'id': '114582580', | ||||
|             'title': 'The Akashic Chronicler (Tracks)', | ||||
|         }, | ||||
|         'playlist_mincount': 50, | ||||
|         'playlist_mincount': 37, | ||||
|     }, { | ||||
|         'url': 'https://soundcloud.com/the-akashic-chronicler/sets', | ||||
|         'info_dict': { | ||||
|             'id': '114582580', | ||||
|             'title': 'The Akashic Chronicler (Playlists)', | ||||
|         }, | ||||
|         'playlist_mincount': 3, | ||||
|         'playlist_mincount': 2, | ||||
|     }, { | ||||
|         'url': 'https://soundcloud.com/the-akashic-chronicler/reposts', | ||||
|         'info_dict': { | ||||
| @@ -359,7 +372,7 @@ class SoundcloudUserIE(SoundcloudIE): | ||||
|         'url': 'https://soundcloud.com/grynpyret/spotlight', | ||||
|         'info_dict': { | ||||
|             'id': '7098329', | ||||
|             'title': 'Grynpyret (Spotlight)', | ||||
|             'title': 'GRYNPYRET (Spotlight)', | ||||
|         }, | ||||
|         'playlist_mincount': 1, | ||||
|     }] | ||||
| @@ -421,13 +434,14 @@ class SoundcloudUserIE(SoundcloudIE): | ||||
|                 for cand in candidates: | ||||
|                     if isinstance(cand, dict): | ||||
|                         permalink_url = cand.get('permalink_url') | ||||
|                         entry_id = self._extract_id(cand) | ||||
|                         if permalink_url and permalink_url.startswith('http'): | ||||
|                             return permalink_url | ||||
|                             return permalink_url, entry_id | ||||
|  | ||||
|             for e in collection: | ||||
|                 permalink_url = resolve_permalink_url((e, e.get('track'), e.get('playlist'))) | ||||
|                 permalink_url, entry_id = resolve_permalink_url((e, e.get('track'), e.get('playlist'))) | ||||
|                 if permalink_url: | ||||
|                     entries.append(self.url_result(permalink_url)) | ||||
|                     entries.append(self.url_result(permalink_url, video_id=entry_id)) | ||||
|  | ||||
|             next_href = response.get('next_href') | ||||
|             if not next_href: | ||||
| @@ -447,7 +461,7 @@ class SoundcloudUserIE(SoundcloudIE): | ||||
|         } | ||||
|  | ||||
|  | ||||
| class SoundcloudPlaylistIE(SoundcloudIE): | ||||
| class SoundcloudPlaylistIE(SoundcloudBaseIE): | ||||
|     _VALID_URL = r'https?://api\.soundcloud\.com/playlists/(?P<id>[0-9]+)(?:/?\?secret_token=(?P<token>[^&]+?))?$' | ||||
|     IE_NAME = 'soundcloud:playlist' | ||||
|     _TESTS = [{ | ||||
| @@ -477,11 +491,7 @@ class SoundcloudPlaylistIE(SoundcloudIE): | ||||
|         data = self._download_json( | ||||
|             base_url + data, playlist_id, 'Downloading playlist') | ||||
|  | ||||
|         entries = [ | ||||
|             self.url_result( | ||||
|                 track['permalink_url'], SoundcloudIE.ie_key(), | ||||
|                 video_id=compat_str(track['id']) if track.get('id') else None) | ||||
|             for track in data['tracks'] if track.get('permalink_url')] | ||||
|         entries = self._extract_track_entries(data['tracks']) | ||||
|  | ||||
|         return { | ||||
|             '_type': 'playlist', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user