No description
- JavaScript 74.2%
- CSS 14.7%
- Python 5.5%
- HTML 4.4%
- Shell 1.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .githooks | ||
| LICENSES | ||
| resources/git | ||
| tests | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| AGENTS.md | ||
| app.js | ||
| apple-touch-icon.png | ||
| craig-pelton-background.png | ||
| favicon.ico | ||
| history.example.json | ||
| icon-192.png | ||
| icon-512.png | ||
| index.html | ||
| LICENSE | ||
| manifest.json | ||
| player-core.js | ||
| README.md | ||
| style.css | ||
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.icoet 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
LICENSEetLICENSES/.
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.jsdans un noyau dédiéplayer-core.js: le lecteur est créé parwindow.RcpPlayer.createRcpPlayer(), chargé avantapp.js. app.jsconserve 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.htmlréférenceplayer-core.jsetapp.jsavec 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ônesicon-192.png,icon-512.png(dérivées du PNG 256 px defavicon.ico) etapple-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 MIMEapplication/jsonnatif 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) ;opustagsreste 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:1signifie activé,0désactivé ; aucune migration de l’ancienne clé n’est effectuée. - Le décochage coupe les animations d’ambiance ;
prefers-reduced-motionet 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--cardexistante. - Cache-busting porté à
?v=0.7.6.
Changements 0.7.5
- Refonte du mot
RADIOen enseigne compacte, nette et centrée au-dessus deCraig 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
localStoraged'une intention de lecture expliciteplay/stop. - Après rechargement, un hint
playsurvit à 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-motionet 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
Radioreste 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
setTimeoutdéclenche les éclats ponctuels ; le micro-déplacement est synchronisé au rendu par un seulrequestAnimationFramepartagé, 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-modeou transformation 3D n’est utilisé ; seul unbox-shadowstatique 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: reducedé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 :
requestAnimationFramele 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
Radiodevient un élément graphique superposé : rotation-15deg, échelle3×, décalage horizontal+4em, flou1.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 Peltonconserve sa luminosité d’origine (var(--fg),#f4f7f5), son légertext-shadowblanc 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
metadatapublier la nouvelle image sans réintroduire de flicker. /coverest 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_atne 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_atvariait 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, puisCraig Pelton;Craig Peltonreste insécable. - En tablette paysage, le libellé « Actuellement à l’écoute » passe à
0.87empour retrouver la largeur du composant de lecture. - Sur desktop à partir de 75rem, seule la partie
Radiodu 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-webversrcp-web. - Nouveau
favicon.icomulti-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
RdeRadio 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
5pxlaisse 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.icocraig-pelton-background.png