From e85ca3eb3c84558c8fcff7d0cb8defc898e0a783 Mon Sep 17 00:00:00 2001 From: Jian Wang Date: Wed, 15 Dec 2021 09:43:09 +0800 Subject: [PATCH] support channel/collection for bilibili --- src/you_get/extractors/bilibili.py | 20 ++++++++++++++++++++ tests/test.py | 1 + 2 files changed, 21 insertions(+) diff --git a/src/you_get/extractors/bilibili.py b/src/you_get/extractors/bilibili.py index 5cd47e1050..62829c1488 100644 --- a/src/you_get/extractors/bilibili.py +++ b/src/you_get/extractors/bilibili.py @@ -116,6 +116,10 @@ def bilibili_space_channel_api(mid, cid, pn=1, ps=100): def bilibili_series_archives_api(mid, sid, pn=1, ps=100): return 'https://api.bilibili.com/x/series/archives?mid=%s&series_id=%s&pn=%s&ps=%s&only_normal=true&sort=asc&jsonp=jsonp' % (mid, sid, pn, ps) + @staticmethod + def bilibili_seasons_archives_api(mid, sid, pn=1, ps=100): + return 'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=%s&season_id=%s&page_num=%s&page_size=%s&sort_reverse=false' % (mid, sid, pn, ps) + @staticmethod def bilibili_space_favlist_api(fid, pn=1, ps=20): return 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&pn=%s&ps=%s&order=mtime&type=0&tid=0&jsonp=jsonp' % (fid, pn, ps) @@ -604,6 +608,8 @@ def download_playlist_by_url(self, url, **kwargs): sort = 'space_channel' elif re.match(r'https?://space\.?bilibili\.com/(\d+)/channel/seriesdetail\?.*sid=(\d+)', self.url): sort = 'space_channel_series' + elif re.match(r'https?://space\.?bilibili\.com/(\d+)/channel/collectiondetail\?.*sid=(\d+)', self.url): + sort = 'space_channel_collection' elif re.match(r'https?://space\.?bilibili\.com/(\d+)/favlist\?.*fid=(\d+)', self.url): sort = 'space_favlist' elif re.match(r'https?://space\.?bilibili\.com/(\d+)/video', self.url): @@ -728,6 +734,20 @@ def download_playlist_by_url(self, url, **kwargs): url = 'https://www.bilibili.com/video/av%s' % video['aid'] self.__class__().download_playlist_by_url(url, **kwargs) + elif sort == 'space_channel_collection': + m = re.match(r'https?://space\.?bilibili\.com/(\d+)/channel/collectiondetail\?.*sid=(\d+)', self.url) + mid, sid = m.group(1), m.group(2) + api_url = self.bilibili_seasons_archives_api(mid, sid) + api_content = get_content(api_url, headers=self.bilibili_headers(referer=self.url)) + archives_info = json.loads(api_content) + # TBD: channel of more than 100 videos + + epn, i = len(archives_info['data']['archives']), 0 + for video in archives_info['data']['archives']: + i += 1; log.w('Extracting %s of %s videos ...' % (i, epn)) + url = 'https://www.bilibili.com/video/av%s' % video['aid'] + self.__class__().download_playlist_by_url(url, **kwargs) + elif sort == 'space_favlist': m = re.match(r'https?://space\.?bilibili\.com/(\d+)/favlist\?.*fid=(\d+)', self.url) vmid, fid = m.group(1), m.group(2) diff --git a/tests/test.py b/tests/test.py index f3d45b97b2..44a387ca1b 100644 --- a/tests/test.py +++ b/tests/test.py @@ -42,6 +42,7 @@ def test_acfun(self): def test_bilibili(self): bilibili.download('https://space.bilibili.com/72270557/channel/seriesdetail?sid=218844', info_only=True) + bilibili.download('https://space.bilibili.com/72270557/channel/collectiondetail?sid=254', info_only=True) #def test_soundcloud(self): ## single song