Spaces:
Paused
Paused
Commit History
-
fix(web): preserve all settings on free-key toggle; coerce backdrop edge inset
PNRxAThe admin settings PUT is a full replace, so the curated payload in toggleFreeApiKey silently reset every omitted field — including the new backdrop_edge_inset_x/y and backdrop position/direction — to their serde defaults. Spread the full settings instead so future fields can't be dropped. Also coerce backdrop edge-inset inputs to a clamped integer before saving so an emptied or non-integer field can't 400 the save mid-edit (i32 server-side).34c90c9
-
fix: update free-key URL when typing backdrop edge insets
PNRxAA `type=number` input's v-model yields a Number (Vue coerces it), so the free-key card's insetParam ran `raw.trim()` on a number and threw, which broke the queryString/curl computed — the request URL stopped updating as soon as a digit was entered. Normalise string|number in insetParam (and type the refs accordingly). The Input test stub now coerces type=number values like real Vue, so this path is actually covered.52aa243 -
feat: expose backdrop edge inset in the free-key "Try it out" card
PNRxAWhen backdrop is the selected image type, show Horizontal/Vertical inset (%) number inputs that emit edge_inset_x / edge_inset_y query params (clamped 0–50, sent as explicit overrides; placeholders show the operator's configured defaults). Cleared on image-type switch like the other type-specific controls.0d3ca24 -
feat: add distance-from-edge inset setting for backdrop ratings
PNRxACloses #7. Some media players (e.g. Nuvio on Mac) reposition/crop backdrops and clip the rating badges. Add two independent per-key/global settings that inset the backdrop ratings inward from the anchored edge: - backdrop_edge_inset_x — horizontal inset (% of width), applies only to left/right positions - backdrop_edge_inset_y — vertical inset (% of height), applies only to top/bottom positions Centered axes ignore their inset, so a top-right position exposes "space from top" and "space from right", while "right" exposes only "space from right". Surfaced in the settings UI as conditional, edge-aware inputs and as edge_inset_x / edge_inset_y query params on the backdrop image and preview endpoints. The cache token (.eh{x}/.ev{y}) is emitted only when the position-gated value is non-zero, mirroring the existing optional .x1 (split) and .blur tokens, so default backdrop cache keys are unchanged and no cache-key migration is needed (only the additive DB columns, default 0).70cc48f -
expose poster fit in the free-key "Try it out" card
PNRxAThe free-key try-it-out panel showed Textless and Split (poster-only overrides) but not the new aspect-ratio fit. Add a "Fit" dropdown (native/cover/blur/pad) that emits `?fit=` for posters, with the resolved "default (<value>)" annotation from the free key's global default. Resets on image-type switch and is hidden for non-poster types, matching split.1a7acb0 -
change default poster fit to native (legacy passthrough)
PNRxAMake `native` (keep the source aspect ratio) the default for poster_fit instead of `cover`, so out-of-the-box rendering matches the prior behavior and 2:3 normalization (cover/pad/blur) is opt-in. The selection-side preference for ~2:3 source posters still applies by default. Because native emits an empty cache-key token, the default now reuses existing poster cache entries with no re-render. - db: default_poster_fit() -> Native; api_key_settings column default 'native' - web: form fallback + dropdown order (native first) - README: native is the default fit; restore source-ratio poster dimensions - tests updated for the new default1fdea6e -
feat: normalize poster aspect ratio to 2:3 (#15)
PNRxANon-2:3 source posters were served at their native aspect ratio, so downstream apps (Stremio addons, aiometadata) that place posters in fixed 2:3 containers cropped them — cutting off the title/logo art baked into the poster (issue #15). Two complementary fixes: - Render-side: a new `poster_fit` setting normalizes every poster to an exact 2:3 frame (e.g. 580x870 / 1280x1920 / 2000x3000). Modes: `cover` (default, center-crop), `pad` (solid letterbox), `blur` (blurred-fill bars), and `native` (legacy source-ratio passthrough). - Selection-side: among TMDB posters, prefer art near 2:3 before falling back to highest vote, so the chosen source usually needs little cropping. Configurable per-key, globally, and via the `?fit=` query param. Threaded through RenderSettings, the cache key (native emits no token so existing poster cache stays valid; the new default emits one), the api_key_settings DB column + migration, OpenAPI, and the admin UI (with live preview). Tests: poster fit …5283e2c
-
Merge pull request #50 from PNRxA/feat/badge-shape-background
PNRxAAdd pill-style badges and dark/transparent/no-background options (#19)617b567 -
fix: refresh free-key dropdown trigger text when the resolved default changes
PNRxAThe value reset in the previous commit clears a stale override, but the closed Select trigger could still show the wrong summary: reka-ui snapshots each option's text once when the item mounts and never re-reads it. So a dynamic "default (resolved)" label that changes per image type went stale on the trigger when switching poster<->backdrop (the control stays mounted, unlike logo which unmounts and so happened to refresh). The same staleness left the trigger without its "(resolved)" annotation after the server defaults loaded asynchronously post-mount. Key each dynamic "default"/"any" item by its label so reka-ui re-registers the option text whenever it changes, keeping the trigger summary in sync with the selected image type's defaults. Adds a display regression test that mounts the real reka-ui selects (the rest of the suite stubs them) and asserts the trigger text across poster<->backdrop switches and a post-mount defaults load.5af303d -
fix: re-apply per-type defaults when switching free-key image type
PNRxAThe free API key "Try it out" card loads every per-type render default once and switches the dropdown "default" labels per image type, but the selected control values (badge style, label style, badge size, max badges, position, direction) were left untouched on a type switch. A value chosen for poster therefore carried over to backdrop/logo/episode, so the form showed — and the curl emitted — the previous type's settings instead of the new type's defaults. Reset every per-type render control to "default" on each image-type switch so the dropdowns re-resolve to the newly selected type's server defaults. Genuinely global controls (image source, language, ratings order/exclude, a still-valid image size) continue to persist across switches.d7f53d5 -
Merge remote-tracking branch 'origin/main' into feat/badge-shape-background
PNRxA# Conflicts: # README.md # api/src/handlers/preview.rs # api/src/image/generate.rs # api/src/image/serve.rs # api/src/lib.rs # web/src/__tests__/components/RenderSettingsForm.spec.ts # web/src/components/RenderSettingsForm.vue # web/src/lib/api.tsc45d5f9 -
fix: offer up to 10 rating badges in the free-key card
PNRxAThe "Try it out" card's ratings-limit ("Max badges") dropdown only offered 0–8, but the backend allows 0–10 (validate_ratings_limit) — one slot per available rating source, and there are now 10 sources — and the admin RenderSettingsForm already exposes the full 0–10 range. Bump the dropdown from `n in 9` to `n in 11` so the free card can request the same maximum as everything else, and add a regression test pinning the offered range at 0–10.2a48b9b
-
feat: split poster badges onto opposite sides (#18)
PNRxAAdd a per-poster `poster_badge_split` setting (query param `split`) that divides rating badges evenly across two opposite sides of the poster. The split axis follows the badge layout: a vertical column splits left/right, horizontal rows split top/bottom. With an odd number of badges the configured side keeps the extra one (4 -> 2+2, 3 -> 2+1); a single badge is never split. - Rendering: BadgePosition::split_anchors + overlay_poster_group on the poster render path; threaded through ImageParams/serve/preview. - Cache: the split contributes a key token only when enabled, so existing non-split cache keys and CDN settings hashes are unchanged. - Settings: new column + migration, per-key/global/free-key plumbing, `split` query-param override. - Web: settings-form checkbox with live preview, free-key "Try it out" control, API params, types, and README docs.6db0b76 -
feat: add pill-style badges and dark/transparent/no-background options (#19)
PNRxAAdd two orthogonal, per-image-type badge appearance settings: - badge_shape: rounded (default) | pill (fully rounded ends) - badge_background: default | dark | transparent | none These are plumbed through the full settings stack (per-key + global defaults, query-param overrides, cache keys) for posters, logos, backdrops, and episodes, and exposed in the admin/key settings forms and the public free-key "Try it out" form. Closes #19.c165e10 -
feat: add a ratings-exclude control to the free-key "Try it out" form
PNRxAThe free key honours a `ratings_exclude` query override, but the card had no way to set it. Add an "Exclude ratings" checkbox grid (mirroring the settings form) seeded from the server's exclusion list; toggling a source emits a `ratings_exclude` override (including an empty value to clear a server-set exclusion) and dims it live in the priority list. UI: white background on the checkboxes so they read against the card's tint, and top-aligned rows so long labels (e.g. "Rotten Tomatoes (Audience)") wrap left-aligned instead of centering against the control.61c0e40 -
feat: reflect server defaults in the free-key "Try it out" form
PNRxAThe free API key serves with the instance's global render settings, but the "Try it out" card showed hardcoded frontend defaults — so the displayed rating priority and the implied curl output didn't match what the key actually produces. Add a public GET /api/free-key/settings endpoint (gated on the free key being enabled, served from the existing global_settings_cache so it adds no DB reads, and trimmed of the admin-only operational flags). The card fetches it once (memoized in the auth store) and now: - seeds the rating priority list from the server's order (only sending a ratings_order override once the user reorders away from it), - annotates each dropdown's "default" with the server's resolved per-image-type value (e.g. "Badge style: default (Vertical)"), - dims rating sources the server excludes, falling back to the built-in defaults if the fetch fails.7e7d412 -
feat: add MDBList score and Roger Ebert rating sources (#42, #35)
PNRxAAdd two new rating sources, both sourced from the existing MDBList integration: - mdblist: MDBList's own 0-100 aggregate score (top-level `score` field), rendered as a bare integer to match MDBList's presentation (#42) - ebert: Roger Ebert's classic 0-4 star rating (the `rogerebert` entry in MDBList's ratings array; only `value` is populated), rendered as a bare decimal like IMDb/Letterboxd (#35) Both are wired through every layer: the RatingSource enum (label/key/ color/cache_char/canonical order), badge + icon rendering, validation, the default ratings order, the web settings UI, the landing page, and docs. The per-image ratings limit cap is raised 8 -> 10 to fit all sources. The MDBList response->badge mapping is extracted into a pure `mdblist_badges` fn with serde-level tests covering int/null `score` deserialization and 0/null value suppression. Icons: MDBList uses its official mark from Simple Icons (CC0); Roger Ebert uses a generic filled thumbs-up from Phosphor Icons …79c9393
-
feat: add ratings_exclude setting to hide specific rating sources (#17)
PNRxAAdds a "ratings_exclude" setting (comma-separated rating source keys to drop from generated images) following the same global-default + per-API-key + query-override pattern as ratings_order. Closes #17. Exclusion is applied before ordering and limiting, so excluding a source you don't care about (e.g. Rotten Tomatoes critics) frees its badge slot for the next preferred source rather than leaving a gap. The exclusion list is folded into every cache-key suffix (ratings_cache_suffix, badges_suffix_from_available, and the CDN settings_hash), so two configurations differing only in their exclusions never collide in the cache. - Storage: new api_key_settings.ratings_exclude column via idempotent migration; empty default ("exclude nothing") keeps existing cache keys byte-identical. - API: ?ratings_exclude= query override (all image types) plus admin global, per-key admin, and self-service settings endpoints. - Web: "Exclude ratings" checkbox control in the settings form with live previe…f54670e
-
fix backdrop default, add to free key ui, fixes #36
PNRxAe030eb4
-
feat: add DISABLE_PUBLIC_PAGES to hide public routes on private instances
YagUber5cc036a
-
additional configuration options for backdrops
PNRxA41b3b51
-
add support for episode ratings, closes #5
PNRxA76b8a0b
-
large refactor to prioritise tmdb logos and backdrops, then fall back to
PNRxAfanart, fixes #10094c13f
-
expose all customisation through url params, fixes #3
PNRxA0b7bef2
-
remove fallback placeholder behavior, accept param as no-op for rpdb
PNRxAcompatibility1464c42
-
additional test coverage, delete unused counter store
PNRxA6d06b8a -
add badge size option, improve settings layout
PNRxA4b9bf53 -
use shadcn-vue components for select, input, and checkbox
PNRxAc5ec7be
-
remove settings debounce in favour of save queuea
PNRxAddc8b52 -
replace poster source dropdown with fanart checkbox
PNRxAaabdd80
-
deduplicate image handlers and rename poster modules to image
PNRxA0c21886
-
add homepage
PNRxA5afb157
-
shorten poster_source values, compact ratings cache suffix, skip no-op
PNRxAicon resize4fcb46a -
shorten setting values, add cache docs
PNRxA58dc9a1 -
add poster support for corner placement, custom directions
PNRxA8762688 -
icon support for all endpoints
PNRxA7f36b83 -
add per-type badge style, poster position, and per-type ratings limit
PNRxAsettingsf0e0245
-
logo and backdrop tabs, cache refactor
PNRxA5d84fe3 -
add logo and backdrop api endpoints
PNRxAa5bc115 -
add optional free api key
PNRxAcb0280f -
preview endpoint auth, poster serving refactor, and race condition fix
PNRxAin PostersViewf4003d6 -
added poster preview to settings, fetch poster manually
PNRxAc63b398 -
add support for ordering and limiting ratings
PNRxA02c8c3c -
allow logging in with api key to manage individual settings
PNRxA6c38a8d -
added support for fanart posters, added per api and global settings
PNRxAfbc8659
-
implement dashboard layout and additional tests
PNRxA2c8ae4e -
init tests
PNRxAdd7a3f0 -
init bare web/api
PNRxA805e99b