From a0a044c04e7e18c1ba62dcfce586b97d35435235 Mon Sep 17 00:00:00 2001 From: Jeff Zhao Date: Wed, 23 Nov 2022 11:46:26 -0500 Subject: [PATCH] code cleanup --- README.md | 2 +- config/server.toml | 3 - lib/dizi_lib/src/error/error_kind.rs | 8 +- lib/dizi_lib/src/error/error_type.rs | 10 ++ lib/dizi_lib/src/player.rs | 16 ++- lib/dizi_lib/src/response/server.rs | 61 ++++++--- lib/dizi_lib/src/song.rs | 22 ++-- src/client/commands/goto.rs | 2 +- src/client/config/option/sort_type.rs | 6 +- src/client/context/app_context.rs | 3 +- src/client/util/format.rs | 2 - src/server/audio/mod.rs | 1 - src/server/audio/rodio/player.rs | 2 +- src/server/audio/symphonia/decode.rs | 10 +- src/server/audio/symphonia/player.rs | 27 ++-- src/server/audio/symphonia/stream.rs | 116 ++++++++++-------- src/server/config/general/app.rs | 10 +- src/server/context/app_context.rs | 4 +- src/server/context/playlist_context.rs | 2 +- src/server/main.rs | 1 + src/server/playlist/mod.rs | 2 - .../impl_ordered_playlist.rs | 2 +- .../impl_shuffle_playlist.rs | 9 +- src/server/playlist/playlist_directory/mod.rs | 17 ++- .../playlist_file/impl_ordered_playlist.rs | 2 +- .../playlist_file/impl_shuffle_playlist.rs | 9 +- src/server/playlist/playlist_file/mod.rs | 33 +++-- src/server/playlist/traits/mod.rs | 5 - src/server/server.rs | 6 +- src/server/server_commands/playlist.rs | 6 +- src/server/server_util.rs | 2 +- .../traits.rs => traits/audio_player.rs} | 0 src/server/traits/mod.rs | 7 ++ .../{playlist => }/traits/ordered_playlist.rs | 0 .../{playlist => }/traits/shuffle_playlist.rs | 3 - 35 files changed, 221 insertions(+), 190 deletions(-) delete mode 100644 src/server/playlist/traits/mod.rs rename src/server/{audio/traits.rs => traits/audio_player.rs} (100%) create mode 100644 src/server/traits/mod.rs rename src/server/{playlist => }/traits/ordered_playlist.rs (100%) rename src/server/{playlist => }/traits/shuffle_playlist.rs (50%) diff --git a/README.md b/README.md index 76b9a8c..953bb0f 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ whenever mocp is playing music, other audio/video apps stop working and vice ver ``` ~ $ dizi-server # starts server ~ $ RUST_LOG=debug dizi-server # starts server with debug messages enabled -~ $ dizi # starts server if not already started +~ $ dizi # starts server if not already started, then starts frontend ``` ## Configuration diff --git a/config/server.toml b/config/server.toml index 7948df2..fec0059 100644 --- a/config/server.toml +++ b/config/server.toml @@ -4,9 +4,6 @@ socket = "~/dizi-server-socket" # Where to save playlist on exit playlist = "~/dizi_playlist.m3u" -# not implemented -poll_rate = 200 - # supports alsa, jack audio_system = "alsa" diff --git a/lib/dizi_lib/src/error/error_kind.rs b/lib/dizi_lib/src/error/error_kind.rs index acf85c2..83c6d02 100644 --- a/lib/dizi_lib/src/error/error_kind.rs +++ b/lib/dizi_lib/src/error/error_kind.rs @@ -20,12 +20,12 @@ pub enum DiziErrorKind { SendError, ReceiveError, - #[cfg(feature = "symphonia-backend")] SymphoniaError(symphonia::core::errors::Error), CpalBuildStreamError(cpal::BuildStreamError), CpalPlayStreamError(cpal::PlayStreamError), + CpalPauseStreamError(cpal::PauseStreamError), NoDevice, UnrecognizedFormat, @@ -111,3 +111,9 @@ impl From for DiziErrorKind { Self::CpalPlayStreamError(e) } } + +impl From for DiziErrorKind { + fn from(e: cpal::PauseStreamError) -> Self { + Self::CpalPauseStreamError(e) + } +} diff --git a/lib/dizi_lib/src/error/error_type.rs b/lib/dizi_lib/src/error/error_type.rs index 4a5120a..806f8d2 100644 --- a/lib/dizi_lib/src/error/error_type.rs +++ b/lib/dizi_lib/src/error/error_type.rs @@ -158,3 +158,13 @@ impl From for DiziError { } } } + +impl From for DiziError { + fn from(err: cpal::PauseStreamError) -> Self { + let _cause = err.to_string(); + Self { + _kind: DiziErrorKind::from(err), + _cause, + } + } +} diff --git a/lib/dizi_lib/src/player.rs b/lib/dizi_lib/src/player.rs index a8ff861..88f9992 100644 --- a/lib/dizi_lib/src/player.rs +++ b/lib/dizi_lib/src/player.rs @@ -120,7 +120,11 @@ impl PlayerState { Ok(s) => Ok(s), Err(e) => Err(DiziError::new( DiziErrorKind::InvalidParameters, - format!("Failed to process query '{}', Reason: '{}'", query, e.to_string()), + format!( + "Failed to process query '{}', Reason: '{}'", + query, + e.to_string() + ), )), } } @@ -177,10 +181,16 @@ impl PlayerState { song.file_path().to_string_lossy().to_string(), ); for (tag, value) in song.music_metadata().standard_tags.iter() { - vars.insert(format!("song.tag.{}", tag.to_lowercase()), value.to_string()); + vars.insert( + format!("song.tag.{}", tag.to_lowercase()), + value.to_string(), + ); } if let Some(total_duration) = song.audio_metadata().total_duration.as_ref() { - vars.insert("song.total_duration".to_string(), total_duration.as_secs().to_string()); + vars.insert( + "song.total_duration".to_string(), + total_duration.as_secs().to_string(), + ); } } } diff --git a/lib/dizi_lib/src/response/server.rs b/lib/dizi_lib/src/response/server.rs index 99bc828..4e2ed81 100644 --- a/lib/dizi_lib/src/response/server.rs +++ b/lib/dizi_lib/src/response/server.rs @@ -10,31 +10,62 @@ use crate::song::Song; pub enum ServerBroadcastEvent { // server is shutting down ServerQuit, - ServerError { msg: String }, - ServerQuery { query: String }, - ServerQueryAll { query_items: HashMap }, + ServerError { + msg: String, + }, + ServerQuery { + query: String, + }, + ServerQueryAll { + query_items: HashMap, + }, // player status updates - PlayerState { state: PlayerState }, + PlayerState { + state: PlayerState, + }, - PlayerFilePlay { song: Song }, + PlayerFilePlay { + song: Song, + }, PlayerPause, PlayerResume, PlayerStop, - PlayerRepeat { on: bool }, - PlayerShuffle { on: bool }, - PlayerNext { on: bool }, + PlayerRepeat { + on: bool, + }, + PlayerShuffle { + on: bool, + }, + PlayerNext { + on: bool, + }, - PlayerVolumeUpdate { volume: usize }, - PlayerProgressUpdate { elapsed: time::Duration }, + PlayerVolumeUpdate { + volume: usize, + }, + PlayerProgressUpdate { + elapsed: time::Duration, + }, // playlist - PlaylistOpen { state: PlayerState }, - PlaylistPlay { index: usize }, - PlaylistAppend { songs: Vec }, - PlaylistRemove { index: usize }, - PlaylistSwapMove { index1: usize, index2: usize }, + PlaylistOpen { + state: PlayerState, + }, + PlaylistPlay { + index: usize, + }, + PlaylistAppend { + songs: Vec, + }, + PlaylistRemove { + index: usize, + }, + PlaylistSwapMove { + index1: usize, + index2: usize, + }, PlaylistClear, } diff --git a/lib/dizi_lib/src/song.rs b/lib/dizi_lib/src/song.rs index 120182c..d84d1ff 100644 --- a/lib/dizi_lib/src/song.rs +++ b/lib/dizi_lib/src/song.rs @@ -1,10 +1,10 @@ use std::collections::HashMap; -use std::path::{Path, PathBuf}; -use std::time; #[cfg(not(feature = "symphonia-backend"))] use std::fs::File; #[cfg(not(feature = "symphonia-backend"))] use std::io::BufReader; +use std::path::{Path, PathBuf}; +use std::time; #[cfg(feature = "rodio-backend")] use rodio::decoder::Decoder; @@ -96,8 +96,7 @@ impl Song { // Create the media source stream. let mss = MediaSourceStream::new(Box::new(src), Default::default()); - let probed = symphonia::default::get_probe() - .format(&hint, mss, &fmt_opts, &meta_opts)?; + let probed = symphonia::default::get_probe().format(&hint, mss, &fmt_opts, &meta_opts)?; // Get the instantiated format reader. let mut format = probed.format; @@ -109,7 +108,9 @@ impl Song { .map(|track| AudioMetadata::from(&track.codec_params)) .unwrap_or_else(|| AudioMetadata::default()); - let music_metadata = format.metadata().skip_to_latest() + let music_metadata = format + .metadata() + .skip_to_latest() .map(|metadata| MusicMetadata::from(metadata)) .unwrap_or_else(|| MusicMetadata::default()); @@ -207,11 +208,16 @@ pub struct MusicMetadata { #[cfg(feature = "symphonia-backend")] impl std::convert::From<&MetadataRevision> for MusicMetadata { fn from(metadata: &MetadataRevision) -> Self { - let standard_tags: HashMap = metadata.tags() + let standard_tags: HashMap = metadata + .tags() .iter() - .filter_map(|tag| tag.std_key.map(|std_key| (format!("{:?}", std_key), tag.value.to_string()))) + .filter_map(|tag| { + tag.std_key + .map(|std_key| (format!("{:?}", std_key), tag.value.to_string())) + }) .collect(); - let tags: HashMap = metadata.tags() + let tags: HashMap = metadata + .tags() .iter() .filter(|tag| tag.std_key.is_none()) .map(|tag| (tag.key.to_owned(), tag.value.to_string())) diff --git a/src/client/commands/goto.rs b/src/client/commands/goto.rs index fbec9ea..3a8b849 100644 --- a/src/client/commands/goto.rs +++ b/src/client/commands/goto.rs @@ -33,7 +33,7 @@ fn _playlist_goto_playing(context: &mut AppContext) -> DiziResult { .playlist() .iter() .enumerate() - .find(|(i, song)| song.file_path() == file_path) + .find(|(_, song)| song.file_path() == file_path) { set_playlist_index(context, index); } diff --git a/src/client/config/option/sort_type.rs b/src/client/config/option/sort_type.rs index a00ad29..b2fe1ad 100644 --- a/src/client/config/option/sort_type.rs +++ b/src/client/config/option/sort_type.rs @@ -124,7 +124,7 @@ fn size_sort(file1: &JoshutoDirEntry, file2: &JoshutoDirEntry) -> cmp::Ordering fn ext_sort(file1: &JoshutoDirEntry, file2: &JoshutoDirEntry) -> cmp::Ordering { let f1_ext = file1.get_ext(); let f2_ext = file2.get_ext(); - alphanumeric_sort::compare_str(&f1_ext, &f2_ext) + alphanumeric_sort::compare_str(f1_ext, f2_ext) } fn lexical_sort( @@ -151,10 +151,10 @@ fn natural_sort( let f1_name = f1.file_name(); let f2_name = f2.file_name(); if sort_option.case_sensitive { - alphanumeric_sort::compare_str(&f1_name, &f2_name) + alphanumeric_sort::compare_str(f1_name, f2_name) } else { let f1_name = f1_name.to_lowercase(); let f2_name = f2_name.to_lowercase(); - alphanumeric_sort::compare_str(&f1_name, &f2_name) + alphanumeric_sort::compare_str(f1_name, f2_name) } } diff --git a/src/client/context/app_context.rs b/src/client/context/app_context.rs index 7784b5a..0c48787 100644 --- a/src/client/context/app_context.rs +++ b/src/client/context/app_context.rs @@ -75,8 +75,7 @@ impl AppContext { } pub fn flush_stream(&mut self) -> io::Result<()> { - utils::flush(&mut self.stream)?; - Ok(()) + utils::flush(&mut self.stream) } // event related diff --git a/src/client/util/format.rs b/src/client/util/format.rs index dca034e..05502ef 100644 --- a/src/client/util/format.rs +++ b/src/client/util/format.rs @@ -1,5 +1,3 @@ -use std::time; - pub fn file_size_to_string(file_size: u64) -> String { const FILE_UNITS: [&str; 6] = ["B", "K", "M", "G", "T", "E"]; const CONV_RATE: f64 = 1024.0; diff --git a/src/server/audio/mod.rs b/src/server/audio/mod.rs index 4ab0139..cb0fe6e 100644 --- a/src/server/audio/mod.rs +++ b/src/server/audio/mod.rs @@ -4,4 +4,3 @@ pub mod request; pub mod rodio; #[cfg(feature = "symphonia-backend")] pub mod symphonia; -pub mod traits; diff --git a/src/server/audio/rodio/player.rs b/src/server/audio/rodio/player.rs index ad29788..37fa7d1 100644 --- a/src/server/audio/rodio/player.rs +++ b/src/server/audio/rodio/player.rs @@ -15,13 +15,13 @@ use dizi_lib::song::Song; use crate::audio::device::get_default_host; use crate::audio::request::PlayerRequest; use crate::audio::rodio::stream::PlayerStream; -use crate::audio::traits::AudioPlayer; use crate::config; use crate::context::PlaylistContext; use crate::events::ServerEventSender; use crate::playlist::playlist_directory::PlaylistDirectory; use crate::playlist::playlist_file::PlaylistFile; use crate::playlist::traits::{OrderedPlaylist, ShufflePlaylist}; +use crate::traits::AudioPlayer; use crate::util::mimetype::{get_mimetype, is_mimetype_audio, is_mimetype_video}; pub struct RodioPlayer { diff --git a/src/server/audio/symphonia/decode.rs b/src/server/audio/symphonia/decode.rs index 28cac93..5a31d4c 100644 --- a/src/server/audio/symphonia/decode.rs +++ b/src/server/audio/symphonia/decode.rs @@ -10,7 +10,7 @@ use symphonia::core::formats::{FormatReader, Packet}; use cpal::traits::{DeviceTrait, StreamTrait}; use cpal::{Stream, StreamConfig}; -use dizi_lib::error::{DiziError, DiziErrorKind, DiziResult}; +use dizi_lib::error::{DiziError, DiziResult}; use symphonia::core::units::TimeBase; use crate::audio::request::PlayerRequest; @@ -90,7 +90,7 @@ impl PacketDecoder { SampleBuffer::new(decoded.frames() as u64, spec); samples.copy_interleaved_ref(decoded); - let sample_data: Vec = samples.samples().iter().map(|s| *s).collect(); + let sample_data: Vec = samples.samples().to_vec(); Ok(sample_data) } else { Ok(vec![]) @@ -215,10 +215,8 @@ where if let Some(stream_tx) = stream_tx.as_ref() { let _ = stream_tx.send(StreamEvent::Progress(new_duration)); } - { - let mut duration = playback_duration.write().unwrap(); - *duration = new_duration.as_secs(); - } + let mut duration = playback_duration.write().unwrap(); + *duration = new_duration.as_secs(); } }, err_fn, diff --git a/src/server/audio/symphonia/player.rs b/src/server/audio/symphonia/player.rs index 5fc47d2..87c1d73 100644 --- a/src/server/audio/symphonia/player.rs +++ b/src/server/audio/symphonia/player.rs @@ -14,13 +14,12 @@ use log::{debug, log_enabled, Level}; use crate::audio::device::get_default_host; use crate::audio::request::PlayerRequest; use crate::audio::symphonia::stream::PlayerStream; -use crate::audio::traits::AudioPlayer; use crate::config; use crate::context::PlaylistContext; use crate::events::ServerEventSender; use crate::playlist::playlist_directory::PlaylistDirectory; use crate::playlist::playlist_file::PlaylistFile; -use crate::playlist::traits::{OrderedPlaylist, ShufflePlaylist}; +use crate::traits::{AudioPlayer, OrderedPlaylist, ShufflePlaylist}; use crate::util::mimetype::{get_mimetype, is_mimetype_audio, is_mimetype_video}; #[derive(Debug)] @@ -51,10 +50,14 @@ impl SymphoniaPlayer { let server_config = config_t.server_ref(); let player_config = server_config.player_ref(); - let mut playlist_context = PlaylistContext::default(); - playlist_context.file_playlist = - PlaylistFile::from_file(&PathBuf::from("/"), server_config.playlist_ref()) - .unwrap_or_else(|_| PlaylistFile::new(Vec::new())); + let playlist_context = PlaylistContext { + file_playlist: PlaylistFile::from_file( + &PathBuf::from("/"), + server_config.playlist_ref(), + ) + .unwrap_or_else(|_| PlaylistFile::new(Vec::new())), + ..Default::default() + }; let state = PlayerState { next: player_config.next, @@ -89,7 +92,7 @@ impl SymphoniaPlayer { song: song.clone(), volume: self.get_volume() as f32 / 100.0, })?; - let _resp = self.player_stream_res().recv()??; + self.player_stream_res().recv()??; self.state.status = PlayerStatus::Playing; self.state.song = Some(song.clone()); @@ -125,8 +128,7 @@ impl AudioPlayer for SymphoniaPlayer { .map(|(i, _)| i); playlist.set_playlist_index(index); - playlist.set_shuffle(shuffle_enabled); - if playlist.shuffle_enabled() { + if shuffle_enabled { playlist.shuffle(); } if let Some(entry) = playlist.current_entry_details() { @@ -147,8 +149,7 @@ impl AudioPlayer for SymphoniaPlayer { // unshuffle the playlist before choosing setting the new index playlist.unshuffle(); playlist.set_playlist_index(Some(index)); - playlist.set_shuffle(shuffle_enabled); - if playlist.shuffle_enabled() { + if shuffle_enabled { playlist.shuffle(); } if let Some(entry) = playlist.current_entry_details() { @@ -258,10 +259,6 @@ impl AudioPlayer for SymphoniaPlayer { } fn set_shuffle(&mut self, shuffle: bool) { self.state.shuffle = shuffle; - self.playlist_mut().file_playlist_mut().set_shuffle(shuffle); - self.playlist_mut() - .directory_playlist_mut() - .set_shuffle(shuffle); if self.shuffle_enabled() { self.playlist_mut().file_playlist_mut().shuffle(); self.playlist_mut().directory_playlist_mut().shuffle(); diff --git a/src/server/audio/symphonia/stream.rs b/src/server/audio/symphonia/stream.rs index 65f740c..ae331b8 100644 --- a/src/server/audio/symphonia/stream.rs +++ b/src/server/audio/symphonia/stream.rs @@ -114,23 +114,23 @@ impl PlayerStream { } } - pub fn pause(&mut self) -> Result<(), mpsc::SendError> { + pub fn pause(&mut self) -> DiziResult { if let Some(state) = self.state.as_ref() { - let _ = state.stream.pause(); + state.stream.pause()?; } Ok(()) } - pub fn resume(&mut self) -> Result<(), mpsc::SendError> { + pub fn resume(&mut self) -> DiziResult { if let Some(state) = self.state.as_ref() { - let _ = state.stream.play(); + state.stream.play()?; } Ok(()) } - pub fn stop(&mut self) -> Result<(), mpsc::SendError> { + pub fn stop(&mut self) -> DiziResult { self.state.take(); Ok(()) } - pub fn fast_forward(&mut self, offset: Duration) -> Result<(), mpsc::SendError> { + pub fn fast_forward(&mut self, offset: Duration) -> DiziResult { if let Some(state) = self.state.as_ref() { state .playback_loop_tx @@ -138,7 +138,7 @@ impl PlayerStream { } Ok(()) } - pub fn rewind(&mut self, offset: Duration) -> Result<(), mpsc::SendError> { + pub fn rewind(&mut self, offset: Duration) -> DiziResult { if let Some(state) = self.state.as_ref() { state .playback_loop_tx @@ -158,54 +158,64 @@ impl PlayerStream { pub fn listen_for_events(&mut self) -> DiziResult { while let Ok(msg) = self.event_poller.next() { match msg { - PlayerStreamEvent::Player(req) => match req { - PlayerRequest::Play { song, volume } => { - let stream_res = self.play(song.file_path(), volume); - match stream_res { - Ok(stream_res) => { - let (stream, playback_loop_tx) = stream_res; - self.state = Some(PlayerStreamState { - stream, - playback_loop_tx, - }); - self.event_poller.player_res().send(Ok(()))?; - } - Err(e) => self.event_poller.player_res().send(Err(e))?, - }; - } - PlayerRequest::Pause => { - self.pause()?; - self.event_poller.player_res().send(Ok(()))?; - } - PlayerRequest::Stop => { - self.stop()?; - self.event_poller.player_res().send(Ok(()))?; - } - PlayerRequest::Resume => { - self.resume()?; - self.event_poller.player_res().send(Ok(()))?; - } - PlayerRequest::SetVolume { volume } => { - self.set_volume(volume); + PlayerStreamEvent::Player(req) => self.process_player_req(req)?, + PlayerStreamEvent::Stream(event) => self.process_stream_event(event)?, + } + } + Ok(()) + } + + fn process_player_req(&mut self, req: PlayerRequest) -> DiziResult { + match req { + PlayerRequest::Play { song, volume } => { + let stream_res = self.play(song.file_path(), volume); + match stream_res { + Ok(stream_res) => { + let (stream, playback_loop_tx) = stream_res; + self.state = Some(PlayerStreamState { + stream, + playback_loop_tx, + }); self.event_poller.player_res().send(Ok(()))?; } - PlayerRequest::FastForward { offset } => { - self.fast_forward(offset)?; - } - PlayerRequest::Rewind { offset } => { - self.rewind(offset)?; - } - }, - PlayerStreamEvent::Stream(event) => match event { - StreamEvent::StreamEnded => { - self.stop()?; - self.event_tx.send(ServerEvent::PlayerDone)?; - } - StreamEvent::Progress(duration) => { - self.event_tx - .send(ServerEvent::PlayerProgressUpdate(duration))?; - } - }, + Err(e) => self.event_poller.player_res().send(Err(e))?, + }; + } + PlayerRequest::Pause => { + self.pause()?; + self.event_poller.player_res().send(Ok(()))?; + } + PlayerRequest::Stop => { + self.stop()?; + self.event_poller.player_res().send(Ok(()))?; + } + PlayerRequest::Resume => { + self.resume()?; + self.event_poller.player_res().send(Ok(()))?; + } + PlayerRequest::SetVolume { volume } => { + self.set_volume(volume); + self.event_poller.player_res().send(Ok(()))?; + } + PlayerRequest::FastForward { offset } => { + self.fast_forward(offset)?; + } + PlayerRequest::Rewind { offset } => { + self.rewind(offset)?; + } + } + Ok(()) + } + + fn process_stream_event(&mut self, event: StreamEvent) -> DiziResult { + match event { + StreamEvent::StreamEnded => { + self.stop()?; + self.event_tx.send(ServerEvent::PlayerDone)?; + } + StreamEvent::Progress(duration) => { + self.event_tx + .send(ServerEvent::PlayerProgressUpdate(duration))?; } } Ok(()) diff --git a/src/server/config/general/app.rs b/src/server/config/general/app.rs index f76bb7b..2f2ae11 100644 --- a/src/server/config/general/app.rs +++ b/src/server/config/general/app.rs @@ -10,7 +10,7 @@ pub struct AppConfigRaw { pub server: ServerConfigRaw, } -#[derive(Debug, Clone)] +#[derive(Clone, Debug, Default)] pub struct AppConfig { server: ServerConfig, } @@ -33,14 +33,6 @@ impl AppConfig { } } -impl std::default::Default for AppConfig { - fn default() -> Self { - Self { - server: ServerConfig::default(), - } - } -} - impl TomlConfigFile for AppConfig { fn get_config(file_name: &str) -> Self { match parse_toml_to_config::(file_name) { diff --git a/src/server/context/app_context.rs b/src/server/context/app_context.rs index 81dbd36..e96205d 100644 --- a/src/server/context/app_context.rs +++ b/src/server/context/app_context.rs @@ -2,11 +2,11 @@ use crate::audio::rodio::player::RodioPlayer; #[cfg(feature = "symphonia-backend")] use crate::audio::symphonia::player::SymphoniaPlayer; -use crate::audio::traits::AudioPlayer; use crate::config; use crate::events::Events; +use crate::traits::AudioPlayer; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum QuitType { DoNot, Server, diff --git a/src/server/context/playlist_context.rs b/src/server/context/playlist_context.rs index 25d1b07..e3d9af0 100644 --- a/src/server/context/playlist_context.rs +++ b/src/server/context/playlist_context.rs @@ -2,7 +2,7 @@ use dizi_lib::playlist::PlaylistType; use crate::playlist::playlist_directory::PlaylistDirectory; use crate::playlist::playlist_file::PlaylistFile; -use crate::playlist::traits::{OrderedPlaylist, OrderedPlaylistEntry}; +use crate::traits::{OrderedPlaylist, OrderedPlaylistEntry}; #[derive(Clone, Debug)] pub struct PlaylistContext { diff --git a/src/server/main.rs b/src/server/main.rs index 86c4c65..0c70bc4 100644 --- a/src/server/main.rs +++ b/src/server/main.rs @@ -7,6 +7,7 @@ mod playlist; mod server; mod server_commands; mod server_util; +mod traits; mod util; use std::path::PathBuf; diff --git a/src/server/playlist/mod.rs b/src/server/playlist/mod.rs index b3d9727..2ada8ea 100644 --- a/src/server/playlist/mod.rs +++ b/src/server/playlist/mod.rs @@ -1,4 +1,2 @@ -pub mod traits; - pub mod playlist_directory; pub mod playlist_file; diff --git a/src/server/playlist/playlist_directory/impl_ordered_playlist.rs b/src/server/playlist/playlist_directory/impl_ordered_playlist.rs index 0bc13fc..1ee3468 100644 --- a/src/server/playlist/playlist_directory/impl_ordered_playlist.rs +++ b/src/server/playlist/playlist_directory/impl_ordered_playlist.rs @@ -1,7 +1,7 @@ use dizi_lib::song::Song; use super::PlaylistDirectory; -use crate::playlist::traits::{OrderedPlaylist, OrderedPlaylistEntry}; +use crate::traits::{OrderedPlaylist, OrderedPlaylistEntry}; impl OrderedPlaylist for PlaylistDirectory { fn is_empty(&self) -> bool { diff --git a/src/server/playlist/playlist_directory/impl_shuffle_playlist.rs b/src/server/playlist/playlist_directory/impl_shuffle_playlist.rs index 8ba01bc..8417d93 100644 --- a/src/server/playlist/playlist_directory/impl_shuffle_playlist.rs +++ b/src/server/playlist/playlist_directory/impl_shuffle_playlist.rs @@ -2,16 +2,9 @@ use rand::prelude::SliceRandom; use rand::thread_rng; use super::PlaylistDirectory; -use crate::playlist::traits::{OrderedPlaylist, ShufflePlaylist}; +use crate::traits::{OrderedPlaylist, ShufflePlaylist}; impl ShufflePlaylist for PlaylistDirectory { - fn shuffle_enabled(&self) -> bool { - self._shuffle - } - fn set_shuffle(&mut self, shuffle: bool) { - self._shuffle = shuffle; - } - fn shuffle(&mut self) { let mut random_order: Vec = (0..self.len()).collect(); diff --git a/src/server/playlist/playlist_directory/mod.rs b/src/server/playlist/playlist_directory/mod.rs index 1ef58df..6f0715f 100644 --- a/src/server/playlist/playlist_directory/mod.rs +++ b/src/server/playlist/playlist_directory/mod.rs @@ -15,7 +15,6 @@ pub struct PlaylistDirectory { _playlist_content: Vec, _playlist_order: Vec, _playlist_index: Option, - _shuffle: bool, } impl PlaylistDirectory { @@ -25,7 +24,6 @@ impl PlaylistDirectory { _playlist_content: songs, _playlist_order: (0..songs_count).collect(), _playlist_index: None, - _shuffle: false, } } @@ -44,10 +42,16 @@ impl PlaylistDirectory { _playlist_content: songs, _playlist_order: (0..len).collect(), _playlist_index: None, - _shuffle: false, }) } + pub fn get_playlist_index(&self) -> Option { + self._playlist_index + } + pub fn set_playlist_index(&mut self, index: Option) { + self._playlist_index = index; + } + fn playlist_content_ref(&self) -> &Vec { &self._playlist_content } @@ -61,11 +65,4 @@ impl PlaylistDirectory { fn playlist_order_mut(&mut self) -> &mut Vec { &mut self._playlist_order } - - pub fn get_playlist_index(&self) -> Option { - self._playlist_index - } - pub fn set_playlist_index(&mut self, index: Option) { - self._playlist_index = index; - } } diff --git a/src/server/playlist/playlist_file/impl_ordered_playlist.rs b/src/server/playlist/playlist_file/impl_ordered_playlist.rs index e613a76..feb03ef 100644 --- a/src/server/playlist/playlist_file/impl_ordered_playlist.rs +++ b/src/server/playlist/playlist_file/impl_ordered_playlist.rs @@ -1,7 +1,7 @@ use dizi_lib::song::Song; use super::PlaylistFile; -use crate::playlist::traits::{OrderedPlaylist, OrderedPlaylistEntry}; +use crate::traits::{OrderedPlaylist, OrderedPlaylistEntry}; impl OrderedPlaylist for PlaylistFile { fn is_empty(&self) -> bool { diff --git a/src/server/playlist/playlist_file/impl_shuffle_playlist.rs b/src/server/playlist/playlist_file/impl_shuffle_playlist.rs index 9ba2828..cce87d4 100644 --- a/src/server/playlist/playlist_file/impl_shuffle_playlist.rs +++ b/src/server/playlist/playlist_file/impl_shuffle_playlist.rs @@ -2,16 +2,9 @@ use rand::prelude::SliceRandom; use rand::thread_rng; use super::PlaylistFile; -use crate::playlist::traits::{OrderedPlaylist, ShufflePlaylist}; +use crate::traits::{OrderedPlaylist, ShufflePlaylist}; impl ShufflePlaylist for PlaylistFile { - fn shuffle_enabled(&self) -> bool { - self._shuffle - } - fn set_shuffle(&mut self, shuffle: bool) { - self._shuffle = shuffle; - } - fn shuffle(&mut self) { let mut random_order: Vec = (0..self.len()).collect(); diff --git a/src/server/playlist/playlist_file/mod.rs b/src/server/playlist/playlist_file/mod.rs index e2c0888..c732015 100644 --- a/src/server/playlist/playlist_file/mod.rs +++ b/src/server/playlist/playlist_file/mod.rs @@ -15,7 +15,6 @@ pub struct PlaylistFile { _playlist_content: Vec, _playlist_order: Vec, _playlist_index: Option, - _shuffle: bool, } impl PlaylistFile { @@ -25,7 +24,6 @@ impl PlaylistFile { _playlist_content: songs, _playlist_order: (0..content_count).collect(), _playlist_index: None, - _shuffle: false, } } @@ -34,17 +32,14 @@ impl PlaylistFile { let read_playlist: Vec<_> = reader.entries().map(|entry| entry.unwrap()).collect(); let mut songs = Vec::new(); for entry in &read_playlist { - match entry { - m3u::Entry::Path(p) => { - if p.is_absolute() { - songs.push(Song::new(p)); - } else { - let mut new_path = cwd.to_path_buf(); - new_path.push(p); - songs.push(Song::new(&new_path)); - } + if let m3u::Entry::Path(p) = entry { + if p.is_absolute() { + songs.push(Song::new(p)); + } else { + let mut new_path = cwd.to_path_buf(); + new_path.push(p); + songs.push(Song::new(&new_path)); } - _ => {} } } let playlist = PlaylistFile::new(songs); @@ -62,6 +57,13 @@ impl PlaylistFile { } } + pub fn get_playlist_index(&self) -> Option { + self._playlist_index + } + pub fn set_playlist_index(&mut self, index: Option) { + self._playlist_index = index; + } + fn playlist_content_ref(&self) -> &Vec { &self._playlist_content } @@ -75,11 +77,4 @@ impl PlaylistFile { fn playlist_order_mut(&mut self) -> &mut Vec { &mut self._playlist_order } - - pub fn get_playlist_index(&self) -> Option { - self._playlist_index - } - pub fn set_playlist_index(&mut self, index: Option) { - self._playlist_index = index; - } } diff --git a/src/server/playlist/traits/mod.rs b/src/server/playlist/traits/mod.rs deleted file mode 100644 index 91d5c0c..0000000 --- a/src/server/playlist/traits/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod ordered_playlist; -mod shuffle_playlist; - -pub use ordered_playlist::*; -pub use shuffle_playlist::*; diff --git a/src/server/server.rs b/src/server/server.rs index 76215d7..5b97544 100644 --- a/src/server/server.rs +++ b/src/server/server.rs @@ -11,15 +11,15 @@ use dizi_lib::response::server::ServerBroadcastEvent; use crate::config::AppConfig; use crate::context::{AppContext, QuitType}; use crate::events::{AppEvent, ServerEvent, ServerEventSender}; -use crate::playlist::traits::OrderedPlaylist; use crate::server_util; +use crate::traits::OrderedPlaylist; pub fn setup_socket(config: &AppConfig) -> DiziResult { let socket = Path::new(config.server_ref().socket_ref()); if socket.exists() { - fs::remove_file(&socket)?; + fs::remove_file(socket)?; } - let stream = UnixListener::bind(&socket)?; + let stream = UnixListener::bind(socket)?; Ok(stream) } diff --git a/src/server/server_commands/playlist.rs b/src/server/server_commands/playlist.rs index 8d2cc52..f7f66cb 100644 --- a/src/server/server_commands/playlist.rs +++ b/src/server/server_commands/playlist.rs @@ -9,8 +9,8 @@ use dizi_lib::song::Song; use crate::context::AppContext; use crate::playlist::playlist_file::PlaylistFile; -use crate::playlist::traits::{OrderedPlaylist, ShufflePlaylist}; use crate::server_util::run_on_song_change; +use crate::traits::{OrderedPlaylist, ShufflePlaylist}; use crate::util::mimetype::is_playable; pub fn playlist_play(context: &mut AppContext, index: usize) -> DiziResult { @@ -30,7 +30,9 @@ pub fn playlist_load(context: &mut AppContext, cwd: &Path, path: &Path) -> DiziR } let mut new_playlist = PlaylistFile::from_file(cwd, path)?; - new_playlist.set_shuffle(shuffle_enabled); + if shuffle_enabled { + new_playlist.shuffle(); + } playlist.file_playlist = new_playlist; Ok(()) } diff --git a/src/server/server_util.rs b/src/server/server_util.rs index 25c80be..f1fa5d6 100644 --- a/src/server/server_util.rs +++ b/src/server/server_util.rs @@ -16,8 +16,8 @@ use dizi_lib::response::server::ServerBroadcastEvent; use crate::client; use crate::context::AppContext; use crate::events::ServerEvent; -use crate::playlist::traits::OrderedPlaylist; use crate::server_commands::*; +use crate::traits::OrderedPlaylist; pub fn process_server_event(context: &mut AppContext, event: ServerEvent) -> DiziResult { match event { diff --git a/src/server/audio/traits.rs b/src/server/traits/audio_player.rs similarity index 100% rename from src/server/audio/traits.rs rename to src/server/traits/audio_player.rs diff --git a/src/server/traits/mod.rs b/src/server/traits/mod.rs new file mode 100644 index 0000000..3add293 --- /dev/null +++ b/src/server/traits/mod.rs @@ -0,0 +1,7 @@ +pub mod audio_player; +pub mod ordered_playlist; +pub mod shuffle_playlist; + +pub use self::audio_player::*; +pub use self::ordered_playlist::*; +pub use self::shuffle_playlist::*; diff --git a/src/server/playlist/traits/ordered_playlist.rs b/src/server/traits/ordered_playlist.rs similarity index 100% rename from src/server/playlist/traits/ordered_playlist.rs rename to src/server/traits/ordered_playlist.rs diff --git a/src/server/playlist/traits/shuffle_playlist.rs b/src/server/traits/shuffle_playlist.rs similarity index 50% rename from src/server/playlist/traits/shuffle_playlist.rs rename to src/server/traits/shuffle_playlist.rs index d0cc12b..f2155d7 100644 --- a/src/server/playlist/traits/shuffle_playlist.rs +++ b/src/server/traits/shuffle_playlist.rs @@ -1,7 +1,4 @@ pub trait ShufflePlaylist { - fn shuffle_enabled(&self) -> bool; - fn set_shuffle(&mut self, shuffle: bool); - fn shuffle(&mut self); fn unshuffle(&mut self); }