Explorar o código

update live stream termination

Luke Pulverenti %!s(int64=10) %!d(string=hai) anos
pai
achega
26094af115

+ 1 - 1
MediaBrowser.Api/ApiEntryPoint.cs

@@ -340,7 +340,7 @@ namespace MediaBrowser.Api
             // We can really reduce the timeout for apps that are using the newer api
             // We can really reduce the timeout for apps that are using the newer api
             if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive)
             if (!string.IsNullOrWhiteSpace(job.PlaySessionId) && job.Type != TranscodingJobType.Progressive)
             {
             {
-                timerDuration = 35000;
+                timerDuration = 20000;
             }
             }
 
 
             if (job.KillTimer == null)
             if (job.KillTimer == null)

+ 15 - 1
MediaBrowser.Api/Playback/Hls/BaseHlsService.cs

@@ -85,6 +85,7 @@ namespace MediaBrowser.Api.Playback.Hls
                 state.Request.StartTimeTicks = null;
                 state.Request.StartTimeTicks = null;
             }
             }
 
 
+            TranscodingJob job = null;
             var playlist = state.OutputFilePath;
             var playlist = state.OutputFilePath;
 
 
             if (!File.Exists(playlist))
             if (!File.Exists(playlist))
@@ -97,7 +98,7 @@ namespace MediaBrowser.Api.Playback.Hls
                         // If the playlist doesn't already exist, startup ffmpeg
                         // If the playlist doesn't already exist, startup ffmpeg
                         try
                         try
                         {
                         {
-                            await StartFfMpeg(state, playlist, cancellationTokenSource).ConfigureAwait(false);
+                            job = await StartFfMpeg(state, playlist, cancellationTokenSource).ConfigureAwait(false);
                         }
                         }
                         catch
                         catch
                         {
                         {
@@ -116,6 +117,12 @@ namespace MediaBrowser.Api.Playback.Hls
 
 
             if (isLive)
             if (isLive)
             {
             {
+                job = job ?? ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlist, TranscodingJobType);
+
+                if (job != null)
+                {
+                    ApiEntryPoint.Instance.OnTranscodeEndRequest(job);
+                }
                 return ResultFactory.GetResult(GetLivePlaylistText(playlist, state.SegmentLength), MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
                 return ResultFactory.GetResult(GetLivePlaylistText(playlist, state.SegmentLength), MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
             }
             }
 
 
@@ -134,6 +141,13 @@ namespace MediaBrowser.Api.Playback.Hls
 
 
             var playlistText = GetMasterPlaylistFileText(playlist, videoBitrate + audioBitrate, appendBaselineStream, baselineStreamBitrate);
             var playlistText = GetMasterPlaylistFileText(playlist, videoBitrate + audioBitrate, appendBaselineStream, baselineStreamBitrate);
 
 
+            job = job ?? ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlist, TranscodingJobType);
+
+            if (job != null)
+            {
+                ApiEntryPoint.Instance.OnTranscodeEndRequest(job);
+            }
+            
             return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
             return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
         }
         }
 
 

+ 0 - 2
MediaBrowser.Api/Playback/Hls/VideoHlsService.cs

@@ -3,12 +3,10 @@ using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Devices;
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.IO;
 using ServiceStack;
 using ServiceStack;
 using System;
 using System;
-using System.IO;
 
 
 namespace MediaBrowser.Api.Playback.Hls
 namespace MediaBrowser.Api.Playback.Hls
 {
 {

+ 43 - 12
MediaBrowser.Server.Implementations/EntryPoints/ExternalPortForwarding.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Controller;
+using System.Linq;
+using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Controller.Plugins;
 using MediaBrowser.Model.Logging;
 using MediaBrowser.Model.Logging;
@@ -47,7 +48,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
         void _config_ConfigurationUpdated(object sender, EventArgs e)
         void _config_ConfigurationUpdated(object sender, EventArgs e)
         {
         {
             _config.ConfigurationUpdated -= _config_ConfigurationUpdated;
             _config.ConfigurationUpdated -= _config_ConfigurationUpdated;
-            
+
             if (!string.Equals(_lastConfigIdentifier, GetConfigIdentifier(), StringComparison.OrdinalIgnoreCase))
             if (!string.Equals(_lastConfigIdentifier, GetConfigIdentifier(), StringComparison.OrdinalIgnoreCase))
             {
             {
                 if (_isStarted)
                 if (_isStarted)
@@ -88,7 +89,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
             NatUtility.UnhandledException += NatUtility_UnhandledException;
             NatUtility.UnhandledException += NatUtility_UnhandledException;
             NatUtility.StartDiscovery();
             NatUtility.StartDiscovery();
 
 
-            _timer = new Timer(s => _createdRules = new List<string>(), null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
+            _timer = new Timer(s => _createdRules = new List<string>(), null, TimeSpan.FromMinutes(3), TimeSpan.FromMinutes(3));
 
 
             _lastConfigIdentifier = GetConfigIdentifier();
             _lastConfigIdentifier = GetConfigIdentifier();
 
 
@@ -119,7 +120,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
 
 
                 CreateRules(device);
                 CreateRules(device);
             }
             }
-            catch (Exception)
+            catch (Exception ex)
             {
             {
                 // I think it could be a good idea to log the exception because 
                 // I think it could be a good idea to log the exception because 
                 //   you are using permanent portmapping here (never expire) and that means that next time
                 //   you are using permanent portmapping here (never expire) and that means that next time
@@ -128,7 +129,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
                 //   It also can fail with others like 727-ExternalPortOnlySupportsWildcard, 728-NoPortMapsAvailable
                 //   It also can fail with others like 727-ExternalPortOnlySupportsWildcard, 728-NoPortMapsAvailable
                 // and those errors (upnp errors) could be useful for diagnosting.  
                 // and those errors (upnp errors) could be useful for diagnosting.  
 
 
-                //_logger.ErrorException("Error creating port forwarding rules", ex);
+                _logger.ErrorException("Error creating port forwarding rules", ex);
             }
             }
         }
         }
 
 
@@ -138,25 +139,55 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
             // On some systems the device discovered event seems to fire repeatedly
             // On some systems the device discovered event seems to fire repeatedly
             // This check will help ensure we're not trying to port map the same device over and over
             // This check will help ensure we're not trying to port map the same device over and over
 
 
+            List<Mapping> currentMappings = null;
+
+            try
+            {
+                currentMappings = device.GetAllMappings().ToList();
+            }
+            catch (NotSupportedException)
+            {
+            }
+
             var address = device.LocalAddress.ToString();
             var address = device.LocalAddress.ToString();
 
 
             if (!_createdRules.Contains(address))
             if (!_createdRules.Contains(address))
             {
             {
                 _createdRules.Add(address);
                 _createdRules.Add(address);
 
 
-                CreatePortMap(device, _appHost.HttpPort, _config.Configuration.PublicPort);
-                CreatePortMap(device, _appHost.HttpsPort, _config.Configuration.PublicHttpsPort);
+                CreatePortMap(device, currentMappings, _appHost.HttpPort, _config.Configuration.PublicPort);
+                CreatePortMap(device, currentMappings, _appHost.HttpsPort, _config.Configuration.PublicHttpsPort);
             }
             }
         }
         }
 
 
-        private void CreatePortMap(INatDevice device, int privatePort, int publicPort)
+        private void CreatePortMap(INatDevice device, List<Mapping> currentMappings, int privatePort, int publicPort)
         {
         {
-            _logger.Debug("Creating port map on port {0}", privatePort);
+            var hasMapping = false;
+
+            if (currentMappings != null)
+            {
+                hasMapping = currentMappings.Any(i => i.PublicPort == publicPort && i.PrivatePort == privatePort);
+            }
+            else
+            {
+                try
+                {
+                    var mapping = device.GetSpecificMapping(Protocol.Tcp, publicPort);
+                    hasMapping = mapping != null;
+                }
+                catch (NotSupportedException)
+                {
+                }
+            }
 
 
-            device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
+            if (!hasMapping)
             {
             {
-                Description = _appHost.Name
-            });
+                _logger.Debug("Creating port map on port {0}", privatePort);
+                device.CreatePortMap(new Mapping(Protocol.Tcp, privatePort, publicPort)
+                {
+                    Description = _appHost.Name
+                });
+            }
         }
         }
 
 
         // As I said before, this method will be never invoked. You can remove it.
         // As I said before, this method will be never invoked. You can remove it.