Implement following playlists
This commit is contained in:
@@ -140,6 +140,7 @@ impl Library {
|
|||||||
Self::_process_playlist(
|
Self::_process_playlist(
|
||||||
list.id.clone(),
|
list.id.clone(),
|
||||||
list.name.clone(),
|
list.name.clone(),
|
||||||
|
list.owner.id.clone(),
|
||||||
list.snapshot_id.clone(),
|
list.snapshot_id.clone(),
|
||||||
spotify,
|
spotify,
|
||||||
)
|
)
|
||||||
@@ -149,6 +150,7 @@ impl Library {
|
|||||||
Self::_process_playlist(
|
Self::_process_playlist(
|
||||||
list.id.clone(),
|
list.id.clone(),
|
||||||
list.name.clone(),
|
list.name.clone(),
|
||||||
|
list.owner.id.clone(),
|
||||||
list.snapshot_id.clone(),
|
list.snapshot_id.clone(),
|
||||||
spotify,
|
spotify,
|
||||||
)
|
)
|
||||||
@@ -157,6 +159,7 @@ impl Library {
|
|||||||
fn _process_playlist(
|
fn _process_playlist(
|
||||||
id: String,
|
id: String,
|
||||||
name: String,
|
name: String,
|
||||||
|
owner_id: String,
|
||||||
snapshot_id: String,
|
snapshot_id: String,
|
||||||
spotify: &Spotify,
|
spotify: &Spotify,
|
||||||
) -> Playlist {
|
) -> Playlist {
|
||||||
@@ -182,10 +185,12 @@ impl Library {
|
|||||||
None => None,
|
None => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Playlist {
|
Playlist {
|
||||||
id: id.clone(),
|
id,
|
||||||
name: name.clone(),
|
name,
|
||||||
snapshot_id: snapshot_id.clone(),
|
owner_id,
|
||||||
|
snapshot_id,
|
||||||
tracks: collected_tracks,
|
tracks: collected_tracks,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,6 +217,10 @@ impl Library {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete_playlist(&self, id: &str) {
|
pub fn delete_playlist(&self, id: &str) {
|
||||||
|
if !*self.is_done.read().unwrap() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let pos = {
|
let pos = {
|
||||||
let store = self.playlists.read().expect("can't readlock playlists");
|
let store = self.playlists.read().expect("can't readlock playlists");
|
||||||
store.iter().position(|ref i| i.id == id)
|
store.iter().position(|ref i| i.id == id)
|
||||||
@@ -518,12 +527,14 @@ impl Library {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if api {
|
if api {
|
||||||
self.spotify.current_user_saved_tracks_add(
|
if self.spotify.current_user_saved_tracks_add(
|
||||||
tracks
|
tracks
|
||||||
.iter()
|
.iter()
|
||||||
.map(|t| t.id.clone())
|
.map(|t| t.id.clone())
|
||||||
.collect()
|
.collect()
|
||||||
);
|
).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -551,12 +562,14 @@ impl Library {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if api {
|
if api {
|
||||||
self.spotify.current_user_saved_tracks_delete(
|
if self.spotify.current_user_saved_tracks_delete(
|
||||||
tracks
|
tracks
|
||||||
.iter()
|
.iter()
|
||||||
.map(|t| t.id.clone())
|
.map(|t| t.id.clone())
|
||||||
.collect()
|
.collect()
|
||||||
);
|
).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -588,7 +601,9 @@ impl Library {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.spotify.current_user_saved_albums_add(vec![album.id.clone()]);
|
if self.spotify.current_user_saved_albums_add(vec![album.id.clone()]).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
album.load_tracks(self.spotify.clone());
|
album.load_tracks(self.spotify.clone());
|
||||||
|
|
||||||
@@ -611,7 +626,9 @@ impl Library {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.spotify.current_user_saved_albums_delete(vec![album.id.clone()]);
|
if self.spotify.current_user_saved_albums_delete(vec![album.id.clone()]).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
album.load_tracks(self.spotify.clone());
|
album.load_tracks(self.spotify.clone());
|
||||||
|
|
||||||
@@ -645,7 +662,9 @@ impl Library {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.spotify.user_follow_artists(vec![artist.id.clone()]);
|
if self.spotify.user_follow_artists(vec![artist.id.clone()]).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut store = self.artists.write().unwrap();
|
let mut store = self.artists.write().unwrap();
|
||||||
@@ -668,7 +687,9 @@ impl Library {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.spotify.user_unfollow_artists(vec![artist.id.clone()]);
|
if self.spotify.user_unfollow_artists(vec![artist.id.clone()]).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut store = self.artists.write().unwrap();
|
let mut store = self.artists.write().unwrap();
|
||||||
@@ -690,4 +711,23 @@ impl Library {
|
|||||||
let playlists = self.playlists.read().unwrap();
|
let playlists = self.playlists.read().unwrap();
|
||||||
playlists.iter().any(|p| p.id == playlist.id)
|
playlists.iter().any(|p| p.id == playlist.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn follow_playlist(&self, playlist: &Playlist) {
|
||||||
|
if !*self.is_done.read().unwrap() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.spotify.user_playlist_follow_playlist(playlist.owner_id.clone(), playlist.id.clone()).is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut store = self.playlists.write().unwrap();
|
||||||
|
if !store.iter().any(|p| p.id == playlist.id) {
|
||||||
|
store.insert(0, playlist.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.save_cache(config::cache_path(CACHE_PLAYLISTS), self.playlists.clone());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use traits::ListItem;
|
|||||||
pub struct Playlist {
|
pub struct Playlist {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub owner_id: String,
|
||||||
pub snapshot_id: String,
|
pub snapshot_id: String,
|
||||||
pub tracks: Vec<Track>,
|
pub tracks: Vec<Track>,
|
||||||
}
|
}
|
||||||
@@ -55,7 +56,11 @@ impl ListItem for Playlist {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn toggle_saved(&mut self, _library: Arc<Library>) {
|
fn toggle_saved(&mut self, library: Arc<Library>) {
|
||||||
// TODO
|
if library.is_saved_playlist(self) {
|
||||||
|
library.delete_playlist(&self.id);
|
||||||
|
} else {
|
||||||
|
library.follow_playlist(self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -564,6 +564,10 @@ impl Spotify {
|
|||||||
self.api_with_retry(|api| api.current_user_saved_tracks_delete(ids.clone()))
|
self.api_with_retry(|api| api.current_user_saved_tracks_delete(ids.clone()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn user_playlist_follow_playlist(&self, owner_id: String, id: String) -> Option<()> {
|
||||||
|
self.api_with_retry(|api| api.user_playlist_follow_playlist(&owner_id, &id, true))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn load(&self, track: &Track) {
|
pub fn load(&self, track: &Track) {
|
||||||
info!("loading track: {:?}", track);
|
info!("loading track: {:?}", track);
|
||||||
self.channel
|
self.channel
|
||||||
|
|||||||
Reference in New Issue
Block a user