MiniVid : indexage, lecture, tags et favoris pour vos vidéos locales

MiniVid : indexage, lecture, tags et favoris pour vos vidéos locales

Il y a quelque temps on m’a demandé si je connaissais un agrégateur et lecteur de vidéos auto-hébergé. Après avoir parlé des classiques Plex, Emby, Jellyfin, Kodi, j’ai compris que c’était comme prendre un tank pour aller chercher le pain… vu qu’il s’agissait d’avoir une interface de lecture de vidéos X.

Le fait est que je n’ai rien trouvé de probant, simple, assez récent, puis ça m’a saoulé. J’ai donc créé MiniVid, présenté ici et dont le code est publié sur GitHub !

Bien évidemment, ça s’adapte parfaitement à d’autres vidéos comme des clips, documentaires, téléchargements YouTube, Twitch etc.

📂 Navigation par dossiers
Accédez à vos vidéos avec une arborescence claire.

🔖 Tags automatiques extraits des noms de fichiers
Tags globaux par dossier
Tags individuels par fichier
Multi-sélection et recherche par tags
Blacklist configurable pour supprimer les mots inutiles (and, the, source, etc.)

🔍 Recherche avancée
Par nom de fichier
Par tags multiples
Par favoris
Par statut Lue / Non lue

🗂 Filtres et tris personnalisables
Nom
Taille
Date de modification
Statut Lues / Non lues

⭐ Favoris
Marquez vos vidéos d’un clic (★)
Accédez à la vue dédiée « Favoris »

🎥 Lecteur intégré (HTML5 natif)
Supporte mp4, webm et mkv (Chrome/Chromium)
Les fichiers non compatibles avec Firefox (.mkv, .avi, .flv, .m2ts) sont automatiquement basculés en remux/transcodage à la volée avec ffmpeg si activé

🖼️ Miniatures automatiques
Générées avec ffmpeg
Capture par défaut à 5 secondes (pour éviter logos/intro)
Ajustable via variables (MINI_THUMB_OFFSET, MINI_THUMB_MAX)

📱 Interface responsive
Desktop, tablette et mobile

🌙 Mode clair / sombre
Bascule instantanée

🛠️ Page Maintenance
Rescan complet de la bibliothèque
Purge des miniatures
Journal d’événements en direct (logs des actions)

⏱️ Scan automatique
Toutes les heures par défaut
Intervalle configurable via MINI_SCAN_INTERVAL

🔐 Authentification optionnelle
Mode public ou mono-utilisateur avec identifiant/mot de passe

⚙️ Configuration simple
Tout se règle via variables d’environnement dans votre docker-compose.yml

VariableValeur par défautDescription
MEDIA_DIRS(vide)Liste des dossiers vidéos (séparés par `
MEDIA_NAMESDossier 1, Dossier 2…Noms affichés pour chaque dossier (même ordre que MEDIA_DIRS)
MINI_ALLOWED_EXT.mp4,.webm,.mkv,.avi,.flv,.m2tsExtensions autorisées
MINI_BANNED_TAGS(vide)Liste de mots à ignorer lors de la génération de tags (and,the,source,…)
DATA_DIR/dataDossier de stockage interne (état, favoris, prefs)
THUMB_DIR/cache/thumbsDossier cache des miniatures
MINI_USER(vide)Identifiant de connexion (optionnel)
MINI_PASS(vide)Mot de passe de connexion (optionnel)
SECRET_KEY(aléatoire)Clé de session Flask (authentification)
MINI_PLAYBACKdirectMode lecture : direct, auto, remux
MINI_TRANSCODE0Autoriser le transcodage H.264/AAC (1 = oui, 0 = non)
MINI_FIREFOX_MKV_FALLBACK1Force le remux des .mkv dans Firefox
MINI_AUTOSCAN1Activer le rescan automatique (1 = oui)
MINI_SCAN_INTERVAL3600Intervalle entre scans auto (en secondes)
MINI_THUMB_OFFSET5Seconde du screenshot miniature
MINI_THUMB_MAX30Offset max (si vidéo longue)
MINI_FFPROBE_TIMEOUT10Timeout en secondes pour ffprobe/ffmpeg
API_READ_KEY(vide)Clé API (optionnelle) pour accès en lecture seule


Pour l’installation et la configuration, reportez-vous au dépôt GitHub.


Exemple de docker-compose.yml

services:
  minivid:
    build: .
    container_name: minivid
    restart: always
    environment:
      TZ: Europe/Paris
      MEDIA_DIRS: /videos1|/videos2|/videos3|/videos4|/videos5
      MEDIA_NAMES: ruTorrent|MeTube|Docs|Concerts|Tests formats vidéo
      DATA_DIR: /data
      THUMB_DIR: /cache/thumbs
      MINI_ALLOWED_EXT: .mp4,.webm,.mkv,.avi,.flv,.m2ts
      MINI_PLAYBACK	Mode de lecture : auto
      MINI_TRANSCODE: 1
      MINI_FIREFOX_MKV_FALLBACK: 1
      MINI_THUMB_OFFSET: 5
      MINI_THUMB_MAX: 30
      MINI_AUTOSCAN: 1
      # Auth (prises du .env ; si vide => pas d'auth)
      MINI_USER: ${MINI_USER}
      MINI_PASS: ${MINI_PASS}
      SECRET_KEY: 032cb57bd9a0ed97c62a46518aaa3cf2ka9d256da92e17e75e75d282ad5cda87
      # Liste noire tags (les mots de moins de 3 lettres sont automatiquement bannis)
      MINI_BANNED_TAGS:  >
        and,the,source,video,videos,vid,vids,film,movie,part,
        les,une,des,ils,elles,sur,sous,dans,par,pour,sans,avec,chez,
        cet,cette,ces,mon,mes,ton,tes,ses,notre,nos,votre,vos,leur,leurs,
        qui,que,quoi,dont,quand,comme,
        your,they,for,with,without,into,onto,about,this,that,these,those,
        here,there,then,than,are,was,being,been,have,had,just,only,
        over,under,very,more,most,less,were,com,net
    volumes:
      - /mnt/user/rutorrent-direct:/videos1:ro
      - /mnt/user/MeTube:/videos2:ro
      - /mnt/user/TEST/Docs:/videos3:ro
      - /mnt/user/TEST/Concerts:/videos4:ro
      - /mnt/user/TEST/Formats:/videos5:ro
      - /mnt/user/appdata/MiniVid/data:/data
      - /mnt/user/appdata/MiniVid/cache:/cache
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    ports:
      - "8080:8080"

  # Scan toutes les INTERVAL secondes
  minivid-scheduler:
    image: curlimages/curl:8.10.1
    container_name: minivid-scheduler
    depends_on:
      - minivid
    restart: always
    environment:
      APP_URL: ${APP_URL}
      MINI_USER: ${MINI_USER}
      MINI_PASS: ${MINI_PASS}
      INTERVAL: ${INTERVAL}
    command: >
      sh -c '
        set -eu;
        for i in $(seq 1 60); do curl -fsS "$APP_URL/maintenance" >/dev/null 2>&1 && break || sleep 2; done
        while :; do
          if [ -n "$MINI_USER" ] && [ -n "$MINI_PASS" ]; then
            # login (remember=on)
            curl -sS -c /tmp/c.jar -X POST "$APP_URL/login" \
              -d "username=$MINI_USER" -d "password=$MINI_PASS" -d "remember=on" -o /dev/null || true
            if curl -sS -b /tmp/c.jar "$APP_URL/api/maintenance/progress" | grep -qi "\"running\"\\s*:\\s*true"; then
              sleep 120
            else
              curl -m 5 -sS -b /tmp/c.jar -X POST "$APP_URL/api/maintenance/rescan" -o /dev/null || true
            fi
          else
            curl -m 5 -sS -X POST "$APP_URL/api/maintenance/rescan" -o /dev/null || true
          fi
          sleep "$INTERVAL"
        done
      '

Exemple de .env

L’indexation des fichiers se fait à la volée au 1er lancement, plus ou moins rapidement selon la quantité de vidéos et le CPU. Le transcodage sous Firefox/LibreWolf peut faire souffrir le CPU sur une petite machine, je ne l’ai pas optimisé vu qu’il est plus rapide de passer par un autre navigateur.

Aucun appel externe, tout est 100% local. Fonctionne en http://IP:port comme en reverse proxy.

Loading

S’abonner
Notification pour
guest
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires