Skip to content

Commit 2d74d4e

Browse files
committed
feat: handle 'av' format in BiliVideo initialization
1 parent ff47b78 commit 2d74d4e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

biliarchiver/rest_api/bilivid.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from enum import Enum
33
import time
44
from typing import Optional
5+
from biliarchiver.utils.avbv import av2bv, bv2av
56

67
class VideoStatus(str, Enum):
78
pending = "pending"
@@ -13,7 +14,11 @@ class VideoStatus(str, Enum):
1314

1415
class BiliVideo:
1516
def __init__(self, bvid: str, status: VideoStatus):
16-
if not bvid.startswith("BV"):
17+
if bvid.startswith("av"):
18+
bvid = av2bv(int(bvid[2:]))
19+
elif bvid.isdecimal():
20+
bvid = av2bv(int(bvid))
21+
elif not bvid.startswith("BV"):
1722
bvid = "BV" + bvid
1823
self.added_time = int(time.time())
1924
self.bvid = bvid

biliarchiver/utils/avbv.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# https://github.com/SocialSisterYi/bilibili-API-collect/issues/847#issuecomment-1807020675
2+
# Original code by @12345-mcpython
3+
XOR_CODE = 23442827791579
4+
MASK_CODE = 2251799813685247
5+
MAX_AID = 1 << 51
6+
ALPHABET = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"
7+
ENCODE_MAP = 8, 7, 0, 5, 1, 3, 2, 4, 6
8+
DECODE_MAP = tuple(reversed(ENCODE_MAP))
9+
10+
BASE = len(ALPHABET)
11+
PREFIX = "BV1"
12+
PREFIX_LEN = len(PREFIX)
13+
CODE_LEN = len(ENCODE_MAP)
14+
15+
def av2bv(aid: int) -> str:
16+
bvid = [""] * 9
17+
tmp = (MAX_AID | aid) ^ XOR_CODE
18+
for i in range(CODE_LEN):
19+
bvid[ENCODE_MAP[i]] = ALPHABET[tmp % BASE]
20+
tmp //= BASE
21+
return PREFIX + "".join(bvid)
22+
23+
def bv2av(bvid: str) -> int:
24+
assert bvid[:3] == PREFIX
25+
26+
bvid = bvid[3:]
27+
tmp = 0
28+
for i in range(CODE_LEN):
29+
idx = ALPHABET.index(bvid[DECODE_MAP[i]])
30+
tmp = tmp * BASE + idx
31+
return (tmp & MASK_CODE) ^ XOR_CODE

0 commit comments

Comments
 (0)