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 |
0,0 → 1,45 |
#!/bin/sh |
|
[ $# -lt 3 ] && { |
echo >&2 "${0##*/} [-g GREY_VALUE] [-p PREFIX] [-s SUFFIX] START SID\ |
TITLES..." |
exit 1 |
} |
|
[ "$1" = '-g' ] && |
{ |
shift |
user_grey=$1 |
[ "$1" == '-' ] && user_grey=255,0,255,255 |
user_grey="-g $user_grey" |
shift |
} |
|
[ "$1" = '-p' ] && |
{ |
shift |
prefix=$1 |
shift |
} |
|
[ "$1" = '-s' ] && |
{ |
shift |
suffix=$1 |
shift |
} |
|
start=$1 |
subtitle=$2 |
shift 2 |
|
sudo dc stop |
i=$(($start)) |
while [ $# -gt 0 ] |
do |
echo |
dvdsubtitles -t $i -s $subtitle $user_grey -o "$prefix$1$suffix" |
let i++ |
shift |
done |
sudo dc start |
Property changes: |
Added: svn:executable |
## -0,0 +1 ## |
+* |
\ No newline at end of property |
Index: trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh |
=================================================================== |
--- trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh (nonexistent) |
+++ trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh (revision 20) |
@@ -0,0 +1,644 @@ |
+#!/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 |
+} |
/trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.sh |
Property changes: |
Added: svn:executable |
## -0,0 +1 ## |
+* |
\ No newline at end of property |
Index: trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 |
=================================================================== |
--- trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 (nonexistent) |
+++ trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles.1 (revision 20) |
@@ -0,0 +1,440 @@ |
+\" 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: trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles |
=================================================================== |
--- trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles (nonexistent) |
+++ trunk/tools/multimedia/dvd/dvdsubtitles/dvdsubtitles (revision 20) |
@@ -0,0 +1,644 @@ |
+#!/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 |
+} |