1. Synthèse exécutive
Xcloud est une plateforme de diffusion et de partage de contenus multimédias, livrée comme une application PHP autonome, sans base de données relationnelle. L’ensemble du dossier projet pèse environ 1,3 Mo dans la version analysée : le cœur de l’interface est concentré dans index.php, tandis que la logique serveur JSON (Studio Electric) réside dans server.php.
Le premier lancement impose le choix d’une langue d’interface via setup.php. Un compte admin par défaut est créé automatiquement si aucun fichier utilisateurs n’existe (mot de passe initial documenté dans config.php). L’éditeur côté client repose massivement sur le glisser-déposer, la grille de médias (« cartes »), des pages web légères de type « portail » (XWEB), un module blog, des bannières, des métadonnées audio, des vignettes intelligentes et des options SEO / PWA / monétisation (Stripe).
2. Analyse technique du produit
2.1 Frontière applicative
Les pages PHP suivantes structurent les rôles :
| Fichier | Rôle |
|---|---|
config.php | Session sécurisée, chemins uploads/, data/, première création des dossiers et de users.json. Gère aussi un fallback du répertoire de sessions (cPanel) et la page de maintenance globale. |
setup.php | Premier lancement : sélection parmi 12 langues (clé écrite dans data/config.json). |
login.php | Authentification, traductions depuis data/lang/*.json, verrouillage après échecs, récupération de mot de passe par e-mail si configuré. |
index.php | Interface principale SPA-like : grille, navigation arborescente, SEO par page ou fichier, prévisualisation média, URLs partageables (path, file). |
server.php | API HTTP application/json (nombreuses actions : fichier, dossier, XWEB, blog, commentaires, utilisateurs, SEO, licences, traductions, etc.). Certaines réservées au rôle admin. |
sitemap.php | Sitemap XML dynamique (racine + dossiers publics dans uploads/), respectant la profondeur et la politique d’accessibilité. |
manifest.php + service-worker.js | PWA lorsque activée dans la configuration. |
checkout.php, stripe_webhook.php, subscribe.php | Flux de paiement Stripe, webhook de validation, affichage de la clé de licence associée au session_id. |
2.2 Modèle de données (fichiers, pas SQL)
La persistance repose principalement sur le répertoire data/ :
config.json: paramètres du site (Open Day, téléchargements invité/membre, PWA, clés Stripe, langue du site…).users.json: utilisateurs avec hachages de mot de passe et métadonnées.seo.json,thumbs.json,banner_links.json, licences, méta pistes (track_meta.json), commentaires, etc.- Atomicité :
safeWriteJsondansserver.phpécrit d’abord un fichier temporaire puis renomme, limitant les corruptions en cas de concurrence ou de sauvegarde.
2.3 Typologie des contenus (côté arbre fichiers)
La fonction récursive de scan classe chaque fichier (images, vidéo, audio, PDF, ZIP, fichiers Adobe, GLB…) et attribue des types spéciaux aux fiches blog (*.blog) et aux portails XWEB (*.html avec préfixe xweb_). Les fichiers correspondant aux motifs YouTube, Vimeo ou embed personnalisé sont reconnus et enrichis métadonnées (identifiant, titre affiché).
2.4 Sécurité (aperçu)
- Cookie de session
HttpOnly,SameSite=Strict, régénération d’identifiant de session. - Les chemins utilisateur peuvent passer par les paramètres
pathoufile, avec neutralisation «..». - Un visiteur ne peut pas garder une session admin sans nom d’utilisateur valide : contrôle renforcé dans
index.php. - L’accès aux JSON sensibles est prévu être bloqué par
htaccess.txt(à renommer en.htaccesssous Apache).
3. Pourquoi Xcloud est unique, autonome et performant
Unicité
- Zero-database comme modèle : tout est versionnable, copiable, répliqué par simple sauvegarde de fichiers — ce qui est rare pour un outil aussi riche fonctionnellement (blog, monétisation, commentaires).
- XWEB unifié : les liens externes, intégrations vidéo et pages HTML légères cohabitent dans la même grille que les fichiers binaires, avec partage SEO cohérent.
- Studio Electric dans
server.php: une grande surface d’API unifiée plutôt qu’une myriade de micro-scripts.
Autonomie
- Installation sur un mutualisé avec PHP ; pas de schéma à migrer ni d’installation « moteur tiers » obligatoire.
- Création auto des dossiers et du premier utilisateur administrateur ; premier lancement guidé (
setup.php). - Stripe est optionnel — le produit fonctionne même sans paiement ou sans webhook externe fonctionnel tant que ces modules ne sont pas activés dans le flux métier.
Performant (au sens projet)
- Empreinte disque très faible (~1,3 Mo projet) avant médias utilisateurs : léger pour déployer, dupliquer, sauvegarder.
- Pas de couche ORM : lecture/écriture JSON directe pour la configuration et les méta — latence prévisible sur des sites à trafic modéré.
- Vignettes : pipeline GD / Imagick avec options de qualité et mode « none » pour limiter la dégradation des couleurs lorsque Imagick est disponible.
- Cache HTTP suggéré pour images et assets dans
htaccess.txt.
4. Glossaire des termes et mécaniques
| Terme | Signification dans Xcloud |
|---|---|
| Open Day | Mode où le site est consultable sans connexion (config open_day). Les droits invité (téléchargement, commentaires) restent paramétrables. |
| Invités (Open Day) | Visiteurs non connectés lorsque l’Open Day est actif. |
| XWEB | Fichier HTML ou point d’entrée « portail » nommé avec le préfixe xweb_, affiché comme une carte dédiée dans la grille. Peut pointer vers une URL externe (contenu du fichier analysé côté serveur pour la vignette). |
| xweb_yt_… / xweb_vm_… / xweb_embed_… | Conventions de nommage pour intégrations YouTube, Vimeo ou embed personnalisé (titre affiché nettoyé des préfixes techniques). |
| Carte / card | Représentation visuelle d’un fichier ou dossier dans la grille principale (aperçu, actions, type de média). |
| Types de cartes | Option de configuration pour masquer ou afficher certaines familles de cartes dans l’UI (hide_card_types). |
| Bannière (sub-banner) | Zone promotionnelle / visuelle en tête, images ou vidéos dans data/banner/, liens associés dans banner_links.json. |
| Blog (.blog) | Fichier JSON-like de contenu éditorial géré par l’API blog (liste, sauvegarde, image de couverture, vignette carrée générée). |
| Commentaires | Module avec modération, paramètres (invités autorisés ou non), édition et approbation rapide côté admin. |
| SEO par page | seo.json mappe des clés de chemin (accueil, dossier, fichier) vers titre, description, mots-clés et indexation. |
| Open Graph (OG) | Méta partage réseaux : image intelligente (vignette locale, image directe, miniature YouTube maxres…), type video.other pour certaines vidéos. |
| PWA | Application web installable via manifest dynamique et service worker si pwa_enabled. |
| Licence / mode payant | Stripe crée des sessions de paiement ; le webhook alimente licenses.json avec date d’expiration selon le plan (hebdo, mensuel, annuel, à vie). |
| DV / positions | Dans l’interface, réglages de positionnement de certains widgets (documentés dans l’UI comme position du widget XWEB dans le menu contextuel). |
| Xmodules / layer order | Personnalisation avancée de modules et ordre des couches d’affichage (actions API dédiées). |
| Navigation personnalisée | Items de barre latérale réordonnables (poignées de drag), zone de dépôt racine. |
| Star rating | Vote par étoiles activable sur certains contenus (toggle + API de vote et agrégation). |
| Maintenance | Drapeau global : page 503 pour les non-admins. |
| Session timeout | Durée configurable (de 1 minute à jamais) mappée en secondes dans config.php. |
5. Manuel utilisateur
5.1 Première installation (hébergeur)
- Déposer les fichiers PHP à la racine (ou sous-dossier) d’un hébergement PHP avec extensions habituelles (GD recommandé, Imagick optionnel pour la fidélité couleur / PDF).
- Renommer
htaccess.txten.htaccesssi vous utilisez Apache, pour protégerdata/*.jsonet les sessions. - Accéder au site : redirection vers
setup.phpsi aucune langue n’est enregistrée. - Choisir la langue, puis se connecter via
login.phpavec le compte admin par défaut (voirconfig.php— mot de passe initial documenté dans le code source : xcloud à la première création). Changez ce mot de passe immédiatement.
5.2 Parcours administrateur
- Organisation : créer des dossiers, glisser-déposer fichiers ou éléments de navigation ; utiliser les actions sur les cartes (prévisualisation, édition XWEB, SEO…).
- XWEB : bouton dédié pour créer un portail ; variantes zip exportables ; gestion embed / YouTube / Vimeo suivant assistant.
- Blog : rédiger des articles avec image ; vignette blog générée automatiquement (carré 500).
- Bandeaux : téléverser visuels ou vidéo courte, associer éventuellement des liens de clic.
- Utilisateurs : créer des membres, rôle admin ou utilisateur suivant votre politique interne.
- Réglages globaux : Open Day, téléchargements, maintenance, langue du site, PWA, intégrations, SEO global (no-index), Stripe.
5.3 Parcours visiteur / membre
- Si Open Day désactivé et connexion requise : redirection vers la page de login.
- Navigation par dossiers : URLs partageables avec
?path=…et fichier focal avec?file=…. - Téléchargement selon réglages
download_guest/download_user. - Lecture média dans l’interface (audio / vidéo / PDF selon capacités navigateur).
- Commentaires et notes si activés.
5.4 Monétisation (optionnel)
Un administrateur renseigne les clés Stripe. L’utilisateur passe par checkout.php. Après paiement, Stripe notifie stripe_webhook.php qui dépose une licence dans licenses.json. La page subscribe.php affiche la clé une fois la session retrouvée.
6. Manuel technique
6.1 Points d’extension serveur (server.php)
L’argument GET action=... dispatche plusieurs familles :
- Fichiers & arborescence :
scan_all,list,upload,create_folder,delete,move,rename,download_zip, vignettes :save_thumb, etc. - XWEB :
create_xweb,update_xweb,get_xweb_content, variantes YouTube / Vimeo / embed,download_webzip. - Blog & commentaires :
save_blog,list_blogs,get_blog,post_comment, modération. - Config & SEO :
save_config,load_seo,save_seo, légal pied de page, liens header, favicon/icon. - Traductions :
load_translation,save_translation,create_translation,extract_strings. - Licences & Stripe :
save_stripe_keys, création checkout côté API, activation / vérification de licence. - YouTube Analytics (selon réglages) : actions de type
get_yt_views, souscripteurs, debug.
Les mutations sensibles vérifient $_SESSION['role'] === 'admin' dans les branches correspondantes.
6.2 Répertoires importants
uploads/: contenus publics de la grille (et sous-dossiers techniques comme vignettes blog).data/: configuration et bases JSON opérationnelles.data/vignettes/: miniatures calculées ; mentionné comme HTTP-accessible hors règle de blocage JSON.data/sessions/: stockage sessions local si nécessaire (à bloquer depuis le web).
6.3 Compatibilité et limites inhérentes au modèle
- Concurrence forte sur un même fichier JSON : plusieurs écritures simultanées peuvent théoriquement faire perdre une mise à jour (écran admin unique ou file d’opérations côté client limite le risque).
- Montée en charge : l’arborescence entière peut devenir coûteuse sans cache serveur ; à surveiller sur catalogues géants.
- Extensions PHP : GD minimum pour beaucoup d’effets vignette ; Imagick élargit la qualité (PDF, préservation couleur).
7. Pistes d’évolution spectaculaires
7.1 Niveau de traduction et cohérence linguistique
- Unifier terminologie (XWEB, Open Day) dans les 12 fichiers JSON sous
data/lang/avec un glossaire officiel pilote IA + revue humaine. - Compléter
extract_stringspar un rapport de chaînes orphelines et par des tests snapshot de captures d’interface par langue. - RTL : élargir la liste RTL au-delà de ar/he/ur si vous ajoutez d’autres langues complexes.
7.2 Version « plus simple » (mode Lite)
- Un mode guidé au premier login masquant panneaux avancés (Xmodules, layer order, analytics YouTube…) jusqu’à passage explicite en « Expert ».
- Assistant « publier une vidéo en 30 secondes » (YouTube → XWEB + miniature auto + SEO).
7.3 Référencement (SEO technique)
- Génération automatique du bloc Structured Data (Article, VideoObject, MusicRecording selon type de carte).
- URL propres : mapper
rewritede/dossier/sous/versindex.php(en conservant canonique). - Pré-remplissage OG depuis tags ID3 ou métadonnées vidéo.
- Interne lien : sugger automatiquement contenus connexes depuis le même dossier ou tags futurs.
7.4 Intelligence artificielle (exceptionnelle mais utile)
- Génération / réécriture de descriptions SEO et d’extrait pour chaque carte à partir du nom fichier + contexte dossier.
- Modération assistée des commentaires (spam, toxicité) avant file d’approbation.
- Alt text automatique pour images sans accessibilité.
- Chat d’aide contextuel entraîné sur ce manuel + les messages d’erreur du code — toujours avec garde-fous pour ne pas exposer de chemins sensibles.
7.5 Qualité produit transverses
- Séparer progressivement
index.phpen modules buildables (Vite / esbuild) pour faciliter tests et cache navigateur. - Suite de tests API (PHPUnit ou Pest) sur
server.phppour actions critiques (auth, upload, rename). - Journalisation structurée des erreurs PHP vers
data/logs/(hors web).
8. Étape suivante : stabilité et bugs
JM, pour la phase « couverts tous les bugs », la méthode proposée est :
- Établir une matrice environnements (Apache + nginx, PHP 8.1→8.3, présence/absence Imagick).
- Parcourir chaque famille d’action
server.phpavec scénarios négatifs (fichiers manquants, permissions, quotas disque). - Tester Stripe en mode sandbox + webhook rejoué (idempotence des licences).
- Valider CSP / en-têtes si vous durcissez la sécurité au-delà du .htaccess.