All pastes #453449 Raw Edit

shindig

public text v1 · immutable
·published 2007-04-23 00:35 UTC
rendered paste body
#!/bin/bash

###############################################
# shindig.sh 0.1                              
# This little script converts chapter times   
# exported from Metadata Hootenanny into a    
# format readable by the mkvtoolnix utilities 
###############################################
# It accepts one command-line argument, the   
# path to the Hootenanny output .txt to read  
###############################################

INPUTFILE="$1"

#############
# SED STUFF 
#############

# First, ignoring the extra font info for QT on Hootenanny's first line, as
# well as the chapter title lines, chop off [ and ] from the timecode lines,
# and store them in the TIMECODE array for later use.
#------------------------------------------------------------------------------
# Also, the timecodes need 0 appended, because Matroska expects one more
# digit of precision than .mov does.
TIMECODE=($(cat $INPUTFILE | sed -e 's/\[//' -e 's/\]/0/' -e '/^Chapter*/ d' -e '/{QT*/ d'))

# Then, ignoring the extra font info for QT on Hootenanny's first line, as
# well as the timecode lines, store the titles in TITLE for later use.
TITLE=($(cat $INPUTFILE | sed -e 's/\(Chapter*\)/\1/' -e '/^\[/ d' -e '/{QT*/ d'))

#############
# LOOP PREP 
#############

# For the timecode index and the loop.
ITERATOR1=0
# For the chapter title index.
ITERATOR2=0

# We want to iterate through based on the number of timecodes stored
# in the TIMECODE array.
CHAPTERNUM=$(echo ${#TIMECODE[*]})

# And yet, we don't want the last chapter marker from Hootenanny,
# because it's just the last frame of the video. So decrement.
CHAPTERNUM=$((CHAPTERNUM-1))

# This xml header text only needs to be at the top, so
# throw it in before the loop starts.
echo -e "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>"
echo -e "<!DOCTYPE Chapters SYSTEM \"matroskachapters.dtd\">"
echo -e "<Chapters>"
echo -e "<EditionEntry>"

#######################################
# LOOPING, WHERE THE REAL WORK'S DONE 
#######################################

# Loop through all the chapters.
while [ $ITERATOR1 -lt $CHAPTERNUM ]
do
    echo -e "<ChapterAtom>"
    echo -e "<ChapterTimeStart>"

    # The \t is just so the output is a little clearer.
    # Can't seem to get this stuff to all output on one
    # line, so tabs at least make it legible.
    echo -e "\t" ${TIMECODE[$ITERATOR1]}

    echo -e "</ChapterTimeStart>"
    echo -e "<ChapterDisplay>"

    # Timecode written, it's on to the title.
    
    echo -e "<ChapterString>"
    
    # Again, a tab for legibility.
    # Then, two words from the title array.
    echo -e "\t" ${TITLE[$ITERATOR2]} ${TITLE[$ITERATOR2+1]}

    echo -e "</ChapterString>"
    echo -e "<ChapterLanguage>eng</ChapterLanguage>"
    echo -e "</ChapterDisplay>"
    echo -e "</ChapterAtom>"

    # Iterate the timecodes and the loop by one.
    ITERATOR1=$((ITERATOR1+1))
    
    # Because Hootenanny uses two-word title names,
    # and each word is stored separately in the array,
    # iterate it by two to jump past both words used
    # this time through the loop.
    ITERATOR2=$((ITERATOR2+2))
done

#############
# POST LOOP 
#############

# This is just to close out the xml divs.
echo -e "</EditionEntry>"
echo -e "</Chapters>"