Skip to content

Commit d2e53b1

Browse files
authored
Merge pull request #666 from nooblong/to-pr
fix: bvid2aid
2 parents 55a51c6 + 9b7a8de commit d2e53b1

File tree

1 file changed

+28
-36
lines changed

1 file changed

+28
-36
lines changed

bilibili_api/utils/aid_bvid_transformer.py

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,57 +6,49 @@
66
此部分代码以 WTFPL 开源。
77
"""
88

9+
XOR_CODE = 23442827791579
10+
MASK_CODE = 2251799813685247
11+
MAX_AID = 1 << 51
12+
13+
data = [b'F', b'c', b'w', b'A', b'P', b'N', b'K', b'T', b'M', b'u', b'g', b'3', b'G', b'V', b'5', b'L', b'j', b'7', b'E', b'J', b'n', b'H', b'p', b'W', b's', b'x', b'4', b't', b'b', b'8', b'h', b'a', b'Y', b'e', b'v', b'i', b'q', b'B', b'z', b'6', b'r', b'k', b'C', b'y', b'1', b'2', b'm', b'U', b'S', b'D', b'Q', b'X', b'9', b'R', b'd', b'o', b'Z', b'f']
14+
15+
BASE = 58
16+
BV_LEN = 12
17+
PREFIX = "BV1"
918

1019
def bvid2aid(bvid: str) -> int:
1120
"""
1221
BV 号转 AV 号。
13-
1422
Args:
1523
bvid (str): BV 号。
16-
1724
Returns:
1825
int: AV 号。
1926
"""
20-
table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
21-
tr = {}
22-
for i in range(58):
23-
tr[table[i]] = i
24-
s = [11, 10, 3, 8, 4, 6]
25-
xor = 177451812
26-
add = 8728348608
27-
28-
def dec(x):
29-
r = 0
30-
for i in range(6):
31-
r += tr[x[s[i]]] * 58**i
32-
return (r - add) ^ xor
33-
34-
return dec(bvid)
35-
27+
bvid = list(bvid)
28+
bvid[3], bvid[9] = bvid[9], bvid[3]
29+
bvid[4], bvid[7] = bvid[7], bvid[4]
30+
bvid = bvid[3:]
31+
tmp = 0
32+
for i in bvid:
33+
idx = data.index(i.encode())
34+
tmp = tmp * BASE + idx
35+
return (tmp & MASK_CODE) ^ XOR_CODE
3636

3737
def aid2bvid(aid: int) -> str:
3838
"""
3939
AV 号转 BV 号。
40-
4140
Args:
4241
aid (int): AV 号。
43-
4442
Returns:
4543
str: BV 号。
4644
"""
47-
table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"
48-
tr = {}
49-
for i in range(58):
50-
tr[table[i]] = i
51-
s = [11, 10, 3, 8, 4, 6]
52-
xor = 177451812
53-
add = 8728348608
54-
55-
def enc(x):
56-
x = (x ^ xor) + add
57-
r = list("BV1 4 1 7 ")
58-
for i in range(6):
59-
r[s[i]] = table[x // 58**i % 58]
60-
return "".join(r)
61-
62-
return enc(aid)
45+
bytes = [b'B', b'V', b'1', b'0', b'0', b'0', b'0', b'0', b'0', b'0', b'0', b'0']
46+
bv_idx = BV_LEN - 1
47+
tmp = (MAX_AID | aid) ^ XOR_CODE
48+
while int(tmp) != 0:
49+
bytes[bv_idx] = data[int(tmp % BASE)]
50+
tmp /= BASE
51+
bv_idx -= 1
52+
bytes[3], bytes[9] = bytes[9], bytes[3]
53+
bytes[4], bytes[7] = bytes[7], bytes[4]
54+
return "".join([i.decode() for i in bytes])

0 commit comments

Comments
 (0)