* Moving frontend to api along
THere's also some deps in there but i cb fucked to doc that
This commit is contained in:
parent
d06784c06e
commit
8ce7c038f9
@ -6,7 +6,8 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket = "0.4"
|
rocket = "0.5.0-rc.1"
|
||||||
|
tokio = "1.0"
|
||||||
serde = { version = "1.0", features = [ "derive" ] }
|
serde = { version = "1.0", features = [ "derive" ] }
|
||||||
base64 = "0.13.0"
|
base64 = "0.13.0"
|
||||||
|
|
||||||
@ -14,3 +15,7 @@ base64 = "0.13.0"
|
|||||||
version = "0.4.10"
|
version = "0.4.10"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["serve", "json"]
|
features = ["serve", "json"]
|
||||||
|
|
||||||
|
[dependencies.rocket_dyn_templates]
|
||||||
|
version = "0.1.0-rc.1"
|
||||||
|
features = ["tera"]
|
@ -1,17 +1,20 @@
|
|||||||
#![feature(decl_macro)]
|
#![feature(decl_macro)]
|
||||||
#[macro_use] extern crate rocket;
|
#[macro_use] extern crate rocket;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
use rocket_dyn_templates::Template;
|
||||||
|
|
||||||
mod video;
|
mod page;
|
||||||
|
|
||||||
fn main() {
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
// emoji's crash my terminal
|
// emoji's crash my terminal
|
||||||
env::set_var("ROCKET_CLI_COLORS", "off");
|
env::set_var("ROCKET_CLI_COLORS", "false");
|
||||||
/*
|
/*
|
||||||
* Some of the target vars that we look for
|
* Some of the target vars that we look for
|
||||||
* CLIP_DIR
|
* CLIP_DIR
|
||||||
*/
|
*/
|
||||||
let _ = rocket::ignite()
|
let _ = rocket::build()
|
||||||
.mount("/api", routes![video::list_categories, video::list_videos])
|
.mount("/", routes![page::home, page::category, page::video, page::files])
|
||||||
.launch();
|
.attach(Template::fairing())
|
||||||
|
.launch().await;
|
||||||
}
|
}
|
||||||
|
36
api/src/page.rs
Normal file
36
api/src/page.rs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
use serde::Serialize;
|
||||||
|
use rocket_dyn_templates::Template;
|
||||||
|
use rocket::fs::NamedFile;
|
||||||
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
|
||||||
|
#[get("/")]
|
||||||
|
pub async fn home() -> Template {
|
||||||
|
// WARN: this is just to get the templates to behave but we're still
|
||||||
|
// doing everything the browser for the home page
|
||||||
|
let mut h: HashMap<&'static str, &'static str> = HashMap::new();
|
||||||
|
h.insert("script_src", "/js/index.js");
|
||||||
|
h.insert("page", "home");
|
||||||
|
|
||||||
|
return Template::render("list", &h);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/category/<cat>")]
|
||||||
|
pub async fn category(cat: String) -> Template {
|
||||||
|
let mut h: HashMap<&'static str, &'static str> = HashMap::new();
|
||||||
|
h.insert("script_src", "/js/category.js");
|
||||||
|
h.insert("page", "category");
|
||||||
|
|
||||||
|
return Template::render("list", &h);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/clip/<id>")]
|
||||||
|
pub async fn video(id: String) -> Template {
|
||||||
|
return Template::render("video", &{})
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/<file..>")]
|
||||||
|
pub async fn files(file: PathBuf) -> Option<NamedFile> {
|
||||||
|
NamedFile::open(Path::new("static/").join(file)).await.ok()
|
||||||
|
}
|
3
api/static/favicon.png
Normal file
3
api/static/favicon.png
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:0cfdedb04d45802c1c008c9610bda2df8e3482f195bd254c11ebe07205e2bd5d
|
||||||
|
size 8560
|
50
api/static/js/collection.js
Normal file
50
api/static/js/collection.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
"use strict";
|
||||||
|
// This module takes care of pulling down videos for the given category
|
||||||
|
class Video {
|
||||||
|
constructor(raw) {
|
||||||
|
this.title = raw['name'];
|
||||||
|
this.category = raw['category'];
|
||||||
|
this.thumbnail_b64 = raw['thumbnail'];
|
||||||
|
}
|
||||||
|
title_link() {
|
||||||
|
let container = document.createElement('h2');
|
||||||
|
let link = document.createElement('a');
|
||||||
|
link.href = `/video?c=${this.category}&v=${this.title}`;
|
||||||
|
link.text = this.title;
|
||||||
|
container.appendChild(link);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function get_category() {
|
||||||
|
// Used to modify the DOM
|
||||||
|
let params = (new URL(document.location.toString())).searchParams;
|
||||||
|
return params.get('c');
|
||||||
|
}
|
||||||
|
function base_url() {
|
||||||
|
const loc = document.location;
|
||||||
|
return loc.protocol + '//' + loc.host;
|
||||||
|
}
|
||||||
|
function fetch_videos() {
|
||||||
|
const category = get_category();
|
||||||
|
if (!category) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
const endpoint = base_url() + `/api/categories?c=${category}`;
|
||||||
|
let xml = new XMLHttpRequest();
|
||||||
|
xml.open('GET', endpoint, false); // sync request
|
||||||
|
xml.send(null); // no params required
|
||||||
|
if (xml.getResponseHeader('Content-Type') == 'application/json') {
|
||||||
|
let raw = JSON.parse(xml.responseText);
|
||||||
|
for (const vid of raw['videos']) {
|
||||||
|
console.log(vid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
function ready(e) {
|
||||||
|
if (document.readyState != 'complete') {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
const video_data = fetch_videos();
|
||||||
|
}
|
||||||
|
document.addEventListener('readystatechange', ready);
|
57
api/static/js/index.js
Normal file
57
api/static/js/index.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
"use strict";
|
||||||
|
class Category {
|
||||||
|
constructor(raw) {
|
||||||
|
this.name = raw['name'];
|
||||||
|
this.thumbnail_b64 = raw['thumbnail'];
|
||||||
|
}
|
||||||
|
title_link() {
|
||||||
|
let container = document.createElement('h2');
|
||||||
|
let link = document.createElement('a');
|
||||||
|
link.href = `/collection?c=${this.name}`;
|
||||||
|
link.text = this.name;
|
||||||
|
container.appendChild(link);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
thumbnail_div() {
|
||||||
|
let nail = document.createElement('img');
|
||||||
|
nail.className = 'pure-img';
|
||||||
|
if (!(this.thumbnail_b64 == null || this.thumbnail_b64.length == 0)) {
|
||||||
|
nail.setAttribute('src', `data:image/jpg;base64,${this.thumbnail_b64}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nail.setAttribute('src', '/cantfindshit.gif');
|
||||||
|
}
|
||||||
|
return nail;
|
||||||
|
}
|
||||||
|
as_div() {
|
||||||
|
let container = document.createElement('div');
|
||||||
|
container.className = 'video-block';
|
||||||
|
let title = this.title_link();
|
||||||
|
let thumbnail = this.thumbnail_div();
|
||||||
|
container.appendChild(title);
|
||||||
|
container.appendChild(thumbnail);
|
||||||
|
// Dump gallery onto the main page
|
||||||
|
document.getElementById('main-container').appendChild(container);
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function ready_handler(e) {
|
||||||
|
// Only let this make a get request once we're ready on the page
|
||||||
|
if (document.readyState != 'complete') {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
// All we do here is basically make a get request to /api/categories
|
||||||
|
const endpoint = 'http://localhost/api/categories';
|
||||||
|
let xml = new XMLHttpRequest();
|
||||||
|
xml.open('GET', endpoint, false); // sync request
|
||||||
|
xml.send(null); // nothing required for stuff
|
||||||
|
if (xml.getResponseHeader('Content-Type') == 'application/json') {
|
||||||
|
let raw = JSON.parse(xml.responseText);
|
||||||
|
for (const cat_raw of raw['categories']) {
|
||||||
|
let cat = new Category(cat_raw);
|
||||||
|
cat.as_div();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
document.addEventListener('readystatechange', ready_handler);
|
37
api/templates/list.html.tera
Normal file
37
api/templates/list.html.tera
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en"><head>
|
||||||
|
<meta name="generator" content="Hugo 0.88.1" />
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="/css/style.css">
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<title>Shockrah's Clips</title>
|
||||||
|
<link rel="shortcut icon" type="image/png" href="/static/favicon.png"/>
|
||||||
|
{% if page == "category" %}
|
||||||
|
<meta property="og:title" content="">
|
||||||
|
<meta property="og:site_name" content="">
|
||||||
|
<meta property="og:url" content="">
|
||||||
|
<meta property="og:description" content="">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:image" content="">
|
||||||
|
{# Otherwise we defautl to the home tags #}
|
||||||
|
{% else %}
|
||||||
|
<meta property="og:title" content="Shockrah's Clips">
|
||||||
|
<meta property="og:site_name" content="Clippable">
|
||||||
|
<meta property="og:url" content="https://clips.shockrah.xyz/">
|
||||||
|
<meta property="og:description" content="Clips I think are kinda kewl">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:image" content="/favicon.png">
|
||||||
|
{% endif %}
|
||||||
|
<script src="{{script_src}}"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<div class="content">
|
||||||
|
<h1></h1>
|
||||||
|
<div class="video-gallery" id="main-container">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user