]> jfr.im git - yt-dlp.git/blobdiff - yt_dlp/extractor/audius.py
[ie/crunchyroll] Fix stream extraction (#10005)
[yt-dlp.git] / yt_dlp / extractor / audius.py
index 2cbc97fcd7a77e5ab77d0ca4c1b2102a806215e9..6448b449b90f844e4b26d12fc8f97454fd378e84 100644 (file)
@@ -1,12 +1,8 @@
-# coding: utf-8
-from __future__ import unicode_literals
-
 import random
-import re
 
 from .common import InfoExtractor
-from ..utils import ExtractorError, try_get, compat_str, str_or_none
-from ..compat import compat_urllib_parse_unquote
+from ..compat import compat_str, compat_urllib_parse_unquote
+from ..utils import ExtractorError, str_or_none, try_get
 
 
 class AudiusBaseIE(InfoExtractor):
@@ -124,7 +120,7 @@ class AudiusIE(AudiusBaseIE):
     }
 
     def _real_extract(self, url):
-        mobj = re.match(self._VALID_URL, url)
+        mobj = self._match_valid_url(url)
         track_id = try_get(mobj, lambda x: x.group('track_id'))
         if track_id is None:
             title = mobj.group('title')
@@ -172,7 +168,7 @@ def _real_extract(self, url):
         }
 
 
-class AudiusTrackIE(AudiusIE):
+class AudiusTrackIE(AudiusIE):  # XXX: Do not subclass from concrete IE
     _VALID_URL = r'''(?x)(?:audius:)(?:https?://(?:www\.)?.+/v1/tracks/)?(?P<track_id>\w+)'''
     IE_NAME = 'audius:track'
     IE_DESC = 'Audius track ID or API link. Prepend with "audius:"'
@@ -217,7 +213,7 @@ def _build_playlist(self, tracks):
 
     def _real_extract(self, url):
         self._select_api_base()
-        mobj = re.match(self._VALID_URL, url)
+        mobj = self._match_valid_url(url)
         title = mobj.group('title')
         # uploader = mobj.group('uploader')
         url = self._prepare_url(url, title)
@@ -245,3 +241,31 @@ def _real_extract(self, url):
         return self.playlist_result(entries, playlist_id,
                                     playlist_data.get('playlist_name', title),
                                     playlist_data.get('description'))
+
+
+class AudiusProfileIE(AudiusPlaylistIE):  # XXX: Do not subclass from concrete IE
+    IE_NAME = 'audius:artist'
+    IE_DESC = 'Audius.co profile/artist pages'
+    _VALID_URL = r'https?://(?:www)?audius\.co/(?P<id>[^\/]+)/?(?:[?#]|$)'
+    _TEST = {
+        'url': 'https://audius.co/pzl/',
+        'info_dict': {
+            'id': 'ezRo7',
+            'description': 'TAMALE\n\nContact: officialpzl@gmail.com',
+            'title': 'pzl',
+        },
+        'playlist_count': 24,
+    }
+
+    def _real_extract(self, url):
+        self._select_api_base()
+        profile_id = self._match_id(url)
+        try:
+            _profile_data = self._api_request('/full/users/handle/' + profile_id, profile_id)
+        except ExtractorError as e:
+            raise ExtractorError('Could not download profile info; ' + str(e))
+        profile_audius_id = _profile_data[0]['id']
+        profile_bio = _profile_data[0].get('bio')
+
+        api_call = self._api_request('/full/users/handle/%s/tracks' % profile_id, profile_id)
+        return self.playlist_result(self._build_playlist(api_call), profile_audius_id, profile_id, profile_bio)