Repository: yt-dlp/yt-dlp

Issue:
[Broken] Motherless.com
## Checklist
- [X] I'm reporting a broken site support
- [X] I've verified that I'm running yt-dlp version **2021.08.10**
- [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
PASTE VERBOSE LOG HERE

```

Sat Aug 28@09:25:01]admin@roswell[/Volumes/10T/testing]$yt-dlp --concurrent-fragments 5 --no-mtime --no-check-certificate -i --verbose https://motherless.com/g/best_bikini_s/C59448D
[debug] Command-line config: ['--concurrent-fragments', '5', '--no-mtime', '--no-check-certificate', '-i', '--verbose', 'https://motherless.com/g/best_bikini_s/C59448D']
[debug] Encodings: locale UTF-8, fs utf-8, out utf-8, pref UTF-8
[debug] yt-dlp version 2021.08.10 (zip)
[debug] Python version 3.9.6 (CPython 64bit) - macOS-11.5.2-x86_64-i386-64bit
[debug] exe versions: ffmpeg 4.4, ffprobe 4.4, rtmpdump 2.4
[debug] Optional libraries: sqlite
[debug] Proxy map: {}
[debug] [Motherless] Extracting URL: https://motherless.com/g/best_bikini_s/C59448D
[Motherless] C59448D: Downloading webpage
ERROR: Unable to extract uploader_id; please report this issue on  https://github.com/yt-dlp/yt-dlp . Make sure you are using the latest version; see  https://github.com/yt-dlp/yt-dlp  on how to update. Be sure to call yt-dlp with the --verbose flag and include its complete output.
Traceback (most recent call last):
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1199, in wrapper
    return func(self, *args, **kwargs)
  File "/usr/local/bin/yt-dlp/yt_dlp/YoutubeDL.py", line 1224, in __extract_info
    ie_result = ie.extract(url)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 575, in extract
    ie_result = self._real_extract(url)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/motherless.py", line 129, in _real_extract
    uploader_id = self._html_search_regex(
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1142, in _html_search_regex
    res = self._search_regex(pattern, string, name, default, fatal, flags, group)
  File "/usr/local/bin/yt-dlp/yt_dlp/extractor/common.py", line 1133, in _search_regex
    raise RegexNotFoundError('Unable to extract %s' % _name)
yt_dlp.utils.RegexNotFoundError: Unable to extract uploader_id; please report this issue on  https://github.com/yt-dlp/yt-dlp . Make sure you are using the latest version; see  https://github.com/yt-dlp/yt-dlp  on how to update. Be sure to call yt-dlp with the --verbose flag and include its complete output.

[Sat Aug 28@09:25:14]admin@roswell[/Volumes/10T/testing]$yt-dlp -U                                                                                                                    
Current Build Hash 41bb52a3b024961237339368b62ed89920305361f8c931205916ff5da93e64bc
yt-dlp is up to date (2021.08.10)

```

## Description

yt-dlp fails to download Motherless videos.
yt_dlp.utils.RegexNotFoundError: Unable to extract uploader_id;




Discussion:

Resolving patch:
diff --git a/yt_dlp/extractor/motherless.py b/yt_dlp/extractor/motherless.py
--- a/yt_dlp/extractor/motherless.py
+++ b/yt_dlp/extractor/motherless.py
@@ -127,9 +127,9 @@ def _real_extract(self, url):
 
         comment_count = webpage.count('class="media-comment-contents"')
         uploader_id = self._html_search_regex(
-            r'"thumb-member-username">\s+<a href="/m/([^"]+)"',
-            webpage, 'uploader_id')
-
+            (r'"media-meta-member">\s+<a href="/m/([^"]+)"',
+             r'<span\b[^>]+\bclass="username">([^<]+)</span>'),
+            webpage, 'uploader_id', fatal=False)
         categories = self._html_search_meta('keywords', webpage, default=None)
         if categories:
             categories = [cat.strip() for cat in categories.split(',')]
@@ -169,7 +169,18 @@ class MotherlessGroupIE(InfoExtractor):
             'description': 'Sex can be funny. Wide smiles,laugh, games, fun of '
                            'any kind!'
         },
-        'playlist_mincount': 9,
+        'playlist_mincount': 0,
+        'expected_warnings': [
+            'This group has no videos.',
+        ]
+    }, {
+        'url': 'https://motherless.com/g/beautiful_cock',
+        'info_dict': {
+            'id': 'beautiful_cock',
+            'title': 'Beautiful Cock',
+            'description': 'Group for lovely cocks yours, mine, a friends anything human',
+        },
+        'playlist_mincount': 2500,
     }]
 
     @classmethod
@@ -209,11 +220,18 @@ def _real_extract(self, url):
         description = self._html_search_meta(
             'description', webpage, fatal=False)
         page_count = self._int(self._search_regex(
-            r'(\d+)</(?:a|span)><(?:a|span)[^>]+>\s*NEXT',
-            webpage, 'page_count'), 'page_count')
+            r'(\d+)</(?:a|span)><(?:a|span)[^>]+rel="next">',
+            webpage, 'page_count', default=0), 'page_count')
+        if not page_count:
+            message = self._search_regex(
+                r'class="error-page"[^>]*>\s*<p[^>]*>\s*(?P<error_msg>[^<]+)(?<=\S)\s*',
+                webpage, 'error_msg', default=None) or 'This group has no videos.'
+            self.report_warning(message, group_id)
         PAGE_SIZE = 80
 
         def _get_page(idx):
+            if not page_count:
+                return
             webpage = self._download_webpage(
                 page_url, group_id, query={'page': idx + 1},
                 note='Downloading page %d/%d' % (idx + 1, page_count)


Test patch: