Browse Your Downloaded Videos on Internet: PHP based video webserver that exposes a local path containing videos to the internet.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

205 lines
6.0 KiB

#! /bin/bash -e
echo "$(date) -- $0 $*" >> /tmp/movieposter.log
# Change this for your environment
SRC_PATH=/var/data/spielfilme
DEFAULT=/etc/movieposter/default.jpg
#DEFAULT=/etc/mediatomb/scripts/unknown-movie-folder.jpg
TARGET_PATH=/var/tmp/spielfilme
DEBUG=1 # set DEBUG to 1 for debugging
# Normally you don't need to change this
SED_FILTER='
s,.*/,,; # remove path
s/\.[^.]*$//; # remove extension
s/-[^_]*$//; # remove after last dash if no _ follows
s/_[12][90][0-9][0-9]$//; # remove year at end
s/^[12][90][0-9][0-9]_//; # remove year at begin
s/_*[A-Z][A-Z][A-Z][A-Z]*_*/_/g; # remove word in capitals only
s/__*/_/g; # remove duplicated underscore
s/_$//; # remove trailing whitespaces
/[a-z]/p; # file must contain lowecase letter'
SLEEP=0
IFS="
"
function trace {
if [ $DEBUG -eq 1 ]; then
echo "$*" 1>&2
fi
}
# get poster-link from movie database
function findposterurl {
# first try OpenMovieDatabase API
url="http://www.omdbapi.com/?t=$*"
trace " $url"
img=$(wget -q -O- "$url" \
| sed -n 's/.*Poster":"\([^"]*\)",.*/\1/p');
if [ -n "$img" -a "$img" != "N/A" ]; then # poster image found
echo "$img"
return
fi
# then try categories movie and tv in The Movie Database
# not using the API, because the API requires a key
for t in movie tv; do
url="http://www.themoviedb.org/search/$t?query=${*// /+}"
trace " $url"
img=$(wget -q -O- "$url" \
| html2 2> /dev/null \
| sed -n '0,/\/@class=poster/d; s/.*\/img\/@src=//p' \
| head -1)
if [ -n "$img" -a "$img" != "N/A" ]; then # poster image found
echo "$img"
return
fi
# make sure there are not too many unsuccessful queries in short time
sleep $SLEEP # don't want http://www.themoviedb.org to exclude me
done
}
# try to find poster-link from movie databases in two ways:
# unchanged or by removing the last number
function poster {
n="$*"
# try movie name as passed in the arguments
img=$(findposterurl "$n")
if [ -z "$img" ]; then
# try without number at the end or without I at the end
n2=$(echo "$n" | sed 's/ *[0-9]* *$//; s/ I *$//g')
if [ "$n2" == "$n" ]; then return; fi # no number at the end
img=$(findposterurl "$n2")
fi
if [ -n "$img" ]; then
echo "$img";
fi
}
function getimage {
f=$(echo "$1" | sed -n "$SED_FILTER")
if [ -z "$f" ]; then
trace "**** ingored: $1"
return
fi
n=${f//_/ }; # moviename is filename with spaces instead of underscore
t="${1%.*}.jpg" # target file name
if test -n "$TARGET_PATH"; then
test -d "$TARGET_PATH" || mkdir -p "$TARGET_PATH";
t="${TARGET_PATH}/${t##*/}"
fi
echo "$t"
if [ -s "$t" ]; then
trace "**** exists: $t"
return
fi # already downloaded
# try to find movie using full filename
trace "**** $f -> $n"
img=$(poster "$n")
if [ -z "$img" ]; then # no poster found, try with manipulated name
# split filename at "_-_" and sort by length, search for the parts
for n2 in $(echo $n | sed 's/ - /\n/g' \
| awk '{ print length($0) " " $0; }' | sort -r -n \
| cut -d ' ' -f 2-); do
if [ "$n" = "$n2" ]; then continue; fi # same - ignore
trace ",,,, $n -> $n2"
img=$(poster "$n2")
if [ -n "$img" ]; then break; fi # found
for n3 in $(echo $n2 | sed 's/-/\n/g' \
| awk '{ print length($0) " " $0; }' | sort -r -n \
| cut -d ' ' -f 2-); do # split at -, sort by length
if [ "$n2" = "$n3" ]; then continue; fi # same - ignore
echo ".... $n2 -> $n3"
img=$(poster "$n3")
if [ -n "$img" ]; then break; fi # found
done
done
fi
if [ -n "$img" ]; then
trace "---- Download: $img";
wget -q -O"$t" $img;
if ! [ -s "$t" ]; then
trace "==== ERROR"; rm "$t";
fi;
fi;
if ! [ -s "$t" ]; then
trace "++++ Transcoding: $1"
if ! ( ffmpegthumbnailer -i"$1" -o"$t" -f -s400 > /dev/null 2> /dev/null && [ -s "$t" ] ); then
trace "++++ Copy Default: $DEFAULT"
cp "$DEFAULT" "$t"
fi
fi
if [ -s "$t" ]; then
trace "++++ INSTALLED!"
fi
}
function thumbnails() {
if ! test -f "$1"; then
return
fi
t="${1%.*}" # target file name
if test -n "$TARGET_PATH"; then
test -d "$TARGET_PATH" || mkdir -p "$TARGET_PATH";
t="${TARGET_PATH}/${t##*/}"
fi
for p in "25%" "50%" "75%"; do
t2="${t}-${p%\%}.jpg"
if test -s "$t2"; then
continue;
fi
trace "++++ Thumbnail: ${t2}"
if ! ( ffmpegthumbnailer -i"$1" -o"${t2}" -s400 -t"${p}" > /dev/null 2> /dev/null && [ -s "$t2" ] ); then
rm "$t2"
fi
done
}
#### MAIN #############################################################
while (( "$#" )); do
arg=$1
shift
case "$arg" in
(-h|--help)
cat<<EOF
USAGE
1) copy image from a movie file:
$0 in-movie-path out-image-path
2) scan sourcedir and cache images for all files
$0
3) other options:
$0 OPTIONS
OPTIONS
-h, --help show this help
EOF
exit $#
;;
(*)
if [ $# -ne 1 ]; then
echo "**** ERROR! call: $0 --help" 1>&2
exit 1
fi
cp $(getimage "$arg") "$1"
exit 0
;;
esac
done
trace "******** $0 ********"
# scan all the movie files and also the directories
# assuming the file name contains the movie title in some predefined way
# find all files and subdirectories take newline as separator
SLEEP=10
for f in $(find $SRC_PATH/ \( -name '*.jpg' -prune \) -o -type f -print); do
getimage "$f" > /dev/null
thumbnails "$f"
done