Mail when done
This commit is contained in:
parent
f70bac1332
commit
63643b840e
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
|
mailvars
|
||||||
process.log
|
process.log
|
||||||
uploadpage/streams/*
|
uploadpage/streams/*
|
||||||
|
|||||||
27
README.md
27
README.md
@ -3,19 +3,24 @@
|
|||||||
|
|
||||||
## Install
|
## Install
|
||||||
* Prepare a server, set its timezone to the users' timezone
|
* Prepare a server, set its timezone to the users' timezone
|
||||||
(on deb-based systems: `dpkg-reconfigure tzdata`)
|
(on deb-based systems: `dpkg-reconfigure tzdata`).
|
||||||
* On the server, `cd` to the place where you want the files
|
* On the server, `cd` to the place where you want the files.
|
||||||
* Clone repo: `git clone https://gitlab.com/pepa65/streamupload`
|
* Clone repo: `git clone https://gitlab.com/pepa65/streamupload`.
|
||||||
* `cd streamupload`
|
* `cd streamupload`.
|
||||||
* Change the value of the `repopath` variable in `stream` and `encode`
|
* Run a php/webserver on $PWD/uploadpage:
|
||||||
to the output of `echo $PWD`
|
- Get it to restart on reboot.
|
||||||
* Run a php/webserver on $PWD/uploadpage
|
|
||||||
- Get it to restart on reboot
|
|
||||||
- Setting up basicauth on the page is a good idea if others can get access!
|
- Setting up basicauth on the page is a good idea if others can get access!
|
||||||
- Change the relevant `php.ini` to allow large file uploads:
|
- Change the relevant `php.ini` to allow large file uploads:
|
||||||
* `post_max_size` - Upper limit of uploaded video sizes, say `10G`
|
* `post_max_size` - Upper limit of uploaded video sizes, say `10G`.
|
||||||
* `upload_max_filesize` - same value as `post_max_size`
|
* `upload_max_filesize` - same value as `post_max_size`.
|
||||||
* Make a crontab-entry: "* * * * * $PWD/encode" (replace $PWD with its value!)
|
* Make a crontab-entry: "* * * * * $PWD/encode" (replace $PWD with its value!).
|
||||||
|
* Install the `mailer` binary by downloading it from the repo at
|
||||||
|
https://https://github.com/pepa65/mailer/releases/latest and moving it to
|
||||||
|
`/usr/local/bin` and make it executable: `chmod +x /usr/local/bin/mailer`.
|
||||||
|
If it's not installed, everything except the email will still work.
|
||||||
|
* Copy `_mailvars` to `mailvars` and set the variables
|
||||||
|
`to`, `user`, `password`, `smtp` and `port` in it in order to
|
||||||
|
receive mail notifications when the encodes are finished.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
* Get a streamkey for the target by scheduling a stream
|
* Get a streamkey for the target by scheduling a stream
|
||||||
|
|||||||
6
_mailvars
Normal file
6
_mailvars
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# Variables for mailer
|
||||||
|
to=''
|
||||||
|
user=''
|
||||||
|
password=''
|
||||||
|
smtp=''
|
||||||
|
port=''
|
||||||
39
encode
39
encode
@ -4,23 +4,32 @@
|
|||||||
# Usage: encode
|
# Usage: encode
|
||||||
# Called by cron every minute; process oldest .upload file in uploadpage/streams)
|
# Called by cron every minute; process oldest .upload file in uploadpage/streams)
|
||||||
|
|
||||||
repopath=/var/www
|
|
||||||
log=$repopath/process.log
|
|
||||||
dir=$repopath/uploadpage/streams
|
|
||||||
|
|
||||||
# Check for oldest uploaded file
|
# Check for oldest uploaded file
|
||||||
|
_=$(realpath -- "${BASH_SOURCE:-$0}") repopath=${_%/*}
|
||||||
|
log=$repopath/process.log dir=$repopath/uploadpage/streams
|
||||||
upload=$(/usr/bin/ls -1tr "$dir"/*.upload 2>/dev/null |head -1)
|
upload=$(/usr/bin/ls -1tr "$dir"/*.upload 2>/dev/null |head -1)
|
||||||
|
|
||||||
# Finished if no uploadpage/streams/*.upload files found
|
# Finished if no uploadpage/streams/*.upload files found
|
||||||
[[ $upload ]] || exit 0
|
[[ $upload ]] || exit 0
|
||||||
|
|
||||||
Log(){ # 1:message 2:returncode
|
Log(){ # 1:message 2:returncode(empty: no exit) I:file
|
||||||
echo "$1">>"$log"
|
echo "$1">>"$log"
|
||||||
# Remove source (if returncode not zero)
|
[[ $2 ]] && exit $2
|
||||||
/usr/bin/sync
|
}
|
||||||
/usr/bin/sleep 1
|
|
||||||
#(($2)) && /usr/bin/rm "$file"
|
Mail(){ # 1:kind(0:done, 1:wrong type, 2:encoding error) 2:logline I:to,user,password,smtp,port,name,type,start,finish
|
||||||
exit $2
|
local sbj msg from="Stream Upload server"
|
||||||
|
source "$repopath/mailvars"
|
||||||
|
sbj[0]="Stream upload done for ${name##*@}"
|
||||||
|
sbj[1]="Stream upload wrong type: $type"
|
||||||
|
sbj[2]="Stream upload error encoding"
|
||||||
|
msg[0]="Heya,\n\nThe video $name started encoding on $start and finished on $finish.\n\nStream Upload server"
|
||||||
|
msg[1]="Heya,\n\nThe file $name from $start is of type $type and could not be used.\n\nStream Upload server\n"
|
||||||
|
msg[2]="Heya,\n\nThe file $name started encoding on $start but ran into an error on $finish.\n\nStream Upload server\n"
|
||||||
|
[[ $to && $user && $password && $smtp && $port ]] &&
|
||||||
|
mailer -m "$(echo -e "${msg[$1]}")" -t "$to" -s "${sbj[$1]}" -u "$user" -p "$password" -S "$smtp" -P "$port" -f "$from" ||
|
||||||
|
Log "Mail with subject '${sbj[$1]}' could not be sent"
|
||||||
|
Log "$2" $1
|
||||||
}
|
}
|
||||||
|
|
||||||
# Rename upload and check type
|
# Rename upload and check type
|
||||||
@ -28,15 +37,19 @@ file=${upload%.upload} name=${file##*/} key=${name%%.*} date=${name##*.} video=$
|
|||||||
/usr/bin/mv "$upload" "$file"
|
/usr/bin/mv "$upload" "$file"
|
||||||
|
|
||||||
type=$(file -bL --mime-type "$file")
|
type=$(file -bL --mime-type "$file")
|
||||||
[[ ! ${type:0:5} = video ]] && Log "File $name is of type $type" 1
|
[[ ! ${type:0:5} = video ]] && Mail 1 "File $name is of type $type"
|
||||||
|
|
||||||
# Encode video
|
# Encode video
|
||||||
|
start=$(date +'%Y-%m-%d at %H:%M') error=0
|
||||||
## Single pass
|
## Single pass
|
||||||
#/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -force_key_frames 'expr:gte(t,n_forced*2)' -c:a copy -tune zerolatency -f mp4 "$video" ||
|
#/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -force_key_frames 'expr:gte(t,n_forced*2)' -c:a copy -tune zerolatency -f mp4 "$video" ||
|
||||||
# Double pass
|
# Double pass
|
||||||
/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -maxrate 6M -bufsize 1M -force_key_frames 'expr:gte(t,n_forced*2)' -movflags faststart -c:a copy -tune zerolatency -pass 1 -f mp4 "$video" &&
|
/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -maxrate 6M -bufsize 1M -force_key_frames 'expr:gte(t,n_forced*2)' -movflags faststart -c:a copy -tune zerolatency -pass 1 -f mp4 "$video" &&
|
||||||
/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -maxrate 6M -bufsize 1M -force_key_frames 'expr:gte(t,n_forced*2)' -movflags faststart -c:a copy -tune zerolatency -pass 2 -f mp4 "$video" ||
|
/usr/bin/ffmpeg -y -i "$file" -c:v libx264 -x264opts no-scenecut -b:v 6M -maxrate 6M -bufsize 1M -force_key_frames 'expr:gte(t,n_forced*2)' -movflags faststart -c:a copy -tune zerolatency -pass 2 -f mp4 "$video" ||
|
||||||
Log "Error encoding $name" 2
|
error=1
|
||||||
|
|
||||||
|
finish=$(date +'%Y-%m-%d at %H:%M')
|
||||||
|
((error)) && Mail 2 "Error encoding $name"
|
||||||
|
|
||||||
# Schedule cron job
|
# Schedule cron job
|
||||||
m=${date:13:2} m=${m#0} h=${date:11:2} h=${h#0}
|
m=${date:13:2} m=${m#0} h=${date:11:2} h=${h#0}
|
||||||
@ -46,4 +59,4 @@ D=${date:8:2} D=${D#0} M=${date:5:2} M=${M#0}
|
|||||||
line="$m $h $D $M "'*'" $repopath/stream '$name'"
|
line="$m $h $D $M "'*'" $repopath/stream '$name'"
|
||||||
echo -e "$(/usr/bin/crontab -l)\n$line" |/usr/bin/crontab -
|
echo -e "$(/usr/bin/crontab -l)\n$line" |/usr/bin/crontab -
|
||||||
|
|
||||||
Log "crontab: '$line'" 0
|
Mail 0 "crontab: '$line'"
|
||||||
|
|||||||
2
stream
2
stream
@ -7,7 +7,7 @@
|
|||||||
# information, has the "streamkey" at the start before the dot (it has to have
|
# information, has the "streamkey" at the start before the dot (it has to have
|
||||||
# a dot!) and the "target" at the very end, after the '@'.
|
# a dot!) and the "target" at the very end, after the '@'.
|
||||||
|
|
||||||
repopath=/var/www
|
_=$(realpath -- "${BASH_SOURCE:-$0}") repopath=${_%/*}
|
||||||
log=$repopath/process.log
|
log=$repopath/process.log
|
||||||
in=$repopath/uploadpage/streams/$1.mp4 key=${1%%.*} target=${1##*@}
|
in=$repopath/uploadpage/streams/$1.mp4 key=${1%%.*} target=${1##*@}
|
||||||
case $target in
|
case $target in
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user