public NowPlayingData getNowPlaying()
        {
            var ret = new NowPlayingData();

            try
            {
                MPMusicPlayerController player = MPMusicPlayerController.SystemMusicPlayer;
                if (player.NowPlayingItem != null)
                {
                    ret.Title  = player.NowPlayingItem.Title;
                    ret.Artist = player.NowPlayingItem.Artist;
                    if (player.PlaybackState.Equals(MPMusicPlaybackState.Playing))
                    {
                        ret.IsPlaying = true;
                    }
                    ret.PlaybackDuration    = player.NowPlayingItem.PlaybackDuration;
                    ret.CurrentPlaybackTime = player.CurrentPlaybackTime;
                    ret.Volume = MPMusicPlayerController.SystemMusicPlayer.Volume;
                    var imageBytes    = GetTrackImage(player.NowPlayingItem.Artwork);
                    var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Resources);
                    var filePath      = Path.Combine(documentsPath, "nowPlaying.png");
                    ret.ArtWork = GetTrackImageStream(player.NowPlayingItem.Artwork);


                    File.WriteAllBytes(filePath, imageBytes);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            return(ret);
        }
Exemple #2
0
        public static async void StatusReportReceived(NowPlayingData data, WebViewController controller)
        {
            if (!data.IsPlaying)
            {
                return;
            }

            logger.Trace(data.ElapsedTime.ToString());

            try
            {
                if (data.ElapsedTime == lastElapsed)
                {
                    sameElapsedCounter++;

                    if (sameElapsedCounter > AppConstants.Instance.StuckDetectSameElapsedCount)
                    {
                        if (stuckResolveTryCount >= AppConstants.Instance.MaxStuckResolveTryCount)
                        {
                            logger.Warn("MaxStuckResolveTryCount exceeded.");

                            if (stuckResolveTryCount == AppConstants.Instance.MaxStuckResolveTryCount)
                            {
                                LogPlaybackStuck("MaxStuckResolveTryCountExceeded");
                            }

                            // TODO: Probably reload the page?
                        }

                        if (data.ElapsedTime == 0)
                        {
                            await PlayStartStuckResolve(controller);
                        }
                        else
                        {
                            await PlayMiddleStuckResolve(controller);
                        }

                        stuckResolveTryCount++;
                        sameElapsedCounter = -1 * AppConstants.Instance.StuckDetectSameElapsedExtraCount;
                    }
                }
                else
                {
                    stuckResolveTryCount = 0;
                    sameElapsedCounter   = 0;
                    lastElapsed          = data.ElapsedTime;
                }
            }
            catch (Exception ex)
            {
                logger.Warn("StuckResolveHelper.StatusReportReceived failed: " + ex.ToString());
            }
        }
        /// <summary>
        /// Generates serialized JSON object with Now playing data to send to the browser
        /// </summary>
        /// <param name="isForcedOnce">Should we send the artwork data</param>
        /// <returns>Serialized json data</returns>
        public static string GetNowPlayingData(bool isForcedOnce)
        {
            try
            {
                float currentPos = MbApi.Player_GetPosition();
                float totalTime  = MbApi.NowPlaying_GetDuration();
                float completed  = currentPos / totalTime * 100;

                if (data == null)
                {
                    data = new NowPlayingData();
                }

                string oldHash = Util.CreateMD5(data.CurrentTrackTitle + data.CurrentTrackArtist).ToLower();
                string curHash = Util.CreateMD5(MbApi.NowPlaying_GetFileTag(MetaDataType.TrackTitle) +
                                                MbApi.NowPlaying_GetFileTag(MetaDataType.Artist)).ToLower();
                bool TrackChanged = (curHash != oldHash);

                data.HasTrackChanged              = (TrackChanged || isForcedOnce);
                data.CurrentTrackTitle            = MbApi.NowPlaying_GetFileTag(MetaDataType.TrackTitle);
                data.CurrentTrackArtist           = MbApi.NowPlaying_GetFileTag(MetaDataType.Artist);
                data.CurrentPlayerState           = MbApi.Player_GetPlayState().ToString();
                data.CurrentTrackSize             = totalTime;
                data.CurrentTrackPosition         = currentPos;
                data.CurrentTrackCompleted        = completed;
                data.CurrentTrackSizeReadable     = Util.FormattedMills(totalTime);
                data.CurrentTrackPositionReadable = Util.FormattedMills(currentPos);
                data.CurrentTrackAlbum            = MbApi.NowPlaying_GetFileTag(MetaDataType.Album);
                data.CurrentTrackGenre            = MbApi.NowPlaying_GetFileTag(MetaDataType.Genres);
                data.ArtworkPath   = (TrackChanged || isForcedOnce) ? MbApi.NowPlaying_GetFileUrl() : string.Empty;
                data.CurrentVolume = MbApi.Player_GetVolume();

                var allfile = MbApi.NowPlayingList_QueryGetNextFile();
                data.NextQueueTrack = allfile;

                data.ArtistDataset = (TrackChanged || isForcedOnce) ? GetArtistData(MbApi.NowPlaying_GetFileTag(MetaDataType.Artist)) : new ArtistData();

                data.callback_function = "refreshPlayerControl";

                return(Util.Serialize(data));
            }
            catch (Exception) { }
            return(string.Empty);
        }
Exemple #4
0
        public static async void LocalPlaybackDataReceived(NowPlayingData data)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(data.TrackFingerprint))
                {
                    if (timesFingerprintEmpty == 20)
                    {
                        logger.Warn($"LocalPlaybackDataError #{timesFingerprintEmpty}");
                        AnalyticsHelper.Log("localPlaybackDataError", "fingerprintInvalid", JsonConvert.SerializeObject(data));
                        timesFingerprintEmpty++;
                    }
                    else if (timesFingerprintEmpty < 20)
                    {
                        timesFingerprintEmpty++;
                        logger.Info($"LocalPlaybackDataError #{timesFingerprintEmpty}");
                    }
                }

                if (!data.Success &&
                    !string.IsNullOrWhiteSpace(data.TrackFingerprint) &&
                    data.TrackFingerprint != lastLocalFingerprint)
                {
                    logger.Info("LocalPlaybackDataReceived, success = false, fingerprint changed to " + data.TrackFingerprint);
                    await RefreshPlayStatus();

                    AnalyticsHelper.Log("localPlaybackDataError", "invalid", JsonConvert.SerializeObject(data));
                }
                else if (data.Success)
                {
                    bool changed = (LastPlayStatus.SongId != data.TrackId ||
                                    LastPlayStatus.Volume != data.Volume ||
                                    LastPlayStatus.IsNextTrackAvailable != data.IsNextTrackAvailable ||
                                    LastPlayStatus.IsPrevTrackAvailable != data.IsPrevTrackAvailable);

                    var album = await GlobalCache.Album.GetItem(data.AlbumId);

                    LastPlayStatus.AlbumId                = data.AlbumId;
                    LastPlayStatus.AlbumName              = album.name;
                    LastPlayStatus.ArtistId               = data.ArtistId;
                    LastPlayStatus.ArtistName             = data.ArtistName;
                    LastPlayStatus.ProgressedMilliseconds = data.ElapsedTime;
                    LastPlayStatus.SongLengthMilliseconds = data.TotalTime;
                    LastPlayStatus.SongId               = data.TrackId;
                    LastPlayStatus.SongName             = data.TrackName;
                    LastPlayStatus.IsPlaying            = data.IsPlaying;
                    LastPlayStatus.Volume               = data.Volume;
                    LastPlayStatus.IsNextTrackAvailable = data.IsNextTrackAvailable;
                    LastPlayStatus.IsPrevTrackAvailable = data.IsPrevTrackAvailable;

                    if (changed)
                    {
                        LastPlayStatus.InvokeUpdated();
                        logger.Info("LocalPlaybackDataReceived and changed = true for " + data.TrackFingerprint);
                    }

                    lastStatusFetch = DateTime.UtcNow;
                    IsLocalStatusTrackingOperational = true;
                }

                lastLocalFingerprint = data.TrackFingerprint;
            }
            catch (Exception ex)
            {
                logger.Info("LocalPlaybackDataReceived failed: " + ex.ToString());
            }
        }
        public NowPlayingData getNowPlaying()
        {
            var ret = new NowPlayingData();

            return(ret);
        }