v1.0.0

Montez votre médiathèque
comme un vrai disque

Jellyfin, Emby et Plex accessibles depuis Windows Explorer ou votre gestionnaire de fichiers Linux — sans synchronisation, sans copie locale.

Issues ouvertes
Dernière mise à jour
Go
Langage
MIT
Licence

Pourquoi ce projet ?

Le problème de fond — et la réponse apportée.

Le problème

  • Vos films et séries sont sur Jellyfin, Emby ou Plex — mais vos outils (VLC, mpv, éditeurs de sous-titres, scripts…) ne parlent pas HTTP.
  • Les clients officiels imposent leur lecteur intégré. Impossible d'ouvrir un fichier dans l'application de votre choix.
  • Les alternatives FUSE existantes (plex-fuse…) sont Linux uniquement, peu maintenues, et ne supportent qu'un seul serveur à la fois.
  • La demande communautaire pour un « Jellyfin drive » est documentée depuis 2020 — sans solution stable.

La solution

Media_FS expose vos bibliothèques multimédias comme un système de fichiers natif : une lettre de lecteur sous Windows (WinFSP), un point de montage sous Linux (FUSE).

  • Ouvrez n'importe quel fichier avec l'outil de votre choix.
  • Plusieurs serveurs simultanément, chacun dans son propre sous-répertoire.
  • HTTP Range + téléchargement parallèle multi-chunk : seek instantané, lecture fluide.
  • Lecture seule stricte — aucune écriture vers les serveurs distants.

Fonctionnalités

Ce que Media_FS apporte dès la v1.0.

🪟

VFS Windows (WinFSP)

Montage en lettre de lecteur (ex : Z:\) via le driver WinFSP. Visible dans Windows Explorer, accessible depuis n'importe quelle application Win32.

🐧

VFS Linux (FUSE)

Point de montage FUSE (ex : /mnt/mediafs). Compatible avec tous les gestionnaires de fichiers et outils en ligne de commande.

📡

Multi-serveurs Jellyfin / Emby / Plex

Connectez plusieurs instances simultanément. Chaque serveur apparaît dans son propre sous-répertoire. Authentification par API key ou identifiants.

Streaming direct HTTP Range

Les lectures déclenchent des requêtes HTTP Range vers le serveur. Seek instantané. Compatible VLC, mpv, Windows Media Player, et tout lecteur acceptant des fichiers locaux.

Téléchargement parallèle multi-chunk

Pré-chargement en plusieurs chunks parallèles avec fenêtre de read-ahead configurable. Cache LRU en mémoire pour les chunks récents.

🖥

Tray + interface de configuration

Icône dans la barre système (Windows) avec indicateur d'état. Interface web locale pour gérer les serveurs, surveiller les téléchargements actifs et vider le cache.

Installation

Choisissez votre méthode.

Prérequis : WinFSP ≥ 1.x — driver de système de fichiers en mode utilisateur pour Windows
1
Installer WinFSP

winfsp.dev/rel/ — téléchargez et lancez l'installateur.

3
Lancer l'exécutable

Une icône apparaît dans la barre système. Clic droit → Configuration pour ajouter vos serveurs.

Prérequis : fuse3 (installé automatiquement comme dépendance)
1
Installer le package
wget https://github.com/CCoupel/Media_FS/releases/latest/download/mediafs_X.Y.Z_linux_amd64.deb
sudo dpkg -i mediafs_X.Y.Z_linux_amd64.deb
2
Créer le point de montage
sudo mkdir -p /mnt/mediafs
3
Configurer

Créez le fichier de configuration :

mkdir -p ~/.config/Media_FS
cat > ~/.config/Media_FS/config.yaml << 'EOF'
mount:
  mount_point: "/mnt/mediafs"

servers:
  - alias: Jellyfin-Home
    type: jellyfin
    url: http://192.168.1.10:8096
    username: cyril
    api_key: "votre_api_key"
    enabled: true

download:
  parallel_chunks: 4
  chunk_size_mb: 16
  read_ahead_window_mb: 64
  read_ahead_windows: 2
  max_cache_mb: 1024
  cache_ttl_min: 60
EOF

L'API key se trouve dans le tableau de bord Jellyfin/Emby : Administration → Clés API.

4
Monter
mediafs mount

Ctrl+C pour démonter. Ajoutez à ~/.bashrc ou un service systemd pour un démarrage automatique.

Le binaire est installé dans /usr/bin/mediafs. La dépendance fuse3 est déclarée dans le package.

Prérequis : fuse3 (installé automatiquement comme dépendance)
1
Installer le package
wget https://github.com/CCoupel/Media_FS/releases/latest/download/mediafs-X.Y.Z-1.x86_64.rpm
sudo dnf install ./mediafs-X.Y.Z-1.x86_64.rpm   # Fedora / RHEL / Rocky
2
Créer le point de montage
sudo mkdir -p /mnt/mediafs
3
Configurer

Créez le fichier de configuration :

mkdir -p ~/.config/Media_FS
cat > ~/.config/Media_FS/config.yaml << 'EOF'
mount:
  mount_point: "/mnt/mediafs"

servers:
  - alias: Jellyfin-Home
    type: jellyfin
    url: http://192.168.1.10:8096
    username: cyril
    api_key: "votre_api_key"
    enabled: true

download:
  parallel_chunks: 4
  chunk_size_mb: 16
  read_ahead_window_mb: 64
  read_ahead_windows: 2
  max_cache_mb: 1024
  cache_ttl_min: 60
EOF

L'API key se trouve dans le tableau de bord Jellyfin/Emby : Administration → Clés API.

4
Monter
mediafs mount

Ctrl+C pour démonter. Ajoutez à ~/.bashrc ou un service systemd pour un démarrage automatique.

Build depuis les sources

CGO est obligatoire — cgofuse lie contre WinFSP ou libfuse.

Windows
Prérequis :
  • WinFSP installé dans C:\Program Files (x86)\WinFsp\
  • MinGW-w64 avec gcc dans C:\mingw64\bin\
# Staging des headers WinFSP (chemin sans espaces requis pour ld)
New-Item -ItemType Directory -Force C:\winfsp\inc\fuse, C:\winfsp\lib
Copy-Item "C:\Program Files (x86)\WinFsp\inc\fuse\*" C:\winfsp\inc\fuse\
Copy-Item "C:\Program Files (x86)\WinFsp\lib\winfsp-x64.lib" C:\winfsp\lib\libwinfsp.a

# Build (Git Bash ou WSL)
export PATH="/c/mingw64/bin:$PATH"
CGO_ENABLED=1 \
  CGO_CFLAGS="-IC:/winfsp/inc/fuse" \
  CGO_LDFLAGS="-LC:/winfsp/lib -lwinfsp" \
  go build -o dist/mediafs.exe ./cmd/mediafs
Linux (Debian/Ubuntu)
sudo apt-get install -y libfuse-dev gcc
CGO_ENABLED=1 go build -o dist/mediafs ./cmd/mediafs

Architecture

Vue d'ensemble des packages et du flux de données.

┌─────────────────────────────────────────────────────────────────┐
│                         cmd/mediafs                             │
│  main.go  ·  CLI subcommands  ·  system tray bootstrap          │
└───────────┬────────────────────────┬────────────────────────┘
            │                        │
   ┌────────▼────────┐     ┌─────────▼─────────┐
   │   internal/vfs  │     │  internal/webui     │
   │  cgofuse host   │     │  HTTP config UI     │
   │  Readdir/Read   │     │  /api/servers        │
   │  openFiles map  │     │  /api/monitor        │
   └────────┬────────┘     └────────────────────┘
            │
   ┌────────▼────────────────────────────────────┐
   │           internal/connector                │
   │  Registry pattern — New(type) → Connector   │
   │  ┌─────────────┐   ┌───────────────────┐    │
   │  │  jellyfin/  │   │      emby/        │    │
   │  │ Connect()   │   │   Connect()       │    │
   │  │ GetLibraries│   │   GetLibraries()  │    │
   │  │ GetItems()  │   │   GetItems()      │    │
   │  └─────────────┘   └───────────────────┘    │
   └────────┬────────────────────────────────────┘
            │
   ┌────────▼────────┐     ┌────────────────────┐
   │internal/downloader    │  internal/cache     │
   │ HTTP Range chunks │    │  SQLite (modernc)   │
   │ parallel fetch   │    │  items / metadata   │
   │ WindowCache LRU  │    │  artwork blobs      │
   └──────────────────┘    └────────────────────┘

Roadmap

5 épiques, du MVP au futur.

Épique Statut Contenu
P0 — Core VFS✅ Livré
WinFSP, FUSE, Jellyfin, Emby, streaming HTTP Range, download parallèle, tray+UI, multi-serveurs
P1.1 — Métadonnées📋 Planifié
Attributs étendus, fichiers NFO, artwork, cache SQLite
P1.2 — Shell Properties📋 Planifié
IPropertyStore Windows (durée, résolution, codec dans l'explorateur)
P3 — Plex📋 Planifié
Connecteur Plex (API propriétaire)
Infrastructure🔄 En cours
CLI, icônes, CI/CD, packaging DEB/RPM

Issues ouvertes

Chargées en direct depuis GitHub.

Chargement…