= đŸŽ™ïž ANNU KUTE CED — Hub multimĂ©dia du podcast :toc: left :toc-title: Sommaire / Contents :toclevels: 3 NOTE: Ce document dĂ©crit la version historique PHP (branche `main`). La branche `svelte` contient la réécriture **SvelteKit statique** (donnĂ©es bakĂ©es au build, charte OKI, FR/EN, PWA) — voir `docs/DEPLOIEMENT-SVELTEKIT.md` pour le build et le dĂ©ploiement. [[top]] 🌍 *Hub multimĂ©dia du podcast ANNU KUTE CED* + 🌍 *Multimedia hub for the ANNU KUTE CED podcast* [.text-center] *Choisissez votre langue / Choose your language :* + <> · <> ''' [[fr]] == đŸ‡«đŸ‡· Version française === 📖 Description *ANNU KUTE CED* est une interface web responsive qui fait office de *hub multimĂ©dia* pour le podcast du mĂȘme nom. Elle regroupe en un seul lieu : - đŸŽ„ la chaĂźne *PeerTube* du podcast (vidĂ©os, shorts, directs) ; - đŸŽ™ïž son compte *Castopod* (derniers Ă©pisodes, lecture audio intĂ©grĂ©e) ; - 📡 sa timeline *Mastodon* (actualitĂ©s et annonces). La plateforme est lĂ©gĂšre, dĂ©ployable sur un serveur mutualisĂ© (PHP + serveur web, sans base de donnĂ©es) et optimisĂ©e pour mobile et desktop. C'est aussi une *Progressive Web App* installable, avec mode hors ligne. 🎯 *Mission* : offrir un point d'entrĂ©e unique, libre et dĂ©centralisĂ©, pour dĂ©couvrir, Ă©couter et suivre le podcast ANNU KUTE CED sans dĂ©pendre des grandes plateformes propriĂ©taires. === 🌳 Origine du projet Cette application est un *fork* de 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)^], elle-mĂȘme issue du projet https://codeberg.org/Ka-Ubuntu/kaubuntu.re[kaubuntu.re^] du mouvement https://kaubuntu.com[Ka-Ubuntu^]. La licence d'origine (GNU AGPL v3) est conservĂ©e et respectĂ©e. [cols="1,3",options="header"] |=== | ÉlĂ©ment | DĂ©tail | DĂ©pĂŽt upstream | https://labola.o-k-i.net/ORGANISATION-KA-INTERNATIONALE/FEDIVERSE-OKI | DĂ©pĂŽt de ce fork | `git@labola.o-k-i.net:cedric/annu-kute-ced.git` | Domaine de production | https://annukuteced.buzz | Gouvernance | Application maintenue par OKI ; fork portĂ© par le propriĂ©taire du dĂ©pĂŽt *cedric* (CĂ©dric Famibelle-Pronzola) | Licence | https://www.gnu.org/licenses/agpl-3.0.html[GNU Affero General Public License v3^] (AGPL-V3) ou ultĂ©rieure |=== === 🔗 Sources et instances utilisĂ©es Le hub est configurĂ© par dĂ©faut pour agrĂ©ger les sources du podcast ANNU KUTE CED : [cols="1,2,3",options="header"] |=== | Service | Instance | Compte / chaĂźne | đŸŽ„ PeerTube (vidĂ©os, lives) | GADE — `https://gade.o-k-i.net` | https://gade.o-k-i.net/c/annu_kute_ced/videos[`annu_kute_ced`^] | đŸŽ™ïž Castopod (Ă©pisodes audio) | KUTE — `https://kute.o-k-i.net` | https://kute.o-k-i.net/@annu_kute_cedric[`@annu_kute_cedric`^] | 📡 Mastodon (timeline) | BOKANTE — `https://bokante.o-k-i.net` | https://bokante.o-k-i.net/@cedric[`@cedric`^] | đŸŽ” Funkwhale (musique, optionnel, dĂ©sactivĂ© par dĂ©faut) | MIZIK — `https://mizik.o-k-i.net` | morceaux alĂ©atoires de l'instance |=== Toutes ces sources sont modifiables dans `includes/config.local.php` (voir <>). === ✹ FonctionnalitĂ©s ==== đŸŽ„ VidĂ©os PeerTube - VidĂ©os rĂ©centes, tendances et par catĂ©gories (configurables) - *Shorts* : carrousel dĂ©diĂ© aux vidĂ©os portrait de moins de 3 minutes (dĂ©filement tactile) - Page vidĂ©o complĂšte : lecteur PeerTube embarquĂ©, description Markdown, badge de licence Creative Commons, commentaires (lecture seule), vidĂ©os suggĂ©rĂ©es - *TĂ©lĂ©chargement* : fichiers directs et playlists HLS, avec rĂ©solution et taille - *Partage* : copie de lien, code d'intĂ©gration, e-mail, Facebook, X, WhatsApp, LinkedIn, Telegram - Recherche plein texte et recherche par hashtag (prĂ©fixe `#`) - Pagination AJAX « Voir plus » (protĂ©gĂ©e par jeton CSRF et vĂ©rification d'origine) ==== đŸ“ș Directs et annonces - Page *Direct* (`/direct`) : embed du live PeerTube s'il est en cours, avec autoplay - *Annonce du prochain live* : date et heure converties automatiquement pour 5 territoires (Ma'ohi Nui, Martinique/Guadeloupe, Guyane, France, Kanaky), image personnalisable (4:5, 1:1, 16:9) - Section *hero* d'accueil configurable : live, vidĂ©o unique, playlist (PeerTube / Funkwhale / Castopod) ou masquĂ©e ==== đŸŽ™ïž Podcast et audio - *Castopod* : derniers Ă©pisodes via flux RSS, avec *lecteur audio intĂ©grĂ©* (lecture/pause, avance automatique Ă  l'Ă©pisode suivant, un seul flux Ă  la fois) - *Funkwhale* (optionnel) : sĂ©lection alĂ©atoire de morceaux de l'instance, avec le mĂȘme lecteur intĂ©grĂ© ==== 📡 RĂ©seaux sociaux et contenus externes - *Timeline Mastodon* intĂ©grĂ©e (bibliothĂšque vendored https://gitlab.com/idotj/mastodon-embed-timeline[mastodon-embed-timeline^] v4.7.0, AGPLv3) - *CompatibilitĂ© Pleroma* : adaptateur qui convertit les rĂ©ponses de l'API Pleroma au format Mastodon attendu par la timeline - *WordPress* (optionnel) : derniers articles via l'API REST, avec image Ă  la une et auteur ==== đŸ“± PWA et confort d'utilisation - *Progressive Web App* installable (bouton d'installation automatique) - Mode hors ligne : pages et ressources statiques en cache via Service Worker - Indicateur visuel de perte de connexion - *Mode sombre* (basĂ© sur `prefers-color-scheme`, mĂ©morisĂ© en `localStorage`) - Interface entiĂšrement responsive (mobile, tablette, desktop) ==== 💝 Dons, compte Ă  rebours et divers - *Page de dons* : LiberaPay, Ko-fi et Stripe (dons ponctuels et mensuels, montants suggĂ©rĂ©s) - *Compte Ă  rebours* : page de lancement/maintenance multi-fuseaux qui verrouille le site jusqu'Ă  la date cible - Bloc « À propos » configurable (titre, deux paragraphes, image lĂ©gendĂ©e) ==== 🔍 SEO et donnĂ©es structurĂ©es - *JSON-LD* gĂ©nĂ©rĂ© automatiquement : `WebSite` (avec `SearchAction`), `VideoObject`, `CollectionPage`, `BreadcrumbList` - Balises *Open Graph* et *Twitter Cards* - `sitemap.xml` et `robots.txt` fournis en exemples - PrĂȘt pour *Plausible Analytics* (voir <>) : dĂ©sactivĂ© par dĂ©faut, sans cookies et conforme RGPD ==== đŸ›Ąïž SĂ©curitĂ© - En-tĂȘtes de sĂ©curitĂ© complets : CSP dynamique avec *nonce* par requĂȘte, HSTS, `X-Frame-Options`, `nosniff`, `Referrer-Policy`, `Permissions-Policy` - Protection *CSRF* sur les requĂȘtes AJAX, vĂ©rification de l'en-tĂȘte `Origin` - Validation anti-*SSRF* des URLs d'instances et liste blanche des endpoints de l'API PeerTube - Échappement systĂ©matique des sorties (anti-XSS) - Exemples de configuration sĂ©curisĂ©e pour Apache et Nginx dans `conf/` === đŸ› ïž Technologies utilisĂ©es - 📄 HTML5, 🎹 CSS3 (Media Queries), ⚡ JavaScript vanilla (sans framework, sans jQuery) - 🐘 PHP 7.4+ (aucune base de donnĂ©es requise) - 🔧 Service Worker (cache offline) et 📋 Web App Manifest (installation) - 📩 BibliothĂšques : * 🎯 Font Awesome 7 (icĂŽnes, via CDN cdnjs) * 📡 mastodon-embed-timeline v4.7.0 (vendored dans `js/`, AGPLv3) * 📊 Plausible Analytics (prĂ©-configurĂ©, Ă  activer manuellement) === 📁 Structure du projet [source] ---- ├── ajax/ │ └── load-more-videos.php # Endpoint AJAX « Voir plus » (CSRF + Origin) ├── conf/ │ ├── .htaccess.sample # Configuration Apache sĂ©curisĂ©e │ └── nginx.conf.sample # Configuration Nginx sĂ©curisĂ©e ├── css/ # Feuilles de style (styles, vidĂ©o, catĂ©gories, │ │ # recherche, dons, countdown, mastodon, │ ├── castopod-podcasts.css # castopod, funkwhale, wordpress, grille
) │ └── 
 ├── docs/ │ ├── wireframes/ # Maquettes d'origine (PNG desktop + mobile) │ ├── docinfo.html # Styles d'impression (fallback emoji) pour l'export │ └── generate-readme-pdf.sh # Export de la doc : README.html / README.pdf ├── img/ # Logo, favicons, icĂŽne de lecture ├── includes/ │ ├── config.php # Bootstrap + fonctions API (PeerTube, Castopod, │ │ # Funkwhale) et formatage │ ├── config.default.php # Valeurs par dĂ©faut de toutes les constantes │ ├── config.local.php.sample # ModĂšle de configuration locale (Ă  copier) │ ├── security.php # CSRF, CSP + nonce, en-tĂȘtes, validateurs │ ├── simple-cache.php # Cache fichier de l'API (cache/api/) │ ├── wordpress.php # IntĂ©gration API REST WordPress │ ├── structured-data.php # GĂ©nĂ©rateurs JSON-LD │ ├── header.php # Barre supĂ©rieure (recherche, rĂ©seaux, thĂšme
) │ ├── footer.php # Pied de page │ ├── sidebar.php # Navigation latĂ©rale │ ├── mobile-menu.php # Menu mobile coulissant │ ├── hero-section.php # BanniĂšre d'accueil (live/vidĂ©o/playlist) │ ├── featured-videos.php # ⚠ legacy, non utilisĂ© par les pages actuelles │ ├── recent-videos.php # ⚠ legacy, non utilisĂ© par les pages actuelles │ ├── pwa-init.php # ⚠ legacy, PWA dĂ©sormais inline dans index.php │ └── lib/ │ └── markdown.php # Rendu Markdown (sous-ensemble PeerTube) ├── js/ │ ├── main.js # UI globale (thĂšme, carrousel, « Voir plus » ) │ ├── audio-player.js # Lecteur audio Castopod / Funkwhale │ ├── categories.js # « Voir plus » de la page catĂ©gorie │ ├── countdown.js # Compte Ă  rebours │ ├── search.js # Cartes cliquables de la recherche │ ├── mastodon-config.php # Configuration JS de la timeline (servie en JS) │ ├── mastodon-timeline.umd.js # mastodon-embed-timeline v4.7.0 (vendored) │ └── pleroma-adapter.js # Adaptateur Pleroma → API Mastodon ├── uploads/ # Images d'annonces (non versionnĂ©, hors .gitkeep) ├── index.php # Page d'accueil (agrĂ©gateur) ├── video.php # Page de lecture d'une vidĂ©o ├── categories.php # Page d'une catĂ©gorie ├── recherche.php # Page de recherche ├── direct.php # Page du direct / annonce du prochain live ├── countdown.php # Page de compte Ă  rebours (maintenance) ├── sw.js # Service Worker (PWA) ├── site.webmanifest.sample # Exemple de manifest PWA ├── browserconfig.xml # Tuiles Windows ├── sitemap.xml.sample # Exemple de sitemap ├── robots.txt.sample # Exemple de robots.txt ├── mentions-legales.php.sample # Exemple de mentions lĂ©gales ├── dons.php.sample # Exemple de page de dons ├── LICENSE # GNU AGPL v3 └── README.adoc ---- NOTE: Les fichiers marquĂ©s « legacy » sont conservĂ©s pour rĂ©fĂ©rence mais ne sont inclus par aucune page ; la page d'accueil rend ces sections en interne. === 📋 PrĂ©requis - 🐘 *PHP 7.4+* (recommandĂ© : PHP 8.0+) - 📩 *Extensions PHP requises :* * `curl` — appels API (PeerTube, Castopod, Funkwhale, WordPress) * `json` — traitement des rĂ©ponses * `intl` — dates internationales et fuseaux horaires * `mbstring` — chaĂźnes multi-octets * `xml` (SimpleXML) — recommandĂ©e pour Castopod (un fallback regex existe) - 🌐 *Serveur web* : Apache ou Nginx - 🔒 *HTTPS* : requis pour les fonctionnalitĂ©s PWA .Installation de l'extension `intl` [source,bash] ---- # Ubuntu / Debian sudo apt-get install php-intl # Fedora / RHEL / CentOS sudo dnf install php-intl # RedĂ©marrer le serveur web sudo systemctl restart apache2 # Apache sudo systemctl restart php8.3-fpm # Nginx + php-fpm # VĂ©rifier php -m | grep intl ---- === 🚀 Installation . đŸ“„ Clonez le dĂ©pĂŽt : + [source,bash] ---- git clone git@labola.o-k-i.net:cedric/annu-kute-ced.git cd annu-kute-ced ---- . 📩 VĂ©rifiez les prĂ©requis PHP (voir ci-dessus). . 🔧 CrĂ©ez votre configuration locale et les fichiers d'instance : + [source,bash] ---- cp includes/config.local.php.sample includes/config.local.php cp site.webmanifest.sample site.webmanifest cp robots.txt.sample robots.txt cp sitemap.xml.sample sitemap.xml cp mentions-legales.php.sample mentions-legales.php cp dons.php.sample dons.php ---- . đŸ›Ąïž Installez la configuration serveur sĂ©curisĂ©e depuis `conf/` (voir <>). . ✍ Rendez le dossier `cache/` accessible en Ă©criture par le serveur web (créé automatiquement au premier appel API). . 🔒 Assurez-vous que HTTPS est actif (obligatoire pour la PWA). . 🌐 Faites pointer votre domaine (`annukuteced.buzz`) vers la racine du projet. [[fr-configuration]] === ⚙ Configuration ==== Le systĂšme en trois fichiers [cols="1,2,2",options="header"] |=== | Fichier | RĂŽle | VersionnĂ© ? | `includes/config.php` | Bootstrap : charge les autres fichiers et contient toutes les fonctions mĂ©tier | ✅ Oui | `includes/config.default.php` | Valeurs par dĂ©faut de chaque constante (dĂ©finies seulement si absentes) | ✅ Oui | `includes/config.local.php` | Vos surcharges locales — *prioritaires* car chargĂ©es en premier | ❌ Non (`.gitignore`) |=== Pour personnaliser l'instance, ne modifiez jamais `config.default.php` : dĂ©finissez la constante dans `config.local.php`. Comme ce dernier est chargĂ© avant, vos valeurs ont toujours la prioritĂ©. [source,bash] ---- cp includes/config.local.php.sample includes/config.local.php ---- ==== RĂ©fĂ©rence des constantes Valeurs par dĂ©faut issues de `includes/config.default.php`. .Application et organisation [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `APP_HOST_NAME` | `'annukuteced.buzz'` | Nom de domaine affichĂ© (mentions lĂ©gales
) | `ORGANIZATION_SHORT_NAME` | `'ANNU KUTE CED'` | Nom court de l'organisation | `ORGANIZATION_NAME` | `'ANNU KUTE CED'` | Nom complet de l'organisation |=== .PeerTube [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `PEERTUBE_URL` | `'https://gade.o-k-i.net'` | URL de l'instance PeerTube (obligatoire) | `PEERTUBE_DISPLAY_NAME` | `'gade.o-k-i.net'` | Nom affichĂ© de l'instance | `API_KEY` | `''` | ClĂ© API optionnelle (`Authorization: ApiKey 
`) | `SHOW_VIDEO_VIEWS` | `false` | Afficher le nombre de vues sur les cartes vidĂ©o | `PRIORITY_CATEGORIES` | `[11, 15, 4, 9, 10]` | CatĂ©gories mises en avant : `[ID => 'Nom']`, ordre = ordre d'affichage (accueil, sidebar, footer, menu mobile) | `DEFAULT_TIMEZONE` | `'America/Guadeloupe'` | Fuseau horaire d'affichage (https://www.php.net/manual/fr/timezones.php[liste PHP^]) |=== .Section hero (banniĂšre d'accueil) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `HERO_TYPE` | `'live'` | `'live'` · `'video'` · `'playlist'` · `'none'` | `LIVE_ACCOUNT_NAME` | `'annu_kute_ced'` | Compte PeerTube surveillĂ© pour les directs (hero + page `/direct`) | `HERO_VIDEO_ID` | `'1aJ2u9euwF9fWKQhFxwFio'` | UUID de la vidĂ©o (mode `video`), extrait de l'URL `/w/` | `HERO_VIDEO_TITLE` | `'VidĂ©o de prĂ©sentation'` | Titre (accessibilitĂ©) | `PLAYLIST_PLATFORM` | `'peertube'` | `'peertube'` · `'funkwhale'` · `'castopod'` | `PLAYLIST_INSTANCE_URL` | `''` | URL de base de la plateforme de playlist | `PLAYLIST_ID` | `''` | ID de la playlist ; pour Castopod : `'@slug'` | `PLAYLIST_TITLE` / `PLAYLIST_DESCRIPTION` | `''` / `''` | Textes optionnels (sinon rĂ©cupĂ©rĂ©s via API) |=== .Castopod (podcast) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `CASTOPOD_ENABLED` | `true` | Activer la section podcast de l'accueil | `CASTOPOD_URL` | `'https://kute.o-k-i.net'` | URL de l'instance Castopod | `CASTOPOD_PODCAST_SLUGS` | `['annu_kute_cedric']` | Slug(s) de podcast ; flux RSS = `{URL}/@{slug}/feed`. Plusieurs podcasts : Ă©pisodes fusionnĂ©s et triĂ©s par date | `CASTOPOD_EPISODES_COUNT` | `5` | Nombre total d'Ă©pisodes affichĂ©s |=== WARNING: Castopod applique un *rate limit* strict (HTTP 429) sur les flux RSS. Le code patiente 5 s entre chaque podcast. *Activez le cache* (`CACHE_ENABLED`) pour Ă©viter ces dĂ©lais Ă  chaque page. .Funkwhale (musique, optionnel) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `FUNKWHALE_ENABLED` | `false` | Activer la section musique | `FUNKWHALE_URL` | `'https://mizik.o-k-i.net'` | URL de l'instance Funkwhale | `FUNKWHALE_TRACKS_COUNT` | `10` | Morceaux alĂ©atoires locaux affichĂ©s (50 mis en cache) |=== .Mastodon (timeline) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `MASTODON_INSTANCE_URL` | `'https://bokante.o-k-i.net'` | Instance Mastodon (ou Pleroma, via l'adaptateur) | `MASTODON_URL` | `'https://bokante.o-k-i.net/@cedric'` | URL publique du compte (liens « Voir plus », footer) | `MASTODON_DATE_FORMAT` | `'fr-FR'` | Locale de date des posts | `MASTODON_BTN_SEE_MORE` / `MASTODON_BTN_RELOAD` | `'Voir plus de post'` / `'Rafraichir'` | LibellĂ©s des boutons | `MASTODON_MAX_POST_FETCH` / `MASTODON_MAX_POST_SHOW` | `'10'` / `'10'` | Posts rĂ©cupĂ©rĂ©s / affichĂ©s | `MASTODON_S3_MEDIA_URL` | _(non dĂ©fini)_ | Origine S3 des mĂ©dias (ajoutĂ©e Ă  la CSP `media-src`) |=== NOTE: La timeline n'a pas de flag d'activation : elle est toujours affichĂ©e sur l'accueil. .WordPress (optionnel) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `WORDPRESS_ENABLED` | `false` | Activer la section articles | `WORDPRESS_URL` | `''` | URL du site WordPress (sans `/` final) | `WORDPRESS_POSTS_COUNT` | `6` | Nombre d'articles (API REST `/wp-json/wp/v2/`) |=== .Dons [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `DONATIONS_ENABLED` | `false` | Activer le systĂšme (icĂŽne cƓur, lien « Soutenir », page `/dons.php`) | `LIBERAPAY_URL` / `KOFI_URL` | `''` / `''` | URLs des plateformes externes | `STRIPE_ENABLED` | `false` | Activer l'interface Stripe (onglets ponctuel / mensuel) | `STRIPE_ONE_TIME_LINKS` | `[1, 5, 10, 20, 50, 'custom'] => ''` | Liens de paiement Stripe par montant | `STRIPE_MONTHLY_LINKS` | `[1, 5, 10, 20, 50] => ''` | Liens d'abonnement mensuel Stripe | `DONATION_AMOUNTS` | `[1, 5, 10, 20, 50]` | Montants suggĂ©rĂ©s | `DONATION_CURRENCY` | `'EUR'` | Devise |=== NOTE: Au moins une plateforme (LiberaPay, Ko-fi ou Stripe) doit ĂȘtre configurĂ©e pour que `dons.php` s'affiche, sinon la page renvoie une erreur 500. .Compte Ă  rebours (maintenance / lancement) [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `COUNTDOWN_ENABLED` | `false` | ⚠ Si `true`, *toutes* les pages redirigent vers `countdown.php` | `COUNTDOWN_TARGET_DATE` | `'2025-10-11 00:00:00'` | Date cible (`Y-m-d H:i:s`) ; Ă  la fin, redirection vers `/` | `COUNTDOWN_TIMEZONES` | 5 territoires | `[LibellĂ© => fuseau PHP]` affichĂ©s sur la page |=== .Annonce du prochain live [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `NEXT_LIVE_ENABLED` | `false` | Afficher l'annonce quand aucun direct n'est en cours | `NEXT_LIVE_TITLE` / `NEXT_LIVE_DESCRIPTION` | `'Prochain live'` / `'Rejoignez-nous
'` | Textes (date et heure ajoutĂ©es automatiquement) | `NEXT_LIVE_DATE` | `''` | Date du live (`Y-m-d H:i:s`) | `NEXT_LIVE_IMAGE` | `'uploads/next-live.jpg'` | Image d'annonce (utilisĂ©e seulement si le fichier existe) |=== .Site, rĂ©seaux sociaux et contact [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `SITE_NAME` | `'ANNU KUTE CED'` | Nom du site (titres, meta) | `SITE_DESCRIPTION` | `'Hub multimĂ©dia du podcast ANNU KUTE CED'` | Description SEO | `SITE_LOGO` / `SITE_FAVICON` | `'img/logo.png'` / `'img/favicon.png'` | Chemins des images | `FACEBOOK_URL`, `X_URL`, `INSTAGRAM_URL`, `YOUTUBE_URL`, `TIKTOK_URL` | `'#'` | `'#'` ou vide = icĂŽne masquĂ©e | `CONTACT_EMAIL` | `'kontak@o-k-i.net'` | E-mail de contact (footer) |=== .Mentions lĂ©gales [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `LEGAL_COPYRIGHT` | `'ANNU KUTE CED'` | Titulaire du copyright | `LEGAL_WEBMASTER_NAME` / `LEGAL_WEBMASTER_EMAIL` | `'CĂ©dric Famibelle-Pronzola'` / `'contact@cedric-pronzola.dev'` | Webmaster | `LEGAL_HOST_NAME`, `LEGAL_HOST_COMPANY`, `LEGAL_HOST_RCS`, `LEGAL_HOST_ADDRESS` | valeurs o2Switch | CoordonnĂ©es de l'hĂ©bergeur | `LEGAL_CONTACT_EMAIL` | `'kontak@o-k-i.net'` | Contact juridique | `LEGAL_LICENSE` / `LEGAL_LICENSE_URL` | AGPL-V3 + URL GNU | Licence du code | `LEGAL_SOURCE_CODE_URL` | `'https://labola.o-k-i.net/cedric/annu-kute-ced'` | DĂ©pĂŽt du code source (exigĂ© par l'AGPL pour un service rĂ©seau) | `LEGAL_SERVICE_DESCRIPTION` | `'est le hub multimĂ©dia du podcast ANNU KUTE CED.'` | Phrase de description du service |=== .Tags et filtres [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `TAG_INDEPENDENCE` | `'indĂ©pendance'` | Tag de la fonction `getIndependenceVideos()` (pas de section d'accueil associĂ©e actuellement) | `SHORTS_MAX_DURATION` | `180` | DurĂ©e max d'un short (s) ; ratio portrait (`aspectRatio ≀ 1`) aussi requis | `IMPORTANT_TAGS` | `['ANNUKUTECED', 'podcast', 
]` | Hashtags de la sidebar, du footer et du menu mobile | `POPULAR_TAGS` | `['podcast', 'annukuteced', 
]` | Hashtags affichĂ©s sur l'accueil |=== .Pagination et volumes d'affichage [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `VIDEOS_PER_PAGE` | `12` | VidĂ©os par page (recherche) | `COUNT_VIDEO_SEARCH` | `20` | RĂ©sultats rĂ©cupĂ©rĂ©s par recherche | `RECENT_VIDEOS_COUNT` / `TRENDING_VIDEOS_COUNT` / `CATEGORY_VIDEOS_COUNT` | `6` | Taille des sections d'accueil | `SHORTS_COUNT` / `SHORTS_COUNT_SEARCH` | `6` / `100` | Shorts affichĂ©s / pool de recherche | `LOAD_MORE_COUNT` | `6` | VidĂ©os chargĂ©es par clic sur « Voir plus » | `FEATURED_VIDEOS_COUNT` / `INDEPENDENCE_VIDEOS_COUNT` | `6` | RĂ©servĂ©s (sections non affichĂ©es actuellement) |=== .Cache [cols="2,2,3",options="header"] |=== | Constante | DĂ©faut | Description | `CACHE_ENABLED` | `false` | Active le cache pour *Castopod et Funkwhale* (fortement recommandĂ©) | `CACHE_DURATION` | `3600` | DurĂ©e de vie du cache (s) |=== NOTE: Le cache de l'API PeerTube et de WordPress (`includes/simple-cache.php`) est *toujours actif*, indĂ©pendamment de `CACHE_ENABLED`, avec des TTL par endpoint (catĂ©gories 1 h, vidĂ©os/recherche 10 min, articles WP 15 min, comptes 5 min). Les fichiers sont stockĂ©s dans `cache/api/`. .Bloc « À propos » (pas de valeur par dĂ©faut — bloc masquĂ© tant que non dĂ©fini) [cols="2,3",options="header"] |=== | Constante | Description | `MOVEMENT_TITLE` | Titre du bloc (dĂ©faut template : « À propos ») | `MOVEMENT_DESCRIPTION` | Premier paragraphe ; *commenter cette ligne masque tout le bloc* | `MOVEMENT_DESCRIPTION_2` | Second paragraphe (optionnel) | `MOVEMENT_IMAGE` / `MOVEMENT_IMAGE_ALT` / `MOVEMENT_CAPTION` | Image (`img/movement_presentation.png`, non versionnĂ©e), texte alternatif et lĂ©gende (HTML simple acceptĂ©) |=== ==== Exemple complet de `config.local.php` [source,php] ---- `, vĂ©rifiĂ© par `hash_equals` sur l'endpoint AJAX ; vĂ©rification de l'en-tĂȘte `Origin` - *Anti-SSRF* : validation des URLs d'instances (schĂ©ma http/https, blocage IP privĂ©es et `localhost`), liste blanche des endpoints de l'API PeerTube, cURL sans redirections - *Anti-XSS* : Ă©chappement systĂ©matique des sorties ; validation des entrĂ©es (UUID vidĂ©o, requĂȘte de recherche ≀ 200 car., numĂ©ros de page, ID de catĂ©gorie 1–20) ==== Configuration serveur (Apache) [source,bash] ---- cp conf/.htaccess.sample .htaccess ---- Protections incluses : blocage des fichiers de configuration et `.sample`, des dossiers `/includes/`, `/cache/`, `/docs/`, `/conf/` ; pas de listing de rĂ©pertoires ; fichiers cachĂ©s bloquĂ©s ; HTTPS forcĂ© ; masquage de l'extension `.php` (URLs propres `/video` au lieu de `/video.php`). WARNING: Cette configuration est *essentielle* : sans elle, vos fichiers de configuration sont exposĂ©s aux visiteurs. ==== Configuration serveur (Nginx) [source,bash] ---- # Adaptez les chemins dans conf/nginx.conf.sample puis : sudo cp conf/nginx.conf.sample /etc/nginx/sites-available/annukuteced.buzz sudo ln -s /etc/nginx/sites-available/annukuteced.buzz /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx ---- WARNING: Le bloc `location ~* \.(php|inc|conf|config|local)$ { deny all; }` de l'exemple correspond tel quel Ă  *tous* les fichiers `.php`. Ajustez-le pour ne cibler que les chemins sensibles (par exemple `^/includes/`), sous peine de rendre l'application inaccessible. === đŸ“± Progressive Web App (PWA) ==== FonctionnalitĂ©s - đŸ“Č *Installation native* : bouton « Installer » dans le header Ă  la premiĂšre visite - 🌐 *Mode hors ligne* : cache des pages visitĂ©es et des ressources statiques - 📡 *DĂ©tection de connexion* : indicateur visuel en cas de perte rĂ©seau - 🔄 *Mise Ă  jour* : proposition de rechargement quand une nouvelle version est dĂ©tectĂ©e ==== StratĂ©gies de cache du Service Worker (`sw.js`) [cols="1,2,3",options="header"] |=== | Type de requĂȘte | StratĂ©gie | DĂ©tail | Ressources statiques (`/css/`, `/js/`, `/img/`, CDN cdnjs) | *Cache First* | Mise en cache Ă  l'installation et au premier accĂšs ; repli sur `img/logo.png` si une image Ă©choue | Pages (`/`, `*.php`
) | *Network First* | RĂ©seau d'abord, cache en secours hors ligne | API et AJAX (`/ajax/`, `mastodon-config.php`
) | *Network Only* | Jamais de cache ; rĂ©ponse JSON 503 synthĂ©tique hors ligne |=== TIP: Pour dĂ©ployer une nouvelle version des assets, changez le suffixe de version des noms de cache dans `sw.js` (format date, ex. `08072026-0720`) : les anciens caches sont supprimĂ©s Ă  l'activation. ==== Installation par les visiteurs - 🌐 *Chrome/Edge* : menu → « Installer annukuteced.buzz » - 🍎 *Safari iOS* : Partager → « Ajouter Ă  l'Ă©cran d'accueil » - 🩊 *Firefox Android* : menu → « Installer » [[fr-analytics]] === 📊 Analytics (Plausible) Le site est *prĂ©-configurĂ©* pour https://plausible.io[Plausible Analytics^] (sans cookies, conforme RGPD, donnĂ©es anonymes), mais le script est *dĂ©sactivĂ© par dĂ©faut*. Pour l'activer : . Ouvrez `index.php` et *dĂ©commentez* le snippet Plausible (balise `