Thanks to SethBacon (Video integration)
BobHasNoSoul (Original architect)
MakD (Mobile Styling)
- Download
spotlight.htmlandList.txt. Go to yourjellyfin-webfolder (C:\Program Files\Jellyfin\Server\jellyfin-web) and create a folder nameduiand dropspotlight.htmlandList.txtin that folder
Important: Open Notepad with Administrator rights, or use Notepad++ for thisIn your Jellyfin Dashboard, underAPI Keyscreate an API key for Spotlight. Open spotlight.html, Ctrl+F and search forYOURAPIKEYHEREand replace it with your API key.
- In the jellyfin-web folder, open the file
home-html.RANDOMSTRINGHERE.chunk.js. Replace everything with this code
Show code
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8372], {
5939: function(a, e, t) {
t.r(e),
e.default = `
<div id="indexPage" style="outline:0" data-role="page" data-dom-cache="true" class="page homePage libraryPage allLibraryPage backdropPage pageWithAbsoluteTabs withTabs" data-backdroptype="movie,series,book">
<style>
.featurediframe {width: 95vw; height: 23.5em; display: block; border: 0px solid #000; margin: 0 auto; margin-bottom: 0em; margin-top: 1em;}
@media (min-width: 2601px) {.featurediframe {height: 50em;} }
@media (min-width: 2000px) and (max-width: 2600px) {.featurediframe {height: 20em; font-size: 175%;} .layout-desktop #homeTab .sections.homeSectionsContainer {margin-top: -3em !important;} }
@media (max-width: 1000px) and (orientation: portrait) {.featurediframe {height: 46vh;} }
@media (max-width: 1000px) and (orientation: landscape) {.featurediframe {height: 98vh;} }
@media (max-width: 400px) and (orientation: portrait) {.featurediframe {height: 52vh;} }
@media (max-height: 400px) and (orientation: landscape) {.featurediframe {height: 100vh;} }
@media screen and (aspect-ratio: 4/3) {.featurediframe {height: 27em;} }
@media screen and (aspect-ratio: 3/4) {.featurediframe {height: 27em;} }
@media screen and (aspect-ratio: 16/10) and (max-height: 1200px) {.featurediframe {height: 34em;} }
@media screen and (aspect-ratio: 10/16) and (max-height: 1280px) {.featurediframe {height: 25em;} }
</style>
<div class="tabContent pageTabContent" id="homeTab" data-index="0"><iframe class="featurediframe" src="/web/ui/spotlight.html"></iframe><div class="sections"></div></div><div class="tabContent pageTabContent" id="favoritesTab" data-index="1"> <div class="sections"></div></div></div>`;}}]);
document.addEventListener("DOMContentLoaded", () => {
const homeTab = document.getElementById("homeTab");
const spotlightIframe = homeTab.querySelector(".featurediframe");
const observer = new MutationObserver(() => {
const isHomeTabActive = homeTab.classList.contains("is-active");
spotlightIframe.style.display = isHomeTabActive ? "block" : "none";
});
observer.observe(homeTab, { attributes: true, attributeFilter: ["class"] });
});- Save the file. Empty your browser's cached web content (Ctrl+F5 or empty it from your browser's Cookies and Site Data settings section)
To preselect content, edit List.txt in the ui folder and paste the ID of each piece of content to be featured (IDs can be found in the address bar).
IMPORTANT If you use List.txt to preselect content and a User has an Age Rating limit on their account (U, PG etc) make sure you add content for them to see too, or it will just be blank (content above their Age Limit is hidden to them)
If nothing is on line 2 or below, the bar will feature content at random.
Show guide
Same as above, except open this link and download the file spotlight.html (don't just save the link, it'll save the github page)
Show guide
Open this link and download the file spotlight.html (don't just save the link, it'll save the github page)
insert this into home-html.RANDOMSTRINGHERE.chunk.js after data-backdroptype="movie,series,book">
<style>.featurediframe { width: 99.5vw; height: 100vh; display: block; border: 0px solid #000; margin: 0 auto; margin-bottom: 40px} @media (max-width:1000px) and (orientation:portrait) {.featurediframe {height: 46vh; width: 95vw;}} @media (max-width:1000px) and (orientation:landscape) {.featurediframe {height: 98vh; width: 95vw;}} @media (min-width: 2000px) { .featurediframe {height:102vh;}}</style><iframe class="featurediframe" src="/web/ui/spotlight.html"></iframe>and add this CSS to the very end of your Custom CSS
.layout-desktop .page.homePage.libraryPage.allLibraryPage.backdropPage.pageWithAbsoluteTabs.withTabs.mainAnimatedPage { margin-top:-4.5em;}
.layout-desktop .overflowBackdropCard, .overflowSmallBackdropCard { width: 12.7vw !important; padding-right: 1.85em;}
.layout-desktop .skinHeader-withBackground {background-color: transparent; backdrop-filter: blur(0px);}
.layout-desktop #homeTab .section0 .sectionTitle.sectionTitle-cards.padded-left { display: none !important;}
.layout-desktop #homeTab .verticalSection.section1.emby-scroller-container { position: relative; top: -27em; left: 73em; width: 29vw; margin-bottom: -17em;}
.layout-desktop #homeTab .verticalSection.section2.emby-scroller-container::after { content: ''; position: fixed; top: 0; left: 0; width: 100%; height: 100vw; background: black; z-index: -1;}
[dir="ltr"] #homeTab .verticalSection.section0.emby-scroller-container .emby-scrollbuttons {right: -5em; top: -2em;}
.layout-desktop #homeTab .verticalSection.section0 .cardText-first {display: none !important;}
.layout-desktop #homeTab .sections.homeSectionsContainer { margin-top: 2em;}
.layout-desktop .sectionTitle.sectionTitle-cards.padded-left + .itemsContainer { margin-bottom: 2em;}Finally, empty your browser cache
Show guide
- Create the ui Directory
sudo mkdir -p /usr/share/jellyfin/web/ui- Download your spotlight.html and List.txt files (make sure you edited them, as above) and then copy them to the new "ui" folder
sudo cp /local/path/to/spotlight.html /usr/share/jellyfin/web/ui/- Add the relevant script to home-html.chunk.js
sudo nano /usr/share/jellyfin/web/home-html.chunk.js- Ensure the ui folder & spotlight.html are readable by Jellyfin
sudo chown -R jellyfin:jellyfin /usr/share/jellyfin/web/uisudo chmod -R 755 /usr/share/jellyfin/web/ui- Restart Jellyfin
sudo systemctl restart jellyfin- Clear Browser Cache
Make sure to clear your browser cache to load the updated home-html.chunk.js & spotlight.html
Show guide
- Create the ui Directory (assuming your container is named jellyfin)
docker exec -u 0 jellyfin mkdir /jellyfin/jellyfin-web/ui- Copy your downloaded spotlight.html and List.txt files to the new "ui" folder (don't forget to edit them, as above)
docker cp spotlight.html jellyfin:/jellyfin/jellyfin-web/ui/- Add the relevant code line to the home-html..chunk.js file
Since I'm not aware of a way to edit the file directly in the container, I just created the file outside and copied it back in once I edited it:
docker cp jellyfin:/jellyfin/jellyfin-web/home-html.<numbers>.chunk.js .and then you can add the relevant code line to the file (see step 6 above)
nano home-html.<numbers>.chunk.js- Copy the file back to the container
docker cp home-html.<numbers>.chunk.js jellyfin:/jellyfin/jellyfin-web/- Clear Browser Cache; if it doesn't work instantly, restart the container
docker restart jellyfinShow guide
When using a reverse proxy like Nginx or Caddy, the X-Frame-Options: DENY header can block iframes, preventing the feature
- Open your site's configuration:
sudo nano /etc/nginx/sites-available/your-site.conf
- Modify or add the following directive:
- To disable:
# add_header X-Frame-Options "DENY"; - To allow iframes from the same origin:
add_header X-Frame-Options "SAMEORIGIN";
- To disable:
- Restart Nginx:
sudo systemctl restart nginx
-
Modify the /etc/caddy/Caddyfile:
-
To disable:
header -X-Frame-Options
-
To allow:
header X-Frame-Options "SAMEORIGIN"
-
-
Restart Caddy:
sudo systemctl restart caddy
Open home-html.RANDOMSTRINGHERE.chunk.js and replace everything with this
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[8372],{5939:function(a,e,t){t.r(e),e.default='<div id="indexPage" style="outline:0" data-role="page" data-dom-cache="true" class="page homePage libraryPage allLibraryPage backdropPage pageWithAbsoluteTabs withTabs" data-backdroptype="movie,series,book"> <div class="tabContent pageTabContent" id="homeTab" data-index="0"> <div class="sections"></div> </div> <div class="tabContent pageTabContent" id="favoritesTab" data-index="1"> <div class="sections"></div> </div> </div> '}}]);









