Browse Source

rework hls timer

Luke Pulverenti 10 years ago
parent
commit
967751d2a5
2 changed files with 58 additions and 10 deletions
  1. 48 10
      MediaBrowser.Api/ApiEntryPoint.cs
  2. 10 0
      MediaBrowser.Api/UserLibrary/PlaystateService.cs

+ 48 - 10
MediaBrowser.Api/ApiEntryPoint.cs

@@ -286,27 +286,65 @@ namespace MediaBrowser.Api
 
             job.DisposeKillTimer();
         }
-        
+
         public void OnTranscodeEndRequest(TranscodingJob job)
         {
             job.ActiveRequestCount--;
 
             if (job.ActiveRequestCount == 0)
             {
-                // TODO: Lower this hls timeout
-                var timerDuration = job.Type == TranscodingJobType.Progressive ?
-                    1000 :
-                    1800000;
+                PingTimer(job, true);
+            }
+        }
+        internal void PingTranscodingJob(string deviceId, string playSessionId)
+        {
+            if (string.IsNullOrEmpty(deviceId))
+            {
+                throw new ArgumentNullException("deviceId");
+            }
 
-                if (job.KillTimer == null)
+            var jobs = new List<TranscodingJob>();
+
+            lock (_activeTranscodingJobs)
+            {
+                // This is really only needed for HLS. 
+                // Progressive streams can stop on their own reliably
+                jobs = jobs.Where(j =>
                 {
-                    job.KillTimer = new Timer(OnTranscodeKillTimerStopped, job, timerDuration, Timeout.Infinite);
-                }
-                else
+                    if (string.Equals(deviceId, j.DeviceId, StringComparison.OrdinalIgnoreCase))
+                    {
+                        return string.Equals(playSessionId, j.PlaySessionId, StringComparison.OrdinalIgnoreCase);
+                    }
+
+                    return false;
+
+                }).ToList();
+            }
+
+            foreach (var job in jobs)
+            {
+                PingTimer(job, false);
+            }
+        }
+
+        private void PingTimer(TranscodingJob job, bool startTimerIfNeeded)
+        {
+            // TODO: Lower this hls timeout
+            var timerDuration = job.Type == TranscodingJobType.Progressive ?
+                1000 :
+                1800000;
+
+            if (job.KillTimer == null)
+            {
+                if (startTimerIfNeeded)
                 {
-                    job.KillTimer.Change(timerDuration, Timeout.Infinite);
+                    job.KillTimer = new Timer(OnTranscodeKillTimerStopped, job, timerDuration, Timeout.Infinite);
                 }
             }
+            else
+            {
+                job.KillTimer.Change(timerDuration, Timeout.Infinite);
+            }
         }
 
         /// <summary>

+ 10 - 0
MediaBrowser.Api/UserLibrary/PlaystateService.cs

@@ -294,6 +294,11 @@ namespace MediaBrowser.Api.UserLibrary
 
         public void Post(ReportPlaybackProgress request)
         {
+            if (!string.IsNullOrWhiteSpace(request.PlaySessionId))
+            {
+                ApiEntryPoint.Instance.PingTranscodingJob(AuthorizationContext.GetAuthorizationInfo(Request).DeviceId, request.PlaySessionId);
+            }
+
             request.SessionId = GetSession().Result.Id;
 
             var task = _sessionManager.OnPlaybackProgress(request);
@@ -317,6 +322,11 @@ namespace MediaBrowser.Api.UserLibrary
 
         public void Post(ReportPlaybackStopped request)
         {
+            if (!string.IsNullOrWhiteSpace(request.PlaySessionId))
+            {
+                ApiEntryPoint.Instance.KillTranscodingJobs(AuthorizationContext.GetAuthorizationInfo(Request).DeviceId, request.PlaySessionId, s => true);
+            }
+
             request.SessionId = GetSession().Result.Id;
 
             var task = _sessionManager.OnPlaybackStopped(request);