Jelajahi Sumber

Switch to LINQ and updated /Device/Info endpoint to return in accordance to the updated API doc

LJQ 1 tahun lalu
induk
melakukan
2f9b44fcd0
1 mengubah file dengan 28 tambahan dan 18 penghapusan
  1. 28 18
      Jellyfin.Server.Implementations/Devices/DeviceManager.cs

+ 28 - 18
Jellyfin.Server.Implementations/Devices/DeviceManager.cs

@@ -110,21 +110,21 @@ namespace Jellyfin.Server.Implementations.Devices
         /// <inheritdoc />
         public async Task<DeviceInfo?> GetDevice(string id)
         {
-            Device? device;
             var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
             await using (dbContext.ConfigureAwait(false))
             {
-                device = await dbContext.Devices
+                var device = await dbContext.Devices
                     .Where(d => d.DeviceId == id)
                     .OrderByDescending(d => d.DateLastActivity)
                     .Include(d => d.User)
+                    .SelectMany(d => dbContext.DeviceOptions.Where(o => o.DeviceId == d.DeviceId).DefaultIfEmpty(), (d, o) => new { Device = d, Options = o })
                     .FirstOrDefaultAsync()
                     .ConfigureAwait(false);
-            }
 
-            var deviceInfo = device is null ? null : ToDeviceInfo(device);
+                var deviceInfo = device is null ? null : ToDeviceInfo(device.Device, device.Options);
 
-            return deviceInfo;
+                return deviceInfo;
+            }
         }
 
         /// <inheritdoc />
@@ -172,15 +172,15 @@ namespace Jellyfin.Server.Implementations.Devices
             var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
             await using (dbContext.ConfigureAwait(false))
             {
-                IAsyncEnumerable<Device> sessions = dbContext.Devices
+                var sessions = dbContext.Devices
                     .Include(d => d.User)
                     .OrderByDescending(d => d.DateLastActivity)
                     .ThenBy(d => d.DeviceId)
+                    .SelectMany(d => dbContext.DeviceOptions.Where(o => o.DeviceId == d.DeviceId).DefaultIfEmpty(), (d, o) => new { Device = d, Options = o })
                     .AsAsyncEnumerable();
-                IAsyncEnumerable<DeviceOptions> deviceOptions = dbContext.DeviceOptions.AsAsyncEnumerable();
                 if (supportsSync.HasValue)
                 {
-                    sessions = sessions.Where(i => GetCapabilities(i.DeviceId).SupportsSync == supportsSync.Value);
+                    sessions = sessions.Where(i => GetCapabilities(i.Device.DeviceId).SupportsSync == supportsSync.Value);
                 }
 
                 if (userId.HasValue)
@@ -191,18 +191,10 @@ namespace Jellyfin.Server.Implementations.Devices
                         throw new ResourceNotFoundException();
                     }
 
-                    sessions = sessions.Where(i => CanAccessDevice(user, i.DeviceId));
+                    sessions = sessions.Where(i => CanAccessDevice(user, i.Device.DeviceId));
                 }
 
-                var array = await sessions.Select(device => ToDeviceInfo(device)).ToArrayAsync().ConfigureAwait(false);
-                await foreach (var deviceOption in deviceOptions)
-                {
-                    var deviceInfo = array.FirstOrDefault(d => d.Id.Equals(deviceOption.DeviceId, StringComparison.OrdinalIgnoreCase));
-                    if (deviceInfo != null)
-                    {
-                        deviceInfo.CustomName = deviceOption.CustomName;
-                    }
-                }
+                var array = await sessions.Select(device => ToDeviceInfo(device.Device, device.Options)).ToArrayAsync().ConfigureAwait(false);
 
                 return new QueryResult<DeviceInfo>(array);
             }
@@ -250,5 +242,23 @@ namespace Jellyfin.Server.Implementations.Devices
                 IconUrl = caps.IconUrl
             };
         }
+
+        private DeviceInfo ToDeviceInfo(Device authInfo, DeviceOptions? options)
+        {
+            var caps = GetCapabilities(authInfo.DeviceId);
+
+            return new DeviceInfo
+            {
+                AppName = authInfo.AppName,
+                AppVersion = authInfo.AppVersion,
+                Id = authInfo.DeviceId,
+                LastUserId = authInfo.UserId,
+                LastUserName = authInfo.User.Username,
+                Name = authInfo.DeviceName,
+                DateLastActivity = authInfo.DateLastActivity,
+                IconUrl = caps.IconUrl,
+                CustomName = options?.CustomName,
+            };
+        }
     }
 }