소스 검색

Remove unnecessary allocations in TunerHostManager

Patrick Barron 1 년 전
부모
커밋
c23a038ba8

+ 2 - 2
Jellyfin.Api/Controllers/LiveTvController.cs

@@ -1144,8 +1144,8 @@ public class LiveTvController : BaseJellyfinApiController
     [HttpGet("Tuners/Discover")]
     [Authorize(Policy = Policies.LiveTvManagement)]
     [ProducesResponseType(StatusCodes.Status200OK)]
-    public async Task<ActionResult<IEnumerable<TunerHostInfo>>> DiscoverTuners([FromQuery] bool newDevicesOnly = false)
-        => await _tunerHostManager.DiscoverTuners(newDevicesOnly, CancellationToken.None).ConfigureAwait(false);
+    public IAsyncEnumerable<TunerHostInfo> DiscoverTuners([FromQuery] bool newDevicesOnly = false)
+        => _tunerHostManager.DiscoverTuners(newDevicesOnly);
 
     /// <summary>
     /// Gets a live tv recording stream.

+ 1 - 2
MediaBrowser.Controller/LiveTv/ITunerHostManager.cs

@@ -34,9 +34,8 @@ public interface ITunerHostManager
     /// Discovers the available tuners.
     /// </summary>
     /// <param name="newDevicesOnly">A value indicating whether to only return new devices.</param>
-    /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use.</param>
     /// <returns>The <see cref="TunerHostInfo"/>s.</returns>
-    Task<List<TunerHostInfo>> DiscoverTuners(bool newDevicesOnly, CancellationToken cancellationToken);
+    IAsyncEnumerable<TunerHostInfo> DiscoverTuners(bool newDevicesOnly);
 
     /// <summary>
     /// Scans for tuner devices that have changed URLs.

+ 9 - 16
src/Jellyfin.LiveTv/TunerHosts/TunerHostManager.cs

@@ -5,7 +5,6 @@ using System.Linq;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
-using Jellyfin.Extensions;
 using Jellyfin.LiveTv.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
@@ -101,10 +100,8 @@ public class TunerHostManager : ITunerHostManager
     }
 
     /// <inheritdoc />
-    public async Task<List<TunerHostInfo>> DiscoverTuners(bool newDevicesOnly, CancellationToken cancellationToken)
+    public async IAsyncEnumerable<TunerHostInfo> DiscoverTuners(bool newDevicesOnly)
     {
-        var list = new List<TunerHostInfo>();
-
         var configuredDeviceIds = _config.GetLiveTvConfiguration().TunerHosts
             .Where(i => !string.IsNullOrWhiteSpace(i.DeviceId))
             .Select(i => i.DeviceId)
@@ -112,19 +109,15 @@ public class TunerHostManager : ITunerHostManager
 
         foreach (var host in _tunerHosts)
         {
-            var discoveredDevices = await DiscoverDevices(host, TunerDiscoveryDurationMs, cancellationToken).ConfigureAwait(false);
-
-            if (newDevicesOnly)
+            var discoveredDevices = await DiscoverDevices(host, TunerDiscoveryDurationMs, CancellationToken.None).ConfigureAwait(false);
+            foreach (var tuner in discoveredDevices)
             {
-                discoveredDevices = discoveredDevices
-                    .Where(d => !configuredDeviceIds.Contains(d.DeviceId, StringComparison.OrdinalIgnoreCase))
-                    .ToList();
+                if (!newDevicesOnly || !configuredDeviceIds.Contains(tuner.DeviceId, StringComparer.OrdinalIgnoreCase))
+                {
+                    yield return tuner;
+                }
             }
-
-            list.AddRange(discoveredDevices);
         }
-
-        return list;
     }
 
     /// <inheritdoc />
@@ -158,7 +151,7 @@ public class TunerHostManager : ITunerHostManager
         }
     }
 
-    private async Task<List<TunerHostInfo>> DiscoverDevices(ITunerHost host, int discoveryDurationMs, CancellationToken cancellationToken)
+    private async Task<IList<TunerHostInfo>> DiscoverDevices(ITunerHost host, int discoveryDurationMs, CancellationToken cancellationToken)
     {
         try
         {
@@ -175,7 +168,7 @@ public class TunerHostManager : ITunerHostManager
         {
             _logger.LogError(ex, "Error discovering tuner devices");
 
-            return new List<TunerHostInfo>();
+            return Array.Empty<TunerHostInfo>();
         }
     }
 }