public void InitializeSource(int minimumScrobbleSeconds, TrackStarted onTrackStartedCallback, TrackEnded onTrackEndedCallback) { _minimumScrobbleSeconds = minimumScrobbleSeconds; _onTrackStarted = onTrackStartedCallback; _onTrackEnded = onTrackEndedCallback; _isIntialized = true; try { _scrobbleTimer = new System.Timers.Timer(); _scrobbleTimer.Interval = 1000; _scrobbleTimer.Elapsed += async(o, e) => { _scrobbleTimer.Stop(); // Check for the iTunes process to ensure it's running. // If we don't check for it, the plugin would end up launching it, which we don't want Process[] wmpProcesses = Process.GetProcessesByName("wmplayer"); if (wmpProcesses.Length > 0 && _mediaPlayer == null) { _mediaPlayer = new WindowsMediaPlayer(); _mediaPlayer.Show(); Console.WriteLine("Windows Media Player Plugin successfully connected to the WMP COM library."); } else if (wmpProcesses.Length == 0 && _mediaPlayer != null) { //_mediaPlayer = null; Console.WriteLine("Windows Media Player process not detected. Waiting for Windows Media Player process to start..."); } if (_mediaPlayer != null) { Console.WriteLine("Windows Media Player Plugin checking media state..."); if (_isEnabled) { MediaItem mediaDetail = await GetMediaDetail(); if (mediaDetail != null && _mediaToScrobble.Count(mediaItem => mediaItem.TrackName == mediaDetail?.TrackName) == 0 && _currentMediaItem?.TrackName != mediaDetail?.TrackName) { if (_currentMediaItem != null) { _onTrackEnded?.Invoke(_currentMediaItem); } _currentMediaItem = mediaDetail; Console.WriteLine("Raising Track Change Method."); _onTrackStarted?.Invoke(mediaDetail); } if (_currentMediaItem != null) { Console.WriteLine($"Player position {_playerPosition} of {_currentMediaItem.TrackLength}."); if (mediaDetail != null && _mediaToScrobble.Count(item => item.TrackName == mediaDetail?.TrackName) == 0 && _playerPosition >= _minimumScrobbleSeconds && _playerPosition >= _currentMediaItem.TrackLength / 2 && mediaDetail?.TrackName != _lastQueuedItem?.TrackName) { _lastQueuedItem = mediaDetail; lock (_mediaLock) { _mediaToScrobble.Add(mediaDetail); Console.WriteLine($"Track {mediaDetail.TrackName} queued for Scrobbling."); } } } } Console.WriteLine("Windows Media Plugin checking media state complete."); } _scrobbleTimer.Start(); }; } catch (Exception ex) { _scrobbleTimer.Start(); } }