private List <MusicBeeSong> GetMusicBeeSongs() { string[] files = null; List <MusicBeeSong> allMbSongs = new List <MusicBeeSong>(); if (MbApiInterface.Library_QueryFiles("domain=library")) { // Old (deprecated) //public char[] filesSeparators = { '\0' }; //files = _mbApiInterface.Library_QueryGetAllFiles().Split(filesSeparators, StringSplitOptions.RemoveEmptyEntries); MbApiInterface.Library_QueryFilesEx("domain=library", ref files); } else { files = new string[0]; } foreach (string path in files) { MusicBeeSong thisSong = new MusicBeeSong(); thisSong.Filename = path; thisSong.Artist = MbApiInterface.Library_GetFileTag(path, Plugin.MetaDataType.Artist); thisSong.Title = MbApiInterface.Library_GetFileTag(path, Plugin.MetaDataType.TrackTitle); thisSong.Album = MbApiInterface.Library_GetFileTag(path, Plugin.MetaDataType.Album); allMbSongs.Add(thisSong); } return(allMbSongs); }
private List <MusicBeePlaylist> GetMusicBeePlaylists() { List <MusicBeePlaylist> MbPlaylists = new List <MusicBeePlaylist>(); MbApiInterface.Playlist_QueryPlaylists(); string playlist = MbApiInterface.Playlist_QueryGetNextPlaylist(); while (playlist != null) { string playlistName = MbApiInterface.Playlist_GetName(playlist); MusicBeePlaylist MbPlaylist = new MusicBeePlaylist(); MbPlaylist.mbName = playlist; MbPlaylist.Name = playlistName; // get playlist tracks string[] playlistFiles = null; if (MbApiInterface.Playlist_QueryFiles(playlist)) { bool success = MbApiInterface.Playlist_QueryFilesEx(playlist, ref playlistFiles); if (!success) { throw new Exception("Couldn't get playlist files"); } } else { playlistFiles = new string[0]; } foreach (string file in playlistFiles) { string title = MbApiInterface.Library_GetFileTag(file, Plugin.MetaDataType.TrackTitle); string artist = MbApiInterface.Library_GetFileTag(file, Plugin.MetaDataType.Artist); string album = MbApiInterface.Library_GetFileTag(file, Plugin.MetaDataType.Album); var song = new MusicBeeSong() { Album = album, Artist = artist, Title = title, Filename = file, }; MbPlaylist.Songs.Add(song); } MbPlaylists.Add(MbPlaylist); // Query the next mbPlaylist to start again playlist = MbApiInterface.Playlist_QueryGetNextPlaylist(); } MbPlaylists = MbPlaylists.OrderBy(p => p.Name).ToList(); return(MbPlaylists); }
private int NumberOfMatches(MusicBeeSong song, SongResult songResult) { if (songResult == null) { return(0); } bool titleMatches = song.Title.ToLower() == songResult.Title.ToLower(); bool artistMatches = songResult.Artists.Exists(x => x.Name.ToLower() == song.Artist.ToLower()); bool albumMatches = song.Album.ToLower() == songResult.Album.Name.ToLower(); return((titleMatches ? 1 : 0) + (artistMatches ? 1 : 0) + (albumMatches ? 1 : 0)); }
private SongResult FindBestMatchBetweenTwo(MusicBeeSong song, SongResult a, SongResult b) { int aMatches = NumberOfMatches(song, a); int bMatches = NumberOfMatches(song, b); if (aMatches == 0 && bMatches == 0) { return(null); } // Prefer the YTM tracks over uploads if there is a tie return(aMatches >= bMatches ? a : b); }
private SongResult FindMatchInSearchResult(string searchStr, MusicBeeSong song, SearchResult response) { SongResult bestMatch = null; foreach (var songResult in response.Songs) { bool titleMatches = song.Title.ToLower() == songResult.Title.ToLower(); bool artistMatches = songResult.Artists.Exists(x => x.Name.ToLower() == song.Artist.ToLower()); bool albumMatches = song.Album.ToLower() == songResult.Album.Name.ToLower(); if (titleMatches && artistMatches && albumMatches) { // if we matched all three, likely this is the right track bestMatch = songResult; return(bestMatch); } else if ((titleMatches && artistMatches) || (titleMatches && albumMatches)) { // if two of them match, guessing this track is correct is // probably better than just using the firstordefault, but keep looping hoping for a better track bestMatch = songResult; return(bestMatch); } else if (artistMatches && bestMatch == null) { // if just the artist matches and we haven't found anything yet... this might be our best guess bestMatch = songResult; } } //if (videoIdToAdd == null) //{ // var first = response.Songs.FirstOrDefault(); // if (first != null) // { // videoIdToAdd = first.VideoId; // Log($"Didn't find a perfect match for {searchStr} for '{song.Title}' by '{song.Artist}', so using '{first.Title}' by '{first.Artists.FirstOrDefault().Name}' instead"); // } //} return(bestMatch); }
public async Task <List <IPlaylistSyncError> > SyncToMusicBee(MusicBeeSyncHelper mb, List <SimplePlaylist> playlists) { List <IPlaylistSyncError> errors = new List <IPlaylistSyncError>(); // Go through each playlist we want to sync in turn foreach (SimplePlaylist playlist in playlists) { // Create an empty list for this playlist's local songs List <MusicBeeSong> mbPlaylistSongs = new List <MusicBeeSong>(); // Get all tracks for playlist var fp = await Spotify.Playlists.Get(playlist.Id); var allTracks = await Spotify.PaginateAll(fp.Tracks); var tracks = new List <FullTrack>(); foreach (var t in allTracks) { if (t.Track is FullTrack track) { tracks.Add(track); } } foreach (FullTrack track in tracks) { string artistStr = track.Artists.FirstOrDefault().Name.ToLower(); string titleStr = track.Name.ToLower(); MusicBeeSong thisMbSong = mb.Songs.FirstOrDefault(s => s.Artist.ToLower() == artistStr && s.Title.ToLower() == titleStr); if (thisMbSong != null) { mbPlaylistSongs.Add(thisMbSong); } else { errors.Add(new UnableToFindSpotifyTrackError() { AlbumName = track.Album.Name, ArtistName = track.Artists.FirstOrDefault().Name, PlaylistName = playlist.Name, TrackName = track.Name, SearchedService = false }); } } //mbAPI expects a string array of song filenames to create a playlist string[] mbPlaylistSongFiles = new string[mbPlaylistSongs.Count]; int i = 0; foreach (MusicBeeSong song in mbPlaylistSongs) { mbPlaylistSongFiles[i] = song.Filename; i++; } // Now we need to delete any existing playlist with matching name MusicBeePlaylist localPlaylist = mb.Playlists.FirstOrDefault(p => p.Name == playlist.Name); if (localPlaylist != null) { mb.MbApiInterface.Playlist_DeletePlaylist(localPlaylist.mbName); } // Create the playlist locally string playlistRelativeDir = ""; string playlistName = playlist.Name; // if it's a date playlist, remove first Z if (playlistName.StartsWith("Z ")) { playlistName = playlistName.Skip(2).ToString(); } string[] itemsInPath = playlist.Name.Split('\\'); if (itemsInPath.Length > 1) { // Creates a playlist at top level directory mb.MbApiInterface.Playlist_CreatePlaylist("", playlistName, mbPlaylistSongFiles); } mb.MbApiInterface.Playlist_CreatePlaylist(playlistRelativeDir, playlistName, mbPlaylistSongFiles); } // Get the local playlists again mb.RefreshMusicBeePlaylists(); return(errors); }
public async Task <List <IPlaylistSyncError> > SyncToMusicBee(MusicBeeSyncHelper mb, List <Playlist> playlists) { List <IPlaylistSyncError> errors = new List <IPlaylistSyncError>(); // Go through each playlist we want to sync in turn foreach (Playlist playlist in playlists) { // Create an empty list for this playlist's local songs List <MusicBeeSong> mbPlaylistSongs = new List <MusicBeeSong>(); // For each entry in the playlist we're syncing, get the song from the GMusic library we've downloaded, // Get the song Title and Artist and then look it up in the list of local songs. // If we find it, add it to the list of local songs foreach (PlaylistEntry entry in playlist.Songs) { Track thisSong = GoogleSongsFetched.FirstOrDefault(s => s.Id == entry.TrackID || s.NID == entry.TrackID); // if we couldn't find it, attempt to fetch it by trackID and cache it if (IsTrackInvalid(thisSong)) { thisSong = await api.GetTrackAsync(entry.TrackID); if (IsTrackInvalid(thisSong)) { errors.Add(new UnableToFindGooglePlaylistEntryError() { GpmPlaylistName = playlist.Name, GpmPlaylistPosition = entry.AbsolutePosition, GpmTrackId = entry.TrackID, }); } else { GoogleSongsFetched.Add(thisSong); } } if (!IsTrackInvalid(thisSong)) { MusicBeeSong thisMbSong = mb.Songs.FirstOrDefault(s => s.Artist == thisSong.Artist && s.Title == thisSong.Title && s.Album == thisSong.Album); if (thisMbSong != null) { mbPlaylistSongs.Add(thisMbSong); } else { errors.Add(new UnableToFindGPMTrackError() { AlbumName = thisSong.Album, ArtistName = thisSong.Artist, PlaylistName = playlist.Name, TrackName = thisSong.Title, SearchedService = false, }); } } } //mbAPI expects a string array of song filenames to create a playlist string[] mbPlaylistSongFiles = new string[mbPlaylistSongs.Count]; int i = 0; foreach (MusicBeeSong song in mbPlaylistSongs) { mbPlaylistSongFiles[i] = song.Filename; i++; } // Now we need to delete any existing playlist with matching name MusicBeePlaylist localPlaylist = mb.Playlists.FirstOrDefault(p => p.Name == playlist.Name); if (localPlaylist != null) { mb.MbApiInterface.Playlist_DeletePlaylist(localPlaylist.mbName); } // Create the playlist locally string playlistRelativeDir = ""; string playlistName = playlist.Name; string[] itemsInPath = playlist.Name.Split('\\'); if (itemsInPath.Length > 1) { // Creates a playlist at top level directory mb.MbApiInterface.Playlist_CreatePlaylist("", playlistName, mbPlaylistSongFiles); } mb.MbApiInterface.Playlist_CreatePlaylist(playlistRelativeDir, playlistName, mbPlaylistSongFiles); } // Get the local playlists again mb.RefreshMusicBeePlaylists(); return(errors); }
private bool IsPerfectMatch(MusicBeeSong song, SongResult songResult) { return(NumberOfMatches(song, songResult) == 3); }