"No creas de nosotros cuentos que otros cuenten." Eskorbuto

miércoles, 21 de julio de 2021

SARTEN v0.1, un script para añadir subtitulos (soft, mkv) a un archivo de video

cine cine cine cine, mas cine por favor.

como ultimamente soy de los que prefieren ver las peliseries en VOSE, pues a veces me toca cacharrear con subtitulos, sincronizaciones, matroska por aqui matroska por alla, etc etc.

mkvtoolnix es un programita bastante interesante para crear archivos .mkv, que por si alguien no lo supiera, matroska es algo asi como un archivo contenedor donde podemos meter archivos de video, audio o texto (subtitulos por ejemplo).

mkvtoolnix-gui esta muy bien para subtitular un archivo o dos, pero claro, cuando ya has creado unos cuantos videos con subs, y quieres subtitular una temporada entera... se hace cansino, la cantidad de clics que hay que hacer es considerable. Pues que bien, un candidato perfecto para un cutrescript. :)

#!/bin/bash
# dependencias: python-chardet mkvtoolnix
#
# sarten.sh v0.1, jul-2021, GPL-2.0-or-later, vlan7 <https://www.vlan7.org>
# un script para anyadir subtitulos (soft, mkv) a un archivo de video.
#
################################################################################
#
# a partir de un archivo de video y otro de subtitulos, genera un archivo .vose.mkv
# por ejemplo, "./sarten.sh video.avi sub.srt" generaria el archivo "video.vose.mkv"
#
# si todo va bien, lo ultimo que imprime por la salida estandar seria:
# SUCCESS: video.vose.mkv
#
# el script se apoya en el comando file para intentar detectar la codificacion
# de los subtitulos. Y para el edge-case "unknown-8bit" intenta averiguarlo con
# la utilidad chardetect (debian: python-chardet).
# la codificacion es importante para mostrar bien tildes, enye, ¿, ¡, etc.
# 
# el script se apoya en las utilidades mkvinfo y mkvmerge (debian: mkvtoolnix)
# para generar el archivo whatever.vose.mkv y en este archivo:
# si hay mas subtitulos, los respeta y no borra nada, y
# el subtitulo que pasamos al script:
# -pasa a ser la pista 0 (el resto de pistas se incrementan en 1)
# -se establece el idioma a Spanish
# -se marca como pista por defecto (se mostrara por defecto nuestro subtitulo,
# con preferencia sobre otros, si hubiera).
#
# ejemplo de uso:
#
# $ ./sarten.sh whatever.mkv whatever.srt 
# Video		: whatever.mkv
# Subtitulo	: whatever.srt
# Titulo	: whatever
# Charset	: iso-8859-1
# Dst_file	: whatever.vose.mkv
#
# mkvmerge v52.0.0 ('Secret For The Mad') 64-bit
# 'whatever.srt': Usando el desmultiplexador para el formato 'Subtítulos SRT'.
# 'whatever.mkv': Usando el desmultiplexador para el formato 'Matroska'.
# 'whatever.srt' pista 0: Usando el módulo de salida para el formato 'Subtítulos de texto'.
# 'whatever.mkv' pista 0: Usando el módulo de salida para el formato 'AVC/H.264'.
# 'whatever.mkv' pista 1: Usando el módulo de salida para el formato 'AAC'.
# 'whatever.mkv' pista 2: Usando el módulo de salida para el formato 'Subtítulos de texto'.
# 'whatever.mkv' pista 3: Usando el módulo de salida para el formato 'Subtítulos de texto'.
# El archivo whatever.vose.mkv ha sido abierto para su escritura.
# Progreso: 100%
# Los registros del cue (el índice) están siendo escritos...
# El multiplexado tardó 1 segundo.
#
# SUCCESS: whatever.vose.mkv
# $ 
################################################################################

SELF=$(basename $0)

if [ "$#" -ne 2 ]; then
  echo -e "\nUsage: $SELF [video-file] [subtitle-file]\n"
  exit 1
fi

command -v chardetect >/dev/null 2>&1 || { echo >&2 "I require chardetect but it's not installed. debian: apt-get install python-chardet"; exit 1; }
command -v mkvmerge >/dev/null 2>&1 || { echo >&2 "I require mkvmerge but it's not installed. debian: apt-get install mkvtoolnix"; exit 1; }
command -v mkvinfo >/dev/null 2>&1 || { echo >&2 "I require mkvinfo but it's not installed. debian: apt-get install mkvtoolnix"; exit 1; }

SRC_FILE="$1"
SRT_FILE="$2"
TITLE="$(echo "$1" |sed 's/\.[^\.]*$//')"
DST_FILE="$TITLE.vose.mkv"

CHARSET="$(file -bi "$SRT_FILE" |cut -d= -f2 )"
if [ $CHARSET = unknown-8bit ]; then
  CHARSET=$(chardetect "$SRT_FILE" |grep -Po '(?<=: ).*(?=with)' |tr -d ' ')
fi
if [ ! $CHARSET ]; then
  echo "I couldn't find out the charset. bye"
  exit 1
fi

echo -e "Video\t\t: $SRC_FILE\nSubtitulo\t: $SRT_FILE\nTitulo\t\t: $TITLE\nCharset\t\t: $CHARSET\nDst_file\t: $DST_FILE\n"

## si no quisieramos copiar los subtitulos que pueda haber en $SRC_FILE descomentar...
#mkvinfo "$SRC_FILE" |grep -qi subt
#if [ $? -eq 0 ]
#then   # ya tiene subs
#  mkvmerge -o "$DST_FILE" --title "$TITLE" --default-language spa --default-track 0 --sub-charset 0:"$CHARSET" --language 0:Spa "$SRT_FILE" --no-subtitles "$SRC_FILE"
#else   # no tiene subs
  mkvmerge -o "$DST_FILE" --title "$TITLE" --default-language spa --default-track 0 --sub-charset 0:"$CHARSET" --language 0:Spa "$SRT_FILE" "$SRC_FILE"
#fi
RETVAL=$?
##

if [ $RETVAL -ne 0 ]; then
  echo -e "\nFAILED!"
else
  echo -e "\nSUCCESS: $DST_FILE"
fi

exit $RETVAL
y para series... pues imagina una temporada de 13 capitulos :D tranqui, no tenemos que lanzar el script 13 veces, podriamos pegar en la shell algo como:
mkv=(./*.mkv)
srt=(./*.srt)

for ((i=0;i<=${#mkv[@]};i++)); do   #en bash los arrays empiezan en 0, en zsh en 1. una posible solucion portable bash+zsh es hacer un bucle de n+1 iteraciones y para el elemento vacio del array no hacer nada (en zsh nos saltariamos la primera iteracion, en bash la ultima)
  [ -e "${mkv[i]}" ] || continue	#nullglob
  [ -e "${srt[i]}" ] || continue	#nullglob
  ~/scripts/sarten.sh "${mkv[i]}" "${srt[i]}"
done
que el trabajo rutinario lo haga la maquina y nosotros a otra cosa.

Antes:

Despues:

Feliz programacion.
parasitos

Related Posts by Categories



0 comentarios :

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.