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