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 
# 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 la lengua a Spanish
# -se marca como pista por defecto (se mostrara por defecto nuestro subtitulo,
# con preferencia sobre otros, si hubiera).
#
################################################################################
# TODO! que se le pueda pasar un .txt con un monton de archivos de video y subs,
# y subtitule de una tacada una temporada entera de una serie, por ejemplo.
################################################################################
#
# 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 "couldn't determine 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"

## para no copiar los subtitulos que pueda haber en $SRC_FILE...
#mkvinfo "$SRC_FILE" |grep -qi subt
#if [ $? -eq 0 ]
#then   # ya tiene subs
#  TMP_FILE="temporal_noexiste_borrar_3456184.mkv"   # mktemp?
#  mkvmerge -o "$TMP_FILE" --no-subtitles "$SRC_FILE"
#  mkvmerge -o "$DST_FILE" --title "$TITLE" --default-language spa --default-track 0 --sub-charset 0:"$CHARSET" --language 0:Spa "$SRT_FILE" "$TMP_FILE"
#  RETVAL=$?
#  rm $TMP_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"
  RETVAL=$?
#fi
##

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

    exit $RETVAL
Antes:

Despues:

Feliz programacion.

Related Posts by Categories



0 comentarios :

Publicar un comentario

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