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

Code before:
        'url': 'https://rutube.ru/video/private/884fb55f07a97ab673c7d654553e0f48/?p=x2QojCumHTS3rsKHWXN8Lg',
        'md5': 'd106225f15d625538fe22971158e896f',
        'info_dict': {
            'id': '884fb55f07a97ab673c7d654553e0f48',
            'ext': 'mp4',
            'title': 'Яцуноками, Nioh2',
            'description': 'Nioh2: финал сражения с боссом Яцуноками',
            'duration': 15,
            'uploader': 'mexus',
            'uploader_id': '24222106',
            'timestamp': 1670646232,
            'upload_date': '20221210',
            'age_limit': 0,
            'view_count': int,
            'thumbnail': 'http://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg',
            'category': ['Видеоигры'],
        },
    }]

    @classmethod
    def suitable(cls, url):
        return False if RutubePlaylistIE.suitable(url) else super(RutubeIE, cls).suitable(url)

    def _real_extract(self, url):
        video_id = self._match_id(url)
        secret = self._match_valid_url(url).group('secret')
        info = self._download_and_extract_info(video_id, secret=secret)
        info['formats'] = self._download_and_extract_formats(video_id, secret=secret)
        return info


class RutubeEmbedIE(RutubeBaseIE):
    IE_NAME = 'rutube:embed'
    IE_DESC = 'Rutube embedded videos'
    _VALID_URL = r'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)'

    _TESTS = [{
        'url': 'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=',
        'info_dict': {
            'id': 'a10e53b86e8f349080f718582ce4c661',
            'ext': 'mp4',
            'timestamp': 1387830582,
            'upload_date': '20131223',
            'uploader_id': '297833',
            'description': 'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix<br/><br/> восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89',
            'uploader': 'subziro89 ILya',
            'title': 'Мистический городок Эйри в Индиан 5 серия озвучка subziro89',
        },
        'params': {
            'skip_download': True,
        },

Review comment (security):
Isn't it better to pass on all query?
```suggestion
        query = parse_qs(url)
```
or atleast, parse the secret like this - I see no reason to parse it with regex
```suggestion
        query = {'p': parse_qs(url).get('p')}
```
(`from utils import parse_qs`)

Code after:
            'uploader': 'mexus',
            'uploader_id': '24222106',
            'timestamp': 1670646232,
            'upload_date': '20221210',
            'age_limit': 0,
            'view_count': int,
            'thumbnail': 'http://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpg',
            'category': ['Видеоигры'],
        },
    }]

    @classmethod
    def suitable(cls, url):
        return False if RutubePlaylistIE.suitable(url) else super(RutubeIE, cls).suitable(url)

    def _real_extract(self, url):
        video_id = self._match_id(url)
        query = parse_qs(url)
        info = self._download_and_extract_info(video_id, query)
        info['formats'] = self._download_and_extract_formats(video_id, query)
        return info


class RutubeEmbedIE(RutubeBaseIE):
    IE_NAME = 'rutube:embed'
    IE_DESC = 'Rutube embedded videos'
    _VALID_URL = r'https?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)'

    _TESTS = [{
        'url': 'http://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38=',
        'info_dict': {
            'id': 'a10e53b86e8f349080f718582ce4c661',
            'ext': 'mp4',
            'timestamp': 1387830582,
            'upload_date': '20131223',
            'uploader_id': '297833',
            'description': 'Видео группы ★http://vk.com/foxkidsreset★ музей Fox Kids и Jetix<br/><br/> восстановлено и сделано в шикоформате subziro89 http://vk.com/subziro89',
            'uploader': 'subziro89 ILya',
            'title': 'Мистический городок Эйри в Индиан 5 серия озвучка subziro89',
        },
        'params': {
            'skip_download': True,
        },
    }, {
        'url': 'http://rutube.ru/play/embed/8083783',
        'only_matching': True,
    }, {
        # private video
        'url': 'https://rutube.ru/play/embed/10631925?p=IbAigKqWd1do4mjaM5XLIQ',
        'only_matching': True,
    }]