예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
 }