Module:ABV
来自Vocawiki
更多操作
模块文档
简介
这个模块可以计算av号和BV号之间的自动转换。
用法
通过 #invoke 调用
{{#invoke:ABV|encode_from_frame|170001}}→ BV17x411w7KC{{#invoke:ABV|encode_from_frame|av170001}}→ BV17x411w7KC{{#invoke:ABV|decode_from_frame|BV17x411w7KC}}→ av170001
通过 require 调用
local ABV = require("Module:ABV")
local bv1 = ABV.encode(170001)
local bv2 = ABV.encode("av170001")
local av = ABV.decode("BV17x411w7KC")
--[[
Modified from https://github.com/chenxuuu/bv2av/blob/adefb17/bv2av.lua
Updated data from https://github.com/SocialSisterYi/bilibili-API-collect/blob/ea76fb0/docs/misc/bvid_desc.md
Originally from python code: https://www.zhihu.com/question/381784377/answer/1099438784
]]
bit32 = require( 'bit32' )
local p = {}
local it = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"
local tr = {}
for i=0,#it-1 do
tr[it:sub(i+1,i+1)] = i
end
local s = {12, 11, 4, 9, 5, 7, 6, 8, 10}
local xor = 23442827791579
local add = 2251799813685248 -- 2^51
local limit32 = 4294967296
-- 沟槽的Lua只有int32,需要模拟64位异或
function p.xor64(x, y)
local lowx = x % limit32
local lowy = y % limit32
local highx = (x-lowx) / limit32
local highy = (y-lowy) / limit32
return bit32.bxor(lowx, lowy)
+ bit32.bxor(highx, highy) * limit32
end
function p.decode(x)
local r = 0
for i=1,9 do
r = r + tr[x:sub(s[i],s[i])] * 58 ^ (i - 1)
end
return "av"..p.xor64((r - add), xor)
end
function p.encode(x)
if string.match(x, "^av") then
x = string.sub(x, 3)
end
local xt = p.xor64(x + add, xor)
local r = {"B", "V", "1"}
for i=1,9 do
local lt = math.floor(xt/58^(i-1))%58
r[s[i]] = it:sub(lt+1,lt+1)
end
return table.concat(r)
end
function p.decode_from_frame(frame)
return p.decode(frame.args[1])
end
function p.encode_from_frame(frame)
return p.encode(frame.args[1])
end
return p