= 🎙️ ANNU KUTE CED - Hub multimédia du podcast
:toc: left
:toc-title: Sommaire
:toclevels: 3

🌍 *Hub multimédia du podcast ANNU KUTE CED*

== 📖 Description

**ANNU KUTE CED** est une interface web responsive dédiée au podcast *ANNU KUTE CED*. Elle regroupe en un seul lieu la chaîne PeerTube du podcast, son compte Castopod et sa timeline Mastodon, offrant ainsi un point d'entrée unique pour suivre l'ensemble de ses contenus.

Cette plateforme est un *fork* de **FEDIVERSE OKI** (https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/FEDIVERSE-OKI[FEDIVERSE-OKI^]), développée par l'https://o-k-i.net[ORGANISATION KA INTERNATIONALE (OKI)^]. Le présent dépôt est hébergé sur LaBola : `git@labola.o-k-i.net:cedric/annu-kute-ced.git`.

OKI continue de gérer l'application ; ce fork est porté par le propriétaire du dépôt *cedric* (Cédric Famibelle-Pronzola). Le code source reste disponible et le projet respecte la licence d'origine (GNU Affero General Public License v3 ou ultérieure).

🎯 *Mission* : Offrir un hub libre et décentralisé pour découvrir, écouter et suivre le podcast ANNU KUTE CED sans dépendre des grandes plateformes propriétaires.

== 🔗 Sources et instances utilisées

Le hub est configuré par défaut pour agréger les sources suivantes du podcast ANNU KUTE CED :

- 🎥 *Chaîne PeerTube (GADE)* : https://gade.o-k-i.net/c/annu_kute_ced/videos
- 🎙️ *Compte Castopod (KUTE)* : https://kute.o-k-i.net/@annu_kute_cedric
- 📡 *Timeline Mastodon (BOKANTE)* : https://bokante.o-k-i.net/@cedric

== ✨ Fonctionnalités

- 🎥 Affichage des vidéos à la une et récentes depuis PeerTube
- 📚 Navigation par catégories
- ▶️ Lecture de vidéos
- 🔍 Recherche de contenu
- 📱 Interface responsive (mobile et desktop)
- 🔗 Intégration avec l'instance PeerTube GADE
- 📲 Progressive Web App (PWA) avec installation native
- 🌐 Mode hors ligne avec cache intelligent
- 📡 Détection automatique d'état de connexion
- 📊 Analytics intégré avec Plausible (respectueux de la vie privée)
- 🎙️ *Intégration Castopod* : Affichage des derniers épisodes du podcast via flux RSS
- 💝 *Système de dons* : Support multi-plateformes (LiberaPay, Ko-fi, Stripe) avec dons ponctuels et récurrents
- ⏰ *Système de countdown* : Page de lancement configurable avec compte à rebours multi-fuseaux
- 📺 *Annonce du prochain live* : Affichage dynamique avec multi-fuseaux horaires et image personnalisable

== 🛠️ Technologies utilisées

- 📄 HTML5
- 🎨 CSS3 avec Media Queries pour le responsive design
- 🐘 PHP pour le backend
- ⚡ JavaScript pour les interactions côté client
- 🔧 Service Worker pour le cache offline et PWA
- 📋 Web App Manifest pour l'installation native
- 📦 Bibliothèques externes via CDN:
  * 🎯 Font Awesome (icônes)
  * 📊 Plausible Analytics (statistiques respectueuses de la vie privée)

== 📁 Structure du projet

[source]
----
├── css/
│   ├── styles.css
│   ├── video-page.css
│   ├── categories.css
│   └── search.css
├── img/
│   ├── categories/
│   ├── video-thumbnails/
│   └── channels/
├── js/
│   └── main.js
├── includes/
│   ├── header.php
│   ├── footer.php
│   ├── mobile-menu.php
│   ├── featured-videos.php
│   ├── recent-videos.php
│   ├── categories.php
│   ├── pwa-init.php
│   └── config.local.php.sample     # Exemple de configuration locale
├── conf/
│   ├── .htaccess.sample            # Configuration Apache sécurisée
│   └── nginx.conf.sample           # Configuration Nginx sécurisée
├── index.php
├── video.php
├── categories.php
├── search.php
├── sw.js                           # Service Worker pour PWA
├── site.webmanifest.sample         # Exemple de manifest PWA
├── browserconfig.xml               # Configuration Windows
├── sitemap.xml.sample              # Exemple de sitemap
├── robots.txt.sample               # Exemple de robots.txt
├── mentions-legales.php.sample     # Exemple de mentions légales
└── README.adoc
----

== 📋 Prérequis

- 🐘 *PHP 7.4+* (recommandé : PHP 8.0+)
- 📦 *Extensions PHP requises :*
  * `curl` - Pour les appels API vers PeerTube
  * `json` - Pour le traitement des données JSON
  * `intl` - Pour la gestion des dates internationales et traductions
  * `mbstring` - Pour la manipulation des chaînes multi-octets
  * `xml` (SimpleXML) - Recommandée pour Castopod (fallback regex disponible)
- 🌐 *Serveur web* : Apache ou Nginx
- 🔒 *HTTPS* : Requis pour les fonctionnalités PWA

=== Installation de l'extension intl

L'extension `intl` est nécessaire pour l'affichage des dates et heures de directs en plusieurs langues et fuseaux horaires.

[source,bash]
----
# Sur Ubuntu/Debian
sudo apt-get install php-intl

# Sur Fedora/RHEL/CentOS
sudo dnf install php-intl

# Puis redémarrer le serveur web
sudo systemctl restart apache2
# ou pour nginx avec php-fpm
sudo systemctl restart php8.3-fpm
----

Pour vérifier que l'extension est bien chargée :
[source,bash]
----
php -m | grep intl
----

== 🚀 Installation

. 📥 Clonez ce dépôt :
+
[source,bash]
----
git clone git@labola.o-k-i.net:cedric/annu-kute-ced.git
----
. 📦 *Vérifiez les prérequis :* Assurez-vous que toutes les extensions PHP requises sont installées
. 🔧 Configurez votre serveur web (Apache, Nginx, etc.) pour pointer vers le répertoire racine
. 🔒 *Important :* Assurez-vous que votre serveur supporte HTTPS (requis pour PWA)
. 🛡️ *Configuration serveur sécurisée :* Copiez le fichier de configuration approprié depuis `conf/`

== ⚙️ Configuration

Le site utilise un système de configuration en deux parties :

- 📋 `includes/config.php` : La configuration de base (versionnée)
- 🔧 `includes/config.local.php` : Votre configuration locale (non versionnée)

Pour configurer votre environnement local :

. Copiez le fichier d'exemple vers le fichier local :
+
[source,bash]
----
cp includes/config.local.php.sample includes/config.local.php
----

. Modifiez `includes/config.local.php` selon vos besoins :
  * URL de l'instance PeerTube (par défaut : https://gade.o-k-i.net)
  * Compte Castopod à afficher (par défaut : `@annu_kute_cedric` sur https://kute.o-k-i.net)
  * Compte Mastodon à suivre (par défaut : `@cedric` sur https://bokante.o-k-i.net)
  * Clé API
  * Catégories à afficher
  * Nombre de vidéos par section
  * Fuseau horaire par défaut (`DEFAULT_TIMEZONE`)
  * etc.

Les modifications apportées à `config.local.php` ne seront pas suivies par Git, ce qui vous permet de personnaliser votre instance sans affecter le code source principal.

=== Configuration du fuseau horaire

Par défaut, le site utilise le fuseau horaire `America/Guadeloupe`. Vous pouvez le changer en définissant la constante `DEFAULT_TIMEZONE` dans votre `config.local.php` :

[source,php]
----
// Fuseau horaire par défaut pour l'affichage des dates
// Liste des fuseaux disponibles : https://www.php.net/manual/fr/timezones.php
define('DEFAULT_TIMEZONE', 'America/Guadeloupe');
----

Cette configuration affecte :

- L'affichage des dates et heures sur tout le site
- Les annonces de directs à venir avec leurs horaires
- Le système de compte à rebours
- La gestion des fuseaux horaires multiples dans les annonces

== 🏷️ Personnalisation des catégories

Pour personnaliser les catégories affichées sur la page d'accueil, modifiez la constante `PRIORITY_CATEGORIES` dans votre fichier `config.local.php` :

[source,php]
----
define('PRIORITY_CATEGORIES', [
    11 => 'Actualité & Politique',
    14 => 'Activisme',
    15 => 'Science & Technologie',
    1 => 'Musique',
    // Ajoutez d'autres catégories selon vos besoins
]);
----

- Les clés sont les IDs des catégories dans PeerTube
- Les valeurs sont les noms personnalisés que vous souhaitez afficher
- L'ordre dans le tableau détermine l'ordre d'affichage sur la page

== 🎨 Personnalisation

Vous pouvez personnaliser l'apparence de la plateforme en modifiant les fichiers CSS dans le dossier `css/`. Pour changer le logo et les couleurs principales:

. 🖼️ Remplacez le fichier `img/logo.png` par votre propre logo
. 🎨 Modifiez les couleurs dans `css/styles.css`

== 📝 Personnalisation du sitemap, robots.txt, webmanifest et mentions légales

Les fichiers `sitemap.xml`, `robots.txt`, `site.webmanifest` et `mentions-legales.php` contiennent des données spécifiques au domaine (`annukuteced.buzz`). Pour les adapter à votre domaine :

. Copiez les fichiers samples pour créer vos propres versions :
+
[source,bash]
----
cp sitemap.xml.sample sitemap.xml
cp robots.txt.sample robots.txt
cp site.webmanifest.sample site.webmanifest
cp mentions-legales.php.sample mentions-legales.php
----

. Remplacez les placeholders par vos informations réelles :
  * `VOTRE-DOMAINE` par `annukuteced.buzz`
  * `VOTRE-DATE-MAJ` par la date de dernière mise à jour des mentions légales

Ces fichiers sont listés dans le `.gitignore` afin que vos modifications ne soient pas suivies par Git, ce qui vous permet de personnaliser votre instance sans affecter le code source principal.

== 📺 Section Hero : Direct, Vidéo et Playlists

ANNU KUTE CED propose une section hero flexible et configurable en haut de la page d'accueil, pouvant afficher soit un direct PeerTube, soit une vidéo unique, soit une playlist audio/vidéo (PeerTube, Funkwhale, Castopod), soit être masquée complètement.

=== 🎯 Modes disponibles

La section hero supporte quatre modes configurables via `HERO_TYPE` :

- *`live`* : Affiche le direct PeerTube s'il est actif, sinon affiche l'annonce du prochain live
- *`video`* : Affiche une vidéo PeerTube spécifique
- *`playlist`* : Affiche une playlist embarquée (PeerTube, Funkwhale ou Castopod)
- *`none`* : Masque complètement la section hero

=== ⚙️ Configuration

Ajoutez dans votre `config.local.php` :

[source,php]
----
// Type de contenu à afficher dans la section hero
// Options: 'live', 'video', 'playlist', 'none'
define('HERO_TYPE', 'video');

// === Configuration pour HERO_TYPE = 'live' ===
define('LIVE_ACCOUNT_NAME', 'annu_kute_ced');

// === Configuration pour HERO_TYPE = 'video' ===

// ID de la vidéo (extrait de l'URL: https://gade.o-k-i.net/w/VIDEO_ID)
define('HERO_VIDEO_ID', '1aJ2u9euwF9fWKQhFxwFio');

// Titre de la vidéo (optionnel, pour l'accessibilité)
define('HERO_VIDEO_TITLE', 'Vidéo de présentation');

// === Configuration pour HERO_TYPE = 'playlist' ===

// Type de plateforme: 'peertube', 'funkwhale', 'castopod'
define('PLAYLIST_PLATFORM', 'peertube');

// URL de base de la plateforme
define('PLAYLIST_INSTANCE_URL', 'https://gade.o-k-i.net');

// ID de la playlist à afficher
define('PLAYLIST_ID', 'b0f923b5-f8f6-4b5c-b167-6c4f0e04fd42');

// Titre de la playlist (optionnel)
define('PLAYLIST_TITLE', 'Sélection ANNU KUTE CED');

// Description de la playlist (optionnel)
define('PLAYLIST_DESCRIPTION', 'Notre sélection de vidéos');
----

=== 🎬 Exemples de configuration

==== Vidéo unique PeerTube

[source,php]
----
define('HERO_TYPE', 'video');
define('HERO_VIDEO_ID', '1aJ2u9euwF9fWKQhFxwFio');
define('HERO_VIDEO_TITLE', 'Présentation du podcast');
----

L'URL de la vidéo sera : `https://gade.o-k-i.net/w/1aJ2u9euwF9fWKQhFxwFio`

==== PeerTube (Playlist vidéo)

[source,php]
----
define('PLAYLIST_PLATFORM', 'peertube');
define('PLAYLIST_INSTANCE_URL', 'https://gade.o-k-i.net');
define('PLAYLIST_ID', 'b0f923b5-f8f6-4b5c-b167-6c4f0e04fd42');
----

L'URL de la playlist sera : `https://gade.o-k-i.net/w/p/b0f923b5-f8f6-4b5c-b167-6c4f0e04fd42`

==== Funkwhale (Playlist audio)

[source,php]
----
define('PLAYLIST_PLATFORM', 'funkwhale');
define('PLAYLIST_INSTANCE_URL', 'https://tanker.funkwhale.audio');
define('PLAYLIST_ID', '12345');
----

==== Castopod (Podcast)

[source,php]
----
define('PLAYLIST_PLATFORM', 'castopod');
define('PLAYLIST_INSTANCE_URL', 'https://kute.o-k-i.net');
define('PLAYLIST_ID', '@annu_kute_cedric');
----

=== 📺 Annonce du prochain live (mode `HERO_TYPE = 'live'`)

Lorsque le mode est configuré sur `live`, le système affiche automatiquement une annonce configurable lorsqu'il n'y a pas de diffusion en direct en cours.

==== ✨ Fonctionnalités de l'annonce live

- 📅 *Date et heure dynamiques* : Génération automatique à partir de `NEXT_LIVE_DATE`
- 🌍 *Multi-fuseaux horaires* : Affichage automatique pour 5 territoires (Ma'ohi Nui, Martinique/Guadeloupe, Guyane, France, Kanaky)
- ⏰ *Décalage UTC* : Affichage du fuseau horaire de référence (UTC-04:00 pour La Guadeloupe)
- 📅 *Indicateurs de jour* : Affichage des décalages de jour (+1j/-1j) si nécessaire
- 🖼️ *Image personnalisable* : Support des formats Instagram (portrait 4:5, carré 1:1) et paysage (16:9)
- 📱 *Responsive complet* : Layouts adaptés pour desktop (50/50), tablette (vertical), et mobile
- 🔄 *Flexbox intelligent* : Réorganisation automatique des fuseaux horaires selon la largeur d'écran

==== ⚙️ Configuration de l'annonce live

Pour configurer l'annonce du prochain live, ajoutez dans votre `config.local.php` :

[source,php]
----
// Activer l'annonce du prochain live
define('NEXT_LIVE_ENABLED', true);

// Titre (la date sera ajoutée automatiquement)
define('NEXT_LIVE_TITLE', 'Prochain live');

// Description (l'heure sera ajoutée automatiquement)
define('NEXT_LIVE_DESCRIPTION', 'Enregistrement du prochain épisode ANNU KUTE CED.');

// Date du prochain live au format Y-m-d H:i:s
define('NEXT_LIVE_DATE', '2025-10-11 10:00:00');

// Chemin vers l'image d'annonce (optionnel)
define('NEXT_LIVE_IMAGE', 'uploads/next-live.jpg');
----

=== 📁 Gestion des images

. Placez vos images dans le dossier `uploads/` (non tracké par Git)
. Formats recommandés :
  * Portrait 4:5 : 1080×1350px ou 1280×1600px - *Idéal*
  * Carré 1:1 : 1080×1080px - *Parfait*
  * Paysage 16:9 : 1920×1080px
. Optimisez vos images (< 500 Ko recommandé)

=== 🎯 Affichage

*Desktop (≥1700px)* : Layout 50/50 (image à gauche, informations à droite)

*Tablette (1025-1699px)* : Hero seul sur une ligne, Mastodon et WordPress côte à côte en dessous

*Mobile (<769px)* : Stack vertical avec scroll si nécessaire

=== 🌍 Fuseaux horaires affichés

L'annonce calcule automatiquement les heures locales pour :

- *Ma'ohi Nui* (Polynésie française) - UTC-10:00
- *Martinique / Guadeloupe* - UTC-04:00
- *Guyane* - UTC-03:00
- *France* - UTC+02:00
- *Kanaky* (Nouvelle-Calédonie) - UTC+11:00

L'heure de référence (La Guadeloupe, UTC-04:00) est affichée dans le badge principal.

== 💝 Système de dons

ANNU KUTE CED intègre un système de dons moderne et flexible supportant plusieurs plateformes de paiement.

=== ✨ Fonctionnalités

- 💳 *Multi-plateformes* : Support de LiberaPay, Ko-fi et Stripe
- 🔄 *Dons ponctuels et récurrents* : Système d'onglets pour choisir le type de don (Stripe)
- 🎯 *Montants prédéfinis* : Boutons rapides avec montants suggérés (1€, 5€, 10€, 20€, 50€)
- 🎨 *Design moderne* : Interface élégante avec logos officiels des plateformes
- 🔒 *Sécurisé* : Validation stricte des URLs et protection XSS
- 📱 *Responsive* : Interface optimisée mobile et desktop
- ♿ *Accessible* : Conforme aux standards d'accessibilité
- 🌙 *Mode sombre* : Support complet du thème sombre

=== ⚙️ Configuration

Pour activer le système de dons, ajoutez dans votre `config.local.php` :

[source,php]
----
// Activer le système de dons
define('DONATIONS_ENABLED', true);

// URLs des plateformes de don externes
define('LIBERAPAY_URL', 'https://liberapay.com/votre-compte/donate');
define('KOFI_URL', 'https://ko-fi.com/votre-compte');

// Activer les dons via Stripe
define('STRIPE_ENABLED', true);

// Liens Stripe pour les dons ponctuels
define('STRIPE_ONE_TIME_LINKS', [
    1 => 'https://buy.stripe.com/xxxxx',  // Lien pour don de 1€
    5 => 'https://buy.stripe.com/xxxxx',  // Lien pour don de 5€
    10 => 'https://buy.stripe.com/xxxxx', // Lien pour don de 10€
    20 => 'https://buy.stripe.com/xxxxx', // Lien pour don de 20€
    50 => 'https://buy.stripe.com/xxxxx', // Lien pour don de 50€
    'custom' => 'https://buy.stripe.com/xxxxx' // Lien pour montant personnalisé
]);

// Liens Stripe pour les dons mensuels (récurrents)
define('STRIPE_MONTHLY_LINKS', [
    1 => 'https://buy.stripe.com/xxxxx',  // Lien pour don mensuel de 1€
    5 => 'https://buy.stripe.com/xxxxx',  // Lien pour don mensuel de 5€
    10 => 'https://buy.stripe.com/xxxxx', // Lien pour don mensuel de 10€
    20 => 'https://buy.stripe.com/xxxxx', // Lien pour don mensuel de 20€
    50 => 'https://buy.stripe.com/xxxxx', // Lien pour don mensuel de 50€
]);

// Montants suggérés (optionnel)
define('DONATION_AMOUNTS', [1, 5, 10, 20, 50]);

// Devise (optionnel, EUR par défaut)
define('DONATION_CURRENCY', 'EUR');
----

NOTE: Au moins une plateforme de don doit être configurée (LiberaPay, Ko-fi ou Stripe) pour que la page s'affiche.

=== 📄 Personnalisation

. Copiez le fichier sample pour créer votre page de dons :
+
[source,bash]
----
cp dons.php.sample dons.php
----

. Personnalisez le contenu directement dans `dons.php` :
  * Modifiez les textes dans les sections `<!-- PERSONNALISEZ -->`
  * Adaptez les objectifs listés au podcast
  * Ajustez les cartes d'information selon vos besoins

=== 🎯 Interface utilisateur

Une fois activé, le système de dons ajoute :

- 💝 *Icône cœur rouge* dans le header
- 📋 *Lien "Soutenir"* dans la sidebar
- 📄 *Page dédiée* accessible via `/dons.php`

La page de dons affiche uniquement les plateformes configurées :

- *LiberaPay* : Bouton avec logo jaune officiel
- *Ko-fi* : Bouton avec logo bleu officiel
- *Stripe* : Interface avec onglets "Don ponctuel" / "Don mensuel"

=== 💳 Configuration Stripe

Pour configurer Stripe :

. Créez vos liens de paiement dans votre tableau de bord Stripe
. Pour chaque montant (1€, 5€, 10€, 20€, 50€), créez :
  * Un lien de paiement ponctuel
  * Un lien d'abonnement mensuel (si souhaité)
. Copiez les URLs générées dans votre `config.local.php`
. Le lien `'custom'` permet de rediriger vers une page Stripe avec montant personnalisable

=== 🔒 Sécurité

Le système intègre plusieurs protections :

- ✅ *Validation des URLs* : Vérification que les plateformes sont bien configurées
- ✅ *Protection XSS* : Échappement de toutes les sorties utilisateur
- ✅ *Headers sécurisés* : CSP et autres headers de sécurité
- ✅ *Ouverture sécurisée* : Liens avec `noopener noreferrer`
- ✅ *Tokens CSRF* : Protection contre les attaques CSRF

== 🎙️ Intégration Castopod (Podcasts)

ANNU KUTE CED peut afficher les derniers épisodes du podcast Castopod directement sur la page d'accueil, à côté de la timeline Mastodon.

=== ✨ Fonctionnalités

- 🎧 *Affichage des derniers épisodes* : Liste configurable des épisodes récents
- 🖼️ *Miniatures des épisodes* : Affichage des images de couverture
- ⏱️ *Durée et date* : Informations complètes sur chaque épisode
- 🎨 *Design cohérent* : Interface harmonisée avec le reste du site
- 📱 *Responsive* : Affichage adapté mobile et desktop
- 🌙 *Mode sombre* : Support complet du thème sombre
- 🔄 *Fallback intelligent* : Fonctionne avec ou sans l'extension PHP SimpleXML

=== ⚙️ Configuration

Pour activer l'intégration Castopod, ajoutez dans votre `config.local.php` :

[source,php]
----
// Activer l'affichage des podcasts Castopod
define('CASTOPOD_ENABLED', true);

// URL de l'instance Castopod
define('CASTOPOD_URL', 'https://kute.o-k-i.net');

// Slug du podcast ANNU KUTE CED
// Le feed RSS est accessible à : https://kute.o-k-i.net/@annu_kute_cedric/feed
define('CASTOPOD_PODCAST_SLUGS', [
    'annu_kute_cedric'
]);

// Nombre d'épisodes à afficher
define('CASTOPOD_EPISODES_COUNT', 5);

// IMPORTANT : Activer le cache pour éviter le rate limiting
define('CACHE_ENABLED', true);
define('CACHE_DURATION', 3600); // 1 heure recommandé
----

WARNING: *Rate Limiting* : Castopod applique un rate limit strict sur les requêtes RSS. *Le cache est fortement recommandé* pour éviter ces délais à chaque chargement de page.

TIP: Pour un seul podcast, vous pouvez utiliser une chaîne : `define('CASTOPOD_PODCAST_SLUGS', ['annu_kute_cedric']);`

=== 📋 Prérequis

- *Extension PHP XML* (recommandée mais optionnelle) :
+
[source,bash]
----
# Sur Ubuntu/Debian
sudo apt install php8.3-xml

# Sur CentOS/RHEL
sudo yum install php-xml
----
+
NOTE: Si l'extension n'est pas installée, un fallback avec parsing regex sera utilisé automatiquement (moins performant mais fonctionnel).

=== 🎯 Affichage

La section Castopod s'affiche automatiquement sur la page d'accueil selon la configuration :

*Ordre d'affichage* :
1. Vidéo hero (si configurée)
2. Podcasts Castopod
3. Timeline Mastodon
4. Articles WordPress (si activé)

*Desktop* :
- Castopod + Mastodon : Layout 1fr 2fr (podcasts étroit, timeline large)
- Castopod + Mastodon + WordPress : Layout 1fr 2fr 1fr (trois colonnes)
- Mastodon + WordPress (sans Castopod) : Layout 2fr 1fr (timeline large, articles étroits)

*Mobile/Tablette* :
- Layout vertical avec toutes les sections empilées dans l'ordre ci-dessus

=== 🔧 Fonctionnement technique

Le système récupère les épisodes via le flux RSS Castopod :

- *URL du feed* : `CASTOPOD_URL/@PODCAST_SLUG/feed`
- *Format* : RSS 2.0 avec namespace iTunes
- *Données extraites* : Titre, lien, date, durée, image, description
- *Cache* : Support du système de cache si activé
- *Timeout* : 10 secondes pour éviter les blocages

=== 🎨 Personnalisation CSS

Les styles sont définis dans `css/castopod-podcasts.css` :

- `.castopod-container` : Conteneur principal
- `.castopod-episode-item` : Élément d'épisode
- `.castopod-episode-thumb` : Miniature avec effet hover
- `.castopod-play-icon` : Icône de lecture au survol

== 📡 Intégration Mastodon

La page d'accueil affiche la timeline publique du compte Mastodon du podcast.

=== ⚙️ Configuration

[source,php]
----
// URL de l'instance Mastodon
define('MASTODON_INSTANCE_URL', 'https://bokante.o-k-i.net');

// URL publique du compte (utilisée pour les liens "Voir plus")
define('MASTODON_URL', 'https://bokante.o-k-i.net/@cedric');

// Nombre maximum de posts à récupérer et afficher
define('MASTODON_MAX_POST_FETCH', '10');
define('MASTODON_MAX_POST_SHOW', '10');
----

== 🛡️ Configuration de sécurité Apache

Le fichier `conf/.htaccess.sample` fourni inclut des règles de sécurité importantes pour protéger votre installation :

=== Protections incluses :

- 🚫 *Blocage des fichiers de configuration* : Empêche l'accès direct aux fichiers `.php`, `.config`, etc.
- 🔒 *Protection des répertoires sensibles* : Bloque l'accès aux dossiers `/includes/`, `/cache/`, `/docs/`
- 🗂️ *Désactivation de l'exploration* : Empêche la liste des fichiers dans les répertoires
- 🔐 *Blocage des fichiers cachés* : Protège les fichiers commençant par `.`
- 📄 *Blocage des fichiers temporaires* : Empêche l'accès aux `.sample`, `.bak`, `.log`, etc.

=== Installation :

[source,bash]
----
cp conf/.htaccess.sample .htaccess
----

WARNING: Cette configuration est essentielle pour la sécurité de votre installation. Ne pas l'utiliser expose vos fichiers de configuration aux visiteurs.

== 🛡️ Configuration de sécurité Nginx

Pour les serveurs Nginx, utilisez le fichier `conf/nginx.conf.sample` qui inclut les mêmes protections :

=== Protections incluses :

- 🚫 *Blocage des fichiers de configuration* : Empêche l'accès direct aux fichiers sensibles
- 🔒 *Protection des répertoires sensibles* : Bloque l'accès aux dossiers critiques
- 🗂️ *Désactivation de l'exploration* : `autoindex off`
- 🔐 *Blocage des fichiers cachés* : Protection des fichiers commençant par `.`
- 📄 *Optimisations* : Cache, compression gzip, headers de sécurité

=== Installation :

[source,bash]
----
# Adaptez les chemins dans conf/nginx.conf.sample puis :
sudo cp conf/nginx.conf.sample /etc/nginx/sites-available/votre-site
sudo ln -s /etc/nginx/sites-available/votre-site /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
----

== 📱 Progressive Web App (PWA)

Cette plateforme est une PWA complète offrant :

=== ✨ Fonctionnalités PWA

- 📲 *Installation native* : Bouton d'installation automatique dans l'interface
- 🌐 *Mode hors ligne* : Cache intelligent des pages et ressources visitées
- 📡 *Détection d'état* : Indicateur visuel en cas de perte de connexion
- ⚡ *Performance* : Chargement instantané des ressources en cache
- 📱 *Responsive* : Interface adaptée pour l'utilisation en application mobile

=== 📥 Comment installer l'application

. 🔄 *Automatique* : Un bouton "Installer" apparaît dans le header lors de la première visite
. 🔧 *Manuel* :
  * 🌐 *Chrome/Edge* : Menu → "Installer annukuteced.buzz"
  * 🍎 *Safari iOS* : Partager → "Ajouter à l'écran d'accueil"
  * 🦊 *Firefox Android* : Menu → "Installer"

=== 🌐 Compatibilité PWA

- ✅ Chrome/Edge (Android/Desktop)
- ✅ Safari (iOS 11.3+)
- ✅ Firefox (Android)
- ✅ Samsung Internet

=== 📄 Fichiers PWA

- 🔧 `sw.js` : Service Worker gérant le cache et mode offline
- 📋 `site.webmanifest` : Configuration de l'application (nom, icônes, etc.)
- 🪟 `browserconfig.xml` : Support des tuiles Windows

== 🚀 Déploiement

Pour déployer sur un serveur mutualisé:

. 🐘 Assurez-vous que votre hébergeur supporte PHP (version 7.0 minimum recommandée)
. 🔒 *Configurez HTTPS* (obligatoire pour les fonctionnalités PWA)
. 📤 Transférez tous les fichiers via FTP dans le répertoire racine de votre site
. 🔧 Vérifiez que les permissions des fichiers sont correctement définies (644 pour les fichiers, 755 pour les dossiers)
. 🌐 Configurez votre domaine `annukuteced.buzz` pour pointer vers le dossier où vous avez installé l'application
. 🧪 Testez l'installation PWA via les outils de développement du navigateur

== 👨‍💻 Développement

Si vous souhaitez contribuer au développement:

. 🌿 Créez une branche pour vos modifications: `git checkout -b ma-nouvelle-fonctionnalité`
. 💾 Committez vos changements: `git commit -m 'Ajout d'une nouvelle fonctionnalité'`
. 📤 Poussez vers la branche: `git push origin ma-nouvelle-fonctionnalité`
. 🔀 Soumettez une pull request

== 📜 Origine et licence

**ANNU KUTE CED** est un fork de **FEDIVERSE OKI**, une application développée par l'https://o-k-i.net[ORGANISATION KA INTERNATIONALE (OKI)^] sous licence GNU Affero General Public License v3 ou ultérieure.

- *Dépôt upstream* : https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/FEDIVERSE-OKI
- *Dépôt du fork* : `git@labola.o-k-i.net:cedric/annu-kute-ced.git`
- *Gestion* : L'application est maintenue par OKI ; ce fork est porté par le propriétaire du dépôt *cedric* (Cédric Famibelle-Pronzola).
- *Licence* : Le projet continue d'être distribué sous https://www.gnu.org/licenses/agpl-3.0.html[GNU Affero General Public License version 3 (AGPL-V3)^] ou toute version ultérieure, conformément à la licence d'origine.

Copyright (C) 2025 Cédric Famibelle-Pronzola & *ORGANISATION KA INTERNATIONALE*

*ORGANISATION KA INTERNATIONALE* : Nous sommes une association à but non lucratif dédiée à la promotion de nos langues et au traitement de l'actualité. Parallèlement, nous proposons des alternatives aux géants du numérique comme les GAFAM, en privilégiant l'utilisation de logiciels libres.

=== 🇫🇷 FR

Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la licence publique générale GNU Affero publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure.

Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de COMMERCIALISATION ou d'ADAPTATION À UN USAGE PARTICULIER. Voir la licence publique générale GNU Affero pour plus de détails.

Vous devriez avoir reçu une copie de la licence publique générale GNU Affero avec ce programme. Si ce n'est pas le cas, consultez https://www.gnu.org/licenses/.

=== 🇺🇸 EN

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.

== 📊 Analytics et Statistiques

=== 🔒 Respect de la vie privée

Cette plateforme utilise *Plausible Analytics*, une solution d'analyse web respectueuse de la vie privée qui :

- ✅ *Sans cookies* : Aucun cookie de suivi n'est installé
- ✅ *Conforme RGPD* : Respecte les réglementations européennes sur la protection des données
- ✅ *Open Source* : Code source ouvert et auditable
- ✅ *Données anonymes* : Aucune donnée personnelle collectée
- ✅ *Sans collecte inter-sites* : Pas de profilage des utilisateurs

=== 📈 Données collectées

Plausible collecte uniquement des statistiques anonymes :

- 📍 Pages visitées
- 🌍 Pays d'origine (basé sur l'IP, sans stockage)
- 📱 Type d'appareil (mobile, desktop, tablette)
- 🌐 Navigateur utilisé
- 📊 Temps passé sur le site

=== ⚙️ Configuration

Les analytics sont automatiquement activés via le script Plausible intégré dans le `<head>` de chaque page. La configuration est gérée dans `includes/security.php` avec les autorisations CSP appropriées.

== 📞 Contact

Pour toute question ou suggestion concernant cette plateforme, veuillez nous contacter à mailto:kontak@o-k-i.net[kontak@o-k-i.net].
