forked from pangguy/bilibiliAudioDownloader-1
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
93 lines (82 loc) · 2.96 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from urllib import error
import requests
import urllib
import time
import sys
def getData(url):
resp = requests.get(url)
if resp.status_code >= 300:
print("HTTP ERROR:", resp.status_code)
return False
jsonData = resp.json()
if "data" not in jsonData:
print("找不到数据")
return False
return resp.json()['data']
def getCidAndTitle(bvid,p=1):
url='https://api.bilibili.com/x/web-interface/view?bvid='+bvid
data = getData(url)
if data != False:
title=data['title']
cid=data['pages'][p-1]['cid']
return str(cid),title
else:
return False,False
def getInformation(bvList):
infoList=[]
for bvid in bvList:
item=[]
if len(bvid) < 12:
print("BVID 格式错误")
continue
elif len(bvid) == 12:
cid,title=getCidAndTitle(bvid)
if(cid == False):
continue
item.append(bvid)
else:
cid,title=getCidAndTitle(bvid[:12],int(bvid[13:]))
if(cid == False):
continue
item.append(bvid[:12])
item.append(cid)
item.append(title)
infoList.append(item)
return infoList
def getAudio(infoList):
baseUrl='http://api.bilibili.com/x/player/playurl?fnval=16&'
for item in infoList:
st=time.time()
bvid,cid,title=item[0],item[1],item[2]
url=baseUrl+'bvid='+bvid+'&cid='+cid
audioUrl=requests.get(url).json()['data']['dash']['audio'][0]['baseUrl']
opener = urllib.request.build_opener()
opener.addheaders = [
('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0) Gecko/20100101 Firefox/56.0'),
('Accept', '*/*'),
('Accept-Language', 'en-US,en;q=0.5'),
('Accept-Encoding', 'gzip, deflate, br'),
('Range', 'bytes=0-'),
('Referer', 'https://api.bilibili.com/x/web-interface/view?bvid='+bvid), # 注意修改referer,必须要加的!
('Origin', 'https://www.bilibili.com'),
('Connection', 'keep-alive'),
]
urllib.request.install_opener(opener)
if "/" in title:
title = " ".join(title.split("/"))
if '\\' in title:
title = " ".join(title.split("\\"))
try:
urllib.request.urlretrieve(url=audioUrl, filename='download/'+title+'.mp3')
except (HTTPError, URLError, ContentTooShortError) as e:
print("下载失败,因为:", e)
ed=time.time()
print(str(round(ed-st,2))+' seconds download finish:',title)
time.sleep(1)
if __name__ == '__main__':
BVList = sys.argv[1:]
print(f'Downloader Start! {BVList}')
st=time.time()
getAudio(getInformation(BVList))
ed=time.time()
print('Download Finish All! Time consuming:',str(round(ed-st,2))+' seconds')