예제 #1
0
 protected void Dispose(bool disposing)
 {
     if (disposing)
     {
         _trackFetcherTimer.Stop();
         _trackFetcherTimer?.Dispose();
         AlbumArtwork?.Dispose();
         client?.Dispose();
         httpClient?.Dispose();
     }
 }
예제 #2
0
        public async Task GetAsync()
        {
            try
            {
                if (client == null)
                {
                    return;
                }
                var currentTrack = await client.GetPlayingTrackAsync();

                if (currentTrack.IsPlaying)
                {
                    var devices = (await client.GetDevicesAsync()).Devices;
                    if (devices.Except(AvailableSpotifyDevices).Any())
                    {
                        AvailableSpotifyDevices = devices;
                    }
                    var currentActiveDevice = devices.Find(x => x.IsActive);
                    if (ActiveDevice.Id != currentActiveDevice.Id)
                    {
                        ActiveDevice = _deiceMapper.Map <SpotifyDevice, Device>(currentActiveDevice);
                        DeviceChanged?.Invoke(ActiveDevice);
                    }

                    if (currentTrack.Item != null)
                    {
                        Duration_ms = currentTrack.Item.DurationMs;
                        Position_ms = currentTrack.ProgressMs;
                        Volume      = currentActiveDevice.VolumePercent;
                        var testURL = currentTrack.Item.ExternUrls.FirstOrDefault();
                        var url     = testURL.Equals(default(KeyValuePair <string, string>)) ? string.Empty : testURL.Value;
                        if (Url != url)
                        {
                            Url = url;
                            AlbumArtwork?.Dispose();
                            AlbumArtwork = null;
                        }
                        if (AlbumArtwork == null)
                        {
                            var artist = await client.GetArtistAsync(currentTrack.Item.Artists.FirstOrDefault()?.Id);

                            if (artist != null)
                            {
                                Genre = artist.Genres.FirstOrDefault();
                                Type  = artist.Type;
                            }
                            Track = currentTrack.Item.Name;
                            Album = currentTrack.Item.Album.Name;
                            var mainArtist = currentTrack.Item.Artists.First().Name;
                            if (currentTrack.Item.Artists.Count() > 1)
                            {
                                var artistFeat = $@"{mainArtist} feat. ";
                                artistFeat += string.Join(", ", currentTrack.Item.Artists.Skip(1).Select(x => x.Name));
                                Artist      = artistFeat;
                            }
                            else
                            {
                                Artist = mainArtist;
                            }

                            //Lyrics = await LyricsHelpers.GetLyricsAsync(mainArtist, this.Track);

                            if (currentTrack.Item.Album.Images.Any())
                            {
                                ArtworkURL   = currentTrack.Item.Album.Images[0].Url;
                                AlbumArtwork = await GetImageAsync(ArtworkURL);
                            }
                            else
                            {
                                AlbumArtwork = new Bitmap(1, 1);
                            }

                            TrackChanged?.Invoke(this);
                        }
                        ;
                    }
                    else
                    {
                        Track       = "Loading...";
                        Artist      = "Loading...";
                        Album       = "Loading...";
                        Duration_ms = 0;
                        Position_ms = 0;
                        Volume      = 0;
                        TrackChanged?.Invoke(this);
                    }
                }

                if (IsPlaying != currentTrack.IsPlaying)
                {
                    TrackPlayStateChanged?.Invoke(currentTrack.IsPlaying ? PlayState.Play : PlayState.Pause);
                }
                IsPlaying = currentTrack.IsPlaying;
                TrackDurationChanged?.Invoke(this);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }