add upload function

This commit is contained in:
Daniel Løvbrøtte Olsen 2020-03-30 20:43:47 +02:00
parent cf49211b74
commit 55ef46e978
6 changed files with 165 additions and 21 deletions

12
Cargo.lock generated
View File

@ -8,7 +8,6 @@ dependencies = [
"rocket_contrib", "rocket_contrib",
"serde", "serde",
"serde_json", "serde_json",
"serde_repr",
"uuid", "uuid",
] ]
@ -750,17 +749,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "serde_repr"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd02c7587ec314570041b2754829f84d873ced14a96d1fd1823531e11db40573"
dependencies = [
"proc-macro2 1.0.9",
"quote 1.0.3",
"syn 1.0.17",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.2" version = "0.4.2"

View File

@ -11,7 +11,6 @@ rocket = "0.4.4"
serde = {version = "1.0", features = ["derive"]} serde = {version = "1.0", features = ["derive"]}
serde_json = "1.0" serde_json = "1.0"
serde_repr = "0.1"
uuid = { version = "0.7", features = ["serde", "v4"] } uuid = { version = "0.7", features = ["serde", "v4"] }

View File

@ -0,0 +1,2 @@
[global.limits]
forms = 20000000000

149
client.sh Normal file
View File

@ -0,0 +1,149 @@
#! /usr/bin/env nix-shell
#! nix-shell -i bash -p bash curl jq libaom ffmpeg-full
set -euo pipefail
IFS=$'\n\t'
base_url="$1"
version="0.2.0"
while true; do
sleep 30
set +e
upsteam_version=`curl -s "$base_url"/version`
retval=$?
set -e
if [ $retval -ne 0 ]; then
echo "Is the Job Server Down?"
continue
fi
if [[ $version != $upsteam_version ]]; then
echo "Wrong version: client version is $version, while job server requires $upstream_version"
break
fi
set +e
job=`curl -s "$base_url"/request_job | jq`
retval=$?
set -e
if [[ $job = "null" ]] || [ $retval -ne 0 ]; then
echo "No Jobs Available ¯\_(ツ)_/¯"
continue
fi
echo "Got new job!"
echo "$job" | jq
job_id=`echo "$job" | jq -r .id`
echo "Reserving Job"
set +e
curl -s "$base_url"/edit_status/"$job_id"/reserved
retval=$?
set -e
if [ $retval -ne 0 ]; then
echo "Is the Job Server Down?"
continue
fi
echo "Reserved!"
source=`echo $job | jq -r .description.file_url`
sourceext=${source##*.}
echo "Downloading source file: $source"
source=`echo $job | jq -r .description.file_url`
name=`echo $job | jq -r .description.file_name`
input="$name.$job_id.$sourceext"
set +e
curl "$source" -o "$input"
retval=$?
set -e
if [ $retval -ne 0 ]; then
echo "Could not Download file!"
curl -s -L "$base_url"/edit_status/"$job_id"/error || true
continue
fi
echo ""
echo "Starting Encode"
height=`echo $job | jq -r .description.resolution[0]`
width=`echo $job | jq -r .description.resolution[1]`
echo $job | jq
aomenco=`echo $job | jq -r .description.options.aomenc`
aomenco=${aomenco//[^a-zA-Z0-9_\- =]/}
ffmpego=`echo $job | jq -r .description.options.ffmpeg`
ffmpego=${ffmpego//[^a-zA-Z0-9_\- =:]/}
two_pass=`echo $job | jq -r .description.options.two_pass`
if [[ $two_pass = true ]]; then
set +e
eval 'ffmpeg -nostats -hide_banner -loglevel warning \
-i "'$input'" '$ffmpego' -vf scale='$height':'$width' -pix_fmt yuv422p -f yuv4mpegpipe - | aomenc - --i422 '$aomenco' \
--pass=1 --passes=2 --fpf="'$input'.fpf" --webm -o "'$input'.out.webm"'
retval=$?
if [ $retval -ne 0 ]; then
echo "Error running encode pass 1"
curl -s -L "$base_url"/edit_status/"$job_id"/error || true
echo ""
continue
fi
eval 'ffmpeg -nostats -hide_banner -loglevel warning \
-i "'$input'" '$ffmpego' -vf scale='$height':'$width' -pix_fmt yuv422p -f yuv4mpegpipe - | aomenc - --i422 '$aomenco' \
--pass=2 --passes=2 --fpf="'$input'.fpf" --webm -o "'$input'.out.webm"'
retval=$?
if [ $retval -ne 0 ]; then
echo "Error running encode pass 2"
curl -s -L "$base_url"/edit_status/"$job_id"/error || true
echo ""
continue
fi
set -e
else
set +e
eval 'ffmpeg -nostats -hide_banner -loglevel warning \
-i "'$input'" '$ffmpego' -vf scale='$height':'$width' -pix_fmt yuv422p -f yuv4mpegpipe - | aomenc - --i422 '$aomenco' \
--passes=1 --fpf="'$input'.fpf" --webm -o "'$input'.out.webm"'
retval=$?
if [ $retval -ne 0 ]; then
echo "Error running encode"
curl -s -L "$base_url"/edit_status/"$job_id"/error || true
echo ""
continue
fi
set -e
fi
set +e
curl -s -L "$base_url"/edit_status/"$job_id"/completed
set -e
echo "Uploading file!"
set +e
curl --data-binary @"$input".out.webm "$base_url"/upload/"$job_id"
set -e
retval=$?
echo ""
if [ $retval -ne 0 ]; then
echo "Couldn't upload file!"
continue
else
echo "Upload finished, deleting result!"
rm "$input".out.webm
fi
done

View File

@ -8,19 +8,18 @@ use rocket::Data;
use rocket_contrib::json::Json; use rocket_contrib::json::Json;
use serde_json::Value; use serde_json::Value;
use serde_json::json; use serde_json::json;
use serde::{Serialize, Deserialize};
use rocket_contrib::uuid::Uuid; use rocket_contrib::uuid::Uuid;
use rocket_contrib::serve::StaticFiles; use rocket_contrib::serve::StaticFiles;
use std::sync::Mutex; use std::sync::Mutex;
use std::collections::HashMap; use std::collections::HashMap;
use std::net::SocketAddr; use std::path::Path;
mod workunit; mod workunit;
use workunit::WUnit; use workunit::WUnit;
use workunit::EStatus; use workunit::EStatus;
const VERSION: &str = "0.2.0"; const VERSION: &str = "0.3.0";
#[derive(Default, Debug)] #[derive(Default, Debug)]
struct SharedState { struct SharedState {
@ -106,9 +105,17 @@ fn edit_status(id: Uuid, status: String, shared: State<SharedState>, remote_addr
#[post("/", data = "<video>")] #[post("/upload/<id>", data = "<video>")]
fn upload(video: Data) -> Result<String, std::io::Error> { fn upload(id: Uuid, video: Data, shared: State<SharedState>) -> Result<String, std::io::Error> {
if shared.jobs.lock().unwrap().contains_key(&id) == false {
Err(std::io::Error::new(std::io::ErrorKind::NotFound, "Job not found"))
}
else {
let filename = format!("results/{name}.{id}.webm", name = shared.jobs.lock().unwrap().get(&id).unwrap().description.file_name, id = id);
let url = format!("{host}/{id}\n", host = "https://av1.dodsorf.as", id = id);
video.stream_to_file(Path::new(&filename))?;
Ok(url)
}
} }
@ -126,6 +133,6 @@ fn main() {
rocket::ignite() rocket::ignite()
.manage(SharedState::default()) .manage(SharedState::default())
.mount("/", StaticFiles::from("src/static")) // switch to templates or something cause this is dumb .mount("/", StaticFiles::from("src/static")) // switch to templates or something cause this is dumb
.mount("/", routes![index, version, get_jobs, get_job, request_job, edit_status, add_job]) .mount("/", routes![index, version, get_jobs, get_job, request_job, edit_status, add_job, upload])
.launch(); .launch();
} }

View File

@ -1,5 +1,4 @@
use serde::{Serialize, Deserialize}; use serde::{Serialize, Deserialize};
use serde_repr::*;
use uuid::Uuid; use uuid::Uuid;
use std::net::IpAddr; use std::net::IpAddr;