This commit is contained in:
Henrik Friedrichsen
2019-02-26 21:34:20 +01:00
parent 8df48a7270
commit b06b6bc15b
4 changed files with 45 additions and 22 deletions

View File

@@ -23,15 +23,15 @@ use std::process;
use std::sync::Arc; use std::sync::Arc;
use std::sync::Mutex; use std::sync::Mutex;
use cursive::event::Key;
use cursive::views::*; use cursive::views::*;
use cursive::Cursive; use cursive::Cursive;
use cursive::event::{Event, Key};
mod config; mod config;
mod queue;
mod spotify; mod spotify;
mod theme; mod theme;
mod ui; mod ui;
mod queue;
fn init_logger(content: TextContent) { fn init_logger(content: TextContent) {
let mut builder = env_logger::Builder::from_default_env(); let mut builder = env_logger::Builder::from_default_env();
@@ -84,7 +84,7 @@ fn main() {
cfg.username, cfg.username,
cfg.password, cfg.password,
cfg.client_id, cfg.client_id,
queue.clone() queue.clone(),
)); ));
let searchscreen = cursive.active_screen(); let searchscreen = cursive.active_screen();

View File

@@ -9,13 +9,12 @@ pub struct Queue {
impl Queue { impl Queue {
pub fn new() -> Queue { pub fn new() -> Queue {
Queue { Queue {
queue: VecDeque::new() queue: VecDeque::new(),
} }
} }
pub fn enqueue(&mut self, track: FullTrack) { pub fn enqueue(&mut self, track: FullTrack) {
self.queue.push_back(track); self.queue.push_back(track);
} }
pub fn dequeue(&mut self) -> Option<FullTrack> { pub fn dequeue(&mut self) -> Option<FullTrack> {
self.queue.pop_front() self.queue.pop_front()
} }

View File

@@ -23,9 +23,9 @@ use futures::Future;
use futures::Stream; use futures::Stream;
use tokio_core::reactor::Core; use tokio_core::reactor::Core;
use std::thread;
use std::sync::Arc; use std::sync::Arc;
use std::sync::Mutex; use std::sync::Mutex;
use std::thread;
use queue::Queue; use queue::Queue;
@@ -45,16 +45,20 @@ struct Worker {
commands: mpsc::UnboundedReceiver<WorkerCommand>, commands: mpsc::UnboundedReceiver<WorkerCommand>,
player: Player, player: Player,
play_task: Box<futures::Future<Item = (), Error = oneshot::Canceled>>, play_task: Box<futures::Future<Item = (), Error = oneshot::Canceled>>,
queue: Arc<Mutex<Queue>> queue: Arc<Mutex<Queue>>,
} }
impl Worker { impl Worker {
fn new(commands: mpsc::UnboundedReceiver<WorkerCommand>, player: Player, queue: Arc<Mutex<Queue>>) -> Worker { fn new(
commands: mpsc::UnboundedReceiver<WorkerCommand>,
player: Player,
queue: Arc<Mutex<Queue>>,
) -> Worker {
Worker { Worker {
commands: commands, commands: commands,
player: player, player: player,
play_task: Box::new(futures::empty()), play_task: Box::new(futures::empty()),
queue: queue queue: queue,
} }
} }
} }
@@ -89,7 +93,8 @@ impl futures::Future for Worker {
let mut queue = self.queue.lock().unwrap(); let mut queue = self.queue.lock().unwrap();
if let Some(track) = queue.dequeue() { if let Some(track) = queue.dequeue() {
debug!("next track in queue: {}", track.name); debug!("next track in queue: {}", track.name);
let trackid = SpotifyId::from_base62(&track.id).expect("could not load track"); let trackid =
SpotifyId::from_base62(&track.id).expect("could not load track");
self.play_task = Box::new(self.player.load(trackid, false, 0)); self.play_task = Box::new(self.player.load(trackid, false, 0));
self.player.play(); self.player.play();
} }
@@ -111,7 +116,12 @@ impl futures::Future for Worker {
} }
impl Spotify { impl Spotify {
pub fn new(user: String, password: String, client_id: String, queue: Arc<Mutex<Queue>>) -> Spotify { pub fn new(
user: String,
password: String,
client_id: String,
queue: Arc<Mutex<Queue>>,
) -> Spotify {
let session_config = SessionConfig::default(); let session_config = SessionConfig::default();
let player_config = PlayerConfig { let player_config = PlayerConfig {
bitrate: Bitrate::Bitrate320, bitrate: Bitrate::Bitrate320,
@@ -123,7 +133,15 @@ impl Spotify {
let (tx, rx) = mpsc::unbounded(); let (tx, rx) = mpsc::unbounded();
let (p, c) = oneshot::channel(); let (p, c) = oneshot::channel();
thread::spawn(move || { thread::spawn(move || {
Spotify::worker(rx, p, session_config, player_config, credentials, client_id, queue) Spotify::worker(
rx,
p,
session_config,
player_config,
credentials,
client_id,
queue,
)
}); });
let token = c.wait().unwrap(); let token = c.wait().unwrap();
@@ -143,7 +161,7 @@ impl Spotify {
player_config: PlayerConfig, player_config: PlayerConfig,
credentials: Credentials, credentials: Credentials,
client_id: String, client_id: String,
queue: Arc<Mutex<Queue>> queue: Arc<Mutex<Queue>>,
) { ) {
let mut core = Core::new().unwrap(); let mut core = Core::new().unwrap();
let handle = core.handle(); let handle = core.handle();

View File

@@ -8,8 +8,8 @@ use std::sync::Mutex;
use librespot::core::spotify_id::SpotifyId; use librespot::core::spotify_id::SpotifyId;
use spotify::Spotify;
use queue::Queue; use queue::Queue;
use spotify::Spotify;
pub struct SearchView { pub struct SearchView {
pub view: Panel<LinearLayout>, pub view: Panel<LinearLayout>,
@@ -17,7 +17,12 @@ pub struct SearchView {
} }
impl SearchView { impl SearchView {
fn search_handler(s: &mut Cursive, input: &str, spotify: Arc<Spotify>, queue: Arc<Mutex<Queue>>) { fn search_handler(
s: &mut Cursive,
input: &str,
spotify: Arc<Spotify>,
queue: Arc<Mutex<Queue>>,
) {
let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap(); let mut results: ViewRef<ListView> = s.find_id("search_results").unwrap();
let tracks = spotify.search(input, 50, 0); let tracks = spotify.search(input, 50, 0);
@@ -27,7 +32,9 @@ impl SearchView {
for track in tracks.tracks.items { for track in tracks.tracks.items {
let s = spotify.clone(); let s = spotify.clone();
let trackid = SpotifyId::from_base62(&track.id).expect("could not load track"); let trackid = SpotifyId::from_base62(&track.id).expect("could not load track");
let artists = track.artists.iter() let artists = track
.artists
.iter()
.map(|ref artist| artist.name.clone()) .map(|ref artist| artist.name.clone())
.collect::<Vec<String>>() .collect::<Vec<String>>()
.join(", "); .join(", ");
@@ -37,12 +44,11 @@ impl SearchView {
s.play(); s.play();
}); });
let queue = queue.clone(); let queue = queue.clone();
let button_queue = OnEventView::new(button) let button_queue = OnEventView::new(button).on_event(' ', move |_cursive| {
.on_event(' ', move |_cursive| { let mut queue = queue.lock().unwrap();
let mut queue = queue.lock().unwrap(); queue.enqueue(track.clone());
queue.enqueue(track.clone()); debug!("Added to queue: {}", track.name);
debug!("Added to queue: {}", track.name); });
});
results.add_child("", button_queue); results.add_child("", button_queue);
} }
} }