This commit is contained in:
eric
2026-05-19 09:19:52 +00:00
parent 585bcd9500
commit b617555360
30 changed files with 477 additions and 207 deletions

View File

@@ -62,33 +62,6 @@ managed_policies_enabled() {
esac
}
find_tampermonkey_extension_dir() {
seed_dir="${NEKO_TAMPERMONKEY_SEED_DIR:-/etc/neko/tampermonkey-seed}"
ext_id="dhdgffkkebhmkfjojejmpbldmpobfkfo"
for manifest in "$seed_dir/Default/Extensions/$ext_id"/*/manifest.json; do
[ -f "$manifest" ] || continue
dirname "$manifest"
return 0
done
}
append_extension_dir() {
extension_dir="${1:-}"
[ -n "$extension_dir" ] || return 0
[ -d "$extension_dir" ] || return 0
if [ -n "$load_extension_dirs" ]; then
load_extension_dirs="${load_extension_dirs},${extension_dir}"
else
load_extension_dirs="$extension_dir"
fi
}
find_youtube_auto_dismiss_extension_dir() {
extension_dir="${NEKO_YOUTUBE_AUTO_DISMISS_EXTENSION_DIR:-/etc/neko/youtube-auto-dismiss-extension}"
[ -f "$extension_dir/manifest.json" ] || return 0
printf '%s' "$extension_dir"
}
copy_seed_dir_if_missing() {
src="${1:-}"
dst="${2:-}"
@@ -133,7 +106,22 @@ if not isinstance(source, dict):
target = load(target_preferences)
settings = target.setdefault("extensions", {}).setdefault("settings", {})
current = settings.get(ext_id)
if not isinstance(current, dict) or current.get("state") != 1:
def should_replace_current(value: object) -> bool:
if not isinstance(value, dict):
return True
if value.get("state") != 1:
return True
if value.get("from_webstore") is not True:
return True
path = str(value.get("path") or "")
if path.startswith("/"):
return True
if value.get("location") == 8:
return True
return False
if should_replace_current(current):
settings[ext_id] = source
target_preferences.parent.mkdir(parents=True, exist_ok=True)
target_preferences.write_text(json.dumps(target, ensure_ascii=False, separators=(",", ":")), encoding="utf-8")
@@ -181,15 +169,6 @@ profile_dir="/home/neko/.config/chromium"
if [ "$family" = "google-chrome" ]; then
profile_dir="/home/neko/.config/google-chrome"
fi
tampermonkey_extension_dir="$(find_tampermonkey_extension_dir || true)"
youtube_auto_dismiss_extension_dir="$(find_youtube_auto_dismiss_extension_dir || true)"
load_extension_dirs=""
append_extension_dir "$tampermonkey_extension_dir"
append_extension_dir "$youtube_auto_dismiss_extension_dir"
load_extension_flags=""
if [ -n "$load_extension_dirs" ]; then
load_extension_flags="--load-extension=$load_extension_dirs"
fi
render_mode="${NEKO_BROWSER_RENDER_MODE:-auto}"
render_flags="--disable-gpu --use-gl=swiftshader --enable-unsafe-swiftshader"
@@ -244,7 +223,6 @@ launch_browser() {
--remote-debugging-address=127.0.0.1 \
--remote-debugging-port=9222 \
--user-data-dir="$profile_dir" \
${load_extension_flags} \
--password-store=basic \
--no-first-run \
--new-window \

View File

@@ -46,7 +46,6 @@ services:
- "./external-extensions:/usr/share/chromium/extensions:ro"
- "./external-extensions:/usr/share/chromium-browser/extensions:ro"
- "./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro"
- "./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro"
- "./provisioning:/var/www/provisioning:ro"
- "./browser-launch.sh:/etc/neko/browser-launch.sh:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/${NEKO_BROWSER_SUPERVISOR_CONF}:ro"
@@ -74,7 +73,6 @@ services:
- "./external-extensions:/usr/share/chromium/extensions:ro"
- "./external-extensions:/usr/share/chromium-browser/extensions:ro"
- "./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro"
- "./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro"
- "./provisioning:/var/www/provisioning:ro"
- "./browser-launch.sh:/etc/neko/browser-launch.sh:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/${NEKO_BROWSER_SUPERVISOR_CONF}:ro"
@@ -102,7 +100,6 @@ services:
- "./external-extensions:/usr/share/chromium/extensions:ro"
- "./external-extensions:/usr/share/chromium-browser/extensions:ro"
- "./tampermonkey-seed:/etc/neko/tampermonkey-seed:ro"
- "./youtube-auto-dismiss-extension:/etc/neko/youtube-auto-dismiss-extension:ro"
- "./provisioning:/var/www/provisioning:ro"
- "./browser-launch.sh:/etc/neko/browser-launch.sh:ro"
- "./${NEKO_BROWSER_SUPERVISOR_CONF}:/etc/neko/supervisord/${NEKO_BROWSER_SUPERVISOR_CONF}:ro"

View File

@@ -1,17 +0,0 @@
{
"manifest_version": 3,
"name": "YouTube Studio Auto Dismiss",
"version": "1.1.0",
"description": "Auto-clicks visible Dismiss buttons on YouTube Studio livestreaming pages.",
"content_scripts": [
{
"matches": [
"https://studio.youtube.com/channel/*/livestreaming",
"https://studio.youtube.com/video/*/livestreaming",
"https://studio.youtube.com/*/livestreaming"
],
"js": ["youtube-studio-auto-dismiss.js"],
"run_at": "document_idle"
}
]
}

View File

@@ -1,46 +0,0 @@
(function () {
"use strict";
function isVisible(element) {
var style = window.getComputedStyle(element);
return style.display !== "none" && style.visibility !== "hidden" && element.offsetParent !== null;
}
function clickElement(element) {
if (!element) return;
element.dispatchEvent(
new MouseEvent("click", {
view: window,
bubbles: true,
cancelable: true,
})
);
}
function findDismiss(root) {
var buttons = (root || document).querySelectorAll("button");
for (var i = 0; i < buttons.length; i += 1) {
var button = buttons[i];
var text = button.innerText ? button.innerText.trim() : "";
if (text === "Dismiss" && isVisible(button)) {
return button;
}
if (button.shadowRoot) {
var shadowButton = findDismiss(button.shadowRoot);
if (shadowButton) return shadowButton;
}
}
return null;
}
function run() {
clickElement(findDismiss(document));
}
if (document.readyState === "complete") {
run();
} else {
window.addEventListener("load", run, { once: true });
}
window.setInterval(run, 5000);
})();