Halcyon Video — een 3D-videowinkel voor je mediaserver

Je betreedt de winkel vanaf de parkeerplaats: een bakstenen gevel, een betegelde strook en je eigen filmposters in de ramen.

Dezelfde bibliotheek op vier manieren

De uitstraling van de winkel is niet beperkt tot één vaste instelling. Tijdperk, verlichting, plattegrond en mediaformaat zijn onafhankelijke instellingen, waardoor elke combinatie een unieke winkelervaring oplevert:

  • Vier decennia aan inrichting: Kies uit bordjes en VHS-banden uit 1990, de 'fascia-band' era uit 1993, gebogen plaquettes uit 2000, of de zwartmetalen DVD-stellingen uit 2010.
  • Verlichting: Kies tussen dag, zonsondergang of nacht, met lichtinval door het voorraam op basis van acht HDR-luchten.
  • Drie plattegronden: De schappen kunnen in een visgraat-, rechte of diagonale opstelling worden geplaatst om de ruimte optimaal te benutten.
  • VHS of DVD: De gehele winkel kan worden omgezet naar VHS- of DVD-hoesjes met de juiste proporties.

Functionaliteiten en Compatibiliteit

Hieronder volgen de korte antwoorden op veelgestelde vragen over de werking van de software:

  • Werkt het in Docker? Ja, via één docker run commando of docker compose up -d.
  • Ondersteunt het videogames? Ja. Door het te koppelen aan RomM verschijnt er een aparte afdeling met platformspecifieke rekken en periodieke boxen/jewel cases. Het "huren" van een game start deze direct op.
  • Werkt het met Plex of Emby? Momenteel alleen Jellyfin. Adapters voor andere media-layers staan hoog op de roadmap.
  • Werkt het op een Raspberry Pi? Ja, de 2.5D-modus draait de winkel in gewone HTML/CSS.
  • Kan ik het van buiten mijn huis gebruiken? Ja, via Remote Play kan de live winkel naar elke browser worden gestreamd, inclusief een eigen TURN-relay voor gebruikers buiten het lokale netwerk (LAN).
  • Kan ik de winkel aanpassen aan mijn oude videowinkel? Ja. Merknaam, logo, kleuren, thema's en meubilair zijn data-bestanden die je in een map plaatst; er is geen code voor nodig.
  • Werkt het zonder mediaserver? Ja, dit wordt gebruikt in de demoversie.

Wat is Halcyon Video precies?

Het is een app gebouwd met Vite, TypeScript en three.js (optioneel verpakt in Tauri) die verbinding maakt met Jellyfin. De app bouwt procedureel een videowinkel uit het juiste tijdperk op basis van je collectie: elke bibliotheek wordt een gangpad, genres worden aangeduide secties en titels met de slechtste beoordelingen belanden letterlijk in de kortingsbak (Bargain Bin).

De app is ontworpen om 24/7 te draaien op een HTPC (Home Theater PC) als manier om films te kiezen. Wanneer er niemand interactie heeft met de app, rendert deze niets en verbruikt hij nagenoeg geen CPU- of GPU-capaciteit.

De Winkelervaring

Door de gangpaden bladeren

De winkel beschikt over een echt grondplan waarbij schappen in visgraat-, rechte of diagonale patronen zijn geplaatst. Genre-bordjes staan bovenop de schappen, categorie-indicatoren hangen aan het plafond en de muur met "New Releases" bevindt zich achterin de winkel.

Elke film is een hoesje op basis van je eigen artwork in de juiste VHS- of DVD-verhoudingen. 4K-edities krijgen een 4K-sticker. Populaire titels tonen meerdere kopieën in het schap, terwijl verschillende kwaliteiten (bijv. 4K en 1080p) worden samengevoegd tot één doos waarbij je de kwaliteit kiest op het moment van afspelen.

De besturing is intuïtief:

  • Cursor-modus: Blader van schap naar schap.
  • First-person modus (F): Loop door de winkel met WASD en muisbesturing. Je kunt elk hoesje binnen bereik oppakken. Er is geen 'teleporteren'; je loopt echt door de ruimte.

Om de ervaring compleet te maken, zwaaien deuren open wanneer je nadert, hoor je alternerende voetstappen in je oren en spelen CRT-schermen aan het plafond fragmenten uit je eigen bibliotheek af met positionele audio.

De muur met nieuwe releases

Je nieuwste toevoegingen worden prominent gepresenteerd onder het bord "2-EVENING NEW RELEASE RENTAL $3", met de diepte van een echte winkelvoorraad bij een nieuwe release datum.

Een hoesje pakken

Door op 'Enter' te drukken, til je het hoesje op. Je ziet de voorkant (retail art) en de huursticker aan de achterkant. Door het hoesje om te draaien zie je:

  • De achterkant: Geen template, maar echte data: synopsis, regisseur, cast, jaar, speelduur en rating.
  • Recensies: Genre-specifieke quotes (bijv. "EEN EXPLOSIEVE SCI-FI SPECTACULAIRE!").
  • Technische specificaties: Een tabel met aspect ratio, HDR10 / Dolby Vision, audiotracks en ondertitels.

Klik op de naam van een acteur om direct naar het schap met films van die acteur te springen. TV-series worden weergegeven als 3D-seizoenboxsets; roteer de doos naar het zijpaneel om een aflevering te kiezen.

De zoekterminal

Met de / toets loop je achter de counter naar de CRT-monitor van de medewerker. Je typt op een amberkleurig fosforscherm; resultaten verschijnen op basis van titel, regisseur of genre. 'Enter' brengt je direct naar de plek van de film in het schap.

Huren alsof het 1994 is

  • Carry mode: Pak een tape en voeg deze toe aan een stapel onderaan je beeld. Met C loop je naar de counter; met ingedrukte 'Enter' ga je direct naar het afrekenen.
  • De tas: De witte plastic tas is een realistische soft body-simulatie van ongeveer 340 nodes. Wanneer je een hoesje in de tas laat vallen, bolt het plastic zichtbaar uit.
  • Uitchecken: Het proces is zorgvuldig gechoreografeerd: inpakken, schuiven, omdraaien en meenemen.

Voor de "hardcore" ervaring kun je de huurmodus inschakelen. Deze dwingt de regels van vroege jaren 90 af: twee tapes op een doordeweekse avond (terug te brengen morgenmiddag), vier in het weekend (terug maandagochtend 8 uur). De winkel blokkeert je toegang totdat de tapes zijn teruggebracht via de klassieke "RETURN TAPES HERE" gleuf.

De woonkamer

Na het afrekenen ben je thuis. Op de salontafel liggen de gehuurde hoesjes en het bonnetje, naast een CRT-televisie en VCR met een knipperende klok. Je kunt de tapes inspecteren vanaf de bank, er één in doen, waarna de film op de TV in de kamer wordt afgespeeld met positionele audio.

De medewerkster

De winkel heeft een medewerkster (een Doom-stijl directionele sprite). Ze is geen decoratie:

  • Ze loopt door de winkel via grid-A* navigatie, vult schappen aan en werkt achter de terminal.
  • Via "ASK FOR RECOMMENDATIONS!" bordjes kun je haar oproepen. Haar suggesties zijn gebaseerd op feiten uit je bibliotheek (bijv. "Je hebt drie van de Alien-films") en ze leert je smaak kennen op basis van wat je bekijkt.

Ontdekking: De winkel vult aan wat je mist

Wanneer Jellyseerr is gekoppeld, fungeert de winkel als een suggestiesysteem:

  • Gaten in collecties: Heb je 3 van de 4 Alien-films? De missende film staat in het schap als een lege doos met een blauwe "REQUEST" label. Selecteer deze en het label verandert in een gouden "COMING SOON".
  • Ontdekken: Trending films die je nog niet bezit, worden tussen je eigen collectie geplaatst als aanvraag-hoesjes.
  • Staff picks: Gebaseerd op je kijkgeschiedenis en overlap met "people-also-liked" lijsten.

De afdeling games

Bij koppeling met RomM verschijnt er een vrijstaande gondola:

  • Platformspecifieke rekken (SNES, N64, PlayStation, Genesis) met de juiste proporties voor boxen en jewel cases.
  • Starten: Het "huren" van een game start deze via een native emulator onder Tauri, of via de in-browser EmulatorJS speler van RomM.

Media Afspelen

De app bevat een volledig aangepaste speler met seekbar, bufferindicatie, skip-functies en menu's voor kwaliteit/audio/ondertitels.

Op een HTPC kan de store bestanden direct vanaf de schijf afspelen via mpv. Dit maakt echte HDR (via libplacebo) en lossless audio mogelijk zonder transcodering. De voortgang wordt teruggestuurd naar Jellyfin, zodat je kijkgeschiedenis up-to-date blijft.

Beheer en Instellingen

Met de 'Left' toets bij de counter open je de managerterminal op een amberkleurig CRT-scherm:

  • Systeemcontrole: Instellingen, 2D-modus, systeem standby, HDMI-CEC display aan/uit en uitloggen.
  • Thema's: Kies uit Halcyon 1990, 1993 (footage era), 2000, 2010 of de rivaliserende keten "Night Owl Video". Daarnaast kun je muurkleuren, plafondhoogte en dag/nacht-cycli aanpassen.
  • Lidmaatschapskaarten: Jellyfin-gebruikers verschijnen als gelamineerde lidmaatschapskaarten met avatar en lidnummer. Je logt in door je kaart te kiezen.

Personalisatie: Maak het eigen

De gehele identiteit (logo, kleuren, lettertypen) is data, geen hardcode.

  1. Plaats je logo (.svg of transparante .png) in public/user-assets/brand/.
  2. Herstart de app.

Het logo wordt automatisch gebruikt voor het uithangbord van de winkel, de genre-bordjes, de huurhoesjes en de tas. Voor diepere aanpassingen kan een brand.json worden gebruikt om paletten en vectoren individueel te beheren.

Technische Modi

2.5D modus

Voor zwakkere hardware zoals een Raspberry Pi is er een co-equal render-modus: pure HTML/CSS zonder WebGL of three.js. De winkelervaring blijft behouden, maar zonder volledige 3D-rendering.

Remote Play

De HTPC fungeert als render-server. Via /remote.html op een telefoon of tablet wordt de live canvas en audio peer-to-peer gestreamd via WebRTC. Dit maakt het mogelijk om de winkel te bedienen vanaf elk apparaat, waarbij de server het zware rekenwerk doet.

Details voor de liefhebbers

  • Kortingsbak: Bevat echt de titels uit je bibliotheek met de laagste publieksscores (recensies van critici worden genegeerd).
  • Audio: Alle retail-audio (deurbel, voetstappen, kliks van de terminal) is live gesynthetiseerd; er worden geen sample-bestanden gebruikt.
  • Visuele pipeline: Maakt gebruik van PBR-neutral of AgX response, met warm-wit tl-licht (~3500K) en optionele film-emulatie (vignet, grain).
  • Screensaver: Na 5 minuten inactiviteit verschijnt een DVD-stijl stuiterend hoesje in 12 fps.

Systeeminrichting en Stabiliteit

De app is gebouwd om wekenlang zonder herstart te draaien:

  • Render-on-demand: Er wordt alleen gerenderd wanneer er iets verandert. Bij inactiviteit stopt de loop volledig, wat resulteert in nagenoeg nul CPU/GPU gebruik.
  • Kiosk deployment: Bevat een systemd user service met automatische herstarts en een geheugenplafond van 4 GB om eventuele memory leaks op te vangen.

Integraties in één oogopslag

ComponentWat je krijgt
Jellyfin (Vereist)De winkel, browsen, loop-modus, afspelen, huurproces, woonkamer, medewerkster, thema's.
Jellyseerr (Optioneel)Aanbevelingsbordjes, REQUEST/COMING SOON hoesjes, collectie-gaten, staff picks.
RomM (Optioneel)De afdeling videogames en het starten van emulators.
Tauri build (Optioneel)mpv playback, HDMI-CEC controle, systeem suspend, native game launch.
Geen serverDemo-modus via ?demo=1 met een synthetische bibliotheek.

Privacy en Netwerk

De store is ontworpen voor lokale netwerken. Alle assets (fonts, textures) zitten in de bundle. Alleen twee functies maken extern contact:

  1. Jellyseerr discovery: Haalt cover-art op van image.tmdb.org voor titels die je nog niet bezit.
  2. Remote Play: Gebruikt stun.l.google.com om het publieke IP-adres te bepalen voor verbindingen buiten het netwerk.

Snelstart

Via Git/NPM

git clone https://github.com/halcyon-video/halcyon-video
cd halcyon-video
npm install
npm run dev

Via Docker

docker run -d --name halcyon --network host --restart unless-stopped \
ghcr.io/halcyon-video/halcyon-video

Open vervolgens http://<host>:1420 in je browser.

Licentie en Projectbeheer

Het project is gelicenseerd onder GPL-3.0. De broncode is open, maar de ontwikkeling is gecentraliseerd; er worden geen pull requests geaccepteerd voor nieuwe features of patches. Gebruikers worden aangemoedigd om de code te forken als ze het project in een andere richting willen sturen.