= kaubuntu.re - Hub Multimédia
:toc: left
:toc-title: Sommaire
:toclevels: 3

*Agrégateur des réseaux sociaux du mouvement panafricaniste et indépendantiste réunionnais Ka-Ubuntu.*

== Description

kaubuntu.re centralise en une seule page les contenus publiés par Ka-Ubuntu sur YouTube, Instagram, TikTok et le site WordPress kaubuntu.com. Développée en PHP vanilla, sans framework, la plateforme est conçue pour fonctionner sur un hébergement mutualisé standard (o2Switch) et s'affiche correctement sur tous les appareils.

== Fonctionnalités

- Grille YouTube avec détection automatique des Shorts (3 Shorts portrait + 6 vidéos paysage)
- Compteurs de followers/abonnés en temps réel (YouTube, Instagram, TikTok, articles WordPress), mis en cache 24h
- Profil embed Instagram et TikTok (iframes officiels)
- Grille d'articles WordPress via REST API (kaubuntu.com)
- Mode clair / sombre avec détection de la préférence système
- Scroll animé vers les sections avec highlight d'arrivée
- Bouton retour en haut de page
- Progressive Web App (PWA) : installation native, mode hors ligne, cache Service Worker
- Détection automatique de l'état de connexion
- Annonce du prochain live configurable (multi-fuseaux horaires)
- Système de dons PayPal Me
- Page de compte à rebours / maintenance
- Headers de sécurité (CSP, HSTS, X-Frame-Options…)

== Technologies

- PHP 8.0+ (backend, APIs, cache fichier)
- HTML5 / CSS3 / JavaScript vanilla
- YouTube Data API v3 (optionnel, avec fallback RSS public)
- WordPress REST API
- Font Awesome (icônes)
- Service Worker (PWA)

== Structure du projet

[source]
----
├── css/
│   ├── styles.css              # Styles globaux, thème, composants
│   └── social.css              # Styles spécifiques à l'agrégateur
├── includes/
│   ├── social/
│   │   ├── youtube.php         # YouTube Data API v3 + fallback RSS + détection Shorts
│   │   └── stats.php           # Compteurs followers (YouTube, Instagram, TikTok)
│   ├── wordpress.php           # Intégration WordPress REST API
│   ├── config.php              # Chargement config (default + local)
│   ├── config.default.php      # Valeurs par défaut
│   ├── config.local.php.sample # Modèle de configuration locale
│   ├── security.php            # Headers HTTP et CSP
│   ├── header.php
│   ├── footer.php
│   ├── sidebar.php
│   └── mobile-menu.php
├── js/
│   └── main.js                 # Thème, scroll animé, retour en haut, menu mobile
├── img/
├── conf/
│   ├── .htaccess.sample
│   └── nginx.conf.sample
├── index.php                   # Page principale
├── sw.js                       # Service Worker
├── site.webmanifest.sample
└── README.adoc
----

== Prérequis

- *PHP 8.0+*
- Extensions PHP : `curl`, `json`, `intl`, `mbstring`, `simplexml`
- Serveur web Apache ou Nginx
- HTTPS (requis pour PWA)

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

# Vérifier les extensions
php -m | grep -E 'curl|intl|mbstring|simplexml'
----

== Installation

. Cloner le dépôt
. Copier le fichier de configuration :
+
[source,bash]
----
cp includes/config.local.php.sample includes/config.local.php
----
. Renseigner les variables dans `includes/config.local.php` (voir section Configuration)
. Copier la configuration serveur :
+
[source,bash]
----
cp conf/.htaccess.sample .htaccess
# ou pour Nginx :
sudo cp conf/nginx.conf.sample /etc/nginx/sites-available/kaubuntu.re
----
. Copier les fichiers domaine-spécifiques :
+
[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
----

== Configuration

Le système de configuration est en deux couches :

- `includes/config.default.php` — valeurs par défaut (versionné)
- `includes/config.local.php` — surcharges locales (non versionné, ignoré par Git)

=== Réseaux sociaux

[source,php]
----
define('YOUTUBE_URL',    'https://www.youtube.com/@votre-chaine');
define('YOUTUBE_HANDLE', 'votre-chaine');

define('INSTAGRAM_URL',    'https://www.instagram.com/votre-compte/');
define('INSTAGRAM_HANDLE', 'votre-compte');

define('TIKTOK_URL',    'https://www.tiktok.com/@votre-compte');
define('TIKTOK_HANDLE', 'votre-compte');
----

=== YouTube — Option A : clé API (recommandée)

Permet la détection des Shorts, les compteurs d'abonnés et les meilleurs résultats de recherche.

. Créer un projet sur https://console.cloud.google.com
. Activer *YouTube Data API v3*
. Créer une clé API (*APIs & Services > Credentials*)

[source,php]
----
define('YOUTUBE_API_KEY',        'AIzaSy...');
define('YOUTUBE_CHANNEL_HANDLE', 'votre-chaine');
define('YOUTUBE_CHANNEL_ID',     'UC...');  // optionnel si handle défini
define('YOUTUBE_VIDEOS_COUNT',   9);        // 3 Shorts + 6 vidéos normales
----

NOTE: Le quota gratuit est de 10 000 unités/jour. Chaque chargement non mis en cache coûte ~101 unités (100 pour `search.list` + 1 pour `videos.list`). Avec un cache de 15 minutes, la consommation réelle est très faible.

=== YouTube — Option B : flux RSS public (sans clé API)

Aucune détection des Shorts, ordre chronologique uniquement.

[source,php]
----
define('YOUTUBE_CHANNEL_ID',   'UC...');
define('YOUTUBE_VIDEOS_COUNT', 9);
----

=== WordPress

[source,php]
----
define('WORDPRESS_ENABLED',     true);
define('WORDPRESS_URL',         'https://votre-site.com');
define('WORDPRESS_POSTS_COUNT', 6);
----

=== Contenu embarqué optionnel

Des posts Instagram ou vidéos TikTok spécifiques peuvent remplacer les iframes de profil :

[source,php]
----
define('INSTAGRAM_POST_URLS', [
    'https://www.instagram.com/p/XXX/',
]);

define('TIKTOK_VIDEO_URLS', [
    'https://www.tiktok.com/@compte/video/XXXXX',
]);
----

=== Fuseau horaire

[source,php]
----
define('DEFAULT_TIMEZONE', 'Indian/Reunion');
----

== Annonce du prochain live

Système d'annonce configurable avec calcul automatique multi-fuseaux (Ma'ohi Nui, Martinique/Guadeloupe, Guyane, France, Kanaky).

[source,php]
----
define('NEXT_LIVE_ENABLED',     true);
define('NEXT_LIVE_TITLE',       'Prochain live');
define('NEXT_LIVE_DESCRIPTION', 'Description de l\'événement.');
define('NEXT_LIVE_DATE',        '2025-10-11 10:00:00');
define('NEXT_LIVE_IMAGE',       'uploads/next-live.jpg');
----

Images supportées : portrait 4:5 (1080×1350px), carré 1:1, paysage 16:9.

== Système de dons

[source,php]
----
define('DONATIONS_ENABLED', true);
define('PAYPAL_ME_URL',     'https://www.paypal.com/paypalme/votre-compte');
define('DONATION_AMOUNTS',  [5, 10, 20, 50, 100]);
define('DONATION_CURRENCY', 'EUR');
----

[source,bash]
----
cp dons.sample.php dons.php
----

== Système de compte à rebours

Page de maintenance ou de lancement avec compte à rebours multi-fuseaux.

[source,php]
----
define('COUNTDOWN_ENABLED',     true);
define('COUNTDOWN_TARGET_DATE', '2025-10-11 00:00:00');
----

== Sécurité

=== Apache

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

Le fichier protège les répertoires sensibles (`/includes/`, `/cache/`), bloque l'accès aux `.sample`, `.bak`, `.log`, désactive l'exploration des répertoires.

WARNING: Ne pas déployer sans ce fichier — les fichiers de configuration seraient accessibles publiquement.

=== Nginx

[source,bash]
----
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)

- Installation native (bouton automatique dans le header)
- Mode hors ligne via Service Worker
- Indicateur visuel de perte de connexion

Compatibilité : Chrome/Edge (Android/Desktop), Safari (iOS 11.3+), Firefox Android, Samsung Internet.

[source,bash]
----
cp site.webmanifest.sample site.webmanifest
----

== Déploiement (hébergement mutualisé)

. Vérifier que PHP 8.0+ avec les extensions requises est disponible
. Transférer les fichiers via FTP/SFTP
. Créer `includes/config.local.php` sur le serveur
. Vérifier que le dossier `cache/` est accessible en écriture : `chmod 755 cache/`
. Configurer HTTPS

== Développement

[source,bash]
----
git checkout -b ma-fonctionnalite
# ... modifications ...
git commit -m "feat: description courte"
git push origin ma-fonctionnalite
----

== Licence

Copyright (C) 2025 *ORGANISATION KA INTERNATIONALE* (OKI) & *Ka-Ubuntu*

NOTE: *Ka-Ubuntu* est un parti politique panafricaniste et indépendantiste réunionnais, œuvrant pour la souveraineté numérique et technologique de La Réunion dans une perspective panafricaniste.

=== 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/.

== Contact

mailto:zinfoskaubuntu@gmail.com[zinfoskaubuntu@gmail.com]

---

*Ka-Ubuntu* - _Pour une Réunion libre et souveraine dans l'unité panafricaniste_
