diff --git a/src/you_get/extractor.py b/src/you_get/extractor.py index bd71717e72..dd800cd2eb 100644 --- a/src/you_get/extractor.py +++ b/src/you_get/extractor.py @@ -208,6 +208,8 @@ def download(self, **kwargs): key=lambda i: -self.dash_streams[i]['size']) stream_id = itags[0] else: + if not self.streams_sorted: + return stream_id = self.streams_sorted[0]['id'] if 'id' in self.streams_sorted[0] else self.streams_sorted[0]['itag'] if 'index' not in kwargs: diff --git a/src/you_get/extractors/bilibili.py b/src/you_get/extractors/bilibili.py index ea67f92fcf..75d15f6231 100644 --- a/src/you_get/extractors/bilibili.py +++ b/src/you_get/extractors/bilibili.py @@ -1,11 +1,14 @@ #!/usr/bin/env python +import hashlib +import math +import sys +import urllib +from collections import defaultdict +from itertools import count from ..common import * from ..extractor import VideoExtractor -import hashlib -import math - class Bilibili(VideoExtractor): name = "Bilibili" @@ -62,8 +65,10 @@ def height_to_quality(height, qn): @staticmethod def bilibili_headers(referer=None, cookie=None): # a reasonable UA - ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' - headers = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': ua} + # ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' + # headers = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': ua} + ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" + headers = {'User-Agent': ua} if referer is not None: headers.update({'Referer': referer}) if cookie is not None: @@ -72,7 +77,8 @@ def bilibili_headers(referer=None, cookie=None): @staticmethod def bilibili_api(avid, cid, qn=0): - return 'https://api.bilibili.com/x/player/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&fnver=0&fnval=4048&fourk=1' % (avid, cid, qn) + return 'https://api.bilibili.com/x/player/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&fnver=0&fnval=4048&fourk=1' % ( + avid, cid, qn) @staticmethod def bilibili_audio_api(sid): @@ -92,7 +98,8 @@ def bilibili_audio_menu_song_api(sid, ps=100): @staticmethod def bilibili_bangumi_api(avid, cid, ep_id, qn=0, fnval=16): - return 'https://api.bilibili.com/pgc/player/web/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&ep_id=%s&fnver=0&fnval=%s' % (avid, cid, qn, ep_id, fnval) + return 'https://api.bilibili.com/pgc/player/web/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&ep_id=%s&fnver=0&fnval=%s' % ( + avid, cid, qn, ep_id, fnval) @staticmethod def bilibili_interface_api(cid, qn=0): @@ -102,7 +109,6 @@ def bilibili_interface_api(cid, qn=0): chksum = hashlib.md5(bytes(params + sec, 'utf8')).hexdigest() return 'https://api.bilibili.com/x/player/wbi/v2?%s&sign=%s' % (params, chksum) - @staticmethod def bilibili_live_api(cid): return 'https://api.live.bilibili.com/room/v1/Room/playUrl?cid=%s&quality=0&platform=web' % cid @@ -115,25 +121,59 @@ def bilibili_live_room_info_api(room_id): def bilibili_live_room_init_api(room_id): return 'https://api.live.bilibili.com/room/v1/Room/room_init?id=%s' % room_id + # @staticmethod + # def bilibili_space_channel_api(mid, cid, pn=1, ps=100): + # return 'https://api.bilibili.com/x/space/channel/video?mid=%s&cid=%s&pn=%s&ps=%s&order=0&jsonp=jsonp' % (mid, cid, pn, ps) @staticmethod - def bilibili_space_channel_api(mid, cid, pn=1, ps=100): - return 'https://api.bilibili.com/x/space/channel/video?mid=%s&cid=%s&pn=%s&ps=%s&order=0&jsonp=jsonp' % (mid, cid, pn, ps) + # 合集列表 + def bilibili_space_seasons_series_list_api(mid, page_size=20, page_num=1): + return f"https://api.bilibili.com/x/polymer/web-space/seasons_series_list?mid={mid}&page_size={page_size}&page_num={page_num}&web_location=333.1387" + # @staticmethod + # def bilibili_space_collection_api(mid, cid, pn=1, ps=30): + # return 'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=%s&season_id=%s&sort_reverse=false&page_num=%s&page_size=%s' % (mid, cid, pn, ps) @staticmethod - def bilibili_space_collection_api(mid, cid, pn=1, ps=30): - return 'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=%s&season_id=%s&sort_reverse=false&page_num=%s&page_size=%s' % (mid, cid, pn, ps) + # 合集详情 + def bilibili_space_seasons_archives_list_api(mid, season_id, page_num=1, page_size=30): + return f"https://api.bilibili.com/x/polymer/web-space/seasons_archives_list?mid={mid}&season_id={season_id}&sort_reverse=false&page_size={page_size}&page_num={page_num}&web_location=333.1387" @staticmethod + # 视频列表详情 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) + 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_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) + 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) @staticmethod - def bilibili_space_video_api(mid, pn=1, ps=50): - return "https://api.bilibili.com/x/space/arc/search?mid=%s&pn=%s&ps=%s&tid=0&keyword=&order=pubdate&jsonp=jsonp" % (mid, pn, ps) + # up 所有视频 + def bilibili_space_video_api(mid, w_wedid=None, pn=1, ps=50): + paras = { + "pn": str(pn), + "ps": str(ps), + # "tid": "0", + # "special_type": "", + # "order": "pubdate", + "mid": mid, + # "index": "0", + # "keyword": "", + # "order_avoided": "true", + # "platform": "web", + # "web_location": "333.1387", + "dm_img_list": "[]", + "dm_img_str": "V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ", + "dm_cover_img_str": "QU5HTEUgKE5WSURJQSwgTlZJRElBIEdlRm9yY2UgR1RYIDE2NTAgKDB4MDAwMDFGOTkpIERpcmVjdDNEMTEgdnNfNV8wIHBzXzVfMCwgRDNEMTEpR29vZ2xlIEluYy4gKE5WSURJQS", + # "dm_img_inter": '{"ds":[{"t":1,"c":"","p":[],"s":[]}],"wh":[],"of":[]}', + # "w_webid": w_wedid, + } + w_rid, wts = Bilibili.get_w_rid(**paras) + paras.update({"w_rid": w_rid, "wts": wts}) + paras_list = [f"{k}={v}" for k, v in paras.items()] + paras_str = "&".join(paras_list) + return f"https://api.bilibili.com/x/space/wbi/arc/search?{paras_str}" @staticmethod def bilibili_vc_api(video_id): @@ -144,12 +184,39 @@ def bilibili_h_api(doc_id): return 'https://api.vc.bilibili.com/link_draw/v1/doc/detail?doc_id=%s' % doc_id @staticmethod - def url_size(url, faker=False, headers={},err_value=0): + def url_size(url, faker=False, headers={}, err_value=0): try: - return url_size(url,faker,headers) + return url_size(url, faker, headers) except: return err_value + @staticmethod + def get_w_webid(html_content): + innerText = r1(r'