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

Code before:
        location = None
        series = None
        season_number = None
        # The following can be uncommented as soon as #7838 is merged:
        # media_type = None
        categories = []
        categories_data = info.get('categories') or []
        for x in categories_data:
            if x.get('name') is not None:
                # Sometimes, there will be several kinds of categories
                # in this case, it will have a label field with a value 'category'
                if (x.get('label') is None) or (x.get('label') == 'category'):
                    categories.append(x.get('name'))

        # A number of sites have a prefix in front of some info keys followed by a '$' symbol.
        # Search for known keys with the prefix.
        for key in info.keys():
            if re.match('.*\\$region', key):
                location = info[key]
            if re.match('.*\\$show', key):
                series = info[key]
            if re.match('.*\\$seasonNumber', key):
                season_number = str_to_int(info[key])
            # the following can be uncommented as soon as #7838 is merged:
            # if (re.match('.*\programmingType', key)) or (re.match('.*\type', key)):
                # media_type = info[key]

        return {
            'title': info['title'],
            'subtitles': subtitles,
            'description': info['description'],
            'thumbnail': info['defaultThumbnailUrl'],
            'duration': float_or_none(duration, 1000),
            'timestamp': int_or_none(info.get('pubDate'), 1000) or None,
            'uploader': info.get('billingCode'),
            'chapters': chapters,
            'creator': info.get('author', {str_or_none}) if info.get('author', {str_or_none}) != '' else None,
            'categories': categories if len(categories) != 0 else None,
            'tags': tags if len(tags) != 0 else None,
            'location': str_or_none(location) if location != '' else None,
            'series': str_or_none(series) if series != '' else None,
            'season_number': int_or_none(season_number),
            # The following can be uncommented as soon as #7838 is merged and the matching line above is uncommented
            # 'media_type': media_type
        }

    def _extract_theplatform_metadata(self, path, video_id):
        info = self._download_theplatform_metadata(path, video_id)
        return self._parse_theplatform_metadata(info)



Review comment (suggestion):
#7838 was merged already without adding the `media_type` field -- feel free to propose its addition in this PR

Code after:
            'title': info['title'],
            'subtitles': subtitles,
            'description': info['description'],
            'thumbnail': info['defaultThumbnailUrl'],
            'duration': float_or_none(duration, 1000),
            'timestamp': int_or_none(info.get('pubDate'), 1000) or None,
            'uploader': info.get('billingCode'),
            'chapters': chapters,
            'creator': traverse_obj(info, ('author', {str})) or None,
            'categories': traverse_obj(info, (
                'categories', lambda _, v: v.get('label') in ('category', None), 'name', {str})) or None,
            'tags': traverse_obj(info, ('keywords', {lambda x: re.split(r'[;,]\s?', x) if x else None})),
            'location': extract_site_specific_field('region'),
            'series': extract_site_specific_field('show'),
            'season_number': int_or_none(extract_site_specific_field('seasonNumber')),
            'media_type': extract_site_specific_field('programmingType') or extract_site_specific_field('type'),
        }

    def _extract_theplatform_metadata(self, path, video_id):
        info = self._download_theplatform_metadata(path, video_id)
        return self._parse_theplatform_metadata(info)


class ThePlatformIE(ThePlatformBaseIE, AdobePassIE):
    _VALID_URL = r'''(?x)
        (?:https?://(?:link|player)\.theplatform\.com/[sp]/(?P<provider_id>[^/]+)/
           (?:(?:(?:[^/]+/)+select/)?(?P<media>media/(?:guid/\d+/)?)?|(?P<config>(?:[^/\?]+/(?:swf|config)|onsite)/select/))?
         |theplatform:)(?P<id>[^/\?&]+)'''
    _EMBED_REGEX = [
        r'''(?x)
            <meta\s+
                property=(["'])(?:og:video(?::(?:secure_)?url)?|twitter:player)\1\s+
                content=(["'])(?P<url>https?://player\.theplatform\.com/p/.+?)\2''',
        r'(?s)<(?:iframe|script)[^>]+src=(["\'])(?P<url>(?:https?:)?//player\.theplatform\.com/p/.+?)\1'
    ]

    _TESTS = [{
        # from http://www.metacafe.com/watch/cb-e9I_cZgTgIPd/blackberrys_big_bold_z30/
        'url': 'http://link.theplatform.com/s/dJ5BDC/e9I_cZgTgIPd/meta.smil?format=smil&Tracking=true&mbr=true',
        'info_dict': {
            'id': 'e9I_cZgTgIPd',
            'ext': 'flv',
            'title': 'Blackberry\'s big, bold Z30',
            'description': 'The Z30 is Blackberry\'s biggest, baddest mobile messaging device yet.',
            'duration': 247,
            'timestamp': 1383239700,
            'upload_date': '20131031',
            'uploader': 'CBSI-NEW',
        },
        'params': {
            # rtmp download