1
0
Fork 0
mirror of https://github.com/Jonny007-MKD/OTR-SaneRename synced 2025-01-22 08:49:48 +01:00

Move everything into functions to clean it up.

Main function: doIt()
This commit is contained in:
Jonny007-MKD 2014-07-29 14:37:29 +02:00
parent 8eb8d5f1da
commit e8e74d8e69

View file

@ -1,9 +1,20 @@
#!/bin/bash
# TODO: Umlaute werden beim Download der xml über alle serien nicht richtig übergeben. evtl mit %-Code arbeiten # TODO: Umlaute werden beim Download der xml über alle serien nicht richtig übergeben. evtl mit %-Code arbeiten
### CONFIG ### ##########
# Config #
##########
apikey="2C9BB45EFB08AD3B" apikey="2C9BB45EFB08AD3B"
productname="SaneRename for OTR (ALPHA) v0.2" productname="SaneRename for OTR (ALPHA) v0.2"
lang="de"
##########
# Script #
##########
# Print only of not silent
function eecho { function eecho {
if [ -z "$silent" ]; then if [ -z "$silent" ]; then
echo "$1" "$2" "$3" echo "$1" "$2" "$3"
@ -11,35 +22,17 @@ function eecho {
} }
### Check input ###
while getopts "f:l:s" optval; do # Parse the parameters
function funcParam {
while getopts "f:l:s" optval; do
case $optval in case $optval in
"f") "f") # Path to file
path=$OPTARG;; path="$OPTARG";;
"s") "s") # Silent switch
silent=1;; silent=1;;
"l") "l") # Language
lang="$OPTARG";; case "$OPTARG" in
"?")
echo "Usage: $0 -f pathToAvi [-s] [-l LANG]"
exit;;
":")
echo "No argument value for option $OPTARG"
exit;;
esac
done
eecho " :: $productname"
eecho " :: by Leroy Foerster"
eecho
if [ -z "$path" ]; then
echo "Usage: $0 -f pathToAvi [-s] [-l LANG]"
exit
fi
case "$lang" in
de*) de*)
lang="de";; lang="de";;
en*) en*)
@ -48,75 +41,77 @@ case "$lang" in
lang="en";; lang="en";;
fr*) fr*)
lang="fr";; lang="fr";;
"")
lang="de";;
*) *)
echo "Language not recognized: $lang" echo "Language not recognized: $OPTARG"
exit 11;; exit 11;;
esac esac;;
"?") # Help
echo "Usage: $0 -f pathToAvi [-s] [-l LANG]"
exit;;
":")
echo "No argument value for option $OPTARG"
exit;;
esac
done
}
PwD=$(readlink -e $0) # Print the header
PwD=$(dirname "$PwD") function funcHeader {
eecho " :: $productname"
eecho " :: by Leroy Foerster"
eecho
}
file_name="$(basename $path)" # Get title, date and time
file_suffix="${file_name##*.}" function funcAnalyzeFilename {
file_dir="$(dirname $path)" # Split filename into words, divided by _ (underscores)
file="${file_name//_/ }"
if [ ! -f "$path" ]; then firstField="${file%% *}" # Get the first word
echo "This is no file!" test $firstField -eq 0 2>/dev/null # If first word is a number -> cutlist id
echo "$path" if [ $? -ne 2 ]; then
exit 10 file=${file##$firstField } # remove it
fi fi
file_title=${file%% [0-9][0-9].*} # Cut off everything after the title: date, hour, sender, ...
file_sender=${file##*-[0-9][0-9]} # Cut off everything bevor the sender: title, date, time, ...
# Split filename into fields, divided by _ (underscores) file_date=${file%%$file_sender} # Cut off the sender
file_date=${file_date##$file_title } # Cut off the title, now we do have the date and time
file_time=${file_date##* }
file_date=${file_date%% *}
fields="${file_name//_/ }" file_dateInv=$(date +%d.%m.%Y --date="${file_date//./-}") # Convert YY.MM.DD to DD.MM.YY
file_time=${file_time/-/:} # Convert HH-MM to HH:MM
# If first field is a number (cutlist id) file_title=${file_title// s /\'s } # Replace a single s with 's
firstField="${fields%% *}" if [ "$lang" == "de" ]; then
test $firstField -eq 0 2>/dev/null file_title=${file_title//Ae/Ä} # Replace umlauts
if [ $? -ne 2 ]; then file_title=${file_title//Oe/Ö}
fields=${fields##$firstField } file_title=${file_title//Ue/Ü}
fi file_title=${file_title//ae/ä}
file_title=${file_title//oe/ö}
file_title=${file_title//ue/ü}
fi
fieldsTitle=${fields%% [0-9][0-9].*} # Cut off everything after the title: date, hour, sender, ... eecho -e " Work dir:\t$PwD"
fieldsSender=${fields##*-[0-9][0-9]} # Cut off everything bevor the sender: title, date, time, ... eecho -e " Datum:\t$file_dateInv"
eecho -e " Uhrzeit:\t$file_time"
eecho -e " Titel:\t$file_title"
}
fieldsDate=${fields%%$fieldsSender} # Cut off the sender # Get the series ID from TvDB (needed to fetch episodes from TvDB)
fieldsDate=${fieldsDate##$fieldsTitle } # Cut off the title, now we do have the date and time function funcGetSeriesId {
fieldsTime=${fieldsDate##* } if [ -f "$PwD/series.cache" ]; then # Search the series cache
fieldsDate=${fieldsDate%% *} series_id=$(grep "$file_title" "$PwD/series.cache");
fi
fieldsDateInv=$(date +%d.%m.%Y --date="${fieldsDate//./-}") # Convert YY.MM.DD to DD.MM.YY if [ -n "$series_id" ]; then # And get the TvDB series ID from there
fieldsTime=${fieldsTime/-/:} # Convert HH-MM to HH:MM
fieldsTitle=${fieldsTitle// s /\'s } # Replace a single s with 's
if [ "$lang" == "de" ]; then
fieldsTitle=${fieldsTitle//Ae/Ä} # Replace Umlauts
fieldsTitle=${fieldsTitle//Oe/Ö}
fieldsTitle=${fieldsTitle//Ue/Ü}
fieldsTitle=${fieldsTitle//ae/ä}
fieldsTitle=${fieldsTitle//oe/ö}
fieldsTitle=${fieldsTitle//ue/ü}
fi
eecho -e " Work dir:\t$PwD"
eecho -e " Datum:\t$fieldsDateInv"
eecho -e " Uhrzeit:\t$fieldsTime"
eecho -e " Titel:\t$fieldsTitle"
if [ -f "$PwD/series.cache" ]; then # Search the series cache
series_id=$(grep "fieldsTitle" "$PwD/series.cache");
fi
if [ -n "$series_id" ]; then # And get the TvDB series ID from there
series_title=${series_id%|#|*} series_title=${series_id%|#|*}
series_id=${series_id#*|#|} series_id=${series_id#*|#|}
eecho -e " Cache:\tSeries found.\tID: $series_id" eecho -e " Cache:\tSeries found.\tID: $series_id"
else # Otherwise ask TvDB whether they do know the series else # Otherwise ask TvDB whether they do know the series
# ------------ Series ID abrufen anhand vom Titel der Serie -------------------- ;; # ------------ Series ID abrufen anhand vom Titel der Serie -------------------- ;;
series_db="https://www.thetvdb.com/api/GetSeries.php?seriesname=$fieldsTitle&language=$lang" series_db="https://www.thetvdb.com/api/GetSeries.php?seriesname=${file_title}&language=$lang"
wget "$series_db" -O "$PwD/series.xml" -o /dev/null wget "$series_db" -O "$PwD/series.xml" -o /dev/null
error=$? error=$?
if [ $error -ne 0 ]; then if [ $error -ne 0 ]; then
@ -124,7 +119,7 @@ else # Otherwise ask TvDB whether they do know the series
exit 2 exit 2
fi fi
series_id=$(grep -m 1 "seriesid" "$PwD/series.xml") # Get series id (needed later) series_id=$(grep -m 1 "seriesid" "$PwD/series.xml")
if [ -z "$series_id" ]; then if [ -z "$series_id" ]; then
eecho -e " TVDB:\tSeries NOT found!" eecho -e " TVDB:\tSeries NOT found!"
exit 3 exit 3
@ -141,103 +136,145 @@ else # Otherwise ask TvDB whether they do know the series
echo "$series_title|#|$series_id" >> "$PwD/series.cache" echo "$series_title|#|$series_id" >> "$PwD/series.cache"
eecho -e " TVDB:\tSeries found.\tID: $series_id" eecho -e " TVDB:\tSeries found.\tID: $series_id"
fi fi
eecho -e "\t\t\t\tName: $series_title" eecho -e "\t\t\t\tName: $series_title"
if [ -n "$series_alias" ]; then if [ -n "$series_alias" ]; then
eecho -e "\t\t\t\tAlias: $series_alias" eecho -e "\t\t\t\tAlias: $series_alias"
fi fi
}
# Get the EPG from OnlineTvRecorder and get the title of the episode
# ------------ EPG vom jeweiligen Tag herunterladen, durchsuchen anhand der Ausstrahlungszeit ------------- ;; function funcGetEPG {
# Download OTR EPG data and search for series and time # Download OTR EPG data and search for series and time
if [ ! -f "$PwD/epg-$fieldsDate.csv" ]; then # didnt cache this file if [ ! -f "$PwD/epg-${file_date}.csv" ]; then # This file does not exist
rm -f ${PwD// /\\ }/epg-*.csv 2> /dev/null rm -f ${PwD// /\\ }/epg-*.csv 2> /dev/null # Delete all old files
epg_csv="https://www.onlinetvrecorder.com/epg/csv/epg_20${fieldsDate//./_}.csv" epg_csv="https://www.onlinetvrecorder.com/epg/csv/epg_20${file_date//./_}.csv"
wget "$epg_csv" -O "$PwD/epg-$fieldsDate.csv" -o /dev/null wget "$epg_csv" -O "$PwD/epg-${file_date}.csv" -o /dev/null # Download the csv
error=$? error=$?
if [ $error -ne 0 ]; then if [ $error -ne 0 ]; then
eecho "Downloading $epg_csv failed (Exit code: $error)!" eecho "Downloading $epg_csv failed (Exit code: $error)!"
exit 4 exit 4
fi fi
fi fi
epg="$(grep "$series_title" "$PwD/epg-$fieldsDate.csv" | grep "$fieldsTime")" epg="$(grep "$series_title" "$PwD/epg-${file_date}.csv" | grep "${file_time}")" # Get the line with the movie
if [ -z "$epg" ]; then if [ -z "$epg" ]; then
eecho " EPG:\tSeries not found in EPG data" eecho -e " EPG:\tSeries not found in EPG data" # This cannot happen :)
exit 5 exit 5
fi fi
# Parse EPG data using read
OLDIFS=$IFS
IFS=";"
read epg_id epg_start epg_end epg_duration epg_sender epg_title epg_type epg_text epg_genre epg_fsk epg_language epg_weekday epg_additional epg_rpt epg_downloadlink epg_infolink epg_programlink <<< "$epg"
IFS=$OLDIFS
}
# Parse EPG data # Get the title of the episode from description in EPG using $1 as delimiter to the real description
OLDIFS=$IFS function funcGetEpgEpisodeTitle {
IFS=";" episode_title="${epg_text%%$1*}" # Text begins with episode title, cut off the rest
read epg_id epg_start epg_end epg_duration epg_sender epg_title epg_type epg_text epg_genre epg_fsk epg_language epg_weekday epg_additional epg_rpt epg_downloadlink epg_infolink epg_programlink <<< "$epg" if [ -z "$episode_title" ]; then
IFS=$OLDIFS eecho -e " EPG:\tNo Episode title found"
episode_title="${epg_text%%.*}" # Text begins with episode title
if [ -z "$episode_title" ]; then
eecho " EPG:\tNo Episode title found"
exit 5 exit 5
fi fi
eecho -e " EPG:\tEpisode title:\t$episode_title" eecho -e " EPG:\tEpisode title:\t$episode_title" # We found some title :)
}
function funcGetEpisodes {
# Download Episode list of series # Download Episode list of series
episode_db="https://www.thetvdb.com/api/$apikey/series/$series_id/all/$lang.xml" episode_db="https://www.thetvdb.com/api/$apikey/series/$series_id/all/$lang.xml"
wget $episode_db -O "$PwD/episodes.xml" -o /dev/null wget $episode_db -O "$PwD/episodes.xml" -o /dev/null
error=$? error=$?
if [ $error -ne 0 ]; then if [ $error -ne 0 ]; then
eecho "Downloading $episode_db failed (Exit code: $error)!" eecho "Downloading $episode_db failed (Exit code: $error)!"
exit 6 exit 6
fi fi
}
while true; do function funcGetEpisodeInfo {
while true; do
episode_info=$(grep "Name>$episode_title" "$PwD/episodes.xml" -B 10) # Get XML data of episode episode_info=$(grep "Name>$episode_title" "$PwD/episodes.xml" -B 10) # Get XML data of episode
if [ -z "$episode_info" ]; then if [ -z "$episode_info" ]; then # Nothing found. Shorten the title
episode_title=${episode_title% *} tmp=${episode_title% *}
if [ ${#episode_title} -le 4 ]; then if [ ${#episode_title} -le 4 ] || [ "$tmp" == "$episode_title" ]; then
break; break;
fi fi
episode_title="$tmp"
eecho -e " EPG:\tEpisode title:\t$episode_title" eecho -e " EPG:\tEpisode title:\t$episode_title"
else else
break; break;
fi fi
done done
if [ -z "$episode_info" ]; then
echo "No episode info found"
exit 13
fi
if [ -n "$episode_info" ]; then # If we have found something
episode_number=$(echo -e "$episode_info" | grep -m 1 "Combined_episodenumber") # Get episode number
episode_number=$(echo -e "$episode_info" | grep -m 1 "Combined_episodenumber") # Get episode number episode_season=$(echo -e "$episode_info" | grep -m 1 "Combined_season") # Get season number
episode_season=$(echo -e "$episode_info" | grep -m 1 "Combined_season") # Get season number episode_title=$(echo -e "$episode_info" | grep -m 1 "EpisodeName") # Get season name
episode_title=$(echo -e "$episode_info" | grep -m 1 "EpisodeName") # Get season name episode_number=${episode_number%<*} # remove xml tags
episode_number=${episode_number%<*} # remove xml tags episode_number=${episode_number#*>}
episode_number=${episode_number#*>} episode_season=${episode_season%<*}
episode_season=${episode_season%<*} episode_season=${episode_season#*>}
episode_season=${episode_season#*>} episode_title=${episode_title%<*}
episode_season=${episode_season%<*} episode_title=${episode_title#*>}
episode_title=${episode_title%<*} if [[ "$episode_number" == *.* ]]; then # Convert float to integer. Float!?
episode_title=${episode_title#*>}
episode_season=${episode_season#*>}
if [[ "$episode_number" == *.* ]]; then # Convert float to integer. Float!?
episode_number=${episode_number%%.*} episode_number=${episode_number%%.*}
fi fi
if [[ "$episode_season" == *.* ]]; then if [[ "$episode_season" == *.* ]]; then
episode_season=${episode_number%%.*} episode_season=${episode_number%%.*}
fi fi
# add leading zero if [ $episode_number -le 9 ]; then # add leading zero
if [ $episode_number -le 9 ]; then
episode_number="0$episode_number" episode_number="0$episode_number"
fi fi
if [ $episode_season -le 9 ]; then if [ $episode_season -le 9 ]; then
episode_season="0$episode_season" episode_season="0$episode_season"
fi fi
eecho -e " TvDB: Season:\t$episode_season" eecho -e " TvDB:\tSeason:\t$episode_season"
eecho -e " Episode:\t$episode_number" eecho -e " \tEpisode:\t$episode_number"
fi
}
echo "${series_title// /.}..S${episode_season}E${episode_number}..${episode_title// /.}.$file_suffix"
function doIt {
funcHeader
if [ -z "$path" ]; then # If no path was specified (-f)
echo "Usage: $0 -f pathToAvi [-s] [-l LANG]"
exit 15
fi
if [ ! -f "$path" ]; then # If the path is no regular file
echo "This is no file!"
echo "$path"
exit 10
fi
PwD=$(readlink -e $0) # Get the path to this script
PwD=$(dirname "$PwD")
file_name="$(basename $path)" # Get file name
file_suffix="${file_name##*.}" # Get file suffix
file_dir="$(dirname $path)" # Get file directory
funcAnalyzeFilename # Get info from $file_name
funcGetSeriesId # Get series ID from cache or TvDB
funcGetEPG # Download epg file
funcGetEpgEpisodeTitle "." # Get the episode title using . as delimiter
funcGetEpisodes # Download episodes file
funcGetEpisodeInfo
if [ -z "$episode_info" ]; then # No info found!
funcGetEpgEpisodeTitle "," # Try again with , as delimiter
funcGetEpisodeInfo
if [ -z "$episode_info" ]; then # Again no info found!
echo "No episode info found!"
exit 20
fi
fi
echo "${series_title// /.}..S${episode_season}E${episode_number}..${episode_title// /.}.$file_suffix"
}
funcParam $@
doIt