No description
  • JavaScript 74.2%
  • CSS 14.7%
  • Python 5.5%
  • HTML 4.4%
  • Shell 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Olivier Cortès 60deb17591 Release rcp-web 0.10.1 with version shown in footer
Assisted-by: Ventoline <ventdunord@asami.rocks>
2026-11-11 00:24:33 +01:00
.githooks Configure canonical Git attribution policy and tooling 2026-08-28 22:55:25 +00:00
LICENSES Add dual project licensing 2026-09-03 20:03:14 +02:00
resources/git Release rcp-web 0.8.0 with resilient live audio handoff 2026-10-27 00:13:55 +00:00
tests Release rcp-web 0.10.0 with audio engine extracted to player-core 2026-11-10 23:33:40 +01:00
.gitignore Refine branding and autoplay guidance for 0.7.5 2026-09-03 19:35:13 +02:00
.gitlab-ci.yml Configure canonical Git attribution policy and tooling 2026-08-28 22:55:25 +00:00
AGENTS.md Release rcp-web 0.8.0 with resilient live audio handoff 2026-10-27 00:13:55 +00:00
app.js Release rcp-web 0.10.0 with audio engine extracted to player-core 2026-11-10 23:33:40 +01:00
apple-touch-icon.png Release rcp-web 0.9.0 with installable PWA standalone manifest 2026-11-08 12:57:00 +01:00
craig-pelton-background.png Reconstruct Radio Craig Pelton web 0.6.0 from archive 2026-08-15 22:48:46 +02:00
favicon.ico Recover pre-0.6.0 favicon snapshot from misnamed archive 2026-08-15 22:37:46 +02:00
history.example.json Reconstruct RCP-history web 0.5.10 from archive 2026-08-14 10:26:23 +02:00
icon-192.png Release rcp-web 0.9.0 with installable PWA standalone manifest 2026-11-08 12:57:00 +01:00
icon-512.png Release rcp-web 0.9.0 with installable PWA standalone manifest 2026-11-08 12:57:00 +01:00
index.html Release rcp-web 0.10.1 with version shown in footer 2026-11-11 00:24:33 +01:00
LICENSE Release rcp-web 0.9.0 with installable PWA standalone manifest 2026-11-08 12:57:00 +01:00
manifest.json Release rcp-web 0.9.0 with installable PWA standalone manifest 2026-11-08 12:57:00 +01:00
player-core.js Release rcp-web 0.10.0 with audio engine extracted to player-core 2026-11-10 23:33:40 +01:00
README.md Release rcp-web 0.10.1 with version shown in footer 2026-11-11 00:24:33 +01:00
style.css Release rcp-web 0.8.0 with resilient live audio handoff 2026-10-27 00:13:55 +00:00

rcp-web 0.10.1

Site statique de Radio Craig Pelton.

Licence

  • Code, configuration, scripts et documentation : GNU AGPL v3 ou ultérieure (AGPL-3.0-or-later).
  • Assets visuels craig-pelton-background.png, favicon.ico et icônes dérivées (icon-192.png, icon-512.png, apple-touch-icon.png) : CC BY-SA 4.0 (CC-BY-SA-4.0).
  • Les textes complets et le périmètre précis sont dans LICENSE et LICENSES/.

Changements 0.10.1

  • Affichage de la version de rcp-web dans le pied de page (rcp-web 0.10.1), à côté du lien lodlp.net et de la mention d'historique.
  • Cache-busting CSS/JS porté à ?v=0.10.1 ; aucun changement fonctionnel.

Changements 0.10.0

  • Extraction du moteur audio de app.js dans un noyau dédié player-core.js : le lecteur est créé par window.RcpPlayer.createRcpPlayer(), chargé avant app.js.
  • app.js conserve l’interface, le compteur d’écoute et la persistance de l’intention de lecture ; il délègue au noyau la connexion au flux, les relais make-before-break, le watchdog, les volumes et l’autoplay.
  • Aucun changement de comportement audible ni de configuration serveur ; index.html référence player-core.js et app.js avec le cache-busting ?v=0.10.0.
  • 51 tests Node réussis : 43 de non-régression et 8 nouveaux dédiés au noyau player-core.js.

Changements 0.9.0

  • Support PWA : le site devient installable en application autonome depuis l'écran d'accueil (option « Installer » de Firefox/Chrome Android), sans Service Worker ni cache hors-ligne, la radio exigeant une connectivité temps réel.
  • Ajout de manifest.json (display: standalone, theme_color/background_color #0b0d10, start_url: /) et des icônes icon-192.png, icon-512.png (dérivées du PNG 256 px de favicon.ico) et apple-touch-icon.png (180 px, fond opaque #0b0d10).
  • index.html : déclarations <link rel="manifest">, <meta name="theme-color"> et <link rel="apple-touch-icon"> ; rendu desktop et logique audio inchangés.
  • Le manifeste servi utilise l'extension .json (type MIME application/json natif de nginx), sans modification de la configuration du serveur.
  • Cache-busting CSS/JS porté à ?v=0.9.0.

Changements 0.8.1

  • Historique : suivi automatique du nouveau jour lorsque la page était positionnée sur le dernier jour disponible avant le rafraîchissement. Corrige le blocage apparent sur la veille après minuit, sans dépendance à l'heure de début du dernier morceau.
  • Les dates antérieures sélectionnées manuellement restent affichées tant qu'elles appartiennent à la fenêtre de rétention publiée par history.json (14 jours courants). Dès qu'une date sort de cette plage, retour au dernier jour disponible.
  • Conservation des filtres et du comportement anti-flicker des jaquettes ; aucune modification du MBB, des réglages audio ni des daemons de la radio.
  • 43 tests Node réussis, dont 11 nouveaux cas d'historique : bascules à minuit, navigation manuelle, rétention glissante, 15 transitions de jours consécutives et invariants visuels.
  • Cache-busting CSS/JS porté à ?v=0.8.1.

Changements 0.8.0

  • Nouvelle résilience du flux Ogg/Opus en continu : watchdog de progression et de dérive, reconnexions bornées et relais audio make-before-break (deux connexions HTML Audio successives avec fondu 300 ms).
  • Chaque connexion reçoit une URL /radio.opus?session=... distincte, afin d'éviter la réutilisation de données média anciennes constatée dans Firefox.
  • Préparation du nouveau flux en lecture à volume nul, muted=false, puis fondu simultané A → B ; compensation de relais fixée à 0 ms. La cadence reste temporairement réglée sur un relais à chaque chanson (AUDIO_HANDOFF_AFTER_MINUTES=0), telle que qualifiée sous Firefox Nightly et ESR.
  • Maintien des métadonnées externes au flux (metadata-daemon) ; opustags reste désactivé.
  • Ajout du compteur d'écoute cumulée dans localStorage, d'un compteur de session et d'indications de connexion/récupération dans le lecteur.
  • 32 tests de non-régression JavaScript : watchdog, accès, gestion des deux lecteurs, horloges, compteur, transition, gain et URLs uniques.
  • Qualification empirique favorable sous Firefox Nightly (plus d'une heure) et Firefox ESR (plus de deux heures), sans problème de relais signalé. Limite connue : la reprise après une interruption Bluetooth imposant une pause externe a échoué sous Nightly ; pas encore corrigée ni qualifiée.
  • Cache-busting de CSS/JS à ?v=0.8.0.

Changements 0.7.7

  • Le contrôle d’ambiance adopte une sémantique positive : « exubérances peltoniennes », cochée par défaut.
  • La préférence persistée devient rcp-exuberance-enabled : 1 signifie activé, 0 désactivé ; aucune migration de l’ancienne clé n’est effectuée.
  • Le décochage coupe les animations d’ambiance ; prefers-reduced-motion et la détection ARMv6/v7 restent des garde-fous effectifs sans inverser l’état visuel de la case.
  • Cache-busting porté à ?v=0.7.7.

Changements 0.7.6

  • Fond du panneau « Actuellement à l’écoute » légèrement éclairci avec une teinte dédiée rgba(24, 31, 26, 0.78) afin de mieux distinguer le bloc sur la page d’accueil.
  • Opacité (0.78) et flou d’arrière-plan (5px) conservés ; les autres surfaces restent sur la teinte --card existante.
  • Cache-busting porté à ?v=0.7.6.

Changements 0.7.5

  • Refonte du mot RADIO en enseigne compacte, nette et centrée au-dessus de Craig Pelton, avec gradient ivoire/or → magenta/violet et éclairs décoratifs CSS ; suppression du traitement géant/flouté précédent.
  • Affinage de l'aide à l'autoplay : panneau placé en haut de page, texte plus lisible, formulation générique « votre navigateur » et pointeur 👆 animé verticalement en CSS.
  • Le panneau d'aide reste non interactif (pointer-events: none) afin que le premier geste utilisateur puisse immédiatement débloquer la lecture.
  • Le répertoire local client/ est ignoré par Git afin de conserver les APK servis hors de l'historique du frontend.
  • Cache-busting finalisé en ?v=0.7.5.

Changements 0.7.4

  • Lorsqu'une reprise automatique échoue spécifiquement avec NotAllowedError, affichage d'une aide visuelle indiquant que l'autoplay peut être autorisé pour les visites suivantes.
  • L'aide disparaît dès que la lecture démarre ou lorsque l'utilisateur arrête explicitement la radio.
  • Les autres erreurs de lecture ne sont pas présentées comme un blocage d'autoplay.

Changements 0.7.3

  • Persistance dans localStorage d'une intention de lecture explicite play / stop.
  • Après rechargement, un hint play survit à l'absence temporaire du lecteur pendant la validation mTLS et déclenche la reprise dès que le widget devient disponible.
  • Un échec réseau, mTLS, audio ou de politique d'autoplay ne convertit jamais implicitement le hint en stop ; seul un arrêt volontaire de l'utilisateur le fait.
  • Si le navigateur bloque l'autoplay, une nouvelle tentative est armée au premier geste utilisateur hors contrôles du lecteur.

Changements 0.7.2

  • Ajout du contrôle persistant « désactiver l'exubérance » pour couper les animations d'ambiance coûteuses sur les machines modestes.
  • Détection automatique prudente de prefers-reduced-motion et des plateformes ARMv6/ARMv7 32 bits, avec possibilité de surcharge manuelle.
  • Le shimmer du libellé de lecture est conservé en toutes circonstances : il reste l'indicateur fonctionnel que le flux audio est en cours.

Changements 0.7.1

  • Sur desktop et tablette en orientation paysage, le cadre du morceau en cours est ramené à 60 % de la largeur disponible et aligné à droite : il ne recouvre plus qu’une partie de l’illustration au lieu de la masquer largement.
  • L’alignement à droite du titre et du sous-titre, jusque-là réservé au desktop, s’applique désormais aussi aux tablettes en paysage.
  • Le traitement graphique surdimensionné du mot Radio reste réservé au desktop (min-width: 75rem).
  • Cache-busting des assets mis à jour vers ?v=0.7.1.

Changements 0.7.0

  • Ajout d’un fond animé très léger inspiré des reflets d’une boule à facettes : points et étoiles pastel apparaissent brièvement sur le fond sombre.
  • Répartition actuelle : 2 étoiles à huit branches, 4 étoiles à six branches et 16 points. Les 22 reflets principaux sont créés une seule fois puis réutilisés ; seules les deux étoiles à huit branches portent chacune un bras DOM statique supplémentaire.
  • Un unique setTimeout déclenche les éclats ponctuels ; le micro-déplacement est synchronisé au rendu par un seul requestAnimationFrame partagé, avec une cible explicite de 60 FPS, qui ne met à jour que les reflets actifs.
  • La position principale des éléments change uniquement lorsqu’ils sont invisibles ; une fois visibles, leur micro-déplacement suit la cadence de rendu du navigateur, plafonnée à 60 FPS, afin d’éviter les battements d’un ticker indépendant.
  • Aucun canvas, WebGL, filter, blur, mix-blend-mode ou transformation 3D n’est utilisé ; seul un box-shadow statique fournit le halo doux.
  • La majorité des éclats est biaisée vers les marges et le haut du viewport afin de limiter les invalidations sous les surfaces utilisant déjà backdrop-filter.
  • L’animation est immédiatement arrêtée quand l’onglet devient caché et reprend au retour.
  • prefers-reduced-motion: reduce désactive entièrement l’effet, y compris côté JavaScript.
  • Les points sont désormais au nombre de 16 et leur diamètre varie fortement à chaque apparition, de 3 à 16 px, afin de mélanger simultanément petites poussières lumineuses et points plus présents. Leur facteur d’échelle est volontairement limité pour conserver cette plage lisible.
  • Les anciennes étoiles à quatre bras deviennent des étoiles à huit bras formées de quatre segments à 45° ; les étoiles à six bras conservent leurs trois segments à 60°. Leur point de croisement est désormais davantage décentré à chaque apparition (environ 12 à 28 % hors centre) pour accentuer l’asymétrie des bras.
  • Un unique effet de halo doux (box-shadow) a été ajouté aux reflets ; il ne varie pas pendant l’animation.
  • Le micro-déplacement n’est plus échantillonné par un timer fixe : requestAnimationFrame le synchronise au rafraîchissement réel du navigateur. La cible est fixée à 60 FPS et l’amplitude est encore augmentée à environ ±28 px horizontalement / ±20 px verticalement, sans modifier la durée des mouvements.
  • Sur les grands écrans (min-width: 75rem), le titre et le sous-titre sont alignés à droite afin de dégager l’illustration de fond ; mobile et tablette conservent leur centrage.
  • Sur desktop, le mot Radio devient un élément graphique superposé : rotation -15deg, échelle 3×, décalage horizontal +4em, flou 1.4px, tout en conservant son opacité 0.55. Ces quatre valeurs sont exposées comme variables CSS locales pour faciliter l’ajustement visuel.
  • Le nom Craig Pelton conserve sa luminosité d’origine (var(--fg), #f4f7f5), son léger text-shadow blanc de 1 px et son halo statique renforcé en deux couches doré → violet : 8 px / 95 % d’opacité pour la couche proche et 20 px / 85 % pour la couche diffuse.
  • Cache-busting des assets mis à jour vers ?v=0.7.0.

Changements 0.6.5

  • Correction du cas « nouveau morceau sans jaquette » introduit en 0.6.4 : l’ancienne jaquette ne peut plus rester affichée indéfiniment.
  • Lors d’un vrai changement de morceau, l’ancienne jaquette reste visible pendant une fenêtre de convergence d’environ une seconde afin de laisser metadata publier la nouvelle image sans réintroduire de flicker.
  • /cover est sondé immédiatement, puis après 250 ms et 750 ms supplémentaires. Si aucune image n’est disponible à l’issue de cette fenêtre, l’ancienne jaquette est retirée et le placeholder est affiché.
  • Si la nouvelle jaquette devient disponible pendant cette fenêtre, elle est toujours préchargée avant de remplacer l’ancienne.
  • Cache-busting des assets mis à jour vers ?v=0.6.5.

Changements 0.6.4

  • Suppression du flicker périodique des jaquettes : une variation mineure de track_started_at ne suffit plus à déclarer un nouveau morceau.
  • L’historique n’est plus reconstruit lorsque la liste visible est strictement identique ; les éléments <img> existants restent donc dans le DOM et conservent leur image décodée.
  • Cache-busting des assets mis à jour vers ?v=0.6.4.

Changements 0.6.3

  • Première réduction des rerenders : l’historique n’est plus reconstruit à chaque heartbeat now-playing, mais seulement lorsqu’un changement de morceau est détecté.
  • Cette correction était insuffisante lorsque track_started_at variait légèrement entre deux publications du même morceau.
  • Cache-busting des assets mis à jour vers ?v=0.6.3.

Changements 0.6.2

  • En mobile portrait jusqu’à 42rem, le titre est forcé sur deux lignes : Radio, puis Craig Pelton; Craig Pelton reste insécable.
  • En tablette paysage, le libellé « Actuellement à l’écoute » passe à 0.87em pour retrouver la largeur du composant de lecture.
  • Sur desktop à partir de 75rem, seule la partie Radio du titre passe à opacity: 0.55.
  • Le sous-titre reçoit un très léger contour noir (0.35px) et une ombre discrète pour rester lisible sur l’illustration.
  • Cache-busting des assets mis à jour vers ?v=0.6.2.

Changements 0.6.1

  • En orientation portrait jusqu’à 64rem de large, l’image de fond est centrée horizontalement tout en conservant exactement son décalage vertical.
  • En orientation paysage entre 48.01rem et 75rem, le libellé « Actuellement à l’écoute » passe à 0.75em.
  • Cache-busting des assets mis à jour vers ?v=0.6.1.

Changements 0.6.0

  • Projet et archive renommés de RCP-history-web vers rcp-web.
  • Nouveau favicon.ico multi-tailles.
  • Ajout de craig-pelton-background.png, image fixe en arrière-plan.
  • Le haut de l’image est placé à mi-distance entre le haut de la page et le haut du R de Radio Craig Pelton.
  • Cette distance vaut clamp(1.5rem, 4vw, 3.5rem) et est réutilisée à l’identique pour le décalage horizontal.
  • Les surfaces principales (now-playing, filtres, tuiles d’historique et état vide) utilisent un fond semi-transparent.
  • Un flou d’arrière-plan léger de 5px laisse l’illustration apparaître derrière les surfaces sans modifier l’opacité des textes, jaquettes ou contrôles.
  • Cache-busting des assets mis à jour vers ?v=0.6.0.

Positionnement de l’illustration

Le padding-top de la page est :

--page-top: clamp(3rem, 8vw, 7rem);

Le décalage de l’illustration est exactement sa moitié :

--background-offset: clamp(1.5rem, 4vw, 3.5rem);
background-position: var(--background-offset) var(--background-offset);

Le même décalage est donc appliqué depuis le haut et depuis la gauche.

Déploiement

Copier le contenu du répertoire radio.lodlp.net/ dans la racine statique du vhost radio.lodlp.net.

Les nouveaux assets à déployer avec index.html, app.js et style.css sont :

  • favicon.ico
  • craig-pelton-background.png