📋 Changelog

Historique des mises à jour

Suivez l'évolution de nos plugins et découvrez les dernières améliorations.

← Tous les plugins
🎬

Real Video Listing for Listeo & WooCommerce

Dernière version: v1.0.8
v1.0.8 ✨ Dernière 📅 10 février 2026
[1.0.8] - 2026-02-10 (English)

### 🐛 Critical fix — "My Videos" visibility not respected on Reels, Shortcodes and Profile

#### Reels and Shortcodes pages: missing RVLL videos
- **Problem**: RVLL videos checked in "My Videos" for Shortcodes/Reels were not appearing on the Reels page or shortcodes
- **Cause**: SQL query filtered `WHERE listing_id = 0`, excluding all RVLL videos with `listing_id > 0` in the `wp_rvl_videos` table (the majority of RVLL videos)
- **Fix**: Removed `listing_id = 0` filter in `get_rvl_media()` and `get_shortcode_videos()` — all approved RVLL videos are now retrieved, URL deduplication prevents duplicates
- **Files**: `class-frontend.php` (`get_rvl_media()` RVLL section, `get_shortcode_videos()` section 5c)

#### Profile page: unchecked videos still displayed
- **Problem**: Videos unchecked in "My Videos" (Profile unchecked) were still appearing on the vendor profile page
- **Cause**: Section 1 (listing videos) of `get_vendor_all_media()` added videos without checking the `hidden_from_profile` flag
- **Fix**: Build a `$hidden_profile_urls` index from `rvl_videos` user_meta, check applied to ALL videos including those from listings
- **File**: `class-frontend.php` (`get_vendor_all_media()`)

#### hidden_from_* flags respected everywhere
- **Global fix**: All 3 display methods now systematically check `hidden_from_profile` and `hidden_from_shortcodes` flags:
- `get_vendor_all_media()` — vendor profile: checks `hidden_from_profile` for listing videos, social network AND RVLL
- `get_rvl_media()` — Reels page: checks `hidden_from_shortcodes` for listing videos (via per-author cache), social network AND RVLL
- `get_shortcode_videos()` — shortcodes: checks `hidden_from_shortcodes` for all sections (user_id, all listings, RVLL)
- **Performance**: `$hidden_sc_cache` per user to avoid multiple user_meta reads
v1.0.7 📅 10 février 2026
[1.0.7] - 2026-02-10 (English)

### ✨ "My Videos" Page — Visibility management for profile, reels and shortcodes

#### New vendor page: My Videos
- **Added**: New `[rvl_vendor_videos_page]` page to manage video visibility
- **Dashboard integration**: Page displays inside the Listeo dashboard (dashboard template) with a dedicated menu item
- **Menu**: Added "My Videos" link in the vendor dashboard navigation (after "Video Settings")
- **Features**:
- Display all videos (social networks + RVLL) grouped by platform with tabs
- Profile and Shortcodes/Reels checkboxes — **checked by default** (everything visible by default)
- Unchecking = hide the video from that destination
- Moderation status badge (Approved, Pending, Rejected, Flagged)
- Unapproved videos are greyed out and non-editable
- Individual "Save" button per video
- **No listing management**: Listings have their own dedicated video management page
- **Auto-creation**: Button in admin "Reel Shortcode" tab with automatic dashboard template
- **Files**: `class-frontend.php` (render + AJAX + menu), `class-admin.php` (page creation)

#### Default visibility (opt-out model)
- **Logic**: All approved videos are visible everywhere by default (profile, reels, shortcodes)
- **Flags**: `hidden_from_profile` and `hidden_from_shortcodes` in `rvl_videos` user_meta (absent = visible)
- **New videos**: Automatically visible everywhere upon synchronization
- **Moderation**: Only `approved` videos are displayed publicly (pending/rejected/flagged excluded)
- **NSFW**: Flagged NSFW videos are excluded from public display
- **Files**: `class-frontend.php` (`get_vendor_all_media()`, `get_rvl_media()`, `get_shortcode_videos()`)

#### Listing video page — Badge fix
- **Fix**: "Published" badge (green) shown only if the video is selected AND approved
- **Added**: "Approved" badge (blue) for videos that are approved but not selected for this listing
- **File**: `class-frontend.php` (`render_listing_videos_page()`)

### 🔧 Vendor Settings page improvements

#### Listing pagination (comments and auto-publish)
- **Added**: "Comments & Likes" and "Auto-publish" sections now show 5 listings initially
- **Show more**: "Show more (X remaining)" button loads 10 additional listings per click
- **Search**: Real-time search field to filter listings by name (always displayed)
- **Enable all / Disable all**: Bulk toggle buttons to enable or disable all listings in a section with one click
- **File**: `class-frontend.php` (`render_settings_page()`)

### 🐛 Moderation page fix — Duplicate videos

#### Vendor-centric refactoring
- **Problem**: The moderation page displayed videos in duplicate (once per listing + once from user_meta)
- **Solution**: Complete refactoring of `ajax_get_all_media()` for a vendor-centric approach:
- Single read from `rvl_videos` user_meta per vendor
- Deduplication by `platform_video_id` key
- Added `assigned_listings` field (array of assigned listings) to each video
- Displays "Assigned to X listing(s)" or "Unassigned" instead of a single listing name
- **Propagation**: `ajax_moderate_media()` and `ajax_delete_media()` updated to propagate changes to ALL storage locations (rvl_videos, all _rvl_videos, rvl_profile_videos, RVLL table)
- **File**: `class-admin.php`

#### Advanced moderation filters
- **Added**: "Source" dropdown filter (Listeo / WooCommerce) on the moderation page
- **Added**: "Vendor" dropdown filter listing all vendors with videos (with Listeo/WooCommerce indication)
- **Added**: Backend `vendor_id` filter in `ajax_get_all_media()`
- **File**: `class-admin.php`

#### Moderation statistics fix
- **Problem**: `get_moderation_stats()` counted videos in duplicate (listings + user_meta)
- **Solution**: Single read from user_meta with deduplication
- **File**: `class-admin.php`

### 🧹 Improved orphan video cleanup
- **Improvement**: `ajax_cleanup_broken_videos()` now cleans:
- RVLL videos with missing files in `rvl_videos`, `_rvl_videos`, `rvl_profile_videos` and the RVLL table
- Orphan videos in `_rvl_videos` (listing) whose source no longer exists in `rvl_videos` (user_meta)
- `wp_rvl_videos` table entries with missing local files
- **File**: `class-admin.php`

### ✨ New feature — Auto-publish videos per listing

#### Auto-publish with automatic rotation
- **Added**: New "Auto-publish videos" section in Vendor Settings page (only when Listeo Core is active)
- **How it works**: ON/OFF toggle per listing — when enabled, the latest videos from all social networks are automatically published to the listing at each sync
- **Automatic rotation**: When the per-listing video limit is reached (e.g. 5), the oldest videos are automatically removed and replaced by the newest ones
- Example: limit = 5, listing has 5 YouTube videos → user posts 3 new TikTok videos → listing will have 3 TikTok + 2 YouTube (the 5 most recent), the 3 oldest YouTube videos are removed
- **Immediate execution**: When the vendor enables the toggle, videos are immediately published to the listing (no need to wait for the next cron)
- **Cron integration**: `process_auto_publish_for_user()` is called automatically after each `sync_user_videos()` (hourly, twice daily or daily cron)
- **Strict enforcement** of `rvl_videos_per_listing` limit (0 = no limit, all videos published)
- **Explanatory note** displayed in the vendor interface with a concrete rotation example
- **Files**: `class-frontend.php` (UI + AJAX handler), `class-video-manager.php` (auto-publish logic + cron)

#### Fix for limit = 0 bug in auto_publish_to_listing
- **Problem**: If `rvl_videos_per_listing = 0` (unlimited), `array_slice($videos, 0, 0)` returned an empty array instead of all videos
- **Solution**: Explicit `if ($limit > 0)` check before `array_slice`, otherwise publish all videos
- **File**: `class-video-manager.php`

### 🐛 Broken translations fix (CRITICAL)

#### 12 English translations showing raw PO text
- **Problem**: `fuzzy` entries with merged PO files displayed `#-#-#-#-# real-video-listeo-en_US.po (Real Video Listing for Listeo 1.0.0) #-#-#-#-#` in the interface instead of the English translation
- **Cause**: The `msgcat` tool used to merge PO files inserted `#-#-#-#-#` markers in `msgstr` of conflicting entries, and the `fuzzy` flag prevented their use by WordPress
- **Fixed strings**:
- "Voir mon profil" → "View my profile"
- "Description / Bio" → "Description / Bio"
- "Profil enregistré !" → "Profile saved!"
- "Vidéo Facebook" → "Facebook Video"
- "Vidéo Instagram" → "Instagram Video"
- "Vidéo supprimée." → "Video deleted."
- "URL de l'image de couverture" → "Cover image URL"
- "Erreur lors de la suppression" → "Error deleting"
- "Impossible d'accéder à cette page." → "Unable to access this page."
- "Aucune publication pour le moment" → "No publications yet"
- "Vous ne pouvez sélectionner que %d vidéos maximum." → "You can only select up to %d videos."
- "%d vidéos enregistrées pour votre profil." → "%d videos saved to your profile."
- **4 duplicates** removed ("Voir profil vidéo", "24 heures", "Limite par défaut", "Recherche")
- **File**: `real-video-listeo-en_US.po`

### 🌐 Translations
- **Added**: 10 new strings (auto-publish) in `.pot` and `en_US.po`
- **Recompiled**: `.mo` — en_US: 1884 entries, fr_FR: 939 entries
v1.0.5 📅 09 février 2026
[1.0.5] - 2026-02-09

### 🔧 Facebook API — Mode configurable & mise à jour API v24.0

#### Nouveau paramètre : Mode Facebook (Pages vs Profil personnel)
- **Ajout** : Option `rvl_facebook_mode` dans les paramètres Facebook avec 2 modes :
- **Pages + Profil personnel** (`pages_and_user`, défaut) : Récupère les vidéos des Pages gérées ET les vidéos uploadées sur le profil personnel via `GET /me/videos?type=uploaded`. Scope OAuth : `pages_show_list, pages_read_engagement, user_videos`
- **Pages uniquement** (`pages_only`) : Récupère uniquement les vidéos des Pages gérées via `GET /{page-id}/videos`. Scope OAuth : `pages_show_list, pages_read_engagement`. N'a pas besoin de `user_videos` ni de `pages_read_user_content` (couverte par `pages_read_engagement`)
- **Fichiers** : `class-admin.php`, `class-oauth-handler.php`, `class-facebook-api.php`, `real-video-listing-for-listeo.php`

#### Résolution du problème `user_videos` introuvable
- **Problème** : Les clients ne trouvaient pas la permission `user_videos` dans la section "Manage Pages" du dashboard Meta
- **Cause** : `user_videos` est une permission utilisateur personnel (user-level), pas une permission de type Pages/business. Elle n'apparaît pas dans le cas d'utilisation "Manage Pages"
- **Solution** : Le mode "Pages uniquement" permet de fonctionner sans `user_videos`. La documentation et le guide admin expliquent maintenant clairement la différence et comment ajouter `user_videos` via Facebook Login

#### Amélioration de la synchronisation Facebook
- **Changement** : `get_user_videos()` récupère maintenant les vidéos de TOUTES les Pages gérées par l'utilisateur (pas seulement le profil personnel)
- En mode `pages_and_user` : vidéos personnelles + vidéos de toutes les Pages, triées par date
- En mode `pages_only` : uniquement les vidéos de toutes les Pages gérées
- Les résultats sont fusionnés, triés par date de publication, et limités au nombre configuré
- **Fichier** : `class-facebook-api.php`

#### Mise à jour Facebook Graph API v19.0 → v24.0
- **Changement** : Toutes les URLs API Facebook mises à jour de v19.0 à v24.0 (dernière version stable en février 2026)
- **Fichiers concernés** :
- `class-facebook-api.php` — constante `API_BASE`
- `class-instagram-api.php` — constante `API_BASE`
- `class-oauth-handler.php` — URLs OAuth dialog et Graph API (Facebook + Instagram)

### 📚 Documentation mise à jour

- **Guide admin Facebook** (class-admin.php) : Étape 3 (permissions) et Étape 10 (Graph API Explorer) mis à jour avec les 2 modes et avertissement détaillé sur `user_videos`
- **Page documentation** (documentation-page.php) : Section Facebook mise à jour avec les permissions par mode et note explicative sur `user_videos`
- **Version API** : Mention "Facebook Graph API v18" mise à jour en "v24.0" dans la documentation

### 🌍 Traductions

- **Ajout** : Nouvelles chaînes pour le mode Facebook (admin + documentation) en français et anglais
- **POT** : Template mis à jour avec les nouvelles entrées `msgid`
- **en_US** : Traductions anglaises ajoutées
- **fr_FR** : Chaînes françaises (identiques car langue source) ajoutées
- **Compilation** : Fichiers `.mo` recompilés
v1.0.4 📅 08 février 2026
[1.0.4] - 2026-02-08

### 📚 Guides complets de configuration API dans l'admin

#### Guides de configuration A à Z intégrés dans chaque onglet plateforme
- **Ajout** : Guide complet **YouTube API** (12 étapes) dans l'onglet YouTube des paramètres
- Création projet Google Cloud, activation YouTube Data API v3
- Configuration écran de consentement OAuth (Externe/Interne)
- Mode Test vs Publication (tableau comparatif détaillé)
- Création identifiants OAuth 2.0, récupération Client ID/Secret
- Scope `youtube.readonly` (sensible), vérification Google
- Quotas (10 000 unités/jour, coûts par opération)
- Tokens (Access Token 1h, Refresh Token illimité en prod, 7j en test)
- Contraintes, limitations et liens officiels
- **Ajout** : Guide complet **TikTok API** (13 étapes) dans l'onglet TikTok des paramètres
- Création compte développeur TikTok, configuration organisation
- Création application, ajout produits (Login Kit + TikTok API/Display API)
- Configuration scopes (`user.info.basic`, `video.list`)
- Configuration URL de redirection (HTTPS obligatoire)
- Mode Sandbox (5 sandboxes, 10 utilisateurs test, sans App Review)
- App Review pour production (vidéo démo obligatoire, Sandbox requis pour 1ère soumission)
- Tokens (Access Token 24h, Refresh Token 365 jours)
- Rate Limits (600 requêtes/minute par endpoint)
- Contraintes, limitations et liens officiels
- **Ajout** : Guide complet **Instagram API** (15 étapes) dans l'onglet Instagram des paramètres
- Migration depuis Instagram Basic Display API (obsolète depuis le 4 décembre 2024)
- Prérequis : compte Business/Creator, Page Facebook liée
- Création app Meta, configuration Facebook Login
- Scopes : `pages_show_list`, `instagram_basic`, `instagram_manage_insights`, `pages_read_engagement`
- Mode Développement vs Mode Live, App Review Meta
- Contraintes, limitations et liens officiels
- **Ajout** : Guide complet **Facebook API** (12 étapes) dans l'onglet Facebook des paramètres
- Création app Meta (type Business), configuration Facebook Login
- Cas d'utilisation « Manage everything on your Page »
- Scopes : `pages_show_list`, `pages_read_engagement`, `user_videos`, `public_profile`
- Mode Développement vs Mode Live, Business Verification
- Quotas Graph API, tokens, contraintes et liens officiels
- **Fichier** : `class-admin.php` — remplacement des petites info-boxes par des guides détaillés avec style visuel dédié par plateforme

### 🌍 Traductions

- **Ajout** : Toutes les chaînes des 4 guides en français dans le code PHP (`_e()`)
- **Ajout** : Nouvelles entrées `msgid` (français) dans `real-video-listeo.pot`
- **Ajout** : Traductions anglaises (`msgstr`) correspondantes dans `real-video-listeo-en_US.po`
- **Compilation** : Fichiers `.mo` recompilés — `en_US.mo` passe à 1784 entrées
- **Aucune suppression** : Toutes les traductions existantes préservées, nouvelles chaînes ajoutées en fin de fichier
v1.0.3 📅 05 février 2026
[1.0.3] - 2026-02-05

### ✨ Nouvelle fonctionnalité - Persistance des Thumbnails Réseaux Sociaux

#### Problème des URLs TikTok/Instagram/Facebook qui expirent
- **Problème** : Les URLs de thumbnails TikTok expirent après quelques heures (paramètre `x-expires`), causant des images cassées sur mobile où le cache navigateur n'existe pas
- **Cause** : Les CDN des réseaux sociaux génèrent des URLs temporaires avec signature expirable
- **Diagnostic** : Le proxy serveur retournait HTTP 403 pour les URLs expirées

#### Solution - Stockage Permanent des Thumbnails
- **Nouvelle fonctionnalité** : Téléchargement et stockage permanent des thumbnails lors de la synchronisation
- **Méthode** : `RVL_Video_Recorder::persist_external_thumbnail()` télécharge l'image via cURL et l'uploade vers le stockage configuré
- **Stockages supportés** :
- **Local** : `/wp-content/uploads/rvl-social-thumbs/`
- **AWS S3** : `rvl-social-thumbs/` dans le bucket configuré
- **Wasabi** : `rvl-social-thumbs/` dans le bucket configuré
- **Réutilise la configuration RVLL** : Utilise automatiquement le même provider de stockage que les vidéos RVLL

#### Modifications
- **`class-video-manager.php`** : `sync_user_videos()` appelle maintenant `persist_video_thumbnails()` qui télécharge et stocke les thumbnails pendant le sync
- **`class-video-recorder.php`** : Nouvelles méthodes statiques :
- `persist_external_thumbnail($url, $platform, $video_id, $user_id)` - Point d'entrée principal
- `download_external_image($url)` - Télécharge via cURL avec les bons headers
- `upload_thumbnail_to_local()` - Stockage WordPress local
- `upload_thumbnail_to_aws()` - Upload vers AWS S3 avec signature v4
- `upload_thumbnail_to_wasabi()` - Upload vers Wasabi
- `s3_put_data()` - Upload générique S3/Wasabi depuis données binaires
- **`class-admin.php`** : Nouvelle option "Persistance des thumbnails" dans les paramètres généraux

#### Configuration
- **Option** : `rvl_persist_thumbnails` (activé par défaut)
- **Plateformes concernées** : TikTok, Instagram, Facebook (URLs qui expirent)
- **YouTube exclu** : Les URLs YouTube CDN (`i.ytimg.com`) sont stables et ne nécessitent pas de persistance

#### Avantages
- ✅ Les thumbnails restent visibles même après expiration des URLs originales
- ✅ Fonctionne sur desktop ET mobile
- ✅ Compatible cloud (AWS/Wasabi) ou local
- ✅ L'URL originale est conservée dans `thumbnail_original` pour refresh si nécessaire
- ✅ Logging détaillé pour debug (`[RVL Thumbnail Persist]` et `[RVL Sync]`)

**Note** : Les utilisateurs doivent re-synchroniser leurs vidéos pour bénéficier de la persistance des thumbnails existants.

### 🐛 Corrections Mobile - Menu et Vignettes

#### Menu mobile non réactif sur mobile (WooCommerce)
- **Problème** : Le bouton toggle et la barre mobile du player ne répondaient pas aux clics sur mobile dans les pages WooCommerce
- **Cause** : Le gestionnaire d'événements simplifié ne gérait pas correctement les événements tactiles
- **Solution** : Implémentation de la fonction centralisée `toggleMobileMenu()` avec gestion séparée des événements `click` et `touchend`, `e.preventDefault()` et `e.stopPropagation()` pour éviter les conflits
- **Fichier** : `class-woocommerce.php`

#### Vignettes TikTok/réseaux sociaux non visibles sur mobile
- **Problème** : Les vignettes des vidéos TikTok, YouTube, Instagram et Facebook ne s'affichaient pas sur mobile (fonctionnel sur desktop)
- **Cause** : Politique CORS et referrer des serveurs de réseaux sociaux bloquant les images sur mobile
- **Solution initiale** : Ajout des attributs `referrerpolicy="no-referrer"` et `crossorigin="anonymous"` sur toutes les balises ``
- **Solution robuste (Proxy Server-Side)** : Implémentation d'un proxy AJAX `rvl_proxy_thumbnail` pour contourner les restrictions CORS
- Les URLs de thumbnails TikTok/Instagram/Facebook sont routées via `admin-ajax.php?action=rvl_proxy_thumbnail&url=...`
- Le serveur PHP récupère l'image via cURL avec les bons headers (User-Agent, Referer)
- L'image est mise en cache 24h dans `/wp-content/cache/rvl-thumbnails/`
- Une image placeholder SVG est affichée en cas d'erreur
- **Avantages** : Contourne tous les problèmes CORS/referrer, cache local, fonctionne sur tous les appareils
- **Pages concernées** : Page Reels, profil vendeur (Listeo et WooCommerce), détail listing, shortcodes
- **Fichiers** : `class-frontend.php`, `class-fullscreen-player.php`, `class-woocommerce.php`

#### Helpers ajoutés
- **JavaScript** : `getProxiedThumbnailUrl(url, platform)` - Retourne l'URL proxy pour TikTok/Instagram/Facebook
- **PHP** : `RVL_Frontend::get_proxied_thumbnail_url($url, $platform)` - Pour le rendering côté serveur

**Note** : YouTube (`i.ytimg.com`) n'est pas inclus dans le proxy car Google a de bons headers CORS qui fonctionnent sur mobile.

### 🔧 Corrections supplémentaires - Thumbnails locaux et défilement tactile

#### Utilisation des thumbnails locaux (URLs déjà téléchargées)
- **Problème** : Le proxy était appliqué même aux URLs locales (thumbnails déjà téléchargées sur le serveur)
- **Cause** : La logique de proxy ne vérifiait pas si l'URL était déjà locale
- **Solution** : Ajout de la vérification `$is_local_thumb` dans toutes les fonctions de rendu
- Si l'URL contient `site_url()` ou `/wp-content/uploads/`, elle est utilisée directement sans proxy
- Cela évite des appels AJAX inutiles et améliore les performances
- **Pages corrigées** :
- Page détail listing (`display_listing_videos`)
- Page Reels (shortcode `rvl_reels_page`)
- Profil vendeur (`get_vendor_all_media`)
- Page sélection vidéos listing (`render_listing_videos_page`)
- Section auteur Listeo (`inject_author_page_videos_section`)
- WooCommerce profil utilisateur

#### Défilement tactile carrousel auteur Listeo (mobile)
- **Problème** : Le carrousel vidéos sur la page auteur Listeo ne permettait pas le défilement tactile sur mobile
- **Cause** : L'attribut CSS `overflow: hidden` bloquait le scroll tactile
- **Solution** :
- Media query `@media (max-width: 768px)` avec `overflow-x: auto` et `-webkit-overflow-scrolling: touch`
- `scroll-snap-type: x mandatory` pour un défilement fluide snap-to-item
- Masquage des flèches de navigation sur mobile (inutiles avec le swipe)
- **Fichier** : `class-frontend.php` - section CSS `inject_author_page_videos_section()`

#### Inclusion des vidéos réseaux sociaux dans le profil vendeur
- **Problème** : Le profil vendeur n'affichait que les vidéos des listings, pas les vidéos TikTok/Instagram synchronisées
- **Solution** : Modification de `get_vendor_all_media()` pour inclure les vidéos de `rvl_videos` (user meta) en plus des vidéos des listings
v1.0.2 📅 03 février 2026
[1.0.2] - 2026-02-03

### 🐛 Correction Auto-Suppression RVLL (CRITIQUE)

#### Bug d'auto-suppression laissant des références orphelines
- **Problème** : L'auto-suppression des vidéos RVLL (après 24h par défaut) supprimait les fichiers et les entrées BDD mais laissait les références dans les métadonnées des listings (`_rvl_videos`) et profils utilisateurs (`rvl_profile_videos`)
- **Symptômes** : Vidéos "cassées" sans thumbnail, bouton "X vidéos" affichant "aucune vidéo", player non fonctionnel
- **Solution** : `delete_video()` appelle maintenant `remove_video_from_all_listings()` pour nettoyer TOUTES les références
- **Fichier** : `class-video-recorder.php`

#### Nettoyage des vidéos sélectionnées orphelines
- **Amélioration** : La page "Vidéos du Listing" affiche maintenant les vidéos déjà sélectionnées même si les sources sont vides
- **Bénéfice** : Permet de gérer/désélectionner des vidéos existantes dont les fichiers ont été supprimés
- **Fichier** : `class-frontend.php`

#### Placeholders pour images cassées
- **Ajout** : Handlers `onerror` sur les images de thumbnails pour afficher un placeholder au lieu d'images cassées
- **Appliqué sur** : Page détail listing (carousel), page de sélection des vidéos, profil WooCommerce
- **Fichiers** : `class-frontend.php`, `class-woocommerce.php`

#### Fonction de nettoyage admin
- **Nouveau** : AJAX `rvl_cleanup_broken_videos` pour nettoyer manuellement les références RVLL cassées
- **Fix** : Correction bug utilisant `update_post_meta` au lieu de `update_user_meta` pour les profils WooCommerce
- **Fichier** : `class-admin.php`

### 🐛 Corrections WooCommerce - Profil & Player

#### Synchronisation likes/dislikes WooCommerce ↔ Listeo
- **Problème** : Les boutons like/dislike ne fonctionnaient pas sur la page Reels WooCommerce
- **Solution** : Ajout des hooks `wp_ajax_nopriv_rvl_toggle_like` et `wp_ajax_nopriv_rvl_add_comment`
- **Fichier** : `class-video-comments.php`

#### Migration automatique des colonnes BDD
- **Ajout** : Système de migration automatique au chargement du plugin (pas seulement à l'activation)
- **Colonnes** : `profile_user_id` ajoutée automatiquement aux tables `rvl_video_likes` et `rvl_video_comments`
- **Fichier** : `real-video-listing-for-listeo.php`

#### Photo de profil WooCommerce sur page Reels
- **Problème** : La photo de profil utilisateur ne s'affichait pas sur la page Reels
- **Solution** : Priorisation de `rvl_profile_image` avant `get_avatar_url()`
- **Fichier** : `class-frontend.php`

#### Player TikTok - Vidéos ne jouant pas
- **Problème** : Les vidéos TikTok affichaient "Regarder sur TikTok" au lieu de s'intégrer
- **Solution** : Enrichissement des données avec `embed_url` depuis les sources externes
- **Fichiers** : `class-woocommerce.php`, `class-fullscreen-player.php`, `class-frontend.php`

### 🐛 Corrections WooCommerce - Page Reels

#### Fix JavaScript SyntaxError sur la page Reels WooCommerce
- **Problème** : WordPress convertissait `&&` en `&&` dans le JavaScript inline, causant une `Uncaught SyntaxError: Invalid or unexpected token`
- **Solution** : Extraction des scripts inline vers `wp_footer` avec priorité haute (999) pour éviter le filtrage WordPress
- **Fichiers** : `class-frontend.php`, `class-woocommerce.php`

#### Fix TypeError "Cannot read properties of undefined (reading 'platform')"
- **Problème** : L'index du tableau vidéos pouvait être hors limites dans le player fullscreen
- **Solution** : Ajout de vérifications défensives dans `loadVideo()` et `loadMedia()` pour reset l'index à 0 si hors limites
- **Fichiers** : `class-frontend.php`, `class-woocommerce.php`, `class-fullscreen-player.php`

#### Fix système de likes/dislikes/commentaires WooCommerce
- **Problème** : Les boutons like/dislike ne fonctionnaient pas dans le player WooCommerce
- **Solution** : Ajout complet des gestionnaires d'événements JavaScript pour likes, dislikes, commentaires (ajout, réponse, suppression)
- **Parité** : Fonctionnement identique à l'intégration Listeo
- **Fichier** : `class-woocommerce.php`

#### Fix affichage grille profil WooCommerce
- **Problème** : Le nom d'utilisateur et les icônes (likes, dislikes, commentaires) s'affichaient au milieu et étaient coupés
- **Solution** : Correction des règles CSS conflictuelles sur `.rvl-media-overlay`
- **Fichier** : `class-woocommerce.php`

### ✨ Nouvelles fonctionnalités WooCommerce

#### Bouton "Accueil" dans le menu Reels
- Ajout d'un bouton "Home" (Accueil) dans la sidebar gauche de la page Reels
- Permet de retourner à la page d'accueil du site
- Traductions ajoutées en anglais et français

#### Mode plein écran pour la page Reels WooCommerce
- **Header/Footer cachés** : Le header, footer, menu et titre de page WooCommerce sont automatiquement masqués sur la page Reels
- **CSS critique injecté dans ``** : Via hook `wp_head` priorité 1 pour éviter le flash de contenu
- **Support WordPress FSE** : Compatible avec les thèmes Full Site Editing (blocs Gutenberg)
- **Variables CSS reset** : `--wp--style--root--padding-top`, `--wp--preset--spacing--60` forcés à 0
- **Script JavaScript immédiat** : Suppression des éléments header/footer avant le rendu complet

### 🔧 Améliorations techniques

#### Optimisation du chargement CSS WooCommerce
- CSS critique injecté via `wp_head` avec priorité 1 (très haute)
- Détection automatique de la page Reels via `has_shortcode()`
- Élimination du flash de header/footer au chargement
- Support de l'admin bar WordPress (32px de décalage si connecté)

#### Compatibilité WordPress FSE (Full Site Editing)
- Ciblage des éléments `header.wp-block-template-part` et `footer.wp-block-template-part`
- Suppression des classes `.wp-block-navigation`, `.wp-block-post-title`
- Reset de `.wp-site-blocks` et `.has-global-padding`
- Override des styles inline `margin-top: var(--wp--preset--spacing--60)`

### 🔧 Corrections d'accessibilité

#### Menu "Paramètres Vidéo" toujours visible
- **Problème** : Le menu "Paramètres Vidéo" ne s'affichait pas si aucun réseau social n'était configuré ou si RVLL n'était pas activé
- **Solution** : Suppression de la vérification `is_any_platform_configured()` dans `add_dashboard_menu_js()` et `render_settings_page()`
- **Résultat** : Le menu et la page des paramètres sont maintenant toujours accessibles pour permettre aux utilisateurs de configurer les plateformes
- **Fichier** : `class-frontend.php`

### 🌍 Traductions

- Ajout de la chaîne "Accueil" / "Home" dans les fichiers de langues
- Compilation des fichiers `.mo` mise à jour

### 🔧 API Improvements - Social Platforms

#### TikTok API - Critical Bug Fix
- **Problem**: `fields` parameter was sent in JSON body instead of query string
- **Solution**: Moved `fields` to query string as per TikTok v2 API documentation
- **Added**: Pagination support with `cursor` parameter
- **Added**: `video_description` field
- **Added**: `get_all_user_videos()` method for fetching more than 20 videos
- **Added**: `refresh_videos_data()` method for refreshing expired thumbnail URLs
- **Fixed**: `max_count` limited to 20 (TikTok API maximum)
- **Fixed**: `data-video-id` now populated in embed blockquote
- **File**: `class-tiktok-api.php`

#### YouTube API - Optimization
- **Change**: Switched from `/search` endpoint (100 quota units) to `/playlistItems` (3 quota units) - **97% quota savings**
- **Added**: `get_uploads_playlist_id()` method for efficient video listing
- **Added**: `like_count` and `comment_count` statistics
- **Added**: Timeout (15s) to all API requests
- **Fixed**: `maxResults` limited to 50 (YouTube API maximum)
- **Removed**: Deprecated `showinfo=0` embed parameter (ignored since 2018)
- **File**: `class-youtube-api.php`

#### Facebook API - Reels Support & Stats
- **Fixed**: Removed broken `/me/video_reels` endpoint (not supported for personal accounts)
- **Added**: `get_page_reels()` method for Facebook Pages (where Reels ARE supported)
- **Added**: `get_video_stats()` method for `view_count`, `like_count`, `comment_count`
- **Added**: `get_reel_embed_code()` for vertical format Reels
- **Added**: Timeout (15s) to all API requests
- **Fixed**: Embed parameters - removed undocumented `mute=0`, added `show_captions=false`, `autoplay=false`
- **Updated**: API version to v19.0
- **File**: `class-facebook-api.php`

#### Instagram API - Migration to Graph API (CRITICAL)
- **BREAKING**: Instagram Basic Display API was deprecated on December 4, 2024
- **Migration**: Now uses Facebook Graph API (`graph.facebook.com/v19.0`) instead of deprecated `graph.instagram.com`
- **Requirement**: Only Business/Creator accounts linked to a Facebook Page are now supported
- **Added**: `get_ig_business_user_id()` method to fetch IG User ID from Facebook Pages
- **Added**: `get_video_insights()` for `view_count` via `video_views`/`plays` metrics
- **Added**: `get_reel_embed_code()` for vertical format
- **Added**: `check_connection()` and `get_profile_info()` helper methods
- **Fixed**: `media_product_type === 'REELS'` for proper Reel detection (not `media_type`)
- **Removed**: Invalid `omitscript=true` from embed URLs
- **File**: `class-instagram-api.php`

#### OAuth Handler - Instagram Migration
- **Fixed**: Instagram OAuth now uses Facebook Login (`facebook.com/v19.0/dialog/oauth`)
- **Fixed**: Token exchange uses Facebook Graph API endpoints
- **Updated**: Scopes to `pages_show_list,instagram_basic,instagram_manage_insights,pages_read_engagement`
- **Added**: `get_ig_business_account_id()` method
- **Updated**: All Facebook API URLs to v19.0 for consistency
- **Added**: Timeout (15s) to all OAuth requests
- **File**: `class-oauth-handler.php`

#### WooCommerce - Missing AJAX Handler
- **Fixed**: Added missing `rvl_save_wc_profile_videos` AJAX action registration
- **Problem**: "Saving..." button was stuck with 400 error on WooCommerce My Videos page
- **Solution**: Created `ajax_save_wc_profile_videos()` handler to save selected videos to user profile
- **File**: `class-woocommerce.php`

#### Video Manager - TikTok Compatibility
- **Fixed**: Adapted to new TikTok API return format (`['videos' => ..., 'has_more' => ..., 'cursor' => ...]`)
- **Fixed**: Updated `get_embed_code()` call to pass `video_id` parameter
- **File**: `class-video-manager.php`

---
v1.0.1 📅 26 janvier 2026
[1.0.1] - 2026-01-26

### 🔒 Sécurité & Permissions

#### Restriction des menus "Video Settings" aux vendeurs uniquement
- **Dashboard Listeo** : Le menu "Paramètres Vidéo" n'est plus visible pour les clients (customer), uniquement pour les vendeurs (owner/seller) et administrateurs
- **Page Paramètres Vidéo** : Accès refusé avec message explicite pour les non-vendeurs
v1.0.0 📅 25 janvier 2026
[1.0.0] - 2026-01-22

### Moderation & NSFW Detection (New)
- **Admin Moderation Page**: Complete admin interface for video/photo moderation
- Grid view with thumbnails, status badges, and user info
- Bulk actions: Approve, Reject, Flag, Delete
- Integrated fullscreen player for review
- Comments and likes management per media
- Platform and status filters
- Pagination support
- **NSFW Detection System**:
- Support for Sightengine and ModerateContent APIs
- Configurable detection threshold
- Auto-flagging for detected inappropriate content
- Cron-based automatic scanning with configurable frequency and limit
- NSFW detection on video upload (blocks upload if detected)
- NSFW check on vendor publication (auto-sets to pending if detected)
- **Moderation Statuses**: Approved, Pending, Rejected, NSFW/Flagged
- **Frontend Moderation Display**:
- Visual status badges on vendor video management page
- Non-approved media cannot be selected for publication
- Clear status messages for vendors (pending review, rejected, etc.)
- Public visibility only for approved content
- **Data Consistency**: Moderation status synced across all storage locations (DB table, post meta, user meta)

### WooCommerce Integration Enhancements (New)
- **Reels Page**: Now displays videos/photos from WooCommerce users (not just Listeo listings)
- **Shortcode `[rvl_videos]`**: Now includes WooCommerce user videos when displaying all videos
- **New Shortcode Attribute**: `user_id` to display videos from a specific WooCommerce user
- Example: `[rvl_videos user_id="42"]`
- **Profile Pages**: WooCommerce and Listeo profile pages now have identical features

### License System (New)
- **License Management**: Complete license activation/deactivation system
- Professional license page with status display
- Support for Pro, Lifetime, and Agency plans
- Automatic license verification via Costa Plugin License Server
- Cron-based daily license check
- Security: Product slug verification prevents cross-plugin license usage
- **Upgrade Page**: Beautiful pricing page with all available plans
- **Admin Menu Integration**: License and Upgrade menu items with status indicators

### Plugin Enable/Disable (New)
- Complete frontend deactivation when plugin is disabled in settings
- All shortcodes, menus, AJAX handlers, and integrations respect the global enable/disable toggle
- Listeo dashboard menu hidden when plugin is disabled
- WooCommerce integration fully disabled when plugin is disabled

### Core Features
- **Multi-Platform Integration**: OAuth authentication for YouTube, TikTok, Instagram, and Facebook
- **Automatic Synchronization**: WordPress cron-based video sync with configurable intervals
- **Listeo Integration**: Full integration with Listeo theme and vendor dashboard
- **WooCommerce Integration**: Complete WooCommerce account integration with custom endpoints

### Video Management
- Video selection interface in listing edit form
- Configurable limit of videos per listing (or unlimited)
- Multiple display styles: Circle, Gradient Ring, Rounded, Gradient Square, Square, Portrait
- Two display positions: After Overview or After Gallery
- Video/Photo counter badge on listings
- Fullscreen video player with swipe navigation (TikTok-style)

### RVLL Video Recorder
- Native video/photo recording directly in browser
- Front/back camera support with mirror effect fix
- Video filters (Normal, Warm, Cool, Vintage, B&W, Sepia, High Contrast, Dramatic)
- Emoji and text overlays
- HD quality recording (1080p, 2.5 Mbps)
- Flash control for mobile devices
- Configurable maximum duration (15s to 60s)
- Auto-delete feature with configurable expiration
- RVLL watermark on recorded content
- Photo mode with configurable display duration

### Reels Page (TikTok-style)
- Dedicated Reels page with shortcode `[rvl_reels_page]`
- Platform filter sidebar (All, YouTube, TikTok, Instagram, Facebook, RVLL)
- Pagination system with "Load More" button
- Configurable videos per page (10, 20, 30, 50, 100)
- Fullscreen player integration
- Responsive mobile-optimized design

### Vendor Profile Pages
- **Listeo Vendor Profile**: Public profile page for Listeo vendors
- Custom cover photo upload (simple file upload, no media library access)
- Bio/description field
- Profile photo from Listeo avatar
- Video/photo grid display
- Statistics (videos, photos, listings count)
- "View video profile" link in listing details
- Pretty URLs: `/vendor-profile/username/`

- **WooCommerce Vendor Profile**: Public profile page for WooCommerce users
- Custom profile photo upload
- Custom cover photo upload
- Bio/description field
- Video/photo grid display
- Fullscreen player integration
- Pretty URLs: `/video-profile/username/`

### Comments & Likes System
- Video comments with nested replies
- Like/Dislike functionality
- Per-listing comments toggle (vendors can enable/disable)
- Admin moderation controls
- Real-time AJAX interactions

### Admin Dashboard
- Comprehensive settings panel with multiple tabs
- Platform configuration (API keys, secrets)
- Global enable/disable toggle
- Statistics overview
- Shortcode configuration
- WooCommerce settings
- Reels page auto-creation
- Vendor profile page auto-creation
- Mobile-optimized admin interface

### Shortcodes
- `[rvl_videos]` - Display videos with custom parameters
- Supports: `listing_id`, `listing_ids`, `user_id`, `category`, `platform`, `limit`, `columns`, `template`, `order`
- Now includes WooCommerce user videos when no specific filter is set
- `[rvl_reels_page]` - Full Reels page experience (includes Listeo + WooCommerce media)
- `[rvl_my_videos_page]` - Vendor video settings page
- `[rvl_listing_videos_page]` - Listing video selection
- `[rvl_vendor_profile_page]` - Listeo vendor profile
- `[rvl_woo_profile_page]` - WooCommerce user profile

### Vendor Dashboard Features
- Account connection/disconnection for each platform
- Video synchronization controls
- Display style selection (auto-save)
- Display position selection (auto-save)
- Comments toggle per listing
- RVLL video recorder access
- Profile settings (cover photo, bio)
- Delete uploaded images functionality

### Database Structure
- `wp_rvl_video_comments` - Video comments storage
- `wp_rvl_video_likes` - Likes/dislikes storage
- `wp_rvl_videos` - RVLL recorded videos storage
- Includes `moderation_status`, `nsfw_scanned`, `nsfw_score` columns for moderation
- User meta for tokens, settings, and profile data
- Post meta for listing video associations (with moderation_status support)
- Proper table creation on activation
- Auto-migration for new columns (moderation, NSFW)
- Clean uninstall with data removal option

### Internationalization
- Full translation support
- French (fr_FR) translation included
- English (en_US) translation included
- POT template for custom translations

### Security
- OAuth 2.0 secure authentication flow
- Nonce verification for all AJAX requests
- Capability checks for admin functions
- Secure token storage in user meta with encryption
- Auto token refresh mechanism
- XSS protection on all outputs
- File upload validation (type, size)
- Simple file upload (no WordPress media library exposure to vendors)

### Performance
- Lazy loading for video thumbnails
- Efficient database queries with proper indexing
- Cron-based background synchronization
- Client-side pagination for Reels page
- Optimized asset loading (only on relevant pages)

### Responsive Design
- Mobile-optimized vendor dashboard
- Mobile-optimized admin interface
- Touch-friendly video player
- Responsive Reels page layout
- Adaptive grid layouts

### Developer Features
- Modular class-based architecture
- Hooks and filters for extensibility
- Clean code with PHPDoc comments
- Separate CSS/JS assets
- Debug logging support

📖 Légende des changements

✨ Nouvelles fonctionnalités 🐛 Corrections de bugs 🚀 Améliorations 🔐 Sécurité 🗑️ Suppressions