diff --git a/plugins/480p.png b/plugins/480p.png new file mode 100644 index 00000000..47a8642d Binary files /dev/null and b/plugins/480p.png differ diff --git a/plugins/GroupDetails/GroupDetails.css b/plugins/GroupDetails/GroupDetails.css new file mode 100644 index 00000000..e7b61990 --- /dev/null +++ b/plugins/GroupDetails/GroupDetails.css @@ -0,0 +1,101 @@ +.group-card .card-popovers { + flex-wrap: wrap; +} + +/* Stacked layout: line1 = duration + scene count; line2 = resolution (so extra chips stay on their own row). */ +.group-card .card-popovers .gd-metrics-row { + display: flex; + flex-direction: column; + align-items: stretch; + width: 100%; + flex: 1 1 100%; + box-sizing: border-box; + gap: 0.12rem; + padding: 0.15rem 2px; +} + +.group-card .card-popovers .gd-metrics-line1 { + display: grid; + grid-template-columns: 1fr; + align-items: center; + width: 100%; +} + +.group-card .card-popovers .gd-metrics-line1 .scene-count { + justify-self: center; +} + +.group-card .card-popovers .gd-metrics-line2 { + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; +} + +.group-card .card-popovers .gd-res-bucket { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 1.15em; + line-height: 1; + /* Let hover hit the wrapper so the native `title` tooltip on .gd-res-bucket shows (SVG children do not inherit it). */ + cursor: help; +} + +.group-card .card-popovers .gd-res-bucket > * { + pointer-events: none; +} + +.group-card .card-popovers .gd-resolution-png { + height: 1em; + width: auto; + max-width: 2.4em; + display: block; + object-fit: contain; +} + +.group-card .card-popovers .gd-res-bucket-fallback { + font-size: 0.68rem; + font-weight: 600; + letter-spacing: 0.04em; + opacity: 0.95; +} + +.group-card .card-popovers .gd-stat { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 0; + padding: 0.2rem 0.15rem; + font-size: 0.9rem; + line-height: 1.1; + color: var(--text, #d5dbe3); + opacity: 0.95; + white-space: nowrap; +} + +.group-card .gd-date-line { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; +} + +.group-card .gd-date-text { + min-width: 0; +} + +.group-card .gd-date-duration { + margin-left: 0.5rem; + margin-right: 0; + margin-inline-start: 0.5rem; + margin-inline-end: 0; + padding: 0; + justify-content: flex-end; + font-size: inherit; + line-height: inherit; + font-weight: inherit; + color: inherit; + opacity: inherit; + cursor: help; +} diff --git a/plugins/GroupDetails/GroupDetails.js b/plugins/GroupDetails/GroupDetails.js new file mode 100644 index 00000000..e563739a --- /dev/null +++ b/plugins/GroupDetails/GroupDetails.js @@ -0,0 +1,585 @@ +"use strict"; + +(function () { + var ROOT_ID = "root"; + var ROUTE_PREFIX = "/groups"; + var PLUGIN_ID = "GroupDetails"; + var GROUP_METRICS_QUERY = + "query GroupDetailsMetrics($id: ID!) {" + + " findGroup(id: $id) {" + + " id " + + " scenes { " + + " id " + + " title " + + " files { duration height } " + + " groups { group { id } scene_index } " + + " } " + + " }" + + "}"; + + var state = { + observer: null, + attachedRoot: null, + retryTimer: null, + applyingDomEnhancements: false, + cacheByGroupId: new Map(), + inFlightByGroupId: new Map(), + includeAllScenes: false, + tooltipDelegateBound: false, + }; + + async function gql(query, variables) { + var res = await fetch("/graphql", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ query: query, variables: variables || {} }), + }); + var j = await res.json(); + if (j.errors && j.errors.length) { + throw new Error( + j.errors.map(function (e) { + return e.message; + }).join("; ") + ); + } + return j.data; + } + + function routeMatches() { + var p = window.location.pathname || ""; + return p === ROUTE_PREFIX || p.indexOf(ROUTE_PREFIX + "/") === 0; + } + + function parseGroupIdFromHref(href) { + if (!href) return null; + var match = String(href).match(/\/groups\/(\d+)/); + return match ? String(match[1]) : null; + } + + function parseGroupIdFromCard(card) { + if (!card) return null; + var header = card.querySelector("a.group-card-header"); + if (header && header.getAttribute("href")) { + return parseGroupIdFromHref(header.getAttribute("href")); + } + var firstLink = card.querySelector("a[href*='/groups/']"); + if (firstLink && firstLink.getAttribute("href")) { + return parseGroupIdFromHref(firstLink.getAttribute("href")); + } + return null; + } + + function sceneIndexForGroup(scene, groupId) { + var groups = (scene && scene.groups) || []; + var gid = String(groupId); + for (var i = 0; i < groups.length; i++) { + var g = groups[i]; + if (g && g.group && String(g.group.id) === gid) return g.scene_index; + } + return undefined; + } + + function isEligibleSceneIndex(idx) { + if (idx == null) return true; + var n = Number(idx); + return Number.isFinite(n) && n >= 0 && n <= 89; + } + + function readBoolSetting(raw, fallback) { + if (raw === true || raw === "true") return true; + if (raw === false || raw === "false") return false; + return fallback; + } + + async function loadPluginSettings() { + try { + var data = await gql("query GdCfg { configuration { plugins } }"); + var plug = data.configuration && data.configuration.plugins; + var cfg = null; + if (plug && typeof plug === "object") { + cfg = plug[PLUGIN_ID] || null; + if (!cfg) { + var k = Object.keys(plug).find(function (key) { + return String(key).toLowerCase() === String(PLUGIN_ID).toLowerCase(); + }); + if (k) cfg = plug[k]; + } + } + var next = false; + if (cfg && typeof cfg === "object") { + next = readBoolSetting(cfg.includeAllScenes, false); + } + if (next !== state.includeAllScenes) { + state.includeAllScenes = next; + state.cacheByGroupId.clear(); + state.inFlightByGroupId.clear(); + } + } catch (e) { + state.includeAllScenes = false; + } + } + + function metricsCacheKey(groupId) { + return String(groupId) + ":" + (state.includeAllScenes ? "1" : "0"); + } + + function getSceneDurationSeconds(scene) { + var files = (scene && scene.files) || []; + var maxDur = 0; + for (var i = 0; i < files.length; i++) { + var dur = Number(files[i] && files[i].duration); + if (Number.isFinite(dur) && dur > maxDur) maxDur = dur; + } + return maxDur; + } + + function getSceneVerticalPixels(scene) { + var files = (scene && scene.files) || []; + var maxHeight = 0; + for (var i = 0; i < files.length; i++) { + var h = Number(files[i] && files[i].height); + if (Number.isFinite(h) && h > maxHeight) maxHeight = h; + } + return maxHeight; + } + + function formatDuration(totalSeconds) { + var s = Math.max(0, Math.round(Number(totalSeconds) || 0)); + var hrs = Math.floor(s / 3600); + var mins = Math.floor((s % 3600) / 60); + var secs = s % 60; + return hrs + ":" + String(mins).padStart(2, "0") + ":" + String(secs).padStart(2, "0"); + } + + function formatSceneTooltipLine(sceneIndex, title, durationSec) { + var t = String(title || "").replace(/\s+/g, " ").trim(); + if (!t) t = "(no title)"; + var hasIndex = !(sceneIndex == null || sceneIndex === ""); + if (hasIndex) return String(sceneIndex) + ". " + t + " " + formatDuration(durationSec); + return t + " " + formatDuration(durationSec); + } + + /** For ordering only: missing index sorts like 90. */ + function sceneIndexSortKey(idx) { + if (idx == null || idx === "") return 90; + var n = Number(idx); + return Number.isFinite(n) ? n : 90; + } + + function computeMetrics(groupId, scenes, includeAllScenes) { + var totalDurationSec = 0; + var verticalSum = 0; + var verticalCount = 0; + var totalFileCount = 0; + var list = scenes || []; + var applySceneIndexFilter = + !includeAllScenes && list.length !== 1; + var rows = []; + + for (var i = 0; i < list.length; i++) { + var scene = list[i]; + var idx = sceneIndexForGroup(scene, groupId); + if (applySceneIndexFilter && !isEligibleSceneIndex(idx)) continue; + var duration = getSceneDurationSeconds(scene); + rows.push({ scene: scene, idx: idx, duration: duration }); + } + + rows.sort(function (a, b) { + var ka = sceneIndexSortKey(a.idx); + var kb = sceneIndexSortKey(b.idx); + if (ka !== kb) return ka - kb; + var da = Number(a.duration) || 0; + var db = Number(b.duration) || 0; + if (db !== da) return db - da; + var ida = String((a.scene && a.scene.id) || ""); + var idb = String((b.scene && b.scene.id) || ""); + return ida < idb ? -1 : ida > idb ? 1 : 0; + }); + + for (var fc = 0; fc < rows.length; fc++) { + var filesForCount = (rows[fc].scene && rows[fc].scene.files) || []; + totalFileCount += filesForCount.length; + } + var bypassDurationFilterForResolution = totalFileCount === 1; + + var durationLines = []; + for (var j = 0; j < rows.length; j++) { + var row = rows[j]; + var scene = row.scene; + var idx = row.idx; + var duration = row.duration; + totalDurationSec += duration; + durationLines.push( + formatSceneTooltipLine(idx, scene && scene.title, duration) + ); + + if (bypassDurationFilterForResolution || duration > 360) { + var height = getSceneVerticalPixels(scene); + if (height > 0) { + verticalSum += height; + verticalCount += 1; + } + } + } + + var durationHeader = + "Scenes in total duration:\n"; + var durationTooltip = + durationLines.length > 0 + ? durationHeader + durationLines.join("\n") + : "No eligible scenes for total duration."; + var avgPx = + verticalCount > 0 ? Math.round(verticalSum / verticalCount) : null; + var resolutionTooltip = + avgPx == null || verticalCount < 1 + ? "Resolution Average: \u2014" + : "Resolution Average: " + avgPx + "p"; + + return { + totalDurationSec: Math.round(totalDurationSec), + averageVerticalPixels: avgPx, + verticalSampleCount: verticalCount, + totalFileCount: totalFileCount, + durationTooltip: durationTooltip, + resolutionTooltip: resolutionTooltip, + }; + } + + var RESOLUTION_PNG_LADDER = [ + { value: 4320, label: "8k", file: "8k.png" }, + { value: 3160, label: "6k", file: "6k.png" }, + { value: 2880, label: "5k", file: "5k.png" }, + { value: 2160, label: "4k", file: "4k.png" }, + { value: 1440, label: "2k", file: "2k.png" }, + { value: 1080, label: "1080p", file: "1080p.png" }, + { value: 720, label: "720p", file: "720p.png" }, + { value: 480, label: "480p", file: "480p.png" }, + { value: 360, label: "360p", file: "360p.png" }, + { value: 240, label: "240p", file: "240p.png" }, + ]; + var LOWEST_RESOLUTION_PNG = { value: 144, label: "144p", file: "144p.png" }; + var RESOLUTION_MATCH_RATIO = 0.98; // 2% tolerance + var LOWEST_RESOLUTION_CUTOFF = 234; + + function pickResolutionPngSpec(avgHeightPx) { + var h = Math.round(Number(avgHeightPx) || 0); + if (!Number.isFinite(h) || h <= 0) return null; + if (h < LOWEST_RESOLUTION_CUTOFF) return LOWEST_RESOLUTION_PNG; + for (var i = 0; i < RESOLUTION_PNG_LADDER.length; i++) { + var spec = RESOLUTION_PNG_LADDER[i]; + if (h >= Math.round(spec.value * RESOLUTION_MATCH_RATIO)) return spec; + } + return LOWEST_RESOLUTION_PNG; + } + + function getEmbeddedResolutionImage(fileName) { + var map = + typeof window !== "undefined" && window.GroupDetailsImages + ? window.GroupDetailsImages + : null; + if (!map) return ""; + var key = String(fileName || ""); + var uri = map[key]; + return typeof uri === "string" ? uri : ""; + } + + function createResolutionPng(spec) { + if (!spec || !spec.file) return null; + var src = getEmbeddedResolutionImage(spec.file); + if (!src) return null; + var img = document.createElement("img"); + img.className = "gd-resolution-png"; + img.alt = spec.label; + img.setAttribute("aria-hidden", "true"); + img.src = src; + return img; + } + + function buildResolutionBucket(id, avgPixels, resolutionTooltip, totalFileCount) { + var wrap = document.createElement("span"); + wrap.id = id; + wrap.className = "gd-stat gd-res-bucket"; + wrap.setAttribute("role", "img"); + var tip = resolutionTooltip || ""; + var h = avgPixels == null ? NaN : Math.round(Number(avgPixels)); + if (!Number.isFinite(h) || h <= 0) { + if ((Number(totalFileCount) || 0) > 1) { + wrap.textContent = "\u2014"; + applySceneListTooltip(wrap, tip); + } else { + // No files (or only one file with no usable height): render nothing. + wrap.textContent = ""; + applySceneListTooltip(wrap, ""); + } + return wrap; + } + var spec = pickResolutionPngSpec(h); + if (spec) { + wrap.setAttribute("data-gd-resolution-tier", spec.label); + } + var img = createResolutionPng(spec); + if (img) wrap.appendChild(img); + else { + var fb = document.createElement("span"); + fb.className = "gd-res-bucket-fallback"; + fb.textContent = h + "p"; + wrap.appendChild(fb); + } + applySceneListTooltip(wrap, tip); + return wrap; + } + + async function fetchMetricsForGroup(groupId) { + var data = await gql(GROUP_METRICS_QUERY, { id: String(groupId) }); + var group = data && data.findGroup; + return computeMetrics( + groupId, + (group && group.scenes) || [], + state.includeAllScenes + ); + } + + async function getMetricsForGroup(groupId) { + if (!groupId) return null; + var gid = String(groupId); + var key = metricsCacheKey(gid); + if (state.cacheByGroupId.has(key)) return state.cacheByGroupId.get(key); + if (state.inFlightByGroupId.has(key)) return state.inFlightByGroupId.get(key); + + var p = fetchMetricsForGroup(gid) + .then(function (metrics) { + state.cacheByGroupId.set(key, metrics); + state.inFlightByGroupId.delete(key); + return metrics; + }) + .catch(function (e) { + state.inFlightByGroupId.delete(key); + throw e; + }); + state.inFlightByGroupId.set(key, p); + return p; + } + + function applySceneListTooltip(el, tip) { + var s = tip == null ? "" : String(tip); + if (s.length > 0) { + el.setAttribute("data-gd-full-title", s); + el.setAttribute("title", s); + } else { + el.removeAttribute("data-gd-full-title"); + el.removeAttribute("title"); + } + } + + function ensureTooltipRefreshDelegate() { + if (state.tooltipDelegateBound) return; + state.tooltipDelegateBound = true; + document.addEventListener( + "pointerenter", + function (ev) { + var raw = ev.target; + var el = raw && raw.nodeType === 1 ? raw : raw && raw.parentElement; + if (!el || !el.closest) return; + var host = el.closest("[data-gd-full-title]"); + if (!host) return; + var full = host.getAttribute("data-gd-full-title"); + if (full != null) host.setAttribute("title", full); + }, + true + ); + } + + function buildStatNode(id, text, title) { + var el = document.createElement("span"); + el.id = id; + el.className = "gd-stat"; + el.textContent = text; + applySceneListTooltip(el, title); + return el; + } + + function findDateLineInCard(card) { + if (!card || !card.querySelectorAll) return null; + var re = /^\d{4}-\d{2}-\d{2}$/; + var nodes = card.querySelectorAll("time, small, span, div, p"); + for (var i = 0; i < nodes.length; i++) { + var el = nodes[i]; + if (!el || !el.textContent) continue; + if (el.closest && el.closest(".card-popovers")) continue; + if (el.querySelector && el.querySelector(".gd-date-duration")) continue; + var raw = String(el.textContent || "").trim(); + if (re.test(raw)) return el; + } + return null; + } + + function mountDurationOnDateLine(card, durationNode) { + if (!card || !durationNode) return false; + var old = card.querySelectorAll(".gd-date-duration"); + for (var i = 0; i < old.length; i++) { + if (old[i] && old[i].parentNode) old[i].parentNode.removeChild(old[i]); + } + var line = findDateLineInCard(card); + if (!line) return false; + + line.classList.add("gd-date-line"); + var textSpan = line.querySelector(".gd-date-text"); + if (!textSpan) { + var original = String(line.textContent || "").trim(); + line.textContent = ""; + textSpan = document.createElement("span"); + textSpan.className = "gd-date-text"; + textSpan.textContent = original; + line.appendChild(textSpan); + } + durationNode.classList.add("gd-date-duration"); + line.appendChild(durationNode); + return true; + } + + function injectMetricsIntoCard(card, metrics) { + if (!card || !metrics) return; + var popovers = card.querySelector(".card-popovers"); + if (!popovers) return; + var sceneCount = popovers.querySelector(".scene-count"); + if (!sceneCount) return; + + var oldRow = popovers.querySelector(".gd-metrics-row"); + if (oldRow && oldRow.parentNode) oldRow.parentNode.removeChild(oldRow); + var oldRight = popovers.querySelector(".gd-stat-right"); + if (oldRight && oldRight.parentNode) oldRight.parentNode.removeChild(oldRight); + + var durationNode = buildStatNode( + "gd-stat-duration-" + Date.now(), + formatDuration(metrics.totalDurationSec), + metrics.durationTooltip || "" + ); + durationNode.classList.add("gd-duration"); + + var resolutionNode = buildResolutionBucket( + "gd-stat-right-" + Date.now(), + metrics.averageVerticalPixels, + metrics.resolutionTooltip || "", + metrics.totalFileCount + ); + resolutionNode.classList.add("gd-stat-right"); + resolutionNode.classList.add("chip"); + popovers.appendChild(resolutionNode); + + mountDurationOnDateLine(card, durationNode); + } + + async function decorateGroupCard(card) { + var groupId = parseGroupIdFromCard(card); + if (!groupId) return; + var metrics = await getMetricsForGroup(groupId); + injectMetricsIntoCard(card, metrics); + } + + function applyDomEnhancements() { + if (state.applyingDomEnhancements) return; + state.applyingDomEnhancements = true; + + var cards = Array.prototype.slice.call( + document.querySelectorAll("div.group-card") + ); + Promise.all( + cards.map(function (card) { + return decorateGroupCard(card).catch(function () { + // Ignore per-card failures so one bad response does not block others. + }); + }) + ).finally(function () { + state.applyingDomEnhancements = false; + }); + } + + function detachObserver() { + if (state.observer) { + state.observer.disconnect(); + state.observer = null; + } + state.attachedRoot = null; + } + + function clearRetryTimer() { + if (state.retryTimer) { + clearInterval(state.retryTimer); + state.retryTimer = null; + } + } + + function attach() { + if (!routeMatches()) { + detachObserver(); + return false; + } + ensureTooltipRefreshDelegate(); + var root = document.getElementById(ROOT_ID); + if (!root) return false; + + if (state.attachedRoot === root && state.observer) { + loadPluginSettings() + .then(function () {}) + .catch(function () {}) + .finally(function () { + applyDomEnhancements(); + }); + return true; + } + + detachObserver(); + state.cacheByGroupId.clear(); + state.inFlightByGroupId.clear(); + + var obs = new MutationObserver(function () { + applyDomEnhancements(); + }); + obs.observe(root, { childList: true, subtree: true }); + state.observer = obs; + state.attachedRoot = root; + + loadPluginSettings() + .then(function () {}) + .catch(function () {}) + .finally(function () { + applyDomEnhancements(); + }); + return true; + } + + function scheduleAttachRetries() { + clearRetryTimer(); + state.retryTimer = setInterval(function () { + try { + if (!routeMatches()) { + detachObserver(); + return; + } + if (attach()) clearRetryTimer(); + } catch (e) { + // Ignore transient route/render timing errors. + } + }, 500); + setTimeout(clearRetryTimer, 60000); + } + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", function () { + attach(); + scheduleAttachRetries(); + }); + } else { + attach(); + scheduleAttachRetries(); + } + + window.addEventListener("popstate", function () { + attach(); + scheduleAttachRetries(); + }); + window.addEventListener("hashchange", function () { + attach(); + scheduleAttachRetries(); + }); +})(); diff --git a/plugins/GroupDetails/GroupDetails.yml b/plugins/GroupDetails/GroupDetails.yml new file mode 100644 index 00000000..81391ec1 --- /dev/null +++ b/plugins/GroupDetails/GroupDetails.yml @@ -0,0 +1,19 @@ +name: Group Details +description: Adds group-card metrics for filtered duration and average vertical resolution. +version: 0.2.1 +url: https://github.com/stashapp/CommunityScripts/tree/main/plugins/GroupDetails +ui: + javascript: + - images.js + - GroupDetails.js + css: + - GroupDetails.css + +settings: + includeAllScenes: + displayName: Include all scenes + description: >- + When enabled, duration and average resolution include every scene linked to the group. + When disabled (default), scenes are limited to those with scene_index null or 0..89 for this group, + except when the group has only one scene (that scene is always included). + type: BOOLEAN diff --git a/plugins/GroupDetails/README.md b/plugins/GroupDetails/README.md new file mode 100644 index 00000000..2ab5f1df --- /dev/null +++ b/plugins/GroupDetails/README.md @@ -0,0 +1,98 @@ +# Group Details + +`Group Details` is a UI plugin for Stash group card. + +## Screenshot + +![Group Details screenshot](./screenshot.png) + +## What It Adds + +- **Date line:** appends total duration (`H:MM:SS`) to the right side of the date row. +- **Chip list:** appends a resolution chip (PNG badge) to the end of `.card-popovers`. +- **Tooltips:** duration and resolution both expose native `title` tooltips. + +## Data Source + +Metrics are computed in-browser from GraphQL `findGroup` scene data (`id`, `title`, `files { duration height }`, `groups { group { id } scene_index }`). + +## Scene Filtering + +When **Include all scenes** is disabled (default), scenes are included only if `scene_index` is: + +- `null`, or +- an integer in `0..89` + +Exception: if the group has exactly **one scene**, scene-index filtering is bypassed for that group. + +When **Include all scenes** is enabled, all returned scenes are included regardless of `scene_index`. + +![Group Details Settings screenshot](./details.png) + +## Sorting + +Duration tooltip scene lines are sorted by: + +1. `scene_index` ascending (`null` sorts as `90`) +2. duration descending +3. scene `id` ascending (stable tie-break) + +## Duration Metric + +- Uses each included scene's **max file duration**. +- Card value is total duration displayed as `H:MM:SS`. +- Tooltip lists every included scene as: + - `N. Title H:MM:SS` when `scene_index` is present + - `Title H:MM:SS` when `scene_index` is null + +## Resolution Metric + +Average resolution uses vertical pixels (`height`) from each included scene's tallest file: + +- For groups with **exactly one total file**, the duration gate is bypassed. +- Otherwise, only scenes with `duration > 360` are eligible. +- Resolution average is `round(sum(height) / count)`. +- Tooltip format is: + - `Resolution Average: p` + - or `Resolution Average: —` when no eligible average exists. + +Resolution chip empty/dash behavior: + +- If there are no files (or single-file case with unusable height): render nothing. +- If `totalFileCount > 1` and no eligible average: render `—`. + +## Resolution Badge Mapping + +The plugin picks a PNG badge using a 2% tolerance (`>= 98%` of target resolution): + +- `< 234` -> `144p.png` +- then highest match from: + - `240`, `360`, `480`, `720`, `1080`, `1440 (2k)`, `2160 (4k)`, `2880 (5k)`, `3160 (6k)`, `4320 (8k)` + +## Assets And Build + +Badges are authored as PNG files in `assets/` and embedded into `images.js` as base64 data URIs. + +- Source files: `plugins/GroupDetails/assets/*.png` +- Generated file: `plugins/GroupDetails/images.js` + +Regenerate `images.js` after changing PNGs: + +```bash +bash build.sh +``` + +`build.sh` reads `assets/*.png`, sorts filenames deterministically, and rewrites `images.js`. + +## Updates Not Showing? + +After editing plugin files, perform a **full page reload** (F5 / Ctrl+Shift+R). In-app navigation can keep an older script in memory. + +## Gen AI Assisted Plugin Authorship +This plugin was generated with the help of Generative AI (Cursor). + +Per the draft guidelines of [#678] +- ✅ LLM use is openly disclosed. +- ✅ Code is reviewed by a human. +- ✅ Human testing and validation was performed. +- ✅ You take full responsibility for the code (including license compliance). \ No newline at end of file diff --git a/plugins/GroupDetails/assets/.gitkeep b/plugins/GroupDetails/assets/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/plugins/GroupDetails/assets/.gitkeep @@ -0,0 +1 @@ + diff --git a/plugins/GroupDetails/assets/1080p.png b/plugins/GroupDetails/assets/1080p.png new file mode 100644 index 00000000..cd5f49b1 Binary files /dev/null and b/plugins/GroupDetails/assets/1080p.png differ diff --git a/plugins/GroupDetails/assets/144p.png b/plugins/GroupDetails/assets/144p.png new file mode 100644 index 00000000..25b98c49 Binary files /dev/null and b/plugins/GroupDetails/assets/144p.png differ diff --git a/plugins/GroupDetails/assets/240p.png b/plugins/GroupDetails/assets/240p.png new file mode 100644 index 00000000..23582435 Binary files /dev/null and b/plugins/GroupDetails/assets/240p.png differ diff --git a/plugins/GroupDetails/assets/2k.png b/plugins/GroupDetails/assets/2k.png new file mode 100644 index 00000000..9a413062 Binary files /dev/null and b/plugins/GroupDetails/assets/2k.png differ diff --git a/plugins/GroupDetails/assets/360p.png b/plugins/GroupDetails/assets/360p.png new file mode 100644 index 00000000..98fcb7a3 Binary files /dev/null and b/plugins/GroupDetails/assets/360p.png differ diff --git a/plugins/GroupDetails/assets/480p.png b/plugins/GroupDetails/assets/480p.png new file mode 100644 index 00000000..e752e90d Binary files /dev/null and b/plugins/GroupDetails/assets/480p.png differ diff --git a/plugins/GroupDetails/assets/4k.png b/plugins/GroupDetails/assets/4k.png new file mode 100644 index 00000000..fda73dcd Binary files /dev/null and b/plugins/GroupDetails/assets/4k.png differ diff --git a/plugins/GroupDetails/assets/5k.png b/plugins/GroupDetails/assets/5k.png new file mode 100644 index 00000000..9e566bcc Binary files /dev/null and b/plugins/GroupDetails/assets/5k.png differ diff --git a/plugins/GroupDetails/assets/6k.png b/plugins/GroupDetails/assets/6k.png new file mode 100644 index 00000000..bf8dbb64 Binary files /dev/null and b/plugins/GroupDetails/assets/6k.png differ diff --git a/plugins/GroupDetails/assets/720p.png b/plugins/GroupDetails/assets/720p.png new file mode 100644 index 00000000..6576a7d5 Binary files /dev/null and b/plugins/GroupDetails/assets/720p.png differ diff --git a/plugins/GroupDetails/assets/8k.png b/plugins/GroupDetails/assets/8k.png new file mode 100644 index 00000000..e803c4b9 Binary files /dev/null and b/plugins/GroupDetails/assets/8k.png differ diff --git a/plugins/GroupDetails/build.sh b/plugins/GroupDetails/build.sh new file mode 100644 index 00000000..d35a0dea --- /dev/null +++ b/plugins/GroupDetails/build.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ASSET_DIR="${SCRIPT_DIR}/assets" +OUT_FILE="${SCRIPT_DIR}/images.js" + +if [[ ! -d "${ASSET_DIR}" ]]; then + echo "error: assets directory not found: ${ASSET_DIR}" >&2 + echo "create it and add PNG files, then run this script again." >&2 + exit 1 +fi + +shopt -s nullglob +pngs=("${ASSET_DIR}"/*.png) +shopt -u nullglob + +if [[ ${#pngs[@]} -eq 0 ]]; then + echo "error: no PNG files found in ${ASSET_DIR}" >&2 + exit 1 +fi + +python3 - "${ASSET_DIR}" "${OUT_FILE}" <<'PY' +import base64 +import pathlib +import sys + +asset_dir = pathlib.Path(sys.argv[1]) +out_file = pathlib.Path(sys.argv[2]) + +# Deterministic ordering for clean diffs. +files = sorted(asset_dir.glob("*.png"), key=lambda p: p.name.lower()) + +lines = [ + '"use strict";', + "(function () {", + " var MAP = {", +] + +for p in files: + b64 = base64.b64encode(p.read_bytes()).decode("ascii") + lines.append(f' "{p.name}": "data:image/png;base64,{b64}",') + +lines.extend([ + " };", + " window.GroupDetailsImages = MAP;", + "})();", + "", +]) + +out_file.write_text("\n".join(lines), encoding="utf-8") +print(f"wrote {out_file} with {len(files)} image(s)") +PY diff --git a/plugins/GroupDetails/details.png b/plugins/GroupDetails/details.png new file mode 100644 index 00000000..3f474d6c Binary files /dev/null and b/plugins/GroupDetails/details.png differ diff --git a/plugins/GroupDetails/images.js b/plugins/GroupDetails/images.js new file mode 100644 index 00000000..e0716eca --- /dev/null +++ b/plugins/GroupDetails/images.js @@ -0,0 +1,17 @@ +"use strict"; +(function () { + var MAP = { + "1080p.png": "data:image/png;base64,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", + "144p.png": "data:image/png;base64,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", + "240p.png": "data:image/png;base64,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", + "2k.png": "data:image/png;base64,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", + "360p.png": "data:image/png;base64,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", + "480p.png": "data:image/png;base64,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", + "4k.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAFEUlEQVR42u2da0xbZRjH/6cBFijQZY4MLJnLPrjEjbszMeF+26bR6Jx+UO7bzBK/KZeuXaGs0IG6mLkBhUIpUAqILDNq5u3DvGzcyk0zFzHZkmlcnLGLlUsIo/XDXAK0cA7sQ99z+vw+vufl5Mn7/70PPSenPQDh13B8E3bs3OOmZRIvf97+hduUABS8f4jACQn/5vR1WkERsvvJvbwScOuFT8FLT4TVEnDewqfgpS3Ccglk9D/f/1ietWz1Qdr90sVbtjLa/f7dBWS0+/27C8hoSfwbEoAEIEgAwm8JEFOx9+8v4fkXX8b1n2/wzh0d/B5RUZGCzvvCS0cwMTm15vFopRJDV68IrnNicgqv5xXh35mZdefF7NuL3u4OKBQK6gBCuNBoFBS+LxmfmBRN+KISYHr6V5w738B0jWPjE3gjv5g3/NiYfUyELxoBlpaW8HaZCouLi8zWaB8bFxx+j9XCRPiiEaDZZMbk1I/M1jdqH0NeQQlmZmfXDz82hpmdL5oPgTdv3cLZD86xHX5hCWZn5/jDt1oQHh5Ol4FCcblcKC1XY2Fhgcn6hkfsgsKPi4tlMnzmBWi3dGFk1O4x/nhUFBPhFxQfFXX4TAtw+7ffUf/+WY9xjuNgqKn2cfijyC/i3/nx/4cfFhbG7CZjUgC3242yCjXm5uY9jhUV5OGZ/Uk+q21oeAT5RUe91rY6/B7Gw2dWAKutF1evDXqMRyuVUJWX+qyuwaFh5Bcd4w0/IT5OFOEzKcAfd+6g1lDv9Vj9GT3k8hCf1HVtcAgFxccxP88fvk0k4TMpQLnqlNfr6VdfOYy01BSf1OS450BhyZu84ScmxD8IPzQUYoGp+wB9/QO48u13HuMR27ejSqv2WV18Lf9h+N1d7aIKn6kOcPfuX6jWG7weq9XrsHWrgtlFTEpMEGX4THWAk5pKOJ1Oj/FDB3Px3KEDzIcfKpdDjDDRAS598im+/Pobj3GFQgGDXsf0Au7a9QRCgoMhVnwuwN8OByqr9V6PVWnViIiIYHoBBy5eQmn5SbhcLhJgM2i0Ojgc9zzG01KS8dqRw6JYxI8+voiyCjXcbjcJsBEuf/EVPvv8sse4XB6C+roaUS1kX/8AylUa0UngUwHW+tSvKnsH0UolM4sUHByMLVu28M7r6etHhVorKgl8KsA/Xj71P52UiMKCPKYW6bFt22BuNQqSwNbTB5WmUjQSMPdAiH1sHDt373nk8+x/duVdw8jIHbAP/bDp86WlJMPcakTJsRO8zyd023rBAThTexocx1EHkAppKckwm5oQFBTEO9dq64VGq2O+E5AAG5UgNUWwBJ1WG05VVpMAUiM9LRVtLY2CJOjo6mZaAhJgk2Skp6G1uUGQBJZOK7Q6PQkgNTIz0mEyNiAwMJB3brulE1Wn2bu34dOrgBs/jW/q75xOJ56KXf+xsI18N/BRyMp8IMHxE2/xfnGlzdwBDhx0lRrqAFIiOysDLU0XBHWCVrNlzRtgJICIycnORHPjeQQE8DdVU1s79LV1JIDUyM3JQnOTMAmaTW2oWePZRxJAxBzIyYax8UNBEhhbWmGoe5cEkBoHc3MES9BoNMFQ/57PauUA+olYf2P5T8ZSB/BzSAASgCABCBKAIAEIfxdg9TtmCOleAq4QgO/VYoT0eJi5jM8QQrq7f4UA1AX8b/cD9No4v9v56742zpsEJIJ0Wr6gF0euJQEhnbYvSAASQdrBEwQA4D8iUuD1D944jQAAAABJRU5ErkJggg==", + "5k.png": "data:image/png;base64,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", + "6k.png": "data:image/png;base64,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", + "720p.png": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAYAAADS1n9/AAAJBklEQVR42u1da1BURxb+mBkIwzCwwQgiCmpkMIAPMKJJfKJBVEqRKXwgID5YpDRlTDSsrtaacvFtmY27MQEVJGh4iialERCJQY2igEZRIa7yFBXlOYCDM8z+2MJSM7fvhZkBufT3c87pPn3v+frcPqd77gUoejWM2BRs7J009Db1XDwqKzLqFAGo43sHEYy4OP9ecSG9gz0QQ2QurCQwIjmfOp5/RHidBEbanE8dz28ivEwCAX3m9z687GvB60I6+/kLbb4V0Nnfu6OAgM7+3h0FBPSW9G5QAlACUFACUPRaiPh+geUVlcjLy8fNwlsoKSnF/dJS1NTUoqlJAaWyFRKJBJYWUtja2mL4cBe4u42C17SpEIvFehtDwbXryMjMQl5+Ae6XlKC2tg7Pnz+HmVgMGxtryGSO+GDcWPjM9Ebfvn279P4YvZwS6CMLaGhogPOI0QYd9JXfcmBr20+rrLW1FecvXER6Zhayzmbj4cNHHe5fam4OuZ8vPl+zGm+//ZdOj/OXc79i247dKLx1m5O+UCiEn+8cRKz7DP362Rjs/r1cEeTdIyAu/iiCl4TiyNGETjkfABoVCsTGxWPy1Ok4k5Xd4fYqlQoRGzYhcPEyzs4HALVajeTUY/D0momMzCy6BuhuPK2pwfKwcPx8OqMDzldjaWg4jhxN0CmKhq5YibTjP1ICdDdUKjU++fRzlFdUctL/8p9bcTb7F53tqtVqrFkbgYJr1ykBXofJWyZdau/Zs2fYErmNVS8vvwCH4+L1SD4V1v3t71Cp1JQA7Zg0cQL6WFl1qI272yisWb0KyQnxuHzxHO4VF+L2zQKcOJaEJSHBEInYk6GMzCw0NDQwytva2vDF+o1oa2tj1OljZYVd2yORn3sRd+/cQFb6SSwOWkS0e+dOEaIPxvScNNDCwgIVJX90qq1Go8FUr5ko/uMuo0542HJuK3mpFIsWzsfCBfPw7pDBf44iJiYY7e6G0e5u8POdjYDAEDQqFMTZ+GvOBfjMmqFVnnPhIoqKihnbSyRmOJ6aiMGDB734zclJhsgtm2HXvz+27tjF2PZQ7GGEhS6FQCDgdwQ4m32O6HxXF2eM/+hDYh8SiQSfrAzHpfPZ2LghQqvzX4fbqJGI3LKZVa+svIJRlpiYQmy7MjzsFee/jBVhyzFkMPM4q6oeIuf8Bf4/AvZ/F02UrwgLZe1j4Xx/RKz7DJaWlh2yPWe2D2ubp0+fav29paUFpzMyiW395X7MThAI4Dd3DrH9MQNlBG8MAX7//QYuXc5llA+ws4PPzBkGsy8UCjH03SFEHWNjY62/3yy8hdbWVsZ29vYDGQtX7fAYQy6e5Rdc4zcB9kcdIMpDly2BSCQ06BhaWlqI8oED7LQT4Ca5guri/B6rbTadkpJSKJqa+EmAsvIKnPo5nVFuaWmJBfP9DTqG5uYW3C8pJeqMGfM+YwQggW32t18jaf9Bo9GgsPA2PwkQfTAGajVzrhscGACJxMygY0hNO06MAK4uzpA5DtUqe/joMbFva44bPH37vkOUP3r8iH8EqKurR2JSMnPRx8QES0OCDDqGqqqH2L5zD1Hn09WrGGUKQvrYnplwgcSMrKdoVPCPAHHxR9DczDzz5H6+Bt0ira+vx9LQFaivr2fUmTXTG95eHzPKGxsbiTbeMuFWuWSrcDaw2OlxBGhtbUVM7PeMciMjI4SFLjOY/ZqaWiwMDMENwiJOJnPE7p3bWNcPxAxDxK3eZsyi19zcrPd70K0HQlJS01D95Amj/ONpnqypWWdRXlGJRUFLcO/+fUad/ra2iIuJhtTcnNiXWGxKlKueP+c8Ich2zPgTATQaDaIOHCIXfv663CC2b92+gzl+/kTn9+tng+SEeAyws2PtTyqV6uTYdihZ9Cyk5vwhQOaZs7j733uMcne3UfBgSLt0wW+XLkM+LwCPH1cTCzepiUfh4GDPqU82AjQquC3emhTkPF9qIeUPAb5lKfyEcyj7dhQnT53GouClxEXbsGFOOJ6SyNn5AGBjTV6kVlc/4dQP6XH4fzvW/CBAwbXryL1ylVE+aJADpntN06vNmMPfI3zVamI4HjfWA2nJP8DaumNZh6uLC1H+4EEVpwWpUqkkLoidOVQUe8QikG3TJyx0mV63Pnfu3ouv//0NUcdn1gx8vXc3TEw6ftjE1dWZKOdyLpCtmujgYM+6GO0REaC0tAyn05l3zvpYWcFfPlcvtlQqNdZ+sZ7V+UtCgvHNvq865fz2CEBqW1FZiYpK8pGyy7m5RLm72yiD+KPLCRB14BDx1EzI4iCYmprqbKelpQXLw8KRkJRCDKvrI9Ziy+ZNOkUcMzMx6yMrJfU4kahpJ34itvfznd3zCVBbW4eklGOEPFeMkOBAne3U1dVjwaLFxCPdIpEIX+3ZiZXhYXq5tvn+cpbHXhRj2rnvP/tRVlZOTEknjP+o5xMgNi6euOEy31+u0x8xAKDywQP4yuchL7+AUUciMcPhQ1GQ+/nq7domThjPuFkEAE1NzZgrX4AfEpJQXV0NpVKJoqJiRGzYhD17/0V+RC0OglBomK1wvf8ziLHIoVTC44OJeFpTo1UuFAqRk50Je/uBBl/wdRYjhrvi1E9pjPLcK1chnxcAjUZ/79twcpIh/eQJTgdXuaJb/hmUnJrG6HwAmOHtpbPzuxseY95HcGCA/lI0kRC7tkfq1fnd8ghoa2tDVDS57BtuoLJvV+PLf2zEpIkTdHeMQIBdO7YabPXfpQTIyDxDrLuPG+uBkSNH8IIAIpEIsQe/w0IdTjBJpVJE7d9HPEjaowjwbdRB8uw3QNm3O2FsbIxdO7YiLiYazu8N49xOKBRC7ueLsxmn4D3dq2sIa2gDefkFuJqXzyiXOQ6F55RJ4CM8p0yG55TJyMsvePF+gJLS0hfvBxCLTWFjbQOZzBEfjhsLn1kzOlyG7jFZAMWbA16/H4DiDVwDUFACUFACUFACUFACUFACULypBHj9GzMU/K0BvEIAtk+LUfAP7T4XsDGEgr+z/xUC0CjQ+2Y/QD8b1+tmPvGzcdpIQInAn5DP6cORTCSg4E/Y50QASgR+O56CAgDwP5RjPmzaHh9CAAAAAElFTkSuQmCC", + "8k.png": "data:image/png;base64,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", + }; + window.GroupDetailsImages = MAP; +})(); diff --git a/plugins/GroupDetails/screenshot.png b/plugins/GroupDetails/screenshot.png new file mode 100644 index 00000000..600941a7 Binary files /dev/null and b/plugins/GroupDetails/screenshot.png differ