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); }
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); }
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); }