Main video pages now slowly coming online from the backend
This commit is contained in:
parent
ac200c0c0d
commit
61b3a5fe80
1
service/.gitignore
vendored
Normal file
1
service/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
target/
|
2487
service/Cargo.lock
generated
Normal file
2487
service/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
9
service/Cargo.toml
Normal file
9
service/Cargo.toml
Normal file
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "backend"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
rocket = { version = "0.5.1", features = ["json"] }
|
||||
serde = {version = "1.0", features = ["derive"]}
|
||||
rocket_dyn_templates = {version = "0.2.0", features = ["tera"] }
|
33
service/src/db.rs
Normal file
33
service/src/db.rs
Normal file
@ -0,0 +1,33 @@
|
||||
use std::collections::HashMap;
|
||||
use std::fs;
|
||||
use rocket::serde::json;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::CONFIG;
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct Row {
|
||||
pub id: i64,
|
||||
pub file: String,
|
||||
pub thumbnail: String
|
||||
}
|
||||
|
||||
|
||||
pub fn get_video(id: i64) -> Option<Row> {
|
||||
// Used to fetch video information from the db for client's to request
|
||||
// video and thumbnail files from us
|
||||
let db_file = fs::read_to_string(CONFIG.db_file)
|
||||
.expect("Unable to read DB_FILE");
|
||||
let db_data: HashMap<i64, Row> = json::from_str(&db_file)
|
||||
.expect("Unable to parse DB_FILE content");
|
||||
|
||||
match db_data.get(&id) {
|
||||
Some(video) => Some(Row {
|
||||
id,
|
||||
file: video.file.clone(),
|
||||
thumbnail: video.thumbnail.clone()
|
||||
}),
|
||||
None => None
|
||||
}
|
||||
}
|
27
service/src/main.rs
Normal file
27
service/src/main.rs
Normal file
@ -0,0 +1,27 @@
|
||||
#[macro_use] extern crate rocket;
|
||||
use rocket_dyn_templates::Template;
|
||||
use rocket::fs::FileServer;
|
||||
|
||||
mod video;
|
||||
mod db;
|
||||
|
||||
pub struct BackendConfig {
|
||||
pub root: &'static str,
|
||||
pub db_file: &'static str,
|
||||
}
|
||||
|
||||
const CONFIG: BackendConfig = BackendConfig {
|
||||
root: "/opt/clippable",
|
||||
db_file: "/opt/clippable/db.json"
|
||||
};
|
||||
|
||||
#[rocket::main]
|
||||
async fn main() {
|
||||
|
||||
let _ = rocket::build()
|
||||
.mount("/static", FileServer::from("static"))
|
||||
.mount("/c", routes![video::index])
|
||||
.mount("/video", routes![video::file])
|
||||
.attach(Template::fairing())
|
||||
.launch().await;
|
||||
}
|
33
service/src/video.rs
Normal file
33
service/src/video.rs
Normal file
@ -0,0 +1,33 @@
|
||||
use crate::db;
|
||||
use std::path::PathBuf;
|
||||
use rocket::fs::NamedFile;
|
||||
use rocket_dyn_templates::Template;
|
||||
use rocket_dyn_templates::context;
|
||||
|
||||
#[get("/<video_id>")]
|
||||
pub fn index(video_id: i64) -> Template {
|
||||
// Read the db file we have to get the ID
|
||||
// Now we can fetch the row from the DB content
|
||||
match db::get_video(video_id) {
|
||||
Some(video) => {
|
||||
let path = PathBuf::from(&video.file);
|
||||
Template::render("index", context! {
|
||||
title: path.file_name(),
|
||||
kind: path.extension(),
|
||||
video: video.file
|
||||
})
|
||||
},
|
||||
None => Template::render("index", context! {
|
||||
title: "Not found"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[get("/<path>")]
|
||||
pub async fn file(path: PathBuf) -> Option<NamedFile> {
|
||||
if path.is_file() {
|
||||
return NamedFile::open(path).await.ok();
|
||||
}
|
||||
None
|
||||
}
|
8
service/static/style.css
Normal file
8
service/static/style.css
Normal file
@ -0,0 +1,8 @@
|
||||
.content {
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: auto;
|
||||
width: 75%;
|
||||
text-align: center;
|
||||
}
|
||||
|
16
service/templates/index.html.tera
Normal file
16
service/templates/index.html.tera
Normal file
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<head lang="en-us">
|
||||
<link rel="stylesheet" href="/static/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="content">
|
||||
<h1 class="title">{{ title }}</h1>
|
||||
{% if video %}
|
||||
<video controls>
|
||||
<source src="/video/{{ video }}" type="{{ kind }}">
|
||||
</video>
|
||||
{% else %}
|
||||
<p>Nothing to see here</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</body>
|
Loading…
Reference in New Issue
Block a user