Rename subtitles in bash for mplayer — Renommer des sous-titres pour mplayer
With mplayer, if you have a subtitle file matching the name of the movie file you want to play, mplayer automatically loads it, otherwise, you have to use the -sub option.
Problem is loading some files with -sub can be boring (especially if you want to load several files at once). Here is how to rename easily the subtitles to match the name of the movie file.
—
Avec mplayer, si vous avez un fichier de sous-titres qui correspond au nom du fichier de votre film, mplayer le charge automatiquement, sinon, il faut utiliser l’option -sub.
Le problème est que charger des fichiers avec -sub peut être chiant (surtout si on charge plusieurs fichiers d’un coup). Voilà comment renommer facilement les sous-titres pour qu’ils correspondent au nom du fichier du film.
First, let’s suppose we have some movie files with the following pattern:
name_nb-of-the-season_nb-of-the-episode_title-of-episode_some-other-text.avi
$>for i in `seq -f%02g 1 1 20`; do
touch foo_s0xe${i}.title_is_$RANDOM_$RANDOM.avi;
done
$>ls
foo_s0xe01.title_is_30301_28156.avi
foo_s0xe02.title_is_31884_1013.avi
...
foo_s0xe19.title_is_292_19603.avi
foo_s0xe20.title_is_9881_1054.avi
On the other hand, substitles will be more like:
Name_x-season_Episode-Y_other-random-text.en.srt
for i in `seq 1 1 20`; do
touch foo_x-season_Episode-${i}_$RANDOM.en.srt;
done
So we have the files:
$>ls foo_x*
foo_x-season_Episode-10_5878.en.srt
foo_x-season_Episode-11_21771.en.srt
...
foo_x-season_Episode-8_8263.en.srt
foo_x-season_Episode-9_14005.en.srt
To rename the files, we will sort the subtitles files in ascending order and do an mv to the avi file minus .avi plus .srt for each file:
for i in `seq -f%02g 1 1 20`; do
subttle=`ls foo*srt | sort -nk3 -t- |head -n $i | tail -n 1`
ep=`ls foo*avi | sort -nk2 -te |head -n $i | tail -n 1`
echo mv $subttle${ep%%.avi}.srt
done
Use the “echo” to see if you’ll do what you want to do, else just “mv $sstitre ${ep%%.avi}.srt” without the echo.
Result is:
foo_s0xe01.title_is_30301.avi
foo_s0xe01.title_is_30301.srt
foo_s0xe02.title_is_31884.avi
foo_s0xe02.title_is_31884.srt
...
The tricky part is to sort correctly. Here I use “-” (and “e”) as separator field to sort by the 3rd (and 2nd) field, that is, the episode number.
You could also use commands such as
ls -1 foo*|grep -o "[0-9]\+_.*"|sort -n|xargs -I{} ls foo{}
If you know how to do it in a different way, please comment!
You can now play your files in mplayer without worrying about the subtitles: mplayer foo*avi
(Thanks to Totor and Alain.g for the tricky sort)
—
D’abord, supposons que l’on ait des films avec le motif suivant :
nom_num-de-la-saison_num-episode_titre-de-l-episode_autre-texte.avi
$>for i in `seq -f%02g 1 1 20`; do
touch foo_s0xe${i}.title_is_$RANDOM_$RANDOM.avi;
done
$>ls
foo_s0xe01.title_is_30301_28156.avi
foo_s0xe02.title_is_31884_1013.avi
...
foo_s0xe19.title_is_292_19603.avi
foo_s0xe20.title_is_9881_1054.avi
D’un autre côté, on a des sous-titres :
Nom_x-eme-saison_Episode-Y_texte-aleatoire.en.srt
for i in `seq 1 1 20`; do
touch foo_x-season_Episode-${i}_$RANDOM.en.srt;
done
On alors les fichies :
$>ls foo_x*
foo_x-season_Episode-10_5878.en.srt
foo_x-season_Episode-11_21771.en.srt
...
foo_x-season_Episode-8_8263.en.srt
foo_x-season_Episode-9_14005.en.srt
Pour renommer les fichiers, on va trier les sous-titres par ordre croissant et faire un mv vers le fichier avi -avi +srt pour chaque fichier :
for i in `seq -f%02g 1 1 20`; do
sstitre=`ls foo*srt | sort -nk3 -t- |head -n $i | tail -n 1`
ep=`ls foo*avi | sort -nk2 -te |head -n $i | tail -n 1`
echo mv $sstitre ${ep%%.avi}.srt
done
Utilisez le “echo” pour vérifier que ça va faire ce que vous voulez, sinon, juste “mv $sstitre ${ep%%.avi}.srt” sans le echo.
Le resultat :
foo_s0xe01.title_is_30301.avi
foo_s0xe01.title_is_30301.srt
foo_s0xe02.title_is_31884.avi
foo_s0xe02.title_is_31884.srt
...
Le point délicat est de trier correctement. Ici, j’utilise “-” (et “e”) comme séparateur de champ et je trie selon le 3m (2nd) champ, c’est-à-dire, le numéro de l’épisode.
On peut aussi utiliser des commandes comme :
ls -1 foo*|grep -o "[0-9]\+_.*"|sort -n|xargs -I{} ls foo{}
Si vous connaissez une autre façon de faire ça, laissez un commentaire !
On peut maintenant lancer mplayer sans se soucier des sous-titres : mplayer foo*avi
(Merci à Totor et Alain.g pour le sort)

On pourrait également procéder ainsi en bash :
#!/bin/bash exec 3< <(ls foo*avi | sort -nk2 -te) ls foo*srt | sort -nk3 -t- | while read srt do read avi <&3 mv "$srt" "${avi%avi}srt" doneMerci bout ce code.
Pour ceux qui ne connaissent pas exec, je les invite à lire l’abs:
using exec
[...] recorded first by lrizoli on 2009-01-02→ Rename subtitles in bash for mplayer — Renommer des sous-titres… [...]
Recent URLs tagged Trie - Urlrecorder said this on 2009, January 14 - Wednesday at 08:32