Le serveur gagne un onglet Radio : les stations de l'annuaire, écoutables en direct dans le navigateur ou enregistrables — jusqu'à l'arrêt ou pour une durée choisie —, puis réécoutables depuis l'interface. Quatre enregistrements en parallèle au plus ; si le flux tombe, il est rouvert et le fichier continue. Les enregistrements rejoignent la bibliothèque : le mobile les reçoit. Un redémarrage du service clôt proprement les captures en cours, et celles restées « en cours » après un plantage sont récupérées au démarrage suivant. La copie de flux sans blocs ICY, propre au guet, est extraite pour être partagée. Côté mobile, la synchronisation manuelle n'était qu'un petit lien dans l'onglet Connexion : elle a maintenant un vrai bouton dans l'onglet Synchronisation. Deux passages ne se chevauchent plus, et une erreur inattendue s'affiche au lieu de fermer l'application. Le code Kotlin n'a pas été compilé sur cette machine (pas de JDK) : il a été relu, mais reste à construire. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N6pmSE168yjyf8vgV8mZx6
77 lines
3.4 KiB
Markdown
77 lines
3.4 KiB
Markdown
# 🖥️ Noxely — serveur
|
|
|
|
Le serveur porte tout ce qui coûtait de la batterie au téléphone : la recherche dans les
|
|
catalogues, le guet des radios, l'enregistrement et le téléchargement. Le mobile ne fait plus que
|
|
récupérer des fichiers prêts.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
make server-venv # crée le venv et installe les dépendances
|
|
cp server/.env.example server/.env # puis renseigner NOXELY_TOKEN
|
|
make server-run # lancement au premier plan, pour essayer
|
|
```
|
|
|
|
L'interface de pilotage est à `http://<hôte>:8710` — recherche, guets, file et bibliothèque.
|
|
Le jeton se saisit une fois dans l'en-tête de la page.
|
|
|
|
## En service
|
|
|
|
```bash
|
|
make server-install # unité systemd (sudo demandé)
|
|
make server-status # état
|
|
make server-logs # journal suivi
|
|
```
|
|
|
|
## API
|
|
|
|
| Route | Qui l'utilise |
|
|
|---|---|
|
|
| `GET /api/health` | tout le monde, sans jeton |
|
|
| `GET /api/library?since=<curseur>` | **le mobile** — uniquement ce qui a changé |
|
|
| `GET /api/media/{id}/file` | **le mobile** — le fichier |
|
|
| `GET /api/search`, `/api/tracks`, `POST /api/queue` | l'interface web |
|
|
| `GET/POST/DELETE /api/watches`, `POST /api/watches/sweep` | l'interface web |
|
|
| `GET /api/radio/stations`, `POST /api/radio/record`, `POST /api/radio/record/{id}/stop`, `GET /api/radio/recordings` | l'interface web — stations, enregistrement à la demande |
|
|
| `GET /api/heard?limit=&q=` | l'interface web — l'historique de ce qui a été entendu |
|
|
| `GET /api/rotation?last=100&top=20` | l'interface web — ce qui tourne sur les *n* dernières remontées |
|
|
|
|
Toutes les routes sauf `/api/health` exigent l'en-tête `X-Noxely-Token`.
|
|
|
|
## Radio : écouter et enregistrer
|
|
|
|
L'onglet **📻 Radio** liste les stations (annuaire Radio Browser, filtrables par genre et par nom).
|
|
Chacune peut s'écouter en direct dans le navigateur, ou s'enregistrer jusqu'à l'arrêt — ou pour
|
|
une durée choisie (15 min à 2 h). Jusqu'à quatre stations en parallèle.
|
|
|
|
Un enregistrement rejoint la bibliothèque comme n'importe quel média : on le réécoute depuis
|
|
l'interface web, et le mobile le récupère à sa prochaine synchronisation. Si le flux tombe, le
|
|
serveur le rouvre (jusqu'à cinq essais d'affilée) et continue dans le même fichier. Un
|
|
redémarrage du service clôt proprement les enregistrements en cours. `NOXELY_RECORD_MAX_MINUTES`
|
|
(180) plafonne la durée, pour qu'un enregistrement oublié ne remplisse pas le disque.
|
|
|
|
## Historique et rotation
|
|
|
|
Le serveur note chaque titre annoncé par les stations qu'il balaie (ICY), même quand aucun
|
|
morceau n'est guetté. Une station qui n'a pas changé de morceau depuis le dernier tour n'ajoute
|
|
rien, et celles qui n'annoncent qu'elles-mêmes sont écartées.
|
|
|
|
La **rotation** compte, sur les *n* dernières remontées (100 par défaut), les passages de chaque
|
|
titre et de chaque artiste, avec le nombre de stations distinctes qui les diffusent.
|
|
|
|
Sans guet en cours, un tour a lieu toutes les `NOXELY_LISTEN_INTERVAL` secondes (60 par défaut)
|
|
— quelques dizaines de kilo-octets par station. `NOXELY_HISTORY=0` coupe l'historique ; les
|
|
lignes plus vieilles que `NOXELY_HISTORY_DAYS` (90) sont purgées.
|
|
|
|
## Licence
|
|
|
|
GPL v3, comme le reste du projet — voir [`../LICENSE`](../LICENSE).
|
|
|
|
## Données
|
|
|
|
```
|
|
$NOXELY_DATA/
|
|
├── noxely.sqlite3 index des médias, des guets et de l'historique des écoutes
|
|
└── media/ les fichiers eux-mêmes
|
|
```
|