예제 #1
0
        public async Task <Uri> GetAlbumCover(string artist, string title)
        {
            var result = await _groove.SearchAsync(MediaNamespace.music, artist + " - " + title, filter : SearchFilter.Tracks, maxItems : 1);

            var grooveArtist = result?.Artists?.Items.FirstOrDefault();

            if (grooveArtist != null)
            {
                var imageUrl = grooveArtist.GetImageUrl();

                if (!string.IsNullOrEmpty(imageUrl))
                {
                    //check if image exists
                    var httpClient = new HttpClient();
                    var response   = await httpClient.GetAsync(new Uri(imageUrl), HttpCompletionOption.ResponseHeadersRead);

                    if (response.IsSuccessStatusCode)
                    {
                        return(new Uri(imageUrl));
                    }
                }
            }

            return(null);
        }
예제 #2
0
        public async Task SearchCatalogAsync(string searchQuery, string country)
        {
            ContentResponse searchResponse = await _grooveClient.SearchAsync(
                MediaNamespace.music,
                searchQuery,
                ContentSource.Catalog,
                maxItems : 10,
                country : country);

            _errorViewModel.HandleGrooveApiError(searchResponse.Error);
            DisplayMusicContent(searchResponse);
        }
예제 #3
0
        public async Task HelpYouGetStarted()
        {
            // Start by registering an Application on the Groove API Program (see https://developer.microsoft.com/dashboard/groove)

            // Create a client
            IGrooveClient client = GrooveClientFactory.CreateGrooveClient(MicrosoftAppClientId, MicrosoftAppClientSecret);

            // Use null to get your current geography.
            // Specify a 2 letter country code (such as "US" or "DE") to force a specific country.
            string country = null;

            // Search for albums in your current geography
            ContentResponse searchResponse = await client.SearchAsync(
                MediaNamespace.music,
                "Foo Fighters",
                filter : SearchFilter.Albums,
                maxItems : 5,
                country : country);

            Console.WriteLine($"Found {searchResponse.Albums.TotalItemCount} albums");
            foreach (Album albumResult in searchResponse.Albums.Items)
            {
                Console.WriteLine(albumResult.Name);
            }

            // List tracks in the first album
            Album           album          = searchResponse.Albums.Items[0];
            ContentResponse lookupResponse = await client.LookupAsync(
                album.Id,
                extras : ExtraDetails.Tracks,
                country : country);

            // Display information about the album
            album = lookupResponse.Albums.Items[0];
            Console.WriteLine($"Album: {album.Name} (link: {album.GetLink(ContentExtensions.LinkAction.Play)}, " +
                              $"image: {album.GetImageUrl(800, 800)})");

            foreach (Contributor contributor in album.Artists)
            {
                Artist artist = contributor.Artist;
                Console.WriteLine($"Artist: {artist.Name} (link: {artist.GetLink()}, image: {artist.GetImageUrl(1920, 1080)})");
            }

            foreach (Track track in album.Tracks.Items)
            {
                Console.WriteLine($"Track: {track.TrackNumber} - {track.Name}");
            }
        }
예제 #4
0
        private async Task <List <PlaylistAction> > GetPlaylistActions(List <MusicBeePlaylist> playlistsToSync, List <Playlist> existingGroovePlaylists)
        {
            List <PlaylistAction> playlistActions = new List <PlaylistAction>();
            int totalPlaylistsProcessed           = 0;

            foreach (MusicBeePlaylist playlist in playlistsToSync)
            {
                _window.WriteOutputLine($"Preparing {playlist.Name} for sync");

                // If playlist already exists,
                // for now, delete playlist and remake completely
                // eventually, calculate diff
                Playlist matchingGroovePlaylist = existingGroovePlaylists.Where(p => p.Name == playlist.Name).FirstOrDefault();
                if (matchingGroovePlaylist != null)
                {
                    PlaylistAction deletePlaylist = new PlaylistAction()
                    {
                        Id = matchingGroovePlaylist.Id,
                    };
                    playlistActions.Add(deletePlaylist);
                }

                // Get list of file paths to tracks in music bee library
                string[] playlistFiles = null;
                if (_mbApiInterface.Playlist_QueryFiles(playlist.MusicBeeName))
                {
                    bool success = _mbApiInterface.Playlist_QueryFilesEx(playlist.MusicBeeName, ref playlistFiles);
                    if (!success)
                    {
                        _window.WriteOutputLine($"Couldn't find playlist file for: {playlist.Name}");
                        return(null);
                    }
                }
                else
                {
                    playlistFiles = new string[] { };
                }

                // Map the track in music bee to Groove
                List <TrackAction> tracksToAdd = new List <TrackAction>();
                foreach (string file in playlistFiles)
                {
                    string title  = _mbApiInterface.Library_GetFileTag(file, MetaDataType.TrackTitle);
                    string artist = _mbApiInterface.Library_GetFileTag(file, MetaDataType.Artist);

                    ContentResponse response = await _client.SearchAsync(MediaNamespace.music, HttpUtility.UrlEncode(title), ContentSource.Collection, SearchFilter.Tracks);

                    if (response.Error == null || response.Error.ErrorCode == Enum.GetName(typeof(ErrorCode), ErrorCode.COLLECTION_INVALID_DATA))
                    {
                        TrackAction  action      = null;
                        List <Track> tracksFound = response.Tracks.Items.Cast <Track>().ToList();
                        foreach (Track track in tracksFound)
                        {
                            if (track.Name == title &&
                                track.Artists.Where(c => c.Artist.Name == artist).FirstOrDefault() != null)
                            {
                                action = new TrackAction()
                                {
                                    Action = TrackActionType.Add,
                                    Id     = track.Id
                                };
                                tracksToAdd.Add(action);
                            }
                        }

                        if (action == null)
                        {
                            _window.WriteOutputLine($"Could not match track {artist} - {title}");
                        }
                    }
                    else
                    {
                        _window.WriteOutputLine($"Could not match track {artist} - {title}");
                    }
                }

                PlaylistAction createPlaylist = new PlaylistAction()
                {
                    Name         = playlist.Name,
                    TrackActions = tracksToAdd
                };
                playlistActions.Add(createPlaylist);

                totalPlaylistsProcessed++;
                _window.UpdatePreparationProgress(100 * totalPlaylistsProcessed / playlistsToSync.Count);
            }

            return(playlistActions);
        }