Le balayage ne servait qu'à trouver un morceau guetté, puis oubliait tout. Il note désormais chaque titre annoncé par les stations, même sans guet en cours : un onglet Écoutes montre l'historique, et la rotation — passages et stations distinctes, par titre et par artiste — sur les 100 dernières remontées. Pour que l'historique soit fiable, un tour va maintenant jusqu'au bout après une trouvaille (l'enregistrement part aussitôt, le début du morceau n'est pas perdu), et la liste des stations est mise en cache une demi-heure au lieu d'interroger l'annuaire à chaque tour. Essayé sur de vraies radios : une station alternait le vrai titre et un titre de repli, ce qui doublait les passages. Un titre déjà relevé sur la même station dans les dix minutes est donc ignoré. Première moitié de la reconnaissance des morceaux ; l'écoute continue et l'empreinte sonore suivront. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
77 lines
4.2 KiB
JavaScript
77 lines
4.2 KiB
JavaScript
// Noxely — collecte côté serveur, écoute hors connexion côté mobile.
|
|
// Copyright © 2026 Johnny (tuxgyver)
|
|
//
|
|
// Ce programme est un logiciel libre : vous pouvez le redistribuer et le modifier
|
|
// selon les termes de la GNU General Public License, version 3 ou ultérieure,
|
|
// telle que publiée par la Free Software Foundation.
|
|
//
|
|
// Il est distribué dans l'espoir d'être utile, mais SANS AUCUNE GARANTIE.
|
|
// Voir le fichier LICENSE à la racine du dépôt pour le texte complet.
|
|
|
|
// Contenu de la page « À propos », séparé de son rendu.
|
|
// Tout ce qui est écrit ici se vérifie dans le dépôt : une fonction décrite existe, une garantie
|
|
// annoncée est tenue par du code. La version vient de /api/health, jamais recopiée.
|
|
const ABOUT = {
|
|
name: 'Noxely — serveur',
|
|
tagline: 'Il cherche, il guette, il enregistre. Le téléphone n\'a plus qu\'à écouter.',
|
|
repository: 'https://git.tuxtech.fr/tuxgyver/Noxely',
|
|
author: 'Johnny',
|
|
authorRole: 'Conception, direction et supervision',
|
|
authorship:
|
|
'Application développée avec l\'assistance de l\'IA, sous la direction et la supervision de Johnny.',
|
|
license: 'GPL v3',
|
|
copyright: 'Copyright © 2026 Johnny (tuxgyver)',
|
|
|
|
// Ce que fait le serveur, du point de vue de qui s'en sert.
|
|
features: [
|
|
['Chercher partout à la fois',
|
|
'Internet Archive, Underground (netlabels et Free Music Archive), LibriVox et Wikimedia ' +
|
|
'Commons sont interrogés en parallèle, les résultats fondus et les plus légers mis en tête.'],
|
|
['Choisir avant de télécharger',
|
|
'Un album ou un livre affiche ses pistes avec leur taille : on met en file ce qu\'on veut, ' +
|
|
'pas l\'ensemble.'],
|
|
['Guetter un morceau sur les radios',
|
|
'On nomme un titre sans désigner de station : les plus écoutées sont balayées en continu, ' +
|
|
'et l\'enregistrement part dès que l\'une le diffuse.'],
|
|
['Enregistrer un direct',
|
|
'La capture prend le nom du morceau annoncé par la station, et s\'arrête quand il cède la ' +
|
|
'place au suivant.'],
|
|
['Garder l\'historique et repérer la rotation',
|
|
'Chaque titre annoncé par les stations est noté ; l\'onglet Écoutes montre ce qui a été ' +
|
|
'entendu et ce qui tourne le plus sur les dernières remontées, titres comme artistes.'],
|
|
['Tenir la file',
|
|
'Les téléchargements s\'enchaînent seuls ; un échec est repris, son état reste visible.'],
|
|
['Servir le mobile',
|
|
'L\'application demande ce qui a changé depuis son dernier passage et récupère des fichiers ' +
|
|
'déjà prêts — c\'est ce qui lui épargne sa batterie.'],
|
|
],
|
|
|
|
guaranteesIntro:
|
|
'Noxely est un outil personnel : rien n\'y transite par un service tiers, et le serveur ne ' +
|
|
'répond qu\'à ce qui présente un jeton valide.',
|
|
|
|
// Chaque promesse est tenue par du code.
|
|
guarantees: [
|
|
'Aucun compte, aucune clé d\'API : les quatre catalogues et l\'annuaire radio sont publics.',
|
|
'Toute route de données exige un jeton — celui du serveur, ou celui d\'un appareil appairé ; ' +
|
|
'seuls l\'état de santé, la page et ses ressources répondent sans.',
|
|
'Chaque appareil reçoit son propre jeton : en révoquer un ne coupe pas les autres.',
|
|
'Les jetons d\'appareil ne sont jamais renvoyés par la route qui les liste.',
|
|
'L\'appairage n\'est possible que pendant une fenêtre ouverte depuis cette interface, deux ' +
|
|
'minutes durant, une seule fois, et depuis le réseau local uniquement.',
|
|
'Les catalogues ne proposent que des œuvres libres ou du domaine public ; les éléments en ' +
|
|
'accès restreint sont écartés avant même d\'être affichés.',
|
|
'Une synchronisation partielle ne fait pas avancer le curseur du client : rien n\'est perdu.',
|
|
],
|
|
|
|
// Couche → outils.
|
|
stack: [
|
|
['Service', 'Python, FastAPI, uvicorn, unité systemd'],
|
|
['Données', 'SQLite pour l\'index, fichiers sur disque pour les médias'],
|
|
['Collecte', 'httpx asynchrone, flux ICY pour les titres de radio'],
|
|
['Catalogues', 'Internet Archive, netlabels, LibriVox, Wikimedia Commons'],
|
|
['Interface', 'HTML, CSS et JavaScript sans dépendance'],
|
|
['Synchronisation', 'HTTP avec jeton, curseur incrémental côté client'],
|
|
],
|
|
};
|