diff --git a/src/components/Admin/AdminDashboard.vue b/src/components/Admin/AdminDashboard.vue
index 5130a2c..a309b20 100644
--- a/src/components/Admin/AdminDashboard.vue
+++ b/src/components/Admin/AdminDashboard.vue
@@ -73,6 +73,7 @@ import AdminMetrics from './AdminMetrics.vue';
import AdminMaintenance from './AdminMaintenance.vue';
import AdminPlaylists from './AdminPlaylists.vue';
import AdminConfig from './AdminConfig.vue';
+import AdminMedia from './AdminMedia.vue';
import { ADMIN_NAV_KEY, ADMIN_SECTION_TITLE_ID } from './adminUi';
import './admin.scss';
@@ -95,6 +96,7 @@ const sections = [
{ id: 'servers', group: 'supervision', label: "Serveurs", icon: "fa-solid fa-server", component: AdminServers },
{ id: 'users', group: 'supervision', label: "Comptes", icon: "fa-solid fa-users", component: AdminUsers },
{ id: 'playlists', group: 'supervision', label: "Playlists", icon: "fa-solid fa-list", component: AdminPlaylists },
+ { id: 'media', group: 'supervision', label: "Médias", icon: "fa-solid fa-file-audio", component: AdminMedia },
{ id: 'logs', group: 'system', label: "Logs", icon: "fa-solid fa-scroll", component: AdminLogs },
{ id: 'warp', group: 'system', label: "WARP", icon: "fa-solid fa-cloud", component: AdminWarp },
{ id: 'youtube', group: 'system', label: "YouTube", icon: "fa-brands fa-youtube", component: AdminYoutube },
@@ -145,6 +147,10 @@ const badges = computed(() => {
if (failing) result.youtube = { text: "!", type: 'bad', sr: "la plupart des lectures récentes échouent" };
else if (ytCookies?.present && !ytCookies.valid) result.youtube = { text: "!", type: 'bad', sr: "compte YouTube à reconnecter" };
else if (ytCookies?.valid) result.youtube = { text: "OK", type: 'good', sr: "compte YouTube valide" };
+ // Médias : salon de stockage injoignable ou fichiers supprimés sur Discord
+ const media = adminStore.overview?.media;
+ if (media?.configured && !media.connected) result.media = { text: "KO", type: 'bad', sr: "salon de stockage inaccessible" };
+ else if (media?.missing) result.media = { text: media.missing, type: 'warn', sr: media.missing + " fichier(s) manquant(s) sur Discord" };
if (adminStore.overview?.logs?.interrupted) result.logs = { text: "!", type: 'bad', sr: "journal interrompu" };
const online = adminStore.presence?.counts?.online ?? adminStore.overview?.web?.usersOnline;
if (online) result.users = { text: online, type: 'neutral', sr: online + " en ligne" };
diff --git a/src/components/Admin/AdminMedia.vue b/src/components/Admin/AdminMedia.vue
new file mode 100644
index 0000000..96b8f06
--- /dev/null
+++ b/src/components/Admin/AdminMedia.vue
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+
+ Renseignez le serveur et le salon multimédia (media.guildId / media.channelId) pour permettre l'envoi de fichiers.
+
+
+
+
+
+ Le bot ne voit pas le salon configuré (salon supprimé, bot retiré du serveur ou permissions manquantes).
+ Les envois sont refusés et les liens ne peuvent pas être renouvelés.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ status?.connected ? "En ligne" : "Hors ligne" }}
+
+
+
+
+
+ {{ status?.premiumTier === null || status?.premiumTier === undefined ? "Inconnu" : "Niveau " + status.premiumTier }}
+
+
+ {{ formatBytes(status?.storageLimitBytes) }}MEDIA_UPLOAD_LIMIT_MB
+
+
+
+
+
+
+
+
+
+
+
+
+ Un lien expiré n'empêche pas la lecture : il est renouvelé automatiquement avant chaque lecture et à l'ouverture de « Mes fichiers ».
+ Le renouvellement manuel sert à vérifier qu'un fichier existe encore sur Discord.
+
- {{ statusDetail || "Erreur lors de l'envoi d'un fichier." }}
- {{ statusDetail || 'Un fichier est trop volumineux (300 Mo maximum).' }}
- Seuls les fichiers MP3, WAV et OGG sont acceptés.
+
+ {{ sentCount > 1 ? `${sentCount} fichiers envoyés.` : 'Un fichier envoyé.' }}
+ {{ message }}
+
+ Format non pris en charge : envoyez un fichier audio ({{ FORMATS_LABEL }}).
+ Le stockage des fichiers n'est pas configuré sur ce bot.{{ statusDetail || 'Fichiers envoyés avec succès.' }}
- Ce n'est pas un stockage permanent : les fichiers sont hébergés sur le CDN de Discord et peuvent expirer à tout moment.
+ Les fichiers sont convertis en Opus (le format audio de Discord) puis stockés dans un salon privé du bot. Leurs liens sont renouvelés automatiquement.
@@ -78,7 +81,7 @@
{{ formatSize(value.size) }}
-
Les fichiers sont stockés sur le CDN de Discord et accessibles à quiconque possède le lien. N'envoyez rien de sensible.
+
La conversion prend quelques secondes par fichier. Les fichiers sont accessibles à quiconque possède leur lien : n'envoyez rien de sensible.