diff --git a/Cargo.lock b/Cargo.lock
index c061fe4..e8c96a7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4141,6 +4141,7 @@ dependencies = [
"prost",
"spoticord_api_grpc",
"spoticord_database",
+ "spoticord_player",
"spoticord_session",
"thiserror",
"tokio",
@@ -4198,6 +4199,7 @@ dependencies = [
"hex",
"librespot",
"log",
+ "rand",
"songbird",
"spoticord_audio",
"spoticord_utils",
diff --git a/spoticord_api/Cargo.toml b/spoticord_api/Cargo.toml
index 95a341e..dfaf5af 100644
--- a/spoticord_api/Cargo.toml
+++ b/spoticord_api/Cargo.toml
@@ -7,10 +7,11 @@ edition = "2021"
spoticord_database = { path = "../spoticord_database" }
spoticord_session = { path = "../spoticord_session" }
spoticord_api_grpc = { path = "../spoticord_api_grpc"}
+spoticord_player = { path = "../spoticord_player"}
prost = "0.13.3"
tokio = {version = "1.38.0", features = ["io-util", "net", "rt-multi-thread"]}
axum = "0.7.5"
env_logger = "0.11.3"
log = "0.4.21"
thiserror = "1.0.61"
-tonic = "0.12.3"
+tonic = "0.12.3"
\ No newline at end of file
diff --git a/spoticord_api/src/lib.rs b/spoticord_api/src/lib.rs
index fb25578..800897b 100644
--- a/spoticord_api/src/lib.rs
+++ b/spoticord_api/src/lib.rs
@@ -1,5 +1,6 @@
use log::info;
-use spoticord_api_grpc::spoticord_api::service::PlayPlaylistRequest;
+use spoticord_api_grpc::spoticord_api::service::{PlayModes, PlayPlaylistRequest};
+use spoticord_player::playback_control::{PlayPlaylist, StartAt};
use spoticord_session::manager::{SessionManager, SessionQuery};
use tonic::{Request, Response, Status};
@@ -26,7 +27,19 @@ impl spoticord_api_grpc::spoticord_api::service::spoticord_api_server::Spoticord
.get_session(SessionQuery::Owner(playlist.discord_user_id.into()))
.unwrap();
- session.queue_playlist(playlist.playlist_uri).await.unwrap();
+ let shuffle = match playlist.order() {
+ PlayModes::Shuffle => true,
+ PlayModes::InOrder => false,
+ };
+
+ let play_playlist = PlayPlaylist {
+ uri: playlist.playlist_uri,
+ shuffle,
+ repeat: true,
+ start_at: StartAt::FirstSong,
+ };
+
+ session.queue_playlist(play_playlist).await.unwrap();
let response = spoticord_api_grpc::spoticord_api::service::Response {
resp: Option::from(
diff --git a/spoticord_player/Cargo.toml b/spoticord_player/Cargo.toml
index ac0b178..b15c5ee 100644
--- a/spoticord_player/Cargo.toml
+++ b/spoticord_player/Cargo.toml
@@ -16,3 +16,4 @@ anyhow = "1.0.86"
log = "0.4.22"
symphonia = { version = "0.5.4", default-features = false, features = ["pcm"] }
hex = "0.4.3"
+rand = "0.8.5"
diff --git a/spoticord_player/src/lib.rs b/spoticord_player/src/lib.rs
index f927f76..b5e567d 100644
--- a/spoticord_player/src/lib.rs
+++ b/spoticord_player/src/lib.rs
@@ -1,5 +1,7 @@
pub mod info;
+pub mod playback_control;
+use crate::playback_control::{PlayPlaylist, StartAt};
use anyhow::Result;
use info::PlaybackInfo;
use librespot::connect::spirc::SpircLoadCommand;
@@ -18,6 +20,7 @@ use librespot::{
},
};
use log::{error, trace};
+use rand::{thread_rng, Rng};
use songbird::{input::RawAdapter, tracks::TrackHandle, Call};
use spoticord_audio::{
sink::{SinkEvent, StreamSink},
@@ -38,7 +41,7 @@ enum PlayerCommand {
GetPlaybackInfo(oneshot::Sender