コード例 #1
0
        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();
            }
        }