aboutsummaryrefslogtreecommitdiff
path: root/server/src/routes/stream.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r--server/src/routes/stream.rs54
1 files changed, 25 insertions, 29 deletions
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 {