Repository: yt-dlp/yt-dlp

Issue:
Please add support for beatbump.ml
### DO NOT REMOVE OR SKIP THE ISSUE TEMPLATE

- [X] I understand that I will be **blocked** if I remove or skip any mandatory\* field

### Checklist

- [X] I'm reporting a new site support request
- [X] I've verified that I'm running yt-dlp version **2022.08.08** ([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 checked that none of provided URLs [violate any copyrights](https://github.com/ytdl-org/youtube-dl#can-you-add-support-for-this-anime-video-site-or-site-which-shows-current-movies-for-free) or contain any [DRM](https://en.wikipedia.org/wiki/Digital_rights_management) to the best of my knowledge
- [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)
- [X] 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 am willing to share it if required

### Region

Wordwide (I suppose)

### Example URLs

Single audio: `https://beatbump.ml/listen?id=lYBUbBu4W08`
Playlist: `https://beatbump.ml/playlist/VLPL2MI040U_GXq1L5JUxNOulWCyXn-7QyZK`
Artist: `https://beatbump.ml/artist/UCwZEU0wAwIyZb4x5G_KJp2w`

### Provide a description that is worded well enough to be understood

Beatbump.ml is an opensource alternative to youtube music (music.youtube.com), in the same way that invidious (instances) is an opensource alternative to youtube. And since yt-dlp already supports invidious, I think it would be nice to add support for beatbump.ml as well

Afaik, beatbump.ml is the only instance of it right now and its source code is located here
https://github.com/snuffyDev/Beatbump

### 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
$ yt-dlp -vU https://beatbump.ml/listen?id=lYBUbBu4W08
[debug] Command-line config: ['-vU', 'https://beatbump.ml/listen?id=lYBUbBu4W08']
[debug] Encodings: locale UTF-8, fs utf-8, pref UTF-8, out utf-8, error utf-8, screen utf-8
[debug] yt-dlp version 2022.08.08 [3157158f7]
[debug] Python 3.10.5 (CPython 64bit) - Linux-5.18.0-3-amd64-x86_64-with-glibc2.33 (glibc 2.33)
[debug] Checking exe version: ffmpeg -bsfs
[debug] Checking exe version: ffprobe -bsfs
[debug] exe versions: ffmpeg 5.1 (fdk,setts), ffprobe 5.1
[debug] Optional libraries: Cryptodome-3.11.0, brotli-1.0.9, certifi-2020.06.20, mutagen-1.45.1, sqlite3-2.6.0, websockets-10.2
[debug] Proxy map: {}
[debug] Fetching release info: https://api.github.com/repos/yt-dlp/yt-dlp/releases/latest
Latest version: 2022.08.08, Current version: 2022.08.08
yt-dlp is up to date (2022.08.08)
[debug] [generic] Extracting URL: https://beatbump.ml/listen?id=lYBUbBu4W08
[generic] listen?id=lYBUbBu4W08: Downloading webpage
WARNING: [generic] Falling back on generic information extractor
[generic] listen?id=lYBUbBu4W08: Extracting information
[debug] Looking for Brightcove embeds
[debug] Looking for embeds
ERROR: Unsupported URL: https://beatbump.ml/listen?id=lYBUbBu4W08
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/yt_dlp/YoutubeDL.py", line 1441, in wrapper
    return func(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/yt_dlp/YoutubeDL.py", line 1517, in __extract_info
    ie_result = ie.extract(url)
  File "/usr/lib/python3/dist-packages/yt_dlp/extractor/common.py", line 666, in extract
    ie_result = self._real_extract(url)
  File "/usr/lib/python3/dist-packages/yt_dlp/extractor/generic.py", line 3077, in _real_extract
    raise UnsupportedError(url)
yt_dlp.utils.UnsupportedError: Unsupported URL: https://beatbump.ml/listen?id=lYBUbBu4W08
```



Discussion:
yt-dl/p doesn't really support invidious. We really just redirect the URL to YouTube. Is a similar implementation satisfactory here?
Sure, why not. The urls have to be changed a bit so as to be compatible with youtube music.
The one for the song becomes
`https://music.youtube.com/watch?v=lYBUbBu4W08`
The one for the playlist becomes
`https://music.youtube.com/playlist?list=PL2MI040U_GXq1L5JUxNOulWCyXn-7QyZK`
The one for the artist becomes
`https://music.youtube.com/channel/UCwZEU0wAwIyZb4x5G_KJp2w`

There is something I am missing, because youtube music also lists albums as an option, but beetbump does not have a similar one.
About the albums. I think that the youtube url for an album looks like so 
`https://music.youtube.com/browse/MPREb_VypETWxvz0t`
and becomes this in beatbump
`https://beatbump.ml/release?id=MPREb_VypETWxvz0t`
The youtube url changes to a playlist one when clicked, so it was a bit hard to find it.

And sorry for using an artist/album that I actually listen to :P

Resolving patch:
diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -172,6 +172,10 @@
 from .beeg import BeegIE
 from .behindkink import BehindKinkIE
 from .bellmedia import BellMediaIE
+from .beatbump import (
+    BeatBumpVideoIE,
+    BeatBumpPlaylistIE,
+)
 from .beatport import BeatportIE
 from .berufetv import BerufeTVIE
 from .bet import BetIE
diff --git a/yt_dlp/extractor/beatbump.py b/yt_dlp/extractor/beatbump.py
new file mode 100644
--- /dev/null
+++ b/yt_dlp/extractor/beatbump.py
@@ -0,0 +1,101 @@
+from .common import InfoExtractor
+from .youtube import YoutubeIE, YoutubeTabIE
+
+
+class BeatBumpVideoIE(InfoExtractor):
+    _VALID_URL = r'https://beatbump\.ml/listen\?id=(?P<id>[\w-]+)'
+    _TESTS = [{
+        'url': 'https://beatbump.ml/listen?id=MgNrAu2pzNs',
+        'md5': '5ff3fff41d3935b9810a9731e485fe66',
+        'info_dict': {
+            'id': 'MgNrAu2pzNs',
+            'ext': 'mp4',
+            'uploader_url': 'http://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAA',
+            'artist': 'Stephen',
+            'thumbnail': 'https://i.ytimg.com/vi_webp/MgNrAu2pzNs/maxresdefault.webp',
+            'channel_url': 'https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAA',
+            'upload_date': '20190312',
+            'categories': ['Music'],
+            'playable_in_embed': True,
+            'duration': 169,
+            'like_count': int,
+            'alt_title': 'Voyeur Girl',
+            'view_count': int,
+            'track': 'Voyeur Girl',
+            'uploader': 'Stephen - Topic',
+            'title': 'Voyeur Girl',
+            'channel_follower_count': int,
+            'uploader_id': 'UC-pWHpBjdGG69N9mM2auIAA',
+            'age_limit': 0,
+            'availability': 'public',
+            'live_status': 'not_live',
+            'album': 'it\'s too much love to know my dear',
+            'channel': 'Stephen',
+            'comment_count': int,
+            'description': 'md5:7ae382a65843d6df2685993e90a8628f',
+            'tags': 'count:11',
+            'creator': 'Stephen',
+            'channel_id': 'UC-pWHpBjdGG69N9mM2auIAA',
+        }
+    }]
+
+    def _real_extract(self, url):
+        id_ = self._match_id(url)
+        return self.url_result(f'https://music.youtube.com/watch?v={id_}', YoutubeIE, id_)
+
+
+class BeatBumpPlaylistIE(InfoExtractor):
+    _VALID_URL = r'https://beatbump\.ml/(?:release\?id=|artist/|playlist/)(?P<id>[\w-]+)'
+    _TESTS = [{
+        'url': 'https://beatbump.ml/release?id=MPREb_gTAcphH99wE',
+        'playlist_count': 50,
+        'info_dict': {
+            'id': 'OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0',
+            'availability': 'unlisted',
+            'view_count': int,
+            'title': 'Album - Royalty Free Music Library V2 (50 Songs)',
+            'description': '',
+            'tags': [],
+            'modified_date': '20221223',
+        }
+    }, {
+        'url': 'https://beatbump.ml/artist/UC_aEa8K-EOJ3D6gOs7HcyNg',
+        'playlist_mincount': 1,
+        'params': {'flatplaylist': True},
+        'info_dict': {
+            'id': 'UC_aEa8K-EOJ3D6gOs7HcyNg',
+            'uploader_url': 'https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNg',
+            'channel_url': 'https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNg',
+            'uploader_id': 'UC_aEa8K-EOJ3D6gOs7HcyNg',
+            'channel_follower_count': int,
+            'title': 'NoCopyrightSounds - Videos',
+            'uploader': 'NoCopyrightSounds',
+            'description': 'md5:cd4fd53d81d363d05eee6c1b478b491a',
+            'channel': 'NoCopyrightSounds',
+            'tags': 'count:12',
+            'channel_id': 'UC_aEa8K-EOJ3D6gOs7HcyNg',
+        },
+    }, {
+        'url': 'https://beatbump.ml/playlist/VLPLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq',
+        'playlist_mincount': 1,
+        'params': {'flatplaylist': True},
+        'info_dict': {
+            'id': 'PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq',
+            'uploader_url': 'https://www.youtube.com/@NoCopyrightSounds',
+            'description': 'Providing you with copyright free / safe music for gaming, live streaming, studying and more!',
+            'view_count': int,
+            'channel_url': 'https://www.youtube.com/@NoCopyrightSounds',
+            'uploader_id': 'UC_aEa8K-EOJ3D6gOs7HcyNg',
+            'title': 'NCS : All Releases 💿',
+            'uploader': 'NoCopyrightSounds',
+            'availability': 'public',
+            'channel': 'NoCopyrightSounds',
+            'tags': [],
+            'modified_date': '20221225',
+            'channel_id': 'UC_aEa8K-EOJ3D6gOs7HcyNg',
+        }
+    }]
+
+    def _real_extract(self, url):
+        id_ = self._match_id(url)
+        return self.url_result(f'https://music.youtube.com/browse/{id_}', YoutubeTabIE, id_)


Test patch: