Je ne sais pas si ce genre de scripts a déjà été fourni.
Mais voici ma version qui fonctionne quelle que soit la forme du décalage puisque j'utilise une équation affine type y = a x + B
Attention, les paramètres doivent être modifiés à chaque fois au début du script puisqu'ils sont inscrits
en dur.
pour les deux lignes ancien_titre et nouveau_titre, je pense que c'est clair en soi.
Pour first_line, new_first, last_line et new_last quelques explications:
On recopie dans first_line n'importe quelle ligne de timing piochée au début du film.
Dans new_first, on met le nouveau timing souhaité (seulement la première partie de la ligne)
On renouvelle l'opération sur last_line et new_last pour n'importe quel sous-titre pioché en fin de film.
On lance le script (ne pas oublier le chmod +x) et normalement c'est magique mais assez lent (bicoz bourré de grep et de sed).
Je ne dis pas que c'est super bien écrit (un peu à la va-comme-j'te-pousse) mais normalement c'est efficace ! 🙂
NB: On peut voir le nouveau fichier se former fur et à mesure dans une autre console en faisant un simple tail - f
Ici: tail - f './Anges Et Démons (2009).srt'
#!/bin/bash
ancien_titre='./Anges Et Démons (2009).fr.srt'
nouveau_titre='./Anges Et Démons (2009).srt'
first_line='00:02:13,710 --> 00:02:18,589'
new_first='00:02:08,500'
last_line='02:15:51,240 --> 02:15:54,529'
new_last='02:10:16,600'
# N1 = A1 * X + ERREUR
# N2 = A2 * X + ERREUR
mille1=$(echo $first_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde1=$(echo $first_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute1=$(echo $first_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure1=$(echo $first_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^\([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
A1=`expr $heure1 \* 3600000 + $minute1 \* 60000 + $seconde1 \* 1000 + $mille1`
mille1=$(echo $last_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde1=$(echo $last_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute1=$(echo $last_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure1=$(echo $last_line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^\([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
A2=`expr $heure1 \* 3600000 + $minute1 \* 60000 + $seconde1 \* 1000 + $mille1`
mille1=$(echo $new_first | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde1=$(echo $new_first | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute1=$(echo $new_first | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure1=$(echo $new_first | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^\([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
N1=`expr $heure1 \* 3600000 + $minute1 \* 60000 + $seconde1 \* 1000 + $mille1`
mille1=$(echo $new_last | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde1=$(echo $new_last | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute1=$(echo $new_last | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure1=$(echo $new_last | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^\([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
N2=`expr $heure1 \* 3600000 + $minute1 \* 60000 + $seconde1 \* 1000 + $mille1`
# N2 - N1
# X = -------
# A2 - A1
NUMERATEUR=`expr $N2 - $N1`
NUMERATEUR=`expr $NUMERATEUR \* 1000000000000`
DENOMINATEUR=`expr $A2 - $A1`
X=`expr $NUMERATEUR / $DENOMINATEUR`
# ERREUR = N2 - A2 * X
ERREUR=`expr $N2 \* 1000000000000 - $A2 \* $X`
X=`expr $X / 1000`
ERREUR=`expr $ERREUR / 1000`
echo $X
echo $ERREUR
while read line
do
mille1=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde1=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute1=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^[0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure1=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/^\([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
mille2=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9] | sed 's/.*\ [0-9][0-9]:[0-9][0-9]:[0-9][0-9],\([0-9][0-9][0-9]\).*/\1/')
seconde2=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/.*\ [0-9][0-9]:[0-9][0-9]:\([0-9][0-9]\).*/\1/')
minute2=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/.*\ [0-9][0-9]:\([0-9][0-9]\):[0-9][0-9].*/\1/')
heure2=$(echo $line | grep ^[0-9][0-9]:[0-9][0-9]:[0-9][0-9] | sed 's/.*\ \([0-9][0-9]\):[0-9][0-9]:[0-9][0-9].*/\1/')
if [ "$seconde1" != '' ]
then
temps1=`expr $heure1 \* 3600000 + $minute1 \* 60000 + $seconde1 \* 1000 + $mille1`
temps2=`expr $heure2 \* 3600000 + $minute2 \* 60000 + $seconde2 \* 1000 + $mille2`
temps1=`expr $temps1 \* $X + $ERREUR`
temps1=`expr $temps1 / 1000000000`
temps2=`expr $temps2 \* $X + $ERREUR`
temps2=`expr $temps2 / 1000000000`
heure1=`expr $temps1 / 3600000`
minute1=`expr $temps1 % 3600000 / 60000`
seconde1=`expr $temps1 % 3600000 % 60000 / 1000`
mille1=`expr $temps1 % 3600000 % 60000 % 1000`
heure2=`expr $temps2 / 3600000`
minute2=`expr $temps2 % 3600000 / 60000`
seconde2=`expr $temps2 % 3600000 % 60000 / 1000`
mille2=`expr $temps2 % 3600000 % 60000 % 1000`
if [ $heure1 -lt 10 ]
then
heure1="0$heure1"
fi
if [ $minute1 -lt 10 ]
then
minute1="0$minute1"
fi
if [ $seconde1 -lt 10 ]
then
seconde1="0$seconde1"
fi
if [ $mille1 -lt 100 ]
then
if [ $mille1 -lt 10 ]
then
mille1="0$mille1"
fi
mille1="0$mille1"
fi
if [ $heure2 -lt 10 ]
then
heure2="0$heure2"
fi
if [ $minute2 -lt 10 ]
then
minute2="0$minute2"
fi
if [ $seconde2 -lt 10 ]
then
seconde2="0$seconde2"
fi
if [ $mille2 -lt 100 ]
then
if [ $mille2 -lt 10 ]
then
mille2="0$mille2"
fi
mille2="0$mille2"
fi
line=$(echo "$line" | sed "s/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]\(.*\)[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9][0-9][0-9]\(.*\)/$heure1:$minute1:$seconde1,$mille1\1$heure2:$minute2:$seconde2,$mille2\2/")
fi
echo $line >> "$nouveau_titre"
done < "$ancien_titre"
exit