aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-02 01:03:16 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-02 01:03:16 +0200
commit14e01792e33631d134fe895018d3bef5ea74a958 (patch)
tree5c4f0105140541cd479a58c1abb598caaee2d94b /server/src/routes
parent6eafafe5297c54aa5cb38790c45ba189b47d755e (diff)
downloadjellything-14e01792e33631d134fe895018d3bef5ea74a958.tar
jellything-14e01792e33631d134fe895018d3bef5ea74a958.tar.bz2
jellything-14e01792e33631d134fe895018d3bef5ea74a958.tar.zst
move client code to its own crate
Diffstat (limited to 'server/src/routes')
-rw-r--r--server/src/routes/api/mod.rs24
-rw-r--r--server/src/routes/stream.rs54
-rw-r--r--server/src/routes/ui/error.rs7
-rw-r--r--server/src/routes/ui/player.rs9
4 files changed, 31 insertions, 63 deletions
diff --git a/server/src/routes/api/mod.rs b/server/src/routes/api/mod.rs
index 84dd6a8..b39950c 100644
--- a/server/src/routes/api/mod.rs
+++ b/server/src/routes/api/mod.rs
@@ -9,7 +9,6 @@ use super::ui::{
error::MyResult,
};
use crate::database::Database;
-use reqwest::Client;
use rocket::{get, post, response::Redirect, serde::json::Json, State};
use serde_json::{json, Value};
@@ -28,26 +27,3 @@ pub fn r_api_account_login(database: &State<Database>, data: Json<LoginForm>) ->
let token = login_logic(database, &data.username, &data.password)?;
Ok(json!(token))
}
-pub async fn c_api_account_login(
- host: &str,
- tls: bool,
- username: String,
- password: String,
- expire: u64,
-) -> MyResult<String> {
- Ok(Client::builder()
- .build()?
- .post(format!(
- "{}://{host}/api/account/login",
- if tls { "https" } else { "http" }
- ))
- .body(serde_json::to_string(&LoginForm {
- expire,
- password,
- username,
- })?)
- .send()
- .await?
- .json()
- .await?)
-}
diff --git a/server/src/routes/stream.rs b/server/src/routes/stream.rs
index 19a3f09..1277646 100644
--- a/server/src/routes/stream.rs
+++ b/server/src/routes/stream.rs
@@ -4,7 +4,7 @@
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
use super::ui::{account::session::Session, error::MyError};
-use crate::{database::Database, routes::api::c_api_account_login, uri, CONF};
+use crate::{database::Database, CONF};
use anyhow::{anyhow, Result};
use jellycommon::MediaSource;
use jellyremuxer::RemuxerContext;
@@ -16,23 +16,13 @@ use rocket::{
response::{self, Redirect, Responder},
Either, Request, Response, State,
};
-use std::ops::{Deref, Range};
+use std::{
+ ops::{Deref, Range},
+ time::Duration,
+};
use tokio::io::{duplex, DuplexStream};
use tokio_util::io::SyncIoBridge;
-pub fn stream_uri(id: &str, tracks: &[u64], webm: bool) -> String {
- format!(
- "/n/{}/stream?tracks={}&webm={}",
- id,
- tracks
- .iter()
- .map(|v| format!("{v}"))
- .collect::<Vec<_>>()
- .join(","),
- if webm { "1" } else { "0" }
- )
-}
-
#[get("/n/<id>/stream?<tracks>&<webm>")]
pub async fn r_stream(
_sess: Session,
@@ -49,6 +39,11 @@ pub async fn r_stream(
.source
.ok_or(anyhow!("item does not contain media"))?;
+ let tracks = tracks
+ .split(',')
+ .map(|e| e.parse().map_err(|_| anyhow!("invalid number")))
+ .collect::<Result<Vec<_>, _>>()?;
+
let source_tracks = match source {
MediaSource::Local { tracks } => tracks,
MediaSource::Remote { host, remote_id } => {
@@ -56,15 +51,22 @@ pub async fn r_stream(
.remote_credentials
.get(&host)
.ok_or(anyhow!("no credentials on the server-side"))?;
- let token =
- c_api_account_login(&host, false, username.to_owned(), password.to_owned(), 60)
- .await?;
- let uri = format!(
- "{}://{host}{}&session={}",
- if *tls { "https" } else { "http" },
- uri!(r_stream(remote_id, tracks, webm)),
- token
+ let instance = jellyclient::Instance { host, tls: *tls };
+ let session = jellyclient::login(
+ &instance,
+ username.to_owned(),
+ password.to_owned(),
+ Duration::from_secs(60),
+ )
+ .await?;
+
+ let uri = jellyclient::stream(
+ &instance,
+ &session,
+ &remote_id,
+ &tracks,
+ webm.unwrap_or(false),
);
return Ok(Either::Right(Redirect::found(uri)));
}
@@ -79,13 +81,7 @@ pub async fn r_stream(
);
let (a, b) = duplex(4096);
-
let remuxer = remuxer.deref().clone();
- let tracks = tracks
- .split(',')
- .map(|e| e.parse().map_err(|_| anyhow!("invalid number")))
- .collect::<Result<Vec<_>, _>>()?;
-
let b = SyncIoBridge::new(b);
let urange = match &range {
diff --git a/server/src/routes/ui/error.rs b/server/src/routes/ui/error.rs
index d911a41..01aebd3 100644
--- a/server/src/routes/ui/error.rs
+++ b/server/src/routes/ui/error.rs
@@ -90,9 +90,4 @@ impl From<serde_json::Error> for MyError {
fn from(err: serde_json::Error) -> Self {
MyError(anyhow::anyhow!("{err}"))
}
-}
-impl From<reqwest::Error> for MyError {
- fn from(err: reqwest::Error) -> Self {
- MyError(anyhow::anyhow!("{err}"))
- }
-}
+} \ No newline at end of file
diff --git a/server/src/routes/ui/player.rs b/server/src/routes/ui/player.rs
index 2af9d9e..e295b02 100644
--- a/server/src/routes/ui/player.rs
+++ b/server/src/routes/ui/player.rs
@@ -7,7 +7,7 @@ use super::{account::session::Session, layout::LayoutPage};
use crate::{
database::Database,
routes::{
- stream::stream_uri,
+ stream::rocket_uri_macro_r_stream,
ui::{
assets::{rocket_uri_macro_r_item_assets, AssetRole},
error::MyResult,
@@ -21,7 +21,6 @@ use jellycommon::{Node, SourceTrackKind};
use markup::DynRender;
use rocket::{get, FromForm, State};
-
#[derive(FromForm, Default, Clone, Debug)]
pub struct PlayerConfig {
pub a: Option<u64>,
@@ -47,7 +46,9 @@ pub fn r_player(
.chain(conf.v.into_iter())
.chain(conf.a.into_iter())
.chain(conf.s.into_iter())
- .collect::<Vec<_>>();
+ .map(|e| format!("{e}"))
+ .collect::<Vec<_>>()
+ .join(",");
let conf = player_conf(item.clone(), !tracks.is_empty())?;
Ok(LayoutPage {
@@ -57,7 +58,7 @@ pub fn r_player(
@if tracks.is_empty() {
img.backdrop[src=uri!(r_item_assets(&id, AssetRole::Backdrop)).to_string()];
} else {
- video[src=stream_uri(&id, &tracks, true), controls]{}
+ video[src=uri!(r_stream(&id, &tracks, Some(true))), controls]{}
}
@conf
},