diff options
author | metamuffin <metamuffin@disroot.org> | 2023-08-02 01:03:16 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-08-02 01:03:16 +0200 |
commit | 14e01792e33631d134fe895018d3bef5ea74a958 (patch) | |
tree | 5c4f0105140541cd479a58c1abb598caaee2d94b /server/src/routes/stream.rs | |
parent | 6eafafe5297c54aa5cb38790c45ba189b47d755e (diff) | |
download | jellything-14e01792e33631d134fe895018d3bef5ea74a958.tar jellything-14e01792e33631d134fe895018d3bef5ea74a958.tar.bz2 jellything-14e01792e33631d134fe895018d3bef5ea74a958.tar.zst |
move client code to its own crate
Diffstat (limited to 'server/src/routes/stream.rs')
-rw-r--r-- | server/src/routes/stream.rs | 54 |
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 { |