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

Code before:
                'episode_number': ('episode', {int_or_none}),
                'timestamp': ('uploadTime', {int_or_none}),
                'release_date': ('telecastDate', {str}),
                'age_limit': ('ageNemonic', {parse_age_limit}),
                'duration': ('duration', {float_or_none}),
                'genres': ('genres', ..., {str}),
                'thumbnail': ('seo', 'ogImage', {url_or_none}),
            })),
        }


class JioCinemaSeriesIE(JioCinemaBaseIE):
    IE_NAME = 'jiocinema:series'
    _VALID_URL = r'https?://(?:www\.)?jiocinema\.com/tv-shows/(?P<slug>[\w-]+)/(?P<id>\d{3,})'
    _TESTS = [{
        'url': 'https://www.jiocinema.com/tv-shows/naagin/3499917',
        'info_dict': {
            'id': '3499917',
            'title': 'naagin',
        },
        'playlist_mincount': 120,
    }, {
        'url': 'https://www.jiocinema.com/tv-shows/mtv-splitsvilla-x5/3499820',
        'info_dict': {
            'id': '3499820',
            'title': 'MTV Splitsvilla X5',
        },
        'playlist_mincount': 310,
    }]

    def _entries(self, series_id):
        seasons = traverse_obj(self._download_json(
            f'{self._METADATA_API_BASE}/voot/v1/voot-web/view/show/{series_id}', series_id,
            'Downloading series metadata JSON', query={'responseType': 'common'}), (
            'trays', lambda _, v: v['trayId'] == 'season-by-show-multifilter',
            'trayTabs', lambda _, v: v['id']))

        for season_num, season in enumerate(seasons, start=1):
            season_id = season['id']
            label = season.get('label') or season_num
            for page_num in itertools.count(1):
                episodes = traverse_obj(self._download_json(
                    f'{self._METADATA_API_BASE}/voot/v1/voot-web/content/generic/series-wise-episode',
                    season_id, f'Downloading season {label} page {page_num} JSON', query={
                        'sort': 'episode:asc',
                        'id': season_id,
                        'responseType': 'common',
                        'page': page_num,
                    }), ('result', lambda _, v: v['id'] and url_or_none(v['slug'])))
                if not episodes:
                    break

Review comment (suggestion):
```suggestion
            'title': 'mtv-splitsvilla-x5',
```

Code after:
                'episode_number': ('episode', {int_or_none}),
                'timestamp': ('uploadTime', {int_or_none}),
                'release_date': ('telecastDate', {str}),
                'age_limit': ('ageNemonic', {parse_age_limit}),
                'duration': ('duration', {float_or_none}),
                'genres': ('genres', ..., {str}),
                'thumbnail': ('seo', 'ogImage', {url_or_none}),
            })),
        }


class JioCinemaSeriesIE(JioCinemaBaseIE):
    IE_NAME = 'jiocinema:series'
    _VALID_URL = r'https?://(?:www\.)?jiocinema\.com/tv-shows/(?P<slug>[\w-]+)/(?P<id>\d{3,})'
    _TESTS = [{
        'url': 'https://www.jiocinema.com/tv-shows/naagin/3499917',
        'info_dict': {
            'id': '3499917',
            'title': 'naagin',
        },
        'playlist_mincount': 120,
    }, {
        'url': 'https://www.jiocinema.com/tv-shows/mtv-splitsvilla-x5/3499820',
        'info_dict': {
            'id': '3499820',
            'title': 'mtv-splitsvilla-x5',
        },
        'playlist_mincount': 310,
    }]

    def _entries(self, series_id):
        seasons = traverse_obj(self._download_json(
            f'{self._METADATA_API_BASE}/voot/v1/voot-web/view/show/{series_id}', series_id,
            'Downloading series metadata JSON', query={'responseType': 'common'}), (
            'trays', lambda _, v: v['trayId'] == 'season-by-show-multifilter',
            'trayTabs', lambda _, v: v['id']))

        for season_num, season in enumerate(seasons, start=1):
            season_id = season['id']
            label = season.get('label') or season_num
            for page_num in itertools.count(1):
                episodes = traverse_obj(self._download_json(
                    f'{self._METADATA_API_BASE}/voot/v1/voot-web/content/generic/series-wise-episode',
                    season_id, f'Downloading season {label} page {page_num} JSON', query={
                        'sort': 'episode:asc',
                        'id': season_id,
                        'responseType': 'common',
                        'page': page_num,
                    }), ('result', lambda _, v: v['id'] and url_or_none(v['slug'])))
                if not episodes:
                    break