Skip to main content

Nettoyer ma bibliothèque des videos corrompues

·396 words·2 mins
Faradj Saadana
Author
Faradj Saadana
J’aime

Intro
#

Dans mon aventure d’éditeur video, j’ai besoin d’un environnement facilitant mon travail. Et pour se faire il me fallait un accès rapide et réactive à ma base de donnée de mes rush. Or, sur mon Nextcloud un bug survient à un moment précis lorsque je parcours mes video. Le chargement de miniatures s’arrete et toute mon instance Nextcloud est inaccessible pendant quelques minutes. Cela survient dès que j’arrive sur des videos importées d’un disque dur mal en point et que certaines d’entre elles sont corrompues. Je décide donc de faire un petit nettoyage pour exclure ou même réparer ces fichiers.

Objectif : Exclure les fichiers corrompu de mon système de fichiers
#

Etape 1 : Détecter les fichiers corrompus
#

Mes video sont classées dans des dossier par appareil et par date, commençons par récupérer le chemin de tous fichier video.

find -name "*.mp4"

L’outil utilisé pour analyser mes fichiers est ffmpeg.

Pour un fichier ​ffmpeg -v error -i <file> -map 0:1\? -xerror -f null - 2>/dev/null

-v error : logs au niveau erreur

-i <file> : fichier à traiter

-map 0:a\? : traite uniquement les flux audio du fichier pour alleger le traitement, ajouter le ? pour ignorer si le fichier ne contient pas de flux audio et, vu que j’utilise zsh, le backslash \ pour interpreter correctement le caractère.

-xerror : S’arrete à la moindre erreur et termine avec un status d’erreur. C’est avec ce exit code que l’on va determiner si le fichier est corrompu ou non.

-f null : pas de formatage

- : pas de fichier de sortie

2>/dev/null : redirige la sortie d’erreur vers null part

Je fous ça dans une boucle shell qui itère sur tous les fichiers mp4 du dossier courant ainsi que les sous dossiers. Avec :

for i in $(find -name "*.mp4")

Et si ffmpeg me done un code d’erreur j’inscrit le nom du fichier video dans un fichier texte error_files.txt ce qui donne :

for i in $(find -name "*.mp4");
do ffmpeg -v error -i "$i" -map 0:a\? -xerror -f null - 2>/dev/null || (echo "$i" >> error_files.txt);
done

Etape 2 : Déplacer les fichiers corrompus
#

Encore avec une boucle shell, je parcours le fichier précédemment construit et déplace chaque video inscrite dans un dossier corrupted_video

for file in $(cat ~/lab/video_check_log/error_files.txt); do sudo mv "$file" corrupted_video; done

Sources
#

https://superuser.com/questions/100288/how-can-i-check-the-integrity-of-a-video-file-avi-mpeg-mp4 https://trac.ffmpeg.org/wiki/Map