From a53d158ee6e1422e85bb1f3197e887242da6227d Mon Sep 17 00:00:00 2001 From: GalaxySnail Date: Thu, 8 Feb 2024 18:14:17 +0800 Subject: [PATCH 1/4] =?UTF-8?q?docs/misc/bvid=5Fdesc.md:=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=A4=9A=E4=BD=99=E7=9A=84=E8=A1=8C=E5=B0=BE=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/misc/bvid_desc.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md index fef5c11..d61830c 100644 --- a/docs/misc/bvid_desc.md +++ b/docs/misc/bvid_desc.md @@ -26,9 +26,9 @@ ## 算法概述 -~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~ -~~实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~ -实际上上面的算法依然不完整,新的算法参考自 [SocialSisterYi#740](https://github.com/SocialSisterYi/bilibili-API-collect/issues/740)~~来自 B 站某个 JS 文件?~~ +~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~ +~~实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~ +实际上上面的算法依然不完整,新的算法参考自 [SocialSisterYi#740](https://github.com/SocialSisterYi/bilibili-API-collect/issues/740)~~来自 B 站某个 JS 文件?~~ ### av->bv算法 @@ -69,7 +69,7 @@ - + ```javascript const XOR_CODE = 23442827791579n; const MASK_CODE = 2251799813685247n; @@ -174,7 +174,7 @@ def av2bv(aid: int) -> str: def bv2av(bvid: str) -> int: assert bvid[:3] == PREFIX - + bvid = list(bvid[3:]) tmp = 0 for i in range(CODE_LEN): @@ -207,16 +207,16 @@ func av2bv(avid: UInt64) -> String { var bytes: [UInt8] = [66, 86, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48] var bvIdx = BV_LEN - 1 var tmp = (MAX_AID | avid) ^ XOR_CODE - + while tmp != 0 { bytes[bvIdx] = data[Int(tmp % BASE)] tmp /= BASE bvIdx -= 1 } - + bytes.swapAt(3, 9) bytes.swapAt(4, 7) - + return String(decoding: bytes, as: UTF8.self) } @@ -228,20 +228,20 @@ func bv2av(bvid: String) -> UInt64 { fixedBvid = "BV" + bvid } var bvidArray = Array(fixedBvid.utf8) - + bvidArray.swapAt(3, 9) bvidArray.swapAt(4, 7) - + let trimmedBvid = String(decoding: bvidArray[3...], as: UTF8.self) - + var tmp: UInt64 = 0 - + for char in trimmedBvid { if let idx = data.firstIndex(of: char.utf8.first!) { tmp = tmp * BASE + UInt64(idx) } } - + return (tmp & MASK_CODE) ^ XOR_CODE } From 6fd4109cc0fee441271d664d53449e7849333639 Mon Sep 17 00:00:00 2001 From: GalaxySnail Date: Thu, 8 Feb 2024 18:15:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?docs/misc/bvid=5Fdesc.md:=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=9C=AA=E4=BD=BF=E7=94=A8=E7=9A=84=20BV=5FLEN=20?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/misc/bvid_desc.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md index d61830c..bf14b86 100644 --- a/docs/misc/bvid_desc.md +++ b/docs/misc/bvid_desc.md @@ -162,7 +162,6 @@ BASE = len(ALPHABET) PREFIX = "BV1" PREFIX_LEN = len(PREFIX) CODE_LEN = len(ENCODE_MAP) -BV_LEN = PREFIX_LEN + CODE_LEN def av2bv(aid: int) -> str: bvid = [""] * 9 From 3387e547bbd1d9b60ecebaeb542d6bce0bbb314f Mon Sep 17 00:00:00 2001 From: GalaxySnail Date: Thu, 8 Feb 2024 18:17:04 +0800 Subject: [PATCH 3/4] =?UTF-8?q?docs/misc/bvid=5Fdesc.md:=20=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=95=B4=E6=95=B0=E9=99=A4=E6=B3=95=E4=BB=A3=E6=9B=BF?= =?UTF-8?q?=E6=B5=AE=E7=82=B9=E6=95=B0=E9=99=A4=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bv号av号转换算法本质上是一种修改过的 base58 运算,参与运算的类型都是 整数类型,所以不应该使用浮点数除法 /= 而应该使用整数除法 //= 这也修复了 mypy 的类型不匹配报错,tmp 变量被推断为整数,而 `tmp /= BASE` 相当于 `tmp = tmp / BASE`,将浮点数赋值给整数,类型不匹配 --- docs/misc/bvid_desc.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md index bf14b86..97a6bd0 100644 --- a/docs/misc/bvid_desc.md +++ b/docs/misc/bvid_desc.md @@ -167,8 +167,8 @@ def av2bv(aid: int) -> str: bvid = [""] * 9 tmp = (MAX_AID | aid) ^ XOR_CODE for i in range(CODE_LEN): - bvid[ENCODE_MAP[i]] = ALPHABET[int(tmp % BASE)] - tmp /= BASE + bvid[ENCODE_MAP[i]] = ALPHABET[tmp % BASE] + tmp //= BASE return PREFIX + "".join(bvid) def bv2av(bvid: str) -> int: From 7b22c145d25f3ad725fce78c525254ebe60cf673 Mon Sep 17 00:00:00 2001 From: GalaxySnail Date: Thu, 8 Feb 2024 18:23:55 +0800 Subject: [PATCH 4/4] =?UTF-8?q?docs/misc/bvid=5Fdesc.md:=20=E4=B8=8D?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E5=B0=86=20bvid=20=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E4=B8=BA=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 bv2av 函数中,bvid 是输入,是不可变的,只需要索引访问,因此不需要 转换为 list 类型。 这修复了 mypy 报告的类型不匹配错误,bvid 是一个 str,不能将 list 类型 赋值给它。 --- docs/misc/bvid_desc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md index 97a6bd0..86c80c6 100644 --- a/docs/misc/bvid_desc.md +++ b/docs/misc/bvid_desc.md @@ -174,7 +174,7 @@ def av2bv(aid: int) -> str: def bv2av(bvid: str) -> int: assert bvid[:3] == PREFIX - bvid = list(bvid[3:]) + bvid = bvid[3:] tmp = 0 for i in range(CODE_LEN): idx = ALPHABET.index(bvid[DECODE_MAP[i]])