Advertisement
Guest User

ScriptBash by Luis Palacios and uploaded by Diabliyo

a guest
May 28th, 2010
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 47.35 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. # Copyright (C) 2009 Luis Palacios
  4. #
  5. # dvd2mpeg4.sh
  6. # Extraer los capitulos de un DVD y crear ficheros Matroska con H264 y AAC
  7. #
  8. # This program is free software; you can redistribute it and/or
  9. # modify it under the terms of the GNU General Public License
  10. # as published by the Free Software Foundation; either version 2
  11. # of the License, or (at your option) any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program; if not, write to the Free Software
  20. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21. #
  22. Version=1.5
  23. INFOFILE="/tmp/dvd2mpeg4.nfo"
  24. INFOALL="/tmp/dvd2mpeg4.nfoall"
  25. OUTFILE="/tmp/dvd2mpeg4.out"
  26. ASFILE="/tmp/dvd2mpeg4.as"    # Información --aiden --aides --siden --sides
  27.  
  28. # ----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
  29. # No modificar a partir de este punto
  30. #
  31.  
  32. # Usar las variables con "echo -e" para que interprete las secuencias \escaped...
  33. NORMAL="\033[0;39m"
  34. ROJO="\033[1;31m"
  35. VERDE="\033[1;32m"
  36. AMARILLO="\033[1;33m"
  37.  
  38. # Columna donde se muestra el mensaje de resultado (linea 1000, asi siempre
  39. # es la ultima linea de la shell... y columna 80)
  40. DONE="\033[1000;80H[${VERDE}DONE${NORMAL}]"
  41. RESOK="\033[1000;80H[${VERDE}OK${NORMAL}]"
  42. RESDRYRUN="\033[1000;80H[${VERDE}No ejecutar${NORMAL}]"
  43. RESWARN="\033[1000;75H[${AMARILLO}warning${NORMAL}]"
  44. RESOMITIDO="\033[1000;75H[${AMARILLO}Omitido${NORMAL}]"
  45. RESERROR="\033[1000;77H[${ROJO}ERROR${NORMAL}]"
  46.  
  47. # Funciones
  48. # ==========================================================================
  49. #
  50. # Mostrar como se usa este programa
  51. #
  52. uso() {
  53.     mi_nombre=`basename $0`
  54.     echo
  55.     echo "${mi_nombre}, v${Version}. Copyright (c) 2009 Luis Palacios"
  56.     echo "Extraer los capitulos de un DVD y crear ficheros Matroska con H264 y AAC"
  57.     echo
  58.     echo "OPCIONES COMUNES"
  59.     echo "================"
  60.     echo
  61.     echo "  -h           Esta ventana de ayuda"
  62.     echo "  -n           Mostrar lo que se haría pero sin hacerlo."
  63.     echo "  -v           Mostrar mas información (ser más cotilla)."
  64.     echo
  65.     echo "  -m|--media <NOMBRE>"
  66.     echo "     NOMBRE         Nombre del directorio anterior a donde está VIDEO_TS"
  67.     echo "                    por ejemplo: /home/luis/media/PELICULA/"
  68.     echo
  69.     echo "  --iso <NOMBRE>"
  70.     echo "     NOMBRE         Nombre del fichero NOMBRE.iso"
  71.     echo
  72.     echo "  -d                Activar deinterlace"
  73.     echo
  74.     echo
  75.     echo "EXTRAER INFORMACIÓN DEL DVD"
  76.     echo "==========================="
  77.     echo
  78.     echo "Uso: `basename $0` [--info|--infoall]"
  79.     echo "Uso: `basename $0` [-hnv] -R -p <PISTA>"
  80.     echo
  81.     echo "  --info            Mostrar información del DVD"
  82.     echo "  --infoall         Mostrar información completa del DVD"
  83.     echo "  -R -p <PISTA>     Reproducir la pista PISTA desde el DVD"
  84.     echo
  85.     echo
  86.     echo "EXTRAER y CODIFICAR UN TRACK ESPECÍFICO"
  87.     echo "======================================="
  88.     echo
  89.     echo "Uso: `basename $0` -T -t \"<titulo\" -p <n> -E <n> --aiden <n> [--aides <n>] --siden <n> --sides <n> [--min] [--crop] [--noclean]"
  90.     echo
  91.     echo "  -T               Extraer y codifica un determinado \"Track\""
  92.     echo "  -t \"<titulo>\"    Título de la película y temporada"
  93.     echo "  -p <n>           Número de pista a extraer del DVD (usa --info para saber cual)"
  94.     echo "  --aiden <n>      AID del Idioma Inglés"
  95.     echo "  --aides <n>      AID del Idioma Español"
  96.     echo "  --siden <n>      SID del Subtítulo Inglés"
  97.     echo "  --sides <n>      SID del Subtítulo Español"
  98.     echo ""
  99.     echo "  --noclean         No limpiar los ficheros intermedios"
  100.     echo "  --crop            Adivinar el área de crop y hacer el recorte"
  101.     echo "  --min <minutos>   Número de minutos a procesar, util para hacer pruebas."
  102.     echo
  103.     echo
  104.     echo "EXTRAER LOS FICHEROS .vob, .txt, .ifo"
  105.     echo "====================================="
  106.     echo
  107.     echo "Uso: `basename $0` -X -p \"<n> [n] [n] ...\" -t \"<titulo>\" -E <n>"
  108.     echo
  109.     echo "  -X                Extraer ficheros .vob, .txt, .ifo"
  110.     echo "  -p \"<n> ...\"      Números de pistas a extraer del DVD (usa --info para saber cuales debes extraer)"
  111.     echo "  -t \"<titulo>\"     Prefijo del nombre del fichero de salida:  \"<titulo>- Episodio <n>\""
  112.     echo "  -E <n>            Número del primer Episodio a usar en el nombre del fichero de salida."
  113.     echo "                    Es Obligatorio si hay más de una pista y se incrementa según el número de pistas que se extraigan"
  114.     echo "                    No es necesario si sólo hay una única pista"
  115.     echo
  116.     echo
  117.     echo "TRANSCODIFICAR FICHEROS .vob"
  118.     echo "============================"
  119.     echo
  120.     echo "Uso: `basename $0` -V -t \"<titulo>\""
  121.     echo
  122.     echo "  -V                Buscar y transcodificar todos los ficheros .vob del directorio actual".
  123.     echo "  -t \"<titulo>\"     Prefijo del nombre de los ficheros a buscar  \"<titulo>*.vob|txt|ifo\""
  124.     echo
  125.     echo
  126.     echo "METODO DE TRABAJO RECOMENDADO"
  127.     echo "============================="
  128.     echo
  129.     echo "Primero recomiendo extraer todos los VOB's del DVD o DVDs usando la opción -X, de modo que se"
  130.     echo "crearán tres archivos por cada pista. En el caso de series con múltiples DVDs lo "
  131.     echo "más rápido es extraer todos los episodios de todos los DVDs al disco duro y luego transcodificarlos."
  132.     echo
  133.     echo "PELICULAS o DVDs hecho a mano, con sólo una Pista a procesar"
  134.     echo " 1) Extraer pista 1"
  135.     echo "    `basename $0` -X -p 1 -t \"Mi_dvd\""
  136.     echo
  137.     echo " 2) Transcodificar el VOB"
  138.     echo "    `basename $0` -V -t \"Mi_dvd\""
  139.     echo
  140.     echo "O bien, hacerlo todo junto, extraer y luego transcodificar"
  141.     echo "  `basename $0` -X -p 1 -V -t \"Mi_dvd\""
  142.     echo
  143.     echo
  144.     echo "SERIES: ---"
  145.     echo "Extraer pistas 1,3,4,5, creando cuatro ficheros \"Mi_Serie - Episodio [5|6|7|8]\".<vob|txt|ifo>"
  146.     echo "  `basename $0` -X -p \"1 3 4 5\" -t \"Mi_Serie\" -E 5"
  147.     echo
  148.     echo "Transcodificar todos los VOBs y crear matroskas"
  149.     echo "  `basename $0` -V -t \"Mi_Serie\""
  150.     echo
  151.     echo
  152.     echo "--"
  153.    
  154.     exit 1  # Salimos
  155. }
  156.  
  157. #
  158. # verbose() Muestra mensaje si esta activo verbose
  159. #
  160. echo_verbose() {
  161.     if [ "${verbose}" = "1" ]; then
  162.         echo "${*}"
  163.     fi
  164. }
  165.  
  166. #
  167. # show_outfile() Muestra el fichero temporal OUTFILE
  168. #
  169. show_outfile() {
  170.     echo "-------------------------------"
  171.     echo
  172.     echo
  173.     echo
  174.     if [ -f ${OUTFILE} ]; then
  175.         cat ${OUTFILE}
  176.         rm ${OUTFILE}
  177.     fi
  178. }
  179.  
  180. hms()
  181. {
  182.     secs=${1}
  183.     crono=`printf "%02d:%02d:%02d\n" $((secs/3600)) $((secs/60%60)) $((secs%60))`
  184. }
  185.  
  186.  
  187. cronoStart() {
  188.     START=`date +%s`
  189. }
  190.  
  191. cronoStop() {
  192.     STOP=`date +%s`
  193.     secs=$((${STOP}-${START}))
  194.     hms ${secs}
  195.     START=0
  196. }
  197.  
  198.  
  199.  
  200. #
  201. # find_media(). Es lo primero que se hace, identificar el DVD
  202. #
  203. find_media() {
  204.  
  205.     echo "`basename $0`, v${Version}. Copyright (c) 2009 Luis Palacios"
  206.     echo "----------------------------------------------------"
  207.     echo
  208.        
  209.     if [ "${ISO}" = "" ]; then
  210.         if [ "${MEDIA}" = "" ]; then
  211.             echo buscando media
  212.             media_name
  213.         fi
  214.         DVD="${MEDIA}VIDEO_TS"
  215.         if [ ! -d "${DVD}" ]; then
  216.             DVD="${MEDIA}"
  217.             if [ ! -f "${DVD}" ]; then
  218.                 echo "No se encuentra el DVD en: '${DVD}'"
  219.                 exit
  220.             fi
  221.         fi
  222.        
  223.         #
  224.         # Muestro información
  225.         echo_verbose  "Media: ${MEDIA}"
  226.         echo_verbose  "DVD: ${DVD}"
  227.         echo_verbose  "Comando: ${comando}"
  228.         echo_verbose  "Codec: ${codec}"
  229.         echo_verbose  "Titulo: ${TITULO}"
  230.         if [ "${dryrun}" = "1" ] ; then echo_verbose  "Ejecucion: No actuar"; else echo_verbose "Ejecucion: Actuar"; fi
  231.         if [ "${verbose}" = "1" ] ; then echo_verbose "Verbose: Ser verbose"; fi
  232.     else
  233.         MEDIA="${HOME}/iso"
  234.         if [ ! -d "${MEDIA}" ]; then
  235.             mkdir "${MEDIA}"
  236.         fi
  237.         mount | grep "${MEDIA}" > /dev/null 2>&1
  238.         if [ "$?" = "0" ]; then
  239.             sudo umount "${MEDIA}"
  240.         fi
  241.  
  242.         # Montaje de la imagen iso
  243.         sudo mount -t iso9660 -o loop ${ISO} "${MEDIA}"
  244.        
  245.         if [ -d "${MEDIA}/video_ts" ]; then
  246.             DVD="${MEDIA}/video_ts"
  247.         fi
  248.         if [ -d "${MEDIA}/VIDEO_TS" ]; then
  249.             DVD="${MEDIA}/VIDEO_TS"
  250.         fi
  251.     fi
  252.  
  253. }
  254.  
  255.  
  256. #
  257. # media_name() Devuelve el nombre del DVD montado
  258. #
  259. media_name() {
  260.     echo -n "Obteniendo nombre de dispositivo montado en /media"
  261.     if [ "${dryrun}" = "1" ] ; then
  262.         echo -e "${RESDRYRUN}"
  263.         echo_verbose "mount | grep -i sr0 | awk '{print $3}' | sed -e 's%.*/%%' -e 's%\.[^.]*$%%'"
  264.     fi    
  265.  
  266.     a=`mount | grep -i sr0 | awk '{print $3}' | sed -e 's%.*/%%' -e 's%\.[^.]*$%%'|head -1`
  267.     cronoStart
  268.     MEDIA="`ls -1d /media/${a}*/ 2>/dev/null | head -1`"
  269.     if [ ${?} = 0 ] && [ ! -z "${MEDIA}" ] ; then
  270.         echo -e "${RESOK} ($crono)"
  271.         cronoStop
  272.     else
  273.         echo -e "${RESERROR}"
  274.         echo "No hay ningún dispositivo montado en /media"
  275.         exit
  276.     fi
  277. }
  278.  
  279. #
  280. # find_bigTracks()
  281. # Encuentra pistas de mas de 30 minutos con pistas de audio en ingles y/o español
  282. #
  283. find_bigTracks() {
  284.     cIFS=${IFS}
  285.  
  286.     IFS=$'\t\n'
  287.     for aline in `lsdvd "${MEDIA}" | grep Length | sed -e 's/Title: \([0-9]*\),/\1/'g -e 's/Length: //'g -e 's/Length: //'g -e 's/ Chap.*//' -e '/^$/d'`
  288.     do
  289.         IFS=${cIFS}
  290.  
  291.         trackNumber=`echo $aline | awk '{print $1}'`
  292.         trackTime=`echo $aline | awk '{print $2}'`
  293.  
  294.         trackHours=`echo $trackTime | awk 'BEGIN { FS = ":" } ; {print $1}'`
  295.         trackMins=`echo $trackTime | awk 'BEGIN { FS = ":" } ; {print $2}'`
  296.  
  297.         if [ ${trackHours} -gt 0 ] || [ ${trackMins} -gt 30 ]; then
  298.             echo "Track $trackNumber, Time: $trackHours:$trackMins"
  299.             lsdvd -a -t "${trackNumber}" "${MEDIA}"
  300.         fi
  301.  
  302.         IFS=$'\t\n'
  303.     done
  304.     IFS=${cIFS}
  305. }    
  306.  
  307. #
  308. # extraeVOB()
  309. #
  310. # Extrae las películas en bruto desde el DVD y las salva como fichero .vob, de modo
  311. # que luego puedan ser transcodificadas desde disco duro, con el consiguiente ahorro de
  312. # tiempo que supone. Por un lado es más rápido trabajar desde disco y por otro se puede
  313. # independizar la copia de los datos de los DVDs del proceso en sí de transcodificación,
  314. # por ejemplo sería posible extraer todos los VOBs de 6 DVDs y procesarlos durante la noche.
  315. # La extracción de 6-8GB tarda aprox 6-8 minutos, por lo que merece la pena-
  316. #
  317. # No sólo se extrae el .vob con la película completa, tanto si es una sola pista (una
  318. # película) como si son varias (capítulos de una serie), para cada extracción se crean
  319. # tres ficheros:
  320. #
  321. # Pelicula_tal_y_tal.ifo    Es una copia del VTS_01_0.IFO. Lo vamos a necesitar a la hora de
  322. #                           trabajar con los subtítulos, para asegurarnos que sus colores son
  323. #                           los adecuados (tipicamente blanco con borde negro), o podríamos
  324. #                           caer en el problema de tener subtítulos de colores. Se usará
  325. #                           con mencoder -ifo <fichero>.ifo durante estas 2 operaciones:
  326. #                           1) extraer el segundo subtítulo
  327. #                           2) primera pasada de la transcodificación.
  328. #
  329. # Pelicula_tal_y_tal.txt    En este fichero voy a guardarme la salida de la información que se
  330. #                           obtiene con --info, es decir, la información de qué pistas de idiomas
  331. #                           y de subtítulos contiene la película. De esta forma guardo junto
  332. #                           al fichero .vob información sobre qué idioma corresponde a qué "aid",
  333. #                           y qué idioma de subtítulo corresponde a qué "sid".
  334. #
  335. # Pelicula_tal_y_tal.vob    Copia en "bruto" del video de la pelicula, junto con todos los
  336. #                           idiomas y subtítulos.
  337. #
  338. #
  339. extraeVOB() {
  340.  
  341.    
  342.     echo -n "Obteniendo información del DVD, idiomas y subtítulos."
  343.     if [ ! -f "${TITULO}.txt" ]; then
  344.         cronoStart
  345.         getTheInfo
  346.         cronoStop
  347.         echo -e "${RESOK} ($crono)"
  348.         cat "${ASFILE}" > "${TITULO}.txt"
  349.     else
  350. #        . "./${TITULO}.txt"
  351.         echo -e "${RESOMITIDO}"
  352.     fi
  353.  
  354.     if [ "${unaPista}" = "0" ]; then
  355.         echo -n "Extrayendo la información de las pistas"
  356.         if [ ! -f "${TITULO}-chapter.txt" ]; then
  357.             cronoStart
  358.             dvdxchap -t "${PISTA}" "${MEDIA}" > "${TITULO}-chapter.txt"
  359.             if [ ${?} = 0 ]; then
  360.                 cronoStop
  361.                 echo -e "${RESOK} ($crono)"
  362.             else
  363.                 echo -e "${RESERROR}"
  364.                 exit
  365.             fi
  366.         else
  367.             echo -e "${RESOMITIDO}"
  368.         fi
  369.        
  370.         echo -n "Copiando el fichero IFO"
  371.         if [ ! -f "${TITULO}.ifo" ]; then
  372.             if [ -f "${DVD}/VTS_01_0.IFO" ]; then        
  373.                 cp "${DVD}/VTS_01_0.IFO" "${TITULO}.ifo" > ${OUTFILE} 2>&1
  374.                 ret=$?
  375.             fi
  376.             if [ -f "${DVD}/vts_01_0.ifo" ]; then        
  377.                 cp "${DVD}/vts_01_0.ifo" "${TITULO}.ifo" > ${OUTFILE} 2>&1
  378.                 ret=$?
  379.             fi
  380.             if [ ${ret} = 0 ]; then
  381.                 echo -e "${RESOK}"
  382.             else
  383.                 echo -e "${RESERROR}"
  384.                 show_outfile
  385.             fi
  386.         else
  387.             echo -e "${RESOMITIDO}"
  388.         fi      
  389.     fi
  390.    
  391.     echo -n "Extrayendo el VOB del Episodio ${episodio}"
  392.     if [ ! -f "${TITULO}.vob" ]; then
  393.         cronoStart
  394.         mplayer dvd://${PISTA} -dvd-device "${MEDIA}" -dumpstream -dumpfile "${TITULO}.vob"  > ${OUTFILE} 2>&1            
  395.         if [ ${?} = 0 ]; then
  396.             cronoStop
  397.             echo -e "${RESOK} ($crono)"
  398.         else
  399.             echo -e "${RESERROR}"
  400.             show_outfile
  401.             exit
  402.         fi
  403.     else
  404.         echo -e "${RESOMITIDO}"
  405.     fi
  406. }
  407.  
  408.  
  409. #
  410. # getTheInfo()
  411. #
  412. # Obtener Informacion del DVD. Se analiza la salida del comando "mplayer -v" para averiguar la información
  413. # más importante del DVD en mi caso, es decir, cuales son las pistas de audio y los subtítulos en Inglés y
  414. # en Español.
  415. #
  416. # Se analizan los datos de una salida del tipo:
  417. #
  418. #      :
  419. #      Hay 21 títulos en este DVD.
  420. #      stream de audio: 0 formato: ac3 (5.1) idioma: en aid: 128.
  421. #      stream de audio: 2 formato: ac3 (5.1) idioma: es aid: 130.
  422. #      stream de audio: 3 formato: ac3 (mono) idioma: en aid: 131.
  423. #      subtítulo ( sid ): 0 idioma: en
  424. #      subtítulo ( sid ): 1 idioma: en
  425. #      subtítulo ( sid ): 3 idioma: es
  426. #      subtítulo ( sid ): 6 idioma: es
  427. #      Número de subtítulos en el disco: 7
  428. #      :
  429. getTheInfo() {
  430. #set -x
  431.     ## Checkout the DVD information.
  432.     mplayer -v "dvd://${PISTA}" -dvd-device  "${DVD}" -ss 10:00:00 2>/dev/null > "${INFOALL}"
  433.     cat "${INFOALL}" |grep "títulos\|idioma" | grep "en\|es\|unknown" > "${INFOFILE}"
  434.  
  435.     ## Audio en inglés
  436.     aiden=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep 5.1 | grep -i en | sed -e 's/.*aid: //' -e 's/\.//'`
  437.     if [ "${aiden}" = "" ]; then
  438.         aiden=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep stereo | grep -i en | sed -e 's/.*aid: //' -e 's/\.//'`
  439.         if [ "${aiden}" = "" ]; then
  440.             aiden=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep mono | grep -i en | sed -e 's/.*aid: //' -e 's/\.//'`
  441.         fi
  442.     fi
  443.  
  444.     aides=""
  445.     ## Audio en Español
  446.     aides=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep 5.1 | grep -i es | sed -e 's/.*aid: //' -e 's/\.//'`        
  447.     if [ "${aides}" = "" ]; then
  448.         aides=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep stereo | grep -i es | sed -e 's/.*aid: //' -e 's/\.//'`        
  449.         if [ "${aides}" = "" ]; then
  450.             aides=`cat ${INFOFILE} | grep "en\|es" | grep audio | grep mono | grep -i es | sed -e 's/.*aid: //' -e 's/\.//'`
  451.         fi
  452.     fi
  453.  
  454.     ## Audio marcado como Unknown
  455. #    if [ "${aides}" = "" ]; then
  456. #        aides=`cat ${INFOFILE} | grep "en\|es\|unknown" | grep audio | grep 5.1 | grep -i unknown | sed -e 's/.*aid: //' -e 's/\.//' | head -1`
  457. #        if [ "${aides}" = "" ]; then
  458. #            aides=`cat ${INFOFILE} | grep "en\|es\|unknown" | grep audio | grep stereo | grep -i unknown | sed -e 's/.*aid: //' -e 's/\.//' | head -1`
  459. #            if [ "${aides}" = "" ]; then
  460. #                aides=`cat ${INFOFILE} | grep "en\|es\|unknown" | grep audio | grep mono | grep -i unknown | sed -e 's/.*aid: //' -e 's/\.//' | head -1`
  461. #            fi
  462. #        fi
  463. #    fi
  464.  
  465.     # Subtítulos en Inglés
  466.     siden=`cat ${INFOFILE} | grep "sid" | grep en | head -1 | sed -e 's/.*( sid ): //' -e 's/ idi.*//'`
  467.  
  468.     # Subtítulos en Español
  469.     sides=`cat ${INFOFILE} | grep "sid" | grep es | head -1 | sed -e 's/.*( sid ): //' -e 's/ idi.*//'`
  470.  
  471.     > ${ASFILE}
  472.     if [ ! "${aiden}" = "" ]; then
  473.         echo "AIDEN=${aiden} " >> ${ASFILE}
  474.     fi
  475.     if [ ! "${aides}" = "" ]; then
  476.         echo "AIDES=${aides} " >> ${ASFILE}
  477.     fi
  478.     if [ ! "${siden}" = "" ]; then
  479.         echo "SIDEN=${siden} " >> ${ASFILE}
  480.         if [ "${sides}" = "" ]; then
  481.             echo "SIDES=${siden}" >> ${ASFILE}
  482.         fi        
  483.     fi
  484.     if [ ! "${sides}" = "" ]; then
  485.         echo "SIDES=${sides}" >> ${ASFILE}
  486.         if [ "${siden}" = "" ]; then
  487.             echo "SIDEN=${sides}" >> ${ASFILE}
  488.         fi        
  489.     fi
  490.  
  491.     # Analizamos el caso de DVDs hechos en casa, con una única pista de video y de audio
  492.     # o DVD's que "NO" tienes pista de Inglés, donde no me interesan los subtítulos.
  493.     if [ -z "${aiden}" ] && [ -z "${aides}" ] ; then
  494.         unaPista=1
  495.         unaPistaAudio=`cat ${INFOALL} | grep "stream de audio" | grep "aid" | sed -e 's/.*aid: //' -e 's/\.//' | head -1`
  496.         echo "unaPista=1" >> ${ASFILE}
  497.         echo "unaPistaAudio=${unaPistaAudio}" >> ${ASFILE}
  498.     fi
  499.  
  500. #    exit
  501. }
  502.  
  503. #
  504. # info()
  505. #
  506. # Obtener Informacion del DVD usando getTheInfo()
  507. #
  508. info() {
  509.     rm -f ${OUTFILE}
  510.     echo -n "Obteniendo información del DVD"
  511.     if [ "${dryrun}" = "1" ] ; then
  512.         echo -e "${RESDRYRUN}"
  513.         echo_verbose "mplayer -v dvd:// -dvd-device ${DVD} -ss 10:00:00 2>/dev/null |grep -i idioma > ${OUTFILE}"        
  514.     else
  515.         echo "" > ${OUTFILE}
  516.         cronoStart
  517.         getTheInfo
  518.         cronoStop
  519.         echo -e "${RESOK} ($crono)"
  520.  
  521.         cat ${INFOFILE} >> ${OUTFILE}
  522.         echo "-------------------------------------------------------------------------" >> ${OUTFILE}
  523.         echo "" >> ${OUTFILE}
  524.  
  525.         if [ "${unaPista}" = "1" ]; then            
  526.             echo "## De este DVD sólo usaré una única pista de Video y de Audio." >> ${OUTFILE}
  527.             echo "#" >> ${OUTFILE}
  528.             echo -n "Video=" >> ${OUTFILE}
  529.             find_bigTracks >> ${OUTFILE} 2>/dev/null
  530.             echo "Audio=${unaPistaAudio}" >> ${OUTFILE}
  531.             echo "" >> ${OUTFILE}
  532.         else
  533.  
  534.             echo "## Pistas susceptibles de contener episodios y/o películas:" >> ${OUTFILE}
  535.             echo "#" >> ${OUTFILE}
  536.             find_bigTracks >> ${OUTFILE} 2>/dev/null
  537.  
  538.             echo "## Valores recomendados para extraer audio y subítulos en Inglés y Español" >> ${OUTFILE}
  539.             echo "#" >> ${OUTFILE}
  540.             cat ${ASFILE} >> ${OUTFILE}
  541.             echo "" >> ${OUTFILE}
  542.         fi
  543.     fi
  544.     if [ -f ${OUTFILE} ]; then
  545.         cat ${OUTFILE}
  546.         rm -f ${OUTFILE} ${INFOFILE} ${OUTFILE}
  547.     fi
  548. }
  549.  
  550.  
  551. # Obtener Informacion completa del DVD
  552. # infoall()
  553. infoall() {
  554.     rm -f ${OUTFILE}
  555.     echo -n "Obteniendo información completa del DVD"
  556.     if [ "${dryrun}" = "1" ] ; then
  557.         echo -e "${RESDRYRUN}"
  558.         echo_verbose "mplayer -v dvd:// -dvd-device  ${DVD} -ss 10:00:00 2>/dev/null > ${OUTFILE}"        
  559.     else
  560.         cronoStart
  561.         mplayer -v dvd:// -dvd-device  ${DVD} -ss 10:00:00 2>/dev/null > ${OUTFILE}
  562.         cronoStop
  563.         echo -e "${RESOK} ($crono)"
  564.     fi
  565.  
  566.     if [ -f ${OUTFILE} ]; then
  567.         cat ${OUTFILE}
  568.         rm ${OUTFILE}
  569.     fi
  570.  
  571. }
  572.  
  573.  
  574. #
  575. # extrae() Extracción de los VOB's
  576. # ================================
  577. #
  578. extrae() {
  579.     PREFIJO_TITULO=${TITULO}
  580.     P=${PISTA}
  581.     for i in $P; do
  582.         if [ -z "${E}" ] ; then
  583.             TITULO="${PREFIJO_TITULO}"
  584.         else
  585.             episodio=`printf "%02i" ${E}`
  586.             TITULO="${PREFIJO_TITULO} - Episodio ${episodio}"
  587.         fi
  588.         PISTA="${i}"
  589.         echo
  590.         echo
  591.         echo "--"
  592.         extraeVOB
  593.         if [ ! -z "${E}" ]; then
  594.             E=$((E+1))
  595.         fi
  596.     done    
  597. }
  598.  
  599.  
  600.  
  601. #
  602. # Limpieza final
  603. # =================================
  604. limpiezaFinal() {
  605.     # Limpieza final
  606.     if [ -f "${TITULO}.mkv" ]; then
  607.         rm -f "${TITULO}-chapter.txt"
  608.         rm -f "${TITULO}.txt"
  609.         rm -f "${TITULO}.ifo"
  610.         rm -f "${TITULO}.vob"
  611.         rm -f "${TITULO}-es.aac"
  612.         rm -f "${TITULO}-subs-en.idx"
  613.         rm -f "${TITULO}-subs-en.sub"
  614.         rm -f "${TITULO}-subs-es.idx"
  615.         rm -f "${TITULO}-subs-es.sub"
  616.         rm -f "${TITULO}.avi"
  617.         rm -f "${TITULO}.crop"
  618.         rm -f "${TITULO}.pass1"
  619.     fi
  620. }    
  621.  
  622.  
  623.  
  624. # Ripea el DVD
  625. # =================================
  626. ripea() {
  627.    
  628.     if [ -f "${TITULO}.mkv" ]; then
  629.         echo "${TITULO}.mkv ya existe"
  630.         return
  631.     fi
  632.  
  633.     ##
  634.     ##
  635.     # Extraer info del DVD y VOB
  636.     #
  637.     if [ "${argMedia}" = 0 ]; then
  638.         if [ ! -f "${TITULO}.vob" ]; then
  639.             if [ "${dryrun}" = "1" ] ; then
  640.                 echo -n "Extracción del .VOB"
  641.                 echo -e "${RESDRYRUN}"
  642.                 echo_verbose "dvdxchap -t ${PISTA} /dev/dvd > ${TITULO}-chapter.txt"
  643.                 echo_verbose "cp ${DVD}/*.IFO ."
  644.                 echo_verbose "mplayer dvd://${PISTA} -dumpstream -dumpfile ${TITULO}.vob"
  645.             else
  646.                
  647.                 if [ ! -z "${E}" ] ; then
  648.                     PREFIJO_TITULO=${TITULO}    
  649.                     episodio=`printf "%02i" ${E}`
  650.                     TITULO="${PREFIJO_TITULO} - Episodio ${episodio}"
  651.                 fi
  652.                 echo
  653.                 echo
  654.                 echo "--"
  655.                 extraeVOB
  656.                 IMAGEN="${TITULO}.vob"                        
  657.             fi
  658.         else
  659.             IMAGEN="${TITULO}.vob"
  660.         fi
  661.     fi
  662.    
  663.     ##
  664.     ##
  665.     # Video - cropping
  666.     CROP=""
  667.     if [ "${useCrop}" = "1" ]; then
  668.         if [ "${dryrun}" = "1" ] ; then
  669.             echo -n "Averiguando el Cropping"
  670.             echo -e "${RESDRYRUN}"
  671.         else
  672.             echo -n "Detectando el CROP"
  673.             if [ ! -f "${TITULO}.crop" ]; then
  674.                 cronoStart
  675.                 if [ "${argMedia}" = 0 ]; then
  676.                     mplayer ${IMAGEN} -vf cropdetect -sb 50000000 -frames 100 -vo null -ao null > ${OUTFILE} 2>/dev/null
  677.                 else
  678.                     mplayer dvd://${PISTA} -dvd-device "${MEDIA}" -vf cropdetect -sb 50000000 -frames 100 -vo null -ao null > ${OUTFILE} 2>/dev/null            
  679.                 fi
  680.                 if [ ${?} = 0 ]; then
  681.                     cronoStop
  682.                     echo -e "${RESOK} ($crono)"
  683.                 else
  684.                     echo -e "${RESERROR}"
  685.                     show_outfile
  686.                     exit
  687.                 fi
  688.  
  689.                 # Extraigo el valor de cropt detectado que más se repite
  690.                 echo -n "Extrayendo el valor de cropt más repetido"
  691.                 cronoStart
  692.                 CROP="`grep CROP ${OUTFILE} | sed -e 's/^[^(]*(//; s/).*$//' -e 's/.*\(crop=.*\).*/\1/' | sort | uniq -c | sort | tail -1 | sed -e 's/.*\(crop=.*\).*/\1/'`,"
  693.                 if [ ${?} = 0 ]; then
  694.                     cronoStop
  695.                     echo -e "${RESOK} ($crono)"
  696.                     echo "${CROP}" > "${TITULO}.crop"
  697.                 else
  698.                     echo -e "${RESERROR}"
  699.                     show_outfile
  700.                     exit
  701.                 fi
  702.             else
  703.                 CROP=`cat "${TITULO}.crop"`
  704.                 echo -e "${RESOMITIDO}"
  705.             fi        
  706.         fi
  707.     fi
  708.    
  709.  
  710.  
  711.     ##
  712.     ##
  713.     # He probado con 1800 inicialmente.
  714.     # Ahora lo voy a dejar a 2000 una temporada a ver si se nota
  715.     BITRATE=2000
  716.  
  717.  
  718.  
  719.     ##
  720.     ##
  721.     # Activado deinterlace¿?
  722.     DEINTERLACE=""
  723.     if [ "${deinterlace}" = "1" ]; then
  724.         #DEINTERLACE="pp=ci,"
  725.         #DEINTERLACE="yadif=3,mcdeint,"
  726.         DEINTERLACE="yadif,"
  727.     fi
  728.  
  729.     ###
  730.     ###
  731.     # Creación del AVI, con subtítulos en inglés y español, audio AAC en inglés y video H.264
  732.     if [ "${dryrun}" = "1" ] ; then
  733.         echo -n "Transcodificando video"
  734.         echo -e "${RESDRYRUN}"
  735.     else
  736.         echo -n "Trascodificando a H.264, pasada 1:"
  737.         if [ ! -f "${TITULO}.pass1" ]; then
  738.             echo
  739.             cronoStart
  740.  
  741.             # Identifico la fuente
  742.             if [ "${argMedia}" = 0 ]; then
  743.                 FUENTE="${IMAGEN}"
  744.             else
  745.                 FUENTE="dvd://${PISTA} -dvd-device ${MEDIA}"
  746.             fi
  747.  
  748.             # Averiguo si tengo una única pista de audio (típicamene sólo en Español)
  749.             if [ "${unaPista}" = "1" ]; then
  750.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -o /dev/null -vc mpeg12 ${FRAMES} \
  751.                     -vf ${DEINTERLACE}${CROP}softskip,harddup \
  752.                     -aid ${unaPistaAudio} -af volume=7:0 -oac faac -faacopts mpeg=4:br=110:object=2 \
  753.                     -ovc x264 -x264encopts bitrate=${BITRATE}:subq=5:bframes=3:b_pyramid:weight_b:turbo=1:threads=auto:pass=1 \
  754.                     -passlogfile "${TITULO}.pass1"  2>${OUTFILE}            
  755.             else                
  756.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -o /dev/null -vc mpeg12 ${FRAMES} \
  757.                     -ifo "${TITULO}.ifo" -sid ${SIDEN} -vobsubout "${TITULO}-subs-en" -vobsuboutindex 0 \
  758.                     -vf  ${DEINTERLACE}${CROP}softskip,harddup \
  759.                     -aid ${AIDEN} -af volume=7:0 -oac faac -faacopts mpeg=4:br=110:object=2 \
  760.                     -ovc x264 -x264encopts bitrate=${BITRATE}:subq=5:bframes=3:b_pyramid:weight_b:turbo=1:threads=auto:pass=1 \
  761.                     -passlogfile "${TITULO}.pass1"  2>${OUTFILE}            
  762.             fi
  763.             if [ ${?} = 0 ]; then
  764.                 cronoStop
  765.                 echo
  766.                 echo -n "Trascodificando a H.264, pasada 1:"
  767.                 echo -e "${RESOK} ($crono)"
  768.             else
  769.                 echo
  770.                 echo -n "Trascodificando a H.264, pasada 1:"
  771.                 echo -e "${RESERROR}"
  772.                 show_outfile
  773.                 exit
  774.             fi
  775.         else
  776.             echo -e "${RESOMITIDO}"
  777.         fi
  778.  
  779.         echo -n "Trascodificando a H.264, pasada 2:"
  780.         if [ ! -f "${TITULO}.avi" ]; then
  781.             echo
  782.             cronoStart
  783.  
  784.             #
  785.             if [ "${argMedia}" = 0 ]; then
  786.                 FUENTE="${IMAGEN}"
  787.             else
  788.                 FUENTE="dvd://${PISTA} -dvd-device ${MEDIA}"
  789.             fi
  790.  
  791.             # Averiguo si tengo una única pista de audio (típicamene sólo en Español)
  792.             if [ "${unaPista}" = "1" ]; then
  793.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -o "${TITULO}.avi" -vc mpeg12 ${FRAMES} \
  794.                     -vf  ${DEINTERLACE}${CROP}softskip,harddup \
  795.                     -aid ${unaPistaAudio} -af volume=7:0 -oac faac -faacopts mpeg=4:br=110:object=2 \
  796.                     -ovc x264 -x264encopts bitrate=${BITRATE}:subq=5:8x8dct:frameref=2:bframes=3:b_pyramid:weight_b:threads=auto:pass=2 \
  797.                     -passlogfile "${TITULO}.pass1" 2>${OUTFILE}
  798.             else
  799.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -o "${TITULO}.avi" -vc mpeg12 ${FRAMES} \
  800.                     -vf  ${DEINTERLACE}${CROP}softskip,harddup \
  801.                     -aid ${AIDEN} -af volume=7:0 -oac faac -faacopts mpeg=4:br=110:object=2 \
  802.                     -ovc x264 -x264encopts bitrate=${BITRATE}:subq=5:8x8dct:frameref=2:bframes=3:b_pyramid:weight_b:threads=auto:pass=2 \
  803.                     -passlogfile "${TITULO}.pass1" 2>${OUTFILE}
  804.             fi
  805.             if [ ${?} = 0 ]; then
  806.                 cronoStop
  807.                 echo
  808.                 echo -n "Trascodificando a H.264, pasada 2:"
  809.                 echo -e "${RESOK} ($crono)"
  810.             else
  811.                 echo
  812.                 echo -n "Trascodificando a H.264, pasada 2:"
  813.                 echo -e "${RESERROR}"
  814.                 show_outfile
  815.                 exit
  816.             fi
  817.         else
  818.             echo -e "${RESOMITIDO}"
  819.         fi        
  820.  
  821.     fi
  822.  
  823.    
  824.     ###
  825.     ###
  826.     # Extraigo el segundo subtitulo
  827.     if [ ! "${unaPista}" = "1" ]; then
  828.         if [ "${dryrun}" = "1" ] ; then
  829.             echo -n "Extracción del segundo subtítulo"
  830.             echo -e "${RESDRYRUN}"
  831.         else
  832.             echo -n "Extrayendo subtítulos en Español ${TITULO}-subs-es"
  833.             if [ ! -f "${TITULO}-subs-es.idx" ]; then
  834.                 echo
  835.                 cronoStart
  836.                
  837.             #OK
  838.                 if [ "${argMedia}" = 0 ]; then
  839.                     FUENTE="${IMAGEN}"
  840.                 else
  841.                     FUENTE="dvd://${PISTA} -dvd-device ${MEDIA}"
  842.                 fi
  843.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -vc mpeg12 ${FRAMES} \
  844.                     -ifo "${TITULO}.ifo" -sid ${SIDES} -vobsubout "${TITULO}-subs-es" -vobsuboutindex 0 \
  845.                     -aid ${AIDEN} -oac pcm -ovc copy -o /dev/null 2>/dev/null
  846.                
  847.                 if [ ${?} = 0 ]; then
  848.                     cronoStop
  849.                     echo
  850.                     echo -n "Extrayendo subtítulos en Español ${TITULO}-subs-es"
  851.                     echo -e "${RESOK} ($crono)"
  852.                 else
  853.                     echo
  854.                     echo -n "Extrayendo subtítulos en Español ${TITULO}-subs-es"
  855.                     echo -e "${RESERROR}"
  856.                     exit
  857.                 fi
  858.             else
  859.                 echo -e "${RESOMITIDO}"
  860.             fi
  861.         fi
  862.     fi
  863.    
  864.     ###
  865.     ###
  866.     # Extracción de la [segunda] pista de audio en Español
  867.     if [ ! -z "${AIDES}" ]; then
  868.         echo aqui
  869.         if [ "${dryrun}" = "1" ] ; then
  870.             echo -n "Extracción de la segunda pista de audio (español)"
  871.             echo -e "${RESDRYRUN}"
  872.         else
  873.             echo -n "Extracción del audio Español: ${TITULO}-es.aac:"
  874.             if [ ! -f "${TITULO}-es.aac" ]; then
  875.                 echo
  876.                 cronoStart
  877.                 # Mantener al máximo la sincronía A/V, aunque cueste un poco más sacar el audio.
  878.  
  879.                 #OK
  880.                 if [ "${argMedia}" = 0 ]; then
  881.                     FUENTE="${IMAGEN}"
  882.                 else
  883.                     FUENTE="dvd://${PISTA} -dvd-device ${MEDIA}"
  884.                 fi
  885.                 mencoder -msglevel all=-1:statusline=5 "${FUENTE}" -vc mpeg12 ${FRAMES} -aid ${AIDES} -oac faac -faacopts mpeg=4:br=110:object=2 -af volume=7:0 -sws 0 -vf ${CROP}scale=16:16,softskip,harddup -ovc lavc -lavcopts vcodec=mpeg2video -of rawaudio -o "${TITULO}-es.aac" 2>/dev/null
  886.                
  887.                 if [ ${?} = 0 ]; then
  888.                     cronoStop
  889.                     echo
  890.                     echo -n "Extracción del audio Español: ${TITULO}-es.aac:"
  891.                     echo -e "${RESOK} ($crono)"
  892.                 else
  893.                     echo
  894.                     echo -n "Extracción del audio Español: ${TITULO}-es.aac:"
  895.                     echo -e "${RESERROR}"
  896.                     exit
  897.                 fi
  898.             else
  899.                 echo -e "${RESOMITIDO}"
  900.             fi
  901.         fi
  902.     fi
  903.  
  904.     # Creando Matroska
  905.     rm -f ${OUTFILE}
  906.     if [ "${dryrun}" = "1" ] ; then
  907.         echo -n "Creando Matroska"
  908.         echo -e "${RESDRYRUN}"
  909.     else
  910.         if [ ! -f "${TITULO}.mkv" ]; then
  911.             echo -n "Creando Matroska"
  912.             cronoStart
  913.             # mkvmerge -o ${TIULO}.mkv                                                  \   # Fichero de salida
  914.             #   --title "${TITULO}"                                                     \   # Titulo
  915.             #   --chapter-charset "UTF8" --chapters ${TITULO}-chapter.txt               \   # Capítulos
  916.             #   --track-name "0:Pelicula" -d 0 -A -S ${TITULO}.264                      \   # Track 0
  917.             #   --language "1:eng" --track-name "1:Inglés" -a 1 -D -S ${TITULO}-en.mp3  \   # Track 1
  918.             #   --language "1:spa" --track-name "2:Español" -a 1 -D -S ${TITULO}-es.mp3 \   # Track 2
  919.             #   --language "0:eng" --track-name "0:Subtítulos Inglés"                   \   # Track 3
  920.             #   --language "1:spa" --track-name "1:Subtítulos Español" -s "0,1"         \   # Track 3
  921.             #   -D -A ${TITULO}-vobsubs.idx                                             \   # Track 3
  922.             #   --track-order "0:0,1:1,2:1,3:0,3:1"    > ${OUTFILE} 2>&1
  923.             #
  924.             # New: "lost_chapter7.idx" "lost_chapter7_sub2.idx" -o "lost_chapter7.mkv"
  925.             #
  926.             #
  927.  
  928.             if [ "${unaPista}" = "1" ]; then
  929.                 mkvmerge -o "${TITULO}.mkv" --aac-is-sbr 0 "--forced-track" "0:no" "--language" "1:spa" "--default-track" "1:yes" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S"  "${TITULO}.avi" "--title" "${TITULO}" # > ${OUTFILE} 2>&1
  930.             else
  931.                 if [ -z "${AIDES}" ]; then
  932.                 #OK
  933.                     mkvmerge -o "${TITULO}.mkv" --aac-is-sbr 0 "--forced-track" "0:no" "--language" "1:eng" "--default-track" "1:yes" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S"  "${TITULO}.avi" "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "-s" "0" "-D" "-A"  "${TITULO}-subs-en.idx" "--language" "0:spa" "--forced-track" "0:no" "-s" "0" "-D" "-A"  "${TITULO}-subs-es.idx" "--track-order" "0:0,0:1,1:0,2:0,3:0" "--title"  "${TITULO}"  "--chapter-charset" "UTF8" "--chapters" "${TITULO}-chapter.txt" # > ${OUTFILE} 2>&1
  934.                 else
  935.                 #OK
  936.                     mkvmerge -o "${TITULO}.mkv" --aac-is-sbr 0 "--forced-track" "0:no" "--language" "1:eng" "--default-track" "1:yes" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S"  "${TITULO}.avi" --aac-is-sbr 0 "--language" "0:spa" "--forced-track" "0:no" "-a" "0" "-D" "-S"  "${TITULO}-es.aac" "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "-s" "0" "-D" "-A"  "${TITULO}-subs-en.idx" "--language" "0:spa" "--forced-track" "0:no" "-s" "0" "-D" "-A"  "${TITULO}-subs-es.idx" "--track-order" "0:0,0:1,1:0,2:0,3:0" "--title"  "${TITULO}"  "--chapter-charset" "UTF8" "--chapters" "${TITULO}-chapter.txt" # > ${OUTFILE} 2>&1
  937.                 fi
  938.             fi
  939.            
  940.             if [ ${?} = 0 ] || [ ${?} = 1 ]; then
  941.                 cronoStop
  942.                 echo -e "${RESOK} ($crono)"
  943.             else
  944.                 echo -e "${RESERROR}"
  945.                 show_outfile
  946.                 exit
  947.             fi
  948.         else
  949.             echo -e "${RESOMITIDO}"
  950.         fi        
  951.     fi
  952.  
  953.     if [ "$noClean" = "1" ]; then
  954.         return
  955.     fi
  956.    
  957.     # Limpieza final
  958.     limpiezaFinal
  959.    
  960. }
  961.  
  962.  
  963. #
  964. # COMANDO: reproducir
  965. # ===================
  966. #
  967. # reproducir() Reproduce una pista concreta del DVD
  968. #
  969. reproducir() {
  970.     mplayer -msglevel all=-1:statusline=5 dvd://${PISTA} 2>/dev/null
  971. }
  972.  
  973.  
  974. #
  975. # vobs() procesa todos los vobs del directorio actual que empiezan por TITULO*
  976. # ============================================================================
  977. #
  978. vobs() {
  979.    
  980.     cIFS=${IFS}
  981.  
  982.     IFS=$'\t\n'
  983.     for i in `ls ${TITULO}*.vob`; do
  984.         IFS=${cIFS}
  985.  
  986.         _nam=`echo "${i}" | sed -e 's%.*/%%' -e 's%\.[^.]*$%%'`          # Nombre del fichero
  987.         _ext=`echo "${i}" | sed -n 's%.*\.\([^/]*\)$%\1%p'`              # Extensión
  988.  
  989.         if [ -f "${_nam}.vob" ] && [ -f "${_nam}.txt" ]; then
  990.             . "./${_nam}.txt"
  991.             TITULO="${_nam}"
  992.             if [ "${unaPista}" = "1" ]; then
  993.                 echo "Transcodificar: ${TITULO} (una única pista de audio y video)"
  994.                 ripea
  995.             else
  996.                 echo "Transcodificar: ${TITULO} --aiden ${AIDEN} --aides ${AIDES} --siden ${SIDEN} --sides ${SIDES}"
  997.                 ripea
  998.             fi
  999.         else
  1000.             echo -n "Falta el archivo .txt o .ifo"
  1001.             echo -e "${RESERROR}"
  1002.         fi
  1003.  
  1004.         IFS=$'\t\n'
  1005.     done
  1006.     IFS=${cIFS}
  1007. }
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016. # -----------------------------------------------------------------------------------------------
  1017. # Cuerpo principal
  1018. #
  1019.  
  1020. # Variables globales
  1021. esPelicula=0
  1022. comando=""         # Posibles comandos: info, infoall, reproducir, ripea
  1023. dryrun=0           # =1: no actuar, sólo mostrar lo que se haría
  1024. verbose=0          # Mostrar más info de la normal.
  1025. arg_media=0        # Indica si nos pasan el argumento --media
  1026.  
  1027. codec="x264"       # Codec por defecto.
  1028. ISO=""           # Nombre del DVD
  1029. MEDIA=""           # Nombre del DVD
  1030. DVD=""             # Directorio de datos del DVD (típicamente /media/${MEDIA}/VIDEO_TS
  1031. FRAMES=""
  1032.  
  1033. # -t \"<titulo\" -p <n> --aiden <n> --aides <n> --siden <n> --sides <n> [--min] [--crop] [--noclean]"
  1034. # Analisis
  1035. #
  1036. TEMP=`getopt -o    hnvm:p:t:c:p:t:RTXE:Vd \
  1037.              --long  help,no-actuar,verbose,media:,iso:,info,infoall,pista:,titulo:,aiden:,aides:,siden:,sides:,dvd,vob,min:,crop,noclean \
  1038.              -n      'dvd2mpeg4.sh' -- "$@"`
  1039.  
  1040. X=0
  1041. useCrop=0
  1042. noClean=0
  1043. argMedia=0
  1044. AIDES=""
  1045. AIDEN=""
  1046. SIDEN=""
  1047. SIDES=""
  1048. unaPista=0
  1049.  
  1050. if [ $? != 0 ] ; then uso ; fi
  1051. eval set -- "$TEMP"
  1052. while true; do
  1053.     case "$1" in
  1054.  
  1055.         #
  1056.         # OPCIONES COMUNES
  1057.         # ================
  1058.  
  1059.         -h|--help)                            # Mostrar ayuda y salir
  1060.             uso
  1061.             shift ;;
  1062.         -n|--no-actuar)                       # Mostrar lo que se haraa sin hacerlo
  1063.             dryrun=1
  1064.             shift ;;
  1065.         -v|--verbose)                         # Mostrar más información, ser cotilla.
  1066.             verbose=1
  1067.             shift ;;
  1068.         -m|--media)
  1069.             case "$2" in
  1070.                 "")
  1071.                     uso
  1072.                     shift 2 ;;
  1073.                 *)
  1074.                     argMedia=1
  1075.                     MEDIA="${2}"
  1076.                     shift 2 ;;
  1077.             esac;;
  1078.         --iso)
  1079.             case "$2" in
  1080.                 "")
  1081.                     uso
  1082.                     shift 2 ;;
  1083.                 *)
  1084.                     ISO="${2}"
  1085.                     shift 2 ;;
  1086.             esac;;
  1087.  
  1088.        
  1089.  
  1090.         --noclean)
  1091.             noClean=1
  1092.             shift ;;
  1093.  
  1094.  
  1095.         #
  1096.         # EXTRAE LA UNICA PISTA DE VIDEO Y AUDIO EXISTENTE
  1097.         # ================================================
  1098.         #
  1099.         # Uso: dvd2mpeg4.sh -1
  1100.         #
  1101.  
  1102.         -d)                                   # Extrae una pista
  1103.             deinterlace=1
  1104.             shift ;;
  1105.  
  1106.         #
  1107.         # EXTRAER INFORMACIÓN DEL DVD
  1108.         # ===========================
  1109.         #
  1110.         # Uso: dvd2mpeg4.sh [--info|--infoall]
  1111.         # Uso: dvd2mpeg4.sh [-hnv] -R -p <PISTA>
  1112.         #
  1113.  
  1114.         --info)                               # Obtener información del DVD
  1115.             comando="info"
  1116.             shift ;;
  1117.         --infoall)                            # INfo completa del DVD
  1118.             comando="infoall"
  1119.             shift ;;
  1120.         -R)                                   # Reproducir el DVD
  1121.             comando="reproducir"              
  1122.             shift ;;
  1123.         -p|--pista)                           # número de track (pista) a extraer
  1124.             case "$2" in
  1125.                 "")
  1126.                     uso
  1127.                     shift 2 ;;
  1128.                 *)
  1129.                     PISTA="${2}"
  1130.                     shift 2 ;;
  1131.             esac;;
  1132.        
  1133.  
  1134.         # EXTRAER y CODIFICAR UN TRACK ESPECÍFICO
  1135.         # =======================================
  1136.         #
  1137.         # Uso: dvd2mpeg4.sh -T -t "<titulo" -p <n> --aiden <n> --aides <n> --siden <n> --sides <n> \
  1138.         #                   <--dvd|--vob> [--min] [--crop] [--noclean]
  1139.         #
  1140.        
  1141.         -T)                                   # Extraer un track especifico
  1142.             comando="ripea"
  1143.             shift ;;
  1144.         -t|--titulo)                          #
  1145.             case "$2" in
  1146.                 "")
  1147.                     uso
  1148.                     shift 2 ;;
  1149.                 *)
  1150.                     TITULO="${2}"
  1151.                     shift 2 ;;
  1152.             esac;;
  1153.         --aiden)
  1154.             case "$2" in
  1155.                 "")
  1156.                     uso
  1157.                     shift 2 ;;
  1158.                 *)
  1159.                     AIDEN="${2}"
  1160.                     shift 2 ;;
  1161.             esac;;
  1162.         --aides)
  1163.             case "$2" in
  1164.                 "")
  1165.                     uso
  1166.                     shift 2 ;;
  1167.                 *)
  1168.                     AIDES="${2}"
  1169.                     shift 2 ;;
  1170.             esac;;
  1171.         --siden)
  1172.             case "$2" in
  1173.                 "")
  1174.                     uso
  1175.                     shift 2 ;;
  1176.                 *)
  1177.                     SIDEN="${2}"
  1178.                     shift 2 ;;
  1179.             esac;;
  1180.         --sides)
  1181.             case "$2" in
  1182.                 "")
  1183.                     uso
  1184.                     shift 2 ;;
  1185.                 *)
  1186.                     SIDES="${2}"
  1187.                     shift 2 ;;
  1188.             esac;;
  1189.         --crop)
  1190.             useCrop=1
  1191.             shift ;;
  1192.         --min)
  1193.             case "$2" in
  1194.                 "")
  1195.                     uso
  1196.                     shift 2 ;;
  1197.                 *)
  1198.                     FRAMES="-frames $((25*60*${2}))"
  1199.                     shift 2 ;;
  1200.             esac;;
  1201.  
  1202.        
  1203.  
  1204.         # EXTRAER LOS FICHEROS .vob, .txt, .ifo
  1205.         # =====================================
  1206.         #
  1207.         # Uso: dvd2mpeg4.sh -X -p "<n> [n] [n] ..." -t "<titulo>" -E <n>        
  1208.         #
  1209.  
  1210.         -X)                                   # Extraer .vob, .ifo, .txt
  1211.             comando="extrae"
  1212.             multiExtrae=1
  1213.             shift ;;
  1214.         -E)                                   # Número de episodio
  1215.             case "$2" in
  1216.                 "")
  1217.                     uso
  1218.                     shift 2 ;;
  1219.                 *)
  1220.                     E="${2}"
  1221.                     shift 2 ;;
  1222.             esac;;
  1223.  
  1224.  
  1225.  
  1226.         # TRANSCODIFICAR FICHEROS .vob
  1227.         # ============================
  1228.         #
  1229.         # Uso: dvd2mpeg4.sh -V -t "<titulo>"
  1230.         #
  1231.  
  1232.         -V)                                   # Buscar y transcodificar todos los vobs
  1233.             comando="vobs"
  1234.             multiVobs=1
  1235.             shift ;;
  1236.  
  1237.  
  1238.         --)
  1239.             shift
  1240.             break ;;
  1241.         *)
  1242.             echo "Error interno"
  1243.             uso ;;
  1244.     esac    
  1245. done
  1246. #echo "Resto de argumentos:"
  1247. #for arg do echo '--> '"\`$arg'" ; done
  1248. for arg do arg_dir=1; done
  1249.  
  1250. # Si tenemos argumentos adicionales se consideraran como el directorio de trabajo
  1251. if [ ! -z "${arg}" ] ; then
  1252.     arg_dir=1
  1253.     DIR_TRABAJO="${arg}"
  1254. fi
  1255.  
  1256. ## En el caso de pedir una extracción y transcodificación posterior...
  1257. #
  1258. if [ "${multiExtrae}" = "1" ] && [ "${multiVobs}" = "1" ]; then
  1259.     comando="allInOne"
  1260. fi
  1261.  
  1262. #
  1263. # Ejecución normal
  1264. #
  1265. # Mensaje de inicio
  1266.  
  1267. if [ ! "${TITULO}" = "" ]; then
  1268.     if [ -z "${comando}" ]; then
  1269.         comando="ripea"    # Por defecto se ripea
  1270.     fi
  1271. fi
  1272.  
  1273. #
  1274. # Comandos
  1275. #
  1276. case ${comando} in
  1277.  
  1278.             # Extrae el título a un fichero .VOB
  1279.     "extrae" | \
  1280.     "allInOne" )
  1281.  
  1282.         if [ "${comando}" = "allInOne" ]; then
  1283.             echo "2en1..."
  1284.         fi
  1285.        
  1286.         # Busco el dispositivo DVD
  1287.         find_media
  1288.  
  1289.         # Si nos han llamado con argumentos incorrectos, nos salimos
  1290.         if [ "${DVD}" = "" ]; then
  1291.             echo -n "Error Argumentos: Falta información del DVD"
  1292.             echo -e "${RESERROR}"
  1293.             uso
  1294.         fi
  1295.         if [ "${TITULO}" = "" ]; then
  1296.             echo -n "Error Argumentos: Falta el nombre del titulo final"
  1297.             echo -e "${RESERROR}"
  1298.             uso
  1299.         fi
  1300. #        if [ "${E}" = "" ]; then
  1301. #            echo -n "Error Argumentos: Falta el número de Episodio"
  1302. #            echo -e "${RESERROR}"
  1303. #            uso
  1304. #        fi
  1305.         if [ "${PISTA}" = "" ]; then
  1306.             echo -n "Error Argumentos: Falta la lista de pistas a extraer"
  1307.             echo -e "${RESERROR}"
  1308.             uso
  1309.         fi
  1310.  
  1311.         extrae
  1312.         if [ "${comando}" = "allInOne" ]; then
  1313.             vobs
  1314.         fi
  1315.        
  1316.         ;;
  1317.  
  1318.  
  1319.     "info" )              # Muestro información de idiomas
  1320.         find_media
  1321.         if [ "${MEDIA}" = "" ]; then
  1322.             uso
  1323.         fi
  1324.         info
  1325.         ;;
  1326.  
  1327.     "infoall" )           # Muestro información completa
  1328.         find_media
  1329.         if [ "${MEDIA}" = "" ]; then
  1330.             uso
  1331.         fi
  1332.         infoall
  1333.         ;;
  1334.  
  1335.     "reproducir" )       # Reproducir una pista concreta del DVD
  1336.  
  1337.         # Busco el dispositivo DVD
  1338.         find_media
  1339.  
  1340.         # Si nos han llamado con argumentos incorrectos, nos salimos
  1341.         if [ "${DVD}" = "" ]; then
  1342.             echo -n "Error Argumentos: Falta información del DVD"
  1343.             echo -e "${RESERROR}"
  1344.             uso
  1345.         fi
  1346.         if [ "${PISTA}" = "" ]; then
  1347.             echo -n "Error Argumentos: Falta el número de pista"
  1348.             echo -e "${RESERROR}"
  1349.             uso
  1350.         fi
  1351.  
  1352.         # Si todo está bien, pues a reproducir...
  1353.         reproducir
  1354.         ;;
  1355.  
  1356.     "ripea" )            # RIP
  1357.  
  1358.         # Busco el dispositivo DVD
  1359.         find_media
  1360.  
  1361.         # Si nos han llamado con argumentos incorrectos, nos salimos
  1362.         if [ "${DVD}" = "" ]; then
  1363.             echo -n "Error Argumentos: Falta información del DVD"
  1364.             echo -e "${RESERROR}"
  1365.             uso
  1366.         fi
  1367.         if [ "${PISTA}" = "" ]; then
  1368.             echo -n "Error Argumentos: Falta el número de pista"
  1369.             echo -e "${RESERROR}"
  1370.             uso
  1371.         fi
  1372.         if [ "${TITULO}" = "" ]; then
  1373.             echo -n "Error Argumentos: Falta el nombre del titulo final"
  1374.             echo -e "${RESERROR}"
  1375.             uso
  1376.         fi
  1377.         if [ "${AIDEN}" = "" ] || [ "${SIDEN}" = "" ] ||  [ "${SIDES}" = "" ] ; then
  1378.             echo -n "Error Argumentos: Faltan argumentos de idioma y/o subtítulo"
  1379.             echo -e "${RESERROR}"
  1380.             uso
  1381.         fi
  1382. #        if [ "${E}" = "" ] ; then
  1383. #            echo -n "Error Argumentos: Faltan el número del episodio"
  1384. #            echo -e "${RESERROR}"
  1385. #            uso
  1386. #        fi
  1387.        
  1388.         ripea
  1389.         ;;
  1390.  
  1391.     "vobs" )            # Extrae todos los vobs
  1392.        
  1393.         if [ "${TITULO}" = "" ]; then
  1394.             echo -n "Error Argumentos: Falta el nombre del titulo final"
  1395.             echo -e "${RESERROR}"
  1396.             uso
  1397.         fi
  1398.        
  1399.         vobs
  1400.         ;;
  1401.  
  1402.  
  1403.     *)
  1404.         uso
  1405.         ;;
  1406. esac                                            
  1407.  
  1408.  
  1409.  
  1410. #
  1411. # Limpieza
  1412. #
  1413.  
  1414. if [ ! "${ISO}" = "" ]; then
  1415.     MEDIA="${HOME}/iso"
  1416.     mount | grep "${MEDIA}" > /dev/null 2>&1
  1417.     if [ "$?" = "0" ]; then
  1418.         sudo umount "${MEDIA}"
  1419.     fi
  1420. fi
  1421.  
  1422. #
  1423. # Salimos
  1424. #
  1425. exit
  1426.  
  1427. # Aquí nunca llega :-)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement