From 51b60cda70e52e90f54b75f4b39c2d8ab0b84c3a Mon Sep 17 00:00:00 2001 From: Johnny Date: Sun, 13 Sep 2026 20:15:14 +0200 Subject: [PATCH] =?UTF-8?q?Appairage=20du=20t=C3=A9l=C3=A9phone,=20en-t?= =?UTF-8?q?=C3=AAtes=20de=20licence=20(2.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Recopier un jeton de trente-trois caractères sur un clavier tactile n'était pas un réglage, c'était une corvée. On ouvre désormais une fenêtre depuis le serveur, on appuie sur Appairer côté téléphone, et c'est fait. Le jeton n'est pas pour autant distribué : ouvrir la fenêtre l'exige déjà, elle dure deux minutes, se referme dès qu'un appareil s'est servi, et ne répond qu'à une adresse privée. Le champ de saisie reste là pour qui préfère le coller. Les cinquante fichiers de code portent en outre leur notice de licence, comme la GPL le recommande. Elle est en français, comme le reste ; le texte qui fait foi demeure celui de LICENSE, non traduit. --- CHANGELOG.md | 16 +++++ README.md | 3 +- VERSION | 2 +- .../java/fr/tuxgyver/noxely/MainActivity.kt | 12 ++++ .../main/java/fr/tuxgyver/noxely/NoxelyApp.kt | 12 ++++ .../tuxgyver/noxely/library/ArtworkFinder.kt | 12 ++++ .../tuxgyver/noxely/library/ImportedStore.kt | 12 ++++ .../noxely/library/LibraryRepository.kt | 12 ++++ .../noxely/library/LocalMediaScanner.kt | 12 ++++ .../tuxgyver/noxely/library/PlaylistStore.kt | 12 ++++ .../java/fr/tuxgyver/noxely/model/Media.kt | 12 ++++ .../java/fr/tuxgyver/noxely/model/Playlist.kt | 12 ++++ .../noxely/offline/DownloadTracker.kt | 12 ++++ .../noxely/offline/NoxelyDownloadService.kt | 12 ++++ .../tuxgyver/noxely/offline/OfflineModule.kt | 12 ++++ .../fr/tuxgyver/noxely/playback/MediaItems.kt | 12 ++++ .../noxely/playback/PlaybackService.kt | 12 ++++ .../noxely/playback/PlayerController.kt | 12 ++++ .../fr/tuxgyver/noxely/radio/RecordingSink.kt | 12 ++++ .../java/fr/tuxgyver/noxely/sources/Http.kt | 12 ++++ .../fr/tuxgyver/noxely/sync/ServerSettings.kt | 12 ++++ .../fr/tuxgyver/noxely/sync/SyncClient.kt | 47 +++++++++++++++ .../fr/tuxgyver/noxely/sync/SyncWorker.kt | 12 ++++ .../java/fr/tuxgyver/noxely/ui/NoxelyRoot.kt | 12 ++++ .../tuxgyver/noxely/ui/about/AboutScreen.kt | 12 ++++ .../fr/tuxgyver/noxely/ui/about/AppInfo.kt | 12 ++++ .../fr/tuxgyver/noxely/ui/about/Changelog.kt | 12 ++++ .../tuxgyver/noxely/ui/components/Artwork.kt | 12 ++++ .../tuxgyver/noxely/ui/components/Format.kt | 12 ++++ .../tuxgyver/noxely/ui/components/MediaRow.kt | 12 ++++ .../noxely/ui/library/LibraryScreen.kt | 12 ++++ .../noxely/ui/offline/DownloadsScreen.kt | 12 ++++ .../tuxgyver/noxely/ui/player/MiniPlayer.kt | 12 ++++ .../noxely/ui/player/NowPlayingScreen.kt | 12 ++++ .../noxely/ui/playlists/AddToPlaylistSheet.kt | 12 ++++ .../ui/playlists/PlaylistDetailScreen.kt | 12 ++++ .../noxely/ui/playlists/PlaylistsScreen.kt | 12 ++++ .../tuxgyver/noxely/ui/server/ServerScreen.kt | 36 ++++++++++- .../tuxgyver/noxely/ui/sources/UpdateCard.kt | 12 ++++ .../java/fr/tuxgyver/noxely/ui/theme/Theme.kt | 12 ++++ .../noxely/update/UpdateCheckWorker.kt | 12 ++++ .../tuxgyver/noxely/update/UpdateNotifier.kt | 12 ++++ .../noxely/update/UpdateRepository.kt | 12 ++++ server/noxely_server/__init__.py | 10 ++++ server/noxely_server/__main__.py | 10 ++++ server/noxely_server/api.py | 60 +++++++++++++++++++ server/noxely_server/config.py | 10 ++++ server/noxely_server/sources/__init__.py | 10 ++++ server/noxely_server/sources/catalogs.py | 10 ++++ server/noxely_server/sources/radio.py | 10 ++++ server/noxely_server/storage.py | 10 ++++ server/noxely_server/web/index.html | 21 +++++++ server/noxely_server/workers.py | 10 ++++ 53 files changed, 717 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 200f4b4..8d662cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ Toutes les évolutions notables de Noxely sont documentées ici. Le format suit [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/) et le versionnage [SemVer](https://semver.org/lang/fr/). +## [2.1.0] — 2026-09-13 + +### Ajouté + +- **Appairage du téléphone.** Plus de jeton à recopier : on ouvre une fenêtre depuis l'interface + du serveur, on appuie sur « Appairer » dans Réglages ▸ Connexion, et l'application reçoit le + jeton. Le champ de saisie reste disponible pour qui préfère le coller à la main. + + Le téléphone ne peut pas deviner un jeton — c'est ce qu'il protège — mais il peut le recevoir, + sous trois conditions cumulées : ouvrir la fenêtre exige déjà le jeton, elle expire au bout de + deux minutes, et elle se referme dès qu'un appareil s'est servi. La demande doit en outre venir + d'une adresse privée : un appairage n'est jamais joignable depuis Internet. + +- En-têtes de licence GPL v3 dans les cinquante fichiers de code (Kotlin, Python, HTML), rédigés + en français comme le reste du projet, le texte faisant foi restant celui de `LICENSE`. + ## [2.0.1] — 2026-09-13 ### Ajouté diff --git a/README.md b/README.md index 98502fe..29dcb1f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![Kotlin](https://img.shields.io/badge/Kotlin-2.1.0-7F52FF?logo=kotlin&logoColor=white)](https://kotlinlang.org) [![Compose](https://img.shields.io/badge/Jetpack%20Compose-Material%203-4285F4?logo=jetpackcompose&logoColor=white)](https://developer.android.com/jetpack/compose) [![Media3](https://img.shields.io/badge/Media3-1.11.1-FF6F00?logo=googleplay&logoColor=white)](https://developer.android.com/media/media3) -[![Version](https://img.shields.io/badge/Version-2.0.1-6B4EFF)](VERSION) +[![Version](https://img.shields.io/badge/Version-2.1.0-6B4EFF)](VERSION) [![Licence](https://img.shields.io/badge/Licence-GPL%20v3-3FD8C0)](LICENSE) [![Hors ligne](https://img.shields.io/badge/Hors%20ligne-100%25-3FD8C0)](#-comment-ça-marche) @@ -59,6 +59,7 @@ synchronisations : c'est là qu'est l'économie. | | | |---|---| | 🔄 **Synchronisation sobre** | Toutes les 6 h, en Wi-Fi non facturé et batterie suffisante | +| 📱 **Appairage** | Un bouton côté serveur, un bouton côté téléphone : aucun jeton à recopier | | 🎵 **Lecture** | Audio et vidéo, arrière-plan, casque, écran verrouillé, ±15 s, stop | | 📚 **Bibliothèque** | Médias reçus du serveur et contenu déjà présent sur l'appareil | | 📋 **Playlists** | Listes nommées, appui long pour y ajouter un titre | diff --git a/VERSION b/VERSION index 38f77a6..7ec1d6d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.1 +2.1.0 diff --git a/app/src/main/java/fr/tuxgyver/noxely/MainActivity.kt b/app/src/main/java/fr/tuxgyver/noxely/MainActivity.kt index 19eda3e..c17869b 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/MainActivity.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/MainActivity.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely import android.Manifest diff --git a/app/src/main/java/fr/tuxgyver/noxely/NoxelyApp.kt b/app/src/main/java/fr/tuxgyver/noxely/NoxelyApp.kt index de58139..c08975f 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/NoxelyApp.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/NoxelyApp.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely import android.app.Application diff --git a/app/src/main/java/fr/tuxgyver/noxely/library/ArtworkFinder.kt b/app/src/main/java/fr/tuxgyver/noxely/library/ArtworkFinder.kt index cfef4e3..0747750 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/library/ArtworkFinder.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/library/ArtworkFinder.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.library import fr.tuxgyver.noxely.model.MediaEntry diff --git a/app/src/main/java/fr/tuxgyver/noxely/library/ImportedStore.kt b/app/src/main/java/fr/tuxgyver/noxely/library/ImportedStore.kt index 8bdb116..bde86cb 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/library/ImportedStore.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/library/ImportedStore.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.library import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/library/LibraryRepository.kt b/app/src/main/java/fr/tuxgyver/noxely/library/LibraryRepository.kt index eccb0d4..83e6ecb 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/library/LibraryRepository.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/library/LibraryRepository.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.library import fr.tuxgyver.noxely.model.MediaEntry diff --git a/app/src/main/java/fr/tuxgyver/noxely/library/LocalMediaScanner.kt b/app/src/main/java/fr/tuxgyver/noxely/library/LocalMediaScanner.kt index 5e0a341..9754ce7 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/library/LocalMediaScanner.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/library/LocalMediaScanner.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.library import android.content.ContentUris diff --git a/app/src/main/java/fr/tuxgyver/noxely/library/PlaylistStore.kt b/app/src/main/java/fr/tuxgyver/noxely/library/PlaylistStore.kt index 00fbf4b..3bb202e 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/library/PlaylistStore.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/library/PlaylistStore.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.library import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/model/Media.kt b/app/src/main/java/fr/tuxgyver/noxely/model/Media.kt index 8791d97..ccc7d78 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/model/Media.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/model/Media.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.model import kotlinx.serialization.Serializable diff --git a/app/src/main/java/fr/tuxgyver/noxely/model/Playlist.kt b/app/src/main/java/fr/tuxgyver/noxely/model/Playlist.kt index 47b7236..fd65c93 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/model/Playlist.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/model/Playlist.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.model import kotlinx.serialization.Serializable diff --git a/app/src/main/java/fr/tuxgyver/noxely/offline/DownloadTracker.kt b/app/src/main/java/fr/tuxgyver/noxely/offline/DownloadTracker.kt index bf64fd8..555ba84 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/offline/DownloadTracker.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/offline/DownloadTracker.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.offline import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/offline/NoxelyDownloadService.kt b/app/src/main/java/fr/tuxgyver/noxely/offline/NoxelyDownloadService.kt index ad942b5..b95a1ec 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/offline/NoxelyDownloadService.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/offline/NoxelyDownloadService.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.offline import android.app.Notification diff --git a/app/src/main/java/fr/tuxgyver/noxely/offline/OfflineModule.kt b/app/src/main/java/fr/tuxgyver/noxely/offline/OfflineModule.kt index 6808ad5..d20a16b 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/offline/OfflineModule.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/offline/OfflineModule.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.offline import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/playback/MediaItems.kt b/app/src/main/java/fr/tuxgyver/noxely/playback/MediaItems.kt index ac966e8..d9a7a78 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/playback/MediaItems.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/playback/MediaItems.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.playback import androidx.core.net.toUri diff --git a/app/src/main/java/fr/tuxgyver/noxely/playback/PlaybackService.kt b/app/src/main/java/fr/tuxgyver/noxely/playback/PlaybackService.kt index fcb377a..2ebc7ce 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/playback/PlaybackService.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/playback/PlaybackService.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.playback import android.app.PendingIntent diff --git a/app/src/main/java/fr/tuxgyver/noxely/playback/PlayerController.kt b/app/src/main/java/fr/tuxgyver/noxely/playback/PlayerController.kt index 2e3684c..655831f 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/playback/PlayerController.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/playback/PlayerController.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.playback import android.content.ComponentName diff --git a/app/src/main/java/fr/tuxgyver/noxely/radio/RecordingSink.kt b/app/src/main/java/fr/tuxgyver/noxely/radio/RecordingSink.kt index 3f67820..c6a1717 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/radio/RecordingSink.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/radio/RecordingSink.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.radio import android.content.ContentValues diff --git a/app/src/main/java/fr/tuxgyver/noxely/sources/Http.kt b/app/src/main/java/fr/tuxgyver/noxely/sources/Http.kt index b369d9e..bc1abf2 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/sources/Http.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/sources/Http.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.sources import java.net.HttpURLConnection diff --git a/app/src/main/java/fr/tuxgyver/noxely/sync/ServerSettings.kt b/app/src/main/java/fr/tuxgyver/noxely/sync/ServerSettings.kt index f91b038..55ca061 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/sync/ServerSettings.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/sync/ServerSettings.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.sync import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/sync/SyncClient.kt b/app/src/main/java/fr/tuxgyver/noxely/sync/SyncClient.kt index 0d3746b..2c95a58 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/sync/SyncClient.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/sync/SyncClient.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.sync import android.content.Context @@ -44,6 +56,41 @@ class SyncClient( } } + /** + * Récupère le jeton auprès du serveur, pendant sa fenêtre d'appairage. + * + * Le téléphone ne peut pas deviner un jeton — c'est ce qu'il protège. Il peut en revanche le + * recevoir, à condition que quelqu'un ait ouvert la fenêtre depuis l'interface du serveur, et + * que la demande vienne du réseau local. + */ + suspend fun pair(baseUrl: String): Result = withContext(Dispatchers.IO) { + runCatching { + val base = baseUrl.trim().trimEnd('/') + val connection = openConnection("$base/api/pair", readTimeoutMs = 20_000).apply { + requestMethod = "POST" + doOutput = true + outputStream.close() + } + val body = try { + when (connection.responseCode) { + 403 -> throw IllegalStateException( + connection.errorStream?.bufferedReader()?.readText() + ?.let { json.parseToJsonElement(it).jsonObject.text("detail") } + ?: "Aucun appairage en cours sur le serveur" + ) + in 200..299 -> connection.inputStream.bufferedReader().readText() + else -> throw IllegalStateException("Le serveur a répondu ${connection.responseCode}") + } + } finally { + connection.disconnect() + } + val payload = json.parseToJsonElement(body).jsonObject + val token = payload.text("token") ?: throw IllegalStateException("Réponse sans jeton") + settings.update { it.copy(baseUrl = base, token = token) } + "${payload.text("name")} ${payload.text("version")}" + } + } + suspend fun sync(): SyncResult = withContext(Dispatchers.IO) { val config = settings.config.value if (!config.isConfigured) return@withContext SyncResult(0, 0, "Serveur non configuré") diff --git a/app/src/main/java/fr/tuxgyver/noxely/sync/SyncWorker.kt b/app/src/main/java/fr/tuxgyver/noxely/sync/SyncWorker.kt index f1e770c..6edb8ab 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/sync/SyncWorker.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/sync/SyncWorker.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.sync import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/NoxelyRoot.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/NoxelyRoot.kt index 2664a86..6347b60 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/NoxelyRoot.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/NoxelyRoot.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui import androidx.activity.compose.BackHandler diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/about/AboutScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/about/AboutScreen.kt index 53dc78e..24e4c98 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/about/AboutScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/about/AboutScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.about import androidx.compose.foundation.Image diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/about/AppInfo.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/about/AppInfo.kt index 3649f50..5139521 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/about/AppInfo.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/about/AppInfo.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.about import fr.tuxgyver.noxely.BuildConfig diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/about/Changelog.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/about/Changelog.kt index afbe8ee..f40f34c 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/about/Changelog.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/about/Changelog.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.about import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/components/Artwork.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/components/Artwork.kt index b806df9..1bf0edc 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/components/Artwork.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/components/Artwork.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.components import android.graphics.Bitmap diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/components/Format.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/components/Format.kt index 1799aa3..516f54b 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/components/Format.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/components/Format.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.components import java.util.Locale diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/components/MediaRow.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/components/MediaRow.kt index ce20d0b..d7107e4 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/components/MediaRow.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/components/MediaRow.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.components import androidx.compose.animation.animateColorAsState diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/library/LibraryScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/library/LibraryScreen.kt index f0454f1..d2d4ac6 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/library/LibraryScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/library/LibraryScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.library import androidx.activity.compose.rememberLauncherForActivityResult diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/offline/DownloadsScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/offline/DownloadsScreen.kt index 314b179..10b6ffc 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/offline/DownloadsScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/offline/DownloadsScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.offline import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/player/MiniPlayer.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/player/MiniPlayer.kt index cdd0790..ca8bb04 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/player/MiniPlayer.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/player/MiniPlayer.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.player import androidx.compose.foundation.basicMarquee diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/player/NowPlayingScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/player/NowPlayingScreen.kt index 7f188d0..e8517c3 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/player/NowPlayingScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/player/NowPlayingScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.player import androidx.annotation.OptIn diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/AddToPlaylistSheet.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/AddToPlaylistSheet.kt index 64c0b23..5d42e5f 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/AddToPlaylistSheet.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/AddToPlaylistSheet.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.playlists import androidx.compose.foundation.clickable diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistDetailScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistDetailScreen.kt index d05f0c8..fa46722 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistDetailScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistDetailScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.playlists import androidx.compose.foundation.layout.Arrangement diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistsScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistsScreen.kt index 65bd338..27925c3 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistsScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/playlists/PlaylistsScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.playlists import androidx.compose.foundation.clickable diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/server/ServerScreen.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/server/ServerScreen.kt index 845b59e..16a5abd 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/server/ServerScreen.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/server/ServerScreen.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.server import androidx.compose.foundation.layout.Arrangement @@ -127,7 +139,7 @@ fun ServerScreen( OutlinedTextField( value = token, onValueChange = { token = it; probe = null }, - label = { Text("Jeton") }, + label = { Text("Jeton (rempli par l'appairage)") }, singleLine = true, visualTransformation = PasswordVisualTransformation(), modifier = Modifier.fillMaxWidth(), @@ -135,6 +147,26 @@ fun ServerScreen( Spacer(Modifier.size(14.dp)) Row(verticalAlignment = Alignment.CenterVertically) { Button( + enabled = !busy && url.isNotBlank(), + onClick = { + busy = true + probe = null + scope.launch { + container.sync.pair(url).fold( + onSuccess = { name -> + token = container.serverSettings.config.value.token + probe = "Connecté à $name — jeton reçu" + }, + onFailure = { probe = it.message ?: "Appairage impossible" }, + ) + busy = false + } + }, + ) { Text("Appairer") } + + Spacer(Modifier.width(10.dp)) + + TextButton( enabled = !busy && url.isNotBlank() && token.isNotBlank(), onClick = { busy = true @@ -152,7 +184,7 @@ fun ServerScreen( busy = false } }, - ) { Text("Tester et enregistrer") } + ) { Text("Tester") } Spacer(Modifier.width(10.dp)) diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/sources/UpdateCard.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/sources/UpdateCard.kt index 90dc2e6..87f1e27 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/sources/UpdateCard.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/sources/UpdateCard.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.sources import androidx.compose.foundation.layout.Column diff --git a/app/src/main/java/fr/tuxgyver/noxely/ui/theme/Theme.kt b/app/src/main/java/fr/tuxgyver/noxely/ui/theme/Theme.kt index 9392df7..7b1572b 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/ui/theme/Theme.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/ui/theme/Theme.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.ui.theme import androidx.compose.foundation.isSystemInDarkTheme diff --git a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateCheckWorker.kt b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateCheckWorker.kt index d01728e..40d3480 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateCheckWorker.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateCheckWorker.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.update import android.content.Context diff --git a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateNotifier.kt b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateNotifier.kt index 215a3e4..e274bcc 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateNotifier.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateNotifier.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.update import android.Manifest diff --git a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateRepository.kt b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateRepository.kt index 9c482a9..f7ae87f 100644 --- a/app/src/main/java/fr/tuxgyver/noxely/update/UpdateRepository.kt +++ b/app/src/main/java/fr/tuxgyver/noxely/update/UpdateRepository.kt @@ -1,3 +1,15 @@ +/* + * 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. + */ + package fr.tuxgyver.noxely.update import android.content.Context diff --git a/server/noxely_server/__init__.py b/server/noxely_server/__init__.py index e69de29..530903e 100644 --- a/server/noxely_server/__init__.py +++ b/server/noxely_server/__init__.py @@ -0,0 +1,10 @@ +# 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. + diff --git a/server/noxely_server/__main__.py b/server/noxely_server/__main__.py index 932dbdd..05d375c 100644 --- a/server/noxely_server/__main__.py +++ b/server/noxely_server/__main__.py @@ -1,3 +1,13 @@ +# 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. + """Point d'entrée : `python -m noxely_server`.""" from __future__ import annotations diff --git a/server/noxely_server/api.py b/server/noxely_server/api.py index c356fb0..c1be835 100644 --- a/server/noxely_server/api.py +++ b/server/noxely_server/api.py @@ -1,3 +1,13 @@ +# 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. + """API HTTP du serveur Noxely. Le client Android ne consomme que `/api/health`, `/api/library` et `/api/media/{id}/file` : @@ -7,6 +17,8 @@ mobile doit pouvoir se contenter d'un sondage bref, c'est là qu'est le gain de from __future__ import annotations import asyncio +import ipaddress +import time from contextlib import asynccontextmanager from pathlib import Path @@ -19,6 +31,7 @@ from .storage import Storage from .workers import Downloader, Watcher, safe_name VERSION = "1.0.0" +PAIRING_WINDOW_SECONDS = 120 WEB_DIR = Path(__file__).parent / "web" config = config_module.load() @@ -180,6 +193,53 @@ def queue_state() -> dict: return {"items": [m.public() for m in pending if m.state != "ready"][:50]} +#: Fenêtre d'appairage : instant d'expiration, ou None si elle est fermée. +_pairing_until: float | None = None + + +def _is_private(host: str) -> bool: + """Le réseau local, et lui seul.""" + try: + address = ipaddress.ip_address(host) + return address.is_private or address.is_loopback + except ValueError: + return host in ("localhost", "") + + +@app.post("/api/pair/open", dependencies=[Depends(authorised)]) +def open_pairing() -> dict: + """Ouvre une fenêtre de deux minutes pendant laquelle un appareil du réseau local peut + réclamer le jeton. Fermée le reste du temps : sinon le jeton ne protégerait plus rien.""" + global _pairing_until + _pairing_until = time.time() + PAIRING_WINDOW_SECONDS + return {"open": True, "seconds": PAIRING_WINDOW_SECONDS} + + +@app.get("/api/pair/state", dependencies=[Depends(authorised)]) +def pairing_state() -> dict: + remaining = int(_pairing_until - time.time()) if _pairing_until else 0 + return {"open": remaining > 0, "seconds": max(0, remaining)} + + +@app.post("/api/pair") +def pair(request: Request) -> dict: + """Livre le jeton à un appareil du réseau local, pendant la fenêtre d'appairage. + + La fenêtre se referme dès qu'un appareil s'est servi : une ouverture, un appairage. + """ + global _pairing_until + client = request.client.host if request.client else "" + if not _pairing_until or time.time() > _pairing_until: + raise HTTPException( + status_code=403, + detail="Aucun appairage en cours. Ouvrez-en un depuis l'interface du serveur.", + ) + if not _is_private(client): + raise HTTPException(status_code=403, detail="Appairage réservé au réseau local") + _pairing_until = None + return {"token": config.token, "name": "Noxely", "version": VERSION} + + @app.get("/api/bootstrap") def bootstrap(request: Request) -> dict: """Livre le jeton — uniquement à une requête venue de la machine elle-même. diff --git a/server/noxely_server/config.py b/server/noxely_server/config.py index c298ca5..56ab421 100644 --- a/server/noxely_server/config.py +++ b/server/noxely_server/config.py @@ -1,3 +1,13 @@ +# 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. + """Configuration du serveur Noxely, lue de l'environnement. Aucune valeur sensible n'est écrite dans le dépôt : le jeton et les chemins viennent d'un diff --git a/server/noxely_server/sources/__init__.py b/server/noxely_server/sources/__init__.py index 3075992..6d0f466 100644 --- a/server/noxely_server/sources/__init__.py +++ b/server/noxely_server/sources/__init__.py @@ -1,3 +1,13 @@ +# 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. + """Catalogues libres et annuaire radio, portés depuis le client Android. Les pièges vérifiés côté mobile restent valables ici et sont conservés en commentaire : diff --git a/server/noxely_server/sources/catalogs.py b/server/noxely_server/sources/catalogs.py index 85f7b42..30a6736 100644 --- a/server/noxely_server/sources/catalogs.py +++ b/server/noxely_server/sources/catalogs.py @@ -1,3 +1,13 @@ +# 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. + """Recherche dans les catalogues libres de droits.""" from __future__ import annotations diff --git a/server/noxely_server/sources/radio.py b/server/noxely_server/sources/radio.py index 99a05f9..80edbf3 100644 --- a/server/noxely_server/sources/radio.py +++ b/server/noxely_server/sources/radio.py @@ -1,3 +1,13 @@ +# 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. + """Annuaire des stations et lecture des métadonnées ICY.""" from __future__ import annotations diff --git a/server/noxely_server/storage.py b/server/noxely_server/storage.py index 24c82dc..a9d5a85 100644 --- a/server/noxely_server/storage.py +++ b/server/noxely_server/storage.py @@ -1,3 +1,13 @@ +# 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. + """Index des médias et des guets, en SQLite. Les fichiers vivent sur le disque ; la base ne porte que leurs métadonnées et l'état de la diff --git a/server/noxely_server/web/index.html b/server/noxely_server/web/index.html index bdb21e6..8d119d5 100644 --- a/server/noxely_server/web/index.html +++ b/server/noxely_server/web/index.html @@ -1,4 +1,15 @@ + @@ -46,6 +57,7 @@ +
@@ -245,6 +257,15 @@ async function sweep() { loadWatches(); } +async function openPairing() { + try { + const { seconds } = await api('/pair/open', { method: 'POST' }); + alert(`Appairage ouvert pour ${seconds} secondes.\n\n` + + `Sur le téléphone : Réglages ▸ Connexion ▸ Appairer.\n` + + `La fenêtre se referme dès qu'un appareil s'est servi.`); + } catch (e) { alert('Appairage impossible : ' + e); } +} + const esc = (s) => String(s).replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); diff --git a/server/noxely_server/workers.py b/server/noxely_server/workers.py index 2f05880..58f79cb 100644 --- a/server/noxely_server/workers.py +++ b/server/noxely_server/workers.py @@ -1,3 +1,13 @@ +# 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. + """Tâches de fond : file de téléchargement, guet radio et enregistrement. C'est ici que se déplace la consommation qui pesait sur le téléphone : le serveur balaie les