Commit 36721cd2 authored by Kourser's avatar Kourser
Browse files

docs: reflect the playback, private-feed and radio work across the docs

- README / docs/index: new feature bullets (private feeds, live radio
  catalog, app + per-podcast volume, sleep-timer fade and end-of-episode),
  DiscoveryKit description, site version bumped to the released 0.3.0.
- ROADMAP: post-MVP achievements updated; 'remaining dynamic strings'
  item replaced by native review of the generated translations.
- Privacy (PRIVACY.md + docs/Confidentialite.md): Radio Browser added to
  the contacted directories, credentials section now covers private-feed
  logins (Keychain only, deleted on unsubscribe).
- User guide: radio catalog walkthrough, private-feed fields, player
  volume slider, sleep-timer fade / end-of-episode, per-podcast volume
  and credentials settings.
- FAQ: radio and paid-feed questions; Keychain answer extended.
- Architecture: engine routing (SwitchingAudioEngine), DiscoveryKit
  directories, persistence triggers, migrations v1…v10, secrets note.
- Synchronisation: radios explicitly out of gpodder scope.
- CHANGELOG: completed-translations entry.

Co-Authored-By: Claude (RCA)
parent 8367ddb2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ adopte le [versionnage sémantique](https://semver.org/lang/fr/).
- **Catalogue de radios** : recherche dans l'annuaire communautaire
  Radio Browser (sans clé, comme fyyd) avec stations populaires de votre
  pays avant la saisie, logo, pays, codec/débit — ajout en un tap.
- **Traductions complétées** : les 19 langues couvrent désormais la totalité
  du catalogue (plus aucune chaîne en attente) ; relecture native bienvenue.

### Corrigé
- L'égaliseur (et le saut de silence) activé **pendant** la lecture d'un épisode
+14 −7
Original line number Diff line number Diff line
# Politique de confidentialité — Skingomz

_Dernière mise à jour : 19 juin 2026._
_Dernière mise à jour : 8 juillet 2026._

Skingomz est conçu pour respecter votre vie privée. **L'application ne collecte aucune
donnée personnelle** et n'utilise aucun outil de suivi ou de publicité.
@@ -14,17 +14,24 @@ l'éditeur de Skingomz à aucun moment.
## Réseau

- L'application contacte directement les **serveurs des podcasts** auxquels vous vous
  abonnez (flux RSS et fichiers audio), et l'**annuaire de recherche Apple Podcasts**
  (iTunes Search) lorsque vous effectuez une recherche.
  abonnez (flux RSS et fichiers audio) et, pour les radios, le **serveur du flux** de
  chaque station.
- Pour la **recherche**, elle interroge les annuaires publics **Apple Podcasts**
  (iTunes Search), **fyyd** et — pour les radios — **Radio Browser**
  (api.radio-browser.info) : uniquement le terme recherché (ou le pays de l'appareil
  pour les stations populaires), jamais d'identifiant personnel.
- Si — et seulement si — vous configurez la **synchronisation**, l'application communique
  avec le **serveur que vous fournissez** (votre instance Nextcloud avec l'app GPodder
  Sync, ou gpodder.net) pour échanger vos abonnements et votre progression. Skingomz n'a
  accès à aucun de ces échanges.
  accès à aucun de ces échanges. Les **radios** ne sont jamais synchronisées.

## Identifiants de synchronisation
## Identifiants

Le mot de passe de synchronisation est stocké de façon sécurisée dans le **Trousseau**
du système (Keychain). Il n'est jamais écrit en clair ni journalisé.
Le mot de passe de synchronisation et les **identifiants de flux privés** (podcasts
payants) sont stockés de façon sécurisée dans le **Trousseau** du système (Keychain).
Ils ne sont jamais écrits en clair ni journalisés, ne transitent que vers le serveur
concerné (votre serveur de synchronisation, ou celui du flux privé), et sont supprimés
au désabonnement.

## Suivi

+10 −3
Original line number Diff line number Diff line
@@ -30,13 +30,20 @@ qui n'existe pas sur iOS.

- 📥 **Abonnement** à n'importe quel flux RSS par URL
- 🔎 **Découverte** via la recherche Apple Podcasts (iTunes Search)
- 🔐 **Flux privés** (abonnements payants) : identifiant/mot de passe par podcast
  (HTTP Basic), stockés dans le **Trousseau**
- 📻 **Radios en direct** : catalogue **Radio Browser** (stations populaires + recherche)
  ou URL directe du flux — locales, hors synchro
- 📂 **Import et export OPML** (migration depuis/vers une autre app)
- 🆕 Écran **Nouveautés** (épisodes récents de tous les abonnements)
- 🔍 **Recherche** dans la bibliothèque et les épisodes
- 🗂️ **Tri/filtre & tags** des abonnements ; **favoris**, filtres et tri des épisodes
- ▶️ **Lecture en arrière-plan** + contrôles écran verrouillé (Now Playing, AirPods…)
-**Vitesse** réglable (0,8× à 3×, pas de 0,1), **minuteur de sommeil**, **chapitres** (navigation)
- ⚙️ **Réglages par podcast** (vitesse dédiée, saut intro/fin, **suppression des silences**) + **intervalles de saut** configurables
-**Vitesse** réglable (0,8× à 3×, pas de 0,1), **chapitres** (navigation)
- 🌙 **Minuteur de sommeil** avec **fondu** de fin et option **« Fin de l'épisode »**
- 🔉 **Volume de l'application** (curseur fin dans le lecteur, sous le premier cran
  matériel) + **volume par podcast**
- ⚙️ **Réglages par podcast** (vitesse dédiée, saut intro/fin, **suppression des silences**, volume, flux privé) + **intervalles de saut** configurables
- 📝 **Notes d'épisode** avec liens cliquables, **partage** d'un épisode
- 🗒️ **Transcriptions** (SRT/VTT/JSON, suivi synchronisé) ; **chapitres embarqués** (ID3/MP4)
- 🕘 **Historique** de lecture & **statistiques** d'écoute
@@ -90,7 +97,7 @@ par-dessus :
| `FeedKit` | Parsing RSS/Atom + iTunes + Podcasting 2.0, et téléchargement de flux |
| `StorageKit` | Persistance SQLite (GRDB) : abonnements, file, téléchargements, lecture |
| `PlaybackKit` | Moteur `AVPlayer` + contrôleur de lecture observable |
| `DiscoveryKit` | Recherche iTunes + import OPML |
| `DiscoveryKit` | Recherche iTunes + fyyd + Radio Browser, import OPML |
| `SyncKit` | Sync Nextcloud / gpodder.net |

Détails : [docs/Architecture.md](docs/Architecture.md).
+12 −1
Original line number Diff line number Diff line
@@ -40,11 +40,22 @@ persistance GRDB/SQLite · iOS 18+.
- **Localisation** en 19 langues (français source + 18 traductions, String
  Catalog) + sélecteur de langue ; suggestions filtrées selon la langue.
- Multiplateforme natif iOS/iPadOS/macOS ; iconset complet.
- **Volume de l'application** (curseur du lecteur, courbe perceptuelle) et
  **volume par podcast** ; **fondu du minuteur de sommeil** + arrêt en
  **fin d'épisode**.
- Égaliseur / suppression des silences appliqués **à chaud** en cours de
  lecture ; **erreurs de lecture affichées** (fichier illisible, échec de
  streaming) ; position sauvegardée **à la pause** et en arrière-plan.
- **Flux privés** (HTTP Basic) : identifiants au Trousseau, appliqués au
  rafraîchissement, au téléchargement et au streaming.
- **Radios en direct** : URL directe + **catalogue Radio Browser** — locales,
  exclues de la synchro gpodder et de l'OPML.
- **Catalogue de traduction complété** (19 langues, aucune chaîne en attente).

## Suite envisagée

- **Widget**, **CarPlay**, **Apple Watch**, **Siri/Raccourcis**.
- Traduction des messages dynamiques restants.
- Relecture native des traductions générées.
- Langues UE manquantes (maltais, irlandais, letton, lituanien, estonien) :
  à faire via relecture native / flux de traduction communautaire.
- Validation sur **appareil réel** ; sync contre un vrai serveur ; localisation multi-langue.
+17 −11
Original line number Diff line number Diff line
@@ -11,8 +11,8 @@ Packages/Core
 ├─ PodcastModel   types valeur : Podcast, Episode, PlayState
 ├─ FeedKit        parsing RSS/Atom/iTunes/Podcasting 2.0 + FeedFetcher
 ├─ StorageKit     SQLite via GRDB (abonnements, file, téléchargements, lecture)
 ├─ PlaybackKit    AudioPlayerEngine (AVPlayer) + PlaybackController observable
 ├─ DiscoveryKit   recherche iTunes + parseur OPML
 ├─ PlaybackKit    moteurs audio (AVPlayer / AVAudioEngine) + PlaybackController
 ├─ DiscoveryKit   recherche iTunes + fyyd + Radio Browser, parseur OPML
 └─ SyncKit        fournisseurs Nextcloud + gpodder.net
```

@@ -31,12 +31,16 @@ Packages/Core

1. **Abonnement** : `FeedFetcher` télécharge le flux → `FeedParser``ParsedFeed`
`StorageKit.LibraryStore.save(...)` (upsert + déduplication par `feedURL`/`guid`).
2. **Lecture** : `AppModel.play` résout l'URL (fichier local si téléchargé) + la
   position de reprise → `PlaybackController` pilote `AVAudioPlayerEngine`.
   `NowPlayingCoordinator` reflète l'état vers `MPNowPlayingInfoCenter` et reçoit les
   commandes de `MPRemoteCommandCenter`.
3. **Persistance de lecture** : la position est sauvegardée périodiquement et en fin
   de piste (`playstate`), permettant la reprise et la synchronisation.
2. **Lecture** : `AppModel.play` résout l'URL (fichier local si téléchargé), la
   position de reprise et les réglages (volume, effets, identifiants de flux privé)
`PlaybackController` pilote `SwitchingAudioEngine`, qui route vers `AVPlayer`
   (streaming, radios) ou `AVAudioEngine` (fichiers locaux avec égaliseur /
   suppression des silences). `NowPlayingCoordinator` reflète l'état vers
   `MPNowPlayingInfoCenter` et reçoit les commandes de `MPRemoteCommandCenter`.
3. **Persistance de lecture** : la position est sauvegardée périodiquement, **à la
   pause**, au passage en arrière-plan et en fin de piste (`playstate`), permettant
   la reprise et la synchronisation. Les radios (flux en direct) n'ont pas de
   position.
4. **Sync** : `SyncKit` échange abonnements et actions d'épisode via HTTP Basic ;
   `AppModel.syncNow` applique le distant puis pousse le local.

@@ -49,6 +53,8 @@ Packages/Core

## Persistance (SQLite / GRDB)

Tables principales : `podcast`, `episode` (+ index unique `podcastId,guid`), et des
tables **séparées** qui survivent au rafraîchissement des flux : `queue`, `download`,
`playstate`. Migrations versionnées via `DatabaseMigrator` (`v1``v3`).
Tables principales : `podcast` (dont le marqueur `isRadio`), `episode` (+ index unique
`podcastId,guid`), et des tables **séparées** qui survivent au rafraîchissement des
flux : `queue`, `download`, `playstate`, `podcast_pref`. Migrations versionnées via
`DatabaseMigrator` (`v1``v10`). Les secrets (mot de passe de synchronisation,
identifiants de flux privés) ne sont **jamais** en base : ils vivent dans le Trousseau.
Loading