public async Task <List <Playlist> > FetchPlaylists(bool fetchSongs = false) { GooglePlaylists = await api.GetPlaylistsWithEntriesAsync(); if (GooglePlaylists.Count > 0) { GooglePlaylists = GooglePlaylists.OrderBy(p => p.Name).ToList(); } if (fetchSongs) { // get songs that are in GMusic playlists but not in GMusic library foreach (Playlist playlist in GooglePlaylists) { foreach (PlaylistEntry entry in playlist.Songs) { if (GoogleSongsFetched.FirstOrDefault(t => t.Id == entry.TrackID || t.NID == entry.TrackID) == null) { Track track = await api.GetTrackAsync(entry.TrackID); GoogleSongsFetched.Add(track); } } } } return(GooglePlaylists); }
private async Task RefreshGooglePlaylists(bool fetchSongs = false) { List <Playlist> googlePlaylists = await Google.FetchPlaylists(fetchSongs); googlePlaylists = googlePlaylists.OrderBy((p) => p.Name).ToList(); GooglePlaylists.Clear(); googlePlaylists.ForEach(x => GooglePlaylists.Add(new CheckedListItem <Playlist>(x))); GooglePlaylistListBox.ItemsSource = GooglePlaylists; }
public async Task <List <IPlaylistSyncError> > SyncToGoogle(MusicBeeSyncHelper mb, List <MusicBeePlaylist> mbPlaylistsToSync, bool includeFoldersInPlaylistName = false, bool includeZAtStartOfDatePlaylistName = true) { List <IPlaylistSyncError> errors = new List <IPlaylistSyncError>(); foreach (MusicBeePlaylist playlist in mbPlaylistsToSync) { // Use LINQ to check for a playlist with the same name // If there is one, clear it's contents, otherwise create one // Unless it's been deleted, in which case pretend it doesn't exist. // I'm not sure how to undelete a playlist, or even if you can string gpmPlaylistName = null; if (includeFoldersInPlaylistName) { gpmPlaylistName = playlist.Name; } else { gpmPlaylistName = playlist.Name.Split('\\').Last(); } if (includeZAtStartOfDatePlaylistName) { // if it starts with a 2, it's a date playlist if (gpmPlaylistName.StartsWith("2")) { gpmPlaylistName = $"Z {gpmPlaylistName}"; } } Playlist thisPlaylist = GooglePlaylists.FirstOrDefault(p => p.Name == gpmPlaylistName && p.Deleted == false); String thisPlaylistID = ""; if (thisPlaylist != null) { List <PlaylistEntry> allPlsSongs = thisPlaylist.Songs; if (allPlsSongs.Count > 0) { MutatePlaylistResponse response = await api.RemoveFromPlaylistAsync(allPlsSongs); } thisPlaylistID = thisPlaylist.Id; } else { MutatePlaylistResponse response = await api.CreatePlaylistAsync(gpmPlaylistName); thisPlaylistID = response.MutateResponses.First().ID; } List <Track> songsToAdd = new List <Track>(); // And get the title and artist of each file, and add it to the GMusic playlist foreach (var song in playlist.Songs) { string title = song.Title; string artist = song.Artist; string album = song.Album; // First check for matching title, artist, album, if we find nothing, then check for matching title/artist Track gSong = GoogleSongsFetched.FirstOrDefault(item => (item.Artist.ToLower() == artist.ToLower() && item.Title.ToLower() == title.ToLower() && item.Album.ToLower() == album.ToLower())); if (gSong == null) { gSong = GoogleSongsFetched.FirstOrDefault(item => (item.Artist.ToLower() == artist.ToLower() && item.Title.ToLower() == title.ToLower())); if (gSong != null) { songsToAdd.Add(gSong); } else { // Didn't find it in cached library, so query for it Track result = await TryGetTrackAsync(artist, title, album); if (result != null) { GoogleSongsFetched.Add(result); songsToAdd.Add(result); } else { // didn't find it even via querying errors.Add(new UnableToFindGPMTrackError() { PlaylistName = gpmPlaylistName, AlbumName = album, ArtistName = artist, TrackName = title, SearchedService = true, }); } } } else { songsToAdd.Add(gSong); } } await api.AddToPlaylistAsync(thisPlaylistID, songsToAdd); } return(errors); }