We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Quickies on Xvideos
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\* field

### Checklist

- [X] I'm requesting a site-specific feature
- [X] I've verified that I'm running yt-dlp version **2023.02.17** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details
- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates
- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)
- [ ] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required

### Region

Worldwide

### Example URLs

https://www.xvideos.com/profiles/firolix#quickies/a/51392867
https://www.xvideos.com/profiles/firolix#quickies/a/63386619

### Provide a description that is worded well enough to be understood

Quickies, the version of shorts on Xvideos, aren't currently downloadable. Can you add support for them?

### Provide verbose output that clearly demonstrates the problem

- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)
- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below

### Complete Verbose Output

```shell
[debug] Command-line config: ['-vU', '-f', 'mp4', 'https://www.xvideos.com/profiles/firolix#quickies/a/51392867']
[debug] User config "C:\Users\Noah Bangs\yt-dlp.conf": ['-o', 'H:\\youtube-dl\\Export\\%(webpage_url_domain)s\\%(title)s - %(channel,artist - album)s.%(ext)s', '--retries', 'infinite', '--download-archive', 'registry.txt']
[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2023.02.17 [a0a7c01] (win_exe)
[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1k  25 Mar 2021)
[debug] exe versions: ffmpeg git-2020-04-03-52523b6, ffprobe git-2020-04-03-52523b6
[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4
[debug] Proxy map: {}
[debug] Loaded 1782 extractors
[debug] Loading archive file 'registry.txt'
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2023.02.17, Current version: 2023.02.17
yt-dlp is up to date (2023.02.17)
[generic] Extracting URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867
[generic] 51392867: Downloading webpage
WARNING: [generic] Falling back on generic information extractor
[generic] 51392867: Extracting information
[debug] Looking for embeds
ERROR: Unsupported URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867
Traceback (most recent call last):
  File "yt_dlp\YoutubeDL.py", line 1502, in wrapper
  File "yt_dlp\YoutubeDL.py", line 1578, in __extract_info
  File "yt_dlp\extractor\common.py", line 693, in extract
  File "yt_dlp\extractor\generic.py", line 2509, in _real_extract
yt_dlp.utils.UnsupportedError: Unsupported URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867
```


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `yt_dlp/extractor/xvideos.py`
Content:
```
1 import re
2 
3 from .common import InfoExtractor
4 from ..compat import compat_urllib_parse_unquote
5 from ..utils import (
6     clean_html,
7     determine_ext,
8     ExtractorError,
9     int_or_none,
10     parse_duration,
11 )
12 
13 
14 class XVideosIE(InfoExtractor):
15     _VALID_URL = r'''(?x)
16                     https?://
17                         (?:
18                             (?:[^/]+\.)?xvideos2?\.com/video\.?|
19                             (?:www\.)?xvideos\.es/video\.?|
20                             (?:www|flashservice)\.xvideos\.com/embedframe/|
21                             static-hw\.xvideos\.com/swf/xv-player\.swf\?.*?\bid_video=
22                         )
23                         (?P<id>[0-9a-z]+)
24                     '''
25     _TESTS = [{
26         'url': 'http://xvideos.com/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',
27         'md5': '396255a900a6bddb3e98985f0b86c3fd',
28         'info_dict': {
29             'id': 'ucuvbkfda4e',
30             'ext': 'mp4',
31             'title': 'A Beautiful Red-Haired Stranger Was Refused, But Still Came To My Room For Sex',
32             'duration': 1238,
33             'age_limit': 18,
34             'thumbnail': r're:^https://cdn\d+-pic.xvideos-cdn.com/.+\.jpg',
35         }
36     }, {
37         # Broken HLS formats
38         'url': 'https://www.xvideos.com/video65982001/what_s_her_name',
39         'md5': '56742808292c8fa1418e4538c262c58b',
40         'info_dict': {
41             'id': '65982001',
42             'ext': 'mp4',
43             'title': 'what\'s her name?',
44             'duration': 120,
45             'age_limit': 18,
46             'thumbnail': r're:^https://cdn\d+-pic.xvideos-cdn.com/.+\.jpg',
47         }
48     }, {
49         'url': 'https://flashservice.xvideos.com/embedframe/4588838',
50         'only_matching': True,
51     }, {
52         'url': 'https://www.xvideos.com/embedframe/4588838',
53         'only_matching': True,
54     }, {
55         'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=4588838',
56         'only_matching': True,
57     }, {
58         'url': 'http://xvideos.com/video4588838/biker_takes_his_girl',
59         'only_matching': True
60     }, {
61         'url': 'https://xvideos.com/video4588838/biker_takes_his_girl',
62         'only_matching': True
63     }, {
64         'url': 'https://xvideos.es/video4588838/biker_takes_his_girl',
65         'only_matching': True
66     }, {
67         'url': 'https://www.xvideos.es/video4588838/biker_takes_his_girl',
68         'only_matching': True
69     }, {
70         'url': 'http://xvideos.es/video4588838/biker_takes_his_girl',
71         'only_matching': True
72     }, {
73         'url': 'http://www.xvideos.es/video4588838/biker_takes_his_girl',
74         'only_matching': True
75     }, {
76         'url': 'http://fr.xvideos.com/video4588838/biker_takes_his_girl',
77         'only_matching': True
78     }, {
79         'url': 'https://fr.xvideos.com/video4588838/biker_takes_his_girl',
80         'only_matching': True
81     }, {
82         'url': 'http://it.xvideos.com/video4588838/biker_takes_his_girl',
83         'only_matching': True
84     }, {
85         'url': 'https://it.xvideos.com/video4588838/biker_takes_his_girl',
86         'only_matching': True
87     }, {
88         'url': 'http://de.xvideos.com/video4588838/biker_takes_his_girl',
89         'only_matching': True
90     }, {
91         'url': 'https://de.xvideos.com/video4588838/biker_takes_his_girl',
92         'only_matching': True
93     }, {
94         'url': 'https://flashservice.xvideos.com/embedframe/ucuvbkfda4e',
95         'only_matching': True,
96     }, {
97         'url': 'https://www.xvideos.com/embedframe/ucuvbkfda4e',
98         'only_matching': True,
99     }, {
100         'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=ucuvbkfda4e',
101         'only_matching': True,
102     }, {
103         'url': 'https://xvideos.es/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',
104         'only_matching': True
105     }]
106 
107     def _real_extract(self, url):
108         video_id = self._match_id(url)
109         webpage = self._download_webpage(url, video_id)
110 
111         mobj = re.search(r'<h1 class="inlineError">(.+?)</h1>', webpage)
112         if mobj:
113             raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True)
114 
115         title = self._html_search_regex(
116             (r'<title>(?P<title>.+?)\s+-\s+XVID',
117              r'setVideoTitle\s*\(\s*(["\'])(?P<title>(?:(?!\1).)+)\1'),
118             webpage, 'title', default=None,
119             group='title') or self._og_search_title(webpage)
120 
121         thumbnails = []
122         for preference, thumbnail in enumerate(('', '169')):
123             thumbnail_url = self._search_regex(
124                 r'setThumbUrl%s\(\s*(["\'])(?P<thumbnail>(?:(?!\1).)+)\1' % thumbnail,
125                 webpage, 'thumbnail', default=None, group='thumbnail')
126             if thumbnail_url:
127                 thumbnails.append({
128                     'url': thumbnail_url,
129                     'preference': preference,
130                 })
131 
132         duration = int_or_none(self._og_search_property(
133             'duration', webpage, default=None)) or parse_duration(
134             self._search_regex(
135                 r'<span[^>]+class=["\']duration["\'][^>]*>.*?(\d[^<]+)',
136                 webpage, 'duration', fatal=False))
137 
138         formats = []
139 
140         video_url = compat_urllib_parse_unquote(self._search_regex(
141             r'flv_url=(.+?)&', webpage, 'video URL', default=''))
142         if video_url:
143             formats.append({
144                 'url': video_url,
145                 'format_id': 'flv',
146             })
147 
148         for kind, _, format_url in re.findall(
149                 r'setVideo([^(]+)\((["\'])(http.+?)\2\)', webpage):
150             format_id = kind.lower()
151             if format_id == 'hls':
152                 hls_formats = self._extract_m3u8_formats(
153                     format_url, video_id, 'mp4',
154                     entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)
155                 self._check_formats(hls_formats, video_id)
156                 formats.extend(hls_formats)
157             elif format_id in ('urllow', 'urlhigh'):
158                 formats.append({
159                     'url': format_url,
160                     'format_id': '%s-%s' % (determine_ext(format_url, 'mp4'), format_id[3:]),
161                     'quality': -2 if format_id.endswith('low') else None,
162                 })
163 
164         return {
165             'id': video_id,
166             'formats': formats,
167             'title': title,
168             'duration': duration,
169             'thumbnails': thumbnails,
170             'age_limit': 18,
171         }
172 
173 
174 class XVideosQuickiesIE(InfoExtractor):
175     IE_NAME = 'xvideos:quickies'
176     _VALID_URL = r'https?://(?P<domain>(?:[^/]+\.)?xvideos2?\.com)/amateur-channels/[^#]+#quickies/a/(?P<id>\d+)'
177     _TESTS = [{
178         'url': 'https://www.xvideos.com/amateur-channels/wifeluna#quickies/a/47258683',
179         'md5': '16e322a93282667f1963915568f782c1',
180         'info_dict': {
181             'id': '47258683',
182             'ext': 'mp4',
183             'title': 'Verification video',
184             'age_limit': 18,
185             'duration': 16,
186             'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\.jpg',
187         }
188     }]
189 
190     def _real_extract(self, url):
191         domain, id_ = self._match_valid_url(url).group('domain', 'id')
192         return self.url_result(f'https://{domain}/video{id_}/_', XVideosIE, id_)
193
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/yt_dlp/extractor/xvideos.py b/yt_dlp/extractor/xvideos.py
--- a/yt_dlp/extractor/xvideos.py
+++ b/yt_dlp/extractor/xvideos.py
@@ -173,8 +173,41 @@
 
 class XVideosQuickiesIE(InfoExtractor):
     IE_NAME = 'xvideos:quickies'
-    _VALID_URL = r'https?://(?P<domain>(?:[^/]+\.)?xvideos2?\.com)/amateur-channels/[^#]+#quickies/a/(?P<id>\d+)'
+    _VALID_URL = r'https?://(?P<domain>(?:[^/?#]+\.)?xvideos2?\.com)/(?:profiles/|amateur-channels/)?[^/?#]+#quickies/a/(?P<id>\w+)'
     _TESTS = [{
+        'url': 'https://www.xvideos.com/lili_love#quickies/a/ipdtikh1a4c',
+        'md5': 'f9e4f518ff1de14b99a400bbd0fc5ee0',
+        'info_dict': {
+            'id': 'ipdtikh1a4c',
+            'ext': 'mp4',
+            'title': 'Mexican chichóna putisima',
+            'age_limit': 18,
+            'duration': 81,
+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\.jpg',
+        }
+    }, {
+        'url': 'https://www.xvideos.com/profiles/lili_love#quickies/a/ipphaob6fd1',
+        'md5': '5340938aac6b46e19ebdd1d84535862e',
+        'info_dict': {
+            'id': 'ipphaob6fd1',
+            'ext': 'mp4',
+            'title': 'Puta chichona mexicana squirting',
+            'age_limit': 18,
+            'duration': 56,
+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\.jpg',
+        }
+    }, {
+        'url': 'https://www.xvideos.com/amateur-channels/lili_love#quickies/a/hfmffmd7661',
+        'md5': '92428518bbabcb4c513e55922e022491',
+        'info_dict': {
+            'id': 'hfmffmd7661',
+            'ext': 'mp4',
+            'title': 'Chichona mexican slut',
+            'age_limit': 18,
+            'duration': 9,
+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\.jpg',
+        }
+    }, {
         'url': 'https://www.xvideos.com/amateur-channels/wifeluna#quickies/a/47258683',
         'md5': '16e322a93282667f1963915568f782c1',
         'info_dict': {
@@ -189,4 +222,4 @@
 
     def _real_extract(self, url):
         domain, id_ = self._match_valid_url(url).group('domain', 'id')
-        return self.url_result(f'https://{domain}/video{id_}/_', XVideosIE, id_)
+        return self.url_result(f'https://{domain}/video{"" if id_.isdecimal() else "."}{id_}/_', XVideosIE, id_)

{"golden_diff": "diff --git a/yt_dlp/extractor/xvideos.py b/yt_dlp/extractor/xvideos.py\n--- a/yt_dlp/extractor/xvideos.py\n+++ b/yt_dlp/extractor/xvideos.py\n@@ -173,8 +173,41 @@\n \n class XVideosQuickiesIE(InfoExtractor):\n     IE_NAME = 'xvideos:quickies'\n-    _VALID_URL = r'https?://(?P<domain>(?:[^/]+\\.)?xvideos2?\\.com)/amateur-channels/[^#]+#quickies/a/(?P<id>\\d+)'\n+    _VALID_URL = r'https?://(?P<domain>(?:[^/?#]+\\.)?xvideos2?\\.com)/(?:profiles/|amateur-channels/)?[^/?#]+#quickies/a/(?P<id>\\w+)'\n     _TESTS = [{\n+        'url': 'https://www.xvideos.com/lili_love#quickies/a/ipdtikh1a4c',\n+        'md5': 'f9e4f518ff1de14b99a400bbd0fc5ee0',\n+        'info_dict': {\n+            'id': 'ipdtikh1a4c',\n+            'ext': 'mp4',\n+            'title': 'Mexican chich\u00f3na putisima',\n+            'age_limit': 18,\n+            'duration': 81,\n+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n+        }\n+    }, {\n+        'url': 'https://www.xvideos.com/profiles/lili_love#quickies/a/ipphaob6fd1',\n+        'md5': '5340938aac6b46e19ebdd1d84535862e',\n+        'info_dict': {\n+            'id': 'ipphaob6fd1',\n+            'ext': 'mp4',\n+            'title': 'Puta chichona mexicana squirting',\n+            'age_limit': 18,\n+            'duration': 56,\n+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n+        }\n+    }, {\n+        'url': 'https://www.xvideos.com/amateur-channels/lili_love#quickies/a/hfmffmd7661',\n+        'md5': '92428518bbabcb4c513e55922e022491',\n+        'info_dict': {\n+            'id': 'hfmffmd7661',\n+            'ext': 'mp4',\n+            'title': 'Chichona mexican slut',\n+            'age_limit': 18,\n+            'duration': 9,\n+            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n+        }\n+    }, {\n         'url': 'https://www.xvideos.com/amateur-channels/wifeluna#quickies/a/47258683',\n         'md5': '16e322a93282667f1963915568f782c1',\n         'info_dict': {\n@@ -189,4 +222,4 @@\n \n     def _real_extract(self, url):\n         domain, id_ = self._match_valid_url(url).group('domain', 'id')\n-        return self.url_result(f'https://{domain}/video{id_}/_', XVideosIE, id_)\n+        return self.url_result(f'https://{domain}/video{\"\" if id_.isdecimal() else \".\"}{id_}/_', XVideosIE, id_)\n", "issue": "Quickies on Xvideos\n### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE\n\n- [X] I understand that I will be **blocked** if I *intentionally* remove or skip any mandatory\\* field\n\n### Checklist\n\n- [X] I'm requesting a site-specific feature\n- [X] I've verified that I'm running yt-dlp version **2023.02.17** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)\n- [X] I've checked that all provided URLs are playable in a browser with the same IP and same login details\n- [X] I've searched [known issues](https://github.com/yt-dlp/yt-dlp/issues/3766) and the [bugtracker](https://github.com/yt-dlp/yt-dlp/issues?q=) for similar issues **including closed ones**. DO NOT post duplicates\n- [X] I've read the [guidelines for opening an issue](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#opening-an-issue)\n- [ ] I've read about [sharing account credentials](https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#are-you-willing-to-share-account-details-if-needed) and I'm willing to share it if required\n\n### Region\n\nWorldwide\n\n### Example URLs\n\nhttps://www.xvideos.com/profiles/firolix#quickies/a/51392867\r\nhttps://www.xvideos.com/profiles/firolix#quickies/a/63386619\n\n### Provide a description that is worded well enough to be understood\n\nQuickies, the version of shorts on Xvideos, aren't currently downloadable. Can you add support for them?\n\n### Provide verbose output that clearly demonstrates the problem\n\n- [X] Run **your** yt-dlp command with **-vU** flag added (`yt-dlp -vU <your command line>`)\n- [X] Copy the WHOLE output (starting with `[debug] Command-line config`) and insert it below\n\n### Complete Verbose Output\n\n```shell\n[debug] Command-line config: ['-vU', '-f', 'mp4', 'https://www.xvideos.com/profiles/firolix#quickies/a/51392867']\r\n[debug] User config \"C:\\Users\\Noah Bangs\\yt-dlp.conf\": ['-o', 'H:\\\\youtube-dl\\\\Export\\\\%(webpage_url_domain)s\\\\%(title)s - %(channel,artist - album)s.%(ext)s', '--retries', 'infinite', '--download-archive', 'registry.txt']\r\n[debug] Encodings: locale cp1252, fs utf-8, pref cp1252, out utf-8, error utf-8, screen utf-8\r\n[debug] yt-dlp version 2023.02.17 [a0a7c01] (win_exe)\r\n[debug] Python 3.8.10 (CPython AMD64 64bit) - Windows-10-10.0.19044-SP0 (OpenSSL 1.1.1k  25 Mar 2021)\r\n[debug] exe versions: ffmpeg git-2020-04-03-52523b6, ffprobe git-2020-04-03-52523b6\r\n[debug] Optional libraries: Cryptodome-3.17, brotli-1.0.9, certifi-2022.12.07, mutagen-1.46.0, sqlite3-2.6.0, websockets-10.4\r\n[debug] Proxy map: {}\r\n[debug] Loaded 1782 extractors\r\n[debug] Loading archive file 'registry.txt'\r\n[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest\r\nLatest version: 2023.02.17, Current version: 2023.02.17\r\nyt-dlp is up to date (2023.02.17)\r\n[generic] Extracting URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867\r\n[generic] 51392867: Downloading webpage\r\nWARNING: [generic] Falling back on generic information extractor\r\n[generic] 51392867: Extracting information\r\n[debug] Looking for embeds\r\nERROR: Unsupported URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867\r\nTraceback (most recent call last):\r\n  File \"yt_dlp\\YoutubeDL.py\", line 1502, in wrapper\r\n  File \"yt_dlp\\YoutubeDL.py\", line 1578, in __extract_info\r\n  File \"yt_dlp\\extractor\\common.py\", line 693, in extract\r\n  File \"yt_dlp\\extractor\\generic.py\", line 2509, in _real_extract\r\nyt_dlp.utils.UnsupportedError: Unsupported URL: https://www.xvideos.com/profiles/firolix#quickies/a/51392867\n```\n\n", "before_files": [{"content": "import re\n\nfrom .common import InfoExtractor\nfrom ..compat import compat_urllib_parse_unquote\nfrom ..utils import (\n    clean_html,\n    determine_ext,\n    ExtractorError,\n    int_or_none,\n    parse_duration,\n)\n\n\nclass XVideosIE(InfoExtractor):\n    _VALID_URL = r'''(?x)\n                    https?://\n                        (?:\n                            (?:[^/]+\\.)?xvideos2?\\.com/video\\.?|\n                            (?:www\\.)?xvideos\\.es/video\\.?|\n                            (?:www|flashservice)\\.xvideos\\.com/embedframe/|\n                            static-hw\\.xvideos\\.com/swf/xv-player\\.swf\\?.*?\\bid_video=\n                        )\n                        (?P<id>[0-9a-z]+)\n                    '''\n    _TESTS = [{\n        'url': 'http://xvideos.com/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',\n        'md5': '396255a900a6bddb3e98985f0b86c3fd',\n        'info_dict': {\n            'id': 'ucuvbkfda4e',\n            'ext': 'mp4',\n            'title': 'A Beautiful Red-Haired Stranger Was Refused, But Still Came To My Room For Sex',\n            'duration': 1238,\n            'age_limit': 18,\n            'thumbnail': r're:^https://cdn\\d+-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        # Broken HLS formats\n        'url': 'https://www.xvideos.com/video65982001/what_s_her_name',\n        'md5': '56742808292c8fa1418e4538c262c58b',\n        'info_dict': {\n            'id': '65982001',\n            'ext': 'mp4',\n            'title': 'what\\'s her name?',\n            'duration': 120,\n            'age_limit': 18,\n            'thumbnail': r're:^https://cdn\\d+-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        'url': 'https://flashservice.xvideos.com/embedframe/4588838',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.xvideos.com/embedframe/4588838',\n        'only_matching': True,\n    }, {\n        'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=4588838',\n        'only_matching': True,\n    }, {\n        'url': 'http://xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://www.xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://www.xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://fr.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://fr.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://it.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://it.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://de.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://de.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://flashservice.xvideos.com/embedframe/ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.xvideos.com/embedframe/ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'https://xvideos.es/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',\n        'only_matching': True\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n\n        mobj = re.search(r'<h1 class=\"inlineError\">(.+?)</h1>', webpage)\n        if mobj:\n            raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True)\n\n        title = self._html_search_regex(\n            (r'<title>(?P<title>.+?)\\s+-\\s+XVID',\n             r'setVideoTitle\\s*\\(\\s*([\"\\'])(?P<title>(?:(?!\\1).)+)\\1'),\n            webpage, 'title', default=None,\n            group='title') or self._og_search_title(webpage)\n\n        thumbnails = []\n        for preference, thumbnail in enumerate(('', '169')):\n            thumbnail_url = self._search_regex(\n                r'setThumbUrl%s\\(\\s*([\"\\'])(?P<thumbnail>(?:(?!\\1).)+)\\1' % thumbnail,\n                webpage, 'thumbnail', default=None, group='thumbnail')\n            if thumbnail_url:\n                thumbnails.append({\n                    'url': thumbnail_url,\n                    'preference': preference,\n                })\n\n        duration = int_or_none(self._og_search_property(\n            'duration', webpage, default=None)) or parse_duration(\n            self._search_regex(\n                r'<span[^>]+class=[\"\\']duration[\"\\'][^>]*>.*?(\\d[^<]+)',\n                webpage, 'duration', fatal=False))\n\n        formats = []\n\n        video_url = compat_urllib_parse_unquote(self._search_regex(\n            r'flv_url=(.+?)&', webpage, 'video URL', default=''))\n        if video_url:\n            formats.append({\n                'url': video_url,\n                'format_id': 'flv',\n            })\n\n        for kind, _, format_url in re.findall(\n                r'setVideo([^(]+)\\(([\"\\'])(http.+?)\\2\\)', webpage):\n            format_id = kind.lower()\n            if format_id == 'hls':\n                hls_formats = self._extract_m3u8_formats(\n                    format_url, video_id, 'mp4',\n                    entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)\n                self._check_formats(hls_formats, video_id)\n                formats.extend(hls_formats)\n            elif format_id in ('urllow', 'urlhigh'):\n                formats.append({\n                    'url': format_url,\n                    'format_id': '%s-%s' % (determine_ext(format_url, 'mp4'), format_id[3:]),\n                    'quality': -2 if format_id.endswith('low') else None,\n                })\n\n        return {\n            'id': video_id,\n            'formats': formats,\n            'title': title,\n            'duration': duration,\n            'thumbnails': thumbnails,\n            'age_limit': 18,\n        }\n\n\nclass XVideosQuickiesIE(InfoExtractor):\n    IE_NAME = 'xvideos:quickies'\n    _VALID_URL = r'https?://(?P<domain>(?:[^/]+\\.)?xvideos2?\\.com)/amateur-channels/[^#]+#quickies/a/(?P<id>\\d+)'\n    _TESTS = [{\n        'url': 'https://www.xvideos.com/amateur-channels/wifeluna#quickies/a/47258683',\n        'md5': '16e322a93282667f1963915568f782c1',\n        'info_dict': {\n            'id': '47258683',\n            'ext': 'mp4',\n            'title': 'Verification video',\n            'age_limit': 18,\n            'duration': 16,\n            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }]\n\n    def _real_extract(self, url):\n        domain, id_ = self._match_valid_url(url).group('domain', 'id')\n        return self.url_result(f'https://{domain}/video{id_}/_', XVideosIE, id_)\n", "path": "yt_dlp/extractor/xvideos.py"}], "after_files": [{"content": "import re\n\nfrom .common import InfoExtractor\nfrom ..compat import compat_urllib_parse_unquote\nfrom ..utils import (\n    clean_html,\n    determine_ext,\n    ExtractorError,\n    int_or_none,\n    parse_duration,\n)\n\n\nclass XVideosIE(InfoExtractor):\n    _VALID_URL = r'''(?x)\n                    https?://\n                        (?:\n                            (?:[^/]+\\.)?xvideos2?\\.com/video\\.?|\n                            (?:www\\.)?xvideos\\.es/video\\.?|\n                            (?:www|flashservice)\\.xvideos\\.com/embedframe/|\n                            static-hw\\.xvideos\\.com/swf/xv-player\\.swf\\?.*?\\bid_video=\n                        )\n                        (?P<id>[0-9a-z]+)\n                    '''\n    _TESTS = [{\n        'url': 'http://xvideos.com/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',\n        'md5': '396255a900a6bddb3e98985f0b86c3fd',\n        'info_dict': {\n            'id': 'ucuvbkfda4e',\n            'ext': 'mp4',\n            'title': 'A Beautiful Red-Haired Stranger Was Refused, But Still Came To My Room For Sex',\n            'duration': 1238,\n            'age_limit': 18,\n            'thumbnail': r're:^https://cdn\\d+-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        # Broken HLS formats\n        'url': 'https://www.xvideos.com/video65982001/what_s_her_name',\n        'md5': '56742808292c8fa1418e4538c262c58b',\n        'info_dict': {\n            'id': '65982001',\n            'ext': 'mp4',\n            'title': 'what\\'s her name?',\n            'duration': 120,\n            'age_limit': 18,\n            'thumbnail': r're:^https://cdn\\d+-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        'url': 'https://flashservice.xvideos.com/embedframe/4588838',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.xvideos.com/embedframe/4588838',\n        'only_matching': True,\n    }, {\n        'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=4588838',\n        'only_matching': True,\n    }, {\n        'url': 'http://xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://www.xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://www.xvideos.es/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://fr.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://fr.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://it.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://it.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'http://de.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://de.xvideos.com/video4588838/biker_takes_his_girl',\n        'only_matching': True\n    }, {\n        'url': 'https://flashservice.xvideos.com/embedframe/ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'https://www.xvideos.com/embedframe/ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'http://static-hw.xvideos.com/swf/xv-player.swf?id_video=ucuvbkfda4e',\n        'only_matching': True,\n    }, {\n        'url': 'https://xvideos.es/video.ucuvbkfda4e/a_beautiful_red-haired_stranger_was_refused_but_still_came_to_my_room_for_sex',\n        'only_matching': True\n    }]\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n        webpage = self._download_webpage(url, video_id)\n\n        mobj = re.search(r'<h1 class=\"inlineError\">(.+?)</h1>', webpage)\n        if mobj:\n            raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True)\n\n        title = self._html_search_regex(\n            (r'<title>(?P<title>.+?)\\s+-\\s+XVID',\n             r'setVideoTitle\\s*\\(\\s*([\"\\'])(?P<title>(?:(?!\\1).)+)\\1'),\n            webpage, 'title', default=None,\n            group='title') or self._og_search_title(webpage)\n\n        thumbnails = []\n        for preference, thumbnail in enumerate(('', '169')):\n            thumbnail_url = self._search_regex(\n                r'setThumbUrl%s\\(\\s*([\"\\'])(?P<thumbnail>(?:(?!\\1).)+)\\1' % thumbnail,\n                webpage, 'thumbnail', default=None, group='thumbnail')\n            if thumbnail_url:\n                thumbnails.append({\n                    'url': thumbnail_url,\n                    'preference': preference,\n                })\n\n        duration = int_or_none(self._og_search_property(\n            'duration', webpage, default=None)) or parse_duration(\n            self._search_regex(\n                r'<span[^>]+class=[\"\\']duration[\"\\'][^>]*>.*?(\\d[^<]+)',\n                webpage, 'duration', fatal=False))\n\n        formats = []\n\n        video_url = compat_urllib_parse_unquote(self._search_regex(\n            r'flv_url=(.+?)&', webpage, 'video URL', default=''))\n        if video_url:\n            formats.append({\n                'url': video_url,\n                'format_id': 'flv',\n            })\n\n        for kind, _, format_url in re.findall(\n                r'setVideo([^(]+)\\(([\"\\'])(http.+?)\\2\\)', webpage):\n            format_id = kind.lower()\n            if format_id == 'hls':\n                hls_formats = self._extract_m3u8_formats(\n                    format_url, video_id, 'mp4',\n                    entry_protocol='m3u8_native', m3u8_id='hls', fatal=False)\n                self._check_formats(hls_formats, video_id)\n                formats.extend(hls_formats)\n            elif format_id in ('urllow', 'urlhigh'):\n                formats.append({\n                    'url': format_url,\n                    'format_id': '%s-%s' % (determine_ext(format_url, 'mp4'), format_id[3:]),\n                    'quality': -2 if format_id.endswith('low') else None,\n                })\n\n        return {\n            'id': video_id,\n            'formats': formats,\n            'title': title,\n            'duration': duration,\n            'thumbnails': thumbnails,\n            'age_limit': 18,\n        }\n\n\nclass XVideosQuickiesIE(InfoExtractor):\n    IE_NAME = 'xvideos:quickies'\n    _VALID_URL = r'https?://(?P<domain>(?:[^/?#]+\\.)?xvideos2?\\.com)/(?:profiles/|amateur-channels/)?[^/?#]+#quickies/a/(?P<id>\\w+)'\n    _TESTS = [{\n        'url': 'https://www.xvideos.com/lili_love#quickies/a/ipdtikh1a4c',\n        'md5': 'f9e4f518ff1de14b99a400bbd0fc5ee0',\n        'info_dict': {\n            'id': 'ipdtikh1a4c',\n            'ext': 'mp4',\n            'title': 'Mexican chich\u00f3na putisima',\n            'age_limit': 18,\n            'duration': 81,\n            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        'url': 'https://www.xvideos.com/profiles/lili_love#quickies/a/ipphaob6fd1',\n        'md5': '5340938aac6b46e19ebdd1d84535862e',\n        'info_dict': {\n            'id': 'ipphaob6fd1',\n            'ext': 'mp4',\n            'title': 'Puta chichona mexicana squirting',\n            'age_limit': 18,\n            'duration': 56,\n            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        'url': 'https://www.xvideos.com/amateur-channels/lili_love#quickies/a/hfmffmd7661',\n        'md5': '92428518bbabcb4c513e55922e022491',\n        'info_dict': {\n            'id': 'hfmffmd7661',\n            'ext': 'mp4',\n            'title': 'Chichona mexican slut',\n            'age_limit': 18,\n            'duration': 9,\n            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }, {\n        'url': 'https://www.xvideos.com/amateur-channels/wifeluna#quickies/a/47258683',\n        'md5': '16e322a93282667f1963915568f782c1',\n        'info_dict': {\n            'id': '47258683',\n            'ext': 'mp4',\n            'title': 'Verification video',\n            'age_limit': 18,\n            'duration': 16,\n            'thumbnail': r're:^https://cdn.*-pic.xvideos-cdn.com/.+\\.jpg',\n        }\n    }]\n\n    def _real_extract(self, url):\n        domain, id_ = self._match_valid_url(url).group('domain', 'id')\n        return self.url_result(f'https://{domain}/video{\"\" if id_.isdecimal() else \".\"}{id_}/_', XVideosIE, id_)\n", "path": "yt_dlp/extractor/xvideos.py"}]}