# TV Signage — Webapp d'affichage vidéo pour TV Android (multi-clients)

Webapp permettant de diffuser en boucle sur une TV Android une sélection de
courtes vidéos (10-15 secondes), gérée depuis une interface d'administration
protégée par mot de passe.

**Depuis cette version, une seule installation (un seul serveur, une seule
base de données) peut héberger plusieurs clients**, chacun avec ses propres
vidéos et son propre compte admin, complètement séparés les uns des autres.
Le player TV de chaque client identifie automatiquement quel contenu
diffuser grâce au sous-domaine utilisé (ex: `client-a.durdu.fr` /
`client-b.durdu.fr` → même code, même base, contenus différents).

Un compte **Admin+** peut en plus naviguer entre tous les clients, créer de
nouveaux clients, gérer les comptes utilisateurs de chacun, et consulter le
**journal de diffusion** (nombre de fois que chaque vidéo est passée, par
jour) — chaque client voit aussi son propre journal depuis son espace.

## Structure du projet

```
tv-signage/
├── config.php              # Config générale (BDD, dossiers, options)
├── setup-admin.php         # Script à usage unique : créer/réinitialiser le compte admin
├── login.php                # Page de connexion admin (logo + slogan)
├── admin.php                 # Interface d'administration
├── logout.php
├── player.php                # Page à afficher sur la TV
├── includes/
│   ├── db.php                 # Connexion PDO/MySQL
│   └── auth.php               # Protection des pages admin
├── api/
│   ├── videos-list.php        # [admin] Liste des vidéos
│   ├── upload.php              # [admin] Upload vidéo + miniature
│   ├── toggle-select.php       # [admin] Cocher/décocher une vidéo
│   ├── reorder.php             # [admin] Réordonner (drag & drop)
│   ├── delete.php               # [admin] Supprimer une vidéo
│   └── playlist.php            # [public] Playlist active pour le player TV
├── assets/
│   ├── css/style.css
│   ├── js/admin.js
│   ├── js/player.js
│   └── img/                    # <-- dépose ton logo ici (logo.png)
├── uploads/
│   ├── videos/                 # Fichiers vidéo uploadés
│   └── thumbnails/              # Miniatures générées automatiquement
└── sql/schema.sql              # Structure de la base de données
```

## Compte Admin+ (toi)

Le compte Admin+ te donne une vue sur tous les clients, sans se connecter
séparément à chacun.

**Créer le tout premier compte Admin+** (une seule fois, à l'installation) :
1. Ouvre `setup-admin.php`, modifie `$username`/`$password`
2. Ouvre `https://tonsite.fr/setup-admin.php` une fois dans le navigateur
3. **Supprime ce fichier du serveur** juste après
4. Connecte-toi sur `login.php` avec ce compte → tu arrives directement sur
   `admin-plus/clients.php`

**Depuis `admin-plus/clients.php`, tu peux :**
- Voir tous les clients (nombre de vidéos, d'utilisateurs)
- **Créer un nouveau client** directement depuis le formulaire en bas de page
  (nom, identifiant, sous-domaine, + son premier compte admin) — plus besoin
  de retoucher `setup-admin.php` pour chaque nouveau client
- Cliquer **"🎬 Vidéos"** pour gérer les vidéos d'un client comme si tu étais
  connecté avec son compte (un bandeau violet le rappelle en haut de la page,
  avec un lien pour revenir à la liste)
- Cliquer **"📊 Journal"** pour voir ses statistiques de diffusion
- Cliquer **"👤 Utilisateurs"** pour créer d'autres comptes admin pour ce
  client (plusieurs employés peuvent avoir chacun leur identifiant),
  réinitialiser un mot de passe, ou supprimer un compte

## Journal de diffusion

Chaque fois qu'une vidéo démarre sur une TV, une ligne est enregistrée
(vidéo, date). La page `journal.php` (accessible depuis le lien "📊 Journal"
dans l'admin) affiche, pour les 60 derniers jours, le nombre de diffusions
par vidéo, regroupé par jour.

- Un client connecté avec son propre compte ne voit que **son** journal
- Le compte Admin+ voit le journal de n'importe quel client via
  `admin-plus/clients.php → 📊 Journal`

## Ajouter un nouveau client

Comme la base de données est partagée, ajouter un nouveau client ne demande
**aucune nouvelle installation** :
1. Chez ton hébergeur (OVH), **crée un nouveau sous-domaine** pour ce client
   (ex: `ecran-nouveau-client.durdu.fr`) et fais-le pointer vers le **même
   dossier** que le site existant (le même code sert tous les clients).
2. Connecte-toi en Admin+ → `admin-plus/clients.php` → remplis le formulaire
   "Ajouter un nouveau client" (nom, identifiant, ce sous-domaine, et le
   premier identifiant/mot de passe admin de ce client)
3. Le client se connecte sur `https://tonsite.fr/login.php` avec son propre
   identifiant et ne voit que ses propres vidéos
4. Sa TV doit démarrer sur **son propre sous-domaine**
   (`https://ecran-nouveau-client.durdu.fr/player.php`)

## Mettre à jour une installation existante

Deux cas possibles selon la version que tu avais déjà en ligne :

**Cas A — tu étais encore sur la toute première version** (une seule
boutique, pas de notion de client) : exécute
`sql/migration-001-original-to-current.sql` dans phpMyAdmin. Modifie d'abord
les 3 lignes en haut du fichier (`@client_name`, `@client_slug`,
`@client_domain`) avec les infos de ton client existant.

Une fois exécutée, la requête finale du script t'affiche le `client_id`
attribué (probablement `1`). **Étape supplémentaire indispensable** : va dans
le gestionnaire de fichiers de ton hébergement et déplace tous les fichiers
qui sont actuellement directement dans `uploads/videos/` vers un nouveau
sous-dossier `uploads/videos/<ce_client_id>/` (et pareil pour
`uploads/thumbnails/` → `uploads/thumbnails/<ce_client_id>/`), car le code
attend désormais un sous-dossier par client.

**Cas B — tu avais déjà la version multi-clients** (sans Admin+ ni journal) :
exécute plutôt `sql/migration-002-adminplus-journal.sql` — pas besoin de
déplacer de fichiers dans ce cas.

Dans les deux cas, termine ensuite par la création de ton compte Admin+ via
`setup-admin.php` (voir plus haut), puis supprime ce fichier du serveur.

## Installation sur hébergement mutualisé (type OVH)

1. **Créer la base de données MySQL** depuis l'espace d'hébergement, puis
   importer `sql/schema.sql` (via phpMyAdmin par exemple).
2. **Renseigner `config.php`** avec les identifiants de connexion à la base
   (host, nom, utilisateur, mot de passe).
3. **Uploader tout le dossier** `tv-signage/` sur le serveur (FTP ou gestionnaire
   de fichiers).
4. Vérifier que les dossiers `uploads/videos/` et `uploads/thumbnails/` sont
   accessibles en écriture par le serveur (permissions 755 ou 775 selon l'hébergeur).
5. **Créer le compte administrateur** : ouvre `setup-admin.php` une fois dans
   ton navigateur (modifie d'abord le mot de passe dans le fichier), puis
   **supprime ce fichier du serveur immédiatement après**.
6. Personnalise l'écran de connexion :
   - dépose ton logo dans `assets/img/logo.png`
   - modifie le texte du slogan directement dans `login.php` (`login-slogan`)
7. Rends-toi sur `https://tonsite.fr/login.php` pour te connecter à l'admin,
   et sur `https://tonsite.fr/player.php` pour voir le rendu de diffusion
   (c'est cette URL qu'il faudra ouvrir sur la TV).

## Utilisation au quotidien

1. Prépare tes vidéos avec Canva et exporte-les (format MP4 conseillé).
2. Connecte-toi sur `/login.php`, puis va dans `/admin.php`.
3. Ajoute chaque vidéo via le bouton d'upload — une miniature est générée
   automatiquement dans le navigateur au moment de l'envoi.
4. Coche les vidéos que tu veux diffuser, et glisse-dépose les cartes pour
   définir l'ordre de passage.
5. La TV se met à jour automatiquement (vérification toutes les 15 secondes,
   réglable dans `config.php` via `PLAYLIST_POLL_INTERVAL_MS`) — pas besoin de
   redémarrer la télé.

## Affichage forcé en portrait

Le player (`player.php`) affiche désormais toujours son contenu en **portrait**,
quelle que soit l'orientation native du boîtier/TV (la plupart des boîtiers
Android TV ne savent pas réellement pivoter leur sortie vidéo — la rotation
logicielle Android est très inégale selon les puces). La solution retenue est
donc une **rotation en CSS**, fiable sur tous les appareils :

1. **Monte physiquement la TV sur le côté** (rotation 90°), comme pour un
   écran de signage vertical classique.
2. La page `player.php` fait pivoter tout son contenu en CSS pour compenser,
   de façon à ce que l'image apparaisse bien droite une fois la TV tournée.
3. **Si l'image apparaît à l'envers ou dans le mauvais sens** une fois montée,
   ouvre `assets/css/style.css` et change simplement :
   ```css
   :root {
       --rotate-deg: 90deg;   /* remplace par -90deg si besoin */
   }
   ```
4. Ne configure pas de rotation dans Fully Kiosk Browser (laisse-le en
   paysage par défaut) — c'est la page elle-même qui gère l'orientation, pour
   que ça fonctionne à l'identique sur n'importe quel boîtier.

## Configuration de la TV Android

La solution la plus simple et fiable est d'utiliser une application de
navigateur "kiosque" plutôt que de développer une application Android sur mesure :

### Option recommandée : Fully Kiosk Browser (gratuit)

1. Sur la TV Android, installe **"Fully Kiosk Browser"** depuis le Play Store
   (ou via un fichier APK si le Play Store n'est pas disponible sur le boîtier).
2. Ouvre l'application, va dans **Réglages → Web Content Settings** et renseigne
   l'URL de démarrage : `https://tonsite.fr/player.php`
3. Dans **Réglages → Motion & Autostart** :
   - active **"Start on Boot"** (démarrage automatique avec la TV)
   - active **"Launch on Boot Delay"** si la TV a besoin de temps pour se
     connecter au Wi-Fi/Ethernet
4. Dans **Réglages → Other Settings**, tu peux activer le mode kiosque complet
   (empêche de quitter l'application, cache la barre de statut, etc.)
5. Redémarre la TV pour vérifier que `player.php` s'ouvre automatiquement en
   plein écran.

### Alternative : navigateur par défaut + lanceur de démarrage

Si tu préfères ne pas installer d'application tierce, certains boîtiers Android
TV permettent de définir une page de démarrage automatique via les paramètres
système ou une application de type "kiosk launcher" (selon le fabricant du
boîtier). Fully Kiosk Browser reste la solution la plus universelle et la
plus simple à mettre en place.

## Sécurité

- Le dossier `includes/` est protégé par `.htaccess` (accès direct interdit).
- Le dossier `uploads/` interdit l'exécution de scripts PHP (protection contre
  l'upload de fichiers malveillants déguisés en vidéos).
- Pense à supprimer `setup-admin.php` du serveur après la création du compte admin.
- La page `player.php` (TV) n'est volontairement pas protégée par mot de passe,
  puisque c'est la télévision elle-même qui l'affiche sans intervention humaine.

## Pistes d'évolution possibles

- Programmer la diffusion de certaines vidéos à des horaires précis
- Ajouter plusieurs écrans/TV avec des playlists différentes
- Statistiques de diffusion (nombre de fois qu'une vidéo est passée)
