mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-27 18:22:41 -08:00
fix(subminer): gate plugin behavior by app runtime state
This commit is contained in:
@@ -28,6 +28,84 @@ local function is_linux()
|
|||||||
return not is_windows() and not is_macos()
|
return not is_windows() and not is_macos()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function is_subminer_process_running()
|
||||||
|
local command = is_windows() and { "tasklist", "/FO", "CSV", "/NH" } or { "ps", "-A", "-o", "args=" }
|
||||||
|
local result = mp.command_native({
|
||||||
|
name = "subprocess",
|
||||||
|
args = command,
|
||||||
|
playback_only = false,
|
||||||
|
capture_stdout = true,
|
||||||
|
capture_stderr = false,
|
||||||
|
})
|
||||||
|
if not result or type(result.stdout) ~= "string" or result.status ~= 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local process_list = result.stdout:lower()
|
||||||
|
for line in process_list:gmatch("[^\\n]+") do
|
||||||
|
if is_windows() then
|
||||||
|
local image = line:match('^"([^"]+)","')
|
||||||
|
if not image then
|
||||||
|
image = line:match("^\"([^\"]+)\"")
|
||||||
|
end
|
||||||
|
if not image then
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
|
if image == "subminer" or image == "subminer.exe" or image == "subminer.appimage" or image == "subminer.app" then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if image:find("subminer", 1, true) and not image:find(".lua", 1, true) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
local argv0 = line:match('^"([^"]+)"') or line:match("^%s*([^%s]+)")
|
||||||
|
if not argv0 then
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
|
if argv0:find("subminer.lua", 1, true) or argv0:find("subminer.conf", 1, true) then
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
|
local exe = argv0:match("([^/\\]+)$") or argv0
|
||||||
|
if exe == "SubMiner" or exe == "SubMiner.AppImage" or exe == "SubMiner.exe" or exe == "subminer" or exe == "subminer.appimage" or exe == "subminer.exe" then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
if exe:find("subminer", 1, true) and exe:find("%.lua", 1, true) == nil and exe:find("%.app", 1, true) == nil then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
::continue::
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function is_subminer_app_running()
|
||||||
|
if is_subminer_process_running() then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function is_subminer_ipc_ready()
|
||||||
|
if not is_subminer_process_running() then
|
||||||
|
return false, "SubMiner process not running"
|
||||||
|
end
|
||||||
|
|
||||||
|
if is_windows() then
|
||||||
|
return true, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if opts.socket_path ~= default_socket_path() then
|
||||||
|
return false, "SubMiner socket path mismatch"
|
||||||
|
end
|
||||||
|
|
||||||
|
if not file_exists(default_socket_path()) then
|
||||||
|
return false, "SubMiner IPC socket missing at /tmp/subminer-socket"
|
||||||
|
end
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
end
|
||||||
|
|
||||||
local function normalize_binary_path_candidate(candidate)
|
local function normalize_binary_path_candidate(candidate)
|
||||||
if type(candidate) ~= "string" then
|
if type(candidate) ~= "string" then
|
||||||
return nil
|
return nil
|
||||||
@@ -601,6 +679,11 @@ local function apply_aniskip_payload(mal_id, title, episode, payload)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function fetch_aniskip_for_current_media()
|
local function fetch_aniskip_for_current_media()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
subminer_log("debug", "lifecycle", "Skipping aniskip lookup: SubMiner app not running")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
clear_aniskip_state()
|
clear_aniskip_state()
|
||||||
if not opts.aniskip_enabled then
|
if not opts.aniskip_enabled then
|
||||||
return
|
return
|
||||||
@@ -1442,6 +1525,13 @@ local function ensure_texthooker_running(callback)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function start_overlay(overrides)
|
local function start_overlay(overrides)
|
||||||
|
local socket_ready, reason = is_subminer_ipc_ready()
|
||||||
|
if not socket_ready then
|
||||||
|
subminer_log("warn", "process", "Refusing to start overlay: " .. tostring(reason))
|
||||||
|
show_osd("SubMiner IPC not set up. Launch mpv with --input-ipc-server=/tmp/subminer-socket")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if not ensure_binary_available() then
|
if not ensure_binary_available() then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1504,6 +1594,9 @@ local function start_overlay_from_script_message(...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function stop_overlay()
|
local function stop_overlay()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1532,6 +1625,9 @@ local function stop_overlay()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function toggle_overlay()
|
local function toggle_overlay()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1556,6 +1652,9 @@ local function toggle_overlay()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function toggle_invisible_overlay()
|
local function toggle_invisible_overlay()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1584,6 +1683,9 @@ local function toggle_invisible_overlay()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function show_invisible_overlay()
|
local function show_invisible_overlay()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1612,6 +1714,9 @@ local function show_invisible_overlay()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function hide_invisible_overlay()
|
local function hide_invisible_overlay()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1705,6 +1810,9 @@ local function show_menu()
|
|||||||
end
|
end
|
||||||
|
|
||||||
restart_overlay = function()
|
restart_overlay = function()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
return
|
||||||
|
end
|
||||||
if not state.binary_available then
|
if not state.binary_available then
|
||||||
subminer_log("error", "binary", "SubMiner binary not found")
|
subminer_log("error", "binary", "SubMiner binary not found")
|
||||||
show_osd("Error: binary not found")
|
show_osd("Error: binary not found")
|
||||||
@@ -1765,6 +1873,12 @@ check_status = function()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function on_file_loaded()
|
local function on_file_loaded()
|
||||||
|
if not is_subminer_app_running() then
|
||||||
|
clear_aniskip_state()
|
||||||
|
subminer_log("debug", "lifecycle", "Skipping file load hooks: SubMiner app not running")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
clear_aniskip_state()
|
clear_aniskip_state()
|
||||||
fetch_aniskip_for_current_media()
|
fetch_aniskip_for_current_media()
|
||||||
state.binary_path = find_binary()
|
state.binary_path = find_binary()
|
||||||
|
|||||||
Reference in New Issue
Block a user