#!/bin/bash
#=================================boilerplate==================================
scriptfull="`dirname "$0"`/`basename "$0"`"
green=`tput setaf 2`
reset=`tput sgr0`

if [ "$#" -gt 1 ]
then
    for arg in "$@"
    do
        /bin/bash "${scriptfull}" "${arg}"
    done
    exit
fi

pbfDirname="`dirname "$1"`"
pbfFullname="`basename "$1"`"
pbfext="${pbfFullname##*.}"
name="${pbfFullname%.*}"

echo "dir : $pbfDirname"
echo "name : $name"
echo "ext : $pbfext"

if [ "${name}" == "*" ]
then
    echo "오류 : 인수가 잘못됐거나 대상 파일이 없음."
    echo "존재하지 않음 : ${pbfDirname}/${name}.${pbfext}"
    exit
fi

if [ "${pbfext}" != "pbf" ]
then
    echo "오류 : 인수가 잘못됨. *.pbf 파일명을 인수로 입력해야 함."
    exit
fi

originalVideo=`find "${pbfDirname}/" -type f -not -name "*.pbf" -name "${name}.*"`
if [ `echo "${originalVideo}" | wc -l` -gt "1" ] 
then
    echo "오류 : 챕터 삽입 대상 비디오가 두개 이상임."
    echo "${originalVideo}"
    exit
fi
originalVideoExt="${originalVideo##*.}"
chapteredVideo="${pbfDirname}/${name} chaptered.${originalVideoExt}"
if [ -e "${chapteredVideo}" ]
then
    echo "오류 : 챕터 삽입된 비디오가 이미 존재함."
    echo "${chapteredVideo}"
    exit
fi

#====================================start=====================================

function getffmetadata(){
    local video="$1"

    local tmpfile=$(mktemp /tmp/pbfimport.XXXXXX)
    trap "rm -f $tmpfile" 0 2 3 15

    ffmpeg -y -i "${video}" -f ffmetadata "${tmpfile}"
    local ffmetadata=$(cat "${tmpfile}")
    rm -rf ${tmpfile}

    echo "${ffmetadata}"
}

function pbf2ffmetadata(){
    local pbf="$1"
    # read .pbf, parsing data and convert to FFMETADATA file format. 
    # https://ffmpeg.org/ffmpeg-formats.html#Metadata-1
    # perl -e 'undef $/;$_=<>;print ";FFMETADATA1\n";print' | \
    local ffmetadata=`iconv -f UTF-16 -t UTF-8 "${pbf}" | \
        egrep "^[0-9]+=[0-9]+\*[^*]+\*" | \
        perl -p -ne 's/(^[0-9]+)=([0-9]+)\*([^*]+)\*[^*]*$/[CHAPTER]\nTIMEBASE=1\/1000\nSTART=$2\nEND=$2\ntitle=$3\n/g'`
    echo "${ffmetadata}"
}

ffmetadata_old=$(getffmetadata "${originalVideo}")
ffmetadata_pbf=$(pbf2ffmetadata "${pbfDirname}/${pbfFullname}")
ffmetadata_merged=`echo -e "${ffmetadata_old}\n${ffmetadata_pbf}"`

echo -e "OLD : \n${ffmetadata_old}"
echo -e "PBF : \n${ffmetadata_pbf}"
echo -e "MGD : \n${ffmetadata_merged}"

# merge FFMETADATA and video by using ffmpeg
echo "${ffmetadata_merged}" | ffmpeg -i "${originalVideo}" -i pipe: -codec copy  -map_chapters -1 -map_chapters 1 "${chapteredVideo}"

# done, rename notice
echo "####################################################################################"
echo ".pbf chapter imported."
echo "To overwrite legacy file, run ${green}\"rename -f 's/^(.+)( chaptered)\.([^.]+)$/\$1.\$3/' ${pbfDirname}/*\"${reset}"
echo "####################################################################################"
