From e7aea56b164e11adc3eb486cde3e55c9c79726af Mon Sep 17 00:00:00 2001 From: Mike <27894430+worryaboutstuff@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:28:39 -0500 Subject: [PATCH 01/51] Add performer-poster-backdrop plugin (#648) --- plugins/performer-poster-backdrop/README.md | 89 ++++++++++ .../performer-poster-backdrop-example.png | Bin 0 -> 590583 bytes .../performer-poster-backdrop.css | 54 ++++++ .../performer-poster-backdrop.js | 164 ++++++++++++++++++ .../performer-poster-backdrop.yml | 30 ++++ 5 files changed, 337 insertions(+) create mode 100644 plugins/performer-poster-backdrop/README.md create mode 100644 plugins/performer-poster-backdrop/assets/performer-poster-backdrop-example.png create mode 100644 plugins/performer-poster-backdrop/performer-poster-backdrop.css create mode 100644 plugins/performer-poster-backdrop/performer-poster-backdrop.js create mode 100644 plugins/performer-poster-backdrop/performer-poster-backdrop.yml diff --git a/plugins/performer-poster-backdrop/README.md b/plugins/performer-poster-backdrop/README.md new file mode 100644 index 00000000..5d826cc3 --- /dev/null +++ b/plugins/performer-poster-backdrop/README.md @@ -0,0 +1,89 @@ +# Performer Poster Backdrop (Stash UI Plugin) + +Adds a blurred poster-style backdrop behind performer headers using the performer’s poster image. + +![Performer Poster Backdrop example](https://raw.githubusercontent.com/worryaboutstuff/performer-poster-backdrop/main/assets/performer-poster-backdrop-example.png) + + +## Features + +- Applies only to **Performer pages** +- Uses the performer’s **poster image** as a background layer +- Adjustable: + - Opacity + - Blur strength + - Vertical image alignment +- Supports **per-performer Y-offset overrides** +- Blank settings automatically fall back to defaults + +## Installation + +1. Copy the following files into your Stash UI plugins directory: + - `performer-poster-backdrop.yml` + - `performer-poster-backdrop.js` + - `performer-poster-backdrop.css` + +2. In Stash, go to **Settings → Plugins** +3. Find **Performer Poster Backdrop** +4. Adjust settings if desired and click **Confirm** +5. Refresh a performer page + +## Settings + +### Backdrop opacity +Controls how visible the backdrop is. + +- Range: `0`–`1` +- Default: `1` +- Examples: + - `0.7` → subtle + - `0.5` → very soft + - `0` → invisible + +Leaving this field blank uses the default. + +### Backdrop blur +Controls how blurred the backdrop appears (in pixels). + +- Default: `10` +- Examples: + - `5` → light blur + - `15` → strong blur + - `0` → no blur + +Leaving this field blank uses the default. + +### Default Y offset +Controls the vertical alignment of the backdrop image. + +- Range: `0`–`100` +- Default: `20` +- Meaning: + - `0` → favor top of image + - `50` → center + - `100` → favor bottom + +Leaving this field blank uses the default. + +## Per-performer Y overrides + +Use this when a specific performer’s poster needs different vertical positioning. + +Enter overrides as a **comma-separated list** in a single text field. + +### Format + +`PERFORMER_ID:OFFSET` + +### Example + +`142:35, 219:20, 501:50` + + + +Accepted separators: +- `:` (recommended) +- `=` +- `-` + +Whitespace is ignored. diff --git a/plugins/performer-poster-backdrop/assets/performer-poster-backdrop-example.png b/plugins/performer-poster-backdrop/assets/performer-poster-backdrop-example.png new file mode 100644 index 0000000000000000000000000000000000000000..bee2719c2385b2fcc9da49314cd7e2593232e9b1 GIT binary patch literal 590583 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%0D_S1Kad%K2`rYz-)Yjw_PCKU3cfhn@>nSD)r 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%0A6SX)U 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‏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

b-eHV?CZZ+=%sO|*9lD?ep-g`f^J=f_0?WJ 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⋙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ⅅ@hh)bKeJ?Y?_YTscTASmws@$u^{BN{k4@3 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

RtlVMs6@X27A8!(NLUGGPupj;%moah|K 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 A;BJX!3>V7m)=`OPolr57LK^rXc} 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 *:not(.pb-hero) { + position: relative; + z-index: 1; +} + +/* Hide while editing performer */ +#performer-page .detail-header.edit.full-width .pb-hero { + display: none; +} diff --git a/plugins/performer-poster-backdrop/performer-poster-backdrop.js b/plugins/performer-poster-backdrop/performer-poster-backdrop.js new file mode 100644 index 00000000..322532de --- /dev/null +++ b/plugins/performer-poster-backdrop/performer-poster-backdrop.js @@ -0,0 +1,164 @@ +(function () { + const HERO_CLASS = "pb-hero"; + const PLUGIN_ID = "performer-poster-backdrop"; + + // HARD DEFAULTS (used when fields are blank) + const DEFAULTS = { + opacity: 1, // 0..1 + blur: 10, // px + y: 20, // % + }; + + let opacity = DEFAULTS.opacity; + let blur = DEFAULTS.blur; + let defaultY = DEFAULTS.y; + let overrides = new Map(); + + let lastSettingsFetch = 0; + + const isBlank = (v) => + v === null || v === undefined || String(v).trim() === ""; + + function isPerformerRoute() { + return /^\/performers\/\d+/.test(location.pathname); + } + + function getPerformerIdFromPath() { + const m = location.pathname.match(/^\/performers\/(\d+)/); + return m ? String(Number(m[1])) : null; + } + + function getHeader() { + return document.querySelector("#performer-page .detail-header.full-width"); + } + + function getStickyHeader() { + return document.querySelector("#performer-page .sticky.detail-header"); + } + + function getPosterImg() { + return ( + document.querySelector("#performer-page .detail-header-image img.performer") || + document.querySelector("#performer-page img.performer") + ); + } + + function clamp(n, min, max, fallback) { + const x = Number(n); + if (!Number.isFinite(x)) return fallback; + return Math.min(max, Math.max(min, x)); + } + + // COMMA-SEPARATED overrides: "142:35, 219:20" + function parseOverrides(text) { + const map = new Map(); + if (isBlank(text)) return map; + + text.split(",").forEach((chunk) => { + const s = chunk.trim(); + if (!s) return; + + // Accept 142:35, 142-35, 142=35 + const m = s.match(/^(\d+)\s*[:=-]\s*(\d{1,3})$/); + if (!m) return; + + const id = String(Number(m[1])); + const pct = clamp(m[2], 0, 100, DEFAULTS.y); + map.set(id, pct); + }); + + return map; + } + + function removeHero(el) { + el?.querySelector("." + HERO_CLASS)?.remove(); + } + + function upsertHero(header, url) { + let hero = header.querySelector("." + HERO_CLASS); + if (!hero) { + hero = document.createElement("div"); + hero.className = HERO_CLASS; + header.prepend(hero); + } + hero.style.backgroundImage = `url("${url}")`; + return hero; + } + + function apply(hero) { + hero.style.setProperty("--pb-opacity", opacity); + hero.style.setProperty("--pb-blur", `${blur}px`); + + const pid = getPerformerIdFromPath(); + const y = pid && overrides.has(pid) ? overrides.get(pid) : defaultY; + hero.style.setProperty("--pb-y", `${y}%`); + } + + async function refreshSettings() { + if (Date.now() - lastSettingsFetch < 5000) return; + lastSettingsFetch = Date.now(); + + try { + const res = await fetch("/graphql", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: `{ configuration { plugins } }`, + }), + }); + + if (!res.ok) return; + + const cfg = (await res.json()) + ?.data?.configuration?.plugins?.[PLUGIN_ID]; + + if (!cfg) return; + + opacity = isBlank(cfg.opacity) + ? DEFAULTS.opacity + : clamp(cfg.opacity, 0, 1, DEFAULTS.opacity); + + blur = isBlank(cfg.blur) + ? DEFAULTS.blur + : clamp(cfg.blur, 0, 100, DEFAULTS.blur); + + defaultY = isBlank(cfg.defaultYOffset) + ? DEFAULTS.y + : clamp(cfg.defaultYOffset, 0, 100, DEFAULTS.y); + + overrides = isBlank(cfg.perPerformerOffsets) + ? new Map() + : parseOverrides(cfg.perPerformerOffsets); + + const hero = getHeader()?.querySelector("." + HERO_CLASS); + if (hero) apply(hero); + } catch { + // silent fail — plugin should never break UI + } + } + + function run() { + removeHero(getStickyHeader()); + + const header = getHeader(); + if (!header || !isPerformerRoute()) return removeHero(header); + + const img = getPosterImg(); + if (!img) return; + + const hero = upsertHero(header, img.currentSrc || img.src); + apply(hero); + refreshSettings(); + } + + new MutationObserver(run).observe(document.body, { + childList: true, + subtree: true, + }); + + ["load", "resize", "popstate"].forEach((e) => + window.addEventListener(e, () => setTimeout(run, 50)) + ); + + setTimeout(run, 50); +})(); diff --git a/plugins/performer-poster-backdrop/performer-poster-backdrop.yml b/plugins/performer-poster-backdrop/performer-poster-backdrop.yml new file mode 100644 index 00000000..fd129053 --- /dev/null +++ b/plugins/performer-poster-backdrop/performer-poster-backdrop.yml @@ -0,0 +1,30 @@ +name: Performer Poster Backdrop +description: Adds a blurred poster backdrop to performer pages. +version: 1.0.3 + +ui: + javascript: + - performer-poster-backdrop.js + css: + - performer-poster-backdrop.css + +settings: + opacity: + displayName: Backdrop opacity + description: "0–1 (leave blank for default: 1)" + type: STRING + + blur: + displayName: Backdrop blur + description: "Pixels (leave blank for default: 10)" + type: STRING + + defaultYOffset: + displayName: Default Y offset + description: "Background position % (leave blank for default: 20)" + type: STRING + + perPerformerOffsets: + displayName: Per-performer Y overrides + description: "Comma seperated: performerId:percent (blank = none)" + type: STRING From 1fb1317ab9eb631a4bed3f6489c6436c9eff6f0c Mon Sep 17 00:00:00 2001 From: skier233 <39396856+skier233@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:29:32 -0500 Subject: [PATCH 02/51] Update AI Overhaul plugin for 0.9.1 (#647) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- plugins/AIOverhaul/AIOverhaul.yml | 2 +- plugins/AIOverhaul/BackendBase.js | 20 ++++++++++++++++++++ plugins/AIOverhaul/README.md | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/plugins/AIOverhaul/AIOverhaul.yml b/plugins/AIOverhaul/AIOverhaul.yml index 8508554c..2a854884 100644 --- a/plugins/AIOverhaul/AIOverhaul.yml +++ b/plugins/AIOverhaul/AIOverhaul.yml @@ -1,6 +1,6 @@ name: AIOverhaul description: AI Overhaul for Stash with a full plugin engine included to install and manage asynchronous stash plugins for AI or other purposes. -version: 0.9.0 +version: 0.9.1 url: https://discourse.stashapp.cc/t/aioverhaul/4847 ui: javascript: diff --git a/plugins/AIOverhaul/BackendBase.js b/plugins/AIOverhaul/BackendBase.js index 3794d143..2c995dce 100644 --- a/plugins/AIOverhaul/BackendBase.js +++ b/plugins/AIOverhaul/BackendBase.js @@ -7,6 +7,7 @@ defaultBackendBase; const PLUGIN_NAME = 'AIOverhaul'; // Local default to keep the UI functional before plugin config loads. const DEFAULT_BACKEND_BASE = 'http://localhost:4153'; +const STORAGE_KEY = 'ai_backend_base_url'; const CONFIG_QUERY = `query AIOverhaulPluginConfig($ids: [ID!]) { configuration { plugins(include: $ids) @@ -138,6 +139,15 @@ function applyPluginConfig(base, captureEvents, sharedKey) { const value = normalized || ''; try { window.AI_BACKEND_URL = value; + try { + if (value) { + sessionStorage.setItem(STORAGE_KEY, value); + } + else { + sessionStorage.removeItem(STORAGE_KEY); + } + } + catch { } window.dispatchEvent(new CustomEvent('AIBackendBaseUpdated', { detail: value })); } catch { } @@ -202,6 +212,16 @@ function defaultBackendBase() { loadPluginConfig(); } catch { } + try { + const stored = sessionStorage.getItem(STORAGE_KEY); + if (stored && typeof stored === 'string') { + const normalized = normalizeBase(stored); + if (normalized !== null && normalized !== undefined) { + return normalized; + } + } + } + catch { } if (typeof window.AI_BACKEND_URL === 'string') { const explicit = normalizeBase(window.AI_BACKEND_URL); if (explicit !== null && explicit !== undefined) { diff --git a/plugins/AIOverhaul/README.md b/plugins/AIOverhaul/README.md index 50a522ea..55c45ee7 100644 --- a/plugins/AIOverhaul/README.md +++ b/plugins/AIOverhaul/README.md @@ -3,4 +3,4 @@ https://discourse.stashapp.cc/t/aioverhaul/4847 # For details around this plugin and using and configuring it, see the official documentation here: -https://github.com/skier233/Stash-AIServer/wiki/AI-Overhaul-Installation-Instructions \ No newline at end of file +https://github.com/skier233/Stash-AIServer/wiki/AI-Overhaul-Installation-Instructions From 497b02824df19e78228dbb6560dcdffaf72a912d Mon Sep 17 00:00:00 2001 From: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:34:52 +0200 Subject: [PATCH 03/51] Add community link --- plugins/performer-poster-backdrop/README.md | 2 ++ plugins/performer-poster-backdrop/performer-poster-backdrop.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/plugins/performer-poster-backdrop/README.md b/plugins/performer-poster-backdrop/README.md index 5d826cc3..ca22e5c1 100644 --- a/plugins/performer-poster-backdrop/README.md +++ b/plugins/performer-poster-backdrop/README.md @@ -1,5 +1,7 @@ # Performer Poster Backdrop (Stash UI Plugin) +https://discourse.stashapp.cc/t/performer-poster-backdrop/4897 + Adds a blurred poster-style backdrop behind performer headers using the performer’s poster image. ![Performer Poster Backdrop example](https://raw.githubusercontent.com/worryaboutstuff/performer-poster-backdrop/main/assets/performer-poster-backdrop-example.png) diff --git a/plugins/performer-poster-backdrop/performer-poster-backdrop.yml b/plugins/performer-poster-backdrop/performer-poster-backdrop.yml index fd129053..b17721e9 100644 --- a/plugins/performer-poster-backdrop/performer-poster-backdrop.yml +++ b/plugins/performer-poster-backdrop/performer-poster-backdrop.yml @@ -1,6 +1,7 @@ name: Performer Poster Backdrop description: Adds a blurred poster backdrop to performer pages. version: 1.0.3 +url: https://discourse.stashapp.cc/t/performer-poster-backdrop/4897 ui: javascript: From c10e0d207e8370f225a1df6b4f3e8b73688c0997 Mon Sep 17 00:00:00 2001 From: DirtyRacer1337 Date: Thu, 25 Dec 2025 03:34:07 +0700 Subject: [PATCH 04/51] Update ModernDark theme to latest version (#649) Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- themes/Theme-ModernDark/Theme-ModernDark.css | 30 ++++++++++++++++++-- themes/Theme-ModernDark/Theme-ModernDark.yml | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/themes/Theme-ModernDark/Theme-ModernDark.css b/themes/Theme-ModernDark/Theme-ModernDark.css index 01da6906..24a93272 100644 --- a/themes/Theme-ModernDark/Theme-ModernDark.css +++ b/themes/Theme-ModernDark/Theme-ModernDark.css @@ -38,7 +38,6 @@ div.dropdown-menu { background-color: var(--nav-color) !important; } .card { - background-color: #30404d; border-radius: 3px; box-shadow: 0 0 0 1px rgba(16, 22, 26, 0.4), @@ -253,7 +252,7 @@ option { .modal-header, .modal-body, .modal-footer { - background-color: #30404d; + background-color: --var(--card-color); color: #f5f8fa; background-repeat: no-repeat; background-size: cover; @@ -534,3 +533,30 @@ button.minimal { .video-js .vjs-play-progress { background-color: #e5a00d; } +.filtered-list-toolbar { + background-color: var(--body-color); +} +.sidebar-pane .sidebar { + background-color: var(--body-color); + border-right: 1px solid var(--nav-color); +} +.sidebar-section { + border-bottom: 1px solid var(--nav-color); +} +.sidebar-toggle-button-container .sidebar-toggle-button { + border: 1px solid var(--tag-color); + border-left: none; +} +.clearable-text-field, .clearable-text-field:active, .clearable-text-field:focus { + background-color: var(--nav-color); + border-color: var(--tag-color); +} +.form-control:focus { + box-shadow: 0 0 0 .2rem rgba(68, 68, 68, .25); +} +.package-manager table thead { + background-color: var(--nav-color); +} +a.bg-secondary:hover, a.bg-secondary:focus, button.bg-secondary:hover, button.bg-secondary:focus { + background-color: var(--nav-color) !important; +} diff --git a/themes/Theme-ModernDark/Theme-ModernDark.yml b/themes/Theme-ModernDark/Theme-ModernDark.yml index 4d62c718..d36a22ed 100644 --- a/themes/Theme-ModernDark/Theme-ModernDark.yml +++ b/themes/Theme-ModernDark/Theme-ModernDark.yml @@ -1,6 +1,6 @@ name: Theme - ModernDark description: ModernDark Theme for Stash by cj13 -version: 1.2 +version: 1.3 url: https://discourse.stashapp.cc/t/moderndark/1423 ui: css: From b4707162bd6f4457d8e381ba04dc87518d0bd78a Mon Sep 17 00:00:00 2001 From: Servbot91 Date: Sun, 28 Dec 2025 19:48:40 -0500 Subject: [PATCH 05/51] [RandomButton] Correct random sort logic (#650) Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- plugins/StashRandomButton/random_button.js | 4 ++-- plugins/StashRandomButton/random_button.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/StashRandomButton/random_button.js b/plugins/StashRandomButton/random_button.js index 5920e0de..c82fd998 100644 --- a/plugins/StashRandomButton/random_button.js +++ b/plugins/StashRandomButton/random_button.js @@ -19,7 +19,7 @@ async function randomGlobal(entity, idField, redirectPrefix, internalFilter) { const realEntityPlural = getPlural(entity); - let filter = { per_page: 1 }; + let filter = { per_page: 1, sort: "random" }; let variables = { filter }; let filterArg = ""; let filterVar = ""; @@ -45,7 +45,7 @@ if (!totalCount) { alert("No results found."); return; } const randomIndex = Math.floor(Math.random() * totalCount); - let itemVars = { filter: { per_page: 1, page: randomIndex + 1 } }; + let itemVars = { filter: { per_page: 1, page: randomIndex + 1, sort: "random" } }; if (internalFilter) itemVars.internal_filter = internalFilter; const itemQuery = ` query Find${realEntityPlural}($filter: FindFilterType${filterArg}) { diff --git a/plugins/StashRandomButton/random_button.yml b/plugins/StashRandomButton/random_button.yml index 230763ba..abc79885 100644 --- a/plugins/StashRandomButton/random_button.yml +++ b/plugins/StashRandomButton/random_button.yml @@ -1,6 +1,6 @@ name: RandomButton description: Adds a button to quickly jump to a random scene, image, performer, studio, group, tag, or gallery, both on overview and internal entity pages. -version: 2.0.1 +version: 2.0.2 url: https://discourse.stashapp.cc/t/randombutton/1809 ui: requires: [] From 1a9a777132e80bff2c03ff83d34b9bc40030c963 Mon Sep 17 00:00:00 2001 From: adtdev20 <75962445+adtdev20@users.noreply.github.com> Date: Mon, 29 Dec 2025 13:13:43 -0800 Subject: [PATCH 06/51] [PythonToolsInstaller] Update python version to 3.13 (#651) --- plugins/PythonToolsInstaller/PythonToolsInstaller.py | 4 ++-- plugins/PythonToolsInstaller/PythonToolsInstaller.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/PythonToolsInstaller/PythonToolsInstaller.py b/plugins/PythonToolsInstaller/PythonToolsInstaller.py index da1f99f8..b2ea75e2 100644 --- a/plugins/PythonToolsInstaller/PythonToolsInstaller.py +++ b/plugins/PythonToolsInstaller/PythonToolsInstaller.py @@ -51,8 +51,8 @@ def get_download_py_stashapp_tools(PLUGIN_DIR): # venv/lib/python3.11/site-packages/stashapp_tools- - src = f"{used_dir}/venv/lib/python3.12/site-packages" - destination = shutil.copytree(src, org_packagedir,ignore_func,None,shutil.copy2,False,True) + src = f"{used_dir}/venv/lib/python3.13/site-packages" + destination = shutil.copytree(src, org_packagedir,ignore_func,None,shutil.copy2,False,True) fp = open(f'{used_dir}/copydo.txt', 'w+') fp.write("%s\n" % print(destination)) diff --git a/plugins/PythonToolsInstaller/PythonToolsInstaller.yml b/plugins/PythonToolsInstaller/PythonToolsInstaller.yml index f8e750ae..6378fe7d 100644 --- a/plugins/PythonToolsInstaller/PythonToolsInstaller.yml +++ b/plugins/PythonToolsInstaller/PythonToolsInstaller.yml @@ -1,6 +1,6 @@ name: "Python Tools Installer" description: Download stashapp-tools for DockerEnv -version: 0.1.2 +version: 0.1.3 url: https://github.com/stashapp/CommunityScripts/tree/main/plugins/PythonToolsInstaller exec: - python From 359ebe7b730354fca5d89ec8135c7c0f92619725 Mon Sep 17 00:00:00 2001 From: HavenCTO Date: Mon, 5 Jan 2026 03:21:10 -0500 Subject: [PATCH 07/51] Add FunscriptHaven plugin (#652) --- plugins/FunscriptHaven/README.md | 180 ++ plugins/FunscriptHaven/funscript_haven.py | 1737 +++++++++++++++++ plugins/FunscriptHaven/funscript_haven.yml | 82 + .../FunscriptHaven/funscript_haven_config.py | 88 + 4 files changed, 2087 insertions(+) create mode 100644 plugins/FunscriptHaven/README.md create mode 100644 plugins/FunscriptHaven/funscript_haven.py create mode 100644 plugins/FunscriptHaven/funscript_haven.yml create mode 100644 plugins/FunscriptHaven/funscript_haven_config.py diff --git a/plugins/FunscriptHaven/README.md b/plugins/FunscriptHaven/README.md new file mode 100644 index 00000000..c45aa4f9 --- /dev/null +++ b/plugins/FunscriptHaven/README.md @@ -0,0 +1,180 @@ +# Funscript Haven + +A StashApp plugin that automatically generates funscript files from video scenes using optical flow analysis. + +## Overview + +Funscript Haven analyzes video content using computer vision techniques to detect motion patterns and automatically generate funscript files compatible with interactive devices. The plugin integrates seamlessly with StashApp, allowing you to queue scenes for processing by simply adding a tag. + +## Features + +- **Automatic Funscript Generation** - Analyzes video motion using optical flow algorithms to generate accurate funscript files +- **Tag-Based Workflow** - Simply tag scenes with a trigger tag to queue them for processing +- **VR Support** - Automatically detects VR content and adjusts processing accordingly +- **Multi-Axis Output** - Optional generation of secondary axis funscripts (Roll, Pitch, Twist, Surge, Sway) +- **POV Mode** - Specialized processing mode for POV content +- **Keyframe Reduction** - Intelligent compression to reduce file size while maintaining quality +- **Batch Processing** - Process multiple scenes in sequence with progress tracking +- **Configurable Settings** - Extensive options available through StashApp UI or config file +- **Enjoying Funscript Haven?** Check out more tools and projects at https://github.com/Haven-hvn + +## Requirements + +- **StashApp** - This plugin requires a running StashApp instance +- **Python 3.8+** - Python interpreter with pip +- **Dependencies** (automatically installed): + - `stashapp-tools` (>=0.2.58) + - `numpy` (v1.26.4) + - `opencv-python` (v4.10.0.84) + - `decord` (v0.6.0) + +## Installation + +1. Copy the plugin files to your StashApp plugins directory: + ``` + /plugins/funscript_haven/ + ├── funscript_haven.py + ├── funscript_haven.yml + └── funscript_haven_config.py + ``` + +2. Reload plugins in StashApp (Settings → Plugins → Reload Plugins) + +3. Configure plugin settings as needed (Settings → Plugins → Funscript Haven) + +## Usage + +### Basic Usage + +1. **Tag a Scene**: Add the tag `FunscriptHaven_Process` to any scene you want to process +2. **Run the Plugin**: Go to Settings → Tasks → Run Plugin Task → Funscript Haven → "Process Tagged Scenes" +3. **Wait for Processing**: The plugin will process each tagged scene and generate funscript files +4. **Check Results**: Funscript files are saved alongside the video files with `.funscript` extension + +### Tag Workflow + +| Tag | Purpose | +|-----|---------| +| `FunscriptHaven_Process` | Add to scenes to queue them for processing | +| `FunscriptHaven_Complete` | Automatically added when processing succeeds | +| `FunscriptHaven_Error` | Automatically added if an error occurs | + +## Configuration + +Settings can be configured in two ways: +1. **StashApp UI** (Settings → Plugins → Funscript Haven) - Takes priority +2. **Config File** (`funscript_haven_config.py`) - Fallback defaults + +### Processing Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `threads` | CPU count | Number of threads for optical flow computation | +| `detrend_window` | 2 | Detrend window in seconds - controls drift removal (integer 1-10) | +| `norm_window` | 4 | Normalization window in seconds - calibrates motion range (integer 1-10) | +| `batch_size` | 3000 | Frames per batch - higher is faster but uses more RAM | +| `overwrite` | false | Whether to overwrite existing funscript files | +| `keyframe_reduction` | true | Enable intelligent keyframe reduction | + +**Note:** StashApp UI only accepts integer values 0-10 for NUMBER type settings. Decimal values are converted internally. + +### Mode Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `pov_mode` | false | Improves stability for POV videos | +| `balance_global` | true | Attempts to cancel out camera motion | + +### Multi-Axis Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `multi_axis` | false | Generate secondary axis funscripts | +| `multi_axis_intensity` | 5 | Intensity of secondary axis motion (0-10, where 10 = maximum) | +| `random_speed` | 3 | Speed of random motion variation (0-10, where 10 = fastest) | +| `auto_home_delay` | 1 | Seconds of inactivity before returning to center (integer 0-10) | +| `auto_home_duration` | 1 | Time to smoothly return to center position in seconds (integer 0-10) | +| `smart_limit` | true | Scale secondary axis with primary stroke activity | + +**Note:** Settings like `multi_axis_intensity` and `random_speed` use 0-10 integer scale in the UI but are converted to 0.0-1.0 decimal values internally. + +### VR Detection + +The plugin automatically detects VR content by checking for these tags (case-insensitive): +- VR +- Virtual Reality +- 180° +- 360° + +You can customize VR tag detection in `funscript_haven_config.py`. + +## Multi-Axis Output + +When `multi_axis` is enabled, the plugin generates additional funscript files for secondary axes: + +| Axis | File Suffix | Description | +|------|-------------|-------------| +| L1 (Surge) | `.surge.funscript` | Forward/Backward motion | +| L2 (Sway) | `.sway.funscript` | Left/Right motion | +| R0 (Twist) | `.twist.funscript` | Rotational twist | +| R1 (Roll) | `.roll.funscript` | Roll rotation | +| R2 (Pitch) | `.pitch.funscript` | Pitch rotation | + +Secondary axes use OpenSimplex noise generation for natural, organic motion patterns that correlate with the primary stroke activity. + +## Technical Details + +### Algorithm Overview + +1. **Frame Extraction** - Video frames are extracted and downsampled using decord +2. **Optical Flow** - Farneback optical flow algorithm detects motion between frames +3. **Divergence Analysis** - Maximum divergence points identify primary motion centers +4. **Radial Motion** - Weighted radial motion calculation extracts stroke direction +5. **Integration** - Piecewise integration of motion values +6. **Detrending** - Rolling window detrending removes drift artifacts +7. **Normalization** - Local normalization scales output to 0-100 range +8. **Keyframe Reduction** - Direction changes are used to reduce keyframe count + +### Performance Tips + +- **RAM Usage**: Lower `batch_size` if running out of memory +- **Speed**: Increase `threads` to match available CPU cores +- **Quality**: Adjust `detrend_window` and `norm_window` based on video content +- **File Size**: Keep `keyframe_reduction` enabled for smaller files + +## Troubleshooting + +### Common Issues + +**"No scenes found with tag"** +- Ensure the trigger tag exists and is applied to scenes +- Check tag name matches exactly (case-sensitive) + +**"Video file not found"** +- Verify the scene has a valid file path in StashApp +- Check file permissions + +**Processing is slow** +- Reduce `batch_size` to lower memory usage +- Ensure sufficient CPU threads are allocated +- VR content takes longer due to higher resolution processing + +**Poor funscript quality** +- Try adjusting `detrend_window` (higher for stable cameras) +- Enable `pov_mode` for POV content +- Disable `balance_global` if camera doesn't move + +### Log Messages + +Check StashApp logs for detailed processing information and error messages. + +## License + +This project is part of the StashApp Community Scripts collection. + +## Credits + +- Uses OpenCV for optical flow computation +- Uses decord for efficient video frame extraction +- OpenSimplex noise algorithm for multi-axis generation +- Built for integration with StashApp diff --git a/plugins/FunscriptHaven/funscript_haven.py b/plugins/FunscriptHaven/funscript_haven.py new file mode 100644 index 00000000..8794afe7 --- /dev/null +++ b/plugins/FunscriptHaven/funscript_haven.py @@ -0,0 +1,1737 @@ +""" +Funscript Haven - StashApp Plugin +Generates funscript files from video scenes using optical flow analysis +""" + +import gc +import os +import sys +import json +import math +import threading +import concurrent.futures +import random +import subprocess +from multiprocessing import Pool +from typing import Dict, Any, List, Optional, Callable, Tuple + +# Hardware acceleration will be tried first, then fallback to software decoding if needed +# We don't set these initially to allow hardware acceleration to be attempted + +# ----------------- Setup and Dependencies ----------------- + +# Use PythonDepManager for dependency management +try: + from PythonDepManager import ensure_import + + # Install and ensure all required dependencies with specific versions + ensure_import( + "stashapi:stashapp-tools==0.2.58", + "numpy==1.26.4", + "opencv-python==4.10.0.84", + "decord==0.6.0" + ) + + # Import the dependencies after ensuring they're available + import stashapi.log as log + from stashapi.stashapp import StashInterface + import numpy as np + import cv2 + from decord import VideoReader, cpu + +except ImportError as e: + print(f"Failed to import PythonDepManager or required dependencies: {e}") + print("Please ensure PythonDepManager is installed and available.") + sys.exit(1) +except Exception as e: + print(f"Error during dependency management: {e}") + import traceback + print(f"Stack trace: {traceback.format_exc()}") + sys.exit(1) + +# Import local config +try: + import funscript_haven_config as config +except ModuleNotFoundError: + log.error("Please provide a funscript_haven_config.py file with the required variables.") + raise Exception("Please provide a funscript_haven_config.py file with the required variables.") + +# ----------------- Global Variables ----------------- + +stash: Optional[StashInterface] = None +progress: float = 0.0 +total_tasks: int = 0 +completed_tasks: int = 0 + +# ----------------- Optical Flow Functions ----------------- + +def max_divergence(flow): + """ + Computes the divergence of the optical flow over the whole image and returns + the pixel (x, y) with the highest absolute divergence along with its value. + """ + div = np.gradient(flow[..., 0], axis=0) + np.gradient(flow[..., 1], axis=1) + y, x = np.unravel_index(np.argmax(np.abs(div)), div.shape) + return x, y, div[y, x] + + +def radial_motion_weighted(flow, center, is_cut, pov_mode=False, balance_global=True): + """ + Computes signed radial motion: positive for outward motion, negative for inward motion. + Closer pixels have higher weight. + """ + if is_cut: + return 0.0 + h, w, _ = flow.shape + y, x = np.indices((h, w)) + dx = x - center[0] + dy = y - center[1] + + dot = flow[..., 0] * dx + flow[..., 1] * dy + + if pov_mode or not balance_global: + return np.mean(dot) + + weighted_dot = np.where(x > center[0], dot * (w - x) / w, dot * x / w) + weighted_dot = np.where(y > center[1], weighted_dot * (h - y) / h, weighted_dot * y / h) + + return np.mean(weighted_dot) + + +def precompute_flow_info(p0, p1, params): + """ + Compute optical flow and extract relevant information for funscript generation. + """ + cut_threshold = params.get("cut_threshold", 7) + + flow = cv2.calcOpticalFlowFarneback(p0, p1, None, 0.5, 3, 15, 3, 5, 1.2, 0) + + if params.get("pov_mode"): + max_val = (p0.shape[1] // 2, p0.shape[0] - 1, 0) + else: + max_val = max_divergence(flow) + + pos_center = max_val[0:2] + val_pos = max_val[2] + + mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1]) + mean_mag = np.mean(mag) + is_cut = mean_mag > cut_threshold + + return { + "flow": flow, + "pos_center": pos_center, + "neg_center": pos_center, + "val_pos": val_pos, + "val_neg": val_pos, + "cut": is_cut, + "cut_center": pos_center[0], + "mean_mag": mean_mag + } + + +def precompute_wrapper(p, params): + return precompute_flow_info(p[0], p[1], params) + + +def find_intel_arc_render_device() -> Optional[str]: + """ + Find the render device path (/dev/dri/renderD*) for the Intel Arc GPU. + Returns the device path or None if not found. + """ + try: + # Check all render devices + render_devices = [] + for item in os.listdir("/dev/dri/"): + if item.startswith("renderD"): + render_devices.append(f"/dev/dri/{item}") + + # Try each render device to find the Intel Arc one + for render_dev in sorted(render_devices): + try: + result = subprocess.run( + ["vainfo", "--display", "drm", "--device", render_dev], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode == 0 and "Intel" in result.stdout: + # Check if it supports AV1 (Arc GPUs support AV1) + if "AV1" in result.stdout or "av1" in result.stdout.lower(): + return render_dev + except (FileNotFoundError, subprocess.TimeoutExpired, subprocess.SubprocessError): + continue + + # Fallback: if we found Intel but no AV1, still return the first Intel device + for render_dev in sorted(render_devices): + try: + result = subprocess.run( + ["vainfo", "--display", "drm", "--device", render_dev], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode == 0 and "Intel" in result.stdout: + return render_dev + except (FileNotFoundError, subprocess.TimeoutExpired, subprocess.SubprocessError): + continue + + return None + except Exception: + return None + + +def detect_intel_arc_gpu() -> Tuple[bool, Optional[str], Optional[str]]: + """ + Detect if an Intel Arc GPU is available. + Returns (is_available, device_name_or_error, render_device_path). + """ + render_device: Optional[str] = None + try: + # Method 1: Check /sys/class/drm for Intel graphics devices + drm_path = "/sys/class/drm" + if os.path.exists(drm_path): + for item in os.listdir(drm_path): + if item.startswith("card") and os.path.isdir(os.path.join(drm_path, item)): + device_path = os.path.join(drm_path, item, "device", "vendor") + if os.path.exists(device_path): + with open(device_path, "r") as f: + vendor_id = f.read().strip() + # Intel vendor ID is 0x8086 + if vendor_id == "0x8086" or vendor_id == "8086": + # Check device name + uevent_path = os.path.join(drm_path, item, "device", "uevent") + if os.path.exists(uevent_path): + with open(uevent_path, "r") as uf: + uevent_data = uf.read() + # Check for Arc-specific device IDs or names + # Intel Arc GPU device ID ranges: + # - 569x series: Arc A310 (e.g., 0x5690-0x569F) + # - 56Ax series: Arc A380 (e.g., 0x56A0-0x56AF) + # - 56Bx series: Arc A750, A770 (e.g., 0x56B0-0x56BF) + # Format in uevent: PCI_ID=8086:56A5 or PCI_ID=0000:0000:8086:56A5 + device_id_line = [line for line in uevent_data.split("\n") if "PCI_ID" in line] + if device_id_line: + device_id = device_id_line[0].split("=")[-1] if "=" in device_id_line[0] else "" + # Extract device ID part (after vendor ID 8086) + # Handle formats like "8086:56A5" or "0000:0000:8086:56A5" + arc_detected = False + if ":" in device_id: + parts = device_id.split(":") + # Find the part after 8086 (vendor ID) + for i, part in enumerate(parts): + if part.upper() == "8086" and i + 1 < len(parts): + device_part = parts[i + 1].upper() + # Check if it's an Arc GPU device ID + if any(arc_id in device_part for arc_id in ["569", "56A", "56B"]): + arc_detected = True + break + # Fallback: check if any Arc ID is in the full device_id string + if not arc_detected: + arc_detected = any(arc_id in device_id.upper() for arc_id in ["569", "56A", "56B"]) + if arc_detected: + # Find the corresponding render device + render_device = find_intel_arc_render_device() + return True, f"Intel Arc GPU (device: {device_id})", render_device + + # Method 2: Try using lspci if available + try: + result = subprocess.run( + ["lspci"], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode == 0: + for line in result.stdout.split("\n"): + if "VGA" in line or "Display" in line: + if "Intel" in line and ("Arc" in line or "A" in line.split("Intel")[-1].split()[0] if len(line.split("Intel")) > 1 else False): + # Find the corresponding render device + render_device = find_intel_arc_render_device() + return True, f"Intel Arc GPU detected via lspci: {line.strip()}", render_device + except (FileNotFoundError, subprocess.TimeoutExpired): + pass + + # Method 3: Check vaapi devices (try all render devices) + # This is a fallback method that checks VAAPI directly + render_device = find_intel_arc_render_device() + if render_device: + # Verify it supports AV1 + try: + result = subprocess.run( + ["vainfo", "--display", "drm", "--device", render_device], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode == 0 and "Intel" in result.stdout: + # Check if it supports AV1 + if "AV1" in result.stdout or "av1" in result.stdout.lower(): + return True, "Intel Arc GPU (VAAPI with AV1 support)", render_device + except (FileNotFoundError, subprocess.TimeoutExpired): + pass + + return False, "No Intel Arc GPU detected", None + except Exception as e: + return False, f"Error detecting GPU: {e}", None + + +def enable_intel_arc_hardware_acceleration(render_device: Optional[str] = None) -> None: + """ + Enable Intel Arc GPU hardware acceleration via VAAPI. + + This function sets environment variables that force FFmpeg/decord to use the Intel Arc GPU + for hardware-accelerated video decoding. The iHD driver will automatically select the + Intel Arc GPU when LIBVA_DRIVER_NAME is set to "iHD". + + Args: + render_device: Path to the render device (e.g., /dev/dri/renderD128). + If None, will try to detect it automatically. + Note: libva typically auto-selects the correct device, but specifying + it explicitly ensures the right GPU is used. + """ + # Remove software-only restrictions + os.environ.pop("DECORD_CPU_ONLY", None) + os.environ.pop("FFMPEG_HWACCEL", None) + os.environ.pop("AVCODEC_FORCE_SOFTWARE", None) + + # Enable VAAPI hardware acceleration for Intel Arc + # Setting LIBVA_DRIVER_NAME to "iHD" forces libva to use the Intel HD Graphics driver + # which supports Intel Arc GPUs and AV1 hardware acceleration + os.environ["LIBVA_DRIVER_NAME"] = "iHD" + # Don't set LIBVA_DRIVERS_PATH to allow system to find the driver automatically + os.environ.pop("LIBVA_DRIVERS_PATH", None) + + # Enable hardware acceleration in FFmpeg (used by decord) + os.environ["FFMPEG_HWACCEL"] = "vaapi" + + # Specify the render device explicitly to ensure we use the Intel Arc GPU + # libva will use this device when initializing the iHD driver + if render_device: + # Some systems respect these environment variables for device selection + os.environ["LIBVA_DRIVER_DEVICE"] = render_device + # Alternative variable name that some tools use + os.environ["VAAPI_DEVICE"] = render_device + else: + # Try to find the device automatically + detected_device = find_intel_arc_render_device() + if detected_device: + os.environ["LIBVA_DRIVER_DEVICE"] = detected_device + os.environ["VAAPI_DEVICE"] = detected_device + + # Suppress FFmpeg report messages + os.environ["FFREPORT"] = "file=/dev/null:level=0" + + +def enable_software_decoding() -> None: + """ + Enable software-only decoding by setting environment variables. + + These environment variables are set at the Python process level and will override + any system-wide or user-level settings. They take effect for: + - The current Python process + - All child processes (including FFmpeg subprocesses) + - OpenCV's FFmpeg backend + - Decord's FFmpeg backend + + Note: Process-level environment variables (set via os.environ) have the highest + precedence and will override system/user settings. + + This function aggressively disables ALL hardware acceleration, including Intel Arc GPU. + """ + # Force software decoding - these override any system/user settings + os.environ["DECORD_CPU_ONLY"] = "1" + os.environ["FFMPEG_HWACCEL"] = "none" + + # Aggressively disable VAAPI (Video Acceleration API) completely + # Clear any Intel Arc GPU settings that might have been set + os.environ["LIBVA_DRIVERS_PATH"] = "/dev/null" # Invalid path disables VAAPI + os.environ["LIBVA_DRIVER_NAME"] = "" # Clear driver name (removes iHD setting) + os.environ.pop("LIBVA_DRIVER_DEVICE", None) # Remove device setting + os.environ.pop("VAAPI_DEVICE", None) # Remove alternative device setting + + # Force software decoding in libavcodec (FFmpeg's codec library) + os.environ["AVCODEC_FORCE_SOFTWARE"] = "1" + + # Suppress FFmpeg logging (warnings about hardware acceleration failures) + os.environ["FFREPORT"] = "file=/dev/null:level=0" + os.environ["FFMPEG_LOGLEVEL"] = "error" # Only show errors, suppress warnings + + # Additional FFmpeg options to prevent hardware acceleration attempts + os.environ["FFMPEG_HWACCEL_DEVICE"] = "" + + # Explicitly disable all hardware acceleration methods + os.environ["FFMPEG_HWACCEL_OUTPUT_FORMAT"] = "" + + +def disable_software_decoding() -> None: + """Disable software-only decoding by removing environment variables.""" + os.environ.pop("DECORD_CPU_ONLY", None) + os.environ.pop("FFMPEG_HWACCEL", None) + os.environ.pop("LIBVA_DRIVERS_PATH", None) + os.environ.pop("LIBVA_DRIVER_NAME", None) + os.environ.pop("AVCODEC_FORCE_SOFTWARE", None) + os.environ.pop("FFREPORT", None) + + +def is_av1_hardware_error(error_msg: str) -> bool: + """Check if error is related to AV1 hardware acceleration failure.""" + error_lower = error_msg.lower() + return ( + "av1" in error_lower and + ("failed to get pixel format" in error_lower or + "doesn't suppport hardware accelerated" in error_lower or + "hardware accelerated" in error_lower) + ) + + +def probe_video_streams(video_path: str) -> Tuple[bool, Optional[int], Optional[str]]: + """ + Probe video file to find the correct video stream index. + Returns (success, video_stream_index, error_message). + """ + try: + cmd = [ + "ffprobe", + "-v", "error", + "-select_streams", "v", + "-show_entries", "stream=index,codec_type", + "-of", "json", + video_path + ] + result = subprocess.run(cmd, capture_output=True, text=True, timeout=10) + + if result.returncode != 0: + return False, None, f"ffprobe failed: {result.stderr}" + + data = json.loads(result.stdout) + streams = data.get("streams", []) + + # Find the first video stream + for stream in streams: + if stream.get("codec_type") == "video": + stream_index = stream.get("index") + if stream_index is not None: + return True, int(stream_index), None + + return False, None, "No video stream found in file" + except subprocess.TimeoutExpired: + return False, None, "ffprobe timed out" + except json.JSONDecodeError as e: + return False, None, f"Failed to parse ffprobe output: {e}" + except Exception as e: + return False, None, f"Error probing video: {e}" + + +def validate_video_file(video_path: str) -> Tuple[bool, Optional[str]]: + """ + Validate that a video file can be opened with OpenCV. + Returns (is_valid, error_message). + """ + if not os.path.exists(video_path): + return False, f"Video file does not exist: {video_path}" + + if not os.path.isfile(video_path): + return False, f"Path is not a file: {video_path}" + + cap = cv2.VideoCapture(video_path) + if not cap.isOpened(): + cap.release() + return False, f"OpenCV cannot open video file: {video_path}" + + frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) + fps = cap.get(cv2.CAP_PROP_FPS) + cap.release() + + if frame_count <= 0: + return False, f"Video file has no frames: {video_path}" + + if fps <= 0: + return False, f"Video file has invalid FPS: {video_path}" + + return True, None + + +def fetch_frames_opencv(video_path: str, chunk: List[int], params: Dict[str, Any]) -> List[np.ndarray]: + """ + Fetch frames using OpenCV as fallback when decord fails. + Software decoding is enforced via environment variables set before calling this function. + FFmpeg warnings about AV1 hardware acceleration are suppressed (FFmpeg will fall back to software). + + IMPORTANT: FFmpeg has BUILT-IN automatic fallback to software decoding. + Even if environment variables are ignored, FFmpeg will: + 1. Try hardware acceleration first (if available) + 2. If hardware fails, automatically fall back to software decoding + 3. Continue processing successfully with software decoding + + The AV1 hardware warnings you see are just warnings - FFmpeg continues with software decoding. + """ + frames_gray = [] + target_width = 512 if params.get("vr_mode") else 256 + target_height = 512 if params.get("vr_mode") else 256 + + # Ensure software decoding is enforced (in case it wasn't set properly) + # This is a safety check - environment variables should already be set + enable_software_decoding() + + # Suppress FFmpeg stderr output (these AV1 hardware errors are harmless - FFmpeg falls back to software) + import sys + import io + old_stderr = sys.stderr + suppressed_stderr = io.StringIO() + + try: + # Temporarily redirect stderr to suppress FFmpeg AV1 hardware warnings + # FFmpeg will try hardware first, fail, then AUTOMATICALLY fall back to software - these are just warnings + sys.stderr = suppressed_stderr + + # Try opening with OpenCV - use CAP_FFMPEG backend explicitly and disable hardware acceleration + # OpenCV's VideoCapture may need explicit backend selection to respect our environment variables + cap = cv2.VideoCapture(video_path, cv2.CAP_FFMPEG) + if not cap.isOpened(): + # Try without explicit backend + cap = cv2.VideoCapture(video_path) + if not cap.isOpened(): + # Restore stderr before returning + sys.stderr = old_stderr + suppressed_stderr.close() + return frames_gray + + try: + frames_read = 0 + frames_failed = 0 + + # For AV1 videos, seeking can be unreliable. Try sequential reading if seeking fails + # Sort chunk indices to read sequentially when possible + sorted_chunk = sorted(chunk) + current_pos = -1 + + for frame_idx in sorted_chunk: + # Try seeking first + if current_pos != frame_idx - 1: + # Need to seek + cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx) + current_pos = frame_idx + else: + # Sequential read - more reliable for AV1 + current_pos += 1 + + # Try reading frame - FFmpeg will automatically use software if hardware fails + ret, frame = cap.read() + if not ret or frame is None: + frames_failed += 1 + # If seeking failed, try sequential reading from start + if current_pos != frame_idx: + # Reset and read sequentially + cap.set(cv2.CAP_PROP_POS_FRAMES, 0) + for i in range(frame_idx + 1): + ret, frame = cap.read() + if not ret or frame is None: + break + if not ret or frame is None: + continue + else: + # Already sequential, just try one more read + ret, frame = cap.read() + if not ret or frame is None: + continue + + frames_read += 1 + current_pos = frame_idx + + # Resize frame + frame_resized = cv2.resize(frame, (target_width, target_height), interpolation=cv2.INTER_LINEAR) + + # Convert to grayscale + if params.get("vr_mode"): + h, w = frame_resized.shape[:2] + gray = cv2.cvtColor(frame_resized[h // 2:, :w // 2], cv2.COLOR_BGR2GRAY) + else: + gray = cv2.cvtColor(frame_resized, cv2.COLOR_BGR2GRAY) + + frames_gray.append(gray) + + # If we read frames successfully, FFmpeg's automatic fallback worked + # (The AV1 warnings are harmless - FFmpeg fell back to software automatically) + # Log diagnostic info if we failed to read frames + if frames_read == 0 and len(chunk) > 0: + # This would indicate an actual problem, not just warnings + # The AV1 warnings are harmless, but if we can't read frames, there's a real issue + pass # Will return empty list, which is handled by caller + finally: + cap.release() + finally: + # Restore stderr + sys.stderr = old_stderr + # Discard suppressed output (FFmpeg AV1 hardware warnings) + suppressed_stderr.close() + + return frames_gray + + +def fetch_frames(video_path, chunk, params): + """Fetch and preprocess frames from video.""" + frames_gray = [] + vr: Optional[VideoReader] = None + target_width = 512 if params.get("vr_mode") else 256 + target_height = 512 if params.get("vr_mode") else 256 + + # Try multiple strategies for VideoReader initialization + initialization_strategies = [ + # Strategy 1: With width/height (preferred for performance) + {"width": target_width, "height": target_height, "num_threads": params["threads"]}, + # Strategy 2: Without width/height (will resize frames manually) + {"num_threads": params["threads"]}, + # Strategy 3: Lower resolution + {"width": target_width // 2, "height": target_height // 2, "num_threads": params["threads"]}, + # Strategy 4: Single thread + {"width": target_width, "height": target_height, "num_threads": 1}, + # Strategy 5: Minimal parameters + {}, + ] + + batch_frames = None + needs_resize = False + av1_hardware_error_detected = False + + # First attempt: Try with current settings (hardware acceleration if enabled) + for strategy in initialization_strategies: + vr = None + try: + vr = VideoReader(video_path, ctx=cpu(0), **strategy) + batch_frames = vr.get_batch(chunk).asnumpy() + # Check if we got frames without the desired size + if batch_frames.size > 0 and "width" not in strategy: + needs_resize = True + # Success - break out of loop, vr will be cleaned up after processing + break + except Exception as e: + error_msg = str(e) + # Check if this is an AV1 hardware acceleration error + if is_av1_hardware_error(error_msg): + av1_hardware_error_detected = True + break # Exit to try software decoding + # Failed with this strategy, try next one + if vr is not None: + vr = None + continue + + # If AV1 hardware acceleration failed, retry with software decoding + if batch_frames is None and av1_hardware_error_detected: + enable_software_decoding() + # Retry all strategies with software decoding + for strategy in initialization_strategies: + vr = None + try: + vr = VideoReader(video_path, ctx=cpu(0), **strategy) + batch_frames = vr.get_batch(chunk).asnumpy() + # Check if we got frames without the desired size + if batch_frames.size > 0 and "width" not in strategy: + needs_resize = True + # Success - break out of loop + break + except Exception: + # Failed with this strategy, try next one + if vr is not None: + vr = None + continue + + # Clean up VideoReader after getting frames + if vr is not None: + vr = None + gc.collect() + + if batch_frames is None or batch_frames.size == 0: + return frames_gray + + for f in batch_frames: + # Resize if needed (when VideoReader was initialized without width/height) + if needs_resize: + f = cv2.resize(f, (target_width, target_height), interpolation=cv2.INTER_LINEAR) + + if params.get("vr_mode"): + h, w, _ = f.shape + gray = cv2.cvtColor(f[h // 2:, :w // 2], cv2.COLOR_RGB2GRAY) + else: + gray = cv2.cvtColor(f, cv2.COLOR_RGB2GRAY) + frames_gray.append(gray) + + return frames_gray + + +# ----------------- OpenSimplex Noise Generator ----------------- + +class OpenSimplex: + """OpenSimplex noise generator for smooth, natural random motion.""" + PSIZE = 2048 + PMASK = PSIZE - 1 + + def __init__(self, seed=None): + if seed is None: + seed = random.randint(0, 2**63 - 1) + + self._perm = [0] * self.PSIZE + self._grad = [(0.0, 0.0)] * self.PSIZE + + grad_base = [ + (0.130526192220052, 0.991444861373810), + (0.382683432365090, 0.923879532511287), + (0.608761429008721, 0.793353340291235), + (0.793353340291235, 0.608761429008721), + (0.923879532511287, 0.382683432365090), + (0.991444861373810, 0.130526192220051), + (0.991444861373810, -0.130526192220051), + (0.923879532511287, -0.382683432365090), + (0.793353340291235, -0.608761429008720), + (0.608761429008721, -0.793353340291235), + (0.382683432365090, -0.923879532511287), + (0.130526192220052, -0.991444861373810), + (-0.130526192220052, -0.991444861373810), + (-0.382683432365090, -0.923879532511287), + (-0.608761429008721, -0.793353340291235), + (-0.793353340291235, -0.608761429008721), + (-0.923879532511287, -0.382683432365090), + (-0.991444861373810, -0.130526192220052), + (-0.991444861373810, 0.130526192220051), + (-0.923879532511287, 0.382683432365090), + (-0.793353340291235, 0.608761429008721), + (-0.608761429008721, 0.793353340291235), + (-0.382683432365090, 0.923879532511287), + (-0.130526192220052, 0.991444861373810) + ] + + n = 0.05481866495625118 + self._grad_lookup = [(dx / n, dy / n) for dx, dy in grad_base] + + source = list(range(self.PSIZE)) + for i in range(self.PSIZE - 1, -1, -1): + seed = (seed * 6364136223846793005 + 1442695040888963407) & 0xFFFFFFFFFFFFFFFF + r = int((seed + 31) % (i + 1)) + if r < 0: + r += i + 1 + self._perm[i] = source[r] + self._grad[i] = self._grad_lookup[self._perm[i] % len(self._grad_lookup)] + source[r] = source[i] + + def calculate_2d(self, x, y): + s = 0.366025403784439 * (x + y) + return self._calculate_2d_impl(x + s, y + s) + + def calculate_2d_octaves(self, x, y, octaves=1, persistence=1.0, lacunarity=1.0): + frequency = 1.0 + amplitude = 1.0 + total_value = 0.0 + total_amplitude = 0.0 + + for _ in range(octaves): + total_value += self.calculate_2d(x * frequency, y * frequency) * amplitude + total_amplitude += amplitude + amplitude *= persistence + frequency *= lacunarity + + return total_value / total_amplitude if total_amplitude > 0 else 0 + + def _calculate_2d_impl(self, xs, ys): + xsb = int(math.floor(xs)) + ysb = int(math.floor(ys)) + xsi = xs - xsb + ysi = ys - ysb + + a = int(xsi + ysi) + + ssi = (xsi + ysi) * -0.211324865405187 + xi = xsi + ssi + yi = ysi + ssi + + value = 0.0 + + value += self._contribute(xsb, ysb, xi, yi) + value += self._contribute(xsb + 1, ysb + 1, xi - 1 + 2 * 0.211324865405187, yi - 1 + 2 * 0.211324865405187) + + if a == 0: + value += self._contribute(xsb + 1, ysb, xi - 1 + 0.211324865405187, yi + 0.211324865405187) + value += self._contribute(xsb, ysb + 1, xi + 0.211324865405187, yi - 1 + 0.211324865405187) + else: + value += self._contribute(xsb + 2, ysb + 1, xi - 2 + 3 * 0.211324865405187, yi - 1 + 3 * 0.211324865405187) + value += self._contribute(xsb + 1, ysb + 2, xi - 1 + 3 * 0.211324865405187, yi - 2 + 3 * 0.211324865405187) + + return value + + def _contribute(self, xsb, ysb, dx, dy): + attn = 2.0 / 3.0 - dx * dx - dy * dy + if attn <= 0: + return 0 + + pxm = xsb & self.PMASK + pym = ysb & self.PMASK + grad = self._grad[self._perm[pxm] ^ pym] + extrapolation = grad[0] * dx + grad[1] * dy + + attn *= attn + return attn * attn * extrapolation + + +# ----------------- Multi-Axis Generation ----------------- + +MULTI_AXIS_CONFIG = { + "surge": { + "name": "L1", + "friendly_name": "Forward/Backward", + "file_suffix": "surge", + "default_value": 50, + "phase_offset": 0.25, + }, + "sway": { + "name": "L2", + "friendly_name": "Left/Right", + "file_suffix": "sway", + "default_value": 50, + "phase_offset": 0.5, + }, + "twist": { + "name": "R0", + "friendly_name": "Twist", + "file_suffix": "twist", + "default_value": 50, + "phase_offset": 0.0, + }, + "roll": { + "name": "R1", + "friendly_name": "Roll", + "file_suffix": "roll", + "default_value": 50, + "phase_offset": 0.33, + }, + "pitch": { + "name": "R2", + "friendly_name": "Pitch", + "file_suffix": "pitch", + "default_value": 50, + "phase_offset": 0.66, + }, +} + + +class MultiAxisGenerator: + """Generates secondary axis funscripts from primary L0 (stroke) data.""" + + def __init__(self, settings): + self.settings = settings + self.intensity = settings.get("multi_axis_intensity", 0.5) + self.random_speed = settings.get("random_speed", 0.3) + self.smart_limit = settings.get("smart_limit", True) + self.auto_home_delay = settings.get("auto_home_delay", 1.0) + self.auto_home_duration = settings.get("auto_home_duration", 0.5) + + self.noise_generators = { + axis_name: OpenSimplex(seed=hash(axis_name) & 0xFFFFFFFF) + for axis_name in MULTI_AXIS_CONFIG.keys() + } + + def generate_all_axes(self, l0_actions, fps, log_func=None): + if not l0_actions or len(l0_actions) < 2: + return {} + + activity_data = self._analyze_activity(l0_actions) + + results = {} + for axis_name, axis_config in MULTI_AXIS_CONFIG.items(): + if log_func: + log_func(f"Generating {axis_config['friendly_name']} ({axis_config['name']}) axis...") + + axis_actions = self._generate_axis( + axis_name, + axis_config, + l0_actions, + activity_data, + fps + ) + + axis_actions = self._apply_auto_home(axis_actions, activity_data, axis_config) + results[axis_name] = axis_actions + + if log_func: + log_func(f" Generated {len(axis_actions)} actions for {axis_config['file_suffix']}") + + return results + + def _analyze_activity(self, l0_actions): + velocities = [] + activity_levels = [] + + for i in range(len(l0_actions)): + if i == 0: + velocities.append(0) + else: + dt = (l0_actions[i]["at"] - l0_actions[i-1]["at"]) / 1000.0 + if dt > 0: + dp = abs(l0_actions[i]["pos"] - l0_actions[i-1]["pos"]) + velocities.append(dp / dt) + else: + velocities.append(0) + + max_vel = max(velocities) if velocities else 1 + if max_vel > 0: + activity_levels = [min(1.0, v / max_vel) for v in velocities] + else: + activity_levels = [0] * len(velocities) + + window_size = min(5, len(activity_levels)) + smoothed_activity = [] + for i in range(len(activity_levels)): + start = max(0, i - window_size // 2) + end = min(len(activity_levels), i + window_size // 2 + 1) + smoothed_activity.append(sum(activity_levels[start:end]) / (end - start)) + + idle_periods = [] + idle_threshold = 0.1 + min_idle_duration_ms = self.auto_home_delay * 1000 + + idle_start = None + for i, (action, activity) in enumerate(zip(l0_actions, smoothed_activity)): + if activity < idle_threshold: + if idle_start is None: + idle_start = action["at"] + else: + if idle_start is not None: + idle_duration = action["at"] - idle_start + if idle_duration >= min_idle_duration_ms: + idle_periods.append((idle_start, action["at"])) + idle_start = None + + if idle_start is not None and l0_actions: + idle_duration = l0_actions[-1]["at"] - idle_start + if idle_duration >= min_idle_duration_ms: + idle_periods.append((idle_start, l0_actions[-1]["at"])) + + return { + "velocities": velocities, + "activity_levels": smoothed_activity, + "idle_periods": idle_periods + } + + def _generate_axis(self, axis_name, axis_config, l0_actions, activity_data, fps): + noise = self.noise_generators[axis_name] + phase_offset = axis_config["phase_offset"] + default_value = axis_config["default_value"] + + actions = [] + + for i, l0_action in enumerate(l0_actions): + timestamp_ms = l0_action["at"] + time_sec = timestamp_ms / 1000.0 + + noise_x = time_sec * self.random_speed + phase_offset * 10 + noise_y = time_sec * self.random_speed * 0.7 + phase_offset * 5 + + noise_value = noise.calculate_2d_octaves( + noise_x, noise_y, + octaves=2, + persistence=0.5, + lacunarity=2.0 + ) + + raw_pos = default_value + noise_value * 50 * self.intensity + + if self.smart_limit and i < len(activity_data["activity_levels"]): + activity = activity_data["activity_levels"][i] + deviation = raw_pos - default_value + raw_pos = default_value + deviation * activity + + pos = int(round(max(0, min(100, raw_pos)))) + actions.append({"at": timestamp_ms, "pos": pos}) + + return actions + + def _apply_auto_home(self, actions, activity_data, axis_config): + if not actions or not activity_data["idle_periods"]: + return actions + + default_value = axis_config["default_value"] + home_duration_ms = self.auto_home_duration * 1000 + + result_actions = [] + idle_periods = activity_data["idle_periods"] + + for action in actions: + timestamp_ms = action["at"] + + in_idle = False + for idle_start, idle_end in idle_periods: + if idle_start <= timestamp_ms <= idle_end: + in_idle = True + idle_progress = (timestamp_ms - idle_start) / home_duration_ms + idle_progress = min(1.0, idle_progress) + + ease = 1 - (1 - idle_progress) ** 2 + current_pos = action["pos"] + homed_pos = int(round(current_pos + (default_value - current_pos) * ease)) + + result_actions.append({"at": timestamp_ms, "pos": homed_pos}) + break + + if not in_idle: + result_actions.append(action) + + return result_actions + + def save_axis_funscript(self, base_path, axis_name, actions, log_func=None): + axis_config = MULTI_AXIS_CONFIG.get(axis_name) + if not axis_config: + return False + + output_path = f"{base_path}.{axis_config['file_suffix']}.funscript" + + funscript = { + "version": "1.0", + "inverted": False, + "range": 100, + "actions": actions + } + + try: + with open(output_path, "w") as f: + json.dump(funscript, f, indent=2) + if log_func: + log_func(f"Multi-axis funscript saved: {output_path}") + return True + except Exception as e: + if log_func: + log_func(f"ERROR: Could not save {output_path}: {e}") + return False + + +# ----------------- Main Processing Function ----------------- + +def process_video(video_path: str, params: Dict[str, Any], log_func: Callable, + progress_callback: Optional[Callable] = None, + cancel_flag: Optional[Callable] = None) -> bool: + """ + Process a video file and generate funscript. + Returns True if an error occurred, False otherwise. + """ + error_occurred = False + base, _ = os.path.splitext(video_path) + output_path = base + ".funscript" + + if os.path.exists(output_path) and not params.get("overwrite", False): + log_func(f"Skipping: output file exists ({output_path})") + return error_occurred + + # Validate video file before attempting to process + is_valid, validation_error = validate_video_file(video_path) + if not is_valid: + log_func(f"ERROR: Video validation failed: {validation_error}") + return True + + log_func(f"Processing video: {video_path}") + + # Probe video to get stream information + probe_success, video_stream_index, probe_error = probe_video_streams(video_path) + if probe_success and video_stream_index is not None: + log_func(f"Found video stream at index {video_stream_index}") + + # Detect Intel Arc GPU and configure hardware acceleration + intel_arc_detected, arc_info, render_device = detect_intel_arc_gpu() + if intel_arc_detected: + log_func(f"Intel Arc GPU detected: {arc_info}") + if render_device: + log_func(f"Using render device: {render_device}") + log_func("Configuring hardware acceleration for Intel Arc AV1 decoding...") + log_func("Note: If hardware acceleration fails, FFmpeg will AUTOMATICALLY fall back to software decoding") + enable_intel_arc_hardware_acceleration(render_device) + else: + log_func(f"No Intel Arc GPU detected ({arc_info}), using software decoding") + enable_software_decoding() + + # Try multiple initialization strategies for decord VideoReader + vr: Optional[VideoReader] = None + initialization_strategies = [ + # Strategy 1: With width/height (original approach) + {"width": 1024, "height": 1024, "num_threads": params["threads"]}, + # Strategy 2: Without width/height (native resolution, resize later) + {"num_threads": params["threads"]}, + # Strategy 3: Lower resolution + {"width": 512, "height": 512, "num_threads": params["threads"]}, + # Strategy 4: Single thread + {"width": 1024, "height": 1024, "num_threads": 1}, + # Strategy 5: No parameters (minimal) + {}, + ] + + last_error: Optional[str] = None + av1_hardware_error_detected = False + + # First attempt: Try with detected configuration (Intel Arc if detected, otherwise software) + if intel_arc_detected: + log_func("Attempting to open video with Intel Arc hardware acceleration...") + else: + log_func("Attempting to open video with software decoding...") + + for i, strategy in enumerate(initialization_strategies): + try: + log_func(f"Trying VideoReader initialization strategy {i+1}/{len(initialization_strategies)}...") + vr = VideoReader(video_path, ctx=cpu(0), **strategy) + # Test that we can actually read properties + _ = len(vr) + _ = vr.get_avg_fps() + if intel_arc_detected: + log_func(f"Successfully opened video with Intel Arc hardware acceleration using strategy {i+1}") + else: + log_func(f"Successfully opened video with software decoding using strategy {i+1}") + break + except Exception as e: + error_msg = str(e) + last_error = error_msg + + # Check if this is an AV1 hardware acceleration error + if is_av1_hardware_error(error_msg): + av1_hardware_error_detected = True + log_func(f"AV1 hardware acceleration error detected, will fallback to software decoding") + break # Exit loop to try software decoding + + if "cannot find video stream" in error_msg or "st_nb" in error_msg: + # This is the specific error we're trying to fix, try next strategy + continue + else: + # Other errors, try next strategy + continue + + # If AV1 hardware acceleration failed, retry with software decoding + if vr is None and av1_hardware_error_detected: + log_func("Falling back to software decoding due to AV1 hardware acceleration issues...") + enable_software_decoding() + + # Retry all strategies with software decoding + for i, strategy in enumerate(initialization_strategies): + try: + log_func(f"Trying VideoReader initialization strategy {i+1}/{len(initialization_strategies)} (software decoding)...") + vr = VideoReader(video_path, ctx=cpu(0), **strategy) + # Test that we can actually read properties + _ = len(vr) + _ = vr.get_avg_fps() + log_func(f"Successfully opened video with software decoding using strategy {i+1}") + break + except Exception as e: + error_msg = str(e) + last_error = error_msg + if "cannot find video stream" in error_msg or "st_nb" in error_msg: + continue + else: + continue + + # If decord completely failed, try OpenCV as a fallback + use_opencv_fallback = False + if vr is None: + error_msg = last_error or "Unknown error" + log_func(f"WARNING: Decord failed to open video with all strategies.") + log_func(f"WARNING: Last decord error: {error_msg}") + if probe_success: + log_func(f"WARNING: Video has valid stream at index {video_stream_index}, but decord cannot access it.") + log_func("Attempting to use OpenCV as fallback (slower but more compatible)...") + # CRITICAL: Force software decoding when using OpenCV fallback + # This MUST override any Intel Arc GPU hardware acceleration settings that were enabled earlier + log_func("Disabling all hardware acceleration for OpenCV fallback (including Intel Arc GPU)...") + enable_software_decoding() + # Double-check that hardware acceleration is completely disabled + # Clear any Intel Arc GPU settings that might persist + if os.environ.get("LIBVA_DRIVER_NAME"): + log_func(f"Clearing LIBVA_DRIVER_NAME (was: '{os.environ.get('LIBVA_DRIVER_NAME')}')") + os.environ["LIBVA_DRIVER_NAME"] = "" + if os.environ.get("FFMPEG_HWACCEL") != "none": + log_func(f"Setting FFMPEG_HWACCEL to 'none' (was: '{os.environ.get('FFMPEG_HWACCEL')}')") + os.environ["FFMPEG_HWACCEL"] = "none" + # Remove any device-specific settings + os.environ.pop("LIBVA_DRIVER_DEVICE", None) + os.environ.pop("VAAPI_DEVICE", None) + use_opencv_fallback = True + + # Get video properties + if use_opencv_fallback: + # Use OpenCV to get video properties + # Ensure software decoding is enforced (safety check) + enable_software_decoding() + + # Suppress FFmpeg stderr warnings during property reading + import sys + import io + old_stderr = sys.stderr + suppressed_stderr = io.StringIO() + + try: + sys.stderr = suppressed_stderr + cap = cv2.VideoCapture(video_path) + if not cap.isOpened(): + log_func(f"ERROR: OpenCV fallback also failed to open video: {video_path}") + return True + + total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) + fps = cap.get(cv2.CAP_PROP_FPS) + cap.release() + finally: + sys.stderr = old_stderr + suppressed_stderr.close() + + if total_frames <= 0: + log_func(f"ERROR: Video has no frames: {video_path}") + return True + + if fps <= 0: + log_func(f"ERROR: Video has invalid FPS: {video_path}") + return True + + log_func(f"Using OpenCV fallback for video reading") + else: + # Use decord video properties + try: + total_frames = len(vr) + fps = vr.get_avg_fps() + + if total_frames <= 0: + log_func(f"ERROR: Video has no frames: {video_path}") + return True + + if fps <= 0: + log_func(f"ERROR: Video has invalid FPS: {video_path}") + return True + except Exception as e: + log_func(f"ERROR: Unable to read video properties: {e}") + return True + + step = max(1, int(math.ceil(fps / 15.0))) + effective_fps = fps / step + indices = list(range(0, total_frames, step)) + log_func(f"FPS: {fps:.2f}; downsampled to ~{effective_fps:.2f} fps; {len(indices)} frames selected.") + + step = max(1, int(math.ceil(fps / 30.0))) + indices = list(range(0, total_frames, step)) + bracket_size = int(params.get("batch_size", 3000)) + + # Store whether to use OpenCV fallback in params for fetch_frames + params["use_opencv_fallback"] = use_opencv_fallback + + final_flow_list = [] + next_batch = None + fetch_thread = None + + for chunk_start in range(0, len(indices), bracket_size): + if cancel_flag and cancel_flag(): + log_func("Processing cancelled by user.") + return error_occurred + + chunk = indices[chunk_start:chunk_start + bracket_size] + frame_indices = chunk[:-1] + if len(chunk) < 2: + continue + + if fetch_thread: + fetch_thread.join() + if params.get("use_opencv_fallback"): + frames_gray = next_batch if next_batch is not None else fetch_frames_opencv(video_path, chunk, params) + else: + frames_gray = next_batch if next_batch is not None else fetch_frames(video_path, chunk, params) + next_batch = None + else: + if params.get("use_opencv_fallback"): + frames_gray = fetch_frames_opencv(video_path, chunk, params) + else: + frames_gray = fetch_frames(video_path, chunk, params) + + if not frames_gray: + log_func(f"ERROR: Unable to fetch frames for chunk {chunk_start} - skipping.") + # If this is a critical chunk and we have no data, we might need to abort + if len(final_flow_list) == 0 and chunk_start == 0: + log_func("ERROR: Failed to fetch initial frames - cannot continue processing") + # Add diagnostic information + if params.get("use_opencv_fallback"): + log_func("DEBUG: Using OpenCV fallback - checking if video can be opened...") + import sys + import io + old_stderr = sys.stderr + suppressed_stderr = io.StringIO() + try: + sys.stderr = suppressed_stderr + test_cap = cv2.VideoCapture(video_path) + if test_cap.isOpened(): + test_frame_count = int(test_cap.get(cv2.CAP_PROP_FRAME_COUNT)) + test_fps = test_cap.get(cv2.CAP_PROP_FPS) + log_func(f"DEBUG: OpenCV can open video - frame_count={test_frame_count}, fps={test_fps}") + # Try reading a single frame + test_cap.set(cv2.CAP_PROP_POS_FRAMES, chunk[0] if chunk else 0) + ret, test_frame = test_cap.read() + if ret and test_frame is not None: + log_func(f"DEBUG: OpenCV can read frames - frame shape: {test_frame.shape}") + else: + log_func("DEBUG: OpenCV opened video but cannot read frames") + else: + log_func("DEBUG: OpenCV cannot open video file") + test_cap.release() + finally: + sys.stderr = old_stderr + suppressed_stderr.close() + return True + continue + + # Ensure we have at least 2 frames to create pairs + if len(frames_gray) < 2: + log_func(f"WARNING: Chunk {chunk_start} has insufficient frames ({len(frames_gray)}) - skipping.") + continue + + if chunk_start + bracket_size < len(indices): + next_chunk = indices[chunk_start + bracket_size:chunk_start + 2 * bracket_size] + def fetch_and_store(): + global next_batch + if params.get("use_opencv_fallback"): + next_batch = fetch_frames_opencv(video_path, next_chunk, params) + else: + next_batch = fetch_frames(video_path, next_chunk, params) + + fetch_thread = threading.Thread(target=fetch_and_store) + fetch_thread.start() + + pairs = list(zip(frames_gray[:-1], frames_gray[1:])) + + with Pool(processes=params["threads"]) as pool: + precomputed = pool.starmap(precompute_wrapper, [(p, params) for p in pairs]) + + final_centers = [] + for j, info in enumerate(precomputed): + center_list = [info["pos_center"]] + for i in range(1, 7): + if j - i >= 0: + center_list.append(precomputed[j - i]["pos_center"]) + if j + i < len(precomputed): + center_list.append(precomputed[j + i]["pos_center"]) + center_list = np.array(center_list) + center = np.mean(center_list, axis=0) + final_centers.append(center) + + with concurrent.futures.ProcessPoolExecutor(max_workers=params["threads"]) as ex: + dot_futures = [] + for j, info in enumerate(precomputed): + dot_futures.append(ex.submit( + radial_motion_weighted, + info["flow"], + final_centers[j], + info["cut"], + params.get("pov_mode", False), + params.get("balance_global", True) + )) + dot_vals = [f.result() for f in dot_futures] + + for j, dot_val in enumerate(dot_vals): + is_cut = precomputed[j]["cut"] + final_flow_list.append((dot_val, is_cut, frame_indices[j])) + + if progress_callback: + prog = min(100, int(100 * (chunk_start + len(chunk)) / len(indices))) + progress_callback(prog) + + # Piecewise Integration + if not final_flow_list: + log_func("ERROR: No flow data computed - video processing failed completely") + return True + + cum_flow = [0] + time_stamps = [final_flow_list[0][2]] + + for i in range(1, len(final_flow_list)): + flow_prev, cut_prev, t_prev = final_flow_list[i - 1] + flow_curr, cut_curr, t_curr = final_flow_list[i] + + if cut_curr: + cum_flow.append(0) + else: + mid_flow = (flow_prev + flow_curr) / 2 + cum_flow.append(cum_flow[-1] + mid_flow) + + time_stamps.append(t_curr) + + cum_flow = [(cum_flow[i] + cum_flow[i-1]) / 2 if i > 0 else cum_flow[i] for i in range(len(cum_flow))] + + # Detrending & Normalization + detrend_win = int(params["detrend_window"] * effective_fps) + disc_threshold = 1000 + + detrended_data = np.zeros_like(cum_flow) + weight_sum = np.zeros_like(cum_flow) + + disc_indices = np.where(np.abs(np.diff(cum_flow)) > disc_threshold)[0] + 1 + segment_boundaries = [0] + list(disc_indices) + [len(cum_flow)] + + overlap = detrend_win // 2 + + for i in range(len(segment_boundaries) - 1): + seg_start = segment_boundaries[i] + seg_end = segment_boundaries[i + 1] + seg_length = seg_end - seg_start + + if seg_length < 5: + detrended_data[seg_start:seg_end] = cum_flow[seg_start:seg_end] - np.mean(cum_flow[seg_start:seg_end]) + continue + if seg_length <= detrend_win: + segment = cum_flow[seg_start:seg_end] + x = np.arange(len(segment)) + trend = np.polyfit(x, segment, 1) + detrended_segment = segment - np.polyval(trend, x) + weights = np.hanning(len(segment)) + detrended_data[seg_start:seg_end] += detrended_segment * weights + weight_sum[seg_start:seg_end] += weights + else: + for start in range(seg_start, seg_end - overlap, overlap): + end = min(start + detrend_win, seg_end) + segment = cum_flow[start:end] + x = np.arange(len(segment)) + trend = np.polyfit(x, segment, 1) + detrended_segment = segment - np.polyval(trend, x) + weights = np.hanning(len(segment)) + detrended_data[start:end] += detrended_segment * weights + weight_sum[start:end] += weights + + detrended_data /= np.maximum(weight_sum, 1e-6) + + smoothed_data = np.convolve(detrended_data, [1/16, 1/4, 3/8, 1/4, 1/16], mode='same') + + norm_win = int(params["norm_window"] * effective_fps) + if norm_win % 2 == 0: + norm_win += 1 + half_norm = norm_win // 2 + norm_rolling = np.empty_like(smoothed_data) + for i in range(len(smoothed_data)): + start_idx = max(0, i - half_norm) + end_idx = min(len(smoothed_data), i + half_norm + 1) + local_window = smoothed_data[start_idx:end_idx] + local_min = local_window.min() + local_max = local_window.max() + if local_max - local_min == 0: + norm_rolling[i] = 50 + else: + norm_rolling[i] = (smoothed_data[i] - local_min) / (local_max - local_min) * 100 + + # Keyframe Reduction + if params.get("keyframe_reduction", True): + key_indices = [0] + for i in range(1, len(norm_rolling) - 1): + d1 = norm_rolling[i] - norm_rolling[i - 1] + d2 = norm_rolling[i + 1] - norm_rolling[i] + + if (d1 < 0) != (d2 < 0): + key_indices.append(i) + key_indices.append(len(norm_rolling) - 1) + else: + key_indices = range(len(norm_rolling)) + + actions = [] + for ki in key_indices: + try: + timestamp_ms = int(((time_stamps[ki]) / fps) * 1000) + pos = int(round(norm_rolling[ki])) + actions.append({"at": timestamp_ms, "pos": 100 - pos}) + except Exception as e: + log_func(f"Error computing action at segment index {ki}: {e}") + error_occurred = True + + log_func(f"Keyframe reduction: {len(actions)} actions computed.") + + funscript = {"version": "1.0", "actions": actions} + try: + with open(output_path, "w") as f: + json.dump(funscript, f, indent=2) + log_func(f"Funscript saved: {output_path}") + except Exception as e: + log_func(f"ERROR: Could not write output: {e}") + error_occurred = True + + # Generate multi-axis funscripts if enabled + if params.get("multi_axis", False) and actions: + log_func("Generating multi-axis funscripts...") + multi_gen = MultiAxisGenerator(params) + secondary_axes = multi_gen.generate_all_axes(actions, fps, log_func) + + for axis_name, axis_actions in secondary_axes.items(): + multi_gen.save_axis_funscript(base, axis_name, axis_actions, log_func) + + log_func(f"Multi-axis generation complete: {len(secondary_axes)} additional axes created.") + + return error_occurred + + +# ----------------- StashApp Integration ----------------- + +def initialize_stash(connection: Dict[str, Any]) -> None: + """Initialize the StashApp interface.""" + global stash + stash = StashInterface(connection) + + +def get_scenes_with_tag(tag_name: str) -> List[Dict[str, Any]]: + """Get all scenes that have a specific tag.""" + tag = stash.find_tag(tag_name, create=False) + if not tag: + log.warning(f"Tag '{tag_name}' not found") + return [] + + # Use fragment to limit fields and avoid fingerprint errors + # Only fetch id, files.path, and tags.id/name - avoiding problematic fragments + scenes = stash.find_scenes( + f={"tags": {"value": [tag["id"]], "modifier": "INCLUDES"}}, + filter={"per_page": -1}, + fragment="id files { path } tags { id name }" + ) + return scenes or [] + + +def remove_tag_from_scene(scene_id: str, tag_name: str) -> None: + """Remove a tag from a scene.""" + tag = stash.find_tag(tag_name, create=False) + if not tag: + return + + # Use fragment to limit fields and avoid fingerprint errors + scene = stash.find_scene(scene_id, fragment="id tags { id }") + if not scene: + return + + current_tags = [t["id"] for t in scene.get("tags", [])] + if tag["id"] in current_tags: + current_tags.remove(tag["id"]) + stash.update_scene({"id": scene_id, "tag_ids": current_tags}) + + +def add_tag_to_scene(scene_id: str, tag_name: str) -> None: + """Add a tag to a scene.""" + tag = stash.find_tag(tag_name, create=True) + if not tag: + return + + # Use fragment to limit fields and avoid fingerprint errors + scene = stash.find_scene(scene_id, fragment="id tags { id }") + if not scene: + return + + current_tags = [t["id"] for t in scene.get("tags", [])] + if tag["id"] not in current_tags: + current_tags.append(tag["id"]) + stash.update_scene({"id": scene_id, "tag_ids": current_tags}) + + +def is_vr_scene(scene: Dict[str, Any]) -> bool: + """Check if a scene is tagged as VR.""" + tags = scene.get("tags", []) + vr_tag_names = config.vr_tag_names if hasattr(config, 'vr_tag_names') else ["VR", "Virtual Reality"] + for tag in tags: + if tag.get("name", "").lower() in [t.lower() for t in vr_tag_names]: + return True + return False + + +def add_scene_marker(scene_id: str, title: str, seconds: float, tag_name: Optional[str] = None) -> None: + """Add a marker to a scene.""" + marker_data = { + "scene_id": scene_id, + "title": title, + "seconds": seconds, + } + + if tag_name: + tag = stash.find_tag(tag_name, create=True) + if tag: + marker_data["primary_tag_id"] = tag["id"] + + stash.create_scene_marker(marker_data) + + +def get_scene_file_path(scene: Dict[str, Any]) -> Optional[str]: + """Get the file path for a scene.""" + files = scene.get("files", []) + if files: + return files[0].get("path") + return None + + +# ----------------- Settings Helper ----------------- + +def get_plugin_setting(key: str, default: Any = None) -> Any: + """Get a plugin setting from StashApp, falling back to config file.""" + try: + settings = stash.get_configuration().get("plugins", {}).get("funscript_haven", {}) + if key in settings and settings[key] is not None: + return settings[key] + except Exception: + pass + + # Fall back to config file + return getattr(config, key, default) + + +def get_trigger_tag() -> str: + """Get the trigger tag name.""" + return get_plugin_setting("trigger_tag", "FunscriptHaven_Process") + + +def get_complete_tag() -> Optional[str]: + """Get the completion tag name.""" + tag = get_plugin_setting("complete_tag", "FunscriptHaven_Complete") + return tag if tag else None + + +def get_error_tag() -> str: + """Get the error tag name.""" + return get_plugin_setting("error_tag", "FunscriptHaven_Error") + + +# ----------------- Task Functions ----------------- + +def process_tagged_scenes() -> None: + """Process all scenes tagged with the trigger tag.""" + global total_tasks, completed_tasks + + trigger_tag = get_trigger_tag() + scenes = get_scenes_with_tag(trigger_tag) + if not scenes: + log.info(f"No scenes found with tag '{trigger_tag}'") + return + + total_tasks = len(scenes) + completed_tasks = 0 + log.info(f"Found {total_tasks} scenes to process") + log.progress(0.0) + + for scene in scenes: + scene_id = scene["id"] + video_path = get_scene_file_path(scene) + + if not video_path: + log.error(f"No file path for scene {scene_id}") + completed_tasks += 1 + continue + + if not os.path.exists(video_path): + log.error(f"Video file not found: {video_path}") + completed_tasks += 1 + continue + + # Build processing parameters from plugin settings (with config file fallback) + # Convert 0-10 integer settings to their actual decimal values + detrend_window_raw = get_plugin_setting('detrend_window', 2) # Default: 2 (was 1.5) + norm_window_raw = get_plugin_setting('norm_window', 4) # Default: 4 (was 4.0) + multi_axis_intensity_raw = get_plugin_setting('multi_axis_intensity', 5) # Default: 5 (was 0.5, scale 0-10) + random_speed_raw = get_plugin_setting('random_speed', 3) # Default: 3 (was 0.3, scale 0-10) + auto_home_delay_raw = get_plugin_setting('auto_home_delay', 1) # Default: 1 (was 1.0) + auto_home_duration_raw = get_plugin_setting('auto_home_duration', 1) # Default: 1 (was 0.5, rounded) + + params = { + "threads": int(get_plugin_setting('threads', os.cpu_count() or 4)), + "detrend_window": float(max(1, min(10, int(detrend_window_raw)))), # Clamp to 1-10 seconds + "norm_window": float(max(1, min(10, int(norm_window_raw)))), # Clamp to 1-10 seconds + "batch_size": int(get_plugin_setting('batch_size', 3000)), + "overwrite": bool(get_plugin_setting('overwrite', False)), + "keyframe_reduction": bool(get_plugin_setting('keyframe_reduction', True)), + "vr_mode": is_vr_scene(scene), + "pov_mode": bool(get_plugin_setting('pov_mode', False)), + "balance_global": bool(get_plugin_setting('balance_global', True)), + "multi_axis": bool(get_plugin_setting('multi_axis', False)), + "multi_axis_intensity": float(max(0, min(10, int(multi_axis_intensity_raw))) / 10.0), # Convert 0-10 to 0.0-1.0 + "random_speed": float(max(0, min(10, int(random_speed_raw))) / 10.0), # Convert 0-10 to 0.0-1.0 + "auto_home_delay": float(max(0, min(10, int(auto_home_delay_raw)))), # Clamp to 0-10 seconds + "auto_home_duration": float(max(0, min(10, int(auto_home_duration_raw)))), # Clamp to 0-10 seconds + "smart_limit": bool(get_plugin_setting('smart_limit', True)), + } + + log.info(f"Processing scene {scene_id}: {video_path}") + + def progress_cb(prog: int) -> None: + scene_progress = prog / 100.0 + overall_progress = (completed_tasks + scene_progress) / total_tasks + log.progress(overall_progress) + + try: + error = process_video( + video_path, + params, + log.info, + progress_callback=progress_cb + ) + + if error: + log.error(f"Error processing scene {scene_id}") + add_tag_to_scene(scene_id, get_error_tag()) + else: + log.info(f"Successfully processed scene {scene_id}") + + # Add completion tag if configured + complete_tag = get_complete_tag() + if complete_tag: + add_tag_to_scene(scene_id, complete_tag) + + # Add scene marker if configured + if get_plugin_setting('add_marker', True): + add_scene_marker(scene_id, "Funscript Generated", 0, "Funscript") + + # Remove trigger tag + remove_tag_from_scene(scene_id, trigger_tag) + + except Exception as e: + log.error(f"Exception processing scene {scene_id}: {e}") + add_tag_to_scene(scene_id, get_error_tag()) + + completed_tasks += 1 + log.progress(completed_tasks / total_tasks) + + log.info(f"Completed processing {total_tasks} scenes") + log.progress(1.0) + + +# ----------------- Main Execution ----------------- + +def main() -> None: + """Main entry point for the plugin.""" + json_input = read_json_input() + output = {} + run(json_input, output) + out = json.dumps(output) + print(out + "\n") + + +def read_json_input() -> Dict[str, Any]: + """Read JSON input from stdin.""" + json_input = sys.stdin.read() + return json.loads(json_input) + + +def run(json_input: Dict[str, Any], output: Dict[str, Any]) -> None: + """Main execution logic.""" + plugin_args = None + try: + log.debug(json_input["server_connection"]) + os.chdir(json_input["server_connection"]["PluginDir"]) + initialize_stash(json_input["server_connection"]) + except Exception as e: + log.error(f"Failed to initialize: {e}") + output["output"] = "error" + return + + try: + plugin_args = json_input['args'].get("mode") + except (KeyError, TypeError): + pass + + if plugin_args == "process_scenes": + process_tagged_scenes() + output["output"] = "ok" + return + + # Default action: process tagged scenes + process_tagged_scenes() + output["output"] = "ok" + return + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + log.info("Plugin interrupted by user") + except Exception as e: + log.error(f"Plugin failed: {e}") + sys.exit(1) diff --git a/plugins/FunscriptHaven/funscript_haven.yml b/plugins/FunscriptHaven/funscript_haven.yml new file mode 100644 index 00000000..04c71c41 --- /dev/null +++ b/plugins/FunscriptHaven/funscript_haven.yml @@ -0,0 +1,82 @@ +name: Funscript Haven +description: Generates funscript files from video scenes using optical flow analysis. Tag scenes with 'FunscriptHaven_Process' to queue them for processing. +version: 1.0.0 +url: http://github.com/haven-hvn +exec: + - python + - "{pluginDir}/funscript_haven.py" +interface: raw +tasks: + - name: Process Tagged Scenes + description: Process all scenes tagged with 'FunscriptHaven_Process' and generate funscript files + defaultArgs: + mode: process_scenes +settings: + trigger_tag: + displayName: Trigger Tag + description: Tag name that triggers processing (add this tag to scenes you want to process) + type: STRING + complete_tag: + displayName: Completion Tag + description: Tag name added when processing completes successfully (leave empty to disable) + type: STRING + error_tag: + displayName: Error Tag + description: Tag name added when an error occurs during processing + type: STRING + threads: + displayName: Threads + description: Number of threads for optical flow computation + type: NUMBER + detrend_window: + displayName: Detrend Window (1-10) + description: Controls drift removal aggressiveness. Higher values work better for stable cameras (integer 1-10) + type: NUMBER + norm_window: + displayName: Normalization Window (1-10) + description: Time window to calibrate motion range in seconds. Shorter values amplify motion (integer 1-10) + type: NUMBER + batch_size: + displayName: Batch Size (frames) + description: Number of frames to process per batch. Higher values are faster but use more RAM + type: NUMBER + overwrite: + displayName: Overwrite Existing + description: Overwrite existing funscript files + type: BOOLEAN + keyframe_reduction: + displayName: Keyframe Reduction + description: Enable keyframe reduction to reduce file size while maintaining quality + type: BOOLEAN + pov_mode: + displayName: POV Mode + description: Improves stability for POV videos + type: BOOLEAN + balance_global: + displayName: Balance Global Motion + description: Try to cancel out camera motion. Disable for scenes with no camera movement + type: BOOLEAN + multi_axis: + displayName: Multi-Axis Output + description: Generate additional funscript files for secondary axes (Roll, Pitch, Twist, Surge, Sway) + type: BOOLEAN + multi_axis_intensity: + displayName: Multi-Axis Intensity (0-10) + description: Intensity of secondary axis motion (0-10, where 10 = maximum intensity) + type: NUMBER + random_speed: + displayName: Random Speed (0-10) + description: Speed of random motion variation (0-10, where 10 = fastest) + type: NUMBER + auto_home_delay: + displayName: Auto Home Delay (0-10) + description: Seconds of inactivity before returning to center position (integer 0-10) + type: NUMBER + auto_home_duration: + displayName: Auto Home Duration (0-10) + description: Time to smoothly return to center position in seconds (integer 0-10) + type: NUMBER + add_marker: + displayName: Add Marker on Complete + description: Add a scene marker when funscript generation completes + type: BOOLEAN diff --git a/plugins/FunscriptHaven/funscript_haven_config.py b/plugins/FunscriptHaven/funscript_haven_config.py new file mode 100644 index 00000000..b00de874 --- /dev/null +++ b/plugins/FunscriptHaven/funscript_haven_config.py @@ -0,0 +1,88 @@ +""" +Funscript Haven - Configuration File +Edit these settings to customize the plugin behavior +""" + +# ----------------- Tag Configuration ----------------- + +# Tag name that triggers processing (add this tag to scenes you want to process) +trigger_tag = "FunscriptHaven_Process" + +# Tag name added when processing completes successfully (set to None to disable) +complete_tag = "FunscriptHaven_Complete" + +# Tag name added when an error occurs during processing +error_tag = "FunscriptHaven_Error" + +# Tag names that indicate a VR scene (case-insensitive) +vr_tag_names = ["VR", "Virtual Reality", "180°", "360°"] + + +# ----------------- Processing Settings ----------------- + +# Number of threads for optical flow computation (default: CPU count) +import os +threads = os.cpu_count() or 4 + +# Detrend window - controls drift removal aggressiveness (integer 1-10) +# Higher values work better for stable cameras (recommended: 1-10) +# Note: StashApp UI only accepts integers 0-10 +detrend_window = 2 + +# Normalization window in seconds - time window to calibrate motion range (integer 1-10) +# Shorter values amplify motion but may cause artifacts in long thrusts +# Note: StashApp UI only accepts integers 0-10 +norm_window = 4 + +# Batch size in frames - higher values are faster but use more RAM +batch_size = 3000 + +# Overwrite existing funscript files +overwrite = False + +# Enable keyframe reduction (reduces file size while maintaining quality) +keyframe_reduction = True + + +# ----------------- Mode Settings ----------------- + +# POV Mode - improves stability for POV videos +pov_mode = False + +# Balance Global Motion - tries to cancel out camera motion +# Disable for scenes with no camera movement +balance_global = True + + +# ----------------- Multi-Axis Settings ----------------- + +# Generate additional funscript files for secondary axes +# (Roll, Pitch, Twist, Surge, Sway) +multi_axis = False + +# Intensity of secondary axis motion (0-10, where 10 = maximum) +# Higher values = more movement +# Note: StashApp UI only accepts integers 0-10, converted to 0.0-1.0 internally +multi_axis_intensity = 5 + +# Speed of random motion variation (0-10, where 10 = fastest) +# Higher values = faster changes +# Note: StashApp UI only accepts integers 0-10, converted to 0.0-1.0 internally +random_speed = 3 + +# Seconds of inactivity before returning to center position (integer 0-10) +# Note: StashApp UI only accepts integers 0-10 +auto_home_delay = 1 + +# Time to smoothly return to center position in seconds (integer 0-10) +# Note: StashApp UI only accepts integers 0-10 +auto_home_duration = 1 + +# Scale secondary axis movement with primary stroke activity +smart_limit = True + + +# ----------------- Marker Settings ----------------- + +# Add a scene marker when funscript generation completes +add_marker = True From c1a022430aa98fd3410ac758a41f6a190dea48e1 Mon Sep 17 00:00:00 2001 From: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> Date: Mon, 5 Jan 2026 10:25:49 +0200 Subject: [PATCH 08/51] Add community forum link --- plugins/FunscriptHaven/README.md | 2 ++ plugins/FunscriptHaven/funscript_haven.yml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/FunscriptHaven/README.md b/plugins/FunscriptHaven/README.md index c45aa4f9..387f739c 100644 --- a/plugins/FunscriptHaven/README.md +++ b/plugins/FunscriptHaven/README.md @@ -1,5 +1,7 @@ # Funscript Haven +https://discourse.stashapp.cc/t/funscript-haven/5124 + A StashApp plugin that automatically generates funscript files from video scenes using optical flow analysis. ## Overview diff --git a/plugins/FunscriptHaven/funscript_haven.yml b/plugins/FunscriptHaven/funscript_haven.yml index 04c71c41..e57bd799 100644 --- a/plugins/FunscriptHaven/funscript_haven.yml +++ b/plugins/FunscriptHaven/funscript_haven.yml @@ -1,7 +1,7 @@ name: Funscript Haven description: Generates funscript files from video scenes using optical flow analysis. Tag scenes with 'FunscriptHaven_Process' to queue them for processing. version: 1.0.0 -url: http://github.com/haven-hvn +url: https://discourse.stashapp.cc/t/funscript-haven/5124 exec: - python - "{pluginDir}/funscript_haven.py" From c981bc45e9c52e6bdf237b637f4323ce572ecdcc Mon Sep 17 00:00:00 2001 From: WeedLordVegeta420 <81525421+WeedLordVegeta420@users.noreply.github.com> Date: Thu, 15 Jan 2026 20:29:54 -0500 Subject: [PATCH 09/51] [imageGalleryNav]: Fix issues with some image filter types. (#654) --- .../imageGalleryNavigation.js | 73 ++++++++++++++++++- .../imageGalleryNavigation.yml | 2 +- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/plugins/imageGalleryNavigation/imageGalleryNavigation.js b/plugins/imageGalleryNavigation/imageGalleryNavigation.js index 7de67bef..301a1a41 100644 --- a/plugins/imageGalleryNavigation/imageGalleryNavigation.js +++ b/plugins/imageGalleryNavigation/imageGalleryNavigation.js @@ -275,6 +275,63 @@ // Init filter type field. imageFilter[cObj.type] = {}; + // Parse boolean type fields. + if (cObj["value"] == "true" || cObj["value"] == "false") { + imageFilter[cObj.type] = (cObj["value"] == "true"); + return; + } + + if (cObj.type == "orientation") { + imageFilter[cObj.type]["value"] = cObj["value"].map(value => value.toUpperCase()); + return; + } + + if (cObj.type == "resolution") { + imageFilter[cObj.type]["modifier"] = cObj["modifier"]; + switch (cObj["value"]) { + case "144p": + imageFilter[cObj.type]["value"] = "VERY_LOW"; + break; + case "240p": + imageFilter[cObj.type]["value"] = "LOW"; + break; + case "360p": + imageFilter[cObj.type]["value"] = "R360P"; + break; + case "480p": + imageFilter[cObj.type]["value"] = "STANDARD"; + break; + case "720p": + imageFilter[cObj.type]["value"] = "WEB_HD"; + break; + case "720p": + imageFilter[cObj.type]["value"] = "STANDARD_HD"; + break; + case "1080p": + imageFilter[cObj.type]["value"] = "FULL_HD"; + break; + case "1440p": + imageFilter[cObj.type]["value"] = "QUAD_HD"; + break; + case "4k": + imageFilter[cObj.type]["value"] = "FOUR_K"; + break; + case "5k": + imageFilter[cObj.type]["value"] = "FIVE_K"; + break; + case "6k": + imageFilter[cObj.type]["value"] = "SIX_K"; + break; + case "7k": + imageFilter[cObj.type]["value"] = "SEVEN_K"; + break; + case "8k": + imageFilter[cObj.type]["value"] = "EIGHT_K"; + break; + } + return; + } + // Get all keys (except for "type"). var keys = Object.keys(cObj); keys.splice(keys.indexOf("type"), 1); @@ -285,7 +342,21 @@ // Special parsing for object type "value" fields (used where there's possibly a value and value2) var keys2 = Object.keys(cObj[keyName]); keys2.forEach((keyName2) => { - imageFilter[cObj.type][keyName2] = cObj[keyName][keyName2]; + if (keyName2 == "items") { + // Parse tag values. + imageFilter[cObj.type]["value"] = [] + cObj[keyName][keyName2].forEach((keyValue) => { + imageFilter[cObj.type]["value"].push(keyValue.id); + }); + } else if (keyName2 == "excluded") { + // Parse excluded tags. + imageFilter[cObj.type]["excludes"] = [] + cObj[keyName][keyName2].forEach((keyValue) => { + imageFilter[cObj.type]["excludes"].push(keyValue.id); + }); + } else { + imageFilter[cObj.type][keyName2] = cObj[keyName][keyName2]; + } }); } else { imageFilter[cObj.type][keyName] = cObj[keyName]; diff --git a/plugins/imageGalleryNavigation/imageGalleryNavigation.yml b/plugins/imageGalleryNavigation/imageGalleryNavigation.yml index 876a2a3f..7091b600 100644 --- a/plugins/imageGalleryNavigation/imageGalleryNavigation.yml +++ b/plugins/imageGalleryNavigation/imageGalleryNavigation.yml @@ -1,7 +1,7 @@ name: imageGalleryNavigation # requires: CommunityScriptsUILibrary description: This plugin adds features for navigating between images within a Gallery from the Image details page. -version: 0.3 +version: 0.4 url: https://discourse.stashapp.cc/t/imagegallerynavigation/1857 settings: enableTransform: From 69e44b20999599d6443bd9dac6cbb58f1519a5ec Mon Sep 17 00:00:00 2001 From: skier233 <39396856+skier233@users.noreply.github.com> Date: Fri, 16 Jan 2026 18:56:16 -0500 Subject: [PATCH 10/51] Update AI Overhaul plugin for 0.9.2 (#655) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- plugins/AIOverhaul/AIOverhaul.yml | 5 ++- plugins/AIOverhaul/InteractionTracker.js | 43 +++++++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/plugins/AIOverhaul/AIOverhaul.yml b/plugins/AIOverhaul/AIOverhaul.yml index 2a854884..4821917b 100644 --- a/plugins/AIOverhaul/AIOverhaul.yml +++ b/plugins/AIOverhaul/AIOverhaul.yml @@ -1,6 +1,6 @@ name: AIOverhaul description: AI Overhaul for Stash with a full plugin engine included to install and manage asynchronous stash plugins for AI or other purposes. -version: 0.9.1 +version: 0.9.2 url: https://discourse.stashapp.cc/t/aioverhaul/4847 ui: javascript: @@ -26,6 +26,9 @@ ui: - http://localhost:4153 - ws://localhost:4153 - https://localhost:4153 + - http://127.0.0.1:4153 + - ws://127.0.0.1:4153 + - https://127.0.0.1:4153 # Add additional urls here for the stash-ai-server if your browser is not on the same host interface: raw exec: diff --git a/plugins/AIOverhaul/InteractionTracker.js b/plugins/AIOverhaul/InteractionTracker.js index ba857a07..e52a0161 100644 --- a/plugins/AIOverhaul/InteractionTracker.js +++ b/plugins/AIOverhaul/InteractionTracker.js @@ -817,8 +817,18 @@ class InteractionTracker { handlePageContext(ctx) { if (!ctx) return; - if (!ctx.isDetailView || !ctx.entityId) + // When leaving detail views, allow future entries (even same entity) to re-fire + if (!ctx.isDetailView || !ctx.entityId) { + this.lastDetailKey = null; + // Clear scene context so subsequent scene visits don't reuse stale ids + this.lastScenePageEntered = null; + if (this.currentScene) { + this.cleanupVideoElement(this.currentScene.video); + this.detachVideoJsWatcher(this.currentScene); + this.currentScene = undefined; + } return; + } const key = ctx.page + ':' + ctx.entityId; if (key === this.lastDetailKey) return; @@ -1248,12 +1258,14 @@ class InteractionTracker { const delay = attempt === 0 ? 0 : Math.min(600, 80 + attempt * 80); const handle = window.setTimeout(() => { this.playerReinstrumentTimers.delete(player); - const success = this.instrumentSceneWithVideoJs(sceneId, { player, attempt }); + const targetSceneId = this.resolveSceneIdFromContext() || sceneId; + // If navigation switched scenes, avoid applying the old scene id + const success = this.instrumentSceneWithVideoJs(targetSceneId, { player, attempt }); if (success) { this.pendingVideoJsPlayers.delete(player); } else if (attempt < 6) { - this.queuePlayerReinstrument(sceneId, player, attempt + 1); + this.queuePlayerReinstrument(targetSceneId, player, attempt + 1); } }, delay); this.playerReinstrumentTimers.set(player, handle); @@ -1354,10 +1366,15 @@ class InteractionTracker { } this.currentScene = state; this.cleanupVideoElement(video); - const onPlay = () => { + const beginPlayback = () => { var _a, _b, _c, _d; + if (state.lastPlayTs != null) + return; // already marked playing const snapshot = this.getPlaybackSnapshot(state); - state.lastPlayTs = Date.now(); + // If we attached mid-autoplay with no segments yet, backfill start time from current position + const now = Date.now(); + const backfill = snapshot.position !== undefined && snapshot.position > 0.5 && state.segments.length === 0; + state.lastPlayTs = backfill ? now - snapshot.position * 1000 : now; if (snapshot.position !== undefined) state.lastPosition = snapshot.position; this.trackInternal('scene_watch_start', 'scene', sceneId, { @@ -1365,6 +1382,8 @@ class InteractionTracker { duration: (_d = (_c = snapshot.duration) !== null && _c !== void 0 ? _c : state.duration) !== null && _d !== void 0 ? _d : (isFinite(video.duration) ? video.duration : undefined) }); }; + const onPlay = () => { beginPlayback(); }; + const onPlaying = () => { beginPlayback(); }; const onPause = () => { var _a, _b, _c, _d; const added = this.captureSegment(); @@ -1416,12 +1435,14 @@ class InteractionTracker { state.duration = video.duration; }; video.addEventListener('play', onPlay); + video.addEventListener('playing', onPlaying); video.addEventListener('pause', onPause); video.addEventListener('ended', onEnded); video.addEventListener('timeupdate', onTimeUpdate); video.addEventListener('loadedmetadata', onLoaded); video._aiInteractionCleanup = () => { video.removeEventListener('play', onPlay); + video.removeEventListener('playing', onPlaying); video.removeEventListener('pause', onPause); video.removeEventListener('ended', onEnded); video.removeEventListener('timeupdate', onTimeUpdate); @@ -1429,11 +1450,15 @@ class InteractionTracker { }; if (state.player) this.attachVideoJsWatcher(state, sceneId, state.player); + const triggerIfAlreadyPlaying = () => { + if (!video.isConnected) + return; + if (!video.paused || (isFinite(video.currentTime) && video.currentTime > 0)) + beginPlayback(); + }; + triggerIfAlreadyPlaying(); if (!video.paused) { - setTimeout(() => { - if (video.isConnected && !video.paused) - onPlay(); - }, 0); + setTimeout(() => { triggerIfAlreadyPlaying(); }, 0); } } trackImageView(imageId, opts) { From 2a0719091cb47e4623b375b8bf27d3d2a7754707 Mon Sep 17 00:00:00 2001 From: HavenCTO Date: Mon, 26 Jan 2026 22:43:05 -0500 Subject: [PATCH 11/51] initial commit of AHavenVLMConnector (#657) Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- plugins/AHavenVLMConnector/CHANGELOG.md | 8 + plugins/AHavenVLMConnector/README.md | 143 +++++ .../AHavenVLMConnector/ahavenvlmconnector.yml | 22 + plugins/AHavenVLMConnector/exit_tracker.py | 98 +++ .../AHavenVLMConnector/haven_media_handler.py | 333 ++++++++++ .../AHavenVLMConnector/haven_vlm_config.py | 445 +++++++++++++ .../AHavenVLMConnector/haven_vlm_connector.py | 444 +++++++++++++ .../AHavenVLMConnector/haven_vlm_engine.py | 299 +++++++++ .../AHavenVLMConnector/haven_vlm_utility.py | 316 +++++++++ plugins/AHavenVLMConnector/requirements.txt | 8 + plugins/AHavenVLMConnector/run_tests.py | 110 ++++ .../test_dependency_management.py | 98 +++ .../test_haven_media_handler.py | 387 +++++++++++ .../test_haven_vlm_config.py | 286 +++++++++ .../test_haven_vlm_connector.py | 451 +++++++++++++ .../test_haven_vlm_engine.py | 544 ++++++++++++++++ .../test_haven_vlm_utility.py | 604 ++++++++++++++++++ 17 files changed, 4596 insertions(+) create mode 100644 plugins/AHavenVLMConnector/CHANGELOG.md create mode 100644 plugins/AHavenVLMConnector/README.md create mode 100644 plugins/AHavenVLMConnector/ahavenvlmconnector.yml create mode 100644 plugins/AHavenVLMConnector/exit_tracker.py create mode 100644 plugins/AHavenVLMConnector/haven_media_handler.py create mode 100644 plugins/AHavenVLMConnector/haven_vlm_config.py create mode 100644 plugins/AHavenVLMConnector/haven_vlm_connector.py create mode 100644 plugins/AHavenVLMConnector/haven_vlm_engine.py create mode 100644 plugins/AHavenVLMConnector/haven_vlm_utility.py create mode 100644 plugins/AHavenVLMConnector/requirements.txt create mode 100644 plugins/AHavenVLMConnector/run_tests.py create mode 100644 plugins/AHavenVLMConnector/test_dependency_management.py create mode 100644 plugins/AHavenVLMConnector/test_haven_media_handler.py create mode 100644 plugins/AHavenVLMConnector/test_haven_vlm_config.py create mode 100644 plugins/AHavenVLMConnector/test_haven_vlm_connector.py create mode 100644 plugins/AHavenVLMConnector/test_haven_vlm_engine.py create mode 100644 plugins/AHavenVLMConnector/test_haven_vlm_utility.py diff --git a/plugins/AHavenVLMConnector/CHANGELOG.md b/plugins/AHavenVLMConnector/CHANGELOG.md new file mode 100644 index 00000000..9fbe9a2a --- /dev/null +++ b/plugins/AHavenVLMConnector/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to the A Haven VLM Connector project will be documented in this file. + +## [1.0.0] - 2025-06-29 + +### Added +- **Initial release** diff --git a/plugins/AHavenVLMConnector/README.md b/plugins/AHavenVLMConnector/README.md new file mode 100644 index 00000000..f5abf8ab --- /dev/null +++ b/plugins/AHavenVLMConnector/README.md @@ -0,0 +1,143 @@ +# A Haven VLM Connector + +A StashApp plugin for Vision-Language Model (VLM) based content tagging and analysis. This plugin is designed with a **local-first philosophy**, empowering users to run analysis on their own hardware (using CPU or GPU) and their local network. It also supports cloud-based VLM endpoints for additional flexibility. The Haven VLM Engine provides advanced automatic content detection and tagging, delivering superior accuracy compared to traditional image classification methods. + +## Features + +- **Local Network Empowerment**: Distribute processing across home/office computers without cloud dependencies +- **Context-Aware Detection**: Leverages Vision-Language Models' understanding of visual relationships +- **Advanced Dependency Management**: Uses PythonDepManager for automatic dependency installation +- **Enjoying Funscript Haven?** Check out more tools and projects at https://github.com/Haven-hvn + +## Requirements + +- Python 3.8+ +- StashApp +- PythonDepManager plugin (automatically handles dependencies) +- OpenAI-compatible VLM endpoints (local or cloud-based) + +## Installation + +1. Clone or download this plugin to your StashApp plugins directory +2. Ensure PythonDepManager is installed in your StashApp plugins +3. Configure your VLM endpoints in `haven_vlm_config.py` (local network endpoints recommended) +4. Restart StashApp + +The plugin automatically manages all dependencies. + +## Why Local-First? + +- **Complete Control**: Process sensitive content on your own hardware +- **Cost Effective**: Avoid cloud processing fees by using existing resources +- **Flexible Scaling**: Add more computers to your local network for increased capacity +- **Privacy Focused**: Keep your media completely private +- **Hybrid Options**: Combine local and cloud endpoints for optimal flexibility + +```mermaid +graph LR +A[User's Computer] --> B[Local GPU Machine] +A --> C[Local CPU Machine 1] +A --> D[Local CPU Machine 2] +A --> E[Cloud Endpoint] +``` + +## Configuration + +### Easy Setup with LM Studio + +[LM Studio](https://lmstudio.ai/) provides the easiest way to configure local endpoints: + +1. Download and install [LM Studio](https://lmstudio.ai/) +2. [Search for or download](https://huggingface.co/models) a vision-capable model; tested with : (in order of high to low accuracy) zai-org/glm-4.6v-flash, huihui-mistral-small-3.2-24b-instruct-2506-abliterated-v2, qwen/qwen3-vl-8b, lfm2.5-vl +3. Load your desired Model +4. On the developer tab start the local server using the start toggle +5. Optionally click the Settings gear then toggle *Serve on local network* +5. Optionally configure `haven_vlm_config.py`: + +By default locahost is included in the config, **remove cloud endpoint if you don't want automatic failover** +```python +{ + "base_url": "http://localhost:1234/v1", # LM Studio default + "api_key": "", # API key not required + "name": "lm-studio-local", + "weight": 5, + "is_fallback": False +} +``` + +### Tag Configuration + +```python +"tag_list": [ + "Basketball point", "Foul", "Break-away", "Turnover" +] +``` + +### Processing Settings + +```python +VIDEO_FRAME_INTERVAL = 2.0 # Process every 2 seconds +CONCURRENT_TASK_LIMIT = 8 # Adjust based on local hardware +``` + +## Usage + +### Tag Videos +1. Tag scenes with `VLM_TagMe` +2. Run "Tag Videos" task +3. Plugin processes content using local/network resources + +### Performance Tips +- Start with 2-3 local machines for load balancing +- Assign higher weights to GPU-enabled machines +- Adjust `CONCURRENT_TASK_LIMIT` based on total system resources +- Use SSD storage for better I/O performance + +## File Structure + +``` +AHavenVLMConnector/ +├── ahavenvlmconnector.yml +├── haven_vlm_connector.py +├── haven_vlm_config.py +├── haven_vlm_engine.py +├── haven_media_handler.py +├── haven_vlm_utility.py +├── requirements.txt +└── README.md +``` + +## Troubleshooting + +### Local Network Setup +- Ensure firewalls allow communication between machines +- Verify all local endpoints are running VLM services +- Use static IPs for local machines +- Check `http://local-machine-ip:port/v1` responds correctly + +### Performance Optimization +- **Distribute Load**: Use multiple mid-range machines instead of one high-end +- **GPU Prioritization**: Assign highest weight to GPU machines +- **Network Speed**: Use wired Ethernet connections for faster transfer +- **Resource Monitoring**: Watch system resources during processing + +## Development + +### Adding Local Endpoints +1. Install VLM service on network machines +2. Add endpoint configuration with local IPs +3. Set appropriate weights based on hardware capability + +### Custom Models +Use any OpenAI-compatible models that support: +- POST requests to `/v1/chat/completions` +- Vision capabilities with image input +- Local deployment options + +### Log Messages + +Check StashApp logs for detailed processing information and error messages. + +## License + +This project is part of the StashApp Community Scripts collection. \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml new file mode 100644 index 00000000..1b553406 --- /dev/null +++ b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml @@ -0,0 +1,22 @@ +name: Haven VLM Connector +# requires: PythonDepManager +description: Tag videos with Vision-Language Models using any OpenAI-compatible VLM endpoint +version: 1.0.0 +url: https://github.com/stashapp/CommunityScripts/tree/main/plugins/AHavenVLMConnector +exec: + - python + - "{pluginDir}/haven_vlm_connector.py" +interface: raw +tasks: + - name: Tag Videos + description: Run VLM analysis on videos with VLM_TagMe tag + defaultArgs: + mode: tag_videos + - name: Collect Incorrect Markers and Images + description: Collects data from markers and images that were VLM tagged but were manually marked with VLM_Incorrect due to the VLM making a mistake. This will collect the data and output as a file which can be used to improve the VLM models. + defaultArgs: + mode: collect_incorrect_markers + - name: Find Marker Settings + description: Find Optimal Marker Settings based on a video that has manually tuned markers and has been processed by the VLM previously. Only 1 video should have VLM_TagMe before running. + defaultArgs: + mode: find_marker_settings diff --git a/plugins/AHavenVLMConnector/exit_tracker.py b/plugins/AHavenVLMConnector/exit_tracker.py new file mode 100644 index 00000000..74a4cea8 --- /dev/null +++ b/plugins/AHavenVLMConnector/exit_tracker.py @@ -0,0 +1,98 @@ +""" +Comprehensive sys.exit tracking module +Instruments all sys.exit() calls with full call stack and context +""" + +import sys +import traceback +from typing import Optional + +# Store original sys.exit +original_exit = sys.exit + +# Track if we've already patched +_exit_tracker_patched = False + +def install_exit_tracker(logger=None) -> None: + """ + Install the exit tracker by monkey-patching sys.exit + + Args: + logger: Optional logger instance (will use fallback print if None) + """ + global _exit_tracker_patched, original_exit + + if _exit_tracker_patched: + return + + # Store original if not already stored + if hasattr(sys, 'exit') and sys.exit is not original_exit: + original_exit = sys.exit + + def tracked_exit(code: int = 0) -> None: + """Track sys.exit() calls with full call stack""" + # Get current stack trace (not from exception, but current call stack) + stack = traceback.extract_stack() + + # Format the stack trace, excluding this tracking function + stack_lines = [] + for frame in stack: + # Skip internal Python frames and this tracker + if ('tracked_exit' not in frame.filename and + '/usr/lib' not in frame.filename and + '/System/Library' not in frame.filename and + 'exit_tracker.py' not in frame.filename): + stack_lines.append( + f" File \"{frame.filename}\", line {frame.lineno}, in {frame.name}\n {frame.line}" + ) + + # Take last 15 frames to see the full call chain + stack_str = '\n'.join(stack_lines[-15:]) + + # Get current exception info if available + exc_info = sys.exc_info() + exc_str = "" + if exc_info[0] is not None: + exc_str = f"\n Active Exception: {exc_info[0].__name__}: {exc_info[1]}" + + # Build the error message + error_msg = f"""[DEBUG_EXIT_CODE] ========================================== +[DEBUG_EXIT_CODE] sys.exit() called with code: {code} +[DEBUG_EXIT_CODE] Call stack (last 15 frames): +{stack_str} +{exc_str} +[DEBUG_EXIT_CODE] ==========================================""" + + # Log using provided logger or fallback to print + if logger: + try: + logger.error(error_msg) + except Exception as log_error: + print(f"[EXIT_TRACKER_LOGGER_ERROR] Failed to log: {log_error}") + print(error_msg) + else: + print(error_msg) + + # Call original exit + original_exit(code) + + # Install the tracker + sys.exit = tracked_exit + _exit_tracker_patched = True + + if logger: + logger.debug("[DEBUG_EXIT_CODE] Exit tracker installed successfully") + else: + print("[DEBUG_EXIT_CODE] Exit tracker installed successfully") + +def uninstall_exit_tracker() -> None: + """Uninstall the exit tracker and restore original sys.exit""" + global _exit_tracker_patched, original_exit + + if _exit_tracker_patched: + sys.exit = original_exit + _exit_tracker_patched = False + +# Auto-install on import (can be disabled by calling uninstall_exit_tracker()) +if not _exit_tracker_patched: + install_exit_tracker() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/haven_media_handler.py b/plugins/AHavenVLMConnector/haven_media_handler.py new file mode 100644 index 00000000..163562a4 --- /dev/null +++ b/plugins/AHavenVLMConnector/haven_media_handler.py @@ -0,0 +1,333 @@ +""" +Haven Media Handler Module +Handles StashApp media operations and tag management +""" + +import os +import zipfile +import shutil +from typing import List, Dict, Any, Optional, Tuple, Set +from datetime import datetime +import json + +# Use PythonDepManager for dependency management +try: + from PythonDepManager import ensure_import + ensure_import("stashapi:stashapp-tools==0.2.58") + + from stashapi.stashapp import StashInterface, StashVersion + import stashapi.log as log +except ImportError as e: + print(f"stashapp-tools not found: {e}") + print("Please ensure PythonDepManager is available and stashapp-tools is accessible") + raise + +import haven_vlm_config as config + +# Global variables +tag_id_cache: Dict[str, int] = {} +vlm_tag_ids_cache: Set[int] = set() +stash_version: Optional[StashVersion] = None +end_seconds_support: bool = False + +# Tag IDs +stash: Optional[StashInterface] = None +vlm_errored_tag_id: Optional[int] = None +vlm_tagme_tag_id: Optional[int] = None +vlm_base_tag_id: Optional[int] = None +vlm_tagged_tag_id: Optional[int] = None +vr_tag_id: Optional[int] = None +vlm_incorrect_tag_id: Optional[int] = None + +def initialize(connection: Dict[str, Any]) -> None: + """Initialize the media handler with StashApp connection""" + global stash, vlm_errored_tag_id, vlm_tagme_tag_id, vlm_base_tag_id + global vlm_tagged_tag_id, vr_tag_id, end_seconds_support, stash_version + global vlm_incorrect_tag_id + + # Initialize the Stash API + stash = StashInterface(connection) + + # Initialize "metadata" tags + vlm_errored_tag_id = stash.find_tag(config.config.vlm_errored_tag_name, create=True)["id"] + vlm_tagme_tag_id = stash.find_tag(config.config.vlm_tagme_tag_name, create=True)["id"] + vlm_base_tag_id = stash.find_tag(config.config.vlm_base_tag_name, create=True)["id"] + vlm_tagged_tag_id = stash.find_tag(config.config.vlm_tagged_tag_name, create=True)["id"] + vlm_incorrect_tag_id = stash.find_tag(config.config.vlm_incorrect_tag_name, create=True)["id"] + + # Get VR tag from configuration + vr_tag_name = stash.get_configuration()["ui"].get("vrTag", None) + if not vr_tag_name: + log.warning("No VR tag found in configuration") + vr_tag_id = None + else: + vr_tag_id = stash.find_tag(vr_tag_name)["id"] + + stash_version = get_stash_version() + end_second_support_beyond = StashVersion("v0.27.2-76648") + end_seconds_support = stash_version > end_second_support_beyond + +def get_stash_version() -> StashVersion: + """Get the current StashApp version""" + if not stash: + raise RuntimeError("Stash interface not initialized") + return stash.stash_version() + +# ----------------- Tag Management Methods ----------------- + +def get_tag_ids(tag_names: List[str], create: bool = False) -> List[int]: + """Get tag IDs for multiple tag names""" + return [get_tag_id(tag_name, create) for tag_name in tag_names] + +def get_tag_id(tag_name: str, create: bool = False) -> Optional[int]: + """Get tag ID for a single tag name""" + if tag_name not in tag_id_cache: + stashtag = stash.find_tag(tag_name) + if stashtag: + tag_id_cache[tag_name] = stashtag["id"] + return stashtag["id"] + else: + if not create: + return None + tag = stash.create_tag({ + "name": tag_name, + "ignore_auto_tag": True, + "parent_ids": [vlm_base_tag_id] + })['id'] + tag_id_cache[tag_name] = tag + vlm_tag_ids_cache.add(tag) + return tag + return tag_id_cache.get(tag_name) + +def get_vlm_tags() -> List[int]: + """Get all VLM-generated tags""" + if len(vlm_tag_ids_cache) == 0: + vlm_tags = [ + item['id'] for item in stash.find_tags( + f={"parents": {"value": vlm_base_tag_id, "modifier": "INCLUDES"}}, + fragment="id" + ) + ] + vlm_tag_ids_cache.update(vlm_tags) + else: + vlm_tags = list(vlm_tag_ids_cache) + return vlm_tags + +def is_scene_tagged(tags: List[Dict[str, Any]]) -> bool: + """Check if a scene has been tagged by VLM""" + for tag in tags: + if tag['id'] == vlm_tagged_tag_id: + return True + return False + +def is_vr_scene(tags: List[Dict[str, Any]]) -> bool: + """Check if a scene is VR content""" + for tag in tags: + if tag['id'] == vr_tag_id: + return True + return False + +# ----------------- Scene Management Methods ----------------- + +def add_tags_to_video(video_id: int, tag_ids: List[int], add_tagged: bool = True) -> None: + """Add tags to a video scene""" + if add_tagged: + tag_ids.append(vlm_tagged_tag_id) + stash.update_scenes({ + "ids": [video_id], + "tag_ids": {"ids": tag_ids, "mode": "ADD"} + }) + +def clear_all_tags_from_video(scene: Dict[str, Any]) -> None: + """Clear all tags from a video scene using existing scene data""" + scene_id = scene.get('id') + if scene_id is None: + log.error("Scene missing 'id' field") + return + + current_tag_ids = [tag['id'] for tag in scene.get('tags', [])] + if current_tag_ids: + stash.update_scenes({ + "ids": [scene_id], + "tag_ids": {"ids": current_tag_ids, "mode": "REMOVE"} + }) + log.info(f"Cleared {len(current_tag_ids)} tags from scene {scene_id}") + +def clear_all_markers_from_video(video_id: int) -> None: + """Clear all markers from a video scene""" + markers = get_scene_markers(video_id) + if markers: + delete_markers(markers) + log.info(f"Cleared all {len(markers)} markers from scene {video_id}") + +def remove_vlm_tags_from_video( + video_id: int, + remove_tagme: bool = True, + remove_errored: bool = True +) -> None: + """Remove all VLM tags from a video scene""" + vlm_tags = get_vlm_tags() + if remove_tagme: + vlm_tags.append(vlm_tagme_tag_id) + if remove_errored: + vlm_tags.append(vlm_errored_tag_id) + stash.update_scenes({ + "ids": [video_id], + "tag_ids": {"ids": vlm_tags, "mode": "REMOVE"} + }) + +def get_tagme_scenes() -> List[Dict[str, Any]]: + """Get scenes tagged with VLM_TagMe""" + return stash.find_scenes( + f={"tags": {"value": vlm_tagme_tag_id, "modifier": "INCLUDES"}}, + fragment="id tags {id} files {path duration fingerprint(type: \"phash\")}" + ) + +def add_error_scene(scene_id: int) -> None: + """Add error tag to a scene""" + stash.update_scenes({ + "ids": [scene_id], + "tag_ids": {"ids": [vlm_errored_tag_id], "mode": "ADD"} + }) + +def remove_tagme_tag_from_scene(scene_id: int) -> None: + """Remove VLM_TagMe tag from a scene""" + stash.update_scenes({ + "ids": [scene_id], + "tag_ids": {"ids": [vlm_tagme_tag_id], "mode": "REMOVE"} + }) + +# ----------------- Marker Management Methods ----------------- + +def add_markers_to_video_from_dict( + video_id: int, + tag_timespans_dict: Dict[str, Dict[str, List[Any]]] +) -> None: + """Add markers to video from timespan dictionary""" + for _, tag_timespan_dict in tag_timespans_dict.items(): + for tag_name, time_frames in tag_timespan_dict.items(): + tag_id = get_tag_id(tag_name, create=True) + if tag_id: + add_markers_to_video(video_id, tag_id, tag_name, time_frames) + +def get_incorrect_markers() -> List[Dict[str, Any]]: + """Get markers tagged with VLM_Incorrect""" + if end_seconds_support: + return stash.find_scene_markers( + {"tags": {"value": vlm_incorrect_tag_id, "modifier": "INCLUDES"}}, + fragment="id scene {id files{path}} primary_tag {id, name} seconds end_seconds" + ) + else: + return stash.find_scene_markers( + {"tags": {"value": vlm_incorrect_tag_id, "modifier": "INCLUDES"}}, + fragment="id scene {id files{path}} primary_tag {id, name} seconds" + ) + +def add_markers_to_video( + video_id: int, + tag_id: int, + tag_name: str, + time_frames: List[Any] +) -> None: + """Add markers to video for specific time frames""" + for time_frame in time_frames: + if end_seconds_support: + stash.create_scene_marker({ + "scene_id": video_id, + "primary_tag_id": tag_id, + "tag_ids": [tag_id], + "seconds": time_frame.start, + "end_seconds": time_frame.end, + "title": tag_name + }) + else: + stash.create_scene_marker({ + "scene_id": video_id, + "primary_tag_id": tag_id, + "tag_ids": [tag_id], + "seconds": time_frame.start, + "title": tag_name + }) + +def get_scene_markers(video_id: int) -> List[Dict[str, Any]]: + """Get all markers for a scene""" + return stash.get_scene_markers(video_id) + +def write_scene_marker_to_file( + marker: Dict[str, Any], + scene_file: str, + output_folder: str +) -> None: + """Write scene marker data to file for analysis""" + try: + marker_id = marker['id'] + scene_id = marker['scene']['id'] + tag_name = marker['primary_tag']['name'] + + # Create output filename + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + filename = f"marker_{marker_id}_scene_{scene_id}_{tag_name}_{timestamp}.json" + output_path = os.path.join(output_folder, filename) + + # Prepare marker data + marker_data = { + "marker_id": marker_id, + "scene_id": scene_id, + "tag_name": tag_name, + "seconds": marker.get("seconds"), + "end_seconds": marker.get("end_seconds"), + "scene_file": scene_file, + "timestamp": timestamp + } + + # Write to file + with open(output_path, 'w') as f: + json.dump(marker_data, f, indent=2) + + except Exception as e: + log.error(f"Failed to write marker data: {e}") + +def delete_markers(markers: List[Dict[str, Any]]) -> None: + """Delete markers from StashApp""" + for marker in markers: + try: + stash.destroy_scene_marker(marker['id']) + except Exception as e: + log.error(f"Failed to delete marker {marker['id']}: {e}") + +def get_scene_markers_by_tag( + video_id: int, + error_if_no_end_seconds: bool = True +) -> List[Dict[str, Any]]: + """Get scene markers by tag with end_seconds support check""" + if end_seconds_support: + return stash.get_scene_markers(video_id) + else: + if error_if_no_end_seconds: + log.error("End seconds not supported in this StashApp version") + raise RuntimeError("End seconds not supported") + return stash.get_scene_markers(video_id) + +def remove_incorrect_tag_from_markers(markers: List[Dict[str, Any]]) -> None: + """Remove VLM_Incorrect tag from markers""" + marker_ids = [marker['id'] for marker in markers] + for marker_id in marker_ids: + try: + stash.update_scene_marker({ + "id": marker_id, + "tag_ids": {"ids": [vlm_incorrect_tag_id], "mode": "REMOVE"} + }) + except Exception as e: + log.error(f"Failed to remove incorrect tag from marker {marker_id}: {e}") + +def remove_vlm_markers_from_video(video_id: int) -> None: + """Remove all VLM markers from a video""" + markers = get_scene_markers(video_id) + vlm_tag_ids = get_vlm_tags() + + for marker in markers: + if marker['primary_tag']['id'] in vlm_tag_ids: + try: + stash.destroy_scene_marker(marker['id']) + except Exception as e: + log.error(f"Failed to delete VLM marker {marker['id']}: {e}") \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/haven_vlm_config.py b/plugins/AHavenVLMConnector/haven_vlm_config.py new file mode 100644 index 00000000..1e5bc69a --- /dev/null +++ b/plugins/AHavenVLMConnector/haven_vlm_config.py @@ -0,0 +1,445 @@ +""" +Configuration for A Haven VLM Connector +A StashApp plugin for Vision-Language Model based content tagging +""" + +from typing import Dict, List, Optional +from dataclasses import dataclass +import os +import yaml + +# ----------------- Core Settings ----------------- + +# VLM Engine Configuration +VLM_ENGINE_CONFIG = { + "active_ai_models": ["vlm_multiplexer_model"], + "pipelines": { + "video_pipeline_dynamic": { + "inputs": [ + "video_path", + "return_timestamps", + "time_interval", + "threshold", + "return_confidence", + "vr_video", + "existing_video_data", + "skipped_categories", + ], + "output": "results", + "short_name": "dynamic_video", + "version": 1.0, + "models": [ + { + "name": "dynamic_video_ai", + "inputs": [ + "video_path", "return_timestamps", "time_interval", + "threshold", "return_confidence", "vr_video", + "existing_video_data", "skipped_categories" + ], + "outputs": "results", + }, + ], + } + }, + "models": { + "binary_search_processor_dynamic": { + "type": "binary_search_processor", + "model_file_name": "binary_search_processor_dynamic" + }, + "vlm_multiplexer_model": { + "type": "vlm_model", + "model_file_name": "vlm_multiplexer_model", + "model_category": "actiondetection", + "model_id": "zai-org/glm-4.6v-flash", + "model_identifier": 93848, + "model_version": "1.0", + "use_multiplexer": True, + "max_concurrent_requests": 13, + "instance_count": 10, + "max_batch_size": 4, + "multiplexer_endpoints": [ + { + "base_url": "http://localhost:1234/v1", + "api_key": "", + "name": "lm-studio-primary", + "weight": 9, + "is_fallback": False, + "max_concurrent": 10 + }, + { + "base_url": "https://cloudagnostic.com:443/v1", + "api_key": "", + "name": "cloud-fallback", + "weight": 1, + "is_fallback": True, + "max_concurrent": 2 + } + ], + "tag_list": [ + "Anal Fucking", "Ass Licking", "Ass Penetration", "Ball Licking/Sucking", "Blowjob", "Cum on Person", + "Cum Swapping", "Cumshot", "Deepthroat", "Double Penetration", "Fingering", "Fisting", "Footjob", + "Gangbang", "Gloryhole", "Grabbing Ass", "Grabbing Boobs", "Grabbing Hair/Head", "Handjob", "Kissing", + "Licking Penis", "Masturbation", "Pissing", "Pussy Licking (Clearly Visible)", "Pussy Licking", + "Pussy Rubbing", "Sucking Fingers", "Sucking Toy/Dildo", "Wet (Genitals)", "Titjob", "Tribbing/Scissoring", + "Undressing", "Vaginal Penetration", "Vaginal Fucking", "Vibrating" + ] + }, + "result_coalescer": { + "type": "python", + "model_file_name": "result_coalescer" + }, + "result_finisher": { + "type": "python", + "model_file_name": "result_finisher" + }, + "batch_awaiter": { + "type": "python", + "model_file_name": "batch_awaiter" + }, + "video_result_postprocessor": { + "type": "python", + "model_file_name": "video_result_postprocessor" + }, + }, + "category_config": { + "actiondetection": { + "69": { + "RenamedTag": "69", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Anal Fucking": { + "RenamedTag": "Anal Fucking", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Ass Licking": { + "RenamedTag": "Ass Licking", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Ass Penetration": { + "RenamedTag": "Ass Penetration", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Ball Licking/Sucking": { + "RenamedTag": "Ball Licking/Sucking", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Blowjob": { + "RenamedTag": "Blowjob", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Cum on Person": { + "RenamedTag": "Cum on Person", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Cum Swapping": { + "RenamedTag": "Cum Swapping", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Cumshot": { + "RenamedTag": "Cumshot", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Deepthroat": { + "RenamedTag": "Deepthroat", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Double Penetration": { + "RenamedTag": "Double Penetration", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Fingering": { + "RenamedTag": "Fingering", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Fisting": { + "RenamedTag": "Fisting", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Footjob": { + "RenamedTag": "Footjob", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Gangbang": { + "RenamedTag": "Gangbang", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Gloryhole": { + "RenamedTag": "Gloryhole", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Grabbing Ass": { + "RenamedTag": "Grabbing Ass", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Grabbing Boobs": { + "RenamedTag": "Grabbing Boobs", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Grabbing Hair/Head": { + "RenamedTag": "Grabbing Hair/Head", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Handjob": { + "RenamedTag": "Handjob", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Kissing": { + "RenamedTag": "Kissing", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Licking Penis": { + "RenamedTag": "Licking Penis", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Masturbation": { + "RenamedTag": "Masturbation", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Pissing": { + "RenamedTag": "Pissing", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Pussy Licking (Clearly Visible)": { + "RenamedTag": "Pussy Licking (Clearly Visible)", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Pussy Licking": { + "RenamedTag": "Pussy Licking", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Pussy Rubbing": { + "RenamedTag": "Pussy Rubbing", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Sucking Fingers": { + "RenamedTag": "Sucking Fingers", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Sucking Toy/Dildo": { + "RenamedTag": "Sucking Toy/Dildo", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Wet (Genitals)": { + "RenamedTag": "Wet (Genitals)", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Titjob": { + "RenamedTag": "Titjob", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Tribbing/Scissoring": { + "RenamedTag": "Tribbing/Scissoring", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Undressing": { + "RenamedTag": "Undressing", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Vaginal Penetration": { + "RenamedTag": "Vaginal Penetration", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Vaginal Fucking": { + "RenamedTag": "Vaginal Fucking", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + }, + "Vibrating": { + "RenamedTag": "Vibrating", + "MinMarkerDuration": "1s", + "MaxGap": "30s", + "RequiredDuration": "1s", + "TagThreshold": 0.5, + } + } + } +} + +# ----------------- Processing Settings ----------------- + +# Video processing settings +VIDEO_FRAME_INTERVAL = 80 # Process every 80 seconds +VIDEO_THRESHOLD = 0.3 +VIDEO_CONFIDENCE_RETURN = True + +# Concurrency settings +CONCURRENT_TASK_LIMIT = 20 # Increased for better parallel video processing +SERVER_TIMEOUT = 3700 + +# ----------------- Tag Configuration ----------------- + +# Tag names for StashApp integration +VLM_BASE_TAG_NAME = "VLM" +VLM_TAGME_TAG_NAME = "VLM_TagMe" +VLM_UPDATEME_TAG_NAME = "VLM_UpdateMe" +VLM_TAGGED_TAG_NAME = "VLM_Tagged" +VLM_ERRORED_TAG_NAME = "VLM_Errored" +VLM_INCORRECT_TAG_NAME = "VLM_Incorrect" + +# ----------------- File System Settings ----------------- + +# Directory paths +OUTPUT_DATA_DIR = "./output_data" + +# File management +DELETE_INCORRECT_MARKERS = True +CREATE_MARKERS = True + +# Path mutations for different environments +PATH_MUTATION = {} + +# ----------------- Configuration Loading ----------------- + +@dataclass +class VLMConnectorConfig: + """Configuration class for the VLM Connector""" + vlm_engine_config: Dict + video_frame_interval: float + video_threshold: float + video_confidence_return: bool + concurrent_task_limit: int + server_timeout: int + vlm_base_tag_name: str + vlm_tagme_tag_name: str + vlm_updateme_tag_name: str + vlm_tagged_tag_name: str + vlm_errored_tag_name: str + vlm_incorrect_tag_name: str + output_data_dir: str + delete_incorrect_markers: bool + create_markers: bool + path_mutation: Dict + +def load_config_from_yaml(config_path: Optional[str] = None) -> VLMConnectorConfig: + """Load configuration from YAML file or use defaults""" + if config_path and os.path.exists(config_path): + with open(config_path, 'r') as f: + yaml_config = yaml.safe_load(f) + return VLMConnectorConfig(**yaml_config) + + # Return default configuration + return VLMConnectorConfig( + vlm_engine_config=VLM_ENGINE_CONFIG, + video_frame_interval=VIDEO_FRAME_INTERVAL, + video_threshold=VIDEO_THRESHOLD, + video_confidence_return=VIDEO_CONFIDENCE_RETURN, + concurrent_task_limit=CONCURRENT_TASK_LIMIT, + server_timeout=SERVER_TIMEOUT, + vlm_base_tag_name=VLM_BASE_TAG_NAME, + vlm_tagme_tag_name=VLM_TAGME_TAG_NAME, + vlm_updateme_tag_name=VLM_UPDATEME_TAG_NAME, + vlm_tagged_tag_name=VLM_TAGGED_TAG_NAME, + vlm_errored_tag_name=VLM_ERRORED_TAG_NAME, + vlm_incorrect_tag_name=VLM_INCORRECT_TAG_NAME, + output_data_dir=OUTPUT_DATA_DIR, + delete_incorrect_markers=DELETE_INCORRECT_MARKERS, + create_markers=CREATE_MARKERS, + path_mutation=PATH_MUTATION + ) + +# Global configuration instance +config = load_config_from_yaml() diff --git a/plugins/AHavenVLMConnector/haven_vlm_connector.py b/plugins/AHavenVLMConnector/haven_vlm_connector.py new file mode 100644 index 00000000..e6655d60 --- /dev/null +++ b/plugins/AHavenVLMConnector/haven_vlm_connector.py @@ -0,0 +1,444 @@ +""" +A Haven VLM Connector +A StashApp plugin for Vision-Language Model based content tagging +""" + +import os +import sys +import json +import shutil +import traceback +import asyncio +import logging +import time +from typing import Dict, Any, List, Optional +from datetime import datetime + +# Import and install sys.exit tracking FIRST (before any other imports that might call sys.exit) +try: + from exit_tracker import install_exit_tracker + import stashapi.log as log + install_exit_tracker(log) +except ImportError as e: + print(f"Warning: exit_tracker not available: {e}") + print("sys.exit tracking will not be available") + +# ----------------- Setup and Dependencies ----------------- + +# Use PythonDepManager for dependency management +try: + from PythonDepManager import ensure_import + + # Install and ensure all required dependencies with specific versions + ensure_import( + "stashapi:stashapp-tools==0.2.58", + "aiohttp==3.12.13", + "pydantic==2.11.7", + "vlm-engine==0.9.1", + "pyyaml==6.0.2" + ) + + # Import the dependencies after ensuring they're available + import stashapi.log as log + from stashapi.stashapp import StashInterface + import aiohttp + import pydantic + import yaml + +except ImportError as e: + print(f"Failed to import PythonDepManager or required dependencies: {e}") + print("Please ensure PythonDepManager is installed and available.") + sys.exit(1) +except Exception as e: + print(f"Error during dependency management: {e}") + print(f"Stack trace: {traceback.format_exc()}") + sys.exit(1) + +# Import local modules +try: + import haven_vlm_config as config +except ModuleNotFoundError: + log.error("Please provide a haven_vlm_config.py file with the required variables.") + raise Exception("Please provide a haven_vlm_config.py file with the required variables.") + +import haven_media_handler as media_handler +import haven_vlm_engine as vlm_engine +from haven_vlm_engine import TimeFrame + +log.debug("Python instance is running at: " + sys.executable) + +# ----------------- Global Variables ----------------- + +semaphore: Optional[asyncio.Semaphore] = None +progress: float = 0.0 +increment: float = 0.0 +completed_tasks: int = 0 +total_tasks: int = 0 +video_progress: Dict[str, float] = {} + +# ----------------- Main Execution ----------------- + +async def main() -> None: + """Main entry point for the plugin""" + global semaphore + + # Semaphore initialization logging for hypothesis A + log.debug(f"[DEBUG_HYPOTHESIS_A] Initializing semaphore with limit {config.config.concurrent_task_limit}") + + semaphore = asyncio.Semaphore(config.config.concurrent_task_limit) + + # Post-semaphore creation logging + log.debug(f"[DEBUG_HYPOTHESIS_A] Semaphore created successfully (limit: {config.config.concurrent_task_limit})") + + json_input = read_json_input() + output = {} + await run(json_input, output) + out = json.dumps(output) + print(out + "\n") + +def read_json_input() -> Dict[str, Any]: + """Read JSON input from stdin""" + json_input = sys.stdin.read() + return json.loads(json_input) + +async def run(json_input: Dict[str, Any], output: Dict[str, Any]) -> None: + """Main execution logic""" + plugin_args = None + try: + log.debug(json_input["server_connection"]) + os.chdir(json_input["server_connection"]["PluginDir"]) + media_handler.initialize(json_input["server_connection"]) + except Exception as e: + log.error(f"Failed to initialize media handler: {e}") + raise + + try: + plugin_args = json_input['args']["mode"] + except KeyError: + pass + + if plugin_args == "tag_videos": + await tag_videos() + output["output"] = "ok" + return + elif plugin_args == "find_marker_settings": + await find_marker_settings() + output["output"] = "ok" + return + elif plugin_args == "collect_incorrect_markers": + collect_incorrect_markers_and_images() + output["output"] = "ok" + return + + output["output"] = "ok" + return + +# ----------------- High Level Processing Functions ----------------- + +async def tag_videos() -> None: + """Tag videos with VLM analysis using improved async orchestration""" + global completed_tasks, total_tasks + + scenes = media_handler.get_tagme_scenes() + if not scenes: + log.info("No videos to tag. Have you tagged any scenes with the VLM_TagMe tag to get processed?") + return + + total_tasks = len(scenes) + completed_tasks = 0 + + video_progress.clear() + for scene in scenes: + video_progress[scene.get('id', 'unknown')] = 0.0 + log.progress(0.0) + + log.info(f"🚀 Starting video processing for {total_tasks} scenes with semaphore limit of {config.config.concurrent_task_limit}") + + # Create tasks with proper indexing for debugging + tasks = [] + for i, scene in enumerate(scenes): + # Pre-task creation logging for hypothesis A (semaphore deadlock) and E (signal termination) + scene_id = scene.get('id') + log.debug(f"[DEBUG_HYPOTHESIS_A] Creating task {i+1}/{total_tasks} for scene {scene_id}, semaphore limit: {config.config.concurrent_task_limit}") + + task = asyncio.create_task(__tag_video_with_timing(scene, i)) + tasks.append(task) + + # Use asyncio.as_completed to process results as they finish (proves concurrency) + completed_task_futures = asyncio.as_completed(tasks) + + batch_start_time = asyncio.get_event_loop().time() + + for completed_task in completed_task_futures: + try: + await completed_task + completed_tasks += 1 + + except Exception as e: + completed_tasks += 1 + # Exception logging for hypothesis E (signal termination) + error_type = type(e).__name__ + log.debug(f"[DEBUG_HYPOTHESIS_E] Task failed with exception: {error_type}: {str(e)} (Task {completed_tasks}/{total_tasks})") + + log.error(f"❌ Task failed: {e}") + + total_time = asyncio.get_event_loop().time() - batch_start_time + + log.info(f"🎉 All {total_tasks} videos completed in {total_time:.2f}s (avg: {total_time/total_tasks:.2f}s/video)") + log.progress(1.0) + +async def find_marker_settings() -> None: + """Find optimal marker settings based on a single tagged video""" + scenes = media_handler.get_tagme_scenes() + if len(scenes) != 1: + log.error("Please tag exactly one scene with the VLM_TagMe tag to get processed.") + return + scene = scenes[0] + await __find_marker_settings(scene) + +def collect_incorrect_markers_and_images() -> None: + """Collect data from incorrectly tagged markers and images""" + incorrect_images = media_handler.get_incorrect_images() + image_paths, image_ids, temp_files = media_handler.get_image_paths_and_ids(incorrect_images) + incorrect_markers = media_handler.get_incorrect_markers() + + if not (len(incorrect_images) > 0 or len(incorrect_markers) > 0): + log.info("No incorrect images or markers to collect.") + return + + current_time = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + + try: + # Process images + image_folder = os.path.join(config.config.output_data_dir, "images") + os.makedirs(image_folder, exist_ok=True) + for image_path in image_paths: + try: + shutil.copy(image_path, image_folder) + except Exception as e: + log.error(f"Failed to copy image {image_path} to {image_folder}: {e}") + except Exception as e: + log.error(f"Failed to process images: {e}") + raise e + finally: + # Clean up temp files + for temp_file in temp_files: + try: + if os.path.isdir(temp_file): + shutil.rmtree(temp_file) + else: + os.remove(temp_file) + except Exception as e: + log.debug(f"Failed to remove temp file {temp_file}: {e}") + + # Process markers + scene_folder = os.path.join(config.config.output_data_dir, "scenes") + os.makedirs(scene_folder, exist_ok=True) + tag_folders = {} + + for marker in incorrect_markers: + scene_path = marker['scene']['files'][0]['path'] + if not scene_path: + log.error(f"Marker {marker['id']} has no scene path") + continue + try: + tag_name = marker['primary_tag']['name'] + if tag_name not in tag_folders: + tag_folders[tag_name] = os.path.join(scene_folder, tag_name) + os.makedirs(tag_folders[tag_name], exist_ok=True) + media_handler.write_scene_marker_to_file(marker, scene_path, tag_folders[tag_name]) + except Exception as e: + log.error(f"Failed to collect scene: {e}") + + # Remove incorrect tags from images + image_ids = [image['id'] for image in incorrect_images] + media_handler.remove_incorrect_tag_from_images(image_ids) + +# ----------------- Low Level Processing Functions ----------------- + +async def __tag_video_with_timing(scene: Dict[str, Any], scene_index: int) -> None: + """Tag a single video scene with timing diagnostics""" + start_time = asyncio.get_event_loop().time() + scene_id = scene.get('id', 'unknown') + + log.info(f"🎬 Starting video {scene_index + 1}: Scene {scene_id}") + + try: + await __tag_video(scene) + end_time = asyncio.get_event_loop().time() + duration = end_time - start_time + log.info(f"✅ Completed video {scene_index + 1} (Scene {scene_id}) in {duration:.2f}s") + + except Exception as e: + end_time = asyncio.get_event_loop().time() + duration = end_time - start_time + log.error(f"❌ Failed video {scene_index + 1} (Scene {scene_id}) after {duration:.2f}s: {e}") + raise + +async def __tag_video(scene: Dict[str, Any]) -> None: + """Tag a single video scene with semaphore timing instrumentation""" + scene_id = scene.get('id') + + # Pre-semaphore acquisition logging for hypothesis A (semaphore deadlock) + task_start_time = asyncio.get_event_loop().time() + acquisition_start_time = task_start_time + log.debug(f"[DEBUG_HYPOTHESIS_A] Task starting for scene {scene_id} at {task_start_time:.3f}s") + + async with semaphore: + try: + # Semaphore acquisition successful logging + acquisition_end_time = asyncio.get_event_loop().time() + acquisition_time = acquisition_end_time - acquisition_start_time + log.debug(f"[DEBUG_HYPOTHESIS_A] Semaphore acquired for scene {scene_id} after {acquisition_time:.3f}s") + + if scene_id is None: + log.error("Scene missing 'id' field") + return + + files = scene.get('files', []) + if not files: + log.error(f"Scene {scene_id} has no files") + return + + scene_file = files[0].get('path') + if scene_file is None: + log.error(f"Scene {scene_id} file has no path") + return + + # Check if scene is VR + is_vr = media_handler.is_vr_scene(scene.get('tags', [])) + + def progress_cb(p: int) -> None: + global video_progress, total_tasks + video_progress[scene_id] = p / 100.0 + total_prog = sum(video_progress.values()) / total_tasks + log.progress(total_prog) + + # Process video through VLM Engine with HTTP timing for hypothesis B + processing_start_time = asyncio.get_event_loop().time() + + # HTTP request lifecycle tracking start + log.debug(f"[DEBUG_HYPOTHESIS_B] Starting VLM processing for scene {scene_id}: {scene_file}") + + video_result = await vlm_engine.process_video_async( + scene_file, + vr_video=is_vr, + frame_interval=config.config.video_frame_interval, + threshold=config.config.video_threshold, + return_confidence=config.config.video_confidence_return, + progress_callback=progress_cb + ) + + # Extract detected tags + detected_tags = set() + for category_tags in video_result.video_tags.values(): + detected_tags.update(category_tags) + + # Post-VLM processing logging + processing_end_time = asyncio.get_event_loop().time() + processing_duration = processing_end_time - processing_start_time + log.debug(f"[DEBUG_HYPOTHESIS_B] VLM processing completed for scene {scene_id} in {processing_duration:.2f}s ({len(detected_tags)} detected tags)") + + if detected_tags: + # Clear all existing tags and markers before adding new ones + media_handler.clear_all_tags_from_video(scene) + media_handler.clear_all_markers_from_video(scene_id) + + # Add tags to scene + tag_ids = media_handler.get_tag_ids(list(detected_tags), create=True) + media_handler.add_tags_to_video(scene_id, tag_ids) + log.info(f"Added tags {list(detected_tags)} to scene {scene_id}") + + # Add markers if enabled + if config.config.create_markers: + media_handler.add_markers_to_video_from_dict(scene_id, video_result.tag_timespans) + log.info(f"Added markers to scene {scene_id}") + + # Remove VLM_TagMe tag from processed scene + media_handler.remove_tagme_tag_from_scene(scene_id) + + # Task completion logging + task_end_time = asyncio.get_event_loop().time() + total_task_time = task_end_time - task_start_time + log.debug(f"[DEBUG_HYPOTHESIS_A] Task completed for scene {scene_id} in {total_task_time:.2f}s") + + except Exception as e: + # Exception handling with detailed logging for hypothesis E + exception_time = asyncio.get_event_loop().time() + error_type = type(e).__name__ + log.debug(f"[DEBUG_HYPOTHESIS_E] Task exception for scene {scene_id}: {error_type}: {str(e)} at {exception_time:.3f}s") + + scene_id = scene.get('id', 'unknown') + log.error(f"Error processing video scene {scene_id}: {e}") + # Add error tag to failed scene if we have a valid ID + if scene_id != 'unknown': + media_handler.add_error_scene(scene_id) + +async def __find_marker_settings(scene: Dict[str, Any]) -> None: + """Find optimal marker settings for a scene""" + try: + scene_id = scene.get('id') + if scene_id is None: + log.error("Scene missing 'id' field") + return + + files = scene.get('files', []) + if not files: + log.error(f"Scene {scene_id} has no files") + return + + scene_file = files[0].get('path') + if scene_file is None: + log.error(f"Scene {scene_id} file has no path") + return + + # Get existing markers for the scene + existing_markers = media_handler.get_scene_markers(scene_id) + + # Convert markers to desired timespan format + desired_timespan_data = {} + for marker in existing_markers: + tag_name = marker['primary_tag']['name'] + desired_timespan_data[tag_name] = TimeFrame( + start=marker['seconds'], + end=marker.get('end_seconds', marker['seconds'] + 1), + total_confidence=1.0 + ) + + # Find optimal settings + optimal_settings = await vlm_engine.find_optimal_marker_settings_async( + existing_json={}, # No existing JSON data + desired_timespan_data=desired_timespan_data + ) + + # Output results + log.info(f"Optimal marker settings found for scene {scene_id}:") + log.info(json.dumps(optimal_settings, indent=2)) + + except Exception as e: + scene_id = scene.get('id', 'unknown') + log.error(f"Error finding marker settings for scene {scene_id}: {e}") + +# ----------------- Cleanup ----------------- + +async def cleanup() -> None: + """Cleanup resources""" + if vlm_engine.vlm_engine: + await vlm_engine.vlm_engine.shutdown() + +# Run main function if script is executed directly +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + log.info("Plugin interrupted by user") + sys.exit(0) + except SystemExit as e: + # Re-raise system exit with the exit code + log.debug(f"[DEBUG_EXIT_CODE] Caught SystemExit with code: {e.code}") + raise + except Exception as e: + log.error(f"Plugin failed: {e}") + sys.exit(1) + finally: + asyncio.run(cleanup()) diff --git a/plugins/AHavenVLMConnector/haven_vlm_engine.py b/plugins/AHavenVLMConnector/haven_vlm_engine.py new file mode 100644 index 00000000..7c604655 --- /dev/null +++ b/plugins/AHavenVLMConnector/haven_vlm_engine.py @@ -0,0 +1,299 @@ +""" +Haven VLM Engine Integration Module +Provides integration with the Haven VLM Engine for video and image processing +""" + +import asyncio +import logging +from typing import Any, Dict, List, Optional, Set, Union, Callable +from dataclasses import dataclass +from datetime import datetime +import json + +# Use PythonDepManager for dependency management +from vlm_engine import VLMEngine +from vlm_engine.config_models import ( + EngineConfig, + PipelineConfig, + ModelConfig, + PipelineModelConfig +) + +import haven_vlm_config as config + +# Configure logging +logging.basicConfig(level=logging.CRITICAL) +logger = logging.getLogger(__name__) + +@dataclass +class TimeFrame: + """Represents a time frame with start and end times""" + start: float + end: float + total_confidence: Optional[float] = None + + def to_json(self) -> str: + """Convert to JSON string""" + return json.dumps({ + "start": self.start, + "end": self.end, + "total_confidence": self.total_confidence + }) + + def __str__(self) -> str: + return f"TimeFrame(start={self.start}, end={self.end}, confidence={self.total_confidence})" + +@dataclass +class VideoTagInfo: + """Represents video tagging information""" + video_duration: float + video_tags: Dict[str, Set[str]] + tag_totals: Dict[str, Dict[str, float]] + tag_timespans: Dict[str, Dict[str, List[TimeFrame]]] + + @classmethod + def from_json(cls, json_data: Dict[str, Any]) -> 'VideoTagInfo': + """Create VideoTagInfo from JSON data""" + logger.debug(f"Creating VideoTagInfo from JSON: {json_data}") + + # Convert tag_timespans to TimeFrame objects + tag_timespans = {} + for category, tags in json_data.get("tag_timespans", {}).items(): + tag_timespans[category] = {} + for tag_name, timeframes in tags.items(): + tag_timespans[category][tag_name] = [ + TimeFrame( + start=tf["start"], + end=tf["end"], + total_confidence=tf.get("total_confidence") + ) for tf in timeframes + ] + + return cls( + video_duration=json_data.get("video_duration", 0.0), + video_tags=json_data.get("video_tags", {}), + tag_totals=json_data.get("tag_totals", {}), + tag_timespans=tag_timespans + ) + + def __str__(self) -> str: + return f"VideoTagInfo(duration={self.video_duration}, tags={len(self.video_tags)}, timespans={len(self.tag_timespans)})" + +class HavenVLMEngine: + """Main VLM Engine integration class""" + + def __init__(self): + self.engine: Optional[VLMEngine] = None + self.engine_config: Optional[EngineConfig] = None + self._initialized = False + + async def initialize(self) -> None: + """Initialize the VLM Engine with configuration""" + if self._initialized: + return + + try: + logger.info("Initializing Haven VLM Engine...") + + # Convert config dict to EngineConfig objects + self.engine_config = self._create_engine_config() + + # Create and initialize the engine + self.engine = VLMEngine(config=self.engine_config) + await self.engine.initialize() + + self._initialized = True + logger.info("Haven VLM Engine initialized successfully") + + except Exception as e: + logger.error(f"Failed to initialize VLM Engine: {e}") + raise + + def _create_engine_config(self) -> EngineConfig: + """Create EngineConfig from the configuration""" + vlm_config = config.config.vlm_engine_config + + # Create pipeline configs + pipelines = {} + for pipeline_name, pipeline_data in vlm_config["pipelines"].items(): + models = [ + PipelineModelConfig( + name=model["name"], + inputs=model["inputs"], + outputs=model["outputs"] + ) for model in pipeline_data["models"] + ] + + pipelines[pipeline_name] = PipelineConfig( + inputs=pipeline_data["inputs"], + output=pipeline_data["output"], + short_name=pipeline_data["short_name"], + version=pipeline_data["version"], + models=models + ) + + # Create model configs with new architectural changes + models = {} + for model_name, model_data in vlm_config["models"].items(): + if model_data["type"] == "vlm_model": + # Process multiplexer_endpoints and validate max_concurrent + multiplexer_endpoints = [] + for endpoint in model_data.get("multiplexer_endpoints", []): + # Validate that max_concurrent is present + if "max_concurrent" not in endpoint: + raise ValueError(f"Endpoint '{endpoint.get('name', 'unnamed')}' is missing required 'max_concurrent' parameter") + + multiplexer_endpoints.append({ + "base_url": endpoint["base_url"], + "api_key": endpoint.get("api_key", ""), + "name": endpoint["name"], + "weight": endpoint.get("weight", 5), + "is_fallback": endpoint.get("is_fallback", False), + "max_concurrent": endpoint["max_concurrent"] + }) + + models[model_name] = ModelConfig( + type=model_data["type"], + model_file_name=model_data["model_file_name"], + model_category=model_data["model_category"], + model_id=model_data["model_id"], + model_identifier=model_data["model_identifier"], + model_version=model_data["model_version"], + use_multiplexer=model_data.get("use_multiplexer", False), + max_concurrent_requests=model_data.get("max_concurrent_requests", 10), + instance_count=model_data.get("instance_count",1), + max_batch_size=model_data.get("max_batch_size",1), + multiplexer_endpoints=multiplexer_endpoints, + tag_list=model_data.get("tag_list", []) + ) + else: + models[model_name] = ModelConfig( + type=model_data["type"], + model_file_name=model_data["model_file_name"] + ) + + return EngineConfig( + active_ai_models=vlm_config["active_ai_models"], + pipelines=pipelines, + models=models, + category_config=vlm_config["category_config"] + ) + + async def process_video( + self, + video_path: str, + vr_video: bool = False, + frame_interval: Optional[float] = None, + threshold: Optional[float] = None, + return_confidence: Optional[bool] = None, + existing_json: Optional[Dict[str, Any]] = None, + progress_callback: Optional[Callable[[int], None]] = None + ) -> VideoTagInfo: + """Process a video using the VLM Engine""" + if not self._initialized: + await self.initialize() + + try: + logger.info(f"Processing video: {video_path}") + + # Use config defaults if not provided + frame_interval = frame_interval or config.config.video_frame_interval + threshold = threshold or config.config.video_threshold + return_confidence = return_confidence if return_confidence is not None else config.config.video_confidence_return + + # Process video through the engine + results = await self.engine.process_video( + video_path, + frame_interval=frame_interval, + progress_callback=progress_callback + ) + + logger.info(f"Video processing completed for: {video_path}") + logger.debug(f"Raw results structure: {type(results)}") + + # Extract video_tag_info from the nested structure + if isinstance(results, dict) and 'video_tag_info' in results: + video_tag_data = results['video_tag_info'] + logger.debug(f"Using video_tag_info from results: {video_tag_data.keys()}") + else: + # Fallback: assume results is already in the correct format + video_tag_data = results + logger.debug(f"Using results directly: {video_tag_data.keys() if isinstance(video_tag_data, dict) else type(video_tag_data)}") + + return VideoTagInfo.from_json(video_tag_data) + + except Exception as e: + logger.error(f"Error processing video {video_path}: {e}") + raise + + async def find_optimal_marker_settings( + self, + existing_json: Dict[str, Any], + desired_timespan_data: Dict[str, TimeFrame] + ) -> Dict[str, Any]: + """Find optimal marker settings based on existing data""" + if not self._initialized: + await self.initialize() + + try: + logger.info("Finding optimal marker settings...") + + # Convert TimeFrame objects to dict format + desired_data = {} + for key, timeframe in desired_timespan_data.items(): + desired_data[key] = { + "start": timeframe.start, + "end": timeframe.end, + "total_confidence": timeframe.total_confidence + } + + # Call the engine's optimization method + results = await self.engine.optimize_timeframe_settings( + existing_json_data=existing_json, + desired_timespan_data=desired_data + ) + + logger.info("Optimal marker settings found") + return results + + except Exception as e: + logger.error(f"Error finding optimal marker settings: {e}") + raise + + async def shutdown(self) -> None: + """Shutdown the VLM Engine""" + if self.engine and self._initialized: + try: + # VLMEngine doesn't have a shutdown method, just perform basic cleanup + logger.info("VLM Engine cleanup completed") + self._initialized = False + + except Exception as e: + logger.error(f"Error during VLM Engine cleanup: {e}") + self._initialized = False + +# Global VLM Engine instance +vlm_engine = HavenVLMEngine() + +# Convenience functions for backward compatibility +async def process_video_async( + video_path: str, + vr_video: bool = False, + frame_interval: Optional[float] = None, + threshold: Optional[float] = None, + return_confidence: Optional[bool] = None, + existing_json: Optional[Dict[str, Any]] = None, + progress_callback: Optional[Callable[[int], None]] = None +) -> VideoTagInfo: + """Process video asynchronously""" + return await vlm_engine.process_video( + video_path, vr_video, frame_interval, threshold, return_confidence, existing_json, + progress_callback=progress_callback + ) + +async def find_optimal_marker_settings_async( + existing_json: Dict[str, Any], + desired_timespan_data: Dict[str, TimeFrame] +) -> Dict[str, Any]: + """Find optimal marker settings asynchronously""" + return await vlm_engine.find_optimal_marker_settings(existing_json, desired_timespan_data) diff --git a/plugins/AHavenVLMConnector/haven_vlm_utility.py b/plugins/AHavenVLMConnector/haven_vlm_utility.py new file mode 100644 index 00000000..1a1e032f --- /dev/null +++ b/plugins/AHavenVLMConnector/haven_vlm_utility.py @@ -0,0 +1,316 @@ +""" +Haven VLM Utility Module +Utility functions for the A Haven VLM Connector plugin +""" + +import os +import json +import logging +from typing import Dict, Any, List, Optional, Union +from pathlib import Path +import yaml + +logger = logging.getLogger(__name__) + +def apply_path_mutations(path: str, mutations: Dict[str, str]) -> str: + """ + Apply path mutations for different environments + + Args: + path: Original file path + mutations: Dictionary of path mutations (e.g., {"E:": "F:", "G:": "D:"}) + + Returns: + Mutated path string + """ + if not mutations: + return path + + mutated_path = path + for old_path, new_path in mutations.items(): + if mutated_path.startswith(old_path): + mutated_path = mutated_path.replace(old_path, new_path, 1) + break + + return mutated_path + +def ensure_directory_exists(directory_path: str) -> None: + """ + Ensure a directory exists, creating it if necessary + + Args: + directory_path: Path to the directory + """ + Path(directory_path).mkdir(parents=True, exist_ok=True) + +def safe_file_operation(operation_func, *args, **kwargs) -> Optional[Any]: + """ + Safely execute a file operation with error handling + + Args: + operation_func: Function to execute + *args: Arguments for the function + **kwargs: Keyword arguments for the function + + Returns: + Result of the operation or None if failed + """ + try: + return operation_func(*args, **kwargs) + except (OSError, IOError) as e: + logger.error(f"File operation failed: {e}") + return None + except Exception as e: + logger.error(f"Unexpected error in file operation: {e}") + return None + +def load_yaml_config(config_path: str) -> Optional[Dict[str, Any]]: + """ + Load configuration from YAML file + + Args: + config_path: Path to the YAML configuration file + + Returns: + Configuration dictionary or None if failed + """ + try: + with open(config_path, 'r', encoding='utf-8') as f: + config = yaml.safe_load(f) + logger.info(f"Configuration loaded from {config_path}") + return config + except FileNotFoundError: + logger.warning(f"Configuration file not found: {config_path}") + return None + except yaml.YAMLError as e: + logger.error(f"Error parsing YAML configuration: {e}") + return None + except Exception as e: + logger.error(f"Unexpected error loading configuration: {e}") + return None + +def save_yaml_config(config: Dict[str, Any], config_path: str) -> bool: + """ + Save configuration to YAML file + + Args: + config: Configuration dictionary + config_path: Path to save the configuration file + + Returns: + True if successful, False otherwise + """ + try: + ensure_directory_exists(os.path.dirname(config_path)) + with open(config_path, 'w', encoding='utf-8') as f: + yaml.dump(config, f, default_flow_style=False, indent=2) + logger.info(f"Configuration saved to {config_path}") + return True + except Exception as e: + logger.error(f"Error saving configuration: {e}") + return False + +def validate_file_path(file_path: str) -> bool: + """ + Validate if a file path exists and is accessible + + Args: + file_path: Path to validate + + Returns: + True if file exists and is accessible, False otherwise + """ + try: + return os.path.isfile(file_path) and os.access(file_path, os.R_OK) + except Exception: + return False + +def get_file_extension(file_path: str) -> str: + """ + Get the file extension from a file path + + Args: + file_path: Path to the file + + Returns: + File extension (including the dot) + """ + return Path(file_path).suffix.lower() + +def is_video_file(file_path: str) -> bool: + """ + Check if a file is a video file based on its extension + + Args: + file_path: Path to the file + + Returns: + True if it's a video file, False otherwise + """ + video_extensions = {'.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.webm', '.m4v'} + return get_file_extension(file_path) in video_extensions + +def is_image_file(file_path: str) -> bool: + """ + Check if a file is an image file based on its extension + + Args: + file_path: Path to the file + + Returns: + True if it's an image file, False otherwise + """ + image_extensions = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp'} + return get_file_extension(file_path) in image_extensions + +def format_duration(seconds: float) -> str: + """ + Format duration in seconds to human-readable string + + Args: + seconds: Duration in seconds + + Returns: + Formatted duration string (e.g., "1h 23m 45s") + """ + if seconds < 60: + return f"{seconds:.1f}s" + elif seconds < 3600: + minutes = int(seconds // 60) + remaining_seconds = seconds % 60 + return f"{minutes}m {remaining_seconds:.1f}s" + else: + hours = int(seconds // 3600) + remaining_minutes = int((seconds % 3600) // 60) + remaining_seconds = seconds % 60 + return f"{hours}h {remaining_minutes}m {remaining_seconds:.1f}s" + +def format_file_size(bytes_size: int) -> str: + """ + Format file size in bytes to human-readable string + + Args: + bytes_size: Size in bytes + + Returns: + Formatted size string (e.g., "1.5 MB") + """ + for unit in ['B', 'KB', 'MB', 'GB', 'TB']: + if bytes_size < 1024.0: + return f"{bytes_size:.1f} {unit}" + bytes_size /= 1024.0 + return f"{bytes_size:.1f} PB" + +def sanitize_filename(filename: str) -> str: + """ + Sanitize a filename by removing or replacing invalid characters + + Args: + filename: Original filename + + Returns: + Sanitized filename + """ + # Replace invalid characters with underscores + invalid_chars = '<>:"/\\|?*' + for char in invalid_chars: + filename = filename.replace(char, '_') + + # Remove leading/trailing spaces and dots + filename = filename.strip(' .') + + # Ensure filename is not empty + if not filename: + filename = "unnamed" + + return filename + +def create_backup_file(file_path: str, backup_suffix: str = ".backup") -> Optional[str]: + """ + Create a backup of a file + + Args: + file_path: Path to the file to backup + backup_suffix: Suffix for the backup file + + Returns: + Path to the backup file or None if failed + """ + try: + if not os.path.exists(file_path): + logger.warning(f"File does not exist: {file_path}") + return None + + backup_path = file_path + backup_suffix + import shutil + shutil.copy2(file_path, backup_path) + logger.info(f"Backup created: {backup_path}") + return backup_path + except Exception as e: + logger.error(f"Failed to create backup: {e}") + return None + +def merge_dictionaries(dict1: Dict[str, Any], dict2: Dict[str, Any], overwrite: bool = True) -> Dict[str, Any]: + """ + Merge two dictionaries, with option to overwrite existing keys + + Args: + dict1: First dictionary + dict2: Second dictionary + overwrite: Whether to overwrite existing keys in dict1 + + Returns: + Merged dictionary + """ + result = dict1.copy() + + for key, value in dict2.items(): + if key not in result or overwrite: + result[key] = value + elif isinstance(result[key], dict) and isinstance(value, dict): + result[key] = merge_dictionaries(result[key], value, overwrite) + + return result + +def chunk_list(lst: List[Any], chunk_size: int) -> List[List[Any]]: + """ + Split a list into chunks of specified size + + Args: + lst: List to chunk + chunk_size: Size of each chunk + + Returns: + List of chunks + """ + return [lst[i:i + chunk_size] for i in range(0, len(lst), chunk_size)] + +def retry_operation(operation_func, max_retries: int = 3, delay: float = 1.0, *args, **kwargs) -> Optional[Any]: + """ + Retry an operation with exponential backoff + + Args: + operation_func: Function to retry + max_retries: Maximum number of retries + delay: Initial delay between retries + *args: Arguments for the function + **kwargs: Keyword arguments for the function + + Returns: + Result of the operation or None if all retries failed + """ + import time + + for attempt in range(max_retries + 1): + try: + return operation_func(*args, **kwargs) + except Exception as e: + if attempt == max_retries: + logger.error(f"Operation failed after {max_retries} retries: {e}") + return None + + wait_time = delay * (2 ** attempt) + logger.warning(f"Operation failed (attempt {attempt + 1}/{max_retries + 1}), retrying in {wait_time}s: {e}") + time.sleep(wait_time) + + return None \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/requirements.txt b/plugins/AHavenVLMConnector/requirements.txt new file mode 100644 index 00000000..6d704f53 --- /dev/null +++ b/plugins/AHavenVLMConnector/requirements.txt @@ -0,0 +1,8 @@ +# Core dependencies managed by PythonDepManager +# These are automatically handled by the plugin's dependency management system +# PythonDepManager will ensure the correct versions are installed + +# Development and testing dependencies +coverage>=7.0.0 +pytest>=7.0.0 +pytest-cov>=4.0.0 diff --git a/plugins/AHavenVLMConnector/run_tests.py b/plugins/AHavenVLMConnector/run_tests.py new file mode 100644 index 00000000..bc8e0500 --- /dev/null +++ b/plugins/AHavenVLMConnector/run_tests.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +""" +Test runner for A Haven VLM Connector +Runs all unit tests with coverage reporting +""" + +import sys +import os +import subprocess +import unittest +from pathlib import Path + +def install_test_dependencies(): + """Install test dependencies if not already installed""" + test_deps = [ + 'coverage', + 'pytest', + 'pytest-cov' + ] + + for dep in test_deps: + try: + __import__(dep.replace('-', '_')) + except ImportError: + print(f"Installing {dep}...") + subprocess.check_call([sys.executable, "-m", "pip", "install", dep]) + +def run_tests_with_coverage(): + """Run tests with coverage reporting""" + # Install test dependencies + install_test_dependencies() + + # Get the directory containing this script + script_dir = Path(__file__).parent + + # Discover and run tests + loader = unittest.TestLoader() + start_dir = script_dir + suite = loader.discover(start_dir, pattern='test_*.py') + + # Run tests with coverage + import coverage + + # Start coverage measurement + cov = coverage.Coverage( + source=['haven_vlm_config.py', 'haven_vlm_engine.py', 'haven_media_handler.py', + 'haven_vlm_connector.py', 'haven_vlm_utility.py'], + omit=['*/test_*.py', '*/__pycache__/*', '*/venv/*', '*/env/*'] + ) + cov.start() + + # Run the tests + runner = unittest.TextTestRunner(verbosity=2) + result = runner.run(suite) + + # Stop coverage measurement + cov.stop() + cov.save() + + # Generate coverage report + print("\n" + "="*60) + print("COVERAGE REPORT") + print("="*60) + cov.report() + + # Generate HTML coverage report + cov.html_report(directory='htmlcov') + print(f"\nHTML coverage report generated in: {script_dir}/htmlcov/index.html") + + return result.wasSuccessful() + +def run_specific_test(test_file): + """Run a specific test file""" + if not test_file.endswith('.py'): + test_file += '.py' + + test_path = Path(__file__).parent / test_file + + if not test_path.exists(): + print(f"Test file not found: {test_path}") + return False + + # Run the specific test + loader = unittest.TestLoader() + suite = loader.loadTestsFromName(test_file[:-3]) + + runner = unittest.TextTestRunner(verbosity=2) + result = runner.run(suite) + + return result.wasSuccessful() + +def main(): + """Main entry point""" + if len(sys.argv) > 1: + # Run specific test file + test_file = sys.argv[1] + success = run_specific_test(test_file) + else: + # Run all tests with coverage + success = run_tests_with_coverage() + + if success: + print("\n✅ All tests passed!") + sys.exit(0) + else: + print("\n❌ Some tests failed!") + sys.exit(1) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_dependency_management.py b/plugins/AHavenVLMConnector/test_dependency_management.py new file mode 100644 index 00000000..190f5dbe --- /dev/null +++ b/plugins/AHavenVLMConnector/test_dependency_management.py @@ -0,0 +1,98 @@ +""" +Unit tests for dependency management functionality using PythonDepManager +""" + +import unittest +import sys +from unittest.mock import patch, MagicMock, mock_open +import tempfile +import os + +class TestPythonDepManagerIntegration(unittest.TestCase): + """Test cases for PythonDepManager integration""" + + def setUp(self): + """Set up test fixtures""" + # Mock PythonDepManager module + self.mock_python_dep_manager = MagicMock() + sys.modules['PythonDepManager'] = self.mock_python_dep_manager + + def tearDown(self): + """Clean up after tests""" + if 'PythonDepManager' in sys.modules: + del sys.modules['PythonDepManager'] + + @patch('builtins.print') + def test_dependency_import_failure(self, mock_print): + """Test dependency import failure handling""" + # Mock ensure_import to raise ImportError + self.mock_python_dep_manager.ensure_import = MagicMock(side_effect=ImportError("Package not found")) + + # Test that the error is handled gracefully + with self.assertRaises(SystemExit): + import haven_vlm_connector + + def test_error_messages(self): + """Test that appropriate error messages are displayed""" + # Mock ensure_import to raise ImportError + self.mock_python_dep_manager.ensure_import = MagicMock(side_effect=ImportError("Package not found")) + + with patch('builtins.print') as mock_print: + with self.assertRaises(SystemExit): + import haven_vlm_connector + + # Check that appropriate error messages were printed + print_calls = [call[0][0] for call in mock_print.call_args_list] + self.assertTrue(any("Failed to import PythonDepManager" in msg for msg in print_calls if isinstance(msg, str))) + self.assertTrue(any("Please ensure PythonDepManager is installed" in msg for msg in print_calls if isinstance(msg, str))) + + +class TestDependencyManagementEdgeCases(unittest.TestCase): + """Test edge cases in dependency management""" + + def setUp(self): + """Set up test fixtures""" + self.mock_python_dep_manager = MagicMock() + sys.modules['PythonDepManager'] = self.mock_python_dep_manager + + def tearDown(self): + """Clean up after tests""" + if 'PythonDepManager' in sys.modules: + del sys.modules['PythonDepManager'] + + def test_missing_python_dep_manager(self): + """Test behavior when PythonDepManager is not available""" + # Remove PythonDepManager from sys.modules + if 'PythonDepManager' in sys.modules: + del sys.modules['PythonDepManager'] + + with patch('builtins.print') as mock_print: + with self.assertRaises(SystemExit): + import haven_vlm_connector + + # Check that appropriate error message was printed + print_calls = [call[0][0] for call in mock_print.call_args_list] + self.assertTrue(any("Failed to import PythonDepManager" in msg for msg in print_calls if isinstance(msg, str))) + + def test_partial_dependency_failure(self): + """Test behavior when some dependencies fail to import""" + # Mock ensure_import to succeed but some imports to fail + self.mock_python_dep_manager.ensure_import = MagicMock() + + # Mock some successful imports but not all + mock_stashapi = MagicMock() + sys.modules['stashapi.log'] = mock_stashapi + sys.modules['stashapi.stashapp'] = mock_stashapi + + # Don't mock aiohttp, so it should fail + with patch('builtins.print') as mock_print: + with self.assertRaises(SystemExit): + import haven_vlm_connector + + # Check that appropriate error message was printed + print_calls = [call[0][0] for call in mock_print.call_args_list] + self.assertTrue(any("Error during dependency management" in msg for msg in print_calls if isinstance(msg, str))) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_haven_media_handler.py b/plugins/AHavenVLMConnector/test_haven_media_handler.py new file mode 100644 index 00000000..ed81b5fc --- /dev/null +++ b/plugins/AHavenVLMConnector/test_haven_media_handler.py @@ -0,0 +1,387 @@ +""" +Unit tests for Haven Media Handler Module +Tests StashApp media operations and tag management +""" + +import unittest +from unittest.mock import Mock, patch, MagicMock +from typing import List, Dict, Any, Optional +import sys +import os + +# Add the current directory to the path to import the module +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +# Mock the dependencies before importing the module +sys.modules['PythonDepManager'] = Mock() +sys.modules['stashapi.stashapp'] = Mock() +sys.modules['stashapi.log'] = Mock() +sys.modules['haven_vlm_config'] = Mock() + +# Import the module after mocking dependencies +import haven_media_handler + + +class TestHavenMediaHandler(unittest.TestCase): + """Test cases for Haven Media Handler""" + + def setUp(self) -> None: + """Set up test fixtures""" + # Mock the stash interface + self.mock_stash = Mock() + self.mock_stash.find_tag.return_value = {"id": 1} + self.mock_stash.get_configuration.return_value = {"ui": {"vrTag": "VR"}} + self.mock_stash.stash_version.return_value = Mock() + + # Mock the log module + self.mock_log = Mock() + + # Patch the global variables + haven_media_handler.stash = self.mock_stash + haven_media_handler.log = self.mock_log + + # Mock tag IDs + haven_media_handler.vlm_errored_tag_id = 1 + haven_media_handler.vlm_tagme_tag_id = 2 + haven_media_handler.vlm_base_tag_id = 3 + haven_media_handler.vlm_tagged_tag_id = 4 + haven_media_handler.vr_tag_id = 5 + haven_media_handler.vlm_incorrect_tag_id = 6 + + def tearDown(self) -> None: + """Clean up after tests""" + # Clear any cached data + haven_media_handler.tag_id_cache.clear() + haven_media_handler.vlm_tag_ids_cache.clear() + + def test_clear_all_tags_from_video_with_tags(self) -> None: + """Test clearing all tags from a video that has tags""" + # Mock scene with tags + mock_scene = { + "id": 123, + "tags": [ + {"id": 10, "name": "Tag1"}, + {"id": 20, "name": "Tag2"}, + {"id": 30, "name": "Tag3"} + ] + } + # Call the function + haven_media_handler.clear_all_tags_from_video(mock_scene) + # Verify tags were removed + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [10, 20, 30], "mode": "REMOVE"} + }) + # Verify log message + self.mock_log.info.assert_called_once_with("Cleared 3 tags from scene 123") + + def test_clear_all_tags_from_video_no_tags(self) -> None: + """Test clearing all tags from a video that has no tags""" + # Mock scene without tags + mock_scene = {"id": 123, "tags": []} + # Call the function + haven_media_handler.clear_all_tags_from_video(mock_scene) + # Verify no update was called since there are no tags + self.mock_stash.update_scenes.assert_not_called() + # Verify no log message + self.mock_log.info.assert_not_called() + + def test_clear_all_tags_from_video_scene_without_tags_key(self) -> None: + """Test clearing all tags from a scene that doesn't have a tags key""" + # Mock scene without tags key + mock_scene = {"id": 123} + # Call the function + haven_media_handler.clear_all_tags_from_video(mock_scene) + # Verify no update was called + self.mock_stash.update_scenes.assert_not_called() + + @patch('haven_media_handler.get_scene_markers') + @patch('haven_media_handler.delete_markers') + def test_clear_all_markers_from_video_with_markers(self, mock_delete_markers: Mock, mock_get_markers: Mock) -> None: + """Test clearing all markers from a video that has markers""" + # Mock markers + mock_markers = [ + {"id": 1, "title": "Marker1"}, + {"id": 2, "title": "Marker2"} + ] + mock_get_markers.return_value = mock_markers + + # Call the function + haven_media_handler.clear_all_markers_from_video(123) + + # Verify markers were retrieved + mock_get_markers.assert_called_once_with(123) + + # Verify markers were deleted + mock_delete_markers.assert_called_once_with(mock_markers) + + # Verify log message + self.mock_log.info.assert_called_once_with("Cleared all 2 markers from scene 123") + + @patch('haven_media_handler.get_scene_markers') + @patch('haven_media_handler.delete_markers') + def test_clear_all_markers_from_video_no_markers(self, mock_delete_markers: Mock, mock_get_markers: Mock) -> None: + """Test clearing all markers from a video that has no markers""" + # Mock no markers + mock_get_markers.return_value = [] + + # Call the function + haven_media_handler.clear_all_markers_from_video(123) + + # Verify markers were retrieved + mock_get_markers.assert_called_once_with(123) + + # Verify no deletion was called + mock_delete_markers.assert_not_called() + + # Verify no log message + self.mock_log.info.assert_not_called() + + def test_add_tags_to_video_with_tagged(self) -> None: + """Test adding tags to video with tagged flag enabled""" + # Call the function + haven_media_handler.add_tags_to_video(123, [10, 20, 30], add_tagged=True) + + # Verify tags were added (including tagged tag) + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [10, 20, 30, 4], "mode": "ADD"} + }) + + def test_add_tags_to_video_without_tagged(self) -> None: + """Test adding tags to video with tagged flag disabled""" + # Call the function + haven_media_handler.add_tags_to_video(123, [10, 20, 30], add_tagged=False) + + # Verify tags were added (without tagged tag) + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [10, 20, 30], "mode": "ADD"} + }) + + @patch('haven_media_handler.get_vlm_tags') + def test_remove_vlm_tags_from_video(self, mock_get_vlm_tags: Mock) -> None: + """Test removing VLM tags from video""" + # Mock VLM tags + mock_get_vlm_tags.return_value = [100, 200, 300] + + # Call the function + haven_media_handler.remove_vlm_tags_from_video(123, remove_tagme=True, remove_errored=True) + + # Verify VLM tags were retrieved + mock_get_vlm_tags.assert_called_once() + + # Verify tags were removed (including tagme and errored tags) + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [100, 200, 300, 2, 1], "mode": "REMOVE"} + }) + + def test_get_tagme_scenes(self) -> None: + """Test getting scenes tagged with VLM_TagMe""" + # Mock scenes + mock_scenes = [{"id": 1}, {"id": 2}] + self.mock_stash.find_scenes.return_value = mock_scenes + + # Call the function + result = haven_media_handler.get_tagme_scenes() + + # Verify scenes were found + self.mock_stash.find_scenes.assert_called_once_with( + f={"tags": {"value": 2, "modifier": "INCLUDES"}}, + fragment="id tags {id} files {path duration fingerprint(type: \"phash\")}" + ) + + # Verify result + self.assertEqual(result, mock_scenes) + + def test_add_error_scene(self) -> None: + """Test adding error tag to a scene""" + # Call the function + haven_media_handler.add_error_scene(123) + + # Verify error tag was added + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [1], "mode": "ADD"} + }) + + def test_remove_tagme_tag_from_scene(self) -> None: + """Test removing VLM_TagMe tag from a scene""" + # Call the function + haven_media_handler.remove_tagme_tag_from_scene(123) + + # Verify tagme tag was removed + self.mock_stash.update_scenes.assert_called_once_with({ + "ids": [123], + "tag_ids": {"ids": [2], "mode": "REMOVE"} + }) + + def test_is_scene_tagged_true(self) -> None: + """Test checking if a scene is tagged (true case)""" + # Mock tags including tagged tag + tags = [ + {"id": 10, "name": "Tag1"}, + {"id": 4, "name": "VLM_Tagged"}, # This is the tagged tag + {"id": 20, "name": "Tag2"} + ] + + # Call the function + result = haven_media_handler.is_scene_tagged(tags) + + # Verify result + self.assertTrue(result) + + def test_is_scene_tagged_false(self) -> None: + """Test checking if a scene is tagged (false case)""" + # Mock tags without tagged tag + tags = [ + {"id": 10, "name": "Tag1"}, + {"id": 20, "name": "Tag2"} + ] + + # Call the function + result = haven_media_handler.is_scene_tagged(tags) + + # Verify result + self.assertFalse(result) + + def test_is_vr_scene_true(self) -> None: + """Test checking if a scene is VR (true case)""" + # Mock tags including VR tag + tags = [ + {"id": 10, "name": "Tag1"}, + {"id": 5, "name": "VR"}, # This is the VR tag + {"id": 20, "name": "Tag2"} + ] + + # Call the function + result = haven_media_handler.is_vr_scene(tags) + + # Verify result + self.assertTrue(result) + + def test_is_vr_scene_false(self) -> None: + """Test checking if a scene is VR (false case)""" + # Mock tags without VR tag + tags = [ + {"id": 10, "name": "Tag1"}, + {"id": 20, "name": "Tag2"} + ] + + # Call the function + result = haven_media_handler.is_vr_scene(tags) + + # Verify result + self.assertFalse(result) + + def test_get_tag_id_existing(self) -> None: + """Test getting tag ID for existing tag""" + # Mock existing tag + self.mock_stash.find_tag.return_value = {"id": 123, "name": "TestTag"} + + # Call the function + result = haven_media_handler.get_tag_id("TestTag", create=False) + + # Verify tag was found + self.mock_stash.find_tag.assert_called_once_with("TestTag") + + # Verify result + self.assertEqual(result, 123) + + def test_get_tag_id_not_existing_no_create(self) -> None: + """Test getting tag ID for non-existing tag without create""" + # Mock non-existing tag + self.mock_stash.find_tag.return_value = None + + # Call the function + result = haven_media_handler.get_tag_id("TestTag", create=False) + + # Verify tag was searched + self.mock_stash.find_tag.assert_called_once_with("TestTag") + + # Verify result is None + self.assertIsNone(result) + + def test_get_tag_id_create_new(self) -> None: + """Test getting tag ID for non-existing tag with create""" + # Mock non-existing tag + self.mock_stash.find_tag.return_value = None + + # Mock created tag + self.mock_stash.create_tag.return_value = {"id": 456, "name": "TestTag"} + + # Call the function + result = haven_media_handler.get_tag_id("TestTag", create=True) + + # Verify tag was searched + self.mock_stash.find_tag.assert_called_once_with("TestTag") + + # Verify tag was created + self.mock_stash.create_tag.assert_called_once_with({ + "name": "TestTag", + "ignore_auto_tag": True, + "parent_ids": [3] + }) + + # Verify result + self.assertEqual(result, 456) + + def test_get_tag_ids(self) -> None: + """Test getting multiple tag IDs""" + # Mock tag IDs + with patch('haven_media_handler.get_tag_id') as mock_get_tag_id: + mock_get_tag_id.side_effect = [10, 20, 30] + + # Call the function + result = haven_media_handler.get_tag_ids(["Tag1", "Tag2", "Tag3"], create=True) + + # Verify individual tag IDs were retrieved + self.assertEqual(mock_get_tag_id.call_count, 3) + mock_get_tag_id.assert_any_call("Tag1", True) + mock_get_tag_id.assert_any_call("Tag2", True) + mock_get_tag_id.assert_any_call("Tag3", True) + + # Verify result + self.assertEqual(result, [10, 20, 30]) + + @patch('haven_media_handler.vlm_tag_ids_cache') + def test_get_vlm_tags_from_cache(self, mock_cache: Mock) -> None: + """Test getting VLM tags from cache""" + # Mock cached tags + mock_cache.__len__.return_value = 3 + mock_cache.__iter__.return_value = iter([100, 200, 300]) + + # Call the function + result = haven_media_handler.get_vlm_tags() + + # Verify result from cache + self.assertEqual(result, [100, 200, 300]) + + def test_get_vlm_tags_from_stash(self) -> None: + """Test getting VLM tags from stash when cache is empty""" + # Mock empty cache + haven_media_handler.vlm_tag_ids_cache.clear() + + # Mock stash tags + mock_tags = [ + {"id": 100, "name": "VLM_Tag1"}, + {"id": 200, "name": "VLM_Tag2"} + ] + self.mock_stash.find_tags.return_value = mock_tags + + # Call the function + result = haven_media_handler.get_vlm_tags() + + # Verify tags were found + self.mock_stash.find_tags.assert_called_once_with( + f={"parents": {"value": 3, "modifier": "INCLUDES"}}, + fragment="id" + ) + + # Verify result + self.assertEqual(result, [100, 200]) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_haven_vlm_config.py b/plugins/AHavenVLMConnector/test_haven_vlm_config.py new file mode 100644 index 00000000..464e295f --- /dev/null +++ b/plugins/AHavenVLMConnector/test_haven_vlm_config.py @@ -0,0 +1,286 @@ +""" +Unit tests for haven_vlm_config module +""" + +import unittest +import tempfile +import os +import yaml +from unittest.mock import patch, mock_open +from dataclasses import dataclass + +import haven_vlm_config + + +class TestVLMConnectorConfig(unittest.TestCase): + """Test cases for VLMConnectorConfig dataclass""" + + def test_vlm_connector_config_creation(self): + """Test creating VLMConnectorConfig with all required fields""" + config = haven_vlm_config.VLMConnectorConfig( + vlm_engine_config={"test": "config"}, + video_frame_interval=2.0, + video_threshold=0.3, + video_confidence_return=True, + image_threshold=0.5, + image_batch_size=320, + image_confidence_return=False, + concurrent_task_limit=10, + server_timeout=3700, + vlm_base_tag_name="VLM", + vlm_tagme_tag_name="VLM_TagMe", + vlm_updateme_tag_name="VLM_UpdateMe", + vlm_tagged_tag_name="VLM_Tagged", + vlm_errored_tag_name="VLM_Errored", + vlm_incorrect_tag_name="VLM_Incorrect", + temp_image_dir="./temp_images", + output_data_dir="./output_data", + delete_incorrect_markers=True, + create_markers=True, + path_mutation={} + ) + + self.assertEqual(config.video_frame_interval, 2.0) + self.assertEqual(config.video_threshold, 0.3) + self.assertEqual(config.image_threshold, 0.5) + self.assertEqual(config.concurrent_task_limit, 10) + self.assertEqual(config.vlm_base_tag_name, "VLM") + self.assertEqual(config.temp_image_dir, "./temp_images") + + def test_vlm_connector_config_defaults(self): + """Test VLMConnectorConfig with minimal required fields""" + config = haven_vlm_config.VLMConnectorConfig( + vlm_engine_config={}, + video_frame_interval=1.0, + video_threshold=0.1, + video_confidence_return=False, + image_threshold=0.1, + image_batch_size=100, + image_confidence_return=False, + concurrent_task_limit=5, + server_timeout=1000, + vlm_base_tag_name="TEST", + vlm_tagme_tag_name="TEST_TagMe", + vlm_updateme_tag_name="TEST_UpdateMe", + vlm_tagged_tag_name="TEST_Tagged", + vlm_errored_tag_name="TEST_Errored", + vlm_incorrect_tag_name="TEST_Incorrect", + temp_image_dir="./test_temp", + output_data_dir="./test_output", + delete_incorrect_markers=False, + create_markers=False, + path_mutation={"test": "mutation"} + ) + + self.assertEqual(config.video_frame_interval, 1.0) + self.assertEqual(config.video_threshold, 0.1) + self.assertEqual(config.path_mutation, {"test": "mutation"}) + + +class TestLoadConfigFromYaml(unittest.TestCase): + """Test cases for load_config_from_yaml function""" + + def setUp(self): + """Set up test fixtures""" + self.test_config = { + "vlm_engine_config": { + "active_ai_models": ["test_model"], + "pipelines": {}, + "models": {}, + "category_config": {} + }, + "video_frame_interval": 3.0, + "video_threshold": 0.4, + "video_confidence_return": True, + "image_threshold": 0.6, + "image_batch_size": 500, + "image_confidence_return": True, + "concurrent_task_limit": 15, + "server_timeout": 5000, + "vlm_base_tag_name": "TEST_VLM", + "vlm_tagme_tag_name": "TEST_VLM_TagMe", + "vlm_updateme_tag_name": "TEST_VLM_UpdateMe", + "vlm_tagged_tag_name": "TEST_VLM_Tagged", + "vlm_errored_tag_name": "TEST_VLM_Errored", + "vlm_incorrect_tag_name": "TEST_VLM_Incorrect", + "temp_image_dir": "./test_temp_images", + "output_data_dir": "./test_output_data", + "delete_incorrect_markers": False, + "create_markers": False, + "path_mutation": {"E:": "F:"} + } + + def test_load_config_from_yaml_with_valid_file(self): + """Test loading configuration from a valid YAML file""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as f: + yaml.dump(self.test_config, f) + config_path = f.name + + try: + config = haven_vlm_config.load_config_from_yaml(config_path) + + self.assertIsInstance(config, haven_vlm_config.VLMConnectorConfig) + self.assertEqual(config.video_frame_interval, 3.0) + self.assertEqual(config.video_threshold, 0.4) + self.assertEqual(config.image_threshold, 0.6) + self.assertEqual(config.concurrent_task_limit, 15) + self.assertEqual(config.vlm_base_tag_name, "TEST_VLM") + self.assertEqual(config.path_mutation, {"E:": "F:"}) + finally: + os.unlink(config_path) + + def test_load_config_from_yaml_with_nonexistent_file(self): + """Test loading configuration with nonexistent file path""" + config = haven_vlm_config.load_config_from_yaml("nonexistent_file.yml") + + # Should return default configuration + self.assertIsInstance(config, haven_vlm_config.VLMConnectorConfig) + self.assertEqual(config.video_frame_interval, haven_vlm_config.VIDEO_FRAME_INTERVAL) + self.assertEqual(config.video_threshold, haven_vlm_config.VIDEO_THRESHOLD) + + def test_load_config_from_yaml_with_none_path(self): + """Test loading configuration with None path""" + config = haven_vlm_config.load_config_from_yaml(None) + + # Should return default configuration + self.assertIsInstance(config, haven_vlm_config.VLMConnectorConfig) + self.assertEqual(config.video_frame_interval, haven_vlm_config.VIDEO_FRAME_INTERVAL) + + def test_load_config_from_yaml_with_invalid_yaml(self): + """Test loading configuration with invalid YAML content""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as f: + f.write("invalid: yaml: content: [") + config_path = f.name + + try: + config = haven_vlm_config.load_config_from_yaml(config_path) + + # Should return default configuration on YAML error + self.assertIsInstance(config, haven_vlm_config.VLMConnectorConfig) + self.assertEqual(config.video_frame_interval, haven_vlm_config.VIDEO_FRAME_INTERVAL) + finally: + os.unlink(config_path) + + def test_load_config_from_yaml_with_file_permission_error(self): + """Test loading configuration with file permission error""" + with patch('builtins.open', side_effect=PermissionError("Permission denied")): + config = haven_vlm_config.load_config_from_yaml("test.yml") + + # Should return default configuration on file error + self.assertIsInstance(config, haven_vlm_config.VLMConnectorConfig) + self.assertEqual(config.video_frame_interval, haven_vlm_config.VIDEO_FRAME_INTERVAL) + + +class TestConfigurationConstants(unittest.TestCase): + """Test cases for configuration constants""" + + def test_vlm_engine_config_structure(self): + """Test that VLM_ENGINE_CONFIG has the expected structure""" + config = haven_vlm_config.VLM_ENGINE_CONFIG + + # Check required top-level keys + self.assertIn("active_ai_models", config) + self.assertIn("pipelines", config) + self.assertIn("models", config) + self.assertIn("category_config", config) + + # Check active_ai_models is a list + self.assertIsInstance(config["active_ai_models"], list) + self.assertIn("vlm_multiplexer_model", config["active_ai_models"]) + + # Check pipelines structure + self.assertIn("video_pipeline_dynamic", config["pipelines"]) + pipeline = config["pipelines"]["video_pipeline_dynamic"] + self.assertIn("inputs", pipeline) + self.assertIn("output", pipeline) + self.assertIn("models", pipeline) + + # Check models structure + self.assertIn("vlm_multiplexer_model", config["models"]) + model = config["models"]["vlm_multiplexer_model"] + self.assertIn("type", model) + self.assertIn("multiplexer_endpoints", model) + self.assertIn("tag_list", model) + + def test_processing_settings(self): + """Test that processing settings have valid values""" + self.assertGreater(haven_vlm_config.VIDEO_FRAME_INTERVAL, 0) + self.assertGreaterEqual(haven_vlm_config.VIDEO_THRESHOLD, 0) + self.assertLessEqual(haven_vlm_config.VIDEO_THRESHOLD, 1) + self.assertGreaterEqual(haven_vlm_config.IMAGE_THRESHOLD, 0) + self.assertLessEqual(haven_vlm_config.IMAGE_THRESHOLD, 1) + self.assertGreater(haven_vlm_config.IMAGE_BATCH_SIZE, 0) + self.assertGreater(haven_vlm_config.CONCURRENT_TASK_LIMIT, 0) + self.assertGreater(haven_vlm_config.SERVER_TIMEOUT, 0) + + def test_tag_names(self): + """Test that tag names are valid strings""" + tag_names = [ + haven_vlm_config.VLM_BASE_TAG_NAME, + haven_vlm_config.VLM_TAGME_TAG_NAME, + haven_vlm_config.VLM_UPDATEME_TAG_NAME, + haven_vlm_config.VLM_TAGGED_TAG_NAME, + haven_vlm_config.VLM_ERRORED_TAG_NAME, + haven_vlm_config.VLM_INCORRECT_TAG_NAME + ] + + for tag_name in tag_names: + self.assertIsInstance(tag_name, str) + self.assertGreater(len(tag_name), 0) + + def test_directory_paths(self): + """Test that directory paths are valid strings""" + self.assertIsInstance(haven_vlm_config.TEMP_IMAGE_DIR, str) + self.assertIsInstance(haven_vlm_config.OUTPUT_DATA_DIR, str) + self.assertGreater(len(haven_vlm_config.TEMP_IMAGE_DIR), 0) + self.assertGreater(len(haven_vlm_config.OUTPUT_DATA_DIR), 0) + + def test_boolean_settings(self): + """Test that boolean settings are valid""" + self.assertIsInstance(haven_vlm_config.DELETE_INCORRECT_MARKERS, bool) + self.assertIsInstance(haven_vlm_config.CREATE_MARKERS, bool) + + def test_path_mutation(self): + """Test that path mutation is a dictionary""" + self.assertIsInstance(haven_vlm_config.PATH_MUTATION, dict) + + +class TestGlobalConfigInstance(unittest.TestCase): + """Test cases for the global config instance""" + + def test_global_config_exists(self): + """Test that the global config instance exists and is valid""" + self.assertIsInstance(haven_vlm_config.config, haven_vlm_config.VLMConnectorConfig) + + def test_global_config_has_required_attributes(self): + """Test that the global config has all required attributes""" + config = haven_vlm_config.config + + # Check that all required attributes exist + required_attrs = [ + 'vlm_engine_config', 'video_frame_interval', 'video_threshold', + 'video_confidence_return', 'image_threshold', 'image_batch_size', + 'image_confidence_return', 'concurrent_task_limit', 'server_timeout', + 'vlm_base_tag_name', 'vlm_tagme_tag_name', 'vlm_updateme_tag_name', + 'vlm_tagged_tag_name', 'vlm_errored_tag_name', 'vlm_incorrect_tag_name', + 'temp_image_dir', 'output_data_dir', 'delete_incorrect_markers', + 'create_markers', 'path_mutation' + ] + + for attr in required_attrs: + self.assertTrue(hasattr(config, attr), f"Missing attribute: {attr}") + + def test_global_config_values(self): + """Test that the global config has expected default values""" + config = haven_vlm_config.config + + self.assertEqual(config.video_frame_interval, haven_vlm_config.VIDEO_FRAME_INTERVAL) + self.assertEqual(config.video_threshold, haven_vlm_config.VIDEO_THRESHOLD) + self.assertEqual(config.image_threshold, haven_vlm_config.IMAGE_THRESHOLD) + self.assertEqual(config.concurrent_task_limit, haven_vlm_config.CONCURRENT_TASK_LIMIT) + self.assertEqual(config.vlm_base_tag_name, haven_vlm_config.VLM_BASE_TAG_NAME) + self.assertEqual(config.temp_image_dir, haven_vlm_config.TEMP_IMAGE_DIR) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_haven_vlm_connector.py b/plugins/AHavenVLMConnector/test_haven_vlm_connector.py new file mode 100644 index 00000000..c77f9122 --- /dev/null +++ b/plugins/AHavenVLMConnector/test_haven_vlm_connector.py @@ -0,0 +1,451 @@ +""" +Unit tests for haven_vlm_connector module +""" + +import unittest +import asyncio +import json +import tempfile +import os +from unittest.mock import patch, MagicMock, AsyncMock, mock_open +import sys + +# Mock the stashapi imports +sys.modules['stashapi.log'] = MagicMock() +sys.modules['stashapi.stashapp'] = MagicMock() + +# Mock the vlm_engine imports +sys.modules['vlm_engine'] = MagicMock() +sys.modules['vlm_engine.config_models'] = MagicMock() + +import haven_vlm_connector + + +class TestMainExecution(unittest.TestCase): + """Test cases for main execution functions""" + + def setUp(self): + """Set up test fixtures""" + self.sample_json_input = { + "server_connection": { + "PluginDir": "/tmp/plugin" + }, + "args": { + "mode": "tag_videos" + } + } + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.tag_videos') + @patch('haven_vlm_connector.os.chdir') + def test_run_tag_videos(self, mock_chdir, mock_tag_videos, mock_media_handler): + """Test running tag_videos mode""" + output = {} + + with patch('haven_vlm_connector.read_json_input', return_value=self.sample_json_input): + asyncio.run(haven_vlm_connector.run(self.sample_json_input, output)) + + mock_chdir.assert_called_once_with("/tmp/plugin") + mock_media_handler.initialize.assert_called_once_with(self.sample_json_input["server_connection"]) + mock_tag_videos.assert_called_once() + self.assertEqual(output["output"], "ok") + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.tag_images') + @patch('haven_vlm_connector.os.chdir') + def test_run_tag_images(self, mock_chdir, mock_tag_images, mock_media_handler): + """Test running tag_images mode""" + json_input = self.sample_json_input.copy() + json_input["args"]["mode"] = "tag_images" + output = {} + + asyncio.run(haven_vlm_connector.run(json_input, output)) + + mock_tag_images.assert_called_once() + self.assertEqual(output["output"], "ok") + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.find_marker_settings') + @patch('haven_vlm_connector.os.chdir') + def test_run_find_marker_settings(self, mock_chdir, mock_find_marker_settings, mock_media_handler): + """Test running find_marker_settings mode""" + json_input = self.sample_json_input.copy() + json_input["args"]["mode"] = "find_marker_settings" + output = {} + + asyncio.run(haven_vlm_connector.run(json_input, output)) + + mock_find_marker_settings.assert_called_once() + self.assertEqual(output["output"], "ok") + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.collect_incorrect_markers_and_images') + @patch('haven_vlm_connector.os.chdir') + def test_run_collect_incorrect_markers(self, mock_chdir, mock_collect, mock_media_handler): + """Test running collect_incorrect_markers mode""" + json_input = self.sample_json_input.copy() + json_input["args"]["mode"] = "collect_incorrect_markers" + output = {} + + asyncio.run(haven_vlm_connector.run(json_input, output)) + + mock_collect.assert_called_once() + self.assertEqual(output["output"], "ok") + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.os.chdir') + def test_run_no_mode(self, mock_chdir, mock_media_handler): + """Test running with no mode specified""" + json_input = self.sample_json_input.copy() + del json_input["args"]["mode"] + output = {} + + asyncio.run(haven_vlm_connector.run(json_input, output)) + + self.assertEqual(output["output"], "ok") + + @patch('haven_vlm_connector.media_handler') + def test_run_media_handler_initialization_error(self, mock_media_handler): + """Test handling media handler initialization error""" + mock_media_handler.initialize.side_effect = Exception("Initialization failed") + output = {} + + with self.assertRaises(Exception): + asyncio.run(haven_vlm_connector.run(self.sample_json_input, output)) + + def test_read_json_input(self): + """Test reading JSON input from stdin""" + test_input = '{"test": "data"}' + + with patch('sys.stdin.read', return_value=test_input): + result = haven_vlm_connector.read_json_input() + + self.assertEqual(result, {"test": "data"}) + + +class TestHighLevelProcessingFunctions(unittest.TestCase): + """Test cases for high-level processing functions""" + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.__tag_images') + @patch('haven_vlm_connector.asyncio.gather') + def test_tag_images_with_images(self, mock_gather, mock_tag_images, mock_media_handler): + """Test tagging images when images are available""" + mock_images = [{"id": 1}, {"id": 2}, {"id": 3}] + mock_media_handler.get_tagme_images.return_value = mock_images + + asyncio.run(haven_vlm_connector.tag_images()) + + mock_media_handler.get_tagme_images.assert_called_once() + mock_gather.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + def test_tag_images_no_images(self, mock_media_handler): + """Test tagging images when no images are available""" + mock_media_handler.get_tagme_images.return_value = [] + + asyncio.run(haven_vlm_connector.tag_images()) + + mock_media_handler.get_tagme_images.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.__tag_video') + @patch('haven_vlm_connector.asyncio.gather') + def test_tag_videos_with_scenes(self, mock_gather, mock_tag_video, mock_media_handler): + """Test tagging videos when scenes are available""" + mock_scenes = [{"id": 1}, {"id": 2}] + mock_media_handler.get_tagme_scenes.return_value = mock_scenes + + asyncio.run(haven_vlm_connector.tag_videos()) + + mock_media_handler.get_tagme_scenes.assert_called_once() + mock_gather.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + def test_tag_videos_no_scenes(self, mock_media_handler): + """Test tagging videos when no scenes are available""" + mock_media_handler.get_tagme_scenes.return_value = [] + + asyncio.run(haven_vlm_connector.tag_videos()) + + mock_media_handler.get_tagme_scenes.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.__find_marker_settings') + def test_find_marker_settings_single_scene(self, mock_find_settings, mock_media_handler): + """Test finding marker settings with single scene""" + mock_scenes = [{"id": 1}] + mock_media_handler.get_tagme_scenes.return_value = mock_scenes + + asyncio.run(haven_vlm_connector.find_marker_settings()) + + mock_media_handler.get_tagme_scenes.assert_called_once() + mock_find_settings.assert_called_once_with(mock_scenes[0]) + + @patch('haven_vlm_connector.media_handler') + def test_find_marker_settings_no_scenes(self, mock_media_handler): + """Test finding marker settings with no scenes""" + mock_media_handler.get_tagme_scenes.return_value = [] + + asyncio.run(haven_vlm_connector.find_marker_settings()) + + mock_media_handler.get_tagme_scenes.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + def test_find_marker_settings_multiple_scenes(self, mock_media_handler): + """Test finding marker settings with multiple scenes""" + mock_scenes = [{"id": 1}, {"id": 2}] + mock_media_handler.get_tagme_scenes.return_value = mock_scenes + + asyncio.run(haven_vlm_connector.find_marker_settings()) + + mock_media_handler.get_tagme_scenes.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.os.makedirs') + @patch('haven_vlm_connector.shutil.copy') + def test_collect_incorrect_markers_and_images_with_data(self, mock_copy, mock_makedirs, mock_media_handler): + """Test collecting incorrect markers and images with data""" + mock_images = [{"id": 1, "files": [{"path": "/path/to/image.jpg"}]}] + mock_markers = [{"id": 1, "scene": {"files": [{"path": "/path/to/video.mp4"}]}, "primary_tag": {"name": "test"}}] + mock_media_handler.get_incorrect_images.return_value = mock_images + mock_media_handler.get_incorrect_markers.return_value = mock_markers + mock_media_handler.get_image_paths_and_ids.return_value = (["/path/to/image.jpg"], [1], []) + + haven_vlm_connector.collect_incorrect_markers_and_images() + + mock_media_handler.get_incorrect_images.assert_called_once() + mock_media_handler.get_incorrect_markers.assert_called_once() + mock_media_handler.remove_incorrect_tag_from_images.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + def test_collect_incorrect_markers_and_images_no_data(self, mock_media_handler): + """Test collecting incorrect markers and images with no data""" + mock_media_handler.get_incorrect_images.return_value = [] + mock_media_handler.get_incorrect_markers.return_value = [] + + haven_vlm_connector.collect_incorrect_markers_and_images() + + mock_media_handler.get_incorrect_images.assert_called_once() + mock_media_handler.get_incorrect_markers.assert_called_once() + + +class TestLowLevelProcessingFunctions(unittest.TestCase): + """Test cases for low-level processing functions""" + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.semaphore') + def test_tag_images_success(self, mock_semaphore, mock_media_handler, mock_vlm_engine): + """Test successful image tagging""" + mock_images = [{"id": 1}, {"id": 2}] + mock_media_handler.get_image_paths_and_ids.return_value = (["/path1.jpg", "/path2.jpg"], [1, 2], []) + mock_vlm_engine.process_images_async.return_value = MagicMock(result=[{"tags": ["tag1"]}, {"tags": ["tag2"]}]) + mock_media_handler.get_tag_ids.return_value = [100, 200] + + # Mock semaphore context manager + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_images(mock_images)) + + mock_media_handler.get_image_paths_and_ids.assert_called_once_with(mock_images) + mock_vlm_engine.process_images_async.assert_called_once() + mock_media_handler.remove_tagme_tags_from_images.assert_called_once() + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.semaphore') + def test_tag_images_error(self, mock_semaphore, mock_media_handler, mock_vlm_engine): + """Test image tagging with error""" + mock_images = [{"id": 1}] + mock_vlm_engine.process_images_async.side_effect = Exception("Processing error") + + # Mock semaphore context manager + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_images(mock_images)) + + mock_media_handler.add_error_images.assert_called_once() + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.semaphore') + def test_tag_video_success(self, mock_semaphore, mock_media_handler, mock_vlm_engine): + """Test successful video tagging""" + mock_scene = { + "id": 1, + "files": [{"path": "/path/to/video.mp4"}], + "tags": [] + } + mock_vlm_engine.process_video_async.return_value = MagicMock( + video_tags={"category": ["tag1", "tag2"]}, + tag_timespans={} + ) + mock_media_handler.is_vr_scene.return_value = False + mock_media_handler.get_tag_ids.return_value = [100, 200] + + # Mock semaphore context manager + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_video(mock_scene)) + + mock_vlm_engine.process_video_async.assert_called_once() + + # Verify tags and markers were cleared before adding new ones + mock_media_handler.clear_all_tags_from_video.assert_called_once_with(1) + mock_media_handler.clear_all_markers_from_video.assert_called_once_with(1) + + mock_media_handler.add_tags_to_video.assert_called_once() + mock_media_handler.remove_tagme_tag_from_scene.assert_called_once() + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + @patch('haven_vlm_connector.semaphore') + def test_tag_video_error(self, mock_semaphore, mock_media_handler, mock_vlm_engine): + """Test video tagging with error""" + mock_scene = { + "id": 1, + "files": [{"path": "/path/to/video.mp4"}], + "tags": [] + } + mock_vlm_engine.process_video_async.side_effect = Exception("Processing error") + + # Mock semaphore context manager + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_video(mock_scene)) + + mock_media_handler.add_error_scene.assert_called_once() + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + def test_find_marker_settings_success(self, mock_media_handler, mock_vlm_engine): + """Test successful marker settings finding""" + mock_scene = { + "id": 1, + "files": [{"path": "/path/to/video.mp4"}] + } + mock_markers = [ + { + "primary_tag": {"name": "tag1"}, + "seconds": 10.0, + "end_seconds": 15.0 + } + ] + mock_media_handler.get_scene_markers.return_value = mock_markers + mock_vlm_engine.find_optimal_marker_settings_async.return_value = {"optimal": "settings"} + + asyncio.run(haven_vlm_connector.__find_marker_settings(mock_scene)) + + mock_media_handler.get_scene_markers.assert_called_once_with(1) + mock_vlm_engine.find_optimal_marker_settings_async.assert_called_once() + + @patch('haven_vlm_connector.media_handler') + def test_find_marker_settings_error(self, mock_media_handler): + """Test marker settings finding with error""" + mock_scene = { + "id": 1, + "files": [{"path": "/path/to/video.mp4"}] + } + mock_media_handler.get_scene_markers.side_effect = Exception("Marker error") + + asyncio.run(haven_vlm_connector.__find_marker_settings(mock_scene)) + + mock_media_handler.get_scene_markers.assert_called_once() + + +class TestUtilityFunctions(unittest.TestCase): + """Test cases for utility functions""" + + def test_increment_progress(self): + """Test progress increment""" + haven_vlm_connector.progress = 0.0 + haven_vlm_connector.increment = 0.1 + + haven_vlm_connector.increment_progress() + + self.assertEqual(haven_vlm_connector.progress, 0.1) + + @patch('haven_vlm_connector.vlm_engine') + async def test_cleanup(self, mock_vlm_engine): + """Test cleanup function""" + mock_vlm_engine.vlm_engine = MagicMock() + + await haven_vlm_connector.cleanup() + + mock_vlm_engine.vlm_engine.shutdown.assert_called_once() + + +class TestMainFunction(unittest.TestCase): + """Test cases for main function""" + + @patch('haven_vlm_connector.run') + @patch('haven_vlm_connector.read_json_input') + @patch('haven_vlm_connector.json.dumps') + @patch('builtins.print') + def test_main_success(self, mock_print, mock_json_dumps, mock_read_input, mock_run): + """Test successful main execution""" + mock_read_input.return_value = {"test": "data"} + mock_json_dumps.return_value = '{"output": "ok"}' + + asyncio.run(haven_vlm_connector.main()) + + mock_read_input.assert_called_once() + mock_run.assert_called_once() + mock_json_dumps.assert_called_once() + mock_print.assert_called() + + +class TestErrorHandling(unittest.TestCase): + """Test cases for error handling""" + + @patch('haven_vlm_connector.media_handler') + def test_tag_images_empty_paths(self, mock_media_handler): + """Test image tagging with empty paths""" + mock_images = [{"id": 1}] + mock_media_handler.get_image_paths_and_ids.return_value = ([], [1], []) + + # Mock semaphore context manager + with patch('haven_vlm_connector.semaphore') as mock_semaphore: + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_images(mock_images)) + + mock_media_handler.get_image_paths_and_ids.assert_called_once() + + @patch('haven_vlm_connector.vlm_engine') + @patch('haven_vlm_connector.media_handler') + def test_tag_video_no_detected_tags(self, mock_media_handler, mock_vlm_engine): + """Test video tagging with no detected tags""" + mock_scene = { + "id": 1, + "files": [{"path": "/path/to/video.mp4"}], + "tags": [] + } + mock_vlm_engine.process_video_async.return_value = MagicMock( + video_tags={}, + tag_timespans={} + ) + mock_media_handler.is_vr_scene.return_value = False + + # Mock semaphore context manager + with patch('haven_vlm_connector.semaphore') as mock_semaphore: + mock_semaphore.__aenter__ = AsyncMock() + mock_semaphore.__aexit__ = AsyncMock() + + asyncio.run(haven_vlm_connector.__tag_video(mock_scene)) + + # Verify clearing functions are NOT called when no tags are detected + mock_media_handler.clear_all_tags_from_video.assert_not_called() + mock_media_handler.clear_all_markers_from_video.assert_not_called() + + mock_media_handler.remove_tagme_tag_from_scene.assert_called_once() + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_haven_vlm_engine.py b/plugins/AHavenVLMConnector/test_haven_vlm_engine.py new file mode 100644 index 00000000..65adcc55 --- /dev/null +++ b/plugins/AHavenVLMConnector/test_haven_vlm_engine.py @@ -0,0 +1,544 @@ +""" +Unit tests for haven_vlm_engine module +""" + +import unittest +import asyncio +import json +import tempfile +import os +from unittest.mock import patch, MagicMock, AsyncMock, mock_open +import sys + +# Mock the vlm_engine imports +sys.modules['vlm_engine'] = MagicMock() +sys.modules['vlm_engine.config_models'] = MagicMock() + +import haven_vlm_engine + + +class TestTimeFrame(unittest.TestCase): + """Test cases for TimeFrame dataclass""" + + def test_timeframe_creation(self): + """Test creating TimeFrame with all parameters""" + timeframe = haven_vlm_engine.TimeFrame( + start=10.0, + end=15.0, + total_confidence=0.85 + ) + + self.assertEqual(timeframe.start, 10.0) + self.assertEqual(timeframe.end, 15.0) + self.assertEqual(timeframe.total_confidence, 0.85) + + def test_timeframe_creation_without_confidence(self): + """Test creating TimeFrame without confidence""" + timeframe = haven_vlm_engine.TimeFrame( + start=10.0, + end=15.0 + ) + + self.assertEqual(timeframe.start, 10.0) + self.assertEqual(timeframe.end, 15.0) + self.assertIsNone(timeframe.total_confidence) + + def test_timeframe_to_json(self): + """Test TimeFrame to_json method""" + timeframe = haven_vlm_engine.TimeFrame( + start=10.0, + end=15.0, + total_confidence=0.85 + ) + + json_str = timeframe.to_json() + json_data = json.loads(json_str) + + self.assertEqual(json_data["start"], 10.0) + self.assertEqual(json_data["end"], 15.0) + self.assertEqual(json_data["total_confidence"], 0.85) + + def test_timeframe_to_json_without_confidence(self): + """Test TimeFrame to_json method without confidence""" + timeframe = haven_vlm_engine.TimeFrame( + start=10.0, + end=15.0 + ) + + json_str = timeframe.to_json() + json_data = json.loads(json_str) + + self.assertEqual(json_data["start"], 10.0) + self.assertEqual(json_data["end"], 15.0) + self.assertIsNone(json_data["total_confidence"]) + + def test_timeframe_str(self): + """Test TimeFrame string representation""" + timeframe = haven_vlm_engine.TimeFrame( + start=10.0, + end=15.0, + total_confidence=0.85 + ) + + str_repr = str(timeframe) + self.assertIn("10.0", str_repr) + self.assertIn("15.0", str_repr) + self.assertIn("0.85", str_repr) + + +class TestVideoTagInfo(unittest.TestCase): + """Test cases for VideoTagInfo dataclass""" + + def test_videotaginfo_creation(self): + """Test creating VideoTagInfo with all parameters""" + video_tags = {"category1": {"tag1", "tag2"}} + tag_totals = {"tag1": {"total": 0.8}} + tag_timespans = {"category1": {"tag1": [haven_vlm_engine.TimeFrame(10.0, 15.0)]}} + + video_info = haven_vlm_engine.VideoTagInfo( + video_duration=120.0, + video_tags=video_tags, + tag_totals=tag_totals, + tag_timespans=tag_timespans + ) + + self.assertEqual(video_info.video_duration, 120.0) + self.assertEqual(video_info.video_tags, video_tags) + self.assertEqual(video_info.tag_totals, tag_totals) + self.assertEqual(video_info.tag_timespans, tag_timespans) + + def test_videotaginfo_from_json(self): + """Test creating VideoTagInfo from JSON data""" + json_data = { + "video_duration": 120.0, + "video_tags": {"category1": ["tag1", "tag2"]}, + "tag_totals": {"tag1": {"total": 0.8}}, + "tag_timespans": { + "category1": { + "tag1": [ + {"start": 10.0, "end": 15.0, "total_confidence": 0.85} + ] + } + } + } + + video_info = haven_vlm_engine.VideoTagInfo.from_json(json_data) + + self.assertEqual(video_info.video_duration, 120.0) + self.assertEqual(video_info.video_tags, {"category1": ["tag1", "tag2"]}) + self.assertEqual(video_info.tag_totals, {"tag1": {"total": 0.8}}) + + # Check that tag_timespans contains TimeFrame objects + self.assertIn("category1", video_info.tag_timespans) + self.assertIn("tag1", video_info.tag_timespans["category1"]) + self.assertIsInstance(video_info.tag_timespans["category1"]["tag1"][0], haven_vlm_engine.TimeFrame) + + def test_videotaginfo_from_json_without_confidence(self): + """Test creating VideoTagInfo from JSON data without confidence""" + json_data = { + "video_duration": 120.0, + "video_tags": {"category1": ["tag1"]}, + "tag_totals": {"tag1": {"total": 0.8}}, + "tag_timespans": { + "category1": { + "tag1": [ + {"start": 10.0, "end": 15.0} + ] + } + } + } + + video_info = haven_vlm_engine.VideoTagInfo.from_json(json_data) + + timeframe = video_info.tag_timespans["category1"]["tag1"][0] + self.assertEqual(timeframe.start, 10.0) + self.assertEqual(timeframe.end, 15.0) + self.assertIsNone(timeframe.total_confidence) + + def test_videotaginfo_from_json_empty_timespans(self): + """Test creating VideoTagInfo from JSON data with empty timespans""" + json_data = { + "video_duration": 120.0, + "video_tags": {"category1": ["tag1"]}, + "tag_totals": {"tag1": {"total": 0.8}}, + "tag_timespans": {} + } + + video_info = haven_vlm_engine.VideoTagInfo.from_json(json_data) + + self.assertEqual(video_info.video_duration, 120.0) + self.assertEqual(video_info.tag_timespans, {}) + + def test_videotaginfo_str(self): + """Test VideoTagInfo string representation""" + video_info = haven_vlm_engine.VideoTagInfo( + video_duration=120.0, + video_tags={"category1": {"tag1"}}, + tag_totals={"tag1": {"total": 0.8}}, + tag_timespans={"category1": {"tag1": []}} + ) + + str_repr = str(video_info) + self.assertIn("120.0", str_repr) + self.assertIn("1", str_repr) # number of tags + self.assertIn("1", str_repr) # number of timespans + + +class TestImageResult(unittest.TestCase): + """Test cases for ImageResult dataclass""" + + def test_imageresult_creation(self): + """Test creating ImageResult with valid data""" + result_data = [{"tags": ["tag1"], "confidence": 0.8}] + image_result = haven_vlm_engine.ImageResult(result=result_data) + + self.assertEqual(image_result.result, result_data) + + def test_imageresult_creation_empty_list(self): + """Test creating ImageResult with empty list""" + with self.assertRaises(ValueError): + haven_vlm_engine.ImageResult(result=[]) + + def test_imageresult_creation_none_result(self): + """Test creating ImageResult with None result""" + with self.assertRaises(ValueError): + haven_vlm_engine.ImageResult(result=None) + + +class TestHavenVLMEngine(unittest.TestCase): + """Test cases for HavenVLMEngine class""" + + def setUp(self): + """Set up test fixtures""" + self.engine = haven_vlm_engine.HavenVLMEngine() + + def test_engine_initialization(self): + """Test engine initialization""" + self.assertIsNone(self.engine.engine) + self.assertIsNone(self.engine.engine_config) + self.assertFalse(self.engine._initialized) + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_initialize_success(self, mock_vlm_engine_class, mock_config): + """Test successful engine initialization""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.vlm_engine_config = {"test": "config"} + + await self.engine.initialize() + + self.assertTrue(self.engine._initialized) + mock_vlm_engine_class.assert_called_once() + mock_engine_instance.initialize.assert_called_once() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_initialize_already_initialized(self, mock_vlm_engine_class, mock_config): + """Test initialization when already initialized""" + self.engine._initialized = True + + await self.engine.initialize() + + # Should not call VLMEngine constructor again + mock_vlm_engine_class.assert_not_called() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_initialize_error(self, mock_vlm_engine_class, mock_config): + """Test initialization with error""" + mock_vlm_engine_class.side_effect = Exception("Initialization failed") + mock_config.config.vlm_engine_config = {"test": "config"} + + with self.assertRaises(Exception): + await self.engine.initialize() + + self.assertFalse(self.engine._initialized) + + @patch('haven_vlm_engine.config') + def test_create_engine_config(self, mock_config): + """Test creating engine configuration""" + mock_config.config.vlm_engine_config = { + "active_ai_models": ["model1"], + "pipelines": { + "pipeline1": { + "inputs": ["input1"], + "output": "output1", + "short_name": "short1", + "version": 1.0, + "models": [ + { + "name": "model1", + "inputs": ["input1"], + "outputs": "output1" + } + ] + } + }, + "models": { + "model1": { + "type": "vlm_model", + "model_file_name": "model1.py", + "model_category": "test", + "model_id": "test_model", + "model_identifier": 123, + "model_version": "1.0", + "use_multiplexer": True, + "max_concurrent_requests": 10, + "connection_pool_size": 20, + "multiplexer_endpoints": [], + "tag_list": ["tag1"] + } + }, + "category_config": {"test": {}} + } + + config = self.engine._create_engine_config() + + self.assertIsNotNone(config) + # Note: We can't easily test the exact structure without the actual VLM Engine classes + # but we can verify the method doesn't raise exceptions + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_process_video_success(self, mock_vlm_engine_class, mock_config): + """Test successful video processing""" + # Setup mocks + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.video_frame_interval = 2.0 + mock_config.config.video_threshold = 0.3 + mock_config.config.video_confidence_return = True + + # Mock the engine's process_video method + mock_engine_instance.process_video.return_value = { + "video_duration": 120.0, + "video_tags": {"category1": ["tag1"]}, + "tag_totals": {"tag1": {"total": 0.8}}, + "tag_timespans": {} + } + + # Initialize engine + await self.engine.initialize() + + # Process video + result = await self.engine.process_video("/path/to/video.mp4") + + self.assertIsInstance(result, haven_vlm_engine.VideoTagInfo) + mock_engine_instance.process_video.assert_called_once() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_process_video_not_initialized(self, mock_vlm_engine_class, mock_config): + """Test video processing when not initialized""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.video_frame_interval = 2.0 + mock_config.config.video_threshold = 0.3 + mock_config.config.video_confidence_return = True + + mock_engine_instance.process_video.return_value = { + "video_duration": 120.0, + "video_tags": {"category1": ["tag1"]}, + "tag_totals": {"tag1": {"total": 0.8}}, + "tag_timespans": {} + } + + # Process video without explicit initialization + result = await self.engine.process_video("/path/to/video.mp4") + + self.assertIsInstance(result, haven_vlm_engine.VideoTagInfo) + mock_engine_instance.initialize.assert_called_once() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_process_video_error(self, mock_vlm_engine_class, mock_config): + """Test video processing with error""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.video_frame_interval = 2.0 + mock_config.config.video_threshold = 0.3 + mock_config.config.video_confidence_return = True + + mock_engine_instance.process_video.side_effect = Exception("Processing failed") + + await self.engine.initialize() + + with self.assertRaises(Exception): + await self.engine.process_video("/path/to/video.mp4") + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_process_images_success(self, mock_vlm_engine_class, mock_config): + """Test successful image processing""" + # Setup mocks + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.image_threshold = 0.5 + mock_config.config.image_confidence_return = False + + # Mock the engine's process_images method + mock_engine_instance.process_images.return_value = [ + {"tags": ["tag1"], "confidence": 0.8} + ] + + # Initialize engine + await self.engine.initialize() + + # Process images + result = await self.engine.process_images(["/path/to/image1.jpg"]) + + self.assertIsInstance(result, haven_vlm_engine.ImageResult) + mock_engine_instance.process_images.assert_called_once() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_process_images_error(self, mock_vlm_engine_class, mock_config): + """Test image processing with error""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_config.config.image_threshold = 0.5 + mock_config.config.image_confidence_return = False + + mock_engine_instance.process_images.side_effect = Exception("Processing failed") + + await self.engine.initialize() + + with self.assertRaises(Exception): + await self.engine.process_images(["/path/to/image1.jpg"]) + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_find_optimal_marker_settings_success(self, mock_vlm_engine_class, mock_config): + """Test successful marker settings optimization""" + # Setup mocks + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_engine_instance.optimize_timeframe_settings.return_value = {"optimal": "settings"} + + # Initialize engine + await self.engine.initialize() + + # Test data + existing_json = {"existing": "data"} + desired_timespan_data = { + "tag1": haven_vlm_engine.TimeFrame(10.0, 15.0, 0.8) + } + + # Find optimal settings + result = await self.engine.find_optimal_marker_settings(existing_json, desired_timespan_data) + + self.assertEqual(result, {"optimal": "settings"}) + mock_engine_instance.optimize_timeframe_settings.assert_called_once() + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_find_optimal_marker_settings_error(self, mock_vlm_engine_class, mock_config): + """Test marker settings optimization with error""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_engine_instance.optimize_timeframe_settings.side_effect = Exception("Optimization failed") + + await self.engine.initialize() + + existing_json = {"existing": "data"} + desired_timespan_data = { + "tag1": haven_vlm_engine.TimeFrame(10.0, 15.0, 0.8) + } + + with self.assertRaises(Exception): + await self.engine.find_optimal_marker_settings(existing_json, desired_timespan_data) + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_shutdown_success(self, mock_vlm_engine_class, mock_config): + """Test successful engine shutdown""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + + await self.engine.initialize() + await self.engine.shutdown() + + mock_engine_instance.shutdown.assert_called_once() + self.assertFalse(self.engine._initialized) + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_shutdown_not_initialized(self, mock_vlm_engine_class, mock_config): + """Test shutdown when not initialized""" + await self.engine.shutdown() + + # Should not raise any exceptions + self.assertFalse(self.engine._initialized) + + @patch('haven_vlm_engine.config') + @patch('haven_vlm_engine.VLMEngine') + async def test_shutdown_error(self, mock_vlm_engine_class, mock_config): + """Test shutdown with error""" + mock_engine_instance = MagicMock() + mock_vlm_engine_class.return_value = mock_engine_instance + mock_engine_instance.shutdown.side_effect = Exception("Shutdown failed") + + await self.engine.initialize() + await self.engine.shutdown() + + # Should handle the error gracefully + self.assertFalse(self.engine._initialized) + + +class TestConvenienceFunctions(unittest.TestCase): + """Test cases for convenience functions""" + + @patch('haven_vlm_engine.vlm_engine') + async def test_process_video_async(self, mock_vlm_engine): + """Test process_video_async convenience function""" + mock_vlm_engine.process_video.return_value = MagicMock() + + result = await haven_vlm_engine.process_video_async("/path/to/video.mp4") + + mock_vlm_engine.process_video.assert_called_once() + self.assertEqual(result, mock_vlm_engine.process_video.return_value) + + @patch('haven_vlm_engine.vlm_engine') + async def test_process_images_async(self, mock_vlm_engine): + """Test process_images_async convenience function""" + mock_vlm_engine.process_images.return_value = MagicMock() + + result = await haven_vlm_engine.process_images_async(["/path/to/image.jpg"]) + + mock_vlm_engine.process_images.assert_called_once() + self.assertEqual(result, mock_vlm_engine.process_images.return_value) + + @patch('haven_vlm_engine.vlm_engine') + async def test_find_optimal_marker_settings_async(self, mock_vlm_engine): + """Test find_optimal_marker_settings_async convenience function""" + mock_vlm_engine.find_optimal_marker_settings.return_value = {"optimal": "settings"} + + existing_json = {"existing": "data"} + desired_timespan_data = { + "tag1": haven_vlm_engine.TimeFrame(10.0, 15.0, 0.8) + } + + result = await haven_vlm_engine.find_optimal_marker_settings_async(existing_json, desired_timespan_data) + + mock_vlm_engine.find_optimal_marker_settings.assert_called_once() + self.assertEqual(result, {"optimal": "settings"}) + + +class TestGlobalVLMEngineInstance(unittest.TestCase): + """Test cases for global VLM engine instance""" + + def test_global_vlm_engine_exists(self): + """Test that global VLM engine instance exists""" + self.assertIsInstance(haven_vlm_engine.vlm_engine, haven_vlm_engine.HavenVLMEngine) + + def test_global_vlm_engine_is_singleton(self): + """Test that global VLM engine is a singleton""" + engine1 = haven_vlm_engine.vlm_engine + engine2 = haven_vlm_engine.vlm_engine + + self.assertIs(engine1, engine2) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/plugins/AHavenVLMConnector/test_haven_vlm_utility.py b/plugins/AHavenVLMConnector/test_haven_vlm_utility.py new file mode 100644 index 00000000..be3d6263 --- /dev/null +++ b/plugins/AHavenVLMConnector/test_haven_vlm_utility.py @@ -0,0 +1,604 @@ +""" +Unit tests for haven_vlm_utility module +""" + +import unittest +import tempfile +import os +import shutil +import time +from unittest.mock import patch, mock_open, MagicMock +import yaml + +import haven_vlm_utility + + +class TestPathMutations(unittest.TestCase): + """Test cases for path mutation functions""" + + def test_apply_path_mutations_with_mutations(self): + """Test applying path mutations with valid mutations""" + mutations = {"E:": "F:", "G:": "D:"} + path = "E:\\videos\\test.mp4" + + result = haven_vlm_utility.apply_path_mutations(path, mutations) + + self.assertEqual(result, "F:\\videos\\test.mp4") + + def test_apply_path_mutations_without_mutations(self): + """Test applying path mutations with empty mutations""" + mutations = {} + path = "E:\\videos\\test.mp4" + + result = haven_vlm_utility.apply_path_mutations(path, mutations) + + self.assertEqual(result, path) + + def test_apply_path_mutations_with_none_mutations(self): + """Test applying path mutations with None mutations""" + mutations = None + path = "E:\\videos\\test.mp4" + + result = haven_vlm_utility.apply_path_mutations(path, mutations) + + self.assertEqual(result, path) + + def test_apply_path_mutations_no_match(self): + """Test applying path mutations when no mutation matches""" + mutations = {"E:": "F:", "G:": "D:"} + path = "C:\\videos\\test.mp4" + + result = haven_vlm_utility.apply_path_mutations(path, mutations) + + self.assertEqual(result, path) + + def test_apply_path_mutations_multiple_matches(self): + """Test applying path mutations with multiple possible matches""" + mutations = {"E:": "F:", "E:\\videos": "F:\\movies"} + path = "E:\\videos\\test.mp4" + + result = haven_vlm_utility.apply_path_mutations(path, mutations) + + # Should use the first match + self.assertEqual(result, "F:\\videos\\test.mp4") + + +class TestDirectoryOperations(unittest.TestCase): + """Test cases for directory operations""" + + def test_ensure_directory_exists_new_directory(self): + """Test creating a new directory""" + with tempfile.TemporaryDirectory() as temp_dir: + new_dir = os.path.join(temp_dir, "test_subdir") + + haven_vlm_utility.ensure_directory_exists(new_dir) + + self.assertTrue(os.path.exists(new_dir)) + self.assertTrue(os.path.isdir(new_dir)) + + def test_ensure_directory_exists_existing_directory(self): + """Test ensuring directory exists when it already exists""" + with tempfile.TemporaryDirectory() as temp_dir: + haven_vlm_utility.ensure_directory_exists(temp_dir) + + self.assertTrue(os.path.exists(temp_dir)) + self.assertTrue(os.path.isdir(temp_dir)) + + def test_ensure_directory_exists_nested_directories(self): + """Test creating nested directories""" + with tempfile.TemporaryDirectory() as temp_dir: + nested_dir = os.path.join(temp_dir, "level1", "level2", "level3") + + haven_vlm_utility.ensure_directory_exists(nested_dir) + + self.assertTrue(os.path.exists(nested_dir)) + self.assertTrue(os.path.isdir(nested_dir)) + + +class TestSafeFileOperations(unittest.TestCase): + """Test cases for safe file operations""" + + def test_safe_file_operation_success(self): + """Test successful file operation""" + def test_func(a, b, c=10): + return a + b + c + + result = haven_vlm_utility.safe_file_operation(test_func, 1, 2, c=5) + + self.assertEqual(result, 8) + + def test_safe_file_operation_os_error(self): + """Test file operation with OSError""" + def test_func(): + raise OSError("File not found") + + result = haven_vlm_utility.safe_file_operation(test_func) + + self.assertIsNone(result) + + def test_safe_file_operation_io_error(self): + """Test file operation with IOError""" + def test_func(): + raise IOError("Permission denied") + + result = haven_vlm_utility.safe_file_operation(test_func) + + self.assertIsNone(result) + + def test_safe_file_operation_unexpected_error(self): + """Test file operation with unexpected error""" + def test_func(): + raise ValueError("Unexpected error") + + result = haven_vlm_utility.safe_file_operation(test_func) + + self.assertIsNone(result) + + +class TestYamlConfigOperations(unittest.TestCase): + """Test cases for YAML configuration operations""" + + def setUp(self): + """Set up test fixtures""" + self.test_config = { + "video_frame_interval": 2.0, + "video_threshold": 0.3, + "image_threshold": 0.5, + "endpoints": [ + {"url": "http://localhost:1234", "weight": 5}, + {"url": "https://cloud.example.com", "weight": 1} + ] + } + + def test_load_yaml_config_success(self): + """Test successfully loading YAML configuration""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as f: + yaml.dump(self.test_config, f) + config_path = f.name + + try: + result = haven_vlm_utility.load_yaml_config(config_path) + + self.assertEqual(result, self.test_config) + finally: + os.unlink(config_path) + + def test_load_yaml_config_file_not_found(self): + """Test loading YAML configuration from nonexistent file""" + result = haven_vlm_utility.load_yaml_config("nonexistent_file.yml") + + self.assertIsNone(result) + + def test_load_yaml_config_invalid_yaml(self): + """Test loading YAML configuration with invalid YAML""" + with tempfile.NamedTemporaryFile(mode='w', suffix='.yml', delete=False) as f: + f.write("invalid: yaml: content: [") + config_path = f.name + + try: + result = haven_vlm_utility.load_yaml_config(config_path) + + self.assertIsNone(result) + finally: + os.unlink(config_path) + + def test_load_yaml_config_permission_error(self): + """Test loading YAML configuration with permission error""" + with patch('builtins.open', side_effect=PermissionError("Permission denied")): + result = haven_vlm_utility.load_yaml_config("test.yml") + + self.assertIsNone(result) + + def test_save_yaml_config_success(self): + """Test successfully saving YAML configuration""" + with tempfile.TemporaryDirectory() as temp_dir: + config_path = os.path.join(temp_dir, "test_config.yml") + + result = haven_vlm_utility.save_yaml_config(self.test_config, config_path) + + self.assertTrue(result) + self.assertTrue(os.path.exists(config_path)) + + # Verify the saved content + with open(config_path, 'r') as f: + loaded_config = yaml.safe_load(f) + + self.assertEqual(loaded_config, self.test_config) + + def test_save_yaml_config_with_nested_directories(self): + """Test saving YAML configuration to nested directory""" + with tempfile.TemporaryDirectory() as temp_dir: + config_path = os.path.join(temp_dir, "nested", "dir", "test_config.yml") + + result = haven_vlm_utility.save_yaml_config(self.test_config, config_path) + + self.assertTrue(result) + self.assertTrue(os.path.exists(config_path)) + + def test_save_yaml_config_permission_error(self): + """Test saving YAML configuration with permission error""" + with patch('builtins.open', side_effect=PermissionError("Permission denied")): + result = haven_vlm_utility.save_yaml_config(self.test_config, "test.yml") + + self.assertFalse(result) + + +class TestFileValidation(unittest.TestCase): + """Test cases for file validation functions""" + + def test_validate_file_path_existing_file(self): + """Test validating an existing file path""" + with tempfile.NamedTemporaryFile(delete=False) as f: + file_path = f.name + + try: + result = haven_vlm_utility.validate_file_path(file_path) + self.assertTrue(result) + finally: + os.unlink(file_path) + + def test_validate_file_path_nonexistent_file(self): + """Test validating a nonexistent file path""" + result = haven_vlm_utility.validate_file_path("nonexistent_file.txt") + self.assertFalse(result) + + def test_validate_file_path_directory(self): + """Test validating a directory path""" + with tempfile.TemporaryDirectory() as temp_dir: + result = haven_vlm_utility.validate_file_path(temp_dir) + self.assertFalse(result) + + def test_validate_file_path_permission_error(self): + """Test validating file path with permission error""" + with patch('os.path.isfile', side_effect=OSError("Permission denied")): + result = haven_vlm_utility.validate_file_path("test.txt") + self.assertFalse(result) + + +class TestFileExtensionFunctions(unittest.TestCase): + """Test cases for file extension functions""" + + def test_get_file_extension_with_extension(self): + """Test getting file extension from file with extension""" + result = haven_vlm_utility.get_file_extension("test.mp4") + self.assertEqual(result, ".mp4") + + def test_get_file_extension_without_extension(self): + """Test getting file extension from file without extension""" + result = haven_vlm_utility.get_file_extension("test") + self.assertEqual(result, "") + + def test_get_file_extension_multiple_dots(self): + """Test getting file extension from file with multiple dots""" + result = haven_vlm_utility.get_file_extension("test.backup.mp4") + self.assertEqual(result, ".mp4") + + def test_get_file_extension_uppercase(self): + """Test getting file extension from file with uppercase extension""" + result = haven_vlm_utility.get_file_extension("test.MP4") + self.assertEqual(result, ".mp4") + + def test_is_video_file_valid_extensions(self): + """Test video file detection with valid extensions""" + video_files = ["test.mp4", "test.avi", "test.mkv", "test.mov", "test.wmv", "test.flv", "test.webm", "test.m4v"] + + for video_file in video_files: + result = haven_vlm_utility.is_video_file(video_file) + self.assertTrue(result, f"Failed for {video_file}") + + def test_is_video_file_invalid_extensions(self): + """Test video file detection with invalid extensions""" + non_video_files = ["test.jpg", "test.txt", "test.pdf", "test.exe"] + + for non_video_file in non_video_files: + result = haven_vlm_utility.is_video_file(non_video_file) + self.assertFalse(result, f"Failed for {non_video_file}") + + def test_is_image_file_valid_extensions(self): + """Test image file detection with valid extensions""" + image_files = ["test.jpg", "test.jpeg", "test.png", "test.gif", "test.bmp", "test.tiff", "test.webp"] + + for image_file in image_files: + result = haven_vlm_utility.is_image_file(image_file) + self.assertTrue(result, f"Failed for {image_file}") + + def test_is_image_file_invalid_extensions(self): + """Test image file detection with invalid extensions""" + non_image_files = ["test.mp4", "test.txt", "test.pdf", "test.exe"] + + for non_image_file in non_image_files: + result = haven_vlm_utility.is_image_file(non_image_file) + self.assertFalse(result, f"Failed for {non_image_file}") + + +class TestFormattingFunctions(unittest.TestCase): + """Test cases for formatting functions""" + + def test_format_duration_seconds(self): + """Test formatting duration in seconds""" + result = haven_vlm_utility.format_duration(45.5) + self.assertEqual(result, "45.5s") + + def test_format_duration_minutes(self): + """Test formatting duration in minutes""" + result = haven_vlm_utility.format_duration(125.3) + self.assertEqual(result, "2m 5.3s") + + def test_format_duration_hours(self): + """Test formatting duration in hours""" + result = haven_vlm_utility.format_duration(7325.7) + self.assertEqual(result, "2h 2m 5.7s") + + def test_format_duration_zero(self): + """Test formatting zero duration""" + result = haven_vlm_utility.format_duration(0) + self.assertEqual(result, "0.0s") + + def test_format_file_size_bytes(self): + """Test formatting file size in bytes""" + result = haven_vlm_utility.format_file_size(512) + self.assertEqual(result, "512.0 B") + + def test_format_file_size_kilobytes(self): + """Test formatting file size in kilobytes""" + result = haven_vlm_utility.format_file_size(1536) + self.assertEqual(result, "1.5 KB") + + def test_format_file_size_megabytes(self): + """Test formatting file size in megabytes""" + result = haven_vlm_utility.format_file_size(1572864) + self.assertEqual(result, "1.5 MB") + + def test_format_file_size_gigabytes(self): + """Test formatting file size in gigabytes""" + result = haven_vlm_utility.format_file_size(1610612736) + self.assertEqual(result, "1.5 GB") + + def test_format_file_size_zero(self): + """Test formatting zero file size""" + result = haven_vlm_utility.format_file_size(0) + self.assertEqual(result, "0.0 B") + + +class TestSanitizationFunctions(unittest.TestCase): + """Test cases for sanitization functions""" + + def test_sanitize_filename_valid(self): + """Test sanitizing a valid filename""" + result = haven_vlm_utility.sanitize_filename("valid_filename.txt") + self.assertEqual(result, "valid_filename.txt") + + def test_sanitize_filename_invalid_chars(self): + """Test sanitizing filename with invalid characters""" + result = haven_vlm_utility.sanitize_filename("file:with/invalid\\chars|?*") + self.assertEqual(result, "file_name__with_invalid_chars___") + + def test_sanitize_filename_leading_trailing_spaces(self): + """Test sanitizing filename with leading/trailing spaces""" + result = haven_vlm_utility.sanitize_filename(" filename.txt ") + self.assertEqual(result, "filename.txt") + + def test_sanitize_filename_leading_trailing_dots(self): + """Test sanitizing filename with leading/trailing dots""" + result = haven_vlm_utility.sanitize_filename("...filename.txt...") + self.assertEqual(result, "filename.txt") + + def test_sanitize_filename_empty(self): + """Test sanitizing empty filename""" + result = haven_vlm_utility.sanitize_filename("") + self.assertEqual(result, "unnamed") + + def test_sanitize_filename_only_spaces(self): + """Test sanitizing filename with only spaces""" + result = haven_vlm_utility.sanitize_filename(" ") + self.assertEqual(result, "unnamed") + + +class TestBackupFunctions(unittest.TestCase): + """Test cases for backup functions""" + + def test_create_backup_file_success(self): + """Test successfully creating a backup file""" + with tempfile.NamedTemporaryFile(delete=False) as f: + original_file = f.name + f.write(b"test content") + + try: + result = haven_vlm_utility.create_backup_file(original_file) + + self.assertIsNotNone(result) + self.assertTrue(os.path.exists(result)) + self.assertTrue(result.endswith(".backup")) + + # Verify backup content + with open(result, 'rb') as f: + content = f.read() + self.assertEqual(content, b"test content") + + # Clean up backup + os.unlink(result) + finally: + os.unlink(original_file) + + def test_create_backup_file_custom_suffix(self): + """Test creating backup file with custom suffix""" + with tempfile.NamedTemporaryFile(delete=False) as f: + original_file = f.name + f.write(b"test content") + + try: + result = haven_vlm_utility.create_backup_file(original_file, ".custom") + + self.assertIsNotNone(result) + self.assertTrue(result.endswith(".custom")) + + # Clean up backup + os.unlink(result) + finally: + os.unlink(original_file) + + def test_create_backup_file_nonexistent(self): + """Test creating backup of nonexistent file""" + result = haven_vlm_utility.create_backup_file("nonexistent_file.txt") + self.assertIsNone(result) + + def test_create_backup_file_permission_error(self): + """Test creating backup file with permission error""" + with patch('shutil.copy2', side_effect=PermissionError("Permission denied")): + with tempfile.NamedTemporaryFile(delete=False) as f: + original_file = f.name + + try: + result = haven_vlm_utility.create_backup_file(original_file) + self.assertIsNone(result) + finally: + os.unlink(original_file) + + +class TestDictionaryOperations(unittest.TestCase): + """Test cases for dictionary operations""" + + def test_merge_dictionaries_simple(self): + """Test simple dictionary merging""" + dict1 = {"a": 1, "b": 2} + dict2 = {"c": 3, "d": 4} + + result = haven_vlm_utility.merge_dictionaries(dict1, dict2) + + expected = {"a": 1, "b": 2, "c": 3, "d": 4} + self.assertEqual(result, expected) + + def test_merge_dictionaries_overwrite(self): + """Test dictionary merging with overwrite""" + dict1 = {"a": 1, "b": 2} + dict2 = {"b": 3, "c": 4} + + result = haven_vlm_utility.merge_dictionaries(dict1, dict2, overwrite=True) + + expected = {"a": 1, "b": 3, "c": 4} + self.assertEqual(result, expected) + + def test_merge_dictionaries_no_overwrite(self): + """Test dictionary merging without overwrite""" + dict1 = {"a": 1, "b": 2} + dict2 = {"b": 3, "c": 4} + + result = haven_vlm_utility.merge_dictionaries(dict1, dict2, overwrite=False) + + expected = {"a": 1, "b": 2, "c": 4} + self.assertEqual(result, expected) + + def test_merge_dictionaries_nested(self): + """Test merging nested dictionaries""" + dict1 = {"a": 1, "b": {"x": 10, "y": 20}} + dict2 = {"c": 3, "b": {"y": 25, "z": 30}} + + result = haven_vlm_utility.merge_dictionaries(dict1, dict2, overwrite=True) + + expected = {"a": 1, "b": {"x": 10, "y": 25, "z": 30}, "c": 3} + self.assertEqual(result, expected) + + def test_merge_dictionaries_empty(self): + """Test merging with empty dictionaries""" + dict1 = {} + dict2 = {"a": 1, "b": 2} + + result = haven_vlm_utility.merge_dictionaries(dict1, dict2) + + self.assertEqual(result, dict2) + + +class TestListOperations(unittest.TestCase): + """Test cases for list operations""" + + def test_chunk_list_even_chunks(self): + """Test chunking list into even chunks""" + lst = [1, 2, 3, 4, 5, 6] + result = haven_vlm_utility.chunk_list(lst, 2) + + expected = [[1, 2], [3, 4], [5, 6]] + self.assertEqual(result, expected) + + def test_chunk_list_uneven_chunks(self): + """Test chunking list into uneven chunks""" + lst = [1, 2, 3, 4, 5] + result = haven_vlm_utility.chunk_list(lst, 2) + + expected = [[1, 2], [3, 4], [5]] + self.assertEqual(result, expected) + + def test_chunk_list_empty_list(self): + """Test chunking empty list""" + lst = [] + result = haven_vlm_utility.chunk_list(lst, 3) + + expected = [] + self.assertEqual(result, expected) + + def test_chunk_list_chunk_size_larger_than_list(self): + """Test chunking when chunk size is larger than list""" + lst = [1, 2, 3] + result = haven_vlm_utility.chunk_list(lst, 5) + + expected = [[1, 2, 3]] + self.assertEqual(result, expected) + + +class TestRetryOperations(unittest.TestCase): + """Test cases for retry operations""" + + def test_retry_operation_success_first_try(self): + """Test retry operation that succeeds on first try""" + def test_func(): + return "success" + + result = haven_vlm_utility.retry_operation(test_func) + + self.assertEqual(result, "success") + + def test_retry_operation_success_after_retries(self): + """Test retry operation that succeeds after some retries""" + call_count = 0 + + def test_func(): + nonlocal call_count + call_count += 1 + if call_count < 3: + raise ValueError("Temporary error") + return "success" + + result = haven_vlm_utility.retry_operation(test_func, max_retries=3, delay=0.1) + + self.assertEqual(result, "success") + self.assertEqual(call_count, 3) + + def test_retry_operation_all_retries_fail(self): + """Test retry operation that fails all retries""" + def test_func(): + raise ValueError("Persistent error") + + result = haven_vlm_utility.retry_operation(test_func, max_retries=2, delay=0.1) + + self.assertIsNone(result) + + def test_retry_operation_with_arguments(self): + """Test retry operation with function arguments""" + def test_func(a, b, c=10): + return a + b + c + + result = haven_vlm_utility.retry_operation(test_func, max_retries=1, delay=0.1, 1, 2, c=5) + + self.assertEqual(result, 8) + + def test_retry_operation_with_keyword_arguments(self): + """Test retry operation with keyword arguments""" + def test_func(**kwargs): + return kwargs.get('value', 0) + + result = haven_vlm_utility.retry_operation(test_func, max_retries=1, delay=0.1, value=42) + + self.assertEqual(result, 42) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From aa9ec71631647c861443893ed1a029a0fe77341e Mon Sep 17 00:00:00 2001 From: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> Date: Tue, 27 Jan 2026 05:47:23 +0200 Subject: [PATCH 12/51] Add community forum link --- plugins/AHavenVLMConnector/ahavenvlmconnector.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml index 1b553406..67704d8a 100644 --- a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml +++ b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml @@ -2,7 +2,7 @@ name: Haven VLM Connector # requires: PythonDepManager description: Tag videos with Vision-Language Models using any OpenAI-compatible VLM endpoint version: 1.0.0 -url: https://github.com/stashapp/CommunityScripts/tree/main/plugins/AHavenVLMConnector +url: https://discourse.stashapp.cc/t/haven-vlm-connector/5464 exec: - python - "{pluginDir}/haven_vlm_connector.py" From 9781f6ba1fda38a637b96be713eda22e3a2bf33a Mon Sep 17 00:00:00 2001 From: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> Date: Tue, 27 Jan 2026 05:51:23 +0200 Subject: [PATCH 13/51] Add community link --- plugins/AHavenVLMConnector/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/AHavenVLMConnector/README.md b/plugins/AHavenVLMConnector/README.md index f5abf8ab..c1b30b4a 100644 --- a/plugins/AHavenVLMConnector/README.md +++ b/plugins/AHavenVLMConnector/README.md @@ -1,5 +1,7 @@ # A Haven VLM Connector +https://discourse.stashapp.cc/t/haven-vlm-connector/5464 + A StashApp plugin for Vision-Language Model (VLM) based content tagging and analysis. This plugin is designed with a **local-first philosophy**, empowering users to run analysis on their own hardware (using CPU or GPU) and their local network. It also supports cloud-based VLM endpoints for additional flexibility. The Haven VLM Engine provides advanced automatic content detection and tagging, delivering superior accuracy compared to traditional image classification methods. ## Features From 641684410ccefeda9bdcedc3786bc2fb2b51456b Mon Sep 17 00:00:00 2001 From: ouenascender <138104265+ouenascender@users.noreply.github.com> Date: Thu, 5 Feb 2026 06:23:29 +1000 Subject: [PATCH 14/51] [stashdb-performer-gallery] Add Fragment for find_image (#662) * Add Fragment for find_image * bump stashdb-performer-gallery version --- .../stashdb-performer-gallery.py | 34 +++++++++++++++++-- .../stashdb-performer-gallery.yml | 2 +- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/plugins/stashdb-performer-gallery/stashdb-performer-gallery.py b/plugins/stashdb-performer-gallery/stashdb-performer-gallery.py index f030fb7f..e103786e 100644 --- a/plugins/stashdb-performer-gallery/stashdb-performer-gallery.py +++ b/plugins/stashdb-performer-gallery/stashdb-performer-gallery.py @@ -15,6 +15,34 @@ stash_boxes = {} scrapers = {} +FRAGMENT_IMAGE = """ + id + title + visual_files { + ... on ImageFile { + id + path + } + ... on VideoFile { + id + path + } + } + paths { + image + thumbnail + } + galleries { + id + } + tags { + id + } + performers { + id + } +""" + def processImages(img): log.debug("image: %s" % (img,)) @@ -458,13 +486,13 @@ def relink_images(performer_id=None): elif "hookContext" in json_input["args"]: id = json_input["args"]["hookContext"]["id"] if json_input["args"]["hookContext"]["type"] == "Image.Create.Post": - img = stash.find_image(image_in=id) + img = stash.find_image(image_in=id, fragment=FRAGMENT_IMAGE) processImages(img) if json_input["args"]["hookContext"]["type"] == "Image.Update.Post": - img = stash.find_image(image_in=id) + img = stash.find_image(image_in=id, fragment=FRAGMENT_IMAGE) if tag_performer_image in [x["id"] for x in img["tags"]]: setPerformerPicture(img) if json_input["args"]["hookContext"]["type"] == "Performer.Update.Post": stash.run_plugin_task( "stashdb-performer-gallery", "Process Performers", args={"performer": id} - ) + ) \ No newline at end of file diff --git a/plugins/stashdb-performer-gallery/stashdb-performer-gallery.yml b/plugins/stashdb-performer-gallery/stashdb-performer-gallery.yml index 6ff4ff26..0a96728e 100644 --- a/plugins/stashdb-performer-gallery/stashdb-performer-gallery.yml +++ b/plugins/stashdb-performer-gallery/stashdb-performer-gallery.yml @@ -1,6 +1,6 @@ name: stashdb performer gallery description: Automatically download performer images from stashdb or other stash-boxes. Add the [Stashbox Performer Gallery] tag to a performer and it will create a gallery of images from that stash-box database. Apply the tag [Set Profile Image] to an image to set it as the profile image of that performer. Note you will need to configure the download path and add this as a path under settings > library -version: 0.2 +version: 0.3 url: https://discourse.stashapp.cc/t/stashdb-performer-gallery/1411 exec: - python From f9269556d1185db1c613228163e6b7548fef209c Mon Sep 17 00:00:00 2001 From: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> Date: Tue, 17 Feb 2026 00:10:15 +0200 Subject: [PATCH 15/51] Add another rename plugin (#668) * Add another rename plugin * Fix link --- plugins/sceneRename/README.md | 68 +++++ plugins/sceneRename/scenerename.py | 257 ++++++++++++++++++ plugins/sceneRename/scenerename.yml | 31 +++ .../sceneRename/screenshots/Screenshot.png | Bin 0 -> 44760 bytes 4 files changed, 356 insertions(+) create mode 100644 plugins/sceneRename/README.md create mode 100644 plugins/sceneRename/scenerename.py create mode 100644 plugins/sceneRename/scenerename.yml create mode 100644 plugins/sceneRename/screenshots/Screenshot.png diff --git a/plugins/sceneRename/README.md b/plugins/sceneRename/README.md new file mode 100644 index 00000000..ab18e940 --- /dev/null +++ b/plugins/sceneRename/README.md @@ -0,0 +1,68 @@ +# Scene Rename: File Organizer Plugin + +Simple plugin to help organize scene files into a clean, consistent format. It includes debug tracing that integrates with the `Logs` view, supports dry runs, and provides a clear description in the Plugins UI. + + +## Features + +* Dry run support +* Debug output in the `Logs` view +* Graceful handling of already-renamed files +* Does not fail if Scene ID or resolution are missing +* Requires a Studio and Title to proceed + +The code is simple and the plugin UI includes clear usage instructions. + + +## Screenshot + +![Screenshot 2026-02-15 at 10.18.08 AM|690x364](screenshots/Screenshot.png) + +--- + +## What It Does + +The `Scene Rename` plugin renames scene files using the following format: + +``` +Studio #StudioID [Resolution] - Title.mp4 +``` + +For example, a file in my library that still has its default name: + +``` +wodhhd_06_1080p.mp4 +``` + +Is renamed to: + +``` +TitanMen #395 [1080p] - Coyote Point, Dakota Rivers.mp4 +``` + +This format keeps filenames consistent and easy to scan. It also makes it simple to group files by studio if desired, or keep everything in a single directory while maintaining a clean, uniform structure. + +I’ve found it very effective for keeping my library organized, and others may find it useful as well. + +--- + +## Installation Example (Docker) + +I run Stash in Docker. My folder structure looks like this: + +``` +docker/ +└── docker-compose.yml +└── plugins/ + └── scenerename/ + ├── scenerename.py + └── scenerename.yml +``` + +In `docker-compose.yml`, add the following under `volumes`: + +``` +- ./plugins/scenerename:/root/.stash/plugins/scenerename +``` + +That’s all that’s required. The plugin loads normally, outputs to the Logs window, and supports dry runs. \ No newline at end of file diff --git a/plugins/sceneRename/scenerename.py b/plugins/sceneRename/scenerename.py new file mode 100644 index 00000000..f5d6c5e0 --- /dev/null +++ b/plugins/sceneRename/scenerename.py @@ -0,0 +1,257 @@ +import os, sys, json, logging, traceback +from pathlib import Path +from logging.handlers import RotatingFileHandler + +# Setup file logging +log_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "scenerename.log") +file_logger = logging.getLogger("scenerename") +file_logger.setLevel(logging.DEBUG) +fh = RotatingFileHandler(log_file, maxBytes=2*1024*1024, backupCount=2) +fh.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s")) +file_logger.addHandler(fh) + +try: + import stashapi.log as log + from stashapi.stashapp import StashInterface +except ModuleNotFoundError: + print("stashapi not found", file=sys.stderr) + sys.exit(1) + +SCENE_FRAGMENT = "id title code studio {name} files {id path width height} date" + + +def get_json_input(): + return json.loads(sys.stdin.read()) + + +def get_stash(json_input): + conn = json_input["server_connection"] + host = conn["Host"] + if host == "0.0.0.0": + host = "localhost" + stash_conn = { + "Scheme": conn["Scheme"], + "Host": host, + "Port": conn["Port"], + } + if conn.get("SessionCookie"): + stash_conn["SessionCookie"] = conn["SessionCookie"] + if conn.get("ApiKey"): + stash_conn["ApiKey"] = conn["ApiKey"] + return StashInterface(stash_conn) + + +def get_settings(json_input, stash): + settings = {"dryRun": False, "debugTracing": False} + try: + config = stash.call_GQL("query Configuration { configuration { plugins }}") + plugins_config = config.get("configuration", {}).get("plugins", {}) + if "scenerename" in plugins_config: + s = plugins_config["scenerename"] + settings["dryRun"] = s.get("dryRun", False) + settings["debugTracing"] = s.get("debugTracing", False) + except Exception: + pass + return settings + + +def replace_illegal_chars(filename): + for ch in ["<", ">", '"', "/", "\\", "|", "?", "*"]: + filename = filename.replace(ch, "-") + return filename + + +def get_resolution_label(height): + h = int(height) + if h >= 2160: + return "4K" + elif h >= 1440: + return "1440p" + elif h >= 1080: + return "1080p" + elif h >= 720: + return "720p" + elif h >= 480: + return "480p" + return str(h) + "p" + + + +def clean_title(title): + """Replace colons with commas in the title.""" + if not title: + return "" + return title.replace(":", ",") + + +def form_filename(scene): + """Build filename: Studio #Code - Title [Resolution]""" + # Studio Name + studio = scene.get("studio") + studio_name = "" + if studio: + studio_name = studio.get("name", "") + + # Studio Code / Sequence + code = scene.get("code") or "" + + # Resolution + resolution = "" + files = scene.get("files", []) + if files: + height = files[0].get("height") + if height: + resolution = get_resolution_label(height) + + # Full title with colons replaced by commas + title = clean_title(scene.get("title", "")) + + # Skip files without a studio name + if not studio_name: + return None + + # Build: "Studio #Code - Title [Resolution]" + # Start with studio name + new_name = studio_name + + # Add code if present + if code: + new_name = "{} #{}".format(new_name, code) + + # Add title if present + if title: + new_name = "{} - {}".format(new_name, title) + + # Add resolution at the end in brackets + if resolution: + new_name = "{} [{}]".format(new_name, resolution) + + new_name = replace_illegal_chars(new_name) + + if len(new_name) > 240: + new_name = new_name[:240] + + return new_name + + +def rename_scene(stash, scene_id, dry_run=False, debug=False): + scene = stash.find_scene(scene_id, SCENE_FRAGMENT) + if not scene: + log.error("Scene {} not found".format(scene_id)) + return None + + files = scene.get("files", []) + if not files: + log.error("Scene {} has no files".format(scene_id)) + return None + + original_path = files[0]["path"] + if not os.path.isfile(original_path): + log.error("File does not exist: {}".format(original_path)) + return None + + original_name = Path(original_path).name + ext = Path(original_path).suffix + parent = Path(original_path).parent + + new_stem = form_filename(scene) + if not new_stem: + msg = "Could not form new filename - missing metadata (need at least one of: studio, code, title)" + log.info(msg) + file_logger.info(msg) + return None + + new_name = new_stem + ext + new_path = str(parent / new_name) + + if original_name == new_name: + msg = "No change needed: {}".format(original_name) + log.info(msg) + file_logger.info(msg) + return None + + # Handle duplicates - append (2), (3), etc. if target already exists + if os.path.isfile(new_path) and new_path != original_path: + counter = 2 + while True: + dup_name = "{} ({}){}".format(new_stem, counter, ext) + dup_path = str(parent / dup_name) + if dup_path == original_path: + # Already at the correct duplicate counter - no rename needed + msg = "Already correctly named: {}".format(original_name) + log.info(msg) + file_logger.info(msg) + return None + if not os.path.isfile(dup_path): + new_name = dup_name + new_path = dup_path + file_logger.warning("Duplicate detected, using: {}".format(new_name)) + break + counter += 1 + + prefix = "[DRY RUN] " if dry_run else "" + msg = "{}Changing from '{}' to '{}'".format(prefix, original_name, new_name) + log.info(msg) + file_logger.info(msg) + + if debug: + studio = scene.get("studio") + studio_name = studio.get("name") if studio else "N/A" + file_logger.debug(" Studio: {}".format(studio_name)) + file_logger.debug(" Code: {}".format(scene.get("code", "N/A"))) + file_logger.debug(" Title: {}".format(scene.get("title", "N/A"))) + file_logger.debug(" Height: {}".format(files[0].get("height", "N/A"))) + file_logger.debug(" Full path: {} -> {}".format(original_path, new_path)) + + if dry_run: + return new_stem + + try: + os.rename(original_path, new_path) + msg = "Renamed successfully: {}".format(new_path) + log.info(msg) + file_logger.info(msg) + stash.metadata_scan(paths=[str(parent)]) + except OSError as e: + msg = "Failed to rename: {}".format(e) + log.error(msg) + file_logger.error(msg) + return None + + return new_stem + + +def main(): + json_input = get_json_input() + stash = get_stash(json_input) + settings = get_settings(json_input, stash) + dry_run = settings["dryRun"] + debug = settings["debugTracing"] + + mode = json_input.get("args", {}).get("mode", "") + + # Force dry run for the dry run task + if mode == "dry_run_last": + dry_run = True + + if mode in ("rename_last", "dry_run_last"): + result = stash.call_GQL("query { allScenes { id updated_at } }") + all_scenes = result.get("allScenes", []) + if not all_scenes: + log.info("No scenes found") + return + latest = max(all_scenes, key=lambda s: s["updated_at"]) + rename_scene(stash, latest["id"], dry_run=dry_run, debug=debug) + else: + # Hook mode - Scene.Update.Post + try: + hook_context = json_input["args"]["hookContext"] + scene_id = hook_context["id"] + rename_scene(stash, scene_id, dry_run=dry_run, debug=debug) + except (KeyError, TypeError) as e: + file_logger.error("Could not get scene ID from hook: {}".format(e)) + log.error("Could not get scene ID from hook: {}".format(e)) + + +if __name__ == "__main__": + main() diff --git a/plugins/sceneRename/scenerename.yml b/plugins/sceneRename/scenerename.yml new file mode 100644 index 00000000..8db77dd0 --- /dev/null +++ b/plugins/sceneRename/scenerename.yml @@ -0,0 +1,31 @@ +name: SceneRename +description: "Renames scene files to 'Studio #Code [Resolution] - Title.ext'. Studio name is required (files without one are skipped). Code and resolution are optional. Colons in titles become commas. Triggers on scene update or via manual task. Enable Dry Run to preview changes in scenerename.log before renaming." +version: 1.0.1 +url: https://discourse.stashapp.cc/t/scenerename/5795 +settings: + dryRun: + displayName: Dry Run + description: "Enable to preview renames in the log without actually renaming files." + type: BOOLEAN + debugTracing: + displayName: Debug Tracing + description: "Enable verbose debug logging to scenerename.log" + type: BOOLEAN +exec: + - python + - "{pluginDir}/scenerename.py" +interface: raw +hooks: + - name: SceneRenameHook + description: Renames scene file on update. + triggeredBy: + - Scene.Update.Post +tasks: + - name: Rename Last Updated Scene + description: Renames the most recently updated scene file. + defaultArgs: + mode: rename_last + - name: Dry Run Last Updated Scene + description: Logs what the rename would be without changing files. + defaultArgs: + mode: dry_run_last diff --git a/plugins/sceneRename/screenshots/Screenshot.png b/plugins/sceneRename/screenshots/Screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8754ddede97e1c753bcae91011787e0eb28e13 GIT binary patch literal 44760 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

$-^ruix#aEih&Kuun+(P5bA_Lo_4Z0n| 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 Date: Tue, 17 Feb 2026 21:26:40 -0500 Subject: [PATCH 16/51] [SFW Switch] Added State Memorization (#669) * Added State Memorization Local storage is now utilized to maintain states in between pages. SFW will persist upon next page reload and remain off until clicked again making the option a true toggle. Core plugin functionality has not changed. * Bump version --------- Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- plugins/SFWSwitch/sfw.js | 63 ++++++++++++--------------------- plugins/SFWSwitch/sfwswitch.yml | 2 +- 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/plugins/SFWSwitch/sfw.js b/plugins/SFWSwitch/sfw.js index 2fe3f08c..2410ade2 100644 --- a/plugins/SFWSwitch/sfw.js +++ b/plugins/SFWSwitch/sfw.js @@ -2,28 +2,26 @@ function sfw_mode() { const stash_css = sfwswitch_findstashcss(); const button = document.getElementById("plugin_sfw"); - if (stash_css && stash_css.disabled) { - // SFW mode is disabled - button.style.color = "#f5f8fa"; // Default color - } else { - // SFW mode is enabled - button.style.color = "#5cff00"; // Active color - } + if (!stash_css) return; + + const sfwState = localStorage.getItem("sfw_mode") === "true"; + + // Apply saved state to the stylesheet + stash_css.disabled = !sfwState; + + // Update button color + button.style.color = sfwState ? "#5cff00" : "#f5f8fa"; } function sfwswitch_createbutton() { const buttonId = "plugin_sfw"; - // Check if the button already exists - if (document.getElementById(buttonId)) { - return; - } + if (document.getElementById(buttonId)) return; - // Create the button element const buttonContainer = document.createElement("a"); buttonContainer.className = "mr-2"; buttonContainer.innerHTML = ` - `; - // Poll for the navbar-buttons container const intervalId = setInterval(() => { const navbarButtons = document.querySelector(".navbar-buttons"); if (navbarButtons) { - clearInterval(intervalId); // Stop polling + clearInterval(intervalId); navbarButtons.insertBefore(buttonContainer, navbarButtons.childNodes[0]); - // Add click event listener document.getElementById(buttonId).addEventListener("click", sfwswitch_switcher); - // Initialize the button state + // Initialize the button based on saved state sfw_mode(); } - }, 100); // Check every 100ms + }, 100); - // Stop polling after a timeout to avoid infinite loops - setTimeout(() => clearInterval(intervalId), 10000); // 10 seconds max + setTimeout(() => clearInterval(intervalId), 10000); } function sfwswitch_switcher() { @@ -57,16 +52,15 @@ function sfwswitch_switcher() { return; } + // Toggle stylesheet stash_css.disabled = !stash_css.disabled; + // Save new state to localStorage + localStorage.setItem("sfw_mode", !stash_css.disabled); + const button = document.getElementById("plugin_sfw"); - if (stash_css.disabled) { - console.log("SFW mode disabled"); - button.style.color = "#f5f8fa"; // Default color - } else { - console.log("SFW mode enabled"); - button.style.color = "#5cff00"; // Active color - } + button.style.color = stash_css.disabled ? "#f5f8fa" : "#5cff00"; + console.log(`SFW mode ${stash_css.disabled ? "disabled" : "enabled"}`); } function sfwswitch_findstashcss() { @@ -76,19 +70,8 @@ function sfwswitch_findstashcss() { return stylesheet; } } - return null; // Return null if no matching stylesheet is found -} - -function waitForElementClass(elementId, callBack, time) { - time = (typeof time !== 'undefined') ? time : 100; - window.setTimeout(function () { - var element = document.getElementsByClassName(elementId); - if (element.length > 0) { - callBack(elementId, element); - } else { - waitForElementClass(elementId, callBack); - } - }, time); + return null; } +// Initialize button on page load sfwswitch_createbutton(); diff --git a/plugins/SFWSwitch/sfwswitch.yml b/plugins/SFWSwitch/sfwswitch.yml index 4067e28e..9c4b7171 100644 --- a/plugins/SFWSwitch/sfwswitch.yml +++ b/plugins/SFWSwitch/sfwswitch.yml @@ -1,6 +1,6 @@ name: SFW Switch description: Add a button to blur covers and images. -version: 1.2 +version: 1.3 url: https://discourse.stashapp.cc/t/sfw-switch/4658 ui: javascript: From 0587f0d02b653994a2fa775c7697ea144ea096e1 Mon Sep 17 00:00:00 2001 From: WeedLordVegeta420 <81525421+WeedLordVegeta420@users.noreply.github.com> Date: Thu, 19 Feb 2026 09:37:15 -0500 Subject: [PATCH 17/51] [tagCopyPaste] Refactor to use PluginApi.patch. (#672) --- plugins/tagCopyPaste/README.md | 4 +- plugins/tagCopyPaste/tagCopyPaste.css | 16 +- plugins/tagCopyPaste/tagCopyPaste.js | 246 +++++++++++++------------- plugins/tagCopyPaste/tagCopyPaste.yml | 4 +- 4 files changed, 137 insertions(+), 133 deletions(-) diff --git a/plugins/tagCopyPaste/README.md b/plugins/tagCopyPaste/README.md index 6a5189d3..c4305ee5 100644 --- a/plugins/tagCopyPaste/README.md +++ b/plugins/tagCopyPaste/README.md @@ -2,7 +2,7 @@ https://discourse.stashapp.cc/t/tagcopypaste/1858 -This plugin adds Copy and Paste functionality to the Tags input field that allows for easier bulk adding and copying of tags, with the goal of making it easy to copy Tags between objects, bulk load manually created tag lists, or load tag lists copied from AI tagger output. +This plugin adds Copy and Paste functionality to the Tags input field with the goal of making it easy to copy Tags between objects, bulk load manually created tag lists, or load tag lists copied from AI tagger output. Copy/Paste of Tags can be performed either with dedicated Copy/Paste buttons or by selecting the Tag input field and performing the typical CTRL+C/CTRL+V. @@ -14,5 +14,5 @@ Pasting will check your current clipboard for a comma and/or newline delimited s ## Config Options: - **Create If Not Exists**: If enabled, new tags will be created when pasted list contains entries that do not already exist. DEFAULT: Disabled -- **Require Confirmation**: If enabled, user needs to confirm paste before changes are saved. DEFAULT: Disabled +- **Require Confirmation**: If enabled, user needs to confirm new tags being created. DEFAULT: Disabled diff --git a/plugins/tagCopyPaste/tagCopyPaste.css b/plugins/tagCopyPaste/tagCopyPaste.css index b13a5832..44be2820 100644 --- a/plugins/tagCopyPaste/tagCopyPaste.css +++ b/plugins/tagCopyPaste/tagCopyPaste.css @@ -1,8 +1,10 @@ -button.imageGalleryNav-copyButton, -button.imageGalleryNav-pasteButton { - float: right; - height: 21px; - line-height: 20px; - padding: 0 10px; - margin-right: 15px; +div.multi-set { + position: relative; } + +div.modal-content div.tagCopyPaste div.btn-group { + position: absolute; + top:0; + right:0; +} + diff --git a/plugins/tagCopyPaste/tagCopyPaste.js b/plugins/tagCopyPaste/tagCopyPaste.js index 42e76499..0ec26f2e 100644 --- a/plugins/tagCopyPaste/tagCopyPaste.js +++ b/plugins/tagCopyPaste/tagCopyPaste.js @@ -1,21 +1,24 @@ (async () => { + const PluginApi = window.PluginApi; + const React = PluginApi.React; + let pluginSettings = {}; const defaultPluginSettings = { createIfNotExists: false, requireConfirmation: false, }; - var objID = null; - var objType = null; - - // helper function to get the innerText of all elements matching a selector - const getAllInnerText = (selector) => Array.from(document.querySelectorAll(selector)) - .map((el) => el.innerText.trim()) - .filter((text) => text !== ""); - - // On image page, get data about gallery (image's position within gallery, next/prev image IDs), - // add arrow buttons to page, and register arrow keypress handlers, - async function setupTagCopyPaste(objTypeTriggered) { + // Helper functions for handling array of tags. + const getTagNameArray = (tagArray) => tagArray.map((value) => value.name); + const getTagNameString = (tagArray) => getTagNameArray(tagArray).join(", "); + const sortTagArray = (tagArray) => + tagArray.sort((a, b) => { + var aCompStr = a.sort_name ? a.sort_name : a.name; + var bCompStr = b.sort_name ? b.sort_name : b.name; + return aCompStr.localeCompare(bCompStr); + }); + + async function setupTagCopyPaste() { // Get plugin settings. const configSettings = await csLib.getConfiguration("tagCopyPaste", {}); // getConfiguration is from cs-ui-lib.js pluginSettings = { @@ -23,81 +26,110 @@ ...configSettings, }; - objID = window.location.pathname.split("/")[2]; - objType = objTypeTriggered; - - // Add UI elements. - if (objID !== "new") { - insertCopyPasteButtons(); - } - } - - function copyEventHandler(event) { - event.preventDefault(); - handleCopyClick(); - } - - function pasteEventHandler(event) { - event.preventDefault(); - handlePasteClick(); - } - - function insertCopyPasteButtons() { - // listen for copy and paste events within tag input box - // find tag input box - const tagInputBox = document.querySelector("label[for='tag_ids'] + div .react-select__value-container"); - if (tagInputBox) { - tagInputBox.removeEventListener("copy", copyEventHandler); - tagInputBox.removeEventListener("paste", pasteEventHandler); - tagInputBox.addEventListener("copy", copyEventHandler); - tagInputBox.addEventListener("paste", pasteEventHandler); - } - - var copyButton = document.createElement("button"); - copyButton.className = "imageGalleryNav-copyButton btn btn-secondary"; - copyButton.innerText = "Copy"; - copyButton.onclick = (event) => { - event.preventDefault(); - handleCopyClick(); - } - - var pasteButton = document.createElement("button"); - pasteButton.className = "imageGalleryNav-pasteButton btn btn-secondary"; - pasteButton.innerText = "Paste"; - pasteButton.onclick = (event) => { - event.preventDefault(); - handlePasteClick(); - } - - if (document.querySelector("button.imageGalleryNav-pasteButton") == null) { - document.querySelector("label[for='tag_ids']").append(pasteButton); - } - if (document.querySelector("button.imageGalleryNav-copyButton") == null) { - document.querySelector("label[for='tag_ids']").append(copyButton); - } + // Patch TagSelect to add copy/paste buttons. + PluginApi.patch.after("TagSelect", function (props, _, originalComponent) { + const copyButtonRef = React.useRef(null); + const pasteButtonRef = React.useRef(null); + const propsRef = props; + + // Copy Button click handler + const copyClickHandler = (event) => { + event.preventDefault(); + handleCopyClick(propsRef.values); + }; + + // Paste Button click handler + const pasteClickHandler = (event) => { + event.preventDefault(); + handlePasteClick(propsRef.onSelect, propsRef.values); + }; + + React.useEffect(() => { + // Not the ideal way to handle this, but it works. + // Wait for the buttons to render and then add the onCopy/onPaste handlers to select control DOM element. + if (copyButtonRef && copyButtonRef.current) { + var mainCopyPasteWrapper = + copyButtonRef.current.parentElement.parentElement; + var tagInputBox = mainCopyPasteWrapper.querySelector( + ".react-select__value-container", + ); + + const copyEventHandler = (e) => { + e.preventDefault(); + copyButtonRef.current.click(); + }; + + const pasteEventHandler = (e) => { + e.preventDefault(); + pasteButtonRef.current.click(); + }; + + if (tagInputBox) { + tagInputBox.addEventListener("copy", copyEventHandler); + tagInputBox.addEventListener("paste", pasteEventHandler); + } + } + }, []); + + return React.createElement("div", { className: "tagCopyPaste" }, [ + React.createElement( + "div", + { + className: "btn-group", + }, + [ + React.createElement( + "button", + { + type: "button", + ref: copyButtonRef, + onClick: copyClickHandler, + className: + "imageGalleryNav-copyButton btn btn-secondary btn-sm", + }, + "Copy", + ), + React.createElement( + "button", + { + type: "button", + ref: pasteButtonRef, + onClick: pasteClickHandler, + className: + "imageGalleryNav-pasteButton btn btn-secondary btn-sm", + }, + "Paste", + ), + ], + ), + originalComponent, + ]); + }); } // Handle copy click. Return delimited list of current tags. - async function handleCopyClick() { + async function handleCopyClick(propValues) { // Get tags from input box // join as comma delimited list - const tagList = getAllInnerText("label[for='tag_ids'] + div .react-select__multi-value__label").join(",") - // write to clipboard. + const tagList = getTagNameString(propValues); navigator.clipboard.writeText(tagList); } // Handle paste click. - async function handlePasteClick() { + async function handlePasteClick(onSelect, propValues) { // Parse tag list from comma delimited string. const tagInput = await navigator.clipboard.readText(); - var inputTagList = tagInput.split(/\r?\n|\r|,/).map(s => s.trim()).filter((text) => text !== "") // do de-duplication later + var inputTagList = tagInput + .split(/\r?\n|\r|,/) + .map((s) => s.trim()) + .filter((text) => text !== ""); // do de-duplication later // Get tags from input box and also add to tag list. - const existingTagList = getAllInnerText("label[for='tag_ids'] + div .react-select__multi-value__label"); + const existingTagList = getTagNameArray(propValues); inputTagList = [...new Set([...inputTagList, ...existingTagList])].sort(); - var missingTags = []; + var missingTagNames = []; var existingTags = []; var tagUpdateList = []; @@ -108,59 +140,42 @@ existingTags.push(inputTag); tagUpdateList.push(tagID[0]); } else { - missingTags.push(inputTag); + missingTagNames.push(inputTag); } } - if (pluginSettings.requireConfirmation) { - const missingTagsStr = missingTags.join(", "); - const existingTagsStr = existingTags.join(", "); - const msg = pluginSettings.createIfNotExists - ? `Missing Tags that will be created:\n${missingTagsStr}\n\nExisting Tags that will be saved: \n${existingTagsStr}\n\nContinue?` - : `Missing Tags that will be skipped:\n${missingTagsStr}\n\nExisting Tags that will be saved: \n${existingTagsStr}\n\nContinue?`; - - if (!confirm(msg)) { - return; + // Create missing tags if enabled. Prompt user to confirm if confirmation option is also enabled. + const missingTagsStr = missingTagNames.join(", "); + const msg = `Missing Tags that will be created:\n${missingTagsStr}\n\nContinue?`; + if ( + pluginSettings.createIfNotExists && + missingTagNames.length && + (!pluginSettings.requireConfirmation || confirm(msg)) + ) { + for (const missingTagName of missingTagNames) { + const newTag = await createNewTag(missingTagName); + if (newTag != null) tagUpdateList.push(newTag); } } - if (pluginSettings.createIfNotExists && missingTags.length) { - for (const missingTag of missingTags) { - const newTagID = await createNewTag(missingTag); - if (newTagID != null) tagUpdateList.push(newTagID); - } - } - - // Update tags on object with new tag ID list. - await updateObjTags( - tagUpdateList, - `${objType.toLowerCase()}Update`, - `${objType}UpdateInput` - ); - - window.location.reload(); + // Update TagSelect control with new tag list. + onSelect(sortTagArray(tagUpdateList)); } // *** GQL Calls *** - // Update Object by ID, new tags list, and GQL mutation name. - async function updateObjTags(tags, fnName, inputName) { - const variables = { input: { id: objID, tag_ids: tags } }; - const query = `mutation UpdateObj($input:${inputName}!) { ${fnName}(input: $input) {id} }`; - return await csLib.callGQL({ query, variables }); - } - - // Update Object by ID, new tags list, and GQL mutation name. + // Create new tag. + // Return newly created tag object. async function createNewTag(tagName) { const variables = { input: { name: tagName } }; - const query = `mutation CreateTag($input:TagCreateInput!) { tagCreate(input: $input) {id} }`; + const query = `mutation CreateTag($input:TagCreateInput!) { tagCreate(input: $input) { id, name, sort_name, favorite, description, aliases, image_path, parents {id, name}, stash_ids {endpoint, stash_id, updated_at } } }`; return await csLib .callGQL({ query, variables }) - .then((data) => data.tagCreate.id); + .then((data) => data.tagCreate); } // Find Tag by name/alias. - // Return match tag ID. + // Return matched list of tag objects. async function getTagByName(tagName) { const tagFilter = { name: { value: tagName, modifier: "EQUALS" }, @@ -168,24 +183,11 @@ }; const findFilter = { per_page: -1, sort: "name" }; const variables = { tag_filter: tagFilter, filter: findFilter }; - const query = `query ($tag_filter: TagFilterType!, $filter: FindFilterType!) { findTags(filter: $filter, tag_filter: $tag_filter) { tags { id } } }`; + const query = `query ($tag_filter: TagFilterType!, $filter: FindFilterType!) { findTags(filter: $filter, tag_filter: $tag_filter) { tags { id, name, sort_name, favorite, description, aliases, image_path, parents {id, name}, stash_ids {endpoint, stash_id, updated_at } } } }`; return await csLib .callGQL({ query, variables }) - .then((data) => data.findTags.tags.map((item) => item.id)); + .then((data) => data.findTags.tags); } - // listener arrays - [ - [ "/scenes/", "[id*='-edit-details']", "Scene" ], - [ "/studios/", "[id='studio-edit']", "Studio" ], - [ "/groups/", "[id='group-edit']", "Group" ], - [ "/performers/", "[id='performer-edit']", "Performer" ], - [ "/galleries/", "[id*='-edit-details']", "Gallery" ], - [ "/images/", "[id*='-edit-details']", "Image" ] - ].forEach(([path, selector, objTypeTriggered]) => { - // Wait for the page to load and the element to be present. - csLib.PathElementListener(path, selector, () => { - setupTagCopyPaste(objTypeTriggered); - }); // PathElementListener is from cs-ui-lib.js - }); + setupTagCopyPaste(); })(); diff --git a/plugins/tagCopyPaste/tagCopyPaste.yml b/plugins/tagCopyPaste/tagCopyPaste.yml index e6590aa0..6bcdf517 100644 --- a/plugins/tagCopyPaste/tagCopyPaste.yml +++ b/plugins/tagCopyPaste/tagCopyPaste.yml @@ -1,7 +1,7 @@ name: tagCopyPaste # requires: CommunityScriptsUILibrary description: Adds Copy/Paste buttons to Tags field. -version: 0.4 +version: 0.5 url: https://discourse.stashapp.cc/t/tagcopypaste/1858 settings: createIfNotExists: @@ -10,7 +10,7 @@ settings: type: BOOLEAN requireConfirmation: displayName: Require Confirmation - description: If enabled, user needs to confirm paste before changes are saved. + description: If enabled, user needs to confirm new tags being created. type: BOOLEAN ui: requires: From 2e41ce5236c54740ad7525ff7025ec7bdfb460b2 Mon Sep 17 00:00:00 2001 From: HavenCTO Date: Wed, 25 Feb 2026 05:18:33 -0500 Subject: [PATCH 18/51] Update vlm-engine dependency version to 0.9.3 (#674) * Update vlm-engine dependency version to 0.9.3 * Bump version to 1.0.1 in ahavenvlmconnector.yml --- plugins/AHavenVLMConnector/ahavenvlmconnector.yml | 2 +- plugins/AHavenVLMConnector/haven_vlm_connector.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml index 67704d8a..e77c0e4f 100644 --- a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml +++ b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml @@ -1,7 +1,7 @@ name: Haven VLM Connector # requires: PythonDepManager description: Tag videos with Vision-Language Models using any OpenAI-compatible VLM endpoint -version: 1.0.0 +version: 1.0.1 url: https://discourse.stashapp.cc/t/haven-vlm-connector/5464 exec: - python diff --git a/plugins/AHavenVLMConnector/haven_vlm_connector.py b/plugins/AHavenVLMConnector/haven_vlm_connector.py index e6655d60..85921c1d 100644 --- a/plugins/AHavenVLMConnector/haven_vlm_connector.py +++ b/plugins/AHavenVLMConnector/haven_vlm_connector.py @@ -34,7 +34,7 @@ "stashapi:stashapp-tools==0.2.58", "aiohttp==3.12.13", "pydantic==2.11.7", - "vlm-engine==0.9.1", + "vlm-engine==0.9.3", "pyyaml==6.0.2" ) From 884f27b5ed08c4bc117e258c00828cd08cef8c22 Mon Sep 17 00:00:00 2001 From: rustyinfinity <115462641+rustyinfinity@users.noreply.github.com> Date: Fri, 27 Feb 2026 02:07:22 +0530 Subject: [PATCH 19/51] [The Porn DB Markers] Fix pagination bug causing scenes to be skipped when count < per_page (#673) * fix: loop not running problem * bump up the version --- plugins/TPDBMarkers/TPDBMarkers.yml | 2 +- plugins/TPDBMarkers/tpdbMarkers.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/TPDBMarkers/TPDBMarkers.yml b/plugins/TPDBMarkers/TPDBMarkers.yml index f6fcf52d..e0e51d13 100644 --- a/plugins/TPDBMarkers/TPDBMarkers.yml +++ b/plugins/TPDBMarkers/TPDBMarkers.yml @@ -1,6 +1,6 @@ name: The Porn DB Markers description: Sync Markers from The Porn DB aka theporndb.net -version: 0.4.3 +version: 0.4.4 url: https://discourse.stashapp.cc/t/the-porn-db-markers/1335 exec: - python diff --git a/plugins/TPDBMarkers/tpdbMarkers.py b/plugins/TPDBMarkers/tpdbMarkers.py index d9e688d5..3ca347ed 100644 --- a/plugins/TPDBMarkers/tpdbMarkers.py +++ b/plugins/TPDBMarkers/tpdbMarkers.py @@ -5,6 +5,7 @@ import requests import json import time +import math per_page = 100 @@ -99,7 +100,7 @@ def processAll(): )[0] log.info(str(count) + " scenes to submit.") i = 0 - for r in range(1, int(count / per_page) + 1): + for r in range(1, math.ceil(count / per_page) + 1): log.info( "fetching data: %s - %s %0.1f%%" % ( From 16aeef54eab000f2393daca5521485dbce5c7944 Mon Sep 17 00:00:00 2001 From: gimmeliina <96843881+gimmeliina@users.noreply.github.com> Date: Wed, 4 Mar 2026 08:09:02 +0200 Subject: [PATCH 20/51] AdulttimeInteractiveDL.py: Fix url in jerkbuddies.com to jerk-buddies.com (#675) --- plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.py | 4 ++-- plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.py b/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.py index 131d108e..83975270 100644 --- a/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.py +++ b/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.py @@ -86,7 +86,7 @@ def get_download(): log.info(f"Plugin Cachepath {cachepath} ") # adulttime.com - # jerkbuddies.com + # jerk-buddies.com # adulttime.studio # oopsie.tube # adulttimepilots.com @@ -103,7 +103,7 @@ def get_download(): f={ "url": { "modifier": "MATCHES_REGEX", - "value": "howwomenorgasm\\.com|switch\\.com|getupclose\\.com|milfoverload\\.net|dareweshare\\.net|jerkbuddies\\.com|adulttime\\.studio|adulttime\\.com|oopsie\\.tube|adulttimepilots\\.com|kissmefuckme\\.net|youngerloverofmine\\.com", + "value": "howwomenorgasm\\.com|switch\\.com|getupclose\\.com|milfoverload\\.net|dareweshare\\.net|jerk-buddies\\.com|adulttime\\.studio|adulttime\\.com|oopsie\\.tube|adulttimepilots\\.com|kissmefuckme\\.net|youngerloverofmine\\.com", } }, fragment=SLIM_SCENE_FRAGMENT, diff --git a/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.yml b/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.yml index aacf27ba..f6c6b1e4 100644 --- a/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.yml +++ b/plugins/AdulttimeInteractiveDL/AdulttimeInteractiveDL.yml @@ -1,6 +1,6 @@ name: "Adulttime Interactive Downloader" description: Download Interactive Files for Adulttime Scenes -version: 0.1.2 +version: 0.1.3 url: https://discourse.stashapp.cc/t/adulttime-interactive-downloader/1327 exec: - python From ce30de489d2d226ce9a474fbe2e8d09bce5577c9 Mon Sep 17 00:00:00 2001 From: Servbot91 Date: Thu, 5 Mar 2026 07:14:52 -0500 Subject: [PATCH 21/51] [SFW Switch] Additional Fields Patched, Additional Plugin Integration Added (#677) * Added additional plugin support, patched additional fields previously left uncensored. * Update README Clarified instructions for adding custom selectors to additional_plugins.css. --------- Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- plugins/SFWSwitch/README.md | 4 +- plugins/SFWSwitch/additional_plugins.css | 65 ++++++++++++++++++++++++ plugins/SFWSwitch/sfw.css | 22 +++++++- plugins/SFWSwitch/sfwswitch.yml | 5 +- 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 plugins/SFWSwitch/additional_plugins.css diff --git a/plugins/SFWSwitch/README.md b/plugins/SFWSwitch/README.md index 874e2f78..02cb3507 100644 --- a/plugins/SFWSwitch/README.md +++ b/plugins/SFWSwitch/README.md @@ -9,6 +9,8 @@ https://discourse.stashapp.cc/t/sfw-switch/4658 - Gray = Blur disabled - Toggling the button blurs cover images and other content. - Hovering over an image temporarily removes the blur. +- Extends the blurring functionality to some community plugins. + - Custom selectors should should be added to `additional_plugins.css` file. ## Screenshots @@ -17,4 +19,4 @@ https://discourse.stashapp.cc/t/sfw-switch/4658 ## Credit Original plugin by Belleyy [here](https://github.com/Belleyy/CommunityScripts/tree/pluginUI_SFWSwitch/plugins/SFW%20Switch). -The CSS code used is provided by fl0w#9497 [here](https://discourse.stashapp.cc/t/custom-css-snippets/4043#p-8143-blur-nsfw-images-and-unblur-on-mouse-over-41). \ No newline at end of file +The CSS code used is provided by fl0w#9497 [here](https://discourse.stashapp.cc/t/custom-css-snippets/4043#p-8143-blur-nsfw-images-and-unblur-on-mouse-over-41). diff --git a/plugins/SFWSwitch/additional_plugins.css b/plugins/SFWSwitch/additional_plugins.css new file mode 100644 index 00000000..6ce5d6fb --- /dev/null +++ b/plugins/SFWSwitch/additional_plugins.css @@ -0,0 +1,65 @@ +/* [Global changes] Blur NSFW images and unblur on mouse over */ + +/*Credit: fl0w#9497 */ + +/* === MORE BLUR === */ + +/* Stash Battle */ +.pwr-scene-image-container, +.pwr-scene-image-container, +.pwr-hover-preview, +.pwr-scene-image-container .pwr-scene-image, + +/* HotOrNot */ +.hon-performer-image, +.hon-scene-image, +.hon-image-image-container, +.hon-image-image, + +/* O Stats */ +.custom-stats-row .stats-element img, +#on-this-day-section [style*="position: relative; height: 400px"] +{ +filter: blur(30px); +} + +/* === LESS BLUR === */ + +/* StashBattle */ +.pwr-scene-info, + +/* HotOrNot */ +.hon-performer-info.hon-scene-info, + +/* O Stats */ +.custom-stats-row .stats-element, +#on-this-day-section [style*="display: flex"][style*="cursor: pointer"] img, +#on-this-day-section [style*="display: flex"][style*="cursor: pointer"] img + div, +#on-this-day-section > div:last-child +{ +filter: blur(2px); +} + +/* StashBattle */ +.pwr-scene-image-container:hover, +.pwr-scene-image-container:hover .pwr-hover-preview, +.pwr-scene-image-container:hover .pwr-scene-image, +.pwr-scene-info:hover, + +/* HotOrNot */ +.hon-performer-image:hover, +.hon-scene-image:hover, +.hon-image-image-container:hover, +.hon-image-image:hover, +.hon-performer-info.hon-scene-info:hover, + +/* O Stats */ +.custom-stats-row .stats-element:hover, +.custom-stats-row .stats-element:hover img, +#on-this-day-section [style*="display: flex"][style*="cursor: pointer"]:hover img, +#on-this-day-section [style*="display: flex"][style*="cursor: pointer"]:hover img + div, +#on-this-day-section > div:last-child:hover, +#on-this-day-section [style*="position: relative; height: 400px"]:hover +{ +filter: blur(0px); +} diff --git a/plugins/SFWSwitch/sfw.css b/plugins/SFWSwitch/sfw.css index a8cc23e3..bf4f0a8c 100644 --- a/plugins/SFWSwitch/sfw.css +++ b/plugins/SFWSwitch/sfw.css @@ -3,6 +3,7 @@ /*Credit: fl0w#9497 */ /* === MORE BLUR === */ + /* scene */ .scene-card-preview, .vjs-poster, @@ -34,11 +35,13 @@ img.performer, /* tag */ .tag-card-image + { filter: blur(30px); } /* === LESS BLUR === */ + /* common */ .card-section-title, @@ -48,6 +51,7 @@ filter: blur(30px); h3.scene-header, .studio-logo, .image-thumbnail, +.TruncatedText.scene-card__description, /* image */ h3.image-header, @@ -57,20 +61,26 @@ h3.image-header, /* gallery */ h3.gallery-header, +.TruncatedText.gallery-card__description, /* studio */ .studio-details .logo, .studio-details > div > h2, +.studio-card__details, +.studio-parent-studios, /* tag */ .logo-container > .logo, -.logo-container > h2 +.logo-container > h2, +.TruncatedText.tag-description, +.tag-parent-tags { filter: blur(2px); } /* === UNBLUR ON HOVER === */ + /* common */ .thumbnail-section:hover *, .card:hover .card-section-title, @@ -87,6 +97,7 @@ div:hover > .scene-header, .scene-card-preview:hover, .scrubber-item:hover, .scene-image:hover, +.TruncatedText.scene-card__description:hover, /* image */ .image-image:hover, @@ -100,6 +111,7 @@ div:hover > .image-header, /* gallery */ div:hover > .gallery-header, table > tbody > tr > td:hover > a > img.w-100, +.TruncatedText.gallery-card__description:hover, /* performer */ img.performer:hover, @@ -107,10 +119,16 @@ img.performer:hover, /* studio */ .studio-details .logo:hover, .studio-details:hover > div > h2, +.studio-card__details:hover, +.studio-parent-studios:hover, + /* tag */ .logo-container > .logo:hover, -.logo-container:hover > h2 +.logo-container:hover > h2, +.TruncatedText.tag-description:hover, +.tag-parent-tags:hover + { filter: blur(0px); } diff --git a/plugins/SFWSwitch/sfwswitch.yml b/plugins/SFWSwitch/sfwswitch.yml index 9c4b7171..f8d576b1 100644 --- a/plugins/SFWSwitch/sfwswitch.yml +++ b/plugins/SFWSwitch/sfwswitch.yml @@ -1,9 +1,10 @@ name: SFW Switch description: Add a button to blur covers and images. -version: 1.3 +version: 1.4 url: https://discourse.stashapp.cc/t/sfw-switch/4658 ui: javascript: - sfw.js css: - - sfw.css \ No newline at end of file + - sfw.css + - additional_plugins.css \ No newline at end of file From a3eb5e05ef36d1090e0bfeaff9f16aba90dc6886 Mon Sep 17 00:00:00 2001 From: Stash-KennyG <138793998+Stash-KennyG@users.noreply.github.com> Date: Thu, 5 Mar 2026 07:20:20 -0500 Subject: [PATCH 22/51] [CJ's Card Tweaks] Enhancement: Extend to Include Stash Count (#671) Co-authored-by: KennyG Co-authored-by: DogmaDragon <103123951+DogmaDragon@users.noreply.github.com> --- plugins/cjCardTweaks/README.md | 5 + plugins/cjCardTweaks/cjCardTweaks.js | 148 +++++++++++++++++++++++++- plugins/cjCardTweaks/cjCardTweaks.yml | 8 +- 3 files changed, 157 insertions(+), 4 deletions(-) diff --git a/plugins/cjCardTweaks/README.md b/plugins/cjCardTweaks/README.md index 8de12288..f68c5235 100644 --- a/plugins/cjCardTweaks/README.md +++ b/plugins/cjCardTweaks/README.md @@ -20,3 +20,8 @@ Adds an additional dimension to the rating banners. ![unnamed_2](https://github.com/user-attachments/assets/f505417d-ed0c-40c4-9c78-647081a41307) Modify the performer cards to use a traditional profile design + +### Stash ID icon +![unnamed_3](https://github.com/user-attachments/assets/181fe3cd-b3e5-437d-8ded-7e48f2c0e446) + +Adds a box icon to performer cards that have one or more Stash IDs (GUIDs) attached. The icon appears in the top-left corner of the performer card thumbnail and displays a tooltip showing the count of Stash IDs when hovered. This helps quickly identify performers that are linked to external Stash databases. diff --git a/plugins/cjCardTweaks/cjCardTweaks.js b/plugins/cjCardTweaks/cjCardTweaks.js index 923e5640..beae48f6 100644 --- a/plugins/cjCardTweaks/cjCardTweaks.js +++ b/plugins/cjCardTweaks/cjCardTweaks.js @@ -26,7 +26,8 @@ if ( key === "fileCount" || key === "addBannerDimension" || - key === "performerProfileCards" + key === "performerProfileCards" || + key === "stashIDIcon" ) { acc[key] = settings[key]; } else { @@ -42,6 +43,8 @@ ".performer-card:hover img.performer-card-image{box-shadow: 0 0 0 rgb(0 0 0 / 20%), 0 0 6px rgb(0 0 0 / 90%);transition: box-shadow .5s .5s}@media (min-width: 1691px){.performer-recommendations .card .performer-card-image{height: unset}}button.btn.favorite-button.not-favorite,button.btn.favorite-button.favorite{transition: filter .5s .5s}.performer-card:hover .thumbnail-section button.btn.favorite-button.not-favorite, .performer-card:hover .thumbnail-section button.btn.favorite-button.favorite{filter: drop-shadow(0 0 2px rgba(0, 0, 0, .9))}.performer-card .thumbnail-section button.btn.favorite-button.not-favorite, .performer-card .thumbnail-section button.btn.favorite-button.favorite{top: 10px;filter: drop-shadow(0 2px 2px rgba(0, 0, 0, .9))}.item-list-container .performer-card__age,.recommendation-row .performer-card__age,.item-list-container .performer-card .card-section-title,.recommendation-row .performer-card .card-section-title,.item-list-container .performer-card .thumbnail-section,.recommendation-row .performer-card .thumbnail-section{display: flex;align-content: center;justify-content: center}.item-list-container .performer-card .thumbnail-section a,.recommendation-row .performer-card .thumbnail-section a{display: contents}.item-list-container .performer-card-image,.recommendation-row .performer-card-image{aspect-ratio: 1 / 1;display: flex;object-fit: cover;border: 3px solid var(--plex-yelow);border-radius: 50%;min-width: unset;position: relative;width: 58%;margin: auto;z-index: 1;margin-top: 1.5rem;box-shadow:0 13px 26px rgb(0 0 0 / 20%),0 3px 6px rgb(0 0 0 / 90%);object-position: center;transition: box-shadow .5s .5s}.item-list-container .performer-card hr,.recommendation-row .performer-card hr{width: 90%}.item-list-container .performer-card .fi,.recommendation-row .performer-card .fi{position: absolute;top: 81.5%;left: 69%;border-radius: 50% !important;background-size: cover;margin-left: -1px;height: 1.5rem;width: 1.5rem;z-index: 10;border: solid 2px #252525;box-shadow: unset}.item-list-container .performer-card .card-popovers .btn,.recommendation-row .performer-card .card-popovers .btn{font-size: 0.9rem}"; const RATING_BANNER_3D_STYLE = ".grid-card{overflow:unset}.detail-group .rating-banner-3d,.rating-banner{display:none}.grid-card:hover .rating-banner-3d{opacity:0;transition:opacity .5s}.rating-banner-3d{height:110px;left:-6px;overflow:hidden;position:absolute;top:-6px;width:110px}.rating-banner-3d span{box-shadow:0 5px 4px rgb(0 0 0 / 50%);position:absolute;display:block;width:170px;padding:10px 5px 10px 0;background-color:#ff6a07;color:#fff;font:700 1rem/1 Lato,sans-serif;text-shadow:0 1px 1px rgba(0,0,0,.2);text-transform:uppercase;text-align:center;letter-spacing:1px;right:-20px;top:24px;transform:rotate(-45deg)}.rating-banner-3d::before{top:0;right:0;position:absolute;z-index:-1;content:'';display:block;border:5px solid #a34405;border-top-color:transparent;border-left-color:transparent}.rating-banner-3d::after{bottom:0;left:0;position:absolute;z-index:-1;content:'';display:block;border:5px solid #963e04}"; + const STASH_ID_ICON_STYLE = + ".stash-id-count{display:inline-flex;align-items:center;flex-direction:row}.stash-id-count-number{display:inline-block;margin-right:0.25rem}.stash-id-icon{display:inline-flex;align-items:center}.stash-id-icon svg{width:0.875rem;height:0.875rem;fill:currentColor;color:#fff}"; /** * Element to inject custom CSS styles. @@ -54,6 +57,8 @@ styleElement.innerHTML += RATING_BANNER_3D_STYLE; if (SETTINGS.performerProfileCards) styleElement.innerHTML += PERFORMER_PROFILE_CARD_STYLE; + if (SETTINGS.stashIDIcon) + styleElement.innerHTML += STASH_ID_ICON_STYLE; function createElementFromHTML(htmlString) { const div = document.createElement("div"); @@ -93,7 +98,7 @@ } /** - * Handles gallery cards to specific paths in Stash. + * Handles gallery cards to specific paths in Stash. * * The supported paths are: * - /galleries @@ -207,6 +212,36 @@ cards.forEach((card) => { maybeAddFileCount(card, stashData, isContentCard); maybeAddDimensionToBanner(card); + if (cardClass === "performer-card") { + maybeAddStashIDIcon(card, stashData); + + // Also set up a MutationObserver to watch for card-popovers being added + if (SETTINGS.stashIDIcon && !card.querySelector(".stash-id-count")) { + const observer = new MutationObserver((mutations) => { + const cardPopovers = card.querySelector(".card-popovers.btn-group") || + card.querySelector(".card-popovers") || + card.querySelector('[role="group"].btn-group'); + if (cardPopovers && !cardPopovers.querySelector(".stash-id-count")) { + const link = card.querySelector(".thumbnail-section > a"); + if (link) { + const id = new URL(link.href).pathname.split("/").pop(); + const idNum = parseInt(id, 10); + // Query GraphQL for stash IDs + queryStashIDs(card, id, idNum); + observer.disconnect(); + } + } + }); + + observer.observe(card, { + childList: true, + subtree: true + }); + + // Disconnect after 5 seconds to avoid memory leaks + setTimeout(() => observer.disconnect(), 5000); + } + } }); } @@ -269,4 +304,113 @@ link.parentElement.appendChild(el); oldBanner.remove(); } + + /** + * Add Stash ID count and icon to performer cards in the card-popovers btn-group + * + * @param {Element} card - Card element from cards list. + * @param {Object} stashData - Data fetched from the GraphQL interceptor. e.g. stash.performers. + */ + function maybeAddStashIDIcon(card, stashData) { + if (!SETTINGS.stashIDIcon) return; + + // Verify this function was not run twice on the same card + const existingCount = card.querySelector(".stash-id-count"); + if (existingCount) return; + + const link = card.querySelector(".thumbnail-section > a"); + if (!link) return; + + const id = new URL(link.href).pathname.split("/").pop(); + const idNum = parseInt(id, 10); + + // Query GraphQL for stash IDs + queryStashIDs(card, id, idNum); + } + + /** + * Query GraphQL for performer stash IDs + * @param {Element} card - Card element + * @param {string} id - Performer ID as string + * @param {number} idNum - Performer ID as number + */ + async function queryStashIDs(card, id, idNum) { + const query = ` + query FindPerformer($id: ID!) { + findPerformer(id: $id) { + id + stash_ids { + endpoint + stash_id + } + } + } + `; + + const variables = { + id: idNum + }; + + try { + const response = await fetch('/graphql', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: query, + variables: variables + }) + }); + + const result = await response.json(); + + if (result.errors) return; + + const performer = result.data?.findPerformer; + if (!performer) return; + + const stashIDs = performer.stash_ids || []; + const stashIDCount = Array.isArray(stashIDs) ? stashIDs.length : 0; + + // Only show if count is greater than 0 + if (stashIDCount > 0) { + // Find card-popovers and add button + const cardPopovers = card.querySelector(".card-popovers.btn-group") || + card.querySelector(".card-popovers") || + card.querySelector('[role="group"].btn-group'); + + if (cardPopovers && !cardPopovers.querySelector(".stash-id-count")) { + addStashIDButton(cardPopovers, stashIDCount); + } + } + } catch (error) { + // On error, don't show anything (silent fail) + } + } + + /** + * Helper function to add the stash ID button to the card-popovers + */ + function addStashIDButton(cardPopovers, stashIDCount) { + // Check if already added + if (cardPopovers.querySelector(".stash-id-count")) return; + + // Box-open icon SVG (StashApp logo style - open box) + const boxIconSVG = ``; + + // Create a wrapper div similar to the tag-count structure + const wrapper = document.createElement("div"); + + // Create button with count FIRST, then icon (as requested) + const button = createElementFromHTML( + `` + ); + + wrapper.appendChild(button); + cardPopovers.appendChild(wrapper); + } })(); diff --git a/plugins/cjCardTweaks/cjCardTweaks.yml b/plugins/cjCardTweaks/cjCardTweaks.yml index 95b09393..a5affb60 100644 --- a/plugins/cjCardTweaks/cjCardTweaks.yml +++ b/plugins/cjCardTweaks/cjCardTweaks.yml @@ -1,7 +1,7 @@ name: CJ's Card Tweaks. # requires: CommunityScriptsUILibrary -description: Provides various tweaks for the Stash Cards. -version: 1.1 +description: Provides various tweaks for the Stash cards. +version: 1.2 url: https://discourse.stashapp.cc/t/cjs-card-tweaks/1342 ui: requires: @@ -25,3 +25,7 @@ settings: displayName: Performer profile cards description: "Tweaks performer cards to use a traditional profile design." type: BOOLEAN + stashIDIcon: + displayName: Stash ID icon + description: "Adds a Stash ID icon to the performer cards." + type: BOOLEAN From 13ecf3f9bc5c757cd45f7200407724e9e01bc4a4 Mon Sep 17 00:00:00 2001 From: HavenCTO Date: Sun, 15 Mar 2026 17:50:11 -0400 Subject: [PATCH 23/51] [Haven VLM Connector] pydantic version to latest (#683) --- plugins/AHavenVLMConnector/ahavenvlmconnector.yml | 2 +- plugins/AHavenVLMConnector/haven_vlm_connector.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml index e77c0e4f..361f1f67 100644 --- a/plugins/AHavenVLMConnector/ahavenvlmconnector.yml +++ b/plugins/AHavenVLMConnector/ahavenvlmconnector.yml @@ -1,7 +1,7 @@ name: Haven VLM Connector # requires: PythonDepManager description: Tag videos with Vision-Language Models using any OpenAI-compatible VLM endpoint -version: 1.0.1 +version: 1.0.2 url: https://discourse.stashapp.cc/t/haven-vlm-connector/5464 exec: - python diff --git a/plugins/AHavenVLMConnector/haven_vlm_connector.py b/plugins/AHavenVLMConnector/haven_vlm_connector.py index 85921c1d..62c70dde 100644 --- a/plugins/AHavenVLMConnector/haven_vlm_connector.py +++ b/plugins/AHavenVLMConnector/haven_vlm_connector.py @@ -33,7 +33,7 @@ ensure_import( "stashapi:stashapp-tools==0.2.58", "aiohttp==3.12.13", - "pydantic==2.11.7", + "pydantic==2.12.5", "vlm-engine==0.9.3", "pyyaml==6.0.2" ) From f64c2b7fee00dc4fa48918958a030850d4731387 Mon Sep 17 00:00:00 2001 From: speckofthecosmos Date: Sun, 15 Mar 2026 17:54:26 -0400 Subject: [PATCH 24/51] Add mobileWallLayout plugin (#680) Co-authored-by: Claude Sonnet 4.6 --- plugins/mobileWallLayout/README.md | 26 ++++++ plugins/mobileWallLayout/mobileWallLayout.js | 86 +++++++++++++++++++ plugins/mobileWallLayout/mobileWallLayout.yml | 9 ++ 3 files changed, 121 insertions(+) create mode 100644 plugins/mobileWallLayout/README.md create mode 100644 plugins/mobileWallLayout/mobileWallLayout.js create mode 100644 plugins/mobileWallLayout/mobileWallLayout.yml diff --git a/plugins/mobileWallLayout/README.md b/plugins/mobileWallLayout/README.md new file mode 100644 index 00000000..0a1a3e99 --- /dev/null +++ b/plugins/mobileWallLayout/README.md @@ -0,0 +1,26 @@ +# Mobile Wall Layout + +Makes the wall-mode gallery render as a single full-width column on mobile +devices, on the **Markers** (`/scenes/markers`) and **Images** (`/images`) pages. + +By default, Stash's wall mode uses `react-photo-gallery`, which calculates +`position: absolute` offsets for a multi-column brick layout. On small screens +this produces items that are too small to comfortably tap and browse. This +plugin overrides those offsets so each item spans the full width of the screen, +making marker previews and images easy to scroll through on a phone. + +## Behaviour + +- Applies only when `window.innerWidth ≤ 960px` — covers all current phones + including large flagships in landscape (e.g. iPhone 16 Pro Max: 932px, + Galaxy S24 Ultra: 915px), while excluding tablets (iPad mini landscape: 1024px). +- Activates and deactivates automatically as you navigate between pages. +- Re-evaluates on orientation change (portrait ↔ landscape). +- Has no effect on desktop or tablet viewports. + +## Implementation note + +The fix injects a `