We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
myspass.de broken
## Checklist

- [x] I'm reporting a broken site support
- [x] I've verified that I'm running youtube-dl version **2021.12.17**
- [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
- [x] I've searched the bugtracker for similar issues including closed ones

## Verbose log

```
$ youtube-dl -v https://www.myspass.de/shows/tvshows/tv-total/Novak-Puffovic-bei-bester-Laune--/44996/
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v', 'https://www.myspass.de/shows/tvshows/tv-total/Novak-Puffovic-bei-bester-Laune--/44996/']
[debug] Encodings: locale UTF-8, fs utf-8, out utf-8, pref UTF-8
[debug] youtube-dl version 2021.12.17
[debug] Python version 3.8.10 (CPython) - Linux-5.4.0-73-generic-x86_64-with-glibc2.29
[debug] exe versions: ffmpeg 4.2.4, ffprobe 4.2.4, rtmpdump 2.4
[debug] Proxy map: {}
[MySpass] 44996: Downloading XML
Traceback (most recent call last):
  File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.8/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/local/bin/youtube-dl/__main__.py", line 19, in <module>
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 475, in main
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 465, in _real_main
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 2068, in download
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 808, in extract_info
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 815, in wrapper
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 836, in __extract_info
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 534, in extract
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/myspass.py", line 38, in _real_extract
AttributeError: 'NoneType' object has no attribute 'groups'

```

## Description

download of myspass.de doesn't work anymore.

Fixed groups() call on potentially empty regex search object.
- https://github.com/ytdl-org/youtube-dl/issues/30521

## Please follow the guide below

- You will be asked some questions, please read them **carefully** and answer honestly
- Put an `x` into all the boxes [ ] relevant to your *pull request* (like that [x])
- Use *Preview* tab to see how your *pull request* will actually look like

---

### Before submitting a *pull request* make sure you have:
- [x] [Searched](https://github.com/ytdl-org/youtube-dl/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
- [ ] Read [adding new extractor tutorial](https://github.com/ytdl-org/youtube-dl#adding-support-for-a-new-site)
- [x] Read [youtube-dl coding conventions](https://github.com/ytdl-org/youtube-dl#youtube-dl-coding-conventions) and adjusted the code to meet them
- [x] Covered the code with tests (note that PRs without tests will be REJECTED)
- [x] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)

### In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
- [x] I am the original author of this code and I am willing to release it under [Unlicense](http://unlicense.org/)
- [ ] I am not the original author of this code but it is in public domain or released under [Unlicense](http://unlicense.org/) (provide reliable evidence)

### What is the purpose of your *pull request*?
- [x] Bug fix
- [ ] Improvement
- [ ] New extractor
- [ ] New feature

---

### Description of your *pull request* and other information

Within the myspass site extractor, there is a short regex for checking for certain substrings in the video url.
```groups()``` was called on ```re.search()``` without first ensuring there were any results to return a regex object. I've added a simple check for this.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `youtube_dl/extractor/myspass.py`
Content:
```
1 # coding: utf-8
2 from __future__ import unicode_literals
3 
4 import re
5 
6 from .common import InfoExtractor
7 from ..compat import compat_str
8 from ..utils import (
9     int_or_none,
10     parse_duration,
11     xpath_text,
12 )
13 
14 
15 class MySpassIE(InfoExtractor):
16     _VALID_URL = r'https?://(?:www\.)?myspass\.de/([^/]+/)*(?P<id>\d+)'
17     _TEST = {
18         'url': 'http://www.myspass.de/myspass/shows/tvshows/absolute-mehrheit/Absolute-Mehrheit-vom-17022013-Die-Highlights-Teil-2--/11741/',
19         'md5': '0b49f4844a068f8b33f4b7c88405862b',
20         'info_dict': {
21             'id': '11741',
22             'ext': 'mp4',
23             'description': 'Wer kann in die Fußstapfen von Wolfgang Kubicki treten und die Mehrheit der Zuschauer hinter sich versammeln? Wird vielleicht sogar die Absolute Mehrheit geknackt und der Jackpot von 200.000 Euro mit nach Hause genommen?',
24             'title': '17.02.2013 - Die Highlights, Teil 2',
25         },
26     }
27 
28     def _real_extract(self, url):
29         video_id = self._match_id(url)
30 
31         metadata = self._download_xml(
32             'http://www.myspass.de/myspass/includes/apps/video/getvideometadataxml.php?id=' + video_id,
33             video_id)
34 
35         title = xpath_text(metadata, 'title', fatal=True)
36         video_url = xpath_text(metadata, 'url_flv', 'download url', True)
37         video_id_int = int(video_id)
38         for group in re.search(r'/myspass2009/\d+/(\d+)/(\d+)/(\d+)/', video_url).groups():
39             group_int = int(group)
40             if group_int > video_id_int:
41                 video_url = video_url.replace(
42                     group, compat_str(group_int // video_id_int))
43 
44         return {
45             'id': video_id,
46             'url': video_url,
47             'title': title,
48             'thumbnail': xpath_text(metadata, 'imagePreview'),
49             'description': xpath_text(metadata, 'description'),
50             'duration': parse_duration(xpath_text(metadata, 'duration')),
51             'series': xpath_text(metadata, 'format'),
52             'season_number': int_or_none(xpath_text(metadata, 'season')),
53             'season_id': xpath_text(metadata, 'season_id'),
54             'episode': title,
55             'episode_number': int_or_none(xpath_text(metadata, 'episode')),
56         }
57
```
--- 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/youtube_dl/extractor/myspass.py b/youtube_dl/extractor/myspass.py
--- a/youtube_dl/extractor/myspass.py
+++ b/youtube_dl/extractor/myspass.py
@@ -35,7 +35,9 @@
         title = xpath_text(metadata, 'title', fatal=True)
         video_url = xpath_text(metadata, 'url_flv', 'download url', True)
         video_id_int = int(video_id)
-        for group in re.search(r'/myspass2009/\d+/(\d+)/(\d+)/(\d+)/', video_url).groups():
+
+        grps = re.search(r'/myspass2009/\d+/(\d+)/(\d+)/(\d+)/', video_url)
+        for group in grps.groups() if grps else []:
             group_int = int(group)
             if group_int > video_id_int:
                 video_url = video_url.replace(

{"golden_diff": "diff --git a/youtube_dl/extractor/myspass.py b/youtube_dl/extractor/myspass.py\n--- a/youtube_dl/extractor/myspass.py\n+++ b/youtube_dl/extractor/myspass.py\n@@ -35,7 +35,9 @@\n         title = xpath_text(metadata, 'title', fatal=True)\n         video_url = xpath_text(metadata, 'url_flv', 'download url', True)\n         video_id_int = int(video_id)\n-        for group in re.search(r'/myspass2009/\\d+/(\\d+)/(\\d+)/(\\d+)/', video_url).groups():\n+\n+        grps = re.search(r'/myspass2009/\\d+/(\\d+)/(\\d+)/(\\d+)/', video_url)\n+        for group in grps.groups() if grps else []:\n             group_int = int(group)\n             if group_int > video_id_int:\n                 video_url = video_url.replace(\n", "issue": "myspass.de broken\n## Checklist\r\n\r\n- [x] I'm reporting a broken site support\r\n- [x] I've verified that I'm running youtube-dl version **2021.12.17**\r\n- [x] I've checked that all provided URLs are alive and playable in a browser\r\n- [x] I've checked that all URLs and arguments with special characters are properly quoted or escaped\r\n- [x] I've searched the bugtracker for similar issues including closed ones\r\n\r\n## Verbose log\r\n\r\n```\r\n$ youtube-dl -v https://www.myspass.de/shows/tvshows/tv-total/Novak-Puffovic-bei-bester-Laune--/44996/\r\n[debug] System config: []\r\n[debug] User config: []\r\n[debug] Custom config: []\r\n[debug] Command-line args: ['-v', 'https://www.myspass.de/shows/tvshows/tv-total/Novak-Puffovic-bei-bester-Laune--/44996/']\r\n[debug] Encodings: locale UTF-8, fs utf-8, out utf-8, pref UTF-8\r\n[debug] youtube-dl version 2021.12.17\r\n[debug] Python version 3.8.10 (CPython) - Linux-5.4.0-73-generic-x86_64-with-glibc2.29\r\n[debug] exe versions: ffmpeg 4.2.4, ffprobe 4.2.4, rtmpdump 2.4\r\n[debug] Proxy map: {}\r\n[MySpass] 44996: Downloading XML\r\nTraceback (most recent call last):\r\n  File \"/usr/lib/python3.8/runpy.py\", line 194, in _run_module_as_main\r\n    return _run_code(code, main_globals, None,\r\n  File \"/usr/lib/python3.8/runpy.py\", line 87, in _run_code\r\n    exec(code, run_globals)\r\n  File \"/usr/local/bin/youtube-dl/__main__.py\", line 19, in <module>\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/__init__.py\", line 475, in main\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/__init__.py\", line 465, in _real_main\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py\", line 2068, in download\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py\", line 808, in extract_info\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py\", line 815, in wrapper\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py\", line 836, in __extract_info\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py\", line 534, in extract\r\n  File \"/usr/local/bin/youtube-dl/youtube_dl/extractor/myspass.py\", line 38, in _real_extract\r\nAttributeError: 'NoneType' object has no attribute 'groups'\r\n\r\n```\r\n\r\n## Description\r\n\r\ndownload of myspass.de doesn't work anymore.\r\n\nFixed groups() call on potentially empty regex search object.\n- https://github.com/ytdl-org/youtube-dl/issues/30521\r\n\r\n## Please follow the guide below\r\n\r\n- You will be asked some questions, please read them **carefully** and answer honestly\r\n- Put an `x` into all the boxes [ ] relevant to your *pull request* (like that [x])\r\n- Use *Preview* tab to see how your *pull request* will actually look like\r\n\r\n---\r\n\r\n### Before submitting a *pull request* make sure you have:\r\n- [x] [Searched](https://github.com/ytdl-org/youtube-dl/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests\r\n- [ ] Read [adding new extractor tutorial](https://github.com/ytdl-org/youtube-dl#adding-support-for-a-new-site)\r\n- [x] Read [youtube-dl coding conventions](https://github.com/ytdl-org/youtube-dl#youtube-dl-coding-conventions) and adjusted the code to meet them\r\n- [x] Covered the code with tests (note that PRs without tests will be REJECTED)\r\n- [x] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)\r\n\r\n### In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:\r\n- [x] I am the original author of this code and I am willing to release it under [Unlicense](http://unlicense.org/)\r\n- [ ] I am not the original author of this code but it is in public domain or released under [Unlicense](http://unlicense.org/) (provide reliable evidence)\r\n\r\n### What is the purpose of your *pull request*?\r\n- [x] Bug fix\r\n- [ ] Improvement\r\n- [ ] New extractor\r\n- [ ] New feature\r\n\r\n---\r\n\r\n### Description of your *pull request* and other information\r\n\r\nWithin the myspass site extractor, there is a short regex for checking for certain substrings in the video url.\r\n```groups()``` was called on ```re.search()``` without first ensuring there were any results to return a regex object. I've added a simple check for this.\n", "before_files": [{"content": "# coding: utf-8\nfrom __future__ import unicode_literals\n\nimport re\n\nfrom .common import InfoExtractor\nfrom ..compat import compat_str\nfrom ..utils import (\n    int_or_none,\n    parse_duration,\n    xpath_text,\n)\n\n\nclass MySpassIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?myspass\\.de/([^/]+/)*(?P<id>\\d+)'\n    _TEST = {\n        'url': 'http://www.myspass.de/myspass/shows/tvshows/absolute-mehrheit/Absolute-Mehrheit-vom-17022013-Die-Highlights-Teil-2--/11741/',\n        'md5': '0b49f4844a068f8b33f4b7c88405862b',\n        'info_dict': {\n            'id': '11741',\n            'ext': 'mp4',\n            'description': 'Wer kann in die Fu\u00dfstapfen von Wolfgang Kubicki treten und die Mehrheit der Zuschauer hinter sich versammeln? Wird vielleicht sogar die Absolute Mehrheit geknackt und der Jackpot von 200.000 Euro mit nach Hause genommen?',\n            'title': '17.02.2013 - Die Highlights, Teil 2',\n        },\n    }\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        metadata = self._download_xml(\n            'http://www.myspass.de/myspass/includes/apps/video/getvideometadataxml.php?id=' + video_id,\n            video_id)\n\n        title = xpath_text(metadata, 'title', fatal=True)\n        video_url = xpath_text(metadata, 'url_flv', 'download url', True)\n        video_id_int = int(video_id)\n        for group in re.search(r'/myspass2009/\\d+/(\\d+)/(\\d+)/(\\d+)/', video_url).groups():\n            group_int = int(group)\n            if group_int > video_id_int:\n                video_url = video_url.replace(\n                    group, compat_str(group_int // video_id_int))\n\n        return {\n            'id': video_id,\n            'url': video_url,\n            'title': title,\n            'thumbnail': xpath_text(metadata, 'imagePreview'),\n            'description': xpath_text(metadata, 'description'),\n            'duration': parse_duration(xpath_text(metadata, 'duration')),\n            'series': xpath_text(metadata, 'format'),\n            'season_number': int_or_none(xpath_text(metadata, 'season')),\n            'season_id': xpath_text(metadata, 'season_id'),\n            'episode': title,\n            'episode_number': int_or_none(xpath_text(metadata, 'episode')),\n        }\n", "path": "youtube_dl/extractor/myspass.py"}], "after_files": [{"content": "# coding: utf-8\nfrom __future__ import unicode_literals\n\nimport re\n\nfrom .common import InfoExtractor\nfrom ..compat import compat_str\nfrom ..utils import (\n    int_or_none,\n    parse_duration,\n    xpath_text,\n)\n\n\nclass MySpassIE(InfoExtractor):\n    _VALID_URL = r'https?://(?:www\\.)?myspass\\.de/([^/]+/)*(?P<id>\\d+)'\n    _TEST = {\n        'url': 'http://www.myspass.de/myspass/shows/tvshows/absolute-mehrheit/Absolute-Mehrheit-vom-17022013-Die-Highlights-Teil-2--/11741/',\n        'md5': '0b49f4844a068f8b33f4b7c88405862b',\n        'info_dict': {\n            'id': '11741',\n            'ext': 'mp4',\n            'description': 'Wer kann in die Fu\u00dfstapfen von Wolfgang Kubicki treten und die Mehrheit der Zuschauer hinter sich versammeln? Wird vielleicht sogar die Absolute Mehrheit geknackt und der Jackpot von 200.000 Euro mit nach Hause genommen?',\n            'title': '17.02.2013 - Die Highlights, Teil 2',\n        },\n    }\n\n    def _real_extract(self, url):\n        video_id = self._match_id(url)\n\n        metadata = self._download_xml(\n            'http://www.myspass.de/myspass/includes/apps/video/getvideometadataxml.php?id=' + video_id,\n            video_id)\n\n        title = xpath_text(metadata, 'title', fatal=True)\n        video_url = xpath_text(metadata, 'url_flv', 'download url', True)\n        video_id_int = int(video_id)\n\n        grps = re.search(r'/myspass2009/\\d+/(\\d+)/(\\d+)/(\\d+)/', video_url)\n        for group in grps.groups() if grps else []:\n            group_int = int(group)\n            if group_int > video_id_int:\n                video_url = video_url.replace(\n                    group, compat_str(group_int // video_id_int))\n\n        return {\n            'id': video_id,\n            'url': video_url,\n            'title': title,\n            'thumbnail': xpath_text(metadata, 'imagePreview'),\n            'description': xpath_text(metadata, 'description'),\n            'duration': parse_duration(xpath_text(metadata, 'duration')),\n            'series': xpath_text(metadata, 'format'),\n            'season_number': int_or_none(xpath_text(metadata, 'season')),\n            'season_id': xpath_text(metadata, 'season_id'),\n            'episode': title,\n            'episode_number': int_or_none(xpath_text(metadata, 'episode')),\n        }\n", "path": "youtube_dl/extractor/myspass.py"}]}