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)

~ by loquehumaine on 2008, December 16 - Tuesday.

4 Responses to “Rename subtitles in bash for mplayer — Renommer des sous-titres pour mplayer”

  1. 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"
    done
    
  2. Merci bout ce code.
    Pour ceux qui ne connaissent pas exec, je les invite à lire l’abs:
    using exec

  3. […] recorded first by lrizoli on 2009-01-02→ Rename subtitles in bash for mplayer — Renommer des sous-titres… […]

  4. I had list of avi files, named lke this:
    SerieThatAndTat.S01E01.avi

    And subtitles like this:
    SerieThatAndThat – 1×01 – The Name Of The Episode.srt

    Here is the script that does renaming:

    #!/bin/bash

    ls *.avi | while read f
    do
    EPNR=`echo $f | cut -d’.’ -f2 | sed ‘s/ //g’ | sed ‘s/E/x/g’ | sed ‘s/S0//g’`
    SUBFILE=`ls *${EPNR}*.srt | head -1`
    NEWNAME=`basename “$f” .avi`.srt
    lv “$SUBFILE” “$NEWNAME”
    done

    The idea is to list all the avi files in a directory. Then create compatibile match with the season/episode numbering (S01E01 -> 1×01). Then ls for that match (i used ‘head -1’ because for some files I had several subtitles), and out of the avi filename create subtitle filename (using basename).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: