- return {
- 'id': entry['id'],
- 'title': entry.get('title'),
- 'url': entry['fileUrl'],
- 'vcodec': 'none',
- 'release_timestamp': parse_iso8601(entry.get('episodeDate')),
- 'thumbnail': format_field(
- entry, [('featuredImage', 0, 'filename')], 'https://rinse.imgix.net/media/%s', default=None),
- }
+ return self._parse_entry(entry)
+
+
+class RinseFMArtistPlaylistIE(RinseFMBaseIE):
+ _VALID_URL = r'https?://(?:www\.)?rinse\.fm/shows/(?P<id>[^/?#]+)'
+ _TESTS = [{
+ 'url': 'https://rinse.fm/shows/resources/',
+ 'info_dict': {
+ 'id': 'resources',
+ 'title': '[re]sources',
+ 'description': '[re]sources est un label parisien piloté par le DJ et producteur Tommy Kid.'
+ },
+ 'playlist_mincount': 40
+ }, {
+ 'url': 'https://rinse.fm/shows/ivy/',
+ 'info_dict': {
+ 'id': 'ivy',
+ 'title': '[IVY]',
+ 'description': 'A dedicated space for DNB/Turbo House and 4x4.'
+ },
+ 'playlist_mincount': 7
+ }]
+
+ def _entries(self, data):
+ for episode in traverse_obj(data, (
+ 'props', 'pageProps', 'episodes', lambda _, v: determine_ext(v['fileUrl']) in MEDIA_EXTENSIONS.audio)
+ ):
+ yield self._parse_entry(episode)
+
+ def _real_extract(self, url):
+ playlist_id = self._match_id(url)
+ webpage = self._download_webpage(url, playlist_id)
+ title = self._og_search_title(webpage) or self._html_search_meta('title', webpage)
+ description = self._og_search_description(webpage) or self._html_search_meta(
+ 'description', webpage)
+ data = self._search_nextjs_data(webpage, playlist_id)
+
+ return self.playlist_result(
+ self._entries(data), playlist_id, title, description=description)