public void TestWatchedIsFiredCorrectly()
 {
     var stat = new PlaybackStatus();
     stat.WasPlayedChanged += new EventHandler<EventArgs>(stat_OnWatchedChanged);
     played = stat.WasPlayed;
     stat.PlayCount = 1;
     Assert.IsTrue(played);
     stat.PlayCount = 0;
     Assert.IsFalse(played);
 }
        public void TestPersistance()
        {
            var stat = new PlaybackStatus();
            stat.LastPlayed = DateTime.Now;
            stat.PlayCount = 99;
            stat.PlaylistPosition = 2;
            stat.PositionTicks = 1000;
            stat.Id = Guid.NewGuid();

            stat.Save();

            var stat2 = Kernel.Instance.ItemRepository.RetrievePlayState(stat.Id);
            Assert.AreEqual(stat.Id, stat2.Id);
            Assert.AreEqual(stat.LastPlayed, stat2.LastPlayed);
            Assert.AreEqual(stat.PlayCount, stat2.PlayCount);
            Assert.AreEqual(stat.PlaylistPosition, stat2.PlaylistPosition);
            Assert.AreEqual(stat.PositionTicks, stat2.PositionTicks);
        }
        public void TestPlayStateStorage()
        {
            PlaybackStatus state = new PlaybackStatus();
            state.Id = Guid.NewGuid();
            state.LastPlayed = DateTime.Now;
            state.PlayCount = 10;
            state.PlaylistPosition = 1;
            state.LastPlayed = DateTime.Now;

            SqliteItemRepository repository = GetRepo();
            repository.SavePlayState(state);
            repository.FlushWriter();
            var clone = repository.RetrievePlayState(state.Id);

            Assert.AreEqual(state.Id, clone.Id);
            Assert.AreEqual(state.LastPlayed, clone.LastPlayed);
            Assert.AreEqual(state.PlayCount, clone.PlayCount);
            Assert.AreEqual(state.PlaylistPosition, clone.PlaylistPosition);
            Assert.AreEqual(state.LastPlayed, clone.LastPlayed);
        }
 public void SavePlayState(PlaybackStatus playState) {
     playbackStatus[playState.Id] = playState;
 }
 public void Play(PlaybackStatus playstate, bool resume)
 {
     this.PlayState = playstate;
     this.Prepare(resume);
     if (this is PlayableCollection && (this.PlayableItems == null || this.PlayableItems.Count() < 1))
     {
         Microsoft.MediaCenter.MediaCenterEnvironment ev = Microsoft.MediaCenter.Hosting.AddInHost.Current.MediaCenterEnvironment;
         ev.Dialog(Application.CurrentInstance.StringData("NoContentDial"), Application.CurrentInstance.StringData("Playstr"), Microsoft.MediaCenter.DialogButtons.Ok, 500, true);
     }
     else
     {
         PlayInternal(resume);
     }
 }
        internal void EnsurePlayStateChangesBoundToUI()
        {
            if (playstate == null)
            {

                Media media = baseItem as Media;

                if (media != null)
                {
                    playstate = media.PlaybackStatus;
                    // if we want any chance to reclaim memory we are going to have to use 
                    // weak event handlers
                    playstate.WasPlayedChanged += new EventHandler<EventArgs>(PlaybackStatusPlayedChanged);
                    PlaybackStatusPlayedChanged(this, null);
                }
            }
        }
 public void ResetPlayState()
 {
     //this will force it to re-load
     playstate = null;
 }
 /// <summary>
 /// All we do now is check in with the server and let it figure everything else out
 /// </summary>
 public void UpdatePlayState(Media media, PlaybackStatus playstate, bool isPaused, bool saveToDataStore)
 {
     if (saveToDataStore)
     {
         ReportPlaybackProgress(media.ApiId, playstate.PositionTicks, isPaused, currentPlaybackController.IsStreaming);
     }
 }
 /// <summary>
 /// All we do now is check in with the server and let it figure everything else out
 /// </summary>
 public void UpdatePlayState(Media media, PlaybackStatus playstate, bool isPaused, bool saveToDataStore)
 {
     if (saveToDataStore)
     {
         ReportPlaybackProgress(media.ApiId, playstate.PositionTicks, isPaused);
     }
 }
 public PlaybackStatus Create(Guid id)
 {
     PlaybackStatus mine = new PlaybackStatus();
     mine.Id = id;
     return mine;
 }
 public void SavePlayState(PlaybackStatus playState)
 {
 }
Exemple #12
0
        /// <summary>
        /// This is a helper to update Playstate for an item.
        /// It honors all of the various resume options within configuration.
        /// Play count will be incremented if the last played date doesn't match what's currently in the object
        /// </summary>
        public void UpdatePlayState(Media media, PlaybackStatus playstate, int playlistPosition, long positionTicks, long? duration, DateTime datePlayed, bool saveToDataStore)
        {
            // Increment play count if dates don't match
            bool incrementPlayCount = !playstate.LastPlayed.Equals(datePlayed);

            // The player didn't report the duration, see if we have it in metadata
            if ((!duration.HasValue || duration == 0) && media.Files.Count() == 1)
            {
                // We need duration to pertain only to one file
                // So if there are multiple files don't bother with this
                // since we have no way of breaking it down

                duration = TimeSpan.FromMinutes(media.RunTime).Ticks;
            }

            // If we know the duration then enforce MinResumePct, MaxResumePct and MinResumeDuration
            if (duration.HasValue && duration > 0)
            {
                // Enforce MinResumePct/MaxResumePct
                if (positionTicks > 0)
                {
                    decimal pctIn = Decimal.Divide(positionTicks, duration.Value) * 100;

                    // Don't track in very beginning
                    if (pctIn < Config.Instance.MinResumePct)
                    {
                        positionTicks = 0;

                        if (playlistPosition == 0)
                        {
                            // Assume we're at the very beginning so don't even mark it watched.
                            incrementPlayCount = false;
                        }
                    }

                    // If we're at the end, assume completed
                    if (pctIn > Config.Instance.MaxResumePct || positionTicks >= duration)
                    {
                        positionTicks = 0;

                        // Either advance to the next playlist position, or reset it back to 0
                        if (playlistPosition < (media.Files.Count() - 1))
                        {
                            playlistPosition++;
                        }
                        else
                        {
                            playlistPosition = 0;
                        }
                    }
                }

                // Enforce MinResumeDuration
                if ((duration / TimeSpan.TicksPerMinute) < Config.Instance.MinResumeDuration)
                {
                    positionTicks = 0;
                }
            }

            // If resume is disabled reset positions to 0
            if (!MediaBrowser.Library.Kernel.Instance.ConfigData.EnableResumeSupport)
            {
                positionTicks = 0;
                playlistPosition = 0;
            }

            playstate.PositionTicks = positionTicks;
            playstate.PlaylistPosition = playlistPosition;

            if (incrementPlayCount)
            {
                playstate.LastPlayed = datePlayed;
                playstate.PlayCount++;
            }

            if (saveToDataStore)
            {
                string sDuration = duration.HasValue ? (TimeSpan.FromTicks(duration.Value).ToString()) : "0";

                //Logger.ReportVerbose("Playstate saved for {0} at {1}, duration: {2}, playlist position: {3}", media.Name, TimeSpan.FromTicks(positionTicks), sDuration, playlistPosition);
                Kernel.Instance.SavePlayState(media, playstate);
            }
        }
 public void Play(PlaybackStatus playstate, bool resume)
 {
     this.PlayState = playstate;
     this.Prepare(resume);
     this.PlayInternal(resume);
 }