打开/关闭菜单
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
登录后可编辑和发表评论。

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