We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[InfoQ] Unable to extract mp3Form form
### Checklist

- [X] I'm reporting a broken site
- [X] I've verified that I'm running yt-dlp version **2022.04.08** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)
- [X] I've checked that all provided URLs are alive and playable in a browser
- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/ytdl-org/youtube-dl#video-url-contains-an-ampersand-and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)
- [X] I've searched 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

_No response_

### Description

InfoQ support currently fails, e.g., for <https://www.infoq.com/presentations/rr-reversible-debugging/>:
```
yt-dlp https://www.infoq.com/presentations/rr-reversible-debugging/

[InfoQ] rr-reversible-debugging: Downloading webpage
ERROR: [InfoQ] rr-reversible-debugging: Unable to extract mp3Form form; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out th
e appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
```

### Verbose log

```shell
[debug] Command-line config: ['-vU', 'https://www.infoq.com/presentations/rr-reversible-debugging/']
[debug] Encodings: locale cp1252, fs utf-8, out utf-8 (No ANSI), err utf-8 (No ANSI), pref cp1252
[debug] yt-dlp version 2022.04.08 [7884ade] (win_exe)
[debug] Python version 3.8.10 (CPython 64bit) - Windows-2012ServerR2-6.3.9600
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg N-81036-g2b14204 (needs_adtstoasc), ffprobe 5.0.1-essentials_build-www.gyan.dev
[debug] Optional libraries: brotli, certifi, Cryptodome, mutagen, sqlite, websockets
[debug] Proxy map: {}
Latest version: 2022.04.08, Current version: 2022.04.08
yt-dlp is up to date (2022.04.08)
[debug] [InfoQ] Extracting URL: https://www.infoq.com/presentations/rr-reversible-debugging/
[InfoQ] rr-reversible-debugging: Downloading webpage
ERROR: [InfoQ] rr-reversible-debugging: Unable to extract mp3Form form; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out th
e appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
  File "yt_dlp\extractor\common.py", line 641, in extract
  File "yt_dlp\extractor\infoq.py", line 128, in _real_extract
  File "yt_dlp\extractor\infoq.py", line 93, in _extract_http_audio
  File "yt_dlp\extractor\common.py", line 1638, in _form_hidden_inputs
  File "yt_dlp\extractor\common.py", line 1229, in _search_regex
```


--- 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/infoq.py`
Content:
```
1 from ..compat import (
2     compat_b64decode,
3     compat_urllib_parse_unquote,
4     compat_urlparse,
5 )
6 from ..utils import (
7     determine_ext,
8     update_url_query,
9 )
10 from .bokecc import BokeCCBaseIE
11 
12 
13 class InfoQIE(BokeCCBaseIE):
14     _VALID_URL = r'https?://(?:www\.)?infoq\.com/(?:[^/]+/)+(?P<id>[^/]+)'
15 
16     _TESTS = [{
17         'url': 'http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things',
18         'md5': 'b5ca0e0a8c1fed93b0e65e48e462f9a2',
19         'info_dict': {
20             'id': 'A-Few-of-My-Favorite-Python-Things',
21             'ext': 'mp4',
22             'description': 'Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience.',
23             'title': 'A Few of My Favorite [Python] Things',
24         },
25     }, {
26         'url': 'http://www.infoq.com/fr/presentations/changez-avis-sur-javascript',
27         'only_matching': True,
28     }, {
29         'url': 'http://www.infoq.com/cn/presentations/openstack-continued-delivery',
30         'md5': '4918d0cca1497f2244572caf626687ef',
31         'info_dict': {
32             'id': 'openstack-continued-delivery',
33             'title': 'OpenStack持续交付之路',
34             'ext': 'flv',
35             'description': 'md5:308d981fb28fa42f49f9568322c683ff',
36         },
37     }, {
38         'url': 'https://www.infoq.com/presentations/Simple-Made-Easy',
39         'md5': '0e34642d4d9ef44bf86f66f6399672db',
40         'info_dict': {
41             'id': 'Simple-Made-Easy',
42             'title': 'Simple Made Easy',
43             'ext': 'mp3',
44             'description': 'md5:3e0e213a8bbd074796ef89ea35ada25b',
45         },
46         'params': {
47             'format': 'bestaudio',
48         },
49     }]
50 
51     def _extract_rtmp_video(self, webpage):
52         # The server URL is hardcoded
53         video_url = 'rtmpe://videof.infoq.com/cfx/st/'
54 
55         # Extract video URL
56         encoded_id = self._search_regex(
57             r"jsclassref\s*=\s*'([^']*)'", webpage, 'encoded id', default=None)
58 
59         real_id = compat_urllib_parse_unquote(compat_b64decode(encoded_id).decode('utf-8'))
60         playpath = 'mp4:' + real_id
61 
62         return [{
63             'format_id': 'rtmp_video',
64             'url': video_url,
65             'ext': determine_ext(playpath),
66             'play_path': playpath,
67         }]
68 
69     def _extract_cf_auth(self, webpage):
70         policy = self._search_regex(r'InfoQConstants\.scp\s*=\s*\'([^\']+)\'', webpage, 'policy')
71         signature = self._search_regex(r'InfoQConstants\.scs\s*=\s*\'([^\']+)\'', webpage, 'signature')
72         key_pair_id = self._search_regex(r'InfoQConstants\.sck\s*=\s*\'([^\']+)\'', webpage, 'key-pair-id')
73         return {
74             'Policy': policy,
75             'Signature': signature,
76             'Key-Pair-Id': key_pair_id,
77         }
78 
79     def _extract_http_video(self, webpage):
80         http_video_url = self._search_regex(r'P\.s\s*=\s*\'([^\']+)\'', webpage, 'video URL')
81         http_video_url = update_url_query(http_video_url, self._extract_cf_auth(webpage))
82         return [{
83             'format_id': 'http_video',
84             'url': http_video_url,
85             'http_headers': {'Referer': 'https://www.infoq.com/'},
86         }]
87 
88     def _extract_http_audio(self, webpage, video_id):
89         fields = self._form_hidden_inputs('mp3Form', webpage)
90         http_audio_url = fields.get('filename')
91         if not http_audio_url:
92             return []
93 
94         # base URL is found in the Location header in the response returned by
95         # GET https://www.infoq.com/mp3download.action?filename=... when logged in.
96         http_audio_url = compat_urlparse.urljoin('http://ress.infoq.com/downloads/mp3downloads/', http_audio_url)
97         http_audio_url = update_url_query(http_audio_url, self._extract_cf_auth(webpage))
98 
99         # audio file seem to be missing some times even if there is a download link
100         # so probe URL to make sure
101         if not self._is_valid_url(http_audio_url, video_id):
102             return []
103 
104         return [{
105             'format_id': 'http_audio',
106             'url': http_audio_url,
107             'vcodec': 'none',
108         }]
109 
110     def _real_extract(self, url):
111         video_id = self._match_id(url)
112         webpage = self._download_webpage(url, video_id)
113 
114         video_title = self._html_extract_title(webpage)
115         video_description = self._html_search_meta('description', webpage, 'description')
116 
117         if '/cn/' in url:
118             # for China videos, HTTP video URL exists but always fails with 403
119             formats = self._extract_bokecc_formats(webpage, video_id)
120         else:
121             formats = (
122                 self._extract_rtmp_video(webpage)
123                 + self._extract_http_video(webpage)
124                 + self._extract_http_audio(webpage, video_id))
125 
126         self._sort_formats(formats)
127 
128         return {
129             'id': video_id,
130             'title': video_title,
131             'description': video_description,
132             'formats': formats,
133         }
134
```
--- 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/infoq.py b/yt_dlp/extractor/infoq.py
--- a/yt_dlp/extractor/infoq.py
+++ b/yt_dlp/extractor/infoq.py
@@ -4,8 +4,10 @@
     compat_urlparse,
 )
 from ..utils import (
+    ExtractorError,
     determine_ext,
     update_url_query,
+    traverse_obj,
 )
 from .bokecc import BokeCCBaseIE
 
@@ -34,6 +36,7 @@
             'ext': 'flv',
             'description': 'md5:308d981fb28fa42f49f9568322c683ff',
         },
+        'skip': 'Sorry, the page you visited does not exist',
     }, {
         'url': 'https://www.infoq.com/presentations/Simple-Made-Easy',
         'md5': '0e34642d4d9ef44bf86f66f6399672db',
@@ -86,8 +89,10 @@
         }]
 
     def _extract_http_audio(self, webpage, video_id):
-        fields = self._form_hidden_inputs('mp3Form', webpage)
-        http_audio_url = fields.get('filename')
+        try:
+            http_audio_url = traverse_obj(self._form_hidden_inputs('mp3Form', webpage), 'filename')
+        except ExtractorError:
+            http_audio_url = None
         if not http_audio_url:
             return []

{"golden_diff": "diff --git a/yt_dlp/extractor/infoq.py b/yt_dlp/extractor/infoq.py\n--- a/yt_dlp/extractor/infoq.py\n+++ b/yt_dlp/extractor/infoq.py\n@@ -4,8 +4,10 @@\n     compat_urlparse,\n )\n from ..utils import (\n+    ExtractorError,\n     determine_ext,\n     update_url_query,\n+    traverse_obj,\n )\n from .bokecc import BokeCCBaseIE\n \n@@ -34,6 +36,7 @@\n             'ext': 'flv',\n             'description': 'md5:308d981fb28fa42f49f9568322c683ff',\n         },\n+        'skip': 'Sorry, the page you visited does not exist',\n     }, {\n         'url': 'https://www.infoq.com/presentations/Simple-Made-Easy',\n         'md5': '0e34642d4d9ef44bf86f66f6399672db',\n@@ -86,8 +89,10 @@\n         }]\n \n     def _extract_http_audio(self, webpage, video_id):\n-        fields = self._form_hidden_inputs('mp3Form', webpage)\n-        http_audio_url = fields.get('filename')\n+        try:\n+            http_audio_url = traverse_obj(self._form_hidden_inputs('mp3Form', webpage), 'filename')\n+        except ExtractorError:\n+            http_audio_url = None\n         if not http_audio_url:\n             return []\n", "issue": "[InfoQ] Unable to extract mp3Form form\n### Checklist\n\n- [X] I'm reporting a broken site\n- [X] I've verified that I'm running yt-dlp version **2022.04.08** ([update instructions](https://github.com/yt-dlp/yt-dlp#update)) or later (specify commit)\n- [X] I've checked that all provided URLs are alive and playable in a browser\n- [X] I've checked that all URLs and arguments with special characters are [properly quoted or escaped](https://github.com/ytdl-org/youtube-dl#video-url-contains-an-ampersand-and-im-getting-some-strange-output-1-2839-or-v-is-not-recognized-as-an-internal-or-external-command)\n- [X] I've searched 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\n_No response_\n\n### Description\n\nInfoQ support currently fails, e.g., for <https://www.infoq.com/presentations/rr-reversible-debugging/>:\r\n```\r\nyt-dlp https://www.infoq.com/presentations/rr-reversible-debugging/\r\n\r\n[InfoQ] rr-reversible-debugging: Downloading webpage\r\nERROR: [InfoQ] rr-reversible-debugging: Unable to extract mp3Form form; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out th\r\ne appropriate issue template. Confirm you are on the latest version using  yt-dlp -U\r\n```\n\n### Verbose log\n\n```shell\n[debug] Command-line config: ['-vU', 'https://www.infoq.com/presentations/rr-reversible-debugging/']\r\n[debug] Encodings: locale cp1252, fs utf-8, out utf-8 (No ANSI), err utf-8 (No ANSI), pref cp1252\r\n[debug] yt-dlp version 2022.04.08 [7884ade] (win_exe)\r\n[debug] Python version 3.8.10 (CPython 64bit) - Windows-2012ServerR2-6.3.9600\r\n[debug] Checking exe version: ffmpeg -bsfs\r\n[debug] Checking exe version: ffprobe -bsfs\r\n[debug] exe versions: ffmpeg N-81036-g2b14204 (needs_adtstoasc), ffprobe 5.0.1-essentials_build-www.gyan.dev\r\n[debug] Optional libraries: brotli, certifi, Cryptodome, mutagen, sqlite, websockets\r\n[debug] Proxy map: {}\r\nLatest version: 2022.04.08, Current version: 2022.04.08\r\nyt-dlp is up to date (2022.04.08)\r\n[debug] [InfoQ] Extracting URL: https://www.infoq.com/presentations/rr-reversible-debugging/\r\n[InfoQ] rr-reversible-debugging: Downloading webpage\r\nERROR: [InfoQ] rr-reversible-debugging: Unable to extract mp3Form form; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out th\r\ne appropriate issue template. Confirm you are on the latest version using  yt-dlp -U\r\n  File \"yt_dlp\\extractor\\common.py\", line 641, in extract\r\n  File \"yt_dlp\\extractor\\infoq.py\", line 128, in _real_extract\r\n  File \"yt_dlp\\extractor\\infoq.py\", line 93, in _extract_http_audio\r\n  File \"yt_dlp\\extractor\\common.py\", line 1638, in _form_hidden_inputs\r\n  File \"yt_dlp\\extractor\\common.py\", line 1229, in _search_regex\n```\n\n", "before_files": [{"content": "from ..compat import (\n    compat_b64decode,\n    compat_urllib_parse_unquote,\n    compat_urlparse,\n)\nfrom ..utils import (\n    determine_ext,\n    update_url_query,\n)\nfrom .bokecc import BokeCCBaseIE\n\n\nclass InfoQIE(BokeCCBaseIE):\n    _VALID_URL = r'https?://(?:www\\.)?infoq\\.com/(?:[^/]+/)+(?P<id>[^/]+)'\n\n    _TESTS = [{\n        'url': 'http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things',\n        'md5': 'b5ca0e0a8c1fed93b0e65e48e462f9a2',\n        'info_dict': {\n            'id': 'A-Few-of-My-Favorite-Python-Things',\n            'ext': 'mp4',\n            'description': 'Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience.',\n            'title': 'A Few of My Favorite [Python] Things',\n        },\n    }, {\n        'url': 'http://www.infoq.com/fr/presentations/changez-avis-sur-javascript',\n        'only_matching': True,\n    }, {\n        'url': 'http://www.infoq.com/cn/presentations/openstack-continued-delivery',\n        'md5': '4918d0cca1497f2244572caf626687ef',\n        'info_dict': {\n            'id': 'openstack-continued-delivery',\n            'title': 'OpenStack\u6301\u7eed\u4ea4\u4ed8\u4e4b\u8def',\n            'ext': 'flv',\n            'description': 'md5:308d981fb28fa42f49f9568322c683ff',\n        },\n    }, {\n        'url': 'https://www.infoq.com/presentations/Simple-Made-Easy',\n        'md5': '0e34642d4d9ef44bf86f66f6399672db',\n        'info_dict': {\n            'id': 'Simple-Made-Easy',\n            'title': 'Simple Made Easy',\n            'ext': 'mp3',\n            'description': 'md5:3e0e213a8bbd074796ef89ea35ada25b',\n        },\n        'params': {\n            'format': 'bestaudio',\n        },\n    }]\n\n    def _extract_rtmp_video(self, webpage):\n        # The server URL is hardcoded\n        video_url = 'rtmpe://videof.infoq.com/cfx/st/'\n\n        # Extract video URL\n        encoded_id = self._search_regex(\n            r\"jsclassref\\s*=\\s*'([^']*)'\", webpage, 'encoded id', default=None)\n\n        real_id = compat_urllib_parse_unquote(compat_b64decode(encoded_id).decode('utf-8'))\n        playpath = 'mp4:' + real_id\n\n        return [{\n            'format_id': 'rtmp_video',\n            'url': video_url,\n            'ext': determine_ext(playpath),\n            'play_path': playpath,\n        }]\n\n    def _extract_cf_auth(self, webpage):\n        policy = self._search_regex(r'InfoQConstants\\.scp\\s*=\\s*\\'([^\\']+)\\'', webpage, 'policy')\n        signature = self._search_regex(r'InfoQConstants\\.scs\\s*=\\s*\\'([^\\']+)\\'', webpage, 'signature')\n        key_pair_id = self._search_regex(r'InfoQConstants\\.sck\\s*=\\s*\\'([^\\']+)\\'', webpage, 'key-pair-id')\n        return {\n            'Policy': policy,\n            'Signature': signature,\n            'Key-Pair-Id': key_pair_id,\n        }\n\n    def _extract_http_video(self, webpage):\n        http_video_url = self._search_regex(r'P\\.s\\s*=\\s*\\'([^\\']+)\\'', webpage, 'video URL')\n        http_video_url = update_url_query(http_video_url, self._extract_cf_auth(webpage))\n        return [{\n            'format_id': 'http_video',\n            'url': http_video_url,\n            'http_headers': {'Referer': 'https://www.infoq.com/'},\n        }]\n\n    def _extract_http_audio(self, webpage, video_id):\n        fields = self._form_hidden_inputs('mp3Form', webpage)\n        http_audio_url = fields.get('filename')\n        if not http_audio_url:\n            return []\n\n        # base URL is found in the Location header in the response returned by\n        # GET https://www.infoq.com/mp3download.action?filename=... when logged in.\n        http_audio_url = compat_urlparse.urljoin('http://ress.infoq.com/downloads/mp3downloads/', http_audio_url)\n        http_audio_url = update_url_query(http_audio_url, self._extract_cf_auth(webpage))\n\n        # audio file seem to be missing some times even if there is a download link\n        # so probe URL to make sure\n        if not self._is_valid_url(http_audio_url, video_id):\n            return []\n\n        return [{\n            'format_id': 'http_audio',\n            'url': http_audio_url,\n            'vcodec': 'none',\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        video_title = self._html_extract_title(webpage)\n        video_description = self._html_search_meta('description', webpage, 'description')\n\n        if '/cn/' in url:\n            # for China videos, HTTP video URL exists but always fails with 403\n            formats = self._extract_bokecc_formats(webpage, video_id)\n        else:\n            formats = (\n                self._extract_rtmp_video(webpage)\n                + self._extract_http_video(webpage)\n                + self._extract_http_audio(webpage, video_id))\n\n        self._sort_formats(formats)\n\n        return {\n            'id': video_id,\n            'title': video_title,\n            'description': video_description,\n            'formats': formats,\n        }\n", "path": "yt_dlp/extractor/infoq.py"}], "after_files": [{"content": "from ..compat import (\n    compat_b64decode,\n    compat_urllib_parse_unquote,\n    compat_urlparse,\n)\nfrom ..utils import (\n    ExtractorError,\n    determine_ext,\n    update_url_query,\n    traverse_obj,\n)\nfrom .bokecc import BokeCCBaseIE\n\n\nclass InfoQIE(BokeCCBaseIE):\n    _VALID_URL = r'https?://(?:www\\.)?infoq\\.com/(?:[^/]+/)+(?P<id>[^/]+)'\n\n    _TESTS = [{\n        'url': 'http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things',\n        'md5': 'b5ca0e0a8c1fed93b0e65e48e462f9a2',\n        'info_dict': {\n            'id': 'A-Few-of-My-Favorite-Python-Things',\n            'ext': 'mp4',\n            'description': 'Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience.',\n            'title': 'A Few of My Favorite [Python] Things',\n        },\n    }, {\n        'url': 'http://www.infoq.com/fr/presentations/changez-avis-sur-javascript',\n        'only_matching': True,\n    }, {\n        'url': 'http://www.infoq.com/cn/presentations/openstack-continued-delivery',\n        'md5': '4918d0cca1497f2244572caf626687ef',\n        'info_dict': {\n            'id': 'openstack-continued-delivery',\n            'title': 'OpenStack\u6301\u7eed\u4ea4\u4ed8\u4e4b\u8def',\n            'ext': 'flv',\n            'description': 'md5:308d981fb28fa42f49f9568322c683ff',\n        },\n        'skip': 'Sorry, the page you visited does not exist',\n    }, {\n        'url': 'https://www.infoq.com/presentations/Simple-Made-Easy',\n        'md5': '0e34642d4d9ef44bf86f66f6399672db',\n        'info_dict': {\n            'id': 'Simple-Made-Easy',\n            'title': 'Simple Made Easy',\n            'ext': 'mp3',\n            'description': 'md5:3e0e213a8bbd074796ef89ea35ada25b',\n        },\n        'params': {\n            'format': 'bestaudio',\n        },\n    }]\n\n    def _extract_rtmp_video(self, webpage):\n        # The server URL is hardcoded\n        video_url = 'rtmpe://videof.infoq.com/cfx/st/'\n\n        # Extract video URL\n        encoded_id = self._search_regex(\n            r\"jsclassref\\s*=\\s*'([^']*)'\", webpage, 'encoded id', default=None)\n\n        real_id = compat_urllib_parse_unquote(compat_b64decode(encoded_id).decode('utf-8'))\n        playpath = 'mp4:' + real_id\n\n        return [{\n            'format_id': 'rtmp_video',\n            'url': video_url,\n            'ext': determine_ext(playpath),\n            'play_path': playpath,\n        }]\n\n    def _extract_cf_auth(self, webpage):\n        policy = self._search_regex(r'InfoQConstants\\.scp\\s*=\\s*\\'([^\\']+)\\'', webpage, 'policy')\n        signature = self._search_regex(r'InfoQConstants\\.scs\\s*=\\s*\\'([^\\']+)\\'', webpage, 'signature')\n        key_pair_id = self._search_regex(r'InfoQConstants\\.sck\\s*=\\s*\\'([^\\']+)\\'', webpage, 'key-pair-id')\n        return {\n            'Policy': policy,\n            'Signature': signature,\n            'Key-Pair-Id': key_pair_id,\n        }\n\n    def _extract_http_video(self, webpage):\n        http_video_url = self._search_regex(r'P\\.s\\s*=\\s*\\'([^\\']+)\\'', webpage, 'video URL')\n        http_video_url = update_url_query(http_video_url, self._extract_cf_auth(webpage))\n        return [{\n            'format_id': 'http_video',\n            'url': http_video_url,\n            'http_headers': {'Referer': 'https://www.infoq.com/'},\n        }]\n\n    def _extract_http_audio(self, webpage, video_id):\n        try:\n            http_audio_url = traverse_obj(self._form_hidden_inputs('mp3Form', webpage), 'filename')\n        except ExtractorError:\n            http_audio_url = None\n        if not http_audio_url:\n            return []\n\n        # base URL is found in the Location header in the response returned by\n        # GET https://www.infoq.com/mp3download.action?filename=... when logged in.\n        http_audio_url = compat_urlparse.urljoin('http://ress.infoq.com/downloads/mp3downloads/', http_audio_url)\n        http_audio_url = update_url_query(http_audio_url, self._extract_cf_auth(webpage))\n\n        # audio file seem to be missing some times even if there is a download link\n        # so probe URL to make sure\n        if not self._is_valid_url(http_audio_url, video_id):\n            return []\n\n        return [{\n            'format_id': 'http_audio',\n            'url': http_audio_url,\n            'vcodec': 'none',\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        video_title = self._html_extract_title(webpage)\n        video_description = self._html_search_meta('description', webpage, 'description')\n\n        if '/cn/' in url:\n            # for China videos, HTTP video URL exists but always fails with 403\n            formats = self._extract_bokecc_formats(webpage, video_id)\n        else:\n            formats = (\n                self._extract_rtmp_video(webpage)\n                + self._extract_http_video(webpage)\n                + self._extract_http_audio(webpage, video_id))\n\n        self._sort_formats(formats)\n\n        return {\n            'id': video_id,\n            'title': video_title,\n            'description': video_description,\n            'formats': formats,\n        }\n", "path": "yt_dlp/extractor/infoq.py"}]}