Tout est dans le titre, je ne savais pas ou placer ce post, si un administrateur pense souhaitable de le déplacer....
J'étais un peu trop optimiste et je me suis cassé les dents, mais j'ai appris pas mal de choses, si cela peut profiter à de nouveaux utilisateurs qui découvrent les NAS Synology sous DSM 7.3....:
DSM 7.3 — Miniatures vidéo, scripts et limites de File Station
Retour d’expérience d’un débutant confronté à un blocage DSM.
Aux experts: merci de corriger si j’écrit des co…bêtises, et si j’enfonce des portes ouvertes.
Ce tutoriel ne propose pas de méthode permettant de remplacer le carré bleu affiché par File Station pour les vidéos sous DSM 7.3.
Il s’agit d’un retour d’expérience documenté, visant à expliquer :
comment DSM gère réellement les miniatures vidéo,
Contexte
Nouveau possesseur d’un NAS Synology sous DSM 7.3, j’ai souhaité stocker des vidéos personnelles (.mp4, .mkv, etc.) et obtenir des miniatures visibles dans File Station.
Résultat immédiat : aucune miniature, uniquement un carré bleu.
Pensant à un problème de format ou d’indexation, j’ai exploré successivement :
Ce tutoriel est la synthèse de ce cheminement.
1 — Les deux systèmes multimédia sous DSM 7.3
1.1 Synology Photos
Synology Photos :
Il est adapté pour :
Il n’est pas conçu pour gérer une médiathèque vidéo de type “films”.
Les miniatures générées par Synology Photos ne sont pas réutilisables par d’autres composants de DSM.
1.2 Indexation multimédia DSM (classique)
Ce système repose sur :
C’est historiquement ce mécanisme qui permettait d’influencer l’affichage des miniatures vidéo dans File Station (DSM 6.x).
2 — Mise en place technique (résumé)
Les étapes mises en œuvre :
Deux scripts créés :
Ces scripts :
3 — Résultat technique obtenu
D’un point de vue strictement technique, tout fonctionne :
Les scripts ne sont pas défectueux.
4 — Le point de blocage sous DSM 7.3
Malgré cela :
Conclusion personnelle :
Sous DSM 7.3, File Station n’utilise plus de manière fiable les miniatures externes présentes dans @eaDir pour l’aperçu des vidéos.
Ce comportement :
Il n’existe apparement aucune méthode officielle pour forcer File Station à remplacer le carré bleu.
5 — Pourquoi présenter encore ces scripts ?
Même si File Station n’exploite plus ces miniatures, les scripts restent utiles pour :
Ils constituent une fondation technique, mais ne doivent pas être présentés comme une solution File Station.
6 — Pour conclure
Sous DSM 7.3, File Station n’est plus l’outil adapté pour gérer une médiathèque vidéo avec miniatures personnalisées visibles.
Pour ce type d’usage, un serveur multimédia dédié (Jellyfin, Plex, etc.) est aujourd’hui plus pertinent.
Corriger moi si vous pensez qu'il est possible de créer ces vignettes/mignatures pour affichage sous DSM File Station ?
Les deux scripts qui n'aboutissent pas malheureusement:
miniature_one.sh
---------------------------------------------------------
----------------------------------------------------
miniature_all.sh
-----------------------------------------------------
-------------------------------------------------------
J'étais un peu trop optimiste et je me suis cassé les dents, mais j'ai appris pas mal de choses, si cela peut profiter à de nouveaux utilisateurs qui découvrent les NAS Synology sous DSM 7.3....:
DSM 7.3 — Miniatures vidéo, scripts et limites de File Station
Retour d’expérience d’un débutant confronté à un blocage DSM.
Aux experts: merci de corriger si j’écrit des co…bêtises, et si j’enfonce des portes ouvertes.
Ce tutoriel ne propose pas de méthode permettant de remplacer le carré bleu affiché par File Station pour les vidéos sous DSM 7.3.
Il s’agit d’un retour d’expérience documenté, visant à expliquer :
comment DSM gère réellement les miniatures vidéo,
- ce qui est techniquement possible,
- ce qui ne l’est plus,
- et pourquoi.
Contexte
Nouveau possesseur d’un NAS Synology sous DSM 7.3, j’ai souhaité stocker des vidéos personnelles (.mp4, .mkv, etc.) et obtenir des miniatures visibles dans File Station.
Résultat immédiat : aucune miniature, uniquement un carré bleu.
Pensant à un problème de format ou d’indexation, j’ai exploré successivement :
- Synology Photos,
- l’indexation multimédia DSM,
- la structure @eaDir,
- l’utilisation de ffmpeg,
- et les commandes synoindex.
1 — Les deux systèmes multimédia sous DSM 7.3
1.1 Synology Photos
Synology Photos :
- utilise sa propre base de données,
- génère ses propres miniatures,
- ignore totalement @eaDir et SYNOVIDEO_VIDEO_SCREENSHOT.jpg.
- les photos,
- les vidéos courtes (smartphones, appareils photo).
Les miniatures générées par Synology Photos ne sont pas réutilisables par d’autres composants de DSM.
1.2 Indexation multimédia DSM (classique)
Ce système repose sur :
- des dossiers indexés (ex. /volume1/Media/Videos),
- le dossier technique @eaDir,
- les commandes synoindex.
2 — Mise en place technique (résumé)
Les étapes mises en œuvre :
- activation du service SSH (sans Telnet),
- installation de ffmpeg et ffprobe via SynoCommunity, (ffprobe absent sous DSM 7.3 chez moi)
- création de l’arborescence :
- /volume1/scripts (scripts techniques),
- /volume1/Media/Videos (dossier indexé DSM).
- miniature_one.sh pour le traitement d’un fichier unique (tests, dépannage),
- miniature_all.sh pour un traitement global et récursif.
- créent correctement des miniatures JPEG,
- respectent l’architecture DSM (@eaDir),
- gèrent aussi des miniatures personnalisées via un dossier miniatures_perso.
3 — Résultat technique obtenu
D’un point de vue strictement technique, tout fonctionne :
- les fichiers
@eaDir/<video>.mp4/SYNOVIDEO_VIDEO_SCREENSHOT.jpg
sont bien créés, - les permissions sont correctes,
- les commandes synoindex -a et synoindex -R video s’exécutent sans erreur.
4 — Le point de blocage sous DSM 7.3
Malgré cela :
- File Station continue d’afficher un carré bleu,
- même après :
- réindexation,
- renommage du fichier,
- traitement global,
- fermeture et réouverture de File Station.
Sous DSM 7.3, File Station n’utilise plus de manière fiable les miniatures externes présentes dans @eaDir pour l’aperçu des vidéos.
Ce comportement :
- n’est pas un bug,
- n’est pas lié aux scripts,
- n’est pas contournable par commande ou script,
- correspond à une décision interne de DSM.
5 — Pourquoi présenter encore ces scripts ?
Même si File Station n’exploite plus ces miniatures, les scripts restent utiles pour :
- comprendre l’architecture multimédia de DSM,
- automatiser la génération de miniatures vidéo, (inutiles à l’instant t)
- préparer une médiathèque propre et cohérente,
- servir de base pour des solutions tierces,
- éviter des tests inutiles basés sur des comportements obsolètes.
6 — Pour conclure
Sous DSM 7.3, File Station n’est plus l’outil adapté pour gérer une médiathèque vidéo avec miniatures personnalisées visibles.
Pour ce type d’usage, un serveur multimédia dédié (Jellyfin, Plex, etc.) est aujourd’hui plus pertinent.
Corriger moi si vous pensez qu'il est possible de créer ces vignettes/mignatures pour affichage sous DSM File Station ?
Les deux scripts qui n'aboutissent pas malheureusement:
miniature_one.sh
---------------------------------------------------------
Bash:
#!/bin/bash
# miniature_one.sh — DSM 7.3
#
# Gère :
# - miniature personnalisée si présente
# - sinon extraction depuis la vidéo
#
# Dossier utilisateur :
# miniatures_perso/<NomVideo>.jpg
#
# ===============================
# CONFIGURATION
# ===============================
FFMPEG="/volume1/@appstore/ffmpeg7/bin/ffmpeg"
FFPROBE="/volume1/@appstore/ffmpeg7/bin/ffprobe"
MAX_WIDTH=1280
# ===============================
# ARGUMENT
# ===============================
VIDEO="$1"
if [[ -z "$VIDEO" || ! -f "$VIDEO" ]]; then
echo "Usage : $0 /chemin/vers/video.mp4"
exit 1
fi
# ===============================
# CHEMINS
# ===============================
DIR="$(dirname "$VIDEO")"
NAME="$(basename "$VIDEO")"
BASENAME="${NAME%.*}"
USER_DIR="$DIR/miniatures_perso"
USER_IMG="$USER_DIR/$BASENAME.jpg"
TARGET="$DIR/@eaDir/$NAME/SYNOVIDEO_VIDEO_SCREENSHOT.jpg"
# ===============================
# PRÉPARATION DOSSIERS
# ===============================
mkdir -p "$USER_DIR"
mkdir -p "$(dirname "$TARGET")"
# Le script crée automatiquement le dossier miniatures_perso si celui-ci n’existe pas,
# afin de garantir un fonctionnement autonome même lors d’une utilisation directe.
USER_DIR="$DIR/miniatures_perso"
mkdir -p "$USER_DIR"
# ===============================
# CAS 1 — MINIATURE UTILISATEUR
# ===============================
# La taille de l’image personnalisée est vérifiée uniquement au moment de sa copie
# vers le cache DSM, afin d’éviter tout redimensionnement inutile.
if [[ -f "$USER_IMG" ]]; then
echo "Miniature personnalisée détectée"
# Récupérer la largeur de l’image utilisateur
IMG_WIDTH=$("$FFPROBE" -v error -select_streams v:0 \
-show_entries stream=width \
-of csv=p=0 "$USER_IMG")
# Créer le dossier cible DSM si nécessaire
mkdir -p "$(dirname "$TARGET")"
# Si l’image est déjà à une taille compatible → copie directe
if [[ "$IMG_WIDTH" -le "$MAX_WIDTH" ]]; then
cp "$USER_IMG" "$TARGET"
else
# Sinon, redimensionnement UNIQUEMENT pour la copie DSM
"$FFMPEG" -y -i "$USER_IMG" \
-vf "scale=$MAX_WIDTH:-2" \
"$TARGET"
fi
chown root:root "$TARGET"
chmod 644 "$TARGET"
echo "Miniature personnalisée appliquée : $NAME"
exit 0
fi
# ===============================
# CAS 2 — MINIATURE AUTO
# ===============================
echo "Miniature générée depuis la vidéo"
DURATION=$("$FFPROBE" -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 "$VIDEO")
TS=$(awk -v d="$DURATION" 'BEGIN { printf "%.0f", d*0.23 + 7 }')
"$FFMPEG" -y -ss "$TS" -i "$VIDEO" -vframes 1 \
-vf "scale=$MAX_WIDTH:-2" \
"$TARGET"
chown root:root "$TARGET"
chmod 644 "$TARGET"
echo "Miniature générée : $NAME"
miniature_all.sh
-----------------------------------------------------
Bash:
#!/bin/bash
# miniature_all.sh — RELEASE FINALE — DSM 7.3
# Gestion globale des miniatures vidéo (auto + personnalisées)
# ==================================================
# CONFIGURATION GÉNÉRALE
# ==================================================
FOLDER="/volume1/Media/Videos"
VIDEO_EXTENSIONS="mp4 mkv avi mov"
FFMPEG="/volume1/@appstore/ffmpeg7/bin/ffmpeg"
FFPROBE="/volume1/@appstore/ffmpeg7/bin/ffprobe"
MAX_WIDTH=1280
LOGDIR="/volume1/Media/logs"
LOGFILE="$LOGDIR/miniatures.log"
# ==================================================
# MODE
# ==================================================
MODE="${1:-creation}" # audit | creation | reset | sync
if [[ ! "$MODE" =~ ^(audit|creation|reset|sync)$ ]]; then
echo "Usage : $0 [audit|creation|reset|sync]"
exit 1
fi
mkdir -p "$LOGDIR"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOGFILE"
}
echo "" >> "$LOGFILE"
log "=============================="
log "DÉMARRAGE — Mode : $MODE"
log "Racine : $FOLDER"
export IFS=$'\n'
# ==================================================
# MODE RESET — suppression miniatures AUTO uniquement
# ==================================================
if [[ "$MODE" == "reset" ]]; then
log "RESET : suppression des miniatures automatiques uniquement"
find "$FOLDER" -type f \( \
$(printf -- '-iname "*.%s" -o ' $VIDEO_EXTENSIONS | sed 's/ -o $//') \
\) | while read -r VIDEO; do
DIR="$(dirname "$VIDEO")"
NAME="$(basename "$VIDEO")"
BASENAME="${NAME%.*}"
USER_IMG="$DIR/miniatures_perso/$BASENAME.jpg"
THUMB="$DIR/@eaDir/$NAME/SYNOVIDEO_VIDEO_SCREENSHOT.jpg"
[[ -f "$USER_IMG" ]] && continue
if [[ -f "$THUMB" ]]; then
rm -f "$THUMB"
log "Supprimée (auto) : $NAME"
fi
done
log "RESET terminé"
exit 0
fi
# ==================================================
# MODE SYNC — miniatures personnalisées uniquement
# ==================================================
if [[ "$MODE" == "sync" ]]; then
log "SYNC : mise à jour des miniatures personnalisées"
find "$FOLDER" -type f \( \
$(printf -- '-iname "*.%s" -o ' $VIDEO_EXTENSIONS | sed 's/ -o $//') \
\) | while read -r VIDEO; do
DIR="$(dirname "$VIDEO")"
NAME="$(basename "$VIDEO")"
BASENAME="${NAME%.*}"
USER_DIR="$DIR/miniatures_perso"
USER_IMG="$USER_DIR/$BASENAME.jpg"
TARGET="$DIR/@eaDir/$NAME/SYNOVIDEO_VIDEO_SCREENSHOT.jpg"
[[ ! -f "$USER_IMG" ]] && continue
mkdir -p "$USER_DIR"
mkdir -p "$(dirname "$TARGET")"
IMG_WIDTH=$("$FFPROBE" -v error -select_streams v:0 \
-show_entries stream=width -of csv=p=0 "$USER_IMG")
if [[ "$IMG_WIDTH" -le "$MAX_WIDTH" ]]; then
cp "$USER_IMG" "$TARGET"
log "Sync perso (copie) : $NAME"
else
"$FFMPEG" -y -i "$USER_IMG" -vf "scale=$MAX_WIDTH:-2" "$TARGET"
log "Sync perso (redimension) : $NAME"
fi
chown root:root "$TARGET"
chmod 644 "$TARGET"
done
synoindex -R video
log "SYNC terminé"
exit 0
fi
# ==================================================
# MODE AUDIT / CREATION
# ==================================================
[[ "$MODE" == "audit" ]] && log "MODE AUDIT" || log "MODE CREATION"
find "$FOLDER" -type f \( \
$(printf -- '-iname "*.%s" -o ' $VIDEO_EXTENSIONS | sed 's/ -o $//') \
\) | while read -r VIDEO; do
DIR="$(dirname "$VIDEO")"
NAME="$(basename "$VIDEO")"
BASENAME="${NAME%.*}"
USER_DIR="$DIR/miniatures_perso"
USER_IMG="$USER_DIR/$BASENAME.jpg"
TARGET="$DIR/@eaDir/$NAME/SYNOVIDEO_VIDEO_SCREENSHOT.jpg"
mkdir -p "$USER_DIR"
if [[ "$MODE" == "audit" ]]; then
if [[ -f "$USER_IMG" ]]; then
log "PERSO : $NAME"
elif [[ -f "$TARGET" ]]; then
log "AUTO : $NAME"
else
log "AUCUNE : $NAME"
fi
continue
fi
# MODE CREATION
if [[ -f "$USER_IMG" ]]; then
IMG_WIDTH=$("$FFPROBE" -v error -select_streams v:0 \
-show_entries stream=width -of csv=p=0 "$USER_IMG")
mkdir -p "$(dirname "$TARGET")"
if [[ "$IMG_WIDTH" -le "$MAX_WIDTH" ]]; then
cp "$USER_IMG" "$TARGET"
else
"$FFMPEG" -y -i "$USER_IMG" -vf "scale=$MAX_WIDTH:-2" "$TARGET"
fi
chown root:root "$TARGET"
chmod 644 "$TARGET"
log "Création perso : $NAME"
continue
fi
[[ -f "$TARGET" ]] && continue
DURATION=$("$FFPROBE" -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 "$VIDEO")
TS_RAW=$(awk -v d="$DURATION" 'BEGIN { printf "%.0f", d*0.23 + 7 }')
TS_MAX=$(awk -v d="$DURATION" 'BEGIN { printf "%.0f", d-1 }')
if [[ "$TS_RAW" -gt "$TS_MAX" ]]; then
TS="$TS_MAX"
else
TS="$TS_RAW"
fi
mkdir -p "$(dirname "$TARGET")"
"$FFMPEG" -y -ss "$TS" -i "$VIDEO" -vframes 1 \
-vf "scale=$MAX_WIDTH:-2" "$TARGET"
chown root:root "$TARGET"
chmod 644 "$TARGET"
log "Création auto : $NAME"
done
synoindex -R video
log "TRAITEMENT TERMINÉ"
log "=============================="