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::Mutex;
use cursive::event::Key;
use cursive::views::*;
use cursive::Cursive;
use cursive::event::{Event, Key};
mod config;
mod queue;
mod spotify;
mod theme;
mod ui;
mod queue;
fn init_logger(content: TextContent) {
let mut builder = env_logger::Builder::from_default_env();
@@ -84,7 +84,7 @@ fn main() {
cfg.username,
cfg.password,
cfg.client_id,
queue.clone()
queue.clone(),
));
let searchscreen = cursive.active_screen();

View File

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

View File

@@ -23,9 +23,9 @@ use futures::Future;
use futures::Stream;
use tokio_core::reactor::Core;
use std::thread;
use std::sync::Arc;
use std::sync::Mutex;
use std::thread;
use queue::Queue;
@@ -45,16 +45,20 @@ struct Worker {
commands: mpsc::UnboundedReceiver<WorkerCommand>,
player: Player,
play_task: Box<futures::Future<Item = (), Error = oneshot::Canceled>>,
queue: Arc<Mutex<Queue>>
queue: Arc<Mutex<Queue>>,
}
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 {
commands: commands,
player: player,
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();
if let Some(track) = queue.dequeue() {
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.player.play();
}
@@ -111,7 +116,12 @@ impl futures::Future for Worker {
}
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 player_config = PlayerConfig {
bitrate: Bitrate::Bitrate320,
@@ -123,7 +133,15 @@ impl Spotify {
let (tx, rx) = mpsc::unbounded();
let (p, c) = oneshot::channel();
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();
@@ -143,7 +161,7 @@ impl Spotify {
player_config: PlayerConfig,
credentials: Credentials,
client_id: String,
queue: Arc<Mutex<Queue>>
queue: Arc<Mutex<Queue>>,
) {
let mut core = Core::new().unwrap();
let handle = core.handle();

View File

@@ -8,8 +8,8 @@ use std::sync::Mutex;
use librespot::core::spotify_id::SpotifyId;
use spotify::Spotify;
use queue::Queue;
use spotify::Spotify;
pub struct SearchView {
pub view: Panel<LinearLayout>,
@@ -17,7 +17,12 @@ pub struct 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 tracks = spotify.search(input, 50, 0);
@@ -27,7 +32,9 @@ impl SearchView {
for track in tracks.tracks.items {
let s = spotify.clone();
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())
.collect::<Vec<String>>()
.join(", ");
@@ -37,12 +44,11 @@ impl SearchView {
s.play();
});
let queue = queue.clone();
let button_queue = OnEventView::new(button)
.on_event(' ', move |_cursive| {
let mut queue = queue.lock().unwrap();
queue.enqueue(track.clone());
debug!("Added to queue: {}", track.name);
});
let button_queue = OnEventView::new(button).on_event(' ', move |_cursive| {
let mut queue = queue.lock().unwrap();
queue.enqueue(track.clone());
debug!("Added to queue: {}", track.name);
});
results.add_child("", button_queue);
}
}