From 7eb2b7d00dedbf8ba5b0c944f9bbf3d1127e3845 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Wed, 25 Dec 2024 17:34:13 +0100 Subject: [PATCH] update --- Cargo.lock | 207 ++++++++++++++++++++++++++++++++++++------- src/library/album.rs | 1 + src/main.rs | 1 - src/route/album.rs | 17 ++-- src/route/artist.rs | 19 ++-- src/route/mod.rs | 9 +- src/route/track.rs | 57 +++++++++--- 7 files changed, 248 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 98f6cc6..d5df935 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -137,6 +137,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -152,7 +158,7 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "based" version = "0.1.0" -source = "git+https://git.hydrar.de/jmarya/based#98048ce522db134fe3e863538db6793068085b80" +source = "git+https://git.hydrar.de/jmarya/based#cd10c64a1f96703894de9e40a95fd81cc50d244a" dependencies = [ "bcrypt 0.16.0", "chrono", @@ -166,6 +172,7 @@ dependencies = [ "rand", "rayon", "regex", + "reqwest", "ring", "rocket", "rocket_cors", @@ -183,7 +190,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e65938ed058ef47d92cf8b346cc76ef48984572ade631927e9937b5ffc7662c7" dependencies = [ - "base64", + "base64 0.22.1", "blowfish", "getrandom", "subtle", @@ -196,7 +203,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b1866ecef4f2d06a0bb77880015fdf2b89e25a1c2e5addacb87e459c86dc67e" dependencies = [ - "base64", + "base64 0.22.1", "blowfish", "getrandom", "subtle", @@ -209,6 +216,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" @@ -245,9 +258,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -263,9 +276,9 @@ checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "cc" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9157bbaa6b165880c27a4293a474c91cdcf265cc68cc829bf10be0964a391caf" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "shlex", ] @@ -477,7 +490,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ - "bitflags", + "bitflags 2.6.0", "proc-macro2", "proc-macro2-diagnostics", "quote", @@ -533,9 +546,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", ] @@ -555,9 +568,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "env_filter", "log", @@ -978,6 +991,19 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -1166,6 +1192,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "ipnet" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" + [[package]] name = "is-terminal" version = "0.4.13" @@ -1204,9 +1236,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libm" @@ -1468,9 +1500,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -1487,7 +1519,7 @@ version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ - "bitflags", + "bitflags 2.6.0", "cfg-if", "foreign-types", "libc", @@ -1768,7 +1800,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags", + "bitflags 2.6.0", ] [[package]] @@ -1835,6 +1867,46 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http 0.2.12", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + [[package]] name = "ring" version = "0.16.20" @@ -1981,13 +2053,22 @@ version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ - "bitflags", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", "windows-sys 0.59.0", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + [[package]] name = "rustversion" version = "1.0.18" @@ -2036,7 +2117,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -2075,9 +2156,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -2326,8 +2407,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64bb4714269afa44aef2755150a0fc19d756fb580a67db8885608cf02f47d06a" dependencies = [ "atoi", - "base64", - "bitflags", + "base64 0.22.1", + "bitflags 2.6.0", "byteorder", "bytes", "chrono", @@ -2370,8 +2451,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64", - "bitflags", + "base64 0.22.1", + "bitflags 2.6.0", "byteorder", "chrono", "crc", @@ -2471,15 +2552,21 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.13.1" @@ -2499,7 +2586,7 @@ dependencies = [ "bcrypt 0.15.1", "chrono", "data-encoding", - "env_logger 0.11.5", + "env_logger 0.11.6", "log", "rand", "rocket", @@ -2511,6 +2598,27 @@ dependencies = [ "walkdir", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tempfile" version = "3.14.0" @@ -2606,9 +2714,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -2648,6 +2756,16 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.17" @@ -2807,9 +2925,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicase_serde" @@ -2973,6 +3091,19 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.99" @@ -3228,6 +3359,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "write16" version = "1.0.0" diff --git a/src/library/album.rs b/src/library/album.rs index f1b80dc..10c421d 100644 --- a/src/library/album.rs +++ b/src/library/album.rs @@ -16,6 +16,7 @@ pub struct Album { /// Optional foreign key referencing the artist ID. If present, this indicates that this album is associated with a specific artist. pub artist: Option, } + impl Album { /// Creates a new album in the database with the given `title` and optional `artist`. pub async fn create(title: &str, artist: Option) -> Self { diff --git a/src/main.rs b/src/main.rs index 555a2fb..71863fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,6 @@ use based::get_pg; use based::request::cache; use library::Libary; use rocket::routes; -use rocket::tokio::sync::OnceCell; use rocket::{http::Method, launch}; mod library; diff --git a/src/route/album.rs b/src/route/album.rs index 243d8c8..f8aaf7f 100644 --- a/src/route/album.rs +++ b/src/route/album.rs @@ -3,9 +3,10 @@ use crate::library::album::Album; use crate::library::track::Track; use crate::library::Libary; use based::request::api::{api_error, to_uuid, vec_to_api, FallibleApiResponse, ToAPI}; +use based::request::assets::DataResponse; use based::use_api_cache; -use rocket::fs::NamedFile; -use rocket::{get, State}; +use rocket::tokio::io::AsyncReadExt; +use rocket::{get, tokio, State}; use serde_json::json; use std::cmp::Ordering; @@ -37,8 +38,9 @@ pub async fn album_cover_route( album_id: &str, lib: &State, cache: &State, -) -> Option { - NamedFile::open( +) -> Option { + let mut buf = Vec::new(); + tokio::fs::File::open( cache .get_option("album_cover_route", album_id, || async { let album = lib.get_album_by_id(&to_uuid(album_id).unwrap()).await?; @@ -47,7 +49,12 @@ pub async fn album_cover_route( .await?, ) .await - .ok() + .ok()? + .read(&mut buf) + .await + .ok()?; + + Some(DataResponse::new(buf, "image/png", Some(60 * 60 * 24 * 5))) } #[get("/albums/latest")] diff --git a/src/route/artist.rs b/src/route/artist.rs index 9674957..f619834 100644 --- a/src/route/artist.rs +++ b/src/route/artist.rs @@ -1,6 +1,7 @@ use based::request::api::{api_error, to_uuid, vec_to_api, FallibleApiResponse, ToAPI}; -use fs::NamedFile; -use rocket::{fs, get, State}; +use based::request::assets::DataResponse; +use rocket::tokio::io::AsyncReadExt; +use rocket::{get, tokio, State}; use crate::cache::RouteCache; use crate::library::artist::Artist; @@ -14,14 +15,22 @@ pub async fn artists_route(lib: &State) -> FallibleApiResponse { } #[get("/artist//image")] -pub async fn artist_image_route(id: &str, cache: &State) -> Option { +pub async fn artist_image_route(id: &str, cache: &State) -> Option { let image = cache .get_option("artist_image_route", id, || async { Artist::get_image_of(&to_uuid(id).ok()?).await }) - .await; + .await?; - NamedFile::open(image?).await.ok() + let mut buf = Vec::new(); + tokio::fs::File::open(image) + .await + .ok()? + .read(&mut buf) + .await + .ok()?; + + Some(DataResponse::new(buf, "image/png", Some(60 * 60 * 24 * 5))) } #[get("/artist/")] diff --git a/src/route/mod.rs b/src/route/mod.rs index 06b8aec..cc1abd6 100644 --- a/src/route/mod.rs +++ b/src/route/mod.rs @@ -1,11 +1,4 @@ -use std::str::FromStr; - -use rocket::{ - get, - response::{status::BadRequest, Redirect}, - uri, -}; -use serde_json::json; +use rocket::{get, response::Redirect, uri}; pub mod admin; pub mod album; diff --git a/src/route/track.rs b/src/route/track.rs index c53f75c..fd9bfd2 100644 --- a/src/route/track.rs +++ b/src/route/track.rs @@ -1,11 +1,18 @@ -use crate::library::{track, Libary}; +use crate::library::Libary; use based::{ auth::User, check_admin, - request::api::{api_error, to_uuid, FallibleApiResponse, ToAPI}, + request::{ + api::{api_error, to_uuid, FallibleApiResponse, ToAPI}, + assets::DataResponse, + }, +}; + +use rocket::{ + get, + tokio::{self, io::AsyncReadExt}, + State, }; -use fs::NamedFile; -use rocket::{fs, get, State}; use serde_json::json; #[get("/track/")] @@ -32,23 +39,51 @@ pub async fn track_reload_meta_route( } #[get("/track//audio")] -pub async fn track_audio_route(track_id: &str, lib: &State) -> Option { +pub async fn track_audio_route(track_id: &str, lib: &State) -> Option { let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?; - NamedFile::open(std::path::Path::new(&track.path)) + + let mut buf = Vec::new(); + tokio::fs::File::open(track.path) .await - .ok() + .ok()? + .read(&mut buf) + .await + .ok()?; + + Some(DataResponse::new(buf, "audio/ogg", Some(60 * 60 * 24 * 5))) } #[get("/track//audio/opus128")] -pub async fn track_audio_opus128_route(track_id: &str, lib: &State) -> Option { +pub async fn track_audio_opus128_route( + track_id: &str, + lib: &State, +) -> Option { let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?; - NamedFile::open(track.get_opus(128)?).await.ok() + + let mut buf = Vec::new(); + tokio::fs::File::open(track.get_opus(128)?) + .await + .ok()? + .read(&mut buf) + .await + .ok()?; + + Some(DataResponse::new(buf, "audio/opus", Some(60 * 60 * 24 * 5))) } #[get("/track//audio/aac128")] -pub async fn track_audio_aac128_route(track_id: &str, lib: &State) -> Option { +pub async fn track_audio_aac128_route(track_id: &str, lib: &State) -> Option { let track = lib.get_track_by_id(&to_uuid(track_id).ok()?).await?; - NamedFile::open(track.get_aac(128)?).await.ok() + + let mut buf = Vec::new(); + tokio::fs::File::open(track.get_aac(128)?) + .await + .ok()? + .read(&mut buf) + .await + .ok()?; + + Some(DataResponse::new(buf, "audio/aac", Some(60 * 60 * 24 * 5))) } #[get("/track//lyrics")]