Compare Revisions
Last modification
- Rev 20 2011-11-25 00:41:52
- Author: PointedEars
- Log message:
Added dvdsubtitles 0.6.1.2006031907
/trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles-loop |
File deleted |
|
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh |
=================================================================== |
--- tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh (revision 20) |
+++ tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh (nonexistent) |
@@ -1,644 +0,0 @@ |
-#!/bin/sh |
-appname="${0##*/}" |
-ver="0.6.1.2006031907" |
-copy="2005, 2006" |
-mail_feedback="dvd@PointedEars.de" |
-# ---------------------------------------------------------------------------- |
-# DVD Subtitles 0.6.1 -- Extracts subtitles from Video DVD data to a text file |
-# Copyright (C) 2005, 2006 Thomas Lahn <PointedEars@gmx.de> |
-# |
-# This program is free software; you can redistribute it and/or modify it |
-# under the terms of the GNU General Public License (GPL) as published |
-# by the Free Software Foundation; either version 2 of the License, or |
-# (at your option) any later version. |
-# |
-# This program is distributed in the hope that it will be useful, |
-# but WITHOUT ANY WARRANTY; without even the implied warranty of |
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-# GNU General Public License for more details. |
-# |
-# You should have received a copy of the GNU GPL along with this |
-# program; if not, write to the Free Software Foundation, Inc., |
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
-# |
-## Standard shell script disclaimer blurb thing: |
-## |
-## This script is a hack. It's brute force. It's horrible. |
-## It doesn't use Artificial Intelligence. It doesn't use Virtual Reality. |
-## It's not perl. It's not python. It probably won't work unchanged on |
-## the "other" thousands of unices. But it worksforme. --ramiro |
-# (from /usr/local/mozilla/run-mozilla.sh) |
-# |
-# This is work in progress. If you have an improvement, patch, |
-# idea, whatever, on how to make this script better, please |
-# send it to <dvd@PointedEars.de> |
- |
-_title () |
-{ |
- echo "\ |
-${extd}DVD Subtitles $ver |
-Copyright (C) $copy Thomas Lahn <$mail_feedback>$norm |
-Distributed under the terms of the GNU General Public License (GPL), see |
-COPYING file or http://www.gnu.org/licenses/licenses.html#GPL for details. |
-" |
-} |
- |
-_help () |
-{ |
- echo "\ |
-Extracts a subtitle stream from Video DVD data and converts it to a text file. |
- |
-$extd$appname$norm [options] ${ital}SOURCE$norm |
-$extd$appname$norm [$extd-hVkl$norm] [${ital}SOURCE$norm [${ital}TITLE$norm\ |
- [${ital}SUBTITLE$norm [${ital}TARGET$norm [${ital}GREY_LEVELS$norm]]]]] |
- |
-Any option argument is overwritten by the respective additional program |
-argument. Options may be given in any order, and are also considered |
-options if located after the first program argument. Too many program |
-arguments are silently ignored. |
- |
-$extd-c$norm, $extd--compile$norm ${ital}FILE$norm | ${ital}DIRECTORY$norm |
- Compile subtitle text files according to subtitle index\ |
- ${ital}FILE$norm |
- or to subtitle index files in ${ital}DIRECTORY$norm to\ |
- ${ital}TARGET$norm. Clean up if this is successful, then exit. |
- |
-$extd-k$norm, $extd--keep$norm Keep subtitle stream file even if\ |
- conversion is successful. |
- |
-$extd-l$norm, $extd--list$norm List subtitles for TITLE using\ |
- ${extd}mplayer$norm(1) and exit. |
- If TITLE is not provided or \`$extd-$norm', list subtitles for |
- title #2 (as title #1 may be an intro without subtitles) |
- and exit. |
- |
-SOURCE Video DVD data source, i.e. a device (usually /dev/dvd), |
- a directory (e.g. one containing content created via |
- ${extd}dvdbackup$norm(1)) or a Video DVD image file. |
- If \`$extd-$norm', a previously created subtitle stream file\ |
- named |
- ${extd}subtitle_stream-$norm*$extd-${norm}TITLE${extd}-${norm}SUBTITLE\ |
- in the current working |
- directory will be used for only the stream-to-graphics- |
- to-text conversion instead. Both TITLE and SUBTITLE |
- must not be \`$extd-$norm' in that case. |
- The default is \`$extd/dev/dvd$norm'. |
- |
-$extd-t$norm, $extd--title$norm |
- TITLE Number of the title (1-n) which will be accessed for |
- subtitle stream extraction. If left out or \`$extd-$norm', the |
- program uses ${extd}mplayer$norm(1) to detect how many titles are |
- available on the DVD data source and asks for the |
- title to be accessed. |
- |
-$extd-s$norm, $extd--subtitle-id$norm |
- SUBTITLE ID of the subtitle stream to be extracted (0-n). |
- If left out or \`$extd-$norm', the program uses its\ |
- ${extd}-l$norm option to detect |
- which subtitles are available for the given TITLE and asks |
- for the ID to be used. |
- |
-$extd-o$norm, $extd--output-target$norm |
- TARGET Name of the resulting subtitles text file. |
- If not provided, the file is named after the subtitle stream |
- file. NOTE: Unlike previous versions, this version appends |
- the filename suffix $extd.srt$norm automagically ONLY in that\ |
- case. |
- |
-$extd-g$norm, $extd--grey-levels$norm |
- GREY_LEVELS Optional grey-levels value\ |
- (\`c0$extd,${norm}c1$extd,${norm}c2$extd,${norm}c3' with 0 <= cN <= 255, |
- where 0 is black and 255 is white) to be used for converting |
- the subtitle stream graphics to text via OCR. The default is |
- \`${extd}255,255,0,255$norm'. Unfortunately, the\ |
- ${extd}subtitle2pgm$norm program, |
- which requires this value, appears to be poorly documented; |
- if you find a more detailed, working documentation, please |
- refer to it and inform this program's author about it. |
- |
-$extd-h$norm, $extd--help$norm Display this help and exit. |
-$extd-v$norm, $extd--verbose$norm Be verbose. The number of ${extd}-v$norm\ |
- options specify the level of |
- verbosity. |
-$extd-V$norm, $extd--version$norm Display version information and exit. |
- |
-${extd}EXIT STATUS$norm |
- ${extd} 0$norm Successful program execution |
- ${extd} 1$norm Error detecting/extracting subtitle stream, or cancelled |
- without selecting a title number or subtitle ID |
- ${extd} 2$norm Unable to convert subtitle stream to image files |
- ${extd} 3$norm Cancelled due to ${extd}gocr$norm(1) error or without\ |
- entering another |
- grey-levels value |
- ${extd} 4$norm Unable to compile to text file |
- ${extd} 5$norm Unable to clean up |
- ${extd}127$norm Insufficient number of arguments / help was displayed |
- |
-See the $extd$appname$norm(1) manpage for complete documentation." |
-} |
- |
-if test -z "$LINES" -o -z "$COLUMNS" ; then |
- eval `stty size 2>/dev/null | (read L C; \ |
- echo LINES=${L:-24} COLUMNS=${C:-80})` |
-fi |
-test $LINES -eq 0 && LINES=24 |
-test $COLUMNS -eq 0 && COLUMNS=80 |
- |
-if test "$TERM" != "raw" && stty size >/dev/null 2>&1 ; then |
-# esc=`echo -en "\033"` |
-# extd="${esc}[1m" |
- extd=`tput bold 2>/dev/null` |
- ital=`tput sitm 2>/dev/null` |
-# norm=`echo -en "${esc}[m\017"` |
- norm=`tput sgr0 2>/dev/null` |
-else |
- esc="" |
- extd="" |
- norm="" |
-fi |
- |
-# Note that we use `"$@"' to let each command-line parameter expand to a |
-# separate word. The quotes around `$@' are essential! |
-# We need `tmp' as the `eval set --' would nuke the return value of getopt. |
- |
-[ "$1" = "-vv" ] && echo "$extd |
-Debug output for POSIX conform command-line parsing |
- |
-Original arguments: $*" >&2 |
-if `getopt -T >/dev/null 2>&1` ; [ $? = 4 ] ; then |
- getopt_type=long |
- [ "$1" = "-vv" ] && echo "getopt(1) type: enhanced" >&2 |
- tmp=`getopt -o c:klg:o:S::s:t:hVv \ |
- -l compile:,keep-stream,list,grey-levels:,output-target:\ |
-,spell-check,subtitle-id:,title:,help,verbose,version \ |
- -n "$appname" -s sh \ |
- -- "$@"` |
-else |
- getopt_type=short |
- [ "$1" = "-vv" ] && echo "getopt(1) type: old" >&2 |
- tmp=`getopt c:klg:o:S:s:t:hVv "$@"` |
-fi |
- |
-# exit status |
-ESUCCESS=0 |
-ECANTEXTRACT=1 |
-ECANTCONVERT=2 |
-EOCRERROR=3 |
-ECANTCOMPILE=4 |
-ECANTCLEANUP=5 |
-EARGERROR=127 |
- |
-getopt_exit_code=$? |
-help=0 |
-verbose=0 |
-version=0 |
-list=0 |
-source='/dev/dvd' |
-title='-' |
-sid='-' |
-target='-' |
-args='' |
-keep=0 |
-compile=0 |
-if [ $getopt_exit_code -eq 0 ]; then |
-## getopt returns error code 0 for successful parsing, 1 if |
-## getopt(3) returns errors, 2 if it does not understand its |
-## own parameters, 3 if an internal error occurs like out-of- |
-## memory, and 4 if it is called with -T. |
-# |
-# Note the quotes around `$tmp': they are essential! |
-# echo $tmp |
-# remove "--" |
-# for i in $tmp; do if [ "$i" != "--" ]; then tmp2="${tmp2} $i"; fi; done |
- eval set -- "$tmp" |
- [ "$1" = "-vv" ] && echo "New arguments: $*$norm |
-" >&2 |
- while true ; do |
- case "$1" in |
- -h | --help) |
- help=1 |
- shift;; |
- |
- -v | --verbose) |
- let verbose++ |
- shift;; |
- |
- -V | --version) |
- version=1 |
- shift;; |
- |
- -c | --compile) |
- compile=1 |
- source=$2 |
- shift 2;; |
- |
- -k | --keep) |
- keep=1 |
- shift;; |
- |
- -l | --list) |
- list=1 |
- shift;; |
- |
- -g | --grey-levels) |
- grey_levels=$2 |
- shift 2;; |
- |
- -o | --output-target) |
- target=$2 |
- shift 2;; |
- |
- -s | --subtitle-id) |
- sid=$2 |
- shift 2;; |
- |
- -t | --title) |
- title=$2 |
- shift 2;; |
- |
- --) |
- shift |
- break;; |
- esac |
- done |
- [ -n "$*" ] && args=$args" $*" |
- set -- $args |
-else |
- [ $verbose -gt 1 ] && echo "getopt exited: $getopt_exit_code |
- " >&2 |
- if [ $getopt_exit_code -eq 1 -o $getopt_exit_code -eq 2 ]; then |
- help=1 |
- else |
- exit $getopt_exit_code |
- fi |
-fi |
- |
-[ $list -eq 0 ] && _title |
-[ $version -eq 1 ] && exit $ESUCCESS |
-[ $help -eq 1 ] && |
-{ |
- _help "$0" |
- exit $EARGERROR |
-} |
- |
-result=$ESUCCESS |
-[ $compile -eq 0 ] && |
-{ |
- [ -n "$1" ] && source=$1 |
- [ -z "$title" -a -n "$2" ] && title=$2 |
- [ -z "$sid" -a -n "$3" ] && sid=$3 |
- [ -z "$target" -a -n "$4" ] && target=$4 |
- [ -z "$grey_levels" -a -n "$5" ] && grey_levels=$5 |
- |
- getsubtitles () |
- { |
- mplayer -dvd-device "$1" -vo null -ao null -frames 0 \ |
- -v "dvd://${2:-2}" 2>&1 | |
- sed -n '/sid/ s/^[^:]\{1,\}:[[:space:]]//p' |
- # echo "$subtitles" |
- } |
- |
- [ $list -eq 1 ] && |
- { |
- # first title may be only an intro |
- [ "$title" = '-' ] && title=2 |
- tmp=`getsubtitles $source $title` |
- if [ -n "$tmp" ]; then |
- echo "${extd}The following subtitles are available for title #$title:$norm |
-$tmp" |
- exit $ESUCCESS |
- else |
- exit $ECANTEXTRACT |
- fi |
- } |
- |
- [ "$sid" != '-' -a "$title" != '-' ] && |
- { |
- subtitles=`getsubtitles $source $title` |
- [ -n "$subtitles" ] && |
- st_descr=`echo "$subtitles" | grep "^$sid[[:space:]]" | |
- cut -f 2- -d ' '` |
- } |
- |
- if [ "$source" = '-' ]; then |
- stream_file=`ls subtitle_stream-*-$title-$sid 2>/dev/null | head -n 1` |
- if [ $? -eq 0 ]; then |
- read -r -s -p "Use '$stream_file' [Y/n]? " -n 1 |
- case $REPLY in |
- [Nn]) |
- echo $REPLY |
- exit 1;; |
- *) |
- echo Y |
- esac |
- echo |
- |
- id=${stream_file#*-} |
- else |
- echo "$appname: No such file: subtitle_stream-*-$title-$sid" >&2 |
- exit $ECANTEXTRACT |
- fi |
- else |
- read_error () |
- { |
- case $1 in |
- 0) subject='titles available on this DVD source.';; |
- *) subject='subtitles available for this title.';; |
- esac |
- |
- echo >&2 "\ |
-Sorry, there are no $subject |
-Please verify that the DVD data source is available and |
-that its filesystem is consistent." |
- |
- unset subject |
- exit $ECANTEXTRACT |
- } |
- |
- if [ "$title" = '-' ]; then |
- titles=`mplayer -dvd-device "$source" -vo null -ao null -frames 0 \ |
- -v dvd:// 2>&1 | egrep '[0-9]+ titles'` |
- num_titles=`echo "$titles" | awk '{print $3}'` |
- |
- [ $(($num_titles)) -lt 1 ] && read_error 0 |
- |
- echo "$titles" |
- while true |
- do |
- read -r -p "\ |
-${extd}Enter title# (1-$num_titles), or nothing to abort: $norm" |
- if [ -n "$REPLY" ]; then |
- title=$(($REPLY)) |
- [ $title -ge 1 -a $title -le $num_titles ] && break |
- else |
- exit $ECANTEXTRACT |
- fi |
- done |
- echo |
- fi |
- |
- if [ "$sid" = '-' ]; then |
- if [ -z "$subtitles" ]; then subtitles=`"$0" -lt "$title" "$source"`; fi |
- if [ $? -eq 0 ]; then |
- sid_max=`echo "$subtitles" | tail -n 1 | awk '{print $1}'` |
- echo "$subtitles" |
- while true; do |
- read -r -p "\ |
-${extd}Enter ID of subtitle stream (0-$sid_max) to extract, or nothing to abort: $norm" |
- if [ -n "$REPLY" ]; then |
- sid=$(($REPLY)) |
- [ $sid -ge 0 -a $sid -lt $sid_max ] && break |
- else |
- exit $ECANTEXTRACT |
- fi |
- done |
- else |
- read_error 1 |
- fi |
- fi |
- |
- # remove trailing / |
- source=${source%/} |
- |
- vol=`(echo $(volname $source 2>/dev/null); exit $?;) || echo ${source##*/}` |
- id=$vol-$title-$sid |
- stream_file=subtitle_stream-$id |
- |
- unset REPLY |
- [ -f "$stream_file" ] && |
- { |
- read -r -s -p "${extd}Use existing '$stream_file' [Y/n]? $norm" -n 1 |
- case $REPLY in |
- [Nn]) |
- echo $REPLY |
- read -r -s -p "${extd}Overwrite existing '$stream_file' [y/N]? $norm"\ |
- -n 1 REPLY2 |
- case $REPLY2 in |
- [Yy]) echo $REPLY2;; |
- *) |
- echo N |
- id=$vol-$title-$sid-$$ |
- stream_file=subtitle_stream-$id |
- echo "Using '$stream_file'" |
- esac |
- echo |
- unset REPLY2;; |
- *) |
- echo Y |
- REPLY='y' |
- esac |
- echo |
- } |
- |
- [ "$target" = '-' ] && target="$stream_file.srt" |
- |
- [ -z "$REPLY" -o "$REPLY" == 'N' -o "$REPLY" == 'n' ] && |
- { |
- echo "\ |
-${extd}Extracting subtitle stream $norm$sid${st_descr:+ ($st_descr)}$extd |
-of title $norm#$title$extd |
-on $norm$source$extd |
-to \"$norm$target$extd\" ...$norm |
-" >&2 |
- |
- > "$stream_file" |
- tccat -i "$source" -T "$title" -L | |
- tcextract -x ps1 -t vob -a 0x2$sid > "$stream_file" |
- } |
- fi |
- |
- if [ -f "$stream_file" -a -s "$stream_file" ]; then |
- echo "${extd}... done.$norm" |
- else |
- echo "${extd}... failed.$norm" |
- [ -f "$stream_file" ] && rm ./"$stream_file" |
- exit $ECANTEXTRACT |
- fi |
- |
- result=$ESUCCESS |
- while true |
- do |
- echo -n " |
-${extd}Converting subtitle stream \"$norm$stream_file$extd\" |
-to Netpbm Portable Greymaps (PGMs) ... $norm" | fold -s >&2 |
- subtitle2pgm -o ./${id}- ${grey_levels:+-c "$grey_levels"} < $stream_file |
- result=$? |
- if [ $result -eq 0 ]; then |
- echo "${extd}done.$norm |
- |
-${extd}Converting PGMs to text files (TXTs) using GNU OCR (gocr) ... $norm" |
- st_lang=$(echo "$st_descr" | sed 's/.*language: \([a-z]\{2\}\)/\1/') |
- pgm2txt ${st_lang:+-f $st_lang} ./${id}- |
- result=$? |
- if [ $result -eq 0 ]; then |
- echo "${extd}done, using a grey-levels value of\ |
- \`$norm${grey_levels:-255,255,0,255}$extd'.$norm" |
- break |
- else |
- echo "${extd}failed. |
- |
-If the conversion was cancelled due to inappropriate grey-levels value |
-\`${grey_levels:-255,255,0,255}', you may try another value,\ |
- else you should abort: |
-$norm" |
- select grey_levels in \ |
- `[ "$grey_levels" != '0,255,255,255' ] && echo 0,255,255,255` \ |
- `[ "$grey_levels" != '255,0,255,255' ] && echo 255,0,255,255` \ |
- `[ -n "$grey_levels" -a "$grey_levels" != '255,255,0,255' ] && |
- echo 255,255,0,255` \ |
- `[ "$grey_levels" != '255,255,255,0' ] && echo 255,255,255,0` \ |
- Other \ |
- Abort |
- do |
- case $grey_levels in |
- Other) |
- read -r -p " |
-${extd}Enter new value (\`c0$extd,${norm}c1$extd,${norm}c2$extd,${norm}c3'\ |
- with 0 <= cN <= 255), or nothing to select a value: |
-$norm" grey_levels |
- [ -n "$grey_levels" ] && break;; |
- |
- Abort) |
- result=$EOCRERROR |
- break;; |
- |
- *) |
- break |
- esac |
- done |
- fi |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCONVERT |
- break |
- fi |
- done |
- |
- echo -n "${extd}Cleaning up PGMs ... $norm" |
- rm ./${id}-*.pgm |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- fi |
-} |
- |
-[ $result -eq $ESUCCESS ] && |
-{ |
- if [ $compile -eq 1 ]; then |
- try_file () |
- { |
- [ ! -f "$source" ] && source="$source.srtx" |
- [ -f "$source" ] |
- } |
- |
- if [ -d "$source" ]; then |
-# TODO: loop through all .srtx files in the directory |
- if [ "$source" != '.' ]; then cd "$source"; fi |
- [ $? -eq 0 ] && |
- { |
- ls "$source"/*.srtx 2>/dev/null |
- } |
- echo >&2 "$appname: $source: Directory compile is not yet supported." |
- exit $ECANTCOMPILE |
- elif try_file; then |
- d=${source%/*} |
- if [ -a -d "$d" -a "$d" != '.' ]; then cd "$d"; fi |
- id=${source%-*} |
- stream_file=subtitle_stream-$id |
- source="./${source##*/}" |
- else |
- echo >&2 "$appname: $source: No such file or directory." |
- exit $ECANTCOMPILE |
- fi |
- else |
- source="${id}-.srtx" |
- fi |
- |
- unset REPLY |
- [ -f "$target" ] && |
- { |
-# TODO: allow for diff |
- read -r -s -p "${extd}'$target' exists. |
-Append, overwrite, create new file, or abort [a/o/n/Esc]? $norm" \ |
- -n 1 |
- case $REPLY in |
- [Oo]) echo $REPLY;; |
- [Aa]) echo $REPLY;; |
- [Nn]) |
- echo $REPLY |
- target="${target%.*}-$$.${target##*.}";; |
- *) |
- REPLY=Abort |
- echo $REPLY |
- exit $ECANTCOMPILE;; |
- esac |
- } |
- |
- echo " |
-${extd}Compiling TXTs into \"$norm$target$extd\" ... $norm" |
- |
- case "$REPLY" in |
- [Oo]) > "$target";; |
- [Aa]) |
- # append new content marker here |
- echo " |
--- `whoami`@`hostname` -- `date` -- |
-" >> "$target" |
- esac |
- |
- ( |
-# sed: thx to Erkan Yanar <erkan.yanar@t-online.de>, see |
-# message ID <lduohb.v74.ln@510002093148-0001.dialin.t-online.de> |
- srttool -s -i "$source" |
- |
- # only if srttool is not available |
- if [ $? -gt 1 ]; then |
- sed -n 's,^\(\([^/]*\)\(/\)\(.*\.pgm\.txt\)\)$,/^\2\\\3\4$/ { \ |
- r \1 \ |
- d \ |
- },gp' "$source" | sed -f - "$source" |
- fi |
- ) >> "$target" |
- |
- if [ $? -eq 0 ]; then |
- echo "${extd}... done.$norm" |
- else |
- echo "${extd}... failed.$norm" |
- exit $ECANTCOMPILE |
- fi |
- |
- echo -n "${extd}Cleaning up |
- ${id}-*.pgm.txt files ... $norm" |
- rm ./"${id}"-*.pgm.txt |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- |
- echo -n " ${extd}Subtitle index file '${id}-.srtx' ... $norm" |
- rm ./"${id}-.srtx" # "$target.srtx" |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- |
- [ $keep -eq 0 -a -f "./$stream_file" ] && |
- { |
- echo -n " ${extd}Subtitle stream file '${stream_file}' ... $norm" |
- rm ./"$stream_file" |
- |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- } |
- |
- exit $result |
-} |
/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh |
Property changes: |
Deleted: svn:executable |
## -1 +0,0 ## |
-* |
\ No newline at end of property |
Index: tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 |
=================================================================== |
--- tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 (revision 20) |
+++ tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 (nonexistent) |
@@ -1,440 +0,0 @@ |
-\" dvdsubtitles.1 - the *roff document processor src for the dvdsubtitles manual |
-\" |
-\" This file is part of PointedEars' DVD Subtitles. |
-\" Copyright (C) 2005, 2006 Thomas Lahn <dvd@PointedEars.de> |
-\" |
-\" Permission is granted to copy, distribute and/or modify this document |
-\" under the terms of the GNU Free Documentation License, Version 1.2 |
-\" or any later version published by the Free Software Foundation; |
-\" with no Invariant Sections, no Front-Cover Texts, and no Back-Cover |
-\" Texts. A copy of the license is available on the Web[1] or |
-\" from the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
-\" Boston, MA 02110-1301 USA. |
-\" |
-\" [1] <http://www.gnu.org/licenses/licenses.html#FDL> |
-\" |
-\" You may contact the author by: |
-\" e-mail: dvd@PointedEars.de |
-\" snail mail: |
-\" Thomas Lahn |
-\" Warschauer Strasse 1a/0403 |
-\" D-99089 Erfurt |
-\" Federal Republic of Germany |
- |
-.TH dvdsubtitles 1 "2006-02-15" "0.6.1.2006021519" "DVD Tools" |
- |
- |
-.SH NAME |
-dvdsubtitles \- Extract subtitle stream from Video DVD data to text file |
- |
- |
-.SH SYNOPSIS |
- |
-.B dvdsubtitles |
-.br |
-.RB [ -hVkl ] |
-.RB [ -t |
-.IR TITLE ] |
-.RB [ -s |
-.IR SUBTITLE ] |
-.RB [ -o |
-.IR TARGET ] |
-.RB [ -g |
-.IR GREY_LEVELS ] |
-.RI [ SOURCE ] |
- |
-.PP |
-.B dvdsubtitles |
-.B -c |
-.RI ( FILE " | " DIRECTORY ) |
-.RB [ -o |
-.IR TARGET ] |
- |
-.PP |
-.B dvdsubtitles |
-.RB [ -hVkl ] |
-.RI [ SOURCE |
-.RI [ TITLE |
-.RI [ SUBTITLE |
-.RI [ TARGET |
-.RI [ GREY_LEVELS ]]]]] |
- |
- |
-.SH DESCRIPTION |
- |
-Uses |
-.BR tccat (1) |
-and |
-.BR tcextract (1) |
-from the |
-.B transcode |
-package to extract a subtitle stream from DVD data. This stream is converted |
-into image files with |
-.BR subtitle2pgm , |
-and those are converted to text files using |
-.BR pgm2txt , |
-both from the |
-.B subtitleripper |
-package, which in turn calls |
-.BR gocr (1). |
-.PP |
-The previously created subtitle index file (.srtx) and the resulting text |
-files are then compiled into one text file using either |
-.BR srttool , |
-from the |
-.B subtitleripper |
-package, or |
-.BR sed (1). |
-(See Output Format below.) |
-.PP |
-The |
-.B -c |
-option allows for compiling existing text files into that format according |
-a subtitle index file without extracting a subtitle stream first (see below). |
-\" .PP |
-\" If the |
-\" .B -S |
-\" option is used, this program also performs a minor correction of common |
-\" misrecognition errors via |
-\" .BR sed (1), |
-\" i.e. a standalone `l' (small letter L) or one followed by an apostrophe |
-\" is converted to `I' (capital letter I). |
-.PP |
-All temporary files are deleted afterwards (`clean-up'), unless a fatal error |
-occurred or a user interrupt was detected; the extracted subtitle stream file |
-is kept for future use if the |
-.B -k |
-option is used. |
-.PP |
-Based on |
-.B DVD ripping and transcoding with Linux |
-by Moritz Bunkus <moritz@bunkus.org>, available at |
-.br |
-<\fIhttp://www.bunkus.org/dvdripping4linux/\fP>. |
- |
-.SS Output Format |
-The format of the subtitle text file this program creates is similar to that the |
-.B SubRip |
-program creates: |
-.PP |
-.I Subtitle number |
-.br |
-.IB "Start time " --> " End time" |
-.br |
-.I Text of subtitle (one or more lines) |
-.br |
-.I Blank line |
-.PP |
-Like the SubRip format, field data starts at the beginning of each line. |
-The time format used is `\fIhours\fB:\fIminutes\fB:\fIseconds\fR', |
-.I hours |
-and |
-.I minutes |
-with two digits each. The |
-.I seconds |
-field is precise to three decimal points; the decimal separator used is |
-the comma. |
-.PP |
-Different to the SubRip format, the line break used is the |
-standard UNIX Line Feed (LF, 0x0A) character. The |
-.I Subtitle number |
-field was not included before version 0.6.1. |
- |
- |
-.SH OPTIONS |
- |
-Options are supported since version 0.4. This aims at achieving POSIX |
-conformance and easy introduction of new features while maintaining |
-backwards compatibility to versions before 0.4. |
-.PP |
-If additional program arguments are used, any option argument is |
-overwritten by the corresponding program argument. Options may be |
-given in any order, and are also considered options if located after |
-the first program argument. Too many program arguments are silently |
-ignored. |
- |
-.IP "\fB-c\fP, \fB--compile\fP (\fIFILE\fP | \fIDIRECTORY\fP)" |
-(since version 0.6.1, \fBTODO\fP) Compile one group, or all groups of |
-subtitle text files in |
-.IR DIRECTORY , |
-according to a corresponding subtitle index |
-.I FILE |
-(.srtx), into one text file each. If this is successful, clean up (see |
-.BR -k ) |
-and exit. |
-Options irrelevant to this process are ignored. |
- |
-.RS |
-If a |
-.I DIRECTORY |
-is specified as argument, the |
-.B -o |
-option is ignored. The resulting text files are named after the |
-corresponding subtitle index files found in the |
-.I DIRECTORY |
-instead, and their name is suffixed with `\fB.srt\fP'. |
-.RE |
- |
-.IP "\fB-k\fP, \fB--keep\fP" |
-(since version 0.6) Keep subtitle stream file even if conversion is successful. |
- |
-.IP "\fB-l\fP, \fB--list\fP" |
-(since version 0.5) List subtitles for |
-.I TITLE |
-using |
-.BR mplayer (1) |
-and exit. If |
-.I TITLE |
-is not provided or |
-.RB ` - ', |
-list subtitles for title #2 (as title #1 may be an intro without subtitles) and |
-exit. |
- |
-.IP "\fISOURCE\fP" |
-Video DVD data source, i.e. a device |
-.RI "(usually " /dev/dvd ), |
-a directory e.g. one containing content created via |
-.BR dvdbackup (1), |
-or a Video DVD image file. |
-.br |
-If |
-.RB ` - ', |
-a previously created subtitle stream file named |
-\fBsubtitle_stream-\fP*\fB-\fP\fITITLE\fP-\fISUBTITLE\fP |
-in the current working directory will be used for only the |
-stream-to-graphics-to-text conversion instead. Both |
-.I TITLE |
-and |
-.I SUBTITLE |
-must not be |
-.BR ` - ' |
-in that case. |
-.br |
-The default is |
-.RI ` /dev/dvd '. |
- |
-.IP "\fB-t\fP, \fB--title\fP \fITITLE\fP" |
-Number of the title (1-n) which will be accessed for subtitle stream extraction. |
-If omitted or |
-.RB ` - ', |
-the program uses |
-.BR mplayer (1) |
-to detect how many titles are available on the DVD data source and asks for the |
-title to be accessed. |
- |
-.IP "\fB-s\fP, \fB--subtitle-id\fP \fISUBTITLE\fP" |
-ID of the subtitle stream to be extracted (0-n). If omitted or |
-.RB ` - ', |
-the program uses its |
-.B -l |
-option (or |
-.BR mplayer (1) |
-directly, before version 0.5) to detect which subtitles are available for the |
-given TITLE and asks for the ID to be used. |
- |
-.IP "\fB-o\fP, \fB--output-target\fP \fITARGET\fP" |
-Name of the resulting subtitles text file. If not provided or |
-.RB ` - ', |
-the file is named after the subtitle stream file. |
- |
-.RS |
-Versions prior to 0.6 appended the filename suffix |
-.B .txt |
-automagically always, and version 0.6 appended this suffix only if this option |
-was not provided; since version 0.6.1, the filename suffix |
-.B .srt |
-(SubRip text) is appended in that case. |
- |
-.PP |
-If the file already existed, behavior depends on the program version. |
- |
-.IP "Since version 0.6.1:" |
-The program asks whether the file should be overwritten, new content should |
-be appended to it (including a marker identifying the start of new content), |
-or if a new file should be created. If the latter, the name of new file |
-includes the ID of the |
-.B dvdsubtitles |
-process which created it. |
- |
-.IP "Version 0.6:" |
-The program asks whether the file should be overwritten. If no, a new file |
-is created, its name including the ID of the |
-.B dvdsubtitles |
-process which created it. |
- |
-.IP "Versions prior to 0.6:" |
-New content is appended to the file without marker. |
-.RE |
- |
-.IP "\fB-g\fP, \fB--grey-levels\fP \fIGREY_LEVELS\fP" |
-Optional grey-levels value `\fIc0\fP,\fIc1\fP,\fIc2\fP,\fIc3\fP' with 0 <= |
-.I cN |
-<= 255, where 0 means black and 255 means white. |
- |
-.RS |
-.PP |
-DVD subtitles allow up to 4 colors. The comma-separated arguments to this |
-option specify the grey level for each these colors that are used for converting |
-the subtitle stream graphics into plain text via OCR. The default is |
-.RB ` 255,255,0,255 '. |
-The values |
-.RB ` 255,0,255,255 ', |
-.RB ` 255,255,255,0 ', |
-and |
-.RB ` 0,255,255,255 ' |
-can also produce viable OCR input. |
- |
-.PP |
-Use solid (not outlined) shapes as input when possible to make things easier |
-for the |
-.BR gocr (1) |
-program. It will ask you about a character if it does not recognize it; if |
-that has an outlined shape, you are advised to cancel the OCR process (with |
-Ctrl+C). This program will then allow you to use another grey-levels value |
-without the need to extract the subtitle stream again. |
- |
-.PP |
-See the README file of the |
-.B subtitleripper |
-package and of the |
-.B subtitle2pgm |
-program, which -c option requires this value, for details. (See FILES below.) |
-.RE |
- |
-.IP "\fB-h\fP, \fB--help\fP" |
-Display this help and exit. |
- |
-.IP "\fB-V\fP, \fB--version\fP" |
-Display version information and exit. |
- |
- |
-.SH "EXIT STATUS" |
- |
-.TP |
-.B " 0" |
-Successful program execution |
- |
-.TP |
-.B " 1" |
-Error detecting/extracting subtitle stream, or cancelled without selecting a |
-title number or subtitle ID |
- |
-.TP |
-.B " 2" |
-Unable to convert subtitle stream to image files |
- |
-.TP |
-.B " 3" |
-Cancelled due to |
-.BR gocr (1) |
-error or without entering another grey-levels value |
- |
-.TP |
-.B " 4" |
-Unable to compile to text file |
- |
-.TP |
-.B " 5" |
-Unable to clean up |
- |
-.TP |
-.B "127" |
-Insufficient number of arguments / help was displayed |
- |
- |
-.SH FILES |
-.TP |
-.I /usr/share/doc/subtitleripper/README.gz |
-Location of the |
-.B subtitleripper |
-package README on Debian systems |
- |
-.TP |
-.I /usr/share/doc/subtitleripper/README.subtitle2pgm.gz |
-Location of the |
-.B subtitle2pgm |
-program README on Debian systems |
- |
- |
-.SH NOTES |
-Tested with GNU/Linux 2.4.31 and 2.6.1.13 to .15 |
-.B [1] |
-(Debian |
-.B [2] |
-Sarge). |
- |
-.PP |
-.B [1] |
-.RI < http://kernel.org/ > |
-.br |
-.B [2] |
-.RI < http://debian.org/ > |
- |
- |
-.SH BUGS |
-Please send comments and bug reports to |
-.RI < dvd@PointedEars.de >. |
- |
- |
-.SH "LEGAL NOTICE" |
-Copyright (c) 2005, 2006 Thomas Lahn <dvd@PointedEars.de> |
-.PP |
-This program is free software; you can redistribute it and/or modify it |
-under the terms of the GNU General Public License as published by the |
-Free Software Foundation; either version 2 of the License, or (at your |
-option) any later version. |
-.PP |
-This program is distributed in the hope that it will be useful, but |
-WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
-or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
-(GPL) for more details. |
- |
-You should have received a copy of the GNU GPL along with this program |
-.RI ( COPYING " file);" |
-if not, go to |
-.B [1] |
-or write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
-Boston, MA 02110-1301, USA. |
-.PP |
-.B [1] |
-.RI < http://www.gnu.org/licenses/licenses.html#GPL > |
-.PP |
-.br |
--- |
-.br |
-Standard shell script disclaimer blurb thing: |
- |
-This script is a hack. It's brute force. It's horrible. |
-It doesn't use Artificial Intelligence. It doesn't use Virtual Reality. |
-It's not perl. It's not python. It probably won't work unchanged on |
-the "other" thousands of unices. But it worksforme. --ramiro |
-.br |
-(from |
-.IR /usr/local/mozilla/run-mozilla.sh ) |
- |
- |
-.SH CREDITS |
-Thanks to Boris 'bolau' Lau <mail@bolau.de> for translation support, |
-and to Erkan Yanar <erkan.yanar@t-online.de> for pointing out how to |
-use |
-.BR sed (1) |
-to replace a filename with the file content. |
- |
- |
-.SH AVAILABILITY |
-The author's latest version can be obtained from |
-.br |
-.RI < http://PointedEars.de/tools/multimedia/dvd/ >. |
- |
- |
-.SH "SEE ALSO" |
- |
-.BR dvdbackup (1), |
-.BR gocr (1), |
-.BR mplayer (1), |
-.BR pgm2txt , |
-.BR sed (1), |
-.BR srttool " and " subtitle2pgm |
-(from <\fIhttp://subtitleripper.sourceforge.net/\fP>), |
-.BR tccat (1), |
-.BR tcextract (1) |
Index: tools/multimedia/dvd/dvdsubtitles/dvdsubtitles |
=================================================================== |
--- tools/multimedia/dvd/dvdsubtitles/dvdsubtitles (revision 20) |
+++ tools/multimedia/dvd/dvdsubtitles/dvdsubtitles (nonexistent) |
@@ -1,644 +0,0 @@ |
-#!/bin/sh |
-appname="${0##*/}" |
-ver="0.6.1.2006031907" |
-copy="2005, 2006" |
-mail_feedback="dvd@PointedEars.de" |
-# ---------------------------------------------------------------------------- |
-# DVD Subtitles 0.6.1 -- Extracts subtitles from Video DVD data to a text file |
-# Copyright (C) 2005, 2006 Thomas Lahn <PointedEars@gmx.de> |
-# |
-# This program is free software; you can redistribute it and/or modify it |
-# under the terms of the GNU General Public License (GPL) as published |
-# by the Free Software Foundation; either version 2 of the License, or |
-# (at your option) any later version. |
-# |
-# This program is distributed in the hope that it will be useful, |
-# but WITHOUT ANY WARRANTY; without even the implied warranty of |
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
-# GNU General Public License for more details. |
-# |
-# You should have received a copy of the GNU GPL along with this |
-# program; if not, write to the Free Software Foundation, Inc., |
-# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
-# |
-## Standard shell script disclaimer blurb thing: |
-## |
-## This script is a hack. It's brute force. It's horrible. |
-## It doesn't use Artificial Intelligence. It doesn't use Virtual Reality. |
-## It's not perl. It's not python. It probably won't work unchanged on |
-## the "other" thousands of unices. But it worksforme. --ramiro |
-# (from /usr/local/mozilla/run-mozilla.sh) |
-# |
-# This is work in progress. If you have an improvement, patch, |
-# idea, whatever, on how to make this script better, please |
-# send it to <dvd@PointedEars.de> |
- |
-_title () |
-{ |
- echo "\ |
-${extd}DVD Subtitles $ver |
-Copyright (C) $copy Thomas Lahn <$mail_feedback>$norm |
-Distributed under the terms of the GNU General Public License (GPL), see |
-COPYING file or http://www.gnu.org/licenses/licenses.html#GPL for details. |
-" |
-} |
- |
-_help () |
-{ |
- echo "\ |
-Extracts a subtitle stream from Video DVD data and converts it to a text file. |
- |
-$extd$appname$norm [options] ${ital}SOURCE$norm |
-$extd$appname$norm [$extd-hVkl$norm] [${ital}SOURCE$norm [${ital}TITLE$norm\ |
- [${ital}SUBTITLE$norm [${ital}TARGET$norm [${ital}GREY_LEVELS$norm]]]]] |
- |
-Any option argument is overwritten by the respective additional program |
-argument. Options may be given in any order, and are also considered |
-options if located after the first program argument. Too many program |
-arguments are silently ignored. |
- |
-$extd-c$norm, $extd--compile$norm ${ital}FILE$norm | ${ital}DIRECTORY$norm |
- Compile subtitle text files according to subtitle index\ |
- ${ital}FILE$norm |
- or to subtitle index files in ${ital}DIRECTORY$norm to\ |
- ${ital}TARGET$norm. Clean up if this is successful, then exit. |
- |
-$extd-k$norm, $extd--keep$norm Keep subtitle stream file even if\ |
- conversion is successful. |
- |
-$extd-l$norm, $extd--list$norm List subtitles for TITLE using\ |
- ${extd}mplayer$norm(1) and exit. |
- If TITLE is not provided or \`$extd-$norm', list subtitles for |
- title #2 (as title #1 may be an intro without subtitles) |
- and exit. |
- |
-SOURCE Video DVD data source, i.e. a device (usually /dev/dvd), |
- a directory (e.g. one containing content created via |
- ${extd}dvdbackup$norm(1)) or a Video DVD image file. |
- If \`$extd-$norm', a previously created subtitle stream file\ |
- named |
- ${extd}subtitle_stream-$norm*$extd-${norm}TITLE${extd}-${norm}SUBTITLE\ |
- in the current working |
- directory will be used for only the stream-to-graphics- |
- to-text conversion instead. Both TITLE and SUBTITLE |
- must not be \`$extd-$norm' in that case. |
- The default is \`$extd/dev/dvd$norm'. |
- |
-$extd-t$norm, $extd--title$norm |
- TITLE Number of the title (1-n) which will be accessed for |
- subtitle stream extraction. If left out or \`$extd-$norm', the |
- program uses ${extd}mplayer$norm(1) to detect how many titles are |
- available on the DVD data source and asks for the |
- title to be accessed. |
- |
-$extd-s$norm, $extd--subtitle-id$norm |
- SUBTITLE ID of the subtitle stream to be extracted (0-n). |
- If left out or \`$extd-$norm', the program uses its\ |
- ${extd}-l$norm option to detect |
- which subtitles are available for the given TITLE and asks |
- for the ID to be used. |
- |
-$extd-o$norm, $extd--output-target$norm |
- TARGET Name of the resulting subtitles text file. |
- If not provided, the file is named after the subtitle stream |
- file. NOTE: Unlike previous versions, this version appends |
- the filename suffix $extd.srt$norm automagically ONLY in that\ |
- case. |
- |
-$extd-g$norm, $extd--grey-levels$norm |
- GREY_LEVELS Optional grey-levels value\ |
- (\`c0$extd,${norm}c1$extd,${norm}c2$extd,${norm}c3' with 0 <= cN <= 255, |
- where 0 is black and 255 is white) to be used for converting |
- the subtitle stream graphics to text via OCR. The default is |
- \`${extd}255,255,0,255$norm'. Unfortunately, the\ |
- ${extd}subtitle2pgm$norm program, |
- which requires this value, appears to be poorly documented; |
- if you find a more detailed, working documentation, please |
- refer to it and inform this program's author about it. |
- |
-$extd-h$norm, $extd--help$norm Display this help and exit. |
-$extd-v$norm, $extd--verbose$norm Be verbose. The number of ${extd}-v$norm\ |
- options specify the level of |
- verbosity. |
-$extd-V$norm, $extd--version$norm Display version information and exit. |
- |
-${extd}EXIT STATUS$norm |
- ${extd} 0$norm Successful program execution |
- ${extd} 1$norm Error detecting/extracting subtitle stream, or cancelled |
- without selecting a title number or subtitle ID |
- ${extd} 2$norm Unable to convert subtitle stream to image files |
- ${extd} 3$norm Cancelled due to ${extd}gocr$norm(1) error or without\ |
- entering another |
- grey-levels value |
- ${extd} 4$norm Unable to compile to text file |
- ${extd} 5$norm Unable to clean up |
- ${extd}127$norm Insufficient number of arguments / help was displayed |
- |
-See the $extd$appname$norm(1) manpage for complete documentation." |
-} |
- |
-if test -z "$LINES" -o -z "$COLUMNS" ; then |
- eval `stty size 2>/dev/null | (read L C; \ |
- echo LINES=${L:-24} COLUMNS=${C:-80})` |
-fi |
-test $LINES -eq 0 && LINES=24 |
-test $COLUMNS -eq 0 && COLUMNS=80 |
- |
-if test "$TERM" != "raw" && stty size >/dev/null 2>&1 ; then |
-# esc=`echo -en "\033"` |
-# extd="${esc}[1m" |
- extd=`tput bold 2>/dev/null` |
- ital=`tput sitm 2>/dev/null` |
-# norm=`echo -en "${esc}[m\017"` |
- norm=`tput sgr0 2>/dev/null` |
-else |
- esc="" |
- extd="" |
- norm="" |
-fi |
- |
-# Note that we use `"$@"' to let each command-line parameter expand to a |
-# separate word. The quotes around `$@' are essential! |
-# We need `tmp' as the `eval set --' would nuke the return value of getopt. |
- |
-[ "$1" = "-vv" ] && echo "$extd |
-Debug output for POSIX conform command-line parsing |
- |
-Original arguments: $*" >&2 |
-if `getopt -T >/dev/null 2>&1` ; [ $? = 4 ] ; then |
- getopt_type=long |
- [ "$1" = "-vv" ] && echo "getopt(1) type: enhanced" >&2 |
- tmp=`getopt -o c:klg:o:S::s:t:hVv \ |
- -l compile:,keep-stream,list,grey-levels:,output-target:\ |
-,spell-check,subtitle-id:,title:,help,verbose,version \ |
- -n "$appname" -s sh \ |
- -- "$@"` |
-else |
- getopt_type=short |
- [ "$1" = "-vv" ] && echo "getopt(1) type: old" >&2 |
- tmp=`getopt c:klg:o:S:s:t:hVv "$@"` |
-fi |
- |
-# exit status |
-ESUCCESS=0 |
-ECANTEXTRACT=1 |
-ECANTCONVERT=2 |
-EOCRERROR=3 |
-ECANTCOMPILE=4 |
-ECANTCLEANUP=5 |
-EARGERROR=127 |
- |
-getopt_exit_code=$? |
-help=0 |
-verbose=0 |
-version=0 |
-list=0 |
-source='/dev/dvd' |
-title='-' |
-sid='-' |
-target='-' |
-args='' |
-keep=0 |
-compile=0 |
-if [ $getopt_exit_code -eq 0 ]; then |
-## getopt returns error code 0 for successful parsing, 1 if |
-## getopt(3) returns errors, 2 if it does not understand its |
-## own parameters, 3 if an internal error occurs like out-of- |
-## memory, and 4 if it is called with -T. |
-# |
-# Note the quotes around `$tmp': they are essential! |
-# echo $tmp |
-# remove "--" |
-# for i in $tmp; do if [ "$i" != "--" ]; then tmp2="${tmp2} $i"; fi; done |
- eval set -- "$tmp" |
- [ "$1" = "-vv" ] && echo "New arguments: $*$norm |
-" >&2 |
- while true ; do |
- case "$1" in |
- -h | --help) |
- help=1 |
- shift;; |
- |
- -v | --verbose) |
- let verbose++ |
- shift;; |
- |
- -V | --version) |
- version=1 |
- shift;; |
- |
- -c | --compile) |
- compile=1 |
- source=$2 |
- shift 2;; |
- |
- -k | --keep) |
- keep=1 |
- shift;; |
- |
- -l | --list) |
- list=1 |
- shift;; |
- |
- -g | --grey-levels) |
- grey_levels=$2 |
- shift 2;; |
- |
- -o | --output-target) |
- target=$2 |
- shift 2;; |
- |
- -s | --subtitle-id) |
- sid=$2 |
- shift 2;; |
- |
- -t | --title) |
- title=$2 |
- shift 2;; |
- |
- --) |
- shift |
- break;; |
- esac |
- done |
- [ -n "$*" ] && args=$args" $*" |
- set -- $args |
-else |
- [ $verbose -gt 1 ] && echo "getopt exited: $getopt_exit_code |
- " >&2 |
- if [ $getopt_exit_code -eq 1 -o $getopt_exit_code -eq 2 ]; then |
- help=1 |
- else |
- exit $getopt_exit_code |
- fi |
-fi |
- |
-[ $list -eq 0 ] && _title |
-[ $version -eq 1 ] && exit $ESUCCESS |
-[ $help -eq 1 ] && |
-{ |
- _help "$0" |
- exit $EARGERROR |
-} |
- |
-result=$ESUCCESS |
-[ $compile -eq 0 ] && |
-{ |
- [ -n "$1" ] && source=$1 |
- [ -z "$title" -a -n "$2" ] && title=$2 |
- [ -z "$sid" -a -n "$3" ] && sid=$3 |
- [ -z "$target" -a -n "$4" ] && target=$4 |
- [ -z "$grey_levels" -a -n "$5" ] && grey_levels=$5 |
- |
- getsubtitles () |
- { |
- mplayer -dvd-device "$1" -vo null -ao null -frames 0 \ |
- -v "dvd://${2:-2}" 2>&1 | |
- sed -n '/sid/ s/^[^:]\{1,\}:[[:space:]]//p' |
- # echo "$subtitles" |
- } |
- |
- [ $list -eq 1 ] && |
- { |
- # first title may be only an intro |
- [ "$title" = '-' ] && title=2 |
- tmp=`getsubtitles $source $title` |
- if [ -n "$tmp" ]; then |
- echo "${extd}The following subtitles are available for title #$title:$norm |
-$tmp" |
- exit $ESUCCESS |
- else |
- exit $ECANTEXTRACT |
- fi |
- } |
- |
- [ "$sid" != '-' -a "$title" != '-' ] && |
- { |
- subtitles=`getsubtitles $source $title` |
- [ -n "$subtitles" ] && |
- st_descr=`echo "$subtitles" | grep "^$sid[[:space:]]" | |
- cut -f 2- -d ' '` |
- } |
- |
- if [ "$source" = '-' ]; then |
- stream_file=`ls subtitle_stream-*-$title-$sid 2>/dev/null | head -n 1` |
- if [ $? -eq 0 ]; then |
- read -r -s -p "Use '$stream_file' [Y/n]? " -n 1 |
- case $REPLY in |
- [Nn]) |
- echo $REPLY |
- exit 1;; |
- *) |
- echo Y |
- esac |
- echo |
- |
- id=${stream_file#*-} |
- else |
- echo "$appname: No such file: subtitle_stream-*-$title-$sid" >&2 |
- exit $ECANTEXTRACT |
- fi |
- else |
- read_error () |
- { |
- case $1 in |
- 0) subject='titles available on this DVD source.';; |
- *) subject='subtitles available for this title.';; |
- esac |
- |
- echo >&2 "\ |
-Sorry, there are no $subject |
-Please verify that the DVD data source is available and |
-that its filesystem is consistent." |
- |
- unset subject |
- exit $ECANTEXTRACT |
- } |
- |
- if [ "$title" = '-' ]; then |
- titles=`mplayer -dvd-device "$source" -vo null -ao null -frames 0 \ |
- -v dvd:// 2>&1 | egrep '[0-9]+ titles'` |
- num_titles=`echo "$titles" | awk '{print $3}'` |
- |
- [ $(($num_titles)) -lt 1 ] && read_error 0 |
- |
- echo "$titles" |
- while true |
- do |
- read -r -p "\ |
-${extd}Enter title# (1-$num_titles), or nothing to abort: $norm" |
- if [ -n "$REPLY" ]; then |
- title=$(($REPLY)) |
- [ $title -ge 1 -a $title -le $num_titles ] && break |
- else |
- exit $ECANTEXTRACT |
- fi |
- done |
- echo |
- fi |
- |
- if [ "$sid" = '-' ]; then |
- if [ -z "$subtitles" ]; then subtitles=`"$0" -lt "$title" "$source"`; fi |
- if [ $? -eq 0 ]; then |
- sid_max=`echo "$subtitles" | tail -n 1 | awk '{print $1}'` |
- echo "$subtitles" |
- while true; do |
- read -r -p "\ |
-${extd}Enter ID of subtitle stream (0-$sid_max) to extract, or nothing to abort: $norm" |
- if [ -n "$REPLY" ]; then |
- sid=$(($REPLY)) |
- [ $sid -ge 0 -a $sid -lt $sid_max ] && break |
- else |
- exit $ECANTEXTRACT |
- fi |
- done |
- else |
- read_error 1 |
- fi |
- fi |
- |
- # remove trailing / |
- source=${source%/} |
- |
- vol=`(echo $(volname $source 2>/dev/null); exit $?;) || echo ${source##*/}` |
- id=$vol-$title-$sid |
- stream_file=subtitle_stream-$id |
- |
- unset REPLY |
- [ -f "$stream_file" ] && |
- { |
- read -r -s -p "${extd}Use existing '$stream_file' [Y/n]? $norm" -n 1 |
- case $REPLY in |
- [Nn]) |
- echo $REPLY |
- read -r -s -p "${extd}Overwrite existing '$stream_file' [y/N]? $norm"\ |
- -n 1 REPLY2 |
- case $REPLY2 in |
- [Yy]) echo $REPLY2;; |
- *) |
- echo N |
- id=$vol-$title-$sid-$$ |
- stream_file=subtitle_stream-$id |
- echo "Using '$stream_file'" |
- esac |
- echo |
- unset REPLY2;; |
- *) |
- echo Y |
- REPLY='y' |
- esac |
- echo |
- } |
- |
- [ "$target" = '-' ] && target="$stream_file.srt" |
- |
- [ -z "$REPLY" -o "$REPLY" == 'N' -o "$REPLY" == 'n' ] && |
- { |
- echo "\ |
-${extd}Extracting subtitle stream $norm$sid${st_descr:+ ($st_descr)}$extd |
-of title $norm#$title$extd |
-on $norm$source$extd |
-to \"$norm$target$extd\" ...$norm |
-" >&2 |
- |
- > "$stream_file" |
- tccat -i "$source" -T "$title" -L | |
- tcextract -x ps1 -t vob -a 0x2$sid > "$stream_file" |
- } |
- fi |
- |
- if [ -f "$stream_file" -a -s "$stream_file" ]; then |
- echo "${extd}... done.$norm" |
- else |
- echo "${extd}... failed.$norm" |
- [ -f "$stream_file" ] && rm ./"$stream_file" |
- exit $ECANTEXTRACT |
- fi |
- |
- result=$ESUCCESS |
- while true |
- do |
- echo -n " |
-${extd}Converting subtitle stream \"$norm$stream_file$extd\" |
-to Netpbm Portable Greymaps (PGMs) ... $norm" | fold -s >&2 |
- subtitle2pgm -o ./${id}- ${grey_levels:+-c "$grey_levels"} < $stream_file |
- result=$? |
- if [ $result -eq 0 ]; then |
- echo "${extd}done.$norm |
- |
-${extd}Converting PGMs to text files (TXTs) using GNU OCR (gocr) ... $norm" |
- st_lang=$(echo "$st_descr" | sed 's/.*language: \([a-z]\{2\}\)/\1/') |
- pgm2txt ${st_lang:+-f $st_lang} ./${id}- |
- result=$? |
- if [ $result -eq 0 ]; then |
- echo "${extd}done, using a grey-levels value of\ |
- \`$norm${grey_levels:-255,255,0,255}$extd'.$norm" |
- break |
- else |
- echo "${extd}failed. |
- |
-If the conversion was cancelled due to inappropriate grey-levels value |
-\`${grey_levels:-255,255,0,255}', you may try another value,\ |
- else you should abort: |
-$norm" |
- select grey_levels in \ |
- `[ "$grey_levels" != '0,255,255,255' ] && echo 0,255,255,255` \ |
- `[ "$grey_levels" != '255,0,255,255' ] && echo 255,0,255,255` \ |
- `[ -n "$grey_levels" -a "$grey_levels" != '255,255,0,255' ] && |
- echo 255,255,0,255` \ |
- `[ "$grey_levels" != '255,255,255,0' ] && echo 255,255,255,0` \ |
- Other \ |
- Abort |
- do |
- case $grey_levels in |
- Other) |
- read -r -p " |
-${extd}Enter new value (\`c0$extd,${norm}c1$extd,${norm}c2$extd,${norm}c3'\ |
- with 0 <= cN <= 255), or nothing to select a value: |
-$norm" grey_levels |
- [ -n "$grey_levels" ] && break;; |
- |
- Abort) |
- result=$EOCRERROR |
- break;; |
- |
- *) |
- break |
- esac |
- done |
- fi |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCONVERT |
- break |
- fi |
- done |
- |
- echo -n "${extd}Cleaning up PGMs ... $norm" |
- rm ./${id}-*.pgm |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- fi |
-} |
- |
-[ $result -eq $ESUCCESS ] && |
-{ |
- if [ $compile -eq 1 ]; then |
- try_file () |
- { |
- [ ! -f "$source" ] && source="$source.srtx" |
- [ -f "$source" ] |
- } |
- |
- if [ -d "$source" ]; then |
-# TODO: loop through all .srtx files in the directory |
- if [ "$source" != '.' ]; then cd "$source"; fi |
- [ $? -eq 0 ] && |
- { |
- ls "$source"/*.srtx 2>/dev/null |
- } |
- echo >&2 "$appname: $source: Directory compile is not yet supported." |
- exit $ECANTCOMPILE |
- elif try_file; then |
- d=${source%/*} |
- if [ -a -d "$d" -a "$d" != '.' ]; then cd "$d"; fi |
- id=${source%-*} |
- stream_file=subtitle_stream-$id |
- source="./${source##*/}" |
- else |
- echo >&2 "$appname: $source: No such file or directory." |
- exit $ECANTCOMPILE |
- fi |
- else |
- source="${id}-.srtx" |
- fi |
- |
- unset REPLY |
- [ -f "$target" ] && |
- { |
-# TODO: allow for diff |
- read -r -s -p "${extd}'$target' exists. |
-Append, overwrite, create new file, or abort [a/o/n/Esc]? $norm" \ |
- -n 1 |
- case $REPLY in |
- [Oo]) echo $REPLY;; |
- [Aa]) echo $REPLY;; |
- [Nn]) |
- echo $REPLY |
- target="${target%.*}-$$.${target##*.}";; |
- *) |
- REPLY=Abort |
- echo $REPLY |
- exit $ECANTCOMPILE;; |
- esac |
- } |
- |
- echo " |
-${extd}Compiling TXTs into \"$norm$target$extd\" ... $norm" |
- |
- case "$REPLY" in |
- [Oo]) > "$target";; |
- [Aa]) |
- # append new content marker here |
- echo " |
--- `whoami`@`hostname` -- `date` -- |
-" >> "$target" |
- esac |
- |
- ( |
-# sed: thx to Erkan Yanar <erkan.yanar@t-online.de>, see |
-# message ID <lduohb.v74.ln@510002093148-0001.dialin.t-online.de> |
- srttool -s -i "$source" |
- |
- # only if srttool is not available |
- if [ $? -gt 1 ]; then |
- sed -n 's,^\(\([^/]*\)\(/\)\(.*\.pgm\.txt\)\)$,/^\2\\\3\4$/ { \ |
- r \1 \ |
- d \ |
- },gp' "$source" | sed -f - "$source" |
- fi |
- ) >> "$target" |
- |
- if [ $? -eq 0 ]; then |
- echo "${extd}... done.$norm" |
- else |
- echo "${extd}... failed.$norm" |
- exit $ECANTCOMPILE |
- fi |
- |
- echo -n "${extd}Cleaning up |
- ${id}-*.pgm.txt files ... $norm" |
- rm ./"${id}"-*.pgm.txt |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- |
- echo -n " ${extd}Subtitle index file '${id}-.srtx' ... $norm" |
- rm ./"${id}-.srtx" # "$target.srtx" |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- |
- [ $keep -eq 0 -a -f "./$stream_file" ] && |
- { |
- echo -n " ${extd}Subtitle stream file '${stream_file}' ... $norm" |
- rm ./"$stream_file" |
- |
- if [ $? -eq 0 ]; then |
- echo "${extd}done.$norm" |
- else |
- echo "${extd}failed.$norm" |
- result=$ECANTCLEANUP |
- fi |
- } |
- |
- exit $result |
-} |