Repository: yt-dlp/yt-dlp
File: yt_dlp/extractor/idagio.py (Python)

Code before:
        'url': 'https://app.idagio.com/albums/brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
        'info_dict': {
            'id': '2862ad4e-4a61-45ad-9ce4-7fcf0c2626fe',
            'display_id': 'brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
            'title': 'Brahms: Ein deutsches Requiem',
            'description': '',
            'thumbnail': 'https://idagio-images.global.ssl.fastly.net/albums/3149020954522/main.jpg',
            'tags': ['recent-release'],
            'artists': ['Sabine Devieilhe', 'Stéphane Degout', 'Raphaël Pichon', 'Pygmalion', 'Johannes Brahms'],
            'timestamp': 1760054400,
            'upload_date': '20251010',
            'modified_timestamp': 1760101611,
            'modified_date': '20251010',
        },
        'playlist_count': 7,
    }]

    def _real_extract(self, url):
        album_display_id = self._match_id(url)
        album_info = self._download_json(f'https://api.idagio.com/v2.0/metadata/albums/{album_display_id}',
                                         album_display_id)['result']

        def construct_track_url(track_id, recording_id):
            return self.url_result(
                f'https://app.idagio.com/recordings/{recording_id}?trackId={track_id}',
                ie=IdagioTrackIE, video_id=track_id)

        return {
            '_type': 'playlist',
            'display_id': album_display_id,
            **traverse_obj(album_info, {
                'entries': ('tracks', ..., {
                    'track_id': ('id', {int}),
                    'recording_id': ('recording', 'id', {int}),
                }, {lambda ids: construct_track_url(**ids)}),
                'id': ('id', {str}),
                'title': ('title', {str}),
                'timestamp': ('publishDate', {unified_timestamp}),
                'modified_timestamp': ('lastModified', {unified_timestamp}),
                'thumbnail': ('imageUrl', {url_or_none}),
                'description': ('description', {str}),
                'artists': ('participants', ..., 'name', {str}, all),
                'tags': ('tags', ..., {str}),
            }),
        }


class IdagioPlaylistIE(InfoExtractor):
    _VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/playlists/(?!personal/)(?P<id>[\w-]+)'
    _TESTS = [{
        'url': 'https://app.idagio.com/playlists/beethoven-the-most-beautiful-piano-music',

Review comment (refactor):
this is duplicated in each of the playlist extractors

have you considered a baseclass? and each subclass could just define a `_extract_playlist_metadata` method

Code after:
        'url': 'https://app.idagio.com/albums/elgar-enigma-variations-in-the-south-serenade-for-strings',
        'info_dict': {
            'id': 'a9f139b8-f70d-4b8a-a9a4-5fe8d35eaf9c',
            'display_id': 'elgar-enigma-variations-in-the-south-serenade-for-strings',
            'title': 'Elgar: Enigma Variations, In the South, Serenade for Strings',
            'description': '',
            'thumbnail': 'https://idagio-images.global.ssl.fastly.net/albums/880040420521/main.jpg',
            'artists': ['Vasily Petrenko', 'Royal Liverpool Philharmonic Orchestra', 'Edward Elgar'],
            'timestamp': 1553817600,
            'upload_date': '20190329',
            'modified_timestamp': 1562566559.0,
            'modified_date': '20190708',
        },
        'playlist_count': 19,
    }, {
        'url': 'https://app.idagio.com/albums/brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
        'info_dict': {
            'id': '2862ad4e-4a61-45ad-9ce4-7fcf0c2626fe',
            'display_id': 'brahms-ein-deutsches-requiem-3B403DF6-62D7-4A42-807B-47173F3E0192',
            'title': 'Brahms: Ein deutsches Requiem',
            'description': '',
            'thumbnail': 'https://idagio-images.global.ssl.fastly.net/albums/3149020954522/main.jpg',
            'tags': ['recent-release'],
            'artists': ['Sabine Devieilhe', 'Stéphane Degout', 'Raphaël Pichon', 'Pygmalion', 'Johannes Brahms'],
            'timestamp': 1760054400,
            'upload_date': '20251010',
            'modified_timestamp': 1760101611,
            'modified_date': '20251010',
        },
        'playlist_count': 7,
    }]
    _API_URL_TMPL = 'https://api.idagio.com/v2.0/metadata/albums/{}'
    _PLAYLIST_ID_KEY = 'display_id'

    def _parse_playlist_metadata(self, playlist_info):
        return traverse_obj(playlist_info, {
            'id': ('id', {str}),
            'title': ('title', {str}),
            'timestamp': ('publishDate', {unified_timestamp}),
            'modified_timestamp': ('lastModified', {unified_timestamp}),
            'thumbnail': ('imageUrl', {url_or_none}),
            'description': ('description', {str}),
            'artists': ('participants', ..., 'name', {str}),
            'tags': ('tags', ..., {str}),
        })


class IdagioPlaylistIE(IdagioPlaylistBaseIE):
    _VALID_URL = r'https?://(?:www\.)?app\.idagio\.com/playlists/(?!personal/)(?P<id>[\w-]+)'
    _TESTS = [{
        'url': 'https://app.idagio.com/playlists/beethoven-the-most-beautiful-piano-music',