diff --git a/cargo-bazel-lock.json b/cargo-bazel-lock.json index a7934c5..a8c967b 100644 --- a/cargo-bazel-lock.json +++ b/cargo-bazel-lock.json @@ -1,5 +1,5 @@ { - "checksum": "2996b43c92b533a3fbe28004e48e8315d16088515bf0fa7f798508d3560f36ea", + "checksum": "5a7e8bcc015de861e75a5e424861340d76395ab76e1fcac19f1dea3ee4976241", "crates": { "Inflector 0.11.4": { "name": "Inflector", diff --git a/graphql/src/schema/devices.rs b/graphql/src/schema/devices.rs index 40a9fc2..691b339 100644 --- a/graphql/src/schema/devices.rs +++ b/graphql/src/schema/devices.rs @@ -82,12 +82,20 @@ impl DevicesMutation { let io_device = ctx.data::>>().unwrap(); let mut io_device = io_device.lock().await; + let base_url = match devices.clone().into_iter().find(|device| { + device.id == id.to_string() && (device.service == "http" || device.app == "xbmc") + }) { + Some(device) => Some(format!("http://{}:{}", device.host, device.port)), + None => None, + }; + match devices.into_iter().find(|device| { device.id == id.to_string() && (device.service == "grpc" || device.app == "xbmc") }) { Some(device) => { - let current_device = - types::Device::from(device.clone()).is_connected(Some(&device.clone())); + let current_device = types::Device::from(device.clone()) + .is_connected(Some(&device.clone())) + .with_base_url(base_url); connected_device .lock() .unwrap() diff --git a/graphql/src/schema/library.rs b/graphql/src/schema/library.rs index 2cd6ebd..2f65587 100644 --- a/graphql/src/schema/library.rs +++ b/graphql/src/schema/library.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{collections::HashMap, sync::Arc, sync::Mutex as StdMutex}; use async_graphql::{futures_util::FutureExt, *}; use music_player_addons::CurrentDevice; @@ -8,12 +8,11 @@ use music_player_storage::{ repo::{album::AlbumRepository, artist::ArtistRepository, track::TrackRepository}, Database, }; +use music_player_types::types; use sea_orm::{ActiveModelTrait, ActiveValue}; use tokio::sync::Mutex; -use super::{ - objects::{album::Album, artist::Artist, search_result::SearchResult, track::Track}, -}; +use super::objects::{album::Album, artist::Artist, search_result::SearchResult, track::Track}; #[derive(Default)] pub struct LibraryQuery; @@ -26,15 +25,31 @@ impl LibraryQuery { offset: Option, limit: Option, ) -> Result, Error> { + let connected_device = ctx + .data::>>>() + .unwrap(); let current_device = ctx.data::>>().unwrap(); let mut device = current_device.lock().await; if device.source.is_some() { let source = device.source.as_mut().unwrap(); - let tracks = source + let result = source .tracks(offset.unwrap_or(0), limit.unwrap_or(100)) .await?; - return Ok(tracks.into_iter().map(Into::into).collect()); + + let device = connected_device.lock().unwrap(); + let device = device.get("current_device").unwrap(); + let base_url = device.base_url.as_ref().unwrap(); + + let tracks: Vec = result.into_iter().map(Into::into).collect(); + + return Ok(tracks + .into_iter() + .map(|mut track| { + track.uri = format!("{}/tracks/{}", base_url, track.id.to_string()); + track + }) + .collect()); } let db = ctx.data::>>().unwrap(); @@ -78,6 +93,9 @@ impl LibraryQuery { offset: Option, limit: Option, ) -> Result, Error> { + let connected_device = ctx + .data::>>>() + .unwrap(); let current_device = ctx.data::>>().unwrap(); let mut device = current_device.lock().await; @@ -86,7 +104,23 @@ impl LibraryQuery { let albums = source .albums(offset.unwrap_or(0), limit.unwrap_or(100)) .await?; - return Ok(albums.into_iter().map(Into::into).collect()); + + let device = connected_device.lock().unwrap(); + let device = device.get("current_device").unwrap(); + let base_url = device.base_url.as_ref().unwrap(); + + let result: Vec = albums.into_iter().map(Into::into).collect(); + + return Ok(result + .into_iter() + .map(|mut album| { + album.cover = match album.cover { + Some(cover) => Some(format!("{}/covers/{}", base_url, cover)), + None => None, + }; + album + }) + .collect()); } let db = ctx.data::>>().unwrap(); diff --git a/types/src/types.rs b/types/src/types.rs index c90842e..9f007c6 100644 --- a/types/src/types.rs +++ b/types/src/types.rs @@ -299,6 +299,14 @@ pub struct Device { pub service: String, pub app: String, pub is_connected: bool, + pub base_url: Option, +} + +impl Device { + pub fn with_base_url(&mut self, base_url: Option) -> Self { + self.base_url = base_url; + self.clone() + } } impl From for Device { @@ -320,6 +328,7 @@ impl From for Device { service: srv.get_fullname().to_owned(), app: "xbmc".to_owned(), is_connected: false, + base_url: None, }; } @@ -347,6 +356,7 @@ impl From for Device { service: srv.get_fullname().split("-").collect::>()[0].to_owned(), app: "music-player".to_owned(), is_connected: false, + base_url: None, }; }