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

Code before:
            'episode': 'Golden Wind',
            'episode_number': 1,
            'episode_id': '9089',
            'view_count': int,
            'like_count': int,
            'repost_count': int,
            'thumbnail': 'https://static.vvvvid.it/img/thumbs/Dynit/Jojo/Jojo_S05Ep01-t.jpg',
            'season': 'Season 5',
            'season_number': 5,
        },
        'params': {
            'skip_download': True,
            'format': 'mp4',
        },
    }, {
        'url': 'https://www.vvvvid.it/show/434/perche-dovrei-guardarlo-di-dario-moccia/437/489048',
        'only_matching': True
    }]
    _conn_id = None
    _default_user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.50 Safari/537.37'

    @functools.cached_property
    def _headers(self):
        geo_verification_headers = self.geo_verification_headers()
        http_headers = self.get_param('http_headers', {})
        return {**http_headers, **geo_verification_headers, 'User-Agent': self._default_user_agent}

    def _real_initialize(self, *args, **kwargs):
        self._conn_id = self._download_json(
            'https://www.vvvvid.it/user/login',
            None, headers=self._headers)['data']['conn_id']

    def _download_info(self, show_id, path, video_id, fatal=True, query=None):
        q = {
            'conn_id': self._conn_id,
        }
        if query:
            q.update(query)
        response = self._download_json(
            'https://www.vvvvid.it/vvvvid/ondemand/%s/%s' % (show_id, path),
            video_id, headers=self._headers, query=q, fatal=fatal)
        if not (response or fatal):
            return
        if response.get('result') == 'error':
            raise ExtractorError('%s said: %s' % (
                self.IE_NAME, response['message']), expected=True)
        return response['data']

    def _extract_common_video_info(self, video_data):
        return {
            'thumbnail': video_data.get('thumbnail'),

Review comment (performance):
We don't need to do anything with the params headers here. The headers that we pass to the `_download_webpage`/`_download_json`/etc methods already update the params headers, they don't overwrite them.
```suggestion

    @functools.cached_property
    def _headers(self):
        return {
            **self.geo_verification_headers(),
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.50 Safari/537.37',
        }
```

Code after:
            'episode': 'Golden Wind',
            'episode_number': 1,
            'episode_id': '9089',
            'view_count': int,
            'like_count': int,
            'repost_count': int,
            'thumbnail': 'https://static.vvvvid.it/img/thumbs/Dynit/Jojo/Jojo_S05Ep01-t.jpg',
            'season': 'Season 5',
            'season_number': 5,
        },
        'params': {
            'skip_download': True,
            'format': 'mp4',
        },
    }, {
        'url': 'https://www.vvvvid.it/show/434/perche-dovrei-guardarlo-di-dario-moccia/437/489048',
        'only_matching': True
    }]
    _conn_id = None

    @functools.cached_property
    def _headers(self):
        return {
            **self.geo_verification_headers(),
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.50 Safari/537.37',
        }

    def _real_initialize(self):
        self._conn_id = self._download_json(
            'https://www.vvvvid.it/user/login',
            None, headers=self._headers)['data']['conn_id']

    def _download_info(self, show_id, path, video_id, fatal=True, query=None):
        q = {
            'conn_id': self._conn_id,
        }
        if query:
            q.update(query)
        response = self._download_json(
            'https://www.vvvvid.it/vvvvid/ondemand/%s/%s' % (show_id, path),
            video_id, headers=self._headers, query=q, fatal=fatal)
        if not (response or fatal):
            return
        if response.get('result') == 'error':
            raise ExtractorError('%s said: %s' % (
                self.IE_NAME, response['message']), expected=True)
        return response['data']

    def _extract_common_video_info(self, video_data):
        return {
            'thumbnail': video_data.get('thumbnail'),