Commit Graph
356 Commits
Author SHA1 Message Date
IAmParadox27 aaa0dfee2b Update assembly to 3.0.0.0 to match plugin version 2026-08-26 22:06:07 +01:00
IAmParadox27 c15ae8ef29 Merge branch 'main' into v12
# Conflicts:
#	src/Jellyfin.Plugin.MediaBar/Jellyfin.Plugin.MediaBar.csproj
2026-08-26 21:50:48 +01:00
Zach Ross-Clyne 0d1ce12118 Merge pull request #178 from ACertainCoder/iamparadox27/fix/ghost-slide-lifecycle 2026-08-26 20:27:47 +01:00
ACertainCoder fac79dacb4 Fix SlideTimer lifecycle
Set `slideInterval` to `null` to ensure `updateCurrentSlide` doesn't restart it before overwriting it.
2026-08-26 20:32:29 +02:00
Zach Ross-Clyne f3ed7f039e Merge pull request #177 from skylerwshaw/fix/friendlier-settings-wording 2026-08-26 19:05:39 +01:00
Skyler Shaw f060f32b35 Reword the Version and early-updates settings for non-technical admins
The descriptions leaned on git and packaging vocabulary ("unpinned refs",
"tag or commit", "unversioned") that most people configuring a media
server don't have. Same behaviour, said in terms of consequences: what
you get, what the risk is, and how to get back ("turn this off").
"Allow unpinned refs" becomes "Get updates early".
2026-08-26 11:01:29 -07:00
Zach Ross-Clyne 9ac553ca8c Merge pull request #176 from skylerwshaw/feat/opt-in-branch-refs 2026-08-26 18:53:06 +01:00
Skyler Shaw ac1047ccb8 Add opt-in AllowUnpinnedRefs so main/latest can track jsDelivr again
Follow-up to #175, which made "main" and "latest" resolve to the embedded
assets. Requested in review: an option, default disabled, for users who want
those refs to load live from jsDelivr as before.

When AllowUnpinnedRefs is enabled, "main" and "latest" are treated as git
refs ("latest" mapping to the main branch, as it always has); disabled, they
keep meaning embedded. Explicit values are unaffected either way: "embedded"
is always embedded, and a tag or commit always fetches from jsDelivr. The
config page gains a checkbox spelling out what enabling it means: unreleased
code, arriving within about 12 hours of a push, unversioned.
2026-08-26 10:11:21 -07:00
Zach Ross-Clyne 632e63a004 Merge pull request #175 from skylerwshaw/fix/serve-web-assets-from-plugin
Serve slideshowpure.js/css from the plugin instead of jsDelivr
2026-08-26 16:12:00 +01:00
Skyler Shaw 40cfd4ba63 Treat main and latest as embedded, drop the unreachable 10.11 fallback
An "embedded" default only helps fresh installs: every existing server has
"main" or "latest" saved and would keep fetching a moving branch ref
forever. Those values never named a version, they meant "newest", and the
newest that matches the installed plugin is now the embedded copy. A tag
or commit still resolves to jsDelivr.

This makes the 10.11 fallback unreachable ("main" resolves to embedded
before the guard), and it was already dead: it compares
JellyfinVersionAttribute.GetVersion() to "10.11" by equality while the
assembly declares "10.11.2". Remove it, along with the config page's
client-side copy of the latest-to-main rewrite.
2026-08-26 05:32:44 -07:00
Skyler Shaw c7a4a47735 Serve slideshowpure.js/css from the plugin instead of jsDelivr
The injected index.html loaded both files from cdn.jsdelivr.net at
{{Config.VersionString}}, default "main". A branch ref is not a version:
jsDelivr re-resolves it at request time, so browser-side changes reach
every install the day they land, with no release and no way to decline,
and the code in the browser drifts from the installed plugin version. It
also leaves the media bar broken on servers without internet access.

Embed the files in the assembly and serve them from the existing
/MediaBar/{file} route:

- slideshowpure.js/css become EmbeddedResource under the Inject namespace
- Inject/index.html templates an asset base URL instead of a bare ref
- VersionString defaults to "embedded", which resolves to ../MediaBar
  (relative, so it works when Jellyfin is hosted under a base path)

Any other value is still treated as a git ref and fetched from jsDelivr.
2026-08-26 05:32:44 -07:00
Skyler Shaw f8b52288db Stop index.html requests rewriting the saved VersionString
IndexHtml() normalised VersionString in place ("latest" to "main", and
"main" to "10.11" on 10.11 builds). Those assignments mutate the live
configuration, so every home page load overwrote the value the
administrator saved, and concurrent requests raced over the field.
Compute the resolved version into a local instead.
2026-08-26 05:32:43 -07:00
Skyler Shaw 48f620a6a8 Return 404 when GetFile is asked for a resource that is not embedded
The manifest resource stream was null-forgiven, so a request for any file
outside the embedded Inject.* set threw mid-action and surfaced as a 400
with a stack trace in the server log. Return NotFound instead, and dispose
the reader.
2026-08-26 05:32:43 -07:00
Zach Ross-Clyne b2672657c4 Merge branch 'MakD:main' into main 2026-08-23 21:51:33 +01:00
M0RPH3US da79c05066 Merge pull request #114 from MrRussLuther/sync-page-backdrop
Sync the page backdrop with the featured slide
2026-08-11 21:07:52 +05:30
Russell Luther c1fa76f046 Sync the page backdrop with the featured slide
The background behind the home page is Jellyfin's own backdrop layer, and it
has no connection to what the bar is showing. It sits on unrelated library art,
and where the user has Jellyfin's backdrop rotator enabled it also cycles on its
own timer, so the page behind the hero drifts while the hero itself is correct.

PageBackdrop points that layer at the featured item and keeps it in step. It
reuses the exact URL the active slide already requested through
SlideCreator.buildImageUrl, so the browser serves the image from cache and no
extra request is made.

Two details worth calling out:

Jellyfin's rotator adds its own .backdropImage siblings into the same container
and cycles them, which paints over anything we set. While the bar owns the
screen we keep our layer the only one and make sure it stays last. This is done
with a MutationObserver on the container rather than a timer, so it reacts to
the rotator instead of polling for it.

It is scoped to the home page. VisibilityObserver already knows when the bar is
hidden, so leaving the page hands the backdrop straight back to Jellyfin and no
other page is affected.

Defaults on, alongside slideAnimationEnabled and enableTrailers. Set
CONFIG.syncPageBackdrop to false to leave the backdrop alone.
2026-08-06 22:31:57 -04:00
M0RPH3US b6a113ba45 Merge pull request #113 from MrRussLuther/prefer-main-trailer
Pick the main trailer instead of RemoteTrailers[0]
2026-08-06 20:11:51 +05:30
M0RPH3US e835513bbf Merge pull request #112 from MrRussLuther/fix-firefox-backdrop-mask-composite
Fix missing backdrop to trailer fade in Firefox (invalid mask-composite value)
2026-08-06 20:10:56 +05:30
M0RPH3US bb53c0b01d Merge pull request #111 from Vinnie-Singleton/makd-endsat-clock
Show "Ends at" time in the viewer's own clock format
2026-08-06 20:10:10 +05:30
Russell Luther 049cd148d2 Demote alternate cuts within tier and handle youtu.be and embed URLs
A flat 10 point demotion ranked an accessibility variant of a real
trailer below non-trailer junk like Behind the Scenes or Review.
Subtract 0.5 instead, so an alternate cut loses to an ordinary entry
of the same tier but still beats lower tier promo clips.

Also parse youtu.be short links and youtube.com embed links by
pathname, since neither carries a v query param.
2026-08-01 01:16:33 -04:00
Russell Luther 96b0d4b099 Pick the main trailer instead of RemoteTrailers[0]
RemoteTrailers arrives in metadata provider order, which is not
preference order. Taking index 0 unconditionally means the bar
regularly plays something other than the trailer: a promo clip, a
teaser, or an accessibility variant.

The clearest case is an American Sign Language cut. TMDb lists
"Official American Sign Language Trailer" first for A Minecraft Movie,
Mortal Kombat II and Superman, so those slides play a trailer with an
interpreter composited into the corner, drawn over the backdrop.

Index 0 is also not guaranteed to be a YouTube link. When it is not,
searchParams.get("v") returns null and the slide loses its trailer
even though a usable YouTube entry sits further down the list.

Entries are now ranked by name, preferring official, final and main
trailers over generic ones and teasers, with alternate cuts ranked
below everything else rather than dropped so an item that has nothing
else still plays something. Provider order breaks ties, so an item
whose first entry is already the best keeps it. Entries that yield no
video id are skipped instead of ending the search.

Across a 384 item library this changes the pick for 105 items and
loses the trailer for none. Avatar moves from "Back in Theatres" to
"Special Edition Official Trailer", Oppenheimer from "Review" to
"Official Trailer", Moana 2 from "Special Look" to "Official Trailer",
and the three titles above stop playing the sign language cut.
2026-08-01 00:30:33 -04:00
Russell Luther b1735613a2 Use the standard intersect value for mask-composite on .backdrop.with-video
source-in is a -webkit-mask-composite value and is not valid for the
standard mask-composite property, which accepts only add, subtract,
intersect and exclude. Firefox drops the invalid declaration and falls
back to the initial value add, which unions the two mask layers instead
of intersecting them. The horizontal fade is lost and the 40% wide
backdrop hard cuts against the playing trailer.

Chromium is unaffected either way because it honours the
-webkit-mask-composite line that follows, which is left unchanged.

.video-container already uses the intersect and source-in pairing.
2026-07-28 05:27:43 -04:00
Vinnie-Singleton 46647a739b Show "Ends at" time in the viewer's own clock format
Right now the end time is locked to 24-hour. There is no option to switch
to 12 hour. Dropping the forced setting lets it match whatever the viewer's
device already uses including 12 hr with AM/PM along with the existing 24
hour format.
2026-07-07 02:25:50 +00:00
IAmParadox27 96b43ed72d Removed support for 10.10.7 and removed legacy 10.11.x verions 2026-07-01 21:34:10 +01:00
M0RPH3US 073eac75e7 Update version number in slideshowpure.css 2026-07-01 15:41:47 +05:30
M0RPH3US 57e33f5749 Update version number to v5.0.1 2026-07-01 15:41:28 +05:30
M0RPH3US f2f58465c4 Merge pull request #110 from dracovoldy/fix/youtube-api-fallback
Fallback when YouTube API fails to load
2026-06-29 20:01:25 +05:30
Abhishek Mallik 74873bf4d4 Fallback when YouTube API fails to load 2026-06-29 02:14:19 +05:30
Zach Ross-Clyne 2b0faa8123 Remove daily schedule from stale workflow
Removed scheduled cron job for stale issues and PRs.
2026-06-26 11:19:41 +01:00
IAmParadox27 00ba03940a Added 12.0 support to Media Bar 2026-06-24 19:13:48 +01:00
IAmParadox27 c7018299c8 Moved JF version declaration only to csproj, which generates the assembly attribute, like HSS does 2026-06-24 19:01:49 +01:00
IAmParadox27 ae878fd763 Added support for 10.11.11 - need to change this to a nicer more future proofed solution in the future 2.4.12.0 2026-06-11 11:01:56 +01:00
IAmParadox27 27eedf38f3 Minor compile error for 10.10.7 and 10.11.x (not .9+) 2.4.11.0 2026-05-25 21:05:58 +01:00
IAmParadox27 0ca9bd0622 Added support for 10.11.10 2026-05-25 20:57:28 +01:00
IAmParadox27 9c4e3ef05e Merge branch 'upstream'
# Conflicts:
#	slideshowpure.js
2026-05-25 20:43:48 +01:00
IAmParadox27 69ca89e385 Added support for 10.11.9 2026-05-25 20:37:47 +01:00
M0RPH3US 23a98399b8 Update slideshowpure.css 2026-05-19 21:29:13 +05:30
M0RPH3US ad2a5473e8 Update slideshowpure.js 2026-05-19 21:28:53 +05:30
M0RPH3US 787fd379ef Update slideshowpure.css 2026-05-19 20:39:04 +05:30
M0RPH3US 18b5a6dca1 Update slideshowpure.js
Attempt to fix #105
2026-05-19 20:38:34 +05:30
Zach Ross-Clyne e246a616cd Merge branch 'MakD:main' into main 2.4.9.0 2.4.10.0 2026-02-13 14:31:50 +00:00
M0RPH3US 3c64087e24 Update slideshowpure.css 2026-02-13 13:58:38 +05:30
M0RPH3US fcb7bf469b Update slideshowpure.js 2026-02-13 13:58:20 +05:30
M0RPH3US ec89fea419 Update slideshowpure.css 2026-02-13 13:30:01 +05:30
M0RPH3US ec268f128d Update slideshowpure.js 2026-02-13 13:29:32 +05:30
M0RPH3US 3d0ae04cc6 Update slideshowpure.css 2026-02-11 22:06:01 +05:30
M0RPH3US d3c29f6f6c Update slideshowpure.js 2026-02-11 22:05:34 +05:30
IAmParadox27 6ed1f7277a The actually hooking of the config var was missed from previous PR. Adding now 2.4.8.1 2026-02-08 11:23:49 +00:00
Zach Ross-Clyne b480d7a3b1 Merge branch 'MakD:main' into main 2.4.8.0 2026-02-08 10:27:38 +00:00
Zach Ross-Clyne dec803c61b Merge pull request #116 from n00bcodr/main
Add Enable Trailers to Plugin Config
2026-02-08 10:27:29 +00:00