update
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
local utils = require("mp.utils")
|
||||
local unpack = unpack or table.unpack
|
||||
|
||||
-- from http://lua-users.org/wiki/LuaUnicode
|
||||
local UTF8_PATTERN = '[%z\1-\127\194-\244][\128-\191]*'
|
||||
@@ -210,6 +211,31 @@ function hex_to_char(x)
|
||||
return string.char(tonumber(x, 16))
|
||||
end
|
||||
|
||||
function hex_to_int_color(hex_color)
|
||||
-- 移除颜色代码中的'#'字符
|
||||
hex_color = hex_color:sub(2) -- 只保留颜色代码部分
|
||||
|
||||
-- 提取R, G, B的十六进制值并转为整数
|
||||
local r = tonumber(hex_color:sub(1, 2), 16)
|
||||
local g = tonumber(hex_color:sub(3, 4), 16)
|
||||
local b = tonumber(hex_color:sub(5, 6), 16)
|
||||
|
||||
-- 计算32位整数值
|
||||
local color_int = (r * 256 * 256) + (g * 256) + b
|
||||
|
||||
return color_int
|
||||
end
|
||||
|
||||
local function get_type_from_position(position)
|
||||
if position == 0 then
|
||||
return 1
|
||||
end
|
||||
if position == 1 then
|
||||
return 4
|
||||
end
|
||||
return 5
|
||||
end
|
||||
|
||||
-- url编码转换
|
||||
function url_encode(str)
|
||||
-- 将非安全字符转换为百分号编码
|
||||
@@ -318,6 +344,67 @@ function file_exists(path)
|
||||
return false
|
||||
end
|
||||
|
||||
function binary_search(tbl, target, key)
|
||||
if not tbl or #tbl == 0 then return 1 end
|
||||
key = key or function(x) return x end
|
||||
local lo, hi = 1, #tbl
|
||||
local res = #tbl + 1
|
||||
while lo <= hi do
|
||||
local mid = math.floor((lo + hi) / 2)
|
||||
local v = tbl[mid]
|
||||
local val = key(v)
|
||||
if val >= target then
|
||||
res = mid
|
||||
hi = mid - 1
|
||||
else
|
||||
lo = mid + 1
|
||||
end
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
function new_min_heap()
|
||||
local h = {}
|
||||
local function swap(i, j)
|
||||
h[i], h[j] = h[j], h[i]
|
||||
end
|
||||
local function up(i)
|
||||
while i > 1 do
|
||||
local p = math.floor(i/2)
|
||||
if h[p].time <= h[i].time then break end
|
||||
swap(p, i)
|
||||
i = p
|
||||
end
|
||||
end
|
||||
local function down(i)
|
||||
local n = #h
|
||||
while true do
|
||||
local l = i * 2
|
||||
local r = l + 1
|
||||
local smallest = i
|
||||
if l <= n and h[l].time < h[smallest].time then smallest = l end
|
||||
if r <= n and h[r].time < h[smallest].time then smallest = r end
|
||||
if smallest == i then break end
|
||||
swap(i, smallest)
|
||||
i = smallest
|
||||
end
|
||||
end
|
||||
local function push(node)
|
||||
h[#h + 1] = node
|
||||
up(#h)
|
||||
end
|
||||
local function pop()
|
||||
if #h == 0 then return nil end
|
||||
local root = h[1]
|
||||
if #h == 1 then h[1] = nil; return root end
|
||||
h[1] = h[#h]
|
||||
h[#h] = nil
|
||||
down(1)
|
||||
return root
|
||||
end
|
||||
return { push = push, pop = pop, size = function() return #h end }
|
||||
end
|
||||
|
||||
function is_writable(path)
|
||||
local file = io.open(path, "w")
|
||||
if file then
|
||||
@@ -386,10 +473,19 @@ local function split_by_numbers(filename)
|
||||
return parts
|
||||
end
|
||||
|
||||
-- 识别并匹配前后剧集
|
||||
local function compare_filenames(fname1, fname2)
|
||||
-- 识别匹配前后剧集并提取集数
|
||||
local function get_series_episodes(fname1, fname2)
|
||||
local parts1 = split_by_numbers(fname1)
|
||||
local parts2 = split_by_numbers(fname2)
|
||||
local title1 = format_filename(fname1)
|
||||
local title2 = format_filename(fname2)
|
||||
if title1 and title2 then
|
||||
local media_title1, season1, episode1 = title1:match("^(.-)%s*[sS](%d+)[eE](%d+)")
|
||||
local media_title2, season2, episode2 = title2:match("^(.-)%s*[sS](%d+)[eE](%d+)")
|
||||
if season1 and season2 and season1 ~= season2 then
|
||||
return nil, nil
|
||||
end
|
||||
end
|
||||
|
||||
local min_len = math.min(#parts1, #parts2)
|
||||
|
||||
@@ -400,7 +496,7 @@ local function compare_filenames(fname1, fname2)
|
||||
|
||||
-- 比较数字前的字符是否相同
|
||||
if part1.pre ~= part2.pre then
|
||||
return false
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
-- 比较数字部分
|
||||
@@ -410,11 +506,36 @@ local function compare_filenames(fname1, fname2)
|
||||
|
||||
-- 比较数字后的字符是否相同
|
||||
if part1.post ~= part2.post then
|
||||
return false
|
||||
return nil, nil
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
return nil, nil
|
||||
end
|
||||
|
||||
-- 获取当前文件名所包含的集数
|
||||
function get_episode_number(filename, fname)
|
||||
-- 尝试对比记录文件名来获取当前集数
|
||||
if fname then
|
||||
return get_series_episodes(fname, filename)
|
||||
end
|
||||
|
||||
local thin_space = string.char(0xE2, 0x80, 0x89)
|
||||
filename = filename:gsub(thin_space, " ")
|
||||
|
||||
local title = format_filename(filename)
|
||||
if title then
|
||||
local media_title, season, episode = title:match("^(.-)%s*[sS](%d+)[eE](%d+)")
|
||||
if season then
|
||||
return tonumber(episode)
|
||||
else
|
||||
local media_title, episode = title:match("^(.-)%s*[eE](%d+)")
|
||||
if episode then
|
||||
return tonumber(episode)
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- 规范化路径
|
||||
@@ -520,36 +641,6 @@ function parse_title()
|
||||
return title_replace(title), season, episode
|
||||
end
|
||||
|
||||
-- 获取当前文件名所包含的集数
|
||||
function get_episode_number(filename, fname)
|
||||
-- 尝试对比记录文件名来获取当前集数
|
||||
if fname then
|
||||
local episode_num1, episode_num2 = compare_filenames(fname, filename)
|
||||
if episode_num1 and episode_num2 then
|
||||
return episode_num1, episode_num2
|
||||
else
|
||||
return nil, nil
|
||||
end
|
||||
end
|
||||
|
||||
local thin_space = string.char(0xE2, 0x80, 0x89)
|
||||
filename = filename:gsub(thin_space, " ")
|
||||
|
||||
local title = format_filename(filename)
|
||||
if title then
|
||||
local media_title, season, episode = title:match("^(.-)%s*[sS](%d+)[eE](%d+)")
|
||||
if season then
|
||||
return tonumber(episode)
|
||||
else
|
||||
local media_title, episode = title:match("^(.-)%s*[eE](%d+)")
|
||||
if episode then
|
||||
return tonumber(episode)
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local CHINESE_NUM_MAP = {
|
||||
["零"] = 0, ["一"] = 1, ["二"] = 2, ["三"] = 3, ["四"] = 4,
|
||||
["五"] = 5, ["六"] = 6, ["七"] = 7, ["八"] = 8, ["九"] = 9,
|
||||
@@ -644,7 +735,7 @@ function call_cmd_async(args, callback)
|
||||
name = 'subprocess',
|
||||
capture_stderr = true,
|
||||
capture_stdout = true,
|
||||
playback_only = false,
|
||||
playback_only = true,
|
||||
args = args,
|
||||
}, function(success, result, error)
|
||||
if not success or not result or result.status ~= 0 then
|
||||
|
||||
Reference in New Issue
Block a user