浏览代码

Merge branch 'master' into feature/ffmpeg-version-check

Max Git 5 年之前
父节点
当前提交
33f78df051
共有 100 个文件被更改,包括 628 次插入175 次删除
  1. 1 0
      DvdLib/Ifo/Cell.cs
  2. 2 0
      DvdLib/Ifo/Chapter.cs
  3. 4 0
      DvdLib/Ifo/ProgramChain.cs
  4. 4 0
      DvdLib/Ifo/Title.cs
  5. 1 0
      Emby.Dlna/ContentDirectory/ControlHandler.cs
  6. 4 1
      Emby.Dlna/Didl/DidlBuilder.cs
  7. 4 1
      Emby.Dlna/DlnaManager.cs
  8. 18 9
      Emby.Dlna/Eventing/EventManager.cs
  9. 3 0
      Emby.Dlna/Eventing/EventSubscription.cs
  10. 2 0
      Emby.Dlna/Main/DlnaEntryPoint.cs
  11. 3 1
      Emby.Dlna/PlayTo/Device.cs
  12. 5 0
      Emby.Dlna/PlayTo/PlayToController.cs
  13. 1 0
      Emby.Dlna/PlayTo/PlayToManager.cs
  14. 1 0
      Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs
  15. 2 0
      Emby.Dlna/PlayTo/uBaseObject.cs
  16. 5 0
      Emby.Dlna/Server/DescriptionXmlBuilder.cs
  17. 4 0
      Emby.Dlna/Service/BaseControlHandler.cs
  18. 1 0
      Emby.Dlna/Service/ServiceXmlBuilder.cs
  19. 1 0
      Emby.Naming/AudioBook/AudioBookFilePathParser.cs
  20. 3 3
      Emby.Naming/Common/MediaType.cs
  21. 1 1
      Emby.Server.Implementations/ApplicationHost.cs
  22. 2 2
      Emby.Server.Implementations/Data/BaseSqliteRepository.cs
  23. 3 3
      Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs
  24. 120 5
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  25. 6 3
      Emby.Server.Implementations/Data/SqliteUserDataRepository.cs
  26. 1 0
      Emby.Server.Implementations/Devices/DeviceManager.cs
  27. 15 4
      Emby.Server.Implementations/Dto/DtoService.cs
  28. 1 1
      Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs
  29. 2 2
      Emby.Server.Implementations/HttpServer/FileWriter.cs
  30. 2 1
      Emby.Server.Implementations/HttpServer/HttpListenerHost.cs
  31. 1 1
      Emby.Server.Implementations/HttpServer/HttpResultFactory.cs
  32. 11 4
      Emby.Server.Implementations/HttpServer/RangeRequestWriter.cs
  33. 1 0
      Emby.Server.Implementations/HttpServer/Security/AuthService.cs
  34. 2 0
      Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
  35. 2 0
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  36. 1 1
      Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs
  37. 2 0
      Emby.Server.Implementations/Library/ExclusiveLiveStream.cs
  38. 3 3
      Emby.Server.Implementations/Library/IgnorePatterns.cs
  39. 9 7
      Emby.Server.Implementations/Library/LibraryManager.cs
  40. 5 0
      Emby.Server.Implementations/Library/MediaSourceManager.cs
  41. 1 1
      Emby.Server.Implementations/Library/ResolverHelper.cs
  42. 1 1
      Emby.Server.Implementations/Library/Resolvers/ItemResolver.cs
  43. 2 0
      Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs
  44. 1 0
      Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
  45. 1 0
      Emby.Server.Implementations/Library/SearchEngine.cs
  46. 2 2
      Emby.Server.Implementations/Library/UserDataManager.cs
  47. 118 0
      Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
  48. 1 0
      Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs
  49. 12 0
      Emby.Server.Implementations/LiveTv/LiveTvManager.cs
  50. 1 1
      Emby.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs
  51. 19 0
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
  52. 3 0
      Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
  53. 16 3
      Emby.Server.Implementations/Localization/Core/bn.json
  54. 1 1
      Emby.Server.Implementations/Networking/NetworkManager.cs
  55. 1 0
      Emby.Server.Implementations/Playlists/PlaylistManager.cs
  56. 14 9
      Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
  57. 4 4
      Emby.Server.Implementations/ScheduledTasks/TaskManager.cs
  58. 4 4
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
  59. 1 1
      Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodeFileTask.cs
  60. 2 2
      Emby.Server.Implementations/ScheduledTasks/Triggers/DailyTrigger.cs
  61. 3 3
      Emby.Server.Implementations/ScheduledTasks/Triggers/IntervalTrigger.cs
  62. 2 2
      Emby.Server.Implementations/ScheduledTasks/Triggers/StartupTrigger.cs
  63. 4 4
      Emby.Server.Implementations/ScheduledTasks/Triggers/WeeklyTrigger.cs
  64. 1 1
      Emby.Server.Implementations/Services/ServiceHandler.cs
  65. 1 0
      Emby.Server.Implementations/Services/ServiceMethod.cs
  66. 3 0
      Emby.Server.Implementations/Services/ServicePath.cs
  67. 2 0
      Emby.Server.Implementations/Services/StringMapTypeDeserializer.cs
  68. 34 0
      Emby.Server.Implementations/Services/SwaggerService.cs
  69. 1 1
      Emby.Server.Implementations/Services/UrlExtensions.cs
  70. 1 1
      Emby.Server.Implementations/Session/SessionManager.cs
  71. 4 3
      Emby.Server.Implementations/Session/SessionWebSocketListener.cs
  72. 1 1
      Emby.Server.Implementations/Sorting/AlbumArtistComparer.cs
  73. 1 1
      Emby.Server.Implementations/Sorting/AlbumComparer.cs
  74. 1 1
      Emby.Server.Implementations/Sorting/CriticRatingComparer.cs
  75. 1 1
      Emby.Server.Implementations/Sorting/DateCreatedComparer.cs
  76. 1 1
      Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
  77. 1 1
      Emby.Server.Implementations/Sorting/NameComparer.cs
  78. 1 1
      Emby.Server.Implementations/Sorting/PlayCountComparer.cs
  79. 2 1
      Emby.Server.Implementations/Sorting/PremiereDateComparer.cs
  80. 1 1
      Emby.Server.Implementations/Sorting/ProductionYearComparer.cs
  81. 1 1
      Emby.Server.Implementations/Sorting/RandomComparer.cs
  82. 1 1
      Emby.Server.Implementations/Sorting/RuntimeComparer.cs
  83. 1 1
      Emby.Server.Implementations/Sorting/SortNameComparer.cs
  84. 1 0
      Emby.Server.Implementations/TV/TVSeriesManager.cs
  85. 1 1
      Emby.Server.Implementations/Udp/UdpServer.cs
  86. 10 7
      Jellyfin.Data/Entities/Artwork.cs
  87. 1 1
      Jellyfin.Data/Entities/Book.cs
  88. 3 2
      Jellyfin.Data/Entities/BookMetadata.cs
  89. 15 10
      Jellyfin.Data/Entities/Chapter.cs
  90. 7 5
      Jellyfin.Data/Entities/Collection.cs
  91. 6 5
      Jellyfin.Data/Entities/CollectionItem.cs
  92. 5 4
      Jellyfin.Data/Entities/Company.cs
  93. 9 5
      Jellyfin.Data/Entities/CompanyMetadata.cs
  94. 1 1
      Jellyfin.Data/Entities/CustomItem.cs
  95. 1 1
      Jellyfin.Data/Entities/CustomItemMetadata.cs
  96. 3 2
      Jellyfin.Data/Entities/Episode.cs
  97. 7 4
      Jellyfin.Data/Entities/EpisodeMetadata.cs
  98. 7 5
      Jellyfin.Data/Entities/Genre.cs
  99. 7 5
      Jellyfin.Data/Entities/Library.cs
  100. 11 8
      Jellyfin.Data/Entities/LibraryItem.cs

+ 1 - 0
DvdLib/Ifo/Cell.cs

@@ -7,6 +7,7 @@ namespace DvdLib.Ifo
     public class Cell
     {
         public CellPlaybackInfo PlaybackInfo { get; private set; }
+
         public CellPositionInfo PositionInfo { get; private set; }
 
         internal void ParsePlayback(BinaryReader br)

+ 2 - 0
DvdLib/Ifo/Chapter.cs

@@ -5,7 +5,9 @@ namespace DvdLib.Ifo
     public class Chapter
     {
         public ushort ProgramChainNumber { get; private set; }
+
         public ushort ProgramNumber { get; private set; }
+
         public uint ChapterNumber { get; private set; }
 
         public Chapter(ushort pgcNum, ushort programNum, uint chapterNum)

+ 4 - 0
DvdLib/Ifo/ProgramChain.cs

@@ -22,7 +22,9 @@ namespace DvdLib.Ifo
         public readonly List<Cell> Cells;
 
         public DvdTime PlaybackTime { get; private set; }
+
         public UserOperation ProhibitedUserOperations { get; private set; }
+
         public byte[] AudioStreamControl { get; private set; } // 8*2 entries
         public byte[] SubpictureStreamControl { get; private set; } // 32*4 entries
 
@@ -33,9 +35,11 @@ namespace DvdLib.Ifo
         private ushort _goupProgramNumber;
 
         public ProgramPlaybackMode PlaybackMode { get; private set; }
+
         public uint ProgramCount { get; private set; }
 
         public byte StillTime { get; private set; }
+
         public byte[] Palette { get; private set; } // 16*4 entries
 
         private ushort _commandTableOffset;

+ 4 - 0
DvdLib/Ifo/Title.cs

@@ -8,8 +8,11 @@ namespace DvdLib.Ifo
     public class Title
     {
         public uint TitleNumber { get; private set; }
+
         public uint AngleCount { get; private set; }
+
         public ushort ChapterCount { get; private set; }
+
         public byte VideoTitleSetNumber { get; private set; }
 
         private ushort _parentalManagementMask;
@@ -17,6 +20,7 @@ namespace DvdLib.Ifo
         private uint _vtsStartSector; // relative to start of entire disk
 
         public ProgramChain EntryProgramChain { get; private set; }
+
         public readonly List<ProgramChain> ProgramChains;
 
         public readonly List<Chapter> Chapters;

+ 1 - 0
Emby.Dlna/ContentDirectory/ControlHandler.cs

@@ -1357,6 +1357,7 @@ namespace Emby.Dlna.ContentDirectory
     internal class ServerItem
     {
         public BaseItem Item { get; set; }
+
         public StubType? StubType { get; set; }
 
         public ServerItem(BaseItem item)

+ 4 - 1
Emby.Dlna/Didl/DidlBuilder.cs

@@ -705,7 +705,7 @@ namespace Emby.Dlna.Didl
         }
 
         /// <summary>
-        /// Adds fields used by both items and folders
+        /// Adds fields used by both items and folders.
         /// </summary>
         private void AddCommonFields(BaseItem item, StubType? itemStubType, BaseItem context, XmlWriter writer, Filter filter)
         {
@@ -765,6 +765,7 @@ namespace Emby.Dlna.Didl
                 {
                     AddValue(writer, "dc", "rating", item.OfficialRating, NS_DC);
                 }
+
                 if (filter.Contains("upnp:rating"))
                 {
                     AddValue(writer, "upnp", "rating", item.OfficialRating, NS_UPNP);
@@ -1052,10 +1053,12 @@ namespace Emby.Dlna.Didl
             {
                 return GetImageInfo(item, ImageType.Primary);
             }
+
             if (item.HasImage(ImageType.Thumb))
             {
                 return GetImageInfo(item, ImageType.Thumb);
             }
+
             if (item.HasImage(ImageType.Backdrop))
             {
                 if (item is Channel)

+ 4 - 1
Emby.Dlna/DlnaManager.cs

@@ -438,6 +438,7 @@ namespace Emby.Dlna
             {
                 throw new ArgumentException("Profile is missing Id");
             }
+
             if (string.IsNullOrEmpty(profile.Name))
             {
                 throw new ArgumentException("Profile is missing Name");
@@ -463,6 +464,7 @@ namespace Emby.Dlna
             {
                 _profiles[path] = new Tuple<InternalProfileInfo, DeviceProfile>(GetInternalProfileInfo(_fileSystem.GetFileInfo(path), type), profile);
             }
+
             SerializeToXml(profile, path);
         }
 
@@ -473,7 +475,7 @@ namespace Emby.Dlna
 
         /// <summary>
         /// Recreates the object using serialization, to ensure it's not a subclass.
-        /// If it's a subclass it may not serlialize properly to xml (different root element tag name)
+        /// If it's a subclass it may not serlialize properly to xml (different root element tag name).
         /// </summary>
         /// <param name="profile"></param>
         /// <returns></returns>
@@ -492,6 +494,7 @@ namespace Emby.Dlna
         class InternalProfileInfo
         {
             internal DeviceProfileInfo Info { get; set; }
+
             internal string Path { get; set; }
         }
 

+ 18 - 9
Emby.Dlna/Eventing/EventManager.cs

@@ -31,18 +31,26 @@ namespace Emby.Dlna.Eventing
         public EventSubscriptionResponse RenewEventSubscription(string subscriptionId, string notificationType, string requestedTimeoutString, string callbackUrl)
         {
             var subscription = GetSubscription(subscriptionId, false);
+            if (subscription != null)
+            {
+                subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300;
+                int timeoutSeconds = subscription.TimeoutSeconds;
+                subscription.SubscriptionTime = DateTime.UtcNow;
 
-            subscription.TimeoutSeconds = ParseTimeout(requestedTimeoutString) ?? 300;
-            int timeoutSeconds = subscription.TimeoutSeconds;
-            subscription.SubscriptionTime = DateTime.UtcNow;
+                _logger.LogDebug(
+                    "Renewing event subscription for {0} with timeout of {1} to {2}",
+                    subscription.NotificationType,
+                    timeoutSeconds,
+                    subscription.CallbackUrl);
 
-            _logger.LogDebug(
-                "Renewing event subscription for {0} with timeout of {1} to {2}",
-                subscription.NotificationType,
-                timeoutSeconds,
-                subscription.CallbackUrl);
+                return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, timeoutSeconds);
+            }
 
-            return GetEventSubscriptionResponse(subscriptionId, requestedTimeoutString, timeoutSeconds);
+            return new EventSubscriptionResponse
+            {
+                Content = string.Empty,
+                ContentType = "text/plain"
+            };
         }
 
         public EventSubscriptionResponse CreateEventSubscription(string notificationType, string requestedTimeoutString, string callbackUrl)
@@ -150,6 +158,7 @@ namespace Emby.Dlna.Eventing
                 builder.Append("</" + key + ">");
                 builder.Append("</e:property>");
             }
+
             builder.Append("</e:propertyset>");
 
             var options = new HttpRequestOptions

+ 3 - 0
Emby.Dlna/Eventing/EventSubscription.cs

@@ -7,10 +7,13 @@ namespace Emby.Dlna.Eventing
     public class EventSubscription
     {
         public string Id { get; set; }
+
         public string CallbackUrl { get; set; }
+
         public string NotificationType { get; set; }
 
         public DateTime SubscriptionTime { get; set; }
+
         public int TimeoutSeconds { get; set; }
 
         public long TriggerCount { get; set; }

+ 2 - 0
Emby.Dlna/Main/DlnaEntryPoint.cs

@@ -320,6 +320,7 @@ namespace Emby.Dlna.Main
             {
                 guid = text.GetMD5();
             }
+
             return guid.ToString("N", CultureInfo.InvariantCulture);
         }
 
@@ -388,6 +389,7 @@ namespace Emby.Dlna.Main
                     {
                         _logger.LogError(ex, "Error disposing PlayTo manager");
                     }
+
                     _manager = null;
                 }
             }

+ 3 - 1
Emby.Dlna/PlayTo/Device.cs

@@ -37,6 +37,7 @@ namespace Emby.Dlna.PlayTo
                 RefreshVolumeIfNeeded().GetAwaiter().GetResult();
                 return _volume;
             }
+
             set => _volume = value;
         }
 
@@ -232,7 +233,7 @@ namespace Emby.Dlna.PlayTo
         }
 
         /// <summary>
-        /// Sets volume on a scale of 0-100
+        /// Sets volume on a scale of 0-100.
         /// </summary>
         public async Task SetVolume(int value, CancellationToken cancellationToken)
         {
@@ -494,6 +495,7 @@ namespace Emby.Dlna.PlayTo
                         return;
                     }
                 }
+
                 RestartTimerInactive();
             }
         }

+ 5 - 0
Emby.Dlna/PlayTo/PlayToController.cs

@@ -425,6 +425,7 @@ namespace Emby.Dlna.PlayTo
                     await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl, CancellationToken.None).ConfigureAwait(false);
                     return;
                 }
+
                 await SeekAfterTransportChange(newPosition, CancellationToken.None).ConfigureAwait(false);
             }
         }
@@ -713,6 +714,7 @@ namespace Emby.Dlna.PlayTo
 
                             throw new ArgumentException("Volume argument cannot be null");
                         }
+
                     default:
                         return Task.CompletedTask;
                 }
@@ -798,12 +800,15 @@ namespace Emby.Dlna.PlayTo
             public int? SubtitleStreamIndex { get; set; }
 
             public string DeviceProfileId { get; set; }
+
             public string DeviceId { get; set; }
 
             public string MediaSourceId { get; set; }
+
             public string LiveStreamId { get; set; }
 
             public BaseItem Item { get; set; }
+
             private MediaSourceInfo MediaSource;
 
             private IMediaSourceManager _mediaSourceManager;

+ 1 - 0
Emby.Dlna/PlayTo/PlayToManager.cs

@@ -132,6 +132,7 @@ namespace Emby.Dlna.PlayTo
                 usn = usn.Substring(index);
                 found = true;
             }
+
             index = usn.IndexOf("::", StringComparison.OrdinalIgnoreCase);
             if (index != -1)
             {

+ 1 - 0
Emby.Dlna/PlayTo/PlaybackStoppedEventArgs.cs

@@ -12,6 +12,7 @@ namespace Emby.Dlna.PlayTo
     public class MediaChangedEventArgs : EventArgs
     {
         public uBaseObject OldMediaInfo { get; set; }
+
         public uBaseObject NewMediaInfo { get; set; }
     }
 }

+ 2 - 0
Emby.Dlna/PlayTo/uBaseObject.cs

@@ -44,10 +44,12 @@ namespace Emby.Dlna.PlayTo
                 {
                     return MediaBrowser.Model.Entities.MediaType.Audio;
                 }
+
                 if (classType.IndexOf(MediaBrowser.Model.Entities.MediaType.Video, StringComparison.Ordinal) != -1)
                 {
                     return MediaBrowser.Model.Entities.MediaType.Video;
                 }
+
                 if (classType.IndexOf("image", StringComparison.Ordinal) != -1)
                 {
                     return MediaBrowser.Model.Entities.MediaType.Photo;

+ 5 - 0
Emby.Dlna/Server/DescriptionXmlBuilder.cs

@@ -134,6 +134,7 @@ namespace Emby.Dlna.Server
                     return result;
                 }
             }
+
             return c.ToString(CultureInfo.InvariantCulture);
         }
 
@@ -157,18 +158,22 @@ namespace Emby.Dlna.Server
                 {
                     break;
                 }
+
                 if (stringBuilder == null)
                 {
                     stringBuilder = new StringBuilder();
                 }
+
                 stringBuilder.Append(str, num, num2 - num);
                 stringBuilder.Append(GetEscapeSequence(str[num2]));
                 num = num2 + 1;
             }
+
             if (stringBuilder == null)
             {
                 return str;
             }
+
             stringBuilder.Append(str, num, length - num);
             return stringBuilder.ToString();
         }

+ 4 - 0
Emby.Dlna/Service/BaseControlHandler.cs

@@ -18,6 +18,7 @@ namespace Emby.Dlna.Service
         private const string NS_SOAPENV = "http://schemas.xmlsoap.org/soap/envelope/";
 
         protected IServerConfigurationManager Config { get; }
+
         protected ILogger Logger { get; }
 
         protected BaseControlHandler(IServerConfigurationManager config, ILogger logger)
@@ -135,6 +136,7 @@ namespace Emby.Dlna.Service
 
                                 break;
                             }
+
                         default:
                             {
                                 await reader.SkipAsync().ConfigureAwait(false);
@@ -211,7 +213,9 @@ namespace Emby.Dlna.Service
         private class ControlRequestInfo
         {
             public string LocalName { get; set; }
+
             public string NamespaceURI { get; set; }
+
             public Dictionary<string, string> Headers { get; } = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
         }
 

+ 1 - 0
Emby.Dlna/Service/ServiceXmlBuilder.cs

@@ -80,6 +80,7 @@ namespace Emby.Dlna.Service
                     {
                         builder.Append("<allowedValue>" + DescriptionXmlBuilder.Escape(allowedValue) + "</allowedValue>");
                     }
+
                     builder.Append("</allowedValueList>");
                 }
 

+ 1 - 0
Emby.Naming/AudioBook/AudioBookFilePathParser.cs

@@ -64,6 +64,7 @@ namespace Emby.Naming.AudioBook
                 {
                     result.ChapterNumber = int.Parse(matches[0].Groups[0].Value);
                 }
+
                 if (matches.Count > 1)
                 {
                     result.PartNumber = int.Parse(matches[matches.Count - 1].Groups[0].Value);

+ 3 - 3
Emby.Naming/Common/MediaType.cs

@@ -5,17 +5,17 @@ namespace Emby.Naming.Common
     public enum MediaType
     {
         /// <summary>
-        /// The audio
+        /// The audio.
         /// </summary>
         Audio = 0,
 
         /// <summary>
-        /// The photo
+        /// The photo.
         /// </summary>
         Photo = 1,
 
         /// <summary>
-        /// The video
+        /// The video.
         /// </summary>
         Video = 2
     }

+ 1 - 1
Emby.Server.Implementations/ApplicationHost.cs

@@ -956,7 +956,7 @@ namespace Emby.Server.Implementations
         }
 
         /// <summary>
-        /// Notifies that the kernel that a change has been made that requires a restart
+        /// Notifies that the kernel that a change has been made that requires a restart.
         /// </summary>
         public void NotifyPendingRestart()
         {

+ 2 - 2
Emby.Server.Implementations/Data/BaseSqliteRepository.cs

@@ -247,12 +247,12 @@ namespace Emby.Server.Implementations.Data
     public enum SynchronousMode
     {
         /// <summary>
-        /// SQLite continues without syncing as soon as it has handed data off to the operating system
+        /// SQLite continues without syncing as soon as it has handed data off to the operating system.
         /// </summary>
         Off = 0,
 
         /// <summary>
-        /// SQLite database engine will still sync at the most critical moments
+        /// SQLite database engine will still sync at the most critical moments.
         /// </summary>
         Normal = 1,
 

+ 3 - 3
Emby.Server.Implementations/Data/SqliteDisplayPreferencesRepository.cs

@@ -59,7 +59,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Opens the connection to the database
+        /// Opens the connection to the database.
         /// </summary>
         /// <returns>Task.</returns>
         private void InitializeInternal()
@@ -77,7 +77,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Save the display preferences associated with an item in the repo
+        /// Save the display preferences associated with an item in the repo.
         /// </summary>
         /// <param name="displayPreferences">The display preferences.</param>
         /// <param name="userId">The user id.</param>
@@ -122,7 +122,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Save all display preferences associated with a user in the repo
+        /// Save all display preferences associated with a user in the repo.
         /// </summary>
         /// <param name="displayPreferences">The display preferences.</param>
         /// <param name="userId">The user id.</param>

+ 120 - 5
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -102,7 +102,7 @@ namespace Emby.Server.Implementations.Data
         protected override TempStoreMode TempStore => TempStoreMode.Memory;
 
         /// <summary>
-        /// Opens the connection to the database
+        /// Opens the connection to the database.
         /// </summary>
         public void Initialize(SqliteUserDataRepository userDataRepo, IUserManager userManager)
         {
@@ -548,7 +548,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Save a standard item in the repo
+        /// Save a standard item in the repo.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
@@ -793,6 +793,7 @@ namespace Emby.Server.Implementations.Data
             {
                 saveItemStatement.TryBindNull("@Width");
             }
+
             if (item.Height > 0)
             {
                 saveItemStatement.TryBind("@Height", item.Height);
@@ -932,6 +933,7 @@ namespace Emby.Server.Implementations.Data
             {
                 saveItemStatement.TryBindNull("@SeriesName");
             }
+
             if (string.IsNullOrWhiteSpace(userDataKey))
             {
                 saveItemStatement.TryBindNull("@UserDataKey");
@@ -1007,6 +1009,7 @@ namespace Emby.Server.Implementations.Data
             {
                 artists = string.Join("|", hasArtists.Artists);
             }
+
             saveItemStatement.TryBind("@Artists", artists);
 
             string albumArtists = null;
@@ -1106,6 +1109,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     continue;
                 }
+
                 str.Append(ToValueString(i) + "|");
             }
 
@@ -1204,7 +1208,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Internal retrieve from items or users table
+        /// Internal retrieve from items or users table.
         /// </summary>
         /// <param name="id">The id.</param>
         /// <returns>BaseItem.</returns>
@@ -1366,6 +1370,7 @@ namespace Emby.Server.Implementations.Data
                         hasStartDate.StartDate = reader[index].ReadDateTime();
                     }
                 }
+
                 index++;
             }
 
@@ -1373,12 +1378,14 @@ namespace Emby.Server.Implementations.Data
             {
                 item.EndDate = reader[index].TryReadDateTime();
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.ChannelId = new Guid(reader.GetString(index));
             }
+
             index++;
 
             if (enableProgramAttributes)
@@ -1389,24 +1396,28 @@ namespace Emby.Server.Implementations.Data
                     {
                         hasProgramAttributes.IsMovie = reader.GetBoolean(index);
                     }
+
                     index++;
 
                     if (!reader.IsDBNull(index))
                     {
                         hasProgramAttributes.IsSeries = reader.GetBoolean(index);
                     }
+
                     index++;
 
                     if (!reader.IsDBNull(index))
                     {
                         hasProgramAttributes.EpisodeTitle = reader.GetString(index);
                     }
+
                     index++;
 
                     if (!reader.IsDBNull(index))
                     {
                         hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
                     }
+
                     index++;
                 }
                 else
@@ -1419,6 +1430,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.CommunityRating = reader.GetFloat(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.CustomRating))
@@ -1427,6 +1439,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.CustomRating = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1434,6 +1447,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.IndexNumber = reader.GetInt32(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.Settings))
@@ -1442,18 +1456,21 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.IsLocked = reader.GetBoolean(index);
                 }
+
                 index++;
 
                 if (!reader.IsDBNull(index))
                 {
                     item.PreferredMetadataLanguage = reader.GetString(index);
                 }
+
                 index++;
 
                 if (!reader.IsDBNull(index))
                 {
                     item.PreferredMetadataCountryCode = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1463,6 +1480,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Width = reader.GetInt32(index);
                 }
+
                 index++;
             }
 
@@ -1472,6 +1490,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Height = reader.GetInt32(index);
                 }
+
                 index++;
             }
 
@@ -1481,6 +1500,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.DateLastRefreshed = reader[index].ReadDateTime();
                 }
+
                 index++;
             }
 
@@ -1488,18 +1508,21 @@ namespace Emby.Server.Implementations.Data
             {
                 item.Name = reader.GetString(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.Path = RestorePath(reader.GetString(index));
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.PremiereDate = reader[index].TryReadDateTime();
             }
+
             index++;
 
             if (HasField(query, ItemFields.Overview))
@@ -1508,6 +1531,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Overview = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1515,18 +1539,21 @@ namespace Emby.Server.Implementations.Data
             {
                 item.ParentIndexNumber = reader.GetInt32(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.ProductionYear = reader.GetInt32(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.OfficialRating = reader.GetString(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.SortName))
@@ -1535,6 +1562,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.ForcedSortName = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1542,12 +1570,14 @@ namespace Emby.Server.Implementations.Data
             {
                 item.RunTimeTicks = reader.GetInt64(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.Size = reader.GetInt64(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.DateCreated))
@@ -1556,6 +1586,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.DateCreated = reader[index].ReadDateTime();
                 }
+
                 index++;
             }
 
@@ -1563,6 +1594,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.DateModified = reader[index].ReadDateTime();
             }
+
             index++;
 
             item.Id = reader.GetGuid(index);
@@ -1574,6 +1606,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Genres = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                 }
+
                 index++;
             }
 
@@ -1581,6 +1614,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.ParentId = reader.GetGuid(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
@@ -1590,6 +1624,7 @@ namespace Emby.Server.Implementations.Data
                     item.Audio = audio;
                 }
             }
+
             index++;
 
             // TODO: Even if not needed by apps, the server needs it internally
@@ -1603,6 +1638,7 @@ namespace Emby.Server.Implementations.Data
                         liveTvChannel.ServiceName = reader.GetString(index);
                     }
                 }
+
                 index++;
             }
 
@@ -1610,6 +1646,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.IsInMixedFolder = reader.GetBoolean(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.DateLastSaved))
@@ -1618,6 +1655,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.DateLastSaved = reader[index].ReadDateTime();
                 }
+
                 index++;
             }
 
@@ -1635,8 +1673,10 @@ namespace Emby.Server.Implementations.Data
                             }
                         }
                     }
+
                     item.LockedFields = GetLockedFields(reader.GetString(index)).ToArray();
                 }
+
                 index++;
             }
 
@@ -1646,6 +1686,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Studios = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                 }
+
                 index++;
             }
 
@@ -1655,6 +1696,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Tags = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                 }
+
                 index++;
             }
 
@@ -1674,9 +1716,11 @@ namespace Emby.Server.Implementations.Data
                                 }
                             }
                         }
+
                         trailer.TrailerTypes = GetTrailerTypes(reader.GetString(index)).ToArray();
                     }
                 }
+
                 index++;
             }
 
@@ -1686,6 +1730,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.OriginalTitle = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1696,6 +1741,7 @@ namespace Emby.Server.Implementations.Data
                     video.PrimaryVersionId = reader.GetString(index);
                 }
             }
+
             index++;
 
             if (HasField(query, ItemFields.DateLastMediaAdded))
@@ -1704,6 +1750,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     folder.DateLastMediaAdded = reader[index].TryReadDateTime();
                 }
+
                 index++;
             }
 
@@ -1711,18 +1758,21 @@ namespace Emby.Server.Implementations.Data
             {
                 item.Album = reader.GetString(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.CriticRating = reader.GetFloat(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
             {
                 item.IsVirtualItem = reader.GetBoolean(index);
             }
+
             index++;
 
             if (item is IHasSeries hasSeriesName)
@@ -1732,6 +1782,7 @@ namespace Emby.Server.Implementations.Data
                     hasSeriesName.SeriesName = reader.GetString(index);
                 }
             }
+
             index++;
 
             if (hasEpisodeAttributes)
@@ -1742,6 +1793,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         episode.SeasonName = reader.GetString(index);
                     }
+
                     index++;
                     if (!reader.IsDBNull(index))
                     {
@@ -1752,6 +1804,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     index++;
                 }
+
                 index++;
             }
 
@@ -1765,6 +1818,7 @@ namespace Emby.Server.Implementations.Data
                         hasSeries.SeriesId = reader.GetGuid(index);
                     }
                 }
+
                 index++;
             }
 
@@ -1774,6 +1828,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.PresentationUniqueKey = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1783,6 +1838,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.InheritedParentalRatingValue = reader.GetInt32(index);
                 }
+
                 index++;
             }
 
@@ -1792,6 +1848,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.ExternalSeriesId = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1801,6 +1858,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.Tagline = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1808,6 +1866,7 @@ namespace Emby.Server.Implementations.Data
             {
                 DeserializeProviderIds(reader.GetString(index), item);
             }
+
             index++;
 
             if (query.DtoOptions.EnableImages)
@@ -1816,6 +1875,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     DeserializeImages(reader.GetString(index), item);
                 }
+
                 index++;
             }
 
@@ -1825,6 +1885,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.ProductionLocations = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
                 }
+
                 index++;
             }
 
@@ -1834,6 +1895,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     item.ExtraIds = SplitToGuids(reader.GetString(index));
                 }
+
                 index++;
             }
 
@@ -1841,6 +1903,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.TotalBitrate = reader.GetInt32(index);
             }
+
             index++;
 
             if (!reader.IsDBNull(index))
@@ -1850,6 +1913,7 @@ namespace Emby.Server.Implementations.Data
                     item.ExtraType = extraType;
                 }
             }
+
             index++;
 
             if (hasArtistFields)
@@ -1858,12 +1922,14 @@ namespace Emby.Server.Implementations.Data
                 {
                     hasArtists.Artists = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                 }
+
                 index++;
 
                 if (item is IHasAlbumArtist hasAlbumArtists && !reader.IsDBNull(index))
                 {
                     hasAlbumArtists.AlbumArtists = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
                 }
+
                 index++;
             }
 
@@ -1871,6 +1937,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.ExternalId = reader.GetString(index);
             }
+
             index++;
 
             if (HasField(query, ItemFields.SeriesPresentationUniqueKey))
@@ -1882,6 +1949,7 @@ namespace Emby.Server.Implementations.Data
                         hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
                     }
                 }
+
                 index++;
             }
 
@@ -1891,6 +1959,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     program.ShowId = reader.GetString(index);
                 }
+
                 index++;
             }
 
@@ -1898,6 +1967,7 @@ namespace Emby.Server.Implementations.Data
             {
                 item.OwnerId = reader.GetGuid(index);
             }
+
             index++;
 
             return item;
@@ -1918,7 +1988,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Gets chapters for an item
+        /// Gets chapters for an item.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <returns>IEnumerable{ChapterInfo}.</returns>
@@ -1946,7 +2016,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Gets a single chapter for an item
+        /// Gets a single chapter for an item.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="index">The index.</param>
@@ -2473,6 +2543,7 @@ namespace Emby.Server.Implementations.Data
             {
                 statement.TryBind("@SearchTermStartsWith", searchTerm + "%");
             }
+
             if (commandText.IndexOf("@SearchTermContains", StringComparison.OrdinalIgnoreCase) != -1)
             {
                 statement.TryBind("@SearchTermContains", "%" + searchTerm + "%");
@@ -2743,6 +2814,7 @@ namespace Emby.Server.Implementations.Data
                         {
                             items[i] = newItem;
                         }
+
                         return;
                     }
                 }
@@ -2835,6 +2907,7 @@ namespace Emby.Server.Implementations.Data
             {
                 statementTexts.Add(commandText);
             }
+
             if (query.EnableTotalRecordCount)
             {
                 commandText = string.Empty;
@@ -3239,6 +3312,7 @@ namespace Emby.Server.Implementations.Data
             {
                 statementTexts.Add(commandText);
             }
+
             if (query.EnableTotalRecordCount)
             {
                 commandText = string.Empty;
@@ -3592,11 +3666,13 @@ namespace Emby.Server.Implementations.Data
                 whereClauses.Add("IndexNumber=@IndexNumber");
                 statement?.TryBind("@IndexNumber", query.IndexNumber.Value);
             }
+
             if (query.ParentIndexNumber.HasValue)
             {
                 whereClauses.Add("ParentIndexNumber=@ParentIndexNumber");
                 statement?.TryBind("@ParentIndexNumber", query.ParentIndexNumber.Value);
             }
+
             if (query.ParentIndexNumberNotEquals.HasValue)
             {
                 whereClauses.Add("(ParentIndexNumber<>@ParentIndexNumberNotEquals or ParentIndexNumber is null)");
@@ -3882,6 +3958,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, artistId.ToByteArray());
                     }
+
                     index++;
                 }
 
@@ -3902,6 +3979,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, artistId.ToByteArray());
                     }
+
                     index++;
                 }
 
@@ -3922,8 +4000,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, artistId.ToByteArray());
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -3941,8 +4021,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, albumId.ToByteArray());
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -3960,8 +4042,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, artistId.ToByteArray());
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -3979,8 +4063,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, genreId.ToByteArray());
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -3996,8 +4082,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@Genre" + index, GetCleanValue(item));
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -4013,8 +4101,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@Tag" + index, GetCleanValue(item));
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -4030,8 +4120,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@ExcludeTag" + index, GetCleanValue(item));
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -4050,8 +4142,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, studioId.ToByteArray());
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -4067,8 +4161,10 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@OfficialRating" + index, item);
                     }
+
                     index++;
                 }
+
                 var clause = "(" + string.Join(" OR ", clauses) + ")";
                 whereClauses.Add(clause);
             }
@@ -4243,6 +4339,7 @@ namespace Emby.Server.Implementations.Data
                     statement.TryBind("@IsVirtualItem", isVirtualItem.Value);
                 }
             }
+
             if (query.IsSpecialSeason.HasValue)
             {
                 if (query.IsSpecialSeason.Value)
@@ -4254,6 +4351,7 @@ namespace Emby.Server.Implementations.Data
                     whereClauses.Add("IndexNumber <> 0");
                 }
             }
+
             if (query.IsUnaired.HasValue)
             {
                 if (query.IsUnaired.Value)
@@ -4265,6 +4363,7 @@ namespace Emby.Server.Implementations.Data
                     whereClauses.Add("PremiereDate < DATETIME('now')");
                 }
             }
+
             var queryMediaTypes = query.MediaTypes.Where(IsValidMediaType).ToArray();
             if (queryMediaTypes.Length == 1)
             {
@@ -4280,6 +4379,7 @@ namespace Emby.Server.Implementations.Data
 
                 whereClauses.Add("MediaType in (" + val + ")");
             }
+
             if (query.ItemIds.Length > 0)
             {
                 var includeIds = new List<string>();
@@ -4292,11 +4392,13 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@IncludeId" + index, id);
                     }
+
                     index++;
                 }
 
                 whereClauses.Add("(" + string.Join(" OR ", includeIds) + ")");
             }
+
             if (query.ExcludeItemIds.Length > 0)
             {
                 var excludeIds = new List<string>();
@@ -4309,6 +4411,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind("@ExcludeId" + index, id);
                     }
+
                     index++;
                 }
 
@@ -4333,6 +4436,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, "%" + pair.Key + "=" + pair.Value + "%");
                     }
+
                     index++;
 
                     break;
@@ -4375,6 +4479,7 @@ namespace Emby.Server.Implementations.Data
                     {
                         statement.TryBind(paramName, "%" + pair.Key + "=" + pair.Value + "%");
                     }
+
                     index++;
 
                     break;
@@ -4425,6 +4530,7 @@ namespace Emby.Server.Implementations.Data
                 {
                     whereClauses.Add("(TopParentId=@TopParentId)");
                 }
+
                 if (statement != null)
                 {
                     statement.TryBind("@TopParentId", queryTopParentIds[0].ToString("N", CultureInfo.InvariantCulture));
@@ -4462,11 +4568,13 @@ namespace Emby.Server.Implementations.Data
                     statement.TryBind("@AncestorId", query.AncestorIds[0]);
                 }
             }
+
             if (query.AncestorIds.Length > 1)
             {
                 var inClause = string.Join(",", query.AncestorIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
                 whereClauses.Add(string.Format("Guid in (select itemId from AncestorIds where AncestorIdText in ({0}))", inClause));
             }
+
             if (!string.IsNullOrWhiteSpace(query.AncestorWithPresentationUniqueKey))
             {
                 var inClause = "select guid from TypedBaseItems where PresentationUniqueKey=@AncestorWithPresentationUniqueKey";
@@ -4495,6 +4603,7 @@ namespace Emby.Server.Implementations.Data
                     statement.TryBind("@UnratedType", query.BlockUnratedItems[0].ToString());
                 }
             }
+
             if (query.BlockUnratedItems.Length > 1)
             {
                 var inClause = string.Join(",", query.BlockUnratedItems.Select(i => "'" + i.ToString() + "'"));
@@ -4969,6 +5078,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                     statement.TryBind("@ItemId", query.ItemId.ToByteArray());
                 }
             }
+
             if (!query.AppearsInItemId.Equals(Guid.Empty))
             {
                 whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)");
@@ -4977,6 +5087,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                     statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToByteArray());
                 }
             }
+
             var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList();
 
             if (queryPersonTypes.Count == 1)
@@ -4993,6 +5104,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
                 whereClauses.Add("PersonType in (" + val + ")");
             }
+
             var queryExcludePersonTypes = query.ExcludePersonTypes.Where(IsValidPersonType).ToList();
 
             if (queryExcludePersonTypes.Count == 1)
@@ -5009,6 +5121,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
 
                 whereClauses.Add("PersonType not in (" + val + ")");
             }
+
             if (query.MaxListOrder.HasValue)
             {
                 whereClauses.Add("ListOrder<=@MaxListOrder");
@@ -5017,6 +5130,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                     statement.TryBind("@MaxListOrder", query.MaxListOrder.Value);
                 }
             }
+
             if (!string.IsNullOrWhiteSpace(query.NameContains))
             {
                 whereClauses.Add("Name like @NameContains");
@@ -5156,6 +5270,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
                 var typeString = string.Join(",", withItemTypes.Select(i => "'" + i + "'"));
                 commandText += " AND ItemId In (select guid from typedbaseitems where type in (" + typeString + "))";
             }
+
             if (excludeItemTypes.Count > 0)
             {
                 var typeString = string.Join(",", excludeItemTypes.Select(i => "'" + i + "'"));

+ 6 - 3
Emby.Server.Implementations/Data/SqliteUserDataRepository.cs

@@ -135,10 +135,12 @@ namespace Emby.Server.Implementations.Data
             {
                 throw new ArgumentNullException(nameof(userData));
             }
+
             if (internalUserId <= 0)
             {
                 throw new ArgumentNullException(nameof(internalUserId));
             }
+
             if (string.IsNullOrEmpty(key))
             {
                 throw new ArgumentNullException(nameof(key));
@@ -153,6 +155,7 @@ namespace Emby.Server.Implementations.Data
             {
                 throw new ArgumentNullException(nameof(userData));
             }
+
             if (internalUserId <= 0)
             {
                 throw new ArgumentNullException(nameof(internalUserId));
@@ -235,7 +238,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Persist all user data for the specified user
+        /// Persist all user data for the specified user.
         /// </summary>
         private void PersistAllUserData(long internalUserId, UserItemData[] userDataList, CancellationToken cancellationToken)
         {
@@ -309,7 +312,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Return all user-data associated with the given user
+        /// Return all user-data associated with the given user.
         /// </summary>
         /// <param name="internalUserId"></param>
         /// <returns></returns>
@@ -339,7 +342,7 @@ namespace Emby.Server.Implementations.Data
         }
 
         /// <summary>
-        /// Read a row from the specified reader into the provided userData object
+        /// Read a row from the specified reader into the provided userData object.
         /// </summary>
         /// <param name="reader"></param>
         private UserItemData ReadRow(IReadOnlyList<IResultSetValue> reader)

+ 1 - 0
Emby.Server.Implementations/Devices/DeviceManager.cs

@@ -169,6 +169,7 @@ namespace Emby.Server.Implementations.Devices
             {
                 throw new ArgumentException("user not found");
             }
+
             if (string.IsNullOrEmpty(deviceId))
             {
                 throw new ArgumentNullException(nameof(deviceId));

+ 15 - 4
Emby.Server.Implementations/Dto/DtoService.cs

@@ -74,7 +74,7 @@ namespace Emby.Server.Implementations.Dto
         }
 
         /// <summary>
-        /// Converts a BaseItem to a DTOBaseItem
+        /// Converts a BaseItem to a DTOBaseItem.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="fields">The fields.</param>
@@ -277,6 +277,7 @@ namespace Emby.Server.Implementations.Dto
                     dto.EpisodeTitle = dto.Name;
                     dto.Name = dto.SeriesName;
                 }
+
                 liveTvManager.AddInfoToRecordingDto(item, dto, activeRecording, user);
             }
 
@@ -292,6 +293,7 @@ namespace Emby.Server.Implementations.Dto
                 {
                     continue;
                 }
+
                 var containers = container.Split(new[] { ',' });
                 if (containers.Length < 2)
                 {
@@ -442,7 +444,7 @@ namespace Emby.Server.Implementations.Dto
         }
 
         /// <summary>
-        /// Gets client-side Id of a server-side BaseItem
+        /// Gets client-side Id of a server-side BaseItem.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <returns>System.String.</returns>
@@ -456,6 +458,7 @@ namespace Emby.Server.Implementations.Dto
         {
             dto.SeriesName = item.SeriesName;
         }
+
         private static void SetPhotoProperties(BaseItemDto dto, Photo item)
         {
             dto.CameraMake = item.CameraMake;
@@ -537,7 +540,7 @@ namespace Emby.Server.Implementations.Dto
         }
 
         /// <summary>
-        /// Attaches People DTO's to a DTOBaseItem
+        /// Attaches People DTO's to a DTOBaseItem.
         /// </summary>
         /// <param name="dto">The dto.</param>
         /// <param name="item">The item.</param>
@@ -554,22 +557,27 @@ namespace Emby.Server.Implementations.Dto
                     {
                         return 0;
                     }
+
                     if (i.IsType(PersonType.GuestStar))
                     {
                         return 1;
                     }
+
                     if (i.IsType(PersonType.Director))
                     {
                         return 2;
                     }
+
                     if (i.IsType(PersonType.Writer))
                     {
                         return 3;
                     }
+
                     if (i.IsType(PersonType.Producer))
                     {
                         return 4;
                     }
+
                     if (i.IsType(PersonType.Composer))
                     {
                         return 4;
@@ -725,7 +733,7 @@ namespace Emby.Server.Implementations.Dto
         }
 
         /// <summary>
-        /// Sets simple property values on a DTOBaseItem
+        /// Sets simple property values on a DTOBaseItem.
         /// </summary>
         /// <param name="dto">The dto.</param>
         /// <param name="item">The item.</param>
@@ -1346,6 +1354,7 @@ namespace Emby.Server.Implementations.Dto
                         dto.ParentLogoImageTag = GetTagAndFillBlurhash(dto, parent, image);
                     }
                 }
+
                 if (artLimit > 0 && !(imageTags != null && imageTags.ContainsKey(ImageType.Art)) && dto.ParentArtItemId == null)
                 {
                     var image = allImages.FirstOrDefault(i => i.Type == ImageType.Art);
@@ -1356,6 +1365,7 @@ namespace Emby.Server.Implementations.Dto
                         dto.ParentArtImageTag = GetTagAndFillBlurhash(dto, parent, image);
                     }
                 }
+
                 if (thumbLimit > 0 && !(imageTags != null && imageTags.ContainsKey(ImageType.Thumb)) && (dto.ParentThumbItemId == null || parent is Series) && !(parent is ICollectionFolder) && !(parent is UserView))
                 {
                     var image = allImages.FirstOrDefault(i => i.Type == ImageType.Thumb);
@@ -1366,6 +1376,7 @@ namespace Emby.Server.Implementations.Dto
                         dto.ParentThumbImageTag = GetTagAndFillBlurhash(dto, parent, image);
                     }
                 }
+
                 if (backdropLimit > 0 && !((dto.BackdropImageTags != null && dto.BackdropImageTags.Length > 0) || (dto.ParentBackdropImageTags != null && dto.ParentBackdropImageTags.Length > 0)))
                 {
                     var images = allImages.Where(i => i.Type == ImageType.Backdrop).Take(backdropLimit).ToList();

+ 1 - 1
Emby.Server.Implementations/HttpClientManager/HttpClientManager.cs

@@ -140,7 +140,7 @@ namespace Emby.Server.Implementations.HttpClientManager
             => SendAsync(options, HttpMethod.Get);
 
         /// <summary>
-        /// Performs a GET request and returns the resulting stream
+        /// Performs a GET request and returns the resulting stream.
         /// </summary>
         /// <param name="options">The options.</param>
         /// <returns>Task{Stream}.</returns>

+ 2 - 2
Emby.Server.Implementations/HttpServer/FileWriter.cs

@@ -32,12 +32,12 @@ namespace Emby.Server.Implementations.HttpServer
         private readonly IFileSystem _fileSystem;
 
         /// <summary>
-        /// The _options
+        /// The _options.
         /// </summary>
         private readonly IDictionary<string, string> _options = new Dictionary<string, string>();
 
         /// <summary>
-        /// The _requested ranges
+        /// The _requested ranges.
         /// </summary>
         private List<KeyValuePair<long, long?>> _requestedRanges;
 

+ 2 - 1
Emby.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -453,6 +453,7 @@ namespace Emby.Server.Implementations.HttpServer
                     {
                         httpRes.Headers.Add(key, value);
                     }
+
                     httpRes.ContentType = "text/plain";
                     await httpRes.WriteAsync(string.Empty, cancellationToken).ConfigureAwait(false);
                     return;
@@ -591,7 +592,7 @@ namespace Emby.Server.Implementations.HttpServer
         }
 
         /// <summary>
-        /// Get the default CORS headers
+        /// Get the default CORS headers.
         /// </summary>
         /// <param name="req"></param>
         /// <returns></returns>

+ 1 - 1
Emby.Server.Implementations/HttpServer/HttpResultFactory.cs

@@ -692,7 +692,7 @@ namespace Emby.Server.Implementations.HttpServer
 
 
         /// <summary>
-        /// When the browser sends the IfModifiedDate, it's precision is limited to seconds, so this will account for that
+        /// When the browser sends the IfModifiedDate, it's precision is limited to seconds, so this will account for that.
         /// </summary>
         /// <param name="date">The date.</param>
         /// <returns>DateTime.</returns>

+ 11 - 4
Emby.Server.Implementations/HttpServer/RangeRequestWriter.cs

@@ -20,31 +20,37 @@ namespace Emby.Server.Implementations.HttpServer
         /// </summary>
         /// <value>The source stream.</value>
         private Stream SourceStream { get; set; }
+
         private string RangeHeader { get; set; }
+
         private bool IsHeadRequest { get; set; }
 
         private long RangeStart { get; set; }
+
         private long RangeEnd { get; set; }
+
         private long RangeLength { get; set; }
+
         private long TotalContentLength { get; set; }
 
         public Action OnComplete { get; set; }
+
         private readonly ILogger _logger;
 
         private const int BufferSize = 81920;
 
         /// <summary>
-        /// The _options
+        /// The _options.
         /// </summary>
         private readonly Dictionary<string, string> _options = new Dictionary<string, string>();
 
         /// <summary>
-        /// The us culture
+        /// The us culture.
         /// </summary>
         private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
 
         /// <summary>
-        /// Additional HTTP Headers
+        /// Additional HTTP Headers.
         /// </summary>
         /// <value>The headers.</value>
         public IDictionary<string, string> Headers => _options;
@@ -110,7 +116,7 @@ namespace Emby.Server.Implementations.HttpServer
         }
 
         /// <summary>
-        /// The _requested ranges
+        /// The _requested ranges.
         /// </summary>
         private List<KeyValuePair<long, long?>> _requestedRanges;
         /// <summary>
@@ -139,6 +145,7 @@ namespace Emby.Server.Implementations.HttpServer
                         {
                             start = long.Parse(vals[0], UsCulture);
                         }
+
                         if (!string.IsNullOrEmpty(vals[1]))
                         {
                             end = long.Parse(vals[1], UsCulture);

+ 1 - 0
Emby.Server.Implementations/HttpServer/Security/AuthService.cs

@@ -140,6 +140,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
             {
                 return true;
             }
+
             if (authAttribtues.AllowLocalOnly && request.IsLocal)
             {
                 return true;

+ 2 - 0
Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

@@ -71,6 +71,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
             {
                 token = httpReq.Headers["X-MediaBrowser-Token"];
             }
+
             if (string.IsNullOrEmpty(token))
             {
                 token = httpReq.QueryString["api_key"];
@@ -160,6 +161,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
                         _authRepo.Update(tokenInfo);
                     }
                 }
+
                 httpReq.Items["OriginalAuthenticationInfo"] = tokenInfo;
             }
 

+ 2 - 0
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -628,6 +628,7 @@ namespace Emby.Server.Implementations.IO
                     {
                         return false;
                     }
+
                     return extensions.Contains(ext, StringComparer.OrdinalIgnoreCase);
                 });
             }
@@ -682,6 +683,7 @@ namespace Emby.Server.Implementations.IO
                     {
                         return false;
                     }
+
                     return extensions.Contains(ext, StringComparer.OrdinalIgnoreCase);
                 });
             }

+ 1 - 1
Emby.Server.Implementations/Library/CoreResolutionIgnoreRule.cs

@@ -8,7 +8,7 @@ using MediaBrowser.Model.IO;
 namespace Emby.Server.Implementations.Library
 {
     /// <summary>
-    /// Provides the core resolver ignore rules
+    /// Provides the core resolver ignore rules.
     /// </summary>
     public class CoreResolutionIgnoreRule : IResolverIgnoreRule
     {

+ 2 - 0
Emby.Server.Implementations/Library/ExclusiveLiveStream.cs

@@ -12,11 +12,13 @@ namespace Emby.Server.Implementations.Library
     public class ExclusiveLiveStream : ILiveStream
     {
         public int ConsumerCount { get; set; }
+
         public string OriginalStreamId { get; set; }
 
         public string TunerHostId => null;
 
         public bool EnableStreamSharing { get; set; }
+
         public MediaSourceInfo MediaSource { get; set; }
 
         public string UniqueId { get; private set; }

+ 3 - 3
Emby.Server.Implementations/Library/IgnorePatterns.cs

@@ -4,12 +4,12 @@ using DotNet.Globbing;
 namespace Emby.Server.Implementations.Library
 {
     /// <summary>
-    /// Glob patterns for files to ignore
+    /// Glob patterns for files to ignore.
     /// </summary>
     public static class IgnorePatterns
     {
         /// <summary>
-        /// Files matching these glob patterns will be ignored
+        /// Files matching these glob patterns will be ignored.
         /// </summary>
         public static readonly string[] Patterns = new string[]
         {
@@ -64,7 +64,7 @@ namespace Emby.Server.Implementations.Library
         private static readonly Glob[] _globs = Patterns.Select(p => Glob.Parse(p, _globOptions)).ToArray();
 
         /// <summary>
-        /// Returns true if the supplied path should be ignored
+        /// Returns true if the supplied path should be ignored.
         /// </summary>
         public static bool ShouldIgnore(string path)
         {

+ 9 - 7
Emby.Server.Implementations/Library/LibraryManager.cs

@@ -97,13 +97,13 @@ namespace Emby.Server.Implementations.Library
         private IIntroProvider[] IntroProviders { get; set; }
 
         /// <summary>
-        /// Gets or sets the list of entity resolution ignore rules
+        /// Gets or sets the list of entity resolution ignore rules.
         /// </summary>
         /// <value>The entity resolution ignore rules.</value>
         private IResolverIgnoreRule[] EntityResolutionIgnoreRules { get; set; }
 
         /// <summary>
-        /// Gets or sets the list of currently registered entity resolvers
+        /// Gets or sets the list of currently registered entity resolvers.
         /// </summary>
         /// <value>The entity resolvers enumerable.</value>
         private IItemResolver[] EntityResolvers { get; set; }
@@ -209,12 +209,12 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// The _root folder
+        /// The _root folder.
         /// </summary>
         private volatile AggregateFolder _rootFolder;
 
         /// <summary>
-        /// The _root folder sync lock
+        /// The _root folder sync lock.
         /// </summary>
         private readonly object _rootFolderSyncLock = new object();
 
@@ -627,7 +627,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Determines whether a path should be ignored based on its contents - called after the contents have been read
+        /// Determines whether a path should be ignored based on its contents - called after the contents have been read.
         /// </summary>
         /// <param name="args">The args.</param>
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
@@ -909,7 +909,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Gets a Genre
+        /// Gets a Genre.
         /// </summary>
         /// <param name="name">The name.</param>
         /// <returns>Task{Genre}.</returns>
@@ -990,7 +990,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Reloads the root media folder
+        /// Reloads the root media folder.
         /// </summary>
         /// <param name="progress">The progress.</param>
         /// <param name="cancellationToken">The cancellation token.</param>
@@ -2784,10 +2784,12 @@ namespace Emby.Server.Implementations.Library
             {
                 throw new ArgumentNullException(nameof(path));
             }
+
             if (string.IsNullOrWhiteSpace(from))
             {
                 throw new ArgumentNullException(nameof(from));
             }
+
             if (string.IsNullOrWhiteSpace(to))
             {
                 throw new ArgumentNullException(nameof(to));

+ 5 - 0
Emby.Server.Implementations/Library/MediaSourceManager.cs

@@ -205,22 +205,27 @@ namespace Emby.Server.Implementations.Library
             {
                 return MediaProtocol.Rtsp;
             }
+
             if (path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
             {
                 return MediaProtocol.Rtmp;
             }
+
             if (path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
             {
                 return MediaProtocol.Http;
             }
+
             if (path.StartsWith("rtp", StringComparison.OrdinalIgnoreCase))
             {
                 return MediaProtocol.Rtp;
             }
+
             if (path.StartsWith("ftp", StringComparison.OrdinalIgnoreCase))
             {
                 return MediaProtocol.Ftp;
             }
+
             if (path.StartsWith("udp", StringComparison.OrdinalIgnoreCase))
             {
                 return MediaProtocol.Udp;

+ 1 - 1
Emby.Server.Implementations/Library/ResolverHelper.cs

@@ -107,7 +107,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Ensures DateCreated and DateModified have values
+        /// Ensures DateCreated and DateModified have values.
         /// </summary>
         /// <param name="fileSystem">The file system.</param>
         /// <param name="item">The item.</param>

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/ItemResolver.cs

@@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
         public virtual ResolverPriority Priority => ResolverPriority.First;
 
         /// <summary>
-        /// Sets initial values on the newly resolved item
+        /// Sets initial values on the newly resolved item.
         /// </summary>
         /// <param name="item">The item.</param>
         /// <param name="args">The args.</param>

+ 2 - 0
Emby.Server.Implementations/Library/Resolvers/SpecialFolderResolver.cs

@@ -41,10 +41,12 @@ namespace Emby.Server.Implementations.Library.Resolvers
                 {
                     return new AggregateFolder();
                 }
+
                 if (string.Equals(args.Path, _appPaths.DefaultUserViewsPath, StringComparison.OrdinalIgnoreCase))
                 {
                     return new UserRootFolder();  // if we got here and still a root - must be user root
                 }
+
                 if (args.IsVf)
                 {
                     return new CollectionFolder

+ 1 - 0
Emby.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs

@@ -55,6 +55,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
                         episode.SeriesId = series.Id;
                         episode.SeriesName = series.Name;
                     }
+
                     if (season != null)
                     {
                         episode.SeasonId = season.Id;

+ 1 - 0
Emby.Server.Implementations/Library/SearchEngine.cs

@@ -194,6 +194,7 @@ namespace Emby.Server.Implementations.Library
                 {
                     searchQuery.AncestorIds = new[] { searchQuery.ParentId };
                 }
+
                 searchQuery.ParentId = Guid.Empty;
                 searchQuery.IncludeItemsByName = true;
                 searchQuery.IncludeItemTypes = Array.Empty<string>();

+ 2 - 2
Emby.Server.Implementations/Library/UserDataManager.cs

@@ -103,7 +103,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Retrieve all user data for the given user
+        /// Retrieve all user data for the given user.
         /// </summary>
         /// <param name="userId"></param>
         /// <returns></returns>
@@ -188,7 +188,7 @@ namespace Emby.Server.Implementations.Library
         }
 
         /// <summary>
-        /// Converts a UserItemData to a DTOUserItemData
+        /// Converts a UserItemData to a DTOUserItemData.
         /// </summary>
         /// <param name="data">The data.</param>
         /// <returns>DtoUserItemData.</returns>

+ 118 - 0
Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs

@@ -212,6 +212,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             {
                 channelNumber = map.channel;
             }
+
             if (string.IsNullOrWhiteSpace(channelNumber))
             {
                 channelNumber = map.atscMajor + "." + map.atscMinor;
@@ -400,6 +401,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             {
                 date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
             }
+
             return date;
         }
 
@@ -622,6 +624,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
                         _lastErrorResponse = DateTime.UtcNow;
                     }
                 }
+
                 throw;
             }
             finally
@@ -805,11 +808,13 @@ namespace Emby.Server.Implementations.LiveTv.Listings
                 {
                     throw new ArgumentException("Username is required");
                 }
+
                 if (string.IsNullOrEmpty(info.Password))
                 {
                     throw new ArgumentException("Password is required");
                 }
             }
+
             if (validateListings)
             {
                 if (string.IsNullOrEmpty(info.ListingsId))
@@ -932,24 +937,35 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class Token
             {
                 public int code { get; set; }
+
                 public string message { get; set; }
+
                 public string serverID { get; set; }
+
                 public string token { get; set; }
             }
+
             public class Lineup
             {
                 public string lineup { get; set; }
+
                 public string name { get; set; }
+
                 public string transport { get; set; }
+
                 public string location { get; set; }
+
                 public string uri { get; set; }
             }
 
             public class Lineups
             {
                 public int code { get; set; }
+
                 public string serverID { get; set; }
+
                 public string datetime { get; set; }
+
                 public List<Lineup> lineups { get; set; }
             }
 
@@ -957,8 +973,11 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class Headends
             {
                 public string headend { get; set; }
+
                 public string transport { get; set; }
+
                 public string location { get; set; }
+
                 public List<Lineup> lineups { get; set; }
             }
 
@@ -967,59 +986,83 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class Map
             {
                 public string stationID { get; set; }
+
                 public string channel { get; set; }
+
                 public string logicalChannelNumber { get; set; }
+
                 public int uhfVhf { get; set; }
+
                 public int atscMajor { get; set; }
+
                 public int atscMinor { get; set; }
             }
 
             public class Broadcaster
             {
                 public string city { get; set; }
+
                 public string state { get; set; }
+
                 public string postalcode { get; set; }
+
                 public string country { get; set; }
             }
 
             public class Logo
             {
                 public string URL { get; set; }
+
                 public int height { get; set; }
+
                 public int width { get; set; }
+
                 public string md5 { get; set; }
             }
 
             public class Station
             {
                 public string stationID { get; set; }
+
                 public string name { get; set; }
+
                 public string callsign { get; set; }
+
                 public List<string> broadcastLanguage { get; set; }
+
                 public List<string> descriptionLanguage { get; set; }
+
                 public Broadcaster broadcaster { get; set; }
+
                 public string affiliate { get; set; }
+
                 public Logo logo { get; set; }
+
                 public bool? isCommercialFree { get; set; }
             }
 
             public class Metadata
             {
                 public string lineup { get; set; }
+
                 public string modified { get; set; }
+
                 public string transport { get; set; }
             }
 
             public class Channel
             {
                 public List<Map> map { get; set; }
+
                 public List<Station> stations { get; set; }
+
                 public Metadata metadata { get; set; }
             }
 
             public class RequestScheduleForChannel
             {
                 public string stationID { get; set; }
+
                 public List<string> date { get; set; }
             }
 
@@ -1029,29 +1072,43 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class Rating
             {
                 public string body { get; set; }
+
                 public string code { get; set; }
             }
 
             public class Multipart
             {
                 public int partNumber { get; set; }
+
                 public int totalParts { get; set; }
             }
 
             public class Program
             {
                 public string programID { get; set; }
+
                 public string airDateTime { get; set; }
+
                 public int duration { get; set; }
+
                 public string md5 { get; set; }
+
                 public List<string> audioProperties { get; set; }
+
                 public List<string> videoProperties { get; set; }
+
                 public List<Rating> ratings { get; set; }
+
                 public bool? @new { get; set; }
+
                 public Multipart multipart { get; set; }
+
                 public string liveTapeDelay { get; set; }
+
                 public bool premiere { get; set; }
+
                 public bool repeat { get; set; }
+
                 public string isPremiereOrFinale { get; set; }
             }
 
@@ -1060,16 +1117,22 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class MetadataSchedule
             {
                 public string modified { get; set; }
+
                 public string md5 { get; set; }
+
                 public string startDate { get; set; }
+
                 public string endDate { get; set; }
+
                 public int days { get; set; }
             }
 
             public class Day
             {
                 public string stationID { get; set; }
+
                 public List<Program> programs { get; set; }
+
                 public MetadataSchedule metadata { get; set; }
 
                 public Day()
@@ -1092,24 +1155,28 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class Description100
             {
                 public string descriptionLanguage { get; set; }
+
                 public string description { get; set; }
             }
 
             public class Description1000
             {
                 public string descriptionLanguage { get; set; }
+
                 public string description { get; set; }
             }
 
             public class DescriptionsProgram
             {
                 public List<Description100> description100 { get; set; }
+
                 public List<Description1000> description1000 { get; set; }
             }
 
             public class Gracenote
             {
                 public int season { get; set; }
+
                 public int episode { get; set; }
             }
 
@@ -1121,101 +1188,152 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             public class ContentRating
             {
                 public string body { get; set; }
+
                 public string code { get; set; }
             }
 
             public class Cast
             {
                 public string billingOrder { get; set; }
+
                 public string role { get; set; }
+
                 public string nameId { get; set; }
+
                 public string personId { get; set; }
+
                 public string name { get; set; }
+
                 public string characterName { get; set; }
             }
 
             public class Crew
             {
                 public string billingOrder { get; set; }
+
                 public string role { get; set; }
+
                 public string nameId { get; set; }
+
                 public string personId { get; set; }
+
                 public string name { get; set; }
             }
 
             public class QualityRating
             {
                 public string ratingsBody { get; set; }
+
                 public string rating { get; set; }
+
                 public string minRating { get; set; }
+
                 public string maxRating { get; set; }
+
                 public string increment { get; set; }
             }
 
             public class Movie
             {
                 public string year { get; set; }
+
                 public int duration { get; set; }
+
                 public List<QualityRating> qualityRating { get; set; }
             }
 
             public class Recommendation
             {
                 public string programID { get; set; }
+
                 public string title120 { get; set; }
             }
 
             public class ProgramDetails
             {
                 public string audience { get; set; }
+
                 public string programID { get; set; }
+
                 public List<Title> titles { get; set; }
+
                 public EventDetails eventDetails { get; set; }
+
                 public DescriptionsProgram descriptions { get; set; }
+
                 public string originalAirDate { get; set; }
+
                 public List<string> genres { get; set; }
+
                 public string episodeTitle150 { get; set; }
+
                 public List<MetadataPrograms> metadata { get; set; }
+
                 public List<ContentRating> contentRating { get; set; }
+
                 public List<Cast> cast { get; set; }
+
                 public List<Crew> crew { get; set; }
+
                 public string entityType { get; set; }
+
                 public string showType { get; set; }
+
                 public bool hasImageArtwork { get; set; }
+
                 public string primaryImage { get; set; }
+
                 public string thumbImage { get; set; }
+
                 public string backdropImage { get; set; }
+
                 public string bannerImage { get; set; }
+
                 public string imageID { get; set; }
+
                 public string md5 { get; set; }
+
                 public List<string> contentAdvisory { get; set; }
+
                 public Movie movie { get; set; }
+
                 public List<Recommendation> recommendations { get; set; }
             }
 
             public class Caption
             {
                 public string content { get; set; }
+
                 public string lang { get; set; }
             }
 
             public class ImageData
             {
                 public string width { get; set; }
+
                 public string height { get; set; }
+
                 public string uri { get; set; }
+
                 public string size { get; set; }
+
                 public string aspect { get; set; }
+
                 public string category { get; set; }
+
                 public string text { get; set; }
+
                 public string primary { get; set; }
+
                 public string tier { get; set; }
+
                 public Caption caption { get; set; }
             }
 
             public class ShowImages
             {
                 public string programID { get; set; }
+
                 public List<ImageData> data { get; set; }
             }
         }

+ 1 - 0
Emby.Server.Implementations/LiveTv/Listings/XmlTvListingsProvider.cs

@@ -224,6 +224,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
                 {
                     uniqueString = "-" + programInfo.SeasonNumber.Value.ToString(CultureInfo.InvariantCulture);
                 }
+
                 if (programInfo.EpisodeNumber.HasValue)
                 {
                     uniqueString = "-" + programInfo.EpisodeNumber.Value.ToString(CultureInfo.InvariantCulture);

+ 12 - 0
Emby.Server.Implementations/LiveTv/LiveTvManager.cs

@@ -556,6 +556,7 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 forceUpdate = true;
             }
+
             item.ParentId = channel.Id;
 
             // item.ChannelType = channelType;
@@ -575,6 +576,7 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 forceUpdate = true;
             }
+
             item.ExternalSeriesId = seriesId;
 
             var isSeries = info.IsSeries || !string.IsNullOrEmpty(info.EpisodeTitle);
@@ -589,30 +591,37 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 tags.Add("Live");
             }
+
             if (info.IsPremiere)
             {
                 tags.Add("Premiere");
             }
+
             if (info.IsNews)
             {
                 tags.Add("News");
             }
+
             if (info.IsSports)
             {
                 tags.Add("Sports");
             }
+
             if (info.IsKids)
             {
                 tags.Add("Kids");
             }
+
             if (info.IsRepeat)
             {
                 tags.Add("Repeat");
             }
+
             if (info.IsMovie)
             {
                 tags.Add("Movie");
             }
+
             if (isSeries)
             {
                 tags.Add("Series");
@@ -635,6 +644,7 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 forceUpdate = true;
             }
+
             item.IsSeries = isSeries;
 
             item.Name = info.Name;
@@ -652,12 +662,14 @@ namespace Emby.Server.Implementations.LiveTv
             {
                 forceUpdate = true;
             }
+
             item.StartDate = info.StartDate;
 
             if (item.EndDate != info.EndDate)
             {
                 forceUpdate = true;
             }
+
             item.EndDate = info.EndDate;
 
             item.ProductionYear = info.ProductionYear;

+ 1 - 1
Emby.Server.Implementations/LiveTv/RefreshChannelsScheduledTask.cs

@@ -35,7 +35,7 @@ namespace Emby.Server.Implementations.LiveTv
         }
 
         /// <summary>
-        /// Creates the triggers that define when the task will run
+        /// Creates the triggers that define when the task will run.
         /// </summary>
         /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()

+ 19 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -170,6 +170,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
                             _modelCache[cacheKey] = response;
                         }
                     }
+
                     return response;
                 }
 
@@ -201,6 +202,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
                         var name = line.Substring(0, index - 1);
                         var currentChannel = line.Substring(index + 7);
                         if (currentChannel != "none") { status = LiveTvTunerStatus.LiveTv; } else { status = LiveTvTunerStatus.Available; }
+
                         tuners.Add(new LiveTvTunerInfo
                         {
                             Name = name,
@@ -229,11 +231,13 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
                     inside = true;
                     continue;
                 }
+
                 if (let == '>')
                 {
                     inside = false;
                     continue;
                 }
+
                 if (!inside)
                 {
                     buffer[bufferIndex] = let;
@@ -331,12 +335,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
         private class Channels
         {
             public string GuideNumber { get; set; }
+
             public string GuideName { get; set; }
+
             public string VideoCodec { get; set; }
+
             public string AudioCodec { get; set; }
+
             public string URL { get; set; }
+
             public bool Favorite { get; set; }
+
             public bool DRM { get; set; }
+
             public int HD { get; set; }
         }
 
@@ -657,13 +668,21 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
         public class DiscoverResponse
         {
             public string FriendlyName { get; set; }
+
             public string ModelNumber { get; set; }
+
             public string FirmwareName { get; set; }
+
             public string FirmwareVersion { get; set; }
+
             public string DeviceID { get; set; }
+
             public string DeviceAuth { get; set; }
+
             public string BaseURL { get; set; }
+
             public string LineupURL { get; set; }
+
             public int TunerCount { get; set; }
 
             public bool SupportsTranscoding

+ 3 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs

@@ -58,12 +58,15 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
         protected virtual int EmptyReadLimit => 1000;
 
         public MediaSourceInfo OriginalMediaSource { get; set; }
+
         public MediaSourceInfo MediaSource { get; set; }
 
         public int ConsumerCount { get; set; }
 
         public string OriginalStreamId { get; set; }
+
         public bool EnableStreamSharing { get; set; }
+
         public string UniqueId { get; }
 
         public string TunerHostId { get; }

+ 16 - 3
Emby.Server.Implementations/Localization/Core/bn.json

@@ -62,13 +62,13 @@
     "NotificationOptionPluginInstalled": "প্লাগিন ইন্সটল করা হয়েছে",
     "NotificationOptionPluginError": "প্লাগিন ব্যর্থ",
     "NotificationOptionNewLibraryContent": "নতুন কন্টেন্ট যোগ করা হয়েছে",
-    "NotificationOptionInstallationFailed": "ইন্সটল ব্যর্থ",
+    "NotificationOptionInstallationFailed": "ইন্সটল ব্যর্থ হয়েছে",
     "NotificationOptionCameraImageUploaded": "ক্যামেরার ছবি আপলোড হয়েছে",
     "NotificationOptionAudioPlaybackStopped": "গান বাজা বন্ধ হয়েছে",
     "NotificationOptionAudioPlayback": "গান বাজা শুরু হয়েছে",
     "NotificationOptionApplicationUpdateInstalled": "এপ্লিকেশনের আপডেট ইনস্টল করা হয়েছে",
     "NotificationOptionApplicationUpdateAvailable": "এপ্লিকেশনের আপডেট রয়েছে",
-    "NewVersionIsAvailable": "জেলিফিন সার্ভারের একটি নতুন ভার্শন ডাউনলোডের জন্য তৈরী",
+    "NewVersionIsAvailable": "জেলিফিন সার্ভারের একটি নতুন ভার্শন ডাউনলোডের জন্য তৈরী",
     "NameSeasonUnknown": "সিজন অজানা",
     "NameSeasonNumber": "সিজন {0}",
     "NameInstallFailed": "{0} ইন্সটল ব্যর্থ",
@@ -100,5 +100,18 @@
     "TaskCleanCacheDescription": "সিস্টেমে আর প্রয়োজন নেই ক্যাশ, ফাইলগুলি মুছে ফেলুন।",
     "TaskCleanCache": "ক্লিন ক্যাশ ডিরেক্টরি",
     "TasksChannelsCategory": "ইন্টারনেট চ্যানেল",
-    "TasksApplicationCategory": "আবেদন"
+    "TasksApplicationCategory": "আবেদন",
+    "TaskDownloadMissingSubtitlesDescription": "মেটাডেটা কনফিগারেশনের উপর ভিত্তি করে অনুপস্থিত সাবটাইটেলগুলির জন্য ইন্টারনেট অনুসন্ধান করে।",
+    "TaskDownloadMissingSubtitles": "অনুপস্থিত সাবটাইটেলগুলি ডাউনলোড করুন",
+    "TaskRefreshChannelsDescription": "ইন্টারনেট চ্যানেল তথ্য রিফ্রেশ করুন।",
+    "TaskRefreshChannels": "চ্যানেল রিফ্রেশ করুন",
+    "TaskCleanTranscodeDescription": "এক দিনেরও বেশি পুরানো ট্রান্সকোড ফাইলগুলি মুছে ফেলুন।",
+    "TaskCleanTranscode": "ট্রান্সকোড ডিরেক্টরি ক্লিন করুন",
+    "TaskUpdatePluginsDescription": "স্বয়ংক্রিয়ভাবে আপডেট কনফিগার করা প্লাগইনগুলির জন্য আপডেট ডাউনলোড এবং ইনস্টল করুন।",
+    "TaskUpdatePlugins": "প্লাগইন আপডেট করুন",
+    "TaskRefreshPeopleDescription": "আপনার মিডিয়া লাইব্রেরিতে অভিনেতা এবং পরিচালকদের জন্য মেটাডাটা আপডেট করুন।",
+    "TaskRefreshPeople": "পিপল রিফ্রেশ করুন",
+    "TaskCleanLogsDescription": "{0} দিনের বেশী পুরানো লগ ফাইলগুলি মুছে ফেলুন।",
+    "TaskCleanLogs": "লগ ডিরেক্টরি ক্লিন করুন",
+    "TaskRefreshLibraryDescription": "নতুন ফাইলের জন্য মিডিয়া লাইব্রেরি স্ক্যান এবং মেটাডাটা রিফ্রেশ করুন।"
 }

+ 1 - 1
Emby.Server.Implementations/Networking/NetworkManager.cs

@@ -411,7 +411,7 @@ namespace Emby.Server.Implementations.Networking
         }
 
         /// <summary>
-        /// Gets a random port number that is currently available
+        /// Gets a random port number that is currently available.
         /// </summary>
         /// <returns>System.Int32.</returns>
         public int GetRandomUnusedTcpPort()

+ 1 - 0
Emby.Server.Implementations/Playlists/PlaylistManager.cs

@@ -401,6 +401,7 @@ namespace Emby.Server.Implementations.Playlists
                     {
                         entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value);
                     }
+
                     playlist.PlaylistEntries.Add(entry);
                 }
 

+ 14 - 9
Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs

@@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Class ScheduledTaskWorker
+    /// Class ScheduledTaskWorker.
     /// </summary>
     public class ScheduledTaskWorker : IScheduledTaskWorker
     {
@@ -111,11 +111,11 @@ namespace Emby.Server.Implementations.ScheduledTasks
 
         private bool _readFromFile = false;
         /// <summary>
-        /// The _last execution result
+        /// The _last execution result.
         /// </summary>
         private TaskResult _lastExecutionResult;
         /// <summary>
-        /// The _last execution result sync lock
+        /// The _last execution result sync lock.
         /// </summary>
         private readonly object _lastExecutionResultSyncLock = new object();
         /// <summary>
@@ -143,12 +143,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
                                 Logger.LogError(ex, "Error deserializing {File}", path);
                             }
                         }
+
                         _readFromFile = true;
                     }
                 }
 
                 return _lastExecutionResult;
             }
+
             private set
             {
                 _lastExecutionResult = value;
@@ -182,7 +184,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         public string Category => ScheduledTask.Category;
 
         /// <summary>
-        /// Gets the current cancellation token
+        /// Gets the current cancellation token.
         /// </summary>
         /// <value>The current cancellation token source.</value>
         private CancellationTokenSource CurrentCancellationTokenSource { get; set; }
@@ -261,6 +263,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
                 var triggers = InternalTriggers;
                 return triggers.Select(i => i.Item1).ToArray();
             }
+
             set
             {
                 if (value == null)
@@ -278,7 +281,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// The _id
+        /// The _id.
         /// </summary>
         private string _id;
 
@@ -358,7 +361,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         private Task _currentTask;
 
         /// <summary>
-        /// Executes the task
+        /// Executes the task.
         /// </summary>
         /// <param name="options">Task options.</param>
         /// <returns>Task.</returns>
@@ -453,7 +456,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stops the task if it is currently executing
+        /// Stops the task if it is currently executing.
         /// </summary>
         /// <exception cref="InvalidOperationException">Cannot cancel a Task unless it is in the Running state.</exception>
         public void Cancel()
@@ -640,6 +643,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
                         Logger.LogError(ex, "Error calling CancellationToken.Cancel();");
                     }
                 }
+
                 var task = _currentTask;
                 if (task != null)
                 {
@@ -675,6 +679,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
                         Logger.LogError(ex, "Error calling CancellationToken.Dispose();");
                     }
                 }
+
                 if (wassRunning)
                 {
                     OnTaskCompleted(startTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, null);
@@ -683,7 +688,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger
+        /// Converts a TaskTriggerInfo into a concrete BaseTaskTrigger.
         /// </summary>
         /// <param name="info">The info.</param>
         /// <returns>BaseTaskTrigger.</returns>
@@ -753,7 +758,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Disposes each trigger
+        /// Disposes each trigger.
         /// </summary>
         private void DisposeTriggers()
         {

+ 4 - 4
Emby.Server.Implementations/ScheduledTasks/TaskManager.cs

@@ -15,7 +15,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Class TaskManager
+    /// Class TaskManager.
     /// </summary>
     public class TaskManager : ITaskManager
     {
@@ -23,13 +23,13 @@ namespace Emby.Server.Implementations.ScheduledTasks
         public event EventHandler<TaskCompletionEventArgs> TaskCompleted;
 
         /// <summary>
-        /// Gets the list of Scheduled Tasks
+        /// Gets the list of Scheduled Tasks.
         /// </summary>
         /// <value>The scheduled tasks.</value>
         public IScheduledTaskWorker[] ScheduledTasks { get; private set; }
 
         /// <summary>
-        /// The _task queue
+        /// The _task queue.
         /// </summary>
         private readonly ConcurrentQueue<Tuple<Type, TaskOptions>> _taskQueue =
             new ConcurrentQueue<Tuple<Type, TaskOptions>>();
@@ -81,7 +81,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Cancels if running
+        /// Cancels if running.
         /// </summary>
         /// <typeparam name="T"></typeparam>
         public void CancelIfRunning<T>()

+ 4 - 4
Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteCacheFileTask.cs

@@ -13,7 +13,7 @@ using MediaBrowser.Model.Globalization;
 namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 {
     /// <summary>
-    /// Deletes old cache files
+    /// Deletes old cache files.
     /// </summary>
     public class DeleteCacheFileTask : IScheduledTask, IConfigurableScheduledTask
     {
@@ -44,7 +44,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
         }
 
         /// <summary>
-        /// Creates the triggers that define when the task will run
+        /// Creates the triggers that define when the task will run.
         /// </summary>
         /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
         public IEnumerable<TaskTriggerInfo> GetDefaultTriggers()
@@ -57,7 +57,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
         }
 
         /// <summary>
-        /// Returns the task to be executed
+        /// Returns the task to be executed.
         /// </summary>
         /// <param name="cancellationToken">The cancellation token.</param>
         /// <param name="progress">The progress.</param>
@@ -93,7 +93,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 
 
         /// <summary>
-        /// Deletes the cache files from directory with a last write time less than a given date
+        /// Deletes the cache files from directory with a last write time less than a given date.
         /// </summary>
         /// <param name="cancellationToken">The task cancellation token.</param>
         /// <param name="directory">The directory.</param>

+ 1 - 1
Emby.Server.Implementations/ScheduledTasks/Tasks/DeleteTranscodeFileTask.cs

@@ -13,7 +13,7 @@ using MediaBrowser.Model.Globalization;
 namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 {
     /// <summary>
-    /// Deletes all transcoding temp files
+    /// Deletes all transcoding temp files.
     /// </summary>
     public class DeleteTranscodeFileTask : IScheduledTask, IConfigurableScheduledTask
     {

+ 2 - 2
Emby.Server.Implementations/ScheduledTasks/Triggers/DailyTrigger.cs

@@ -28,7 +28,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         private Timer Timer { get; set; }
 
         /// <summary>
-        /// Stars waiting for the trigger action
+        /// Stars waiting for the trigger action.
         /// </summary>
         /// <param name="lastResult">The last result.</param>
         /// <param name="logger">The logger.</param>
@@ -51,7 +51,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stops waiting for the trigger action
+        /// Stops waiting for the trigger action.
         /// </summary>
         public void Stop()
         {

+ 3 - 3
Emby.Server.Implementations/ScheduledTasks/Triggers/IntervalTrigger.cs

@@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Represents a task trigger that runs repeatedly on an interval
+    /// Represents a task trigger that runs repeatedly on an interval.
     /// </summary>
     public class IntervalTrigger : ITaskTrigger
     {
@@ -31,7 +31,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         private DateTime _lastStartDate;
 
         /// <summary>
-        /// Stars waiting for the trigger action
+        /// Stars waiting for the trigger action.
         /// </summary>
         /// <param name="lastResult">The last result.</param>
         /// <param name="logger">The logger.</param>
@@ -70,7 +70,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stops waiting for the trigger action
+        /// Stops waiting for the trigger action.
         /// </summary>
         public void Stop()
         {

+ 2 - 2
Emby.Server.Implementations/ScheduledTasks/Triggers/StartupTrigger.cs

@@ -25,7 +25,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stars waiting for the trigger action
+        /// Stars waiting for the trigger action.
         /// </summary>
         /// <param name="lastResult">The last result.</param>
         /// <param name="logger">The logger.</param>
@@ -42,7 +42,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stops waiting for the trigger action
+        /// Stops waiting for the trigger action.
         /// </summary>
         public void Stop()
         {

+ 4 - 4
Emby.Server.Implementations/ScheduledTasks/Triggers/WeeklyTrigger.cs

@@ -6,12 +6,12 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.ScheduledTasks
 {
     /// <summary>
-    /// Represents a task trigger that fires on a weekly basis
+    /// Represents a task trigger that fires on a weekly basis.
     /// </summary>
     public class WeeklyTrigger : ITaskTrigger
     {
         /// <summary>
-        /// Get the time of day to trigger the task to run
+        /// Get the time of day to trigger the task to run.
         /// </summary>
         /// <value>The time of day.</value>
         public TimeSpan TimeOfDay { get; set; }
@@ -34,7 +34,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         private Timer Timer { get; set; }
 
         /// <summary>
-        /// Stars waiting for the trigger action
+        /// Stars waiting for the trigger action.
         /// </summary>
         /// <param name="lastResult">The last result.</param>
         /// <param name="logger">The logger.</param>
@@ -77,7 +77,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
         }
 
         /// <summary>
-        /// Stops waiting for the trigger action
+        /// Stops waiting for the trigger action.
         /// </summary>
         public void Stop()
         {

+ 1 - 1
Emby.Server.Implementations/Services/ServiceHandler.cs

@@ -180,7 +180,7 @@ namespace Emby.Server.Implementations.Services
             => string.Equals(method, expected, StringComparison.OrdinalIgnoreCase);
 
         /// <summary>
-        /// Duplicate params have their values joined together in a comma-delimited string
+        /// Duplicate params have their values joined together in a comma-delimited string.
         /// </summary>
         private static Dictionary<string, string> GetFlattenedRequestParams(HttpRequest request)
         {

+ 1 - 0
Emby.Server.Implementations/Services/ServiceMethod.cs

@@ -9,6 +9,7 @@ namespace Emby.Server.Implementations.Services
         public string Id { get; set; }
 
         public ActionInvokerFn ServiceAction { get; set; }
+
         public MediaBrowser.Model.Services.IHasRequestFilter[] RequestFilters { get; set; }
 
         public static string Key(Type serviceType, string method, string requestDtoName)

+ 3 - 0
Emby.Server.Implementations/Services/ServicePath.cs

@@ -62,7 +62,9 @@ namespace Emby.Server.Implementations.Services
         public string Path => this.restPath;
 
         public string Summary { get; private set; }
+
         public string Description { get; private set; }
+
         public bool IsHidden { get; private set; }
 
         public static string[] GetPathPartsForMatching(string pathInfo)
@@ -159,6 +161,7 @@ namespace Emby.Server.Implementations.Services
                         this.isWildcard[i] = true;
                         variableName = variableName.Substring(0, variableName.Length - 1);
                     }
+
                     this.variablesNames[i] = variableName;
                     this.VariableArgsCount++;
                 }

+ 2 - 0
Emby.Server.Implementations/Services/StringMapTypeDeserializer.cs

@@ -22,7 +22,9 @@ namespace Emby.Server.Implementations.Services
             }
 
             public Action<object, object> PropertySetFn { get; private set; }
+
             public Func<string, object> PropertyParseStringFn { get; private set; }
+
             public Type PropertyType { get; private set; }
         }
 

+ 34 - 0
Emby.Server.Implementations/Services/SwaggerService.cs

@@ -18,13 +18,21 @@ namespace Emby.Server.Implementations.Services
     public class SwaggerSpec
     {
         public string swagger { get; set; }
+
         public string[] schemes { get; set; }
+
         public SwaggerInfo info { get; set; }
+
         public string host { get; set; }
+
         public string basePath { get; set; }
+
         public SwaggerTag[] tags { get; set; }
+
         public IDictionary<string, Dictionary<string, SwaggerMethod>> paths { get; set; }
+
         public Dictionary<string, SwaggerDefinition> definitions { get; set; }
+
         public SwaggerComponents components { get; set; }
     }
 
@@ -36,15 +44,20 @@ namespace Emby.Server.Implementations.Services
     public class SwaggerSecurityScheme
     {
         public string name { get; set; }
+
         public string type { get; set; }
+
         public string @in { get; set; }
     }
 
     public class SwaggerInfo
     {
         public string description { get; set; }
+
         public string version { get; set; }
+
         public string title { get; set; }
+
         public string termsOfService { get; set; }
 
         public SwaggerConcactInfo contact { get; set; }
@@ -53,36 +66,52 @@ namespace Emby.Server.Implementations.Services
     public class SwaggerConcactInfo
     {
         public string email { get; set; }
+
         public string name { get; set; }
+
         public string url { get; set; }
     }
 
     public class SwaggerTag
     {
         public string description { get; set; }
+
         public string name { get; set; }
     }
 
     public class SwaggerMethod
     {
         public string summary { get; set; }
+
         public string description { get; set; }
+
         public string[] tags { get; set; }
+
         public string operationId { get; set; }
+
         public string[] consumes { get; set; }
+
         public string[] produces { get; set; }
+
         public SwaggerParam[] parameters { get; set; }
+
         public Dictionary<string, SwaggerResponse> responses { get; set; }
+
         public Dictionary<string, string[]>[] security { get; set; }
     }
 
     public class SwaggerParam
     {
         public string @in { get; set; }
+
         public string name { get; set; }
+
         public string description { get; set; }
+
         public bool required { get; set; }
+
         public string type { get; set; }
+
         public string collectionFormat { get; set; }
     }
 
@@ -97,15 +126,20 @@ namespace Emby.Server.Implementations.Services
     public class SwaggerDefinition
     {
         public string type { get; set; }
+
         public Dictionary<string, SwaggerProperty> properties { get; set; }
     }
 
     public class SwaggerProperty
     {
         public string type { get; set; }
+
         public string format { get; set; }
+
         public string description { get; set; }
+
         public string[] @enum { get; set; }
+
         public string @default { get; set; }
     }
 

+ 1 - 1
Emby.Server.Implementations/Services/UrlExtensions.cs

@@ -9,7 +9,7 @@ namespace Emby.Server.Implementations.Services
     /// Donated by Ivan Korneliuk from his post:
     /// http://korneliuk.blogspot.com/2012/08/servicestack-reusing-dtos.html
     ///
-    /// Modified to only allow using routes matching the supplied HTTP Verb
+    /// Modified to only allow using routes matching the supplied HTTP Verb.
     /// </summary>
     public static class UrlExtensions
     {

+ 1 - 1
Emby.Server.Implementations/Session/SessionManager.cs

@@ -843,7 +843,7 @@ namespace Emby.Server.Implementations.Session
         }
 
         /// <summary>
-        /// Used to report that playback has ended for an item
+        /// Used to report that playback has ended for an item.
         /// </summary>
         /// <param name="info">The info.</param>
         /// <returns>Task.</returns>

+ 4 - 3
Emby.Server.Implementations/Session/SessionWebSocketListener.cs

@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
 namespace Emby.Server.Implementations.Session
 {
     /// <summary>
-    /// Class SessionWebSocketListener
+    /// Class SessionWebSocketListener.
     /// </summary>
     public sealed class SessionWebSocketListener : IWebSocketListener, IDisposable
     {
@@ -34,12 +34,12 @@ namespace Emby.Server.Implementations.Session
         public const float ForceKeepAliveFactor = 0.75f;
 
         /// <summary>
-        /// The _session manager
+        /// The _session manager.
         /// </summary>
         private readonly ISessionManager _sessionManager;
 
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger<SessionWebSocketListener> _logger;
         private readonly ILoggerFactory _loggerFactory;
@@ -167,6 +167,7 @@ namespace Emby.Server.Implementations.Session
                     _logger.LogWarning("Multiple attempts to keep alive single WebSocket {0}", webSocket);
                     return;
                 }
+
                 webSocket.Closed += OnWebSocketClosed;
                 webSocket.LastKeepAliveDate = DateTime.UtcNow;
 

+ 1 - 1
Emby.Server.Implementations/Sorting/AlbumArtistComparer.cs

@@ -8,7 +8,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class AlbumArtistComparer
+    /// Class AlbumArtistComparer.
     /// </summary>
     public class AlbumArtistComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/AlbumComparer.cs

@@ -7,7 +7,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class AlbumComparer
+    /// Class AlbumComparer.
     /// </summary>
     public class AlbumComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/CriticRatingComparer.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class CriticRatingComparer
+    /// Class CriticRatingComparer.
     /// </summary>
     public class CriticRatingComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/DateCreatedComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class DateCreatedComparer
+    /// Class DateCreatedComparer.
     /// </summary>
     public class DateCreatedComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/DatePlayedComparer.cs

@@ -8,7 +8,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class DatePlayedComparer
+    /// Class DatePlayedComparer.
     /// </summary>
     public class DatePlayedComparer : IUserBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/NameComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class NameComparer
+    /// Class NameComparer.
     /// </summary>
     public class NameComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/PlayCountComparer.cs

@@ -7,7 +7,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class PlayCountComparer
+    /// Class PlayCountComparer.
     /// </summary>
     public class PlayCountComparer : IUserBaseItemComparer
     {

+ 2 - 1
Emby.Server.Implementations/Sorting/PremiereDateComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class PremiereDateComparer
+    /// Class PremiereDateComparer.
     /// </summary>
     public class PremiereDateComparer : IBaseItemComparer
     {
@@ -44,6 +44,7 @@ namespace Emby.Server.Implementations.Sorting
                     // Don't blow up if the item has a bad ProductionYear, just return MinValue
                 }
             }
+
             return DateTime.MinValue;
         }
 

+ 1 - 1
Emby.Server.Implementations/Sorting/ProductionYearComparer.cs

@@ -5,7 +5,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class ProductionYearComparer
+    /// Class ProductionYearComparer.
     /// </summary>
     public class ProductionYearComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/RandomComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class RandomComparer
+    /// Class RandomComparer.
     /// </summary>
     public class RandomComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/RuntimeComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class RuntimeComparer
+    /// Class RuntimeComparer.
     /// </summary>
     public class RuntimeComparer : IBaseItemComparer
     {

+ 1 - 1
Emby.Server.Implementations/Sorting/SortNameComparer.cs

@@ -6,7 +6,7 @@ using MediaBrowser.Model.Querying;
 namespace Emby.Server.Implementations.Sorting
 {
     /// <summary>
-    /// Class SortNameComparer
+    /// Class SortNameComparer.
     /// </summary>
     public class SortNameComparer : IBaseItemComparer
     {

+ 1 - 0
Emby.Server.Implementations/TV/TVSeriesManager.cs

@@ -256,6 +256,7 @@ namespace Emby.Server.Implementations.TV
             {
                 items = items.Skip(query.StartIndex.Value);
             }
+
             if (query.Limit.HasValue)
             {
                 items = items.Take(query.Limit.Value);

+ 1 - 1
Emby.Server.Implementations/Udp/UdpServer.cs

@@ -18,7 +18,7 @@ namespace Emby.Server.Implementations.Udp
     public sealed class UdpServer : IDisposable
     {
         /// <summary>
-        /// The _logger
+        /// The _logger.
         /// </summary>
         private readonly ILogger _logger;
         private readonly IServerApplicationHost _appHost;

+ 10 - 7
Jellyfin.Data/Entities/Artwork.cs

@@ -24,7 +24,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="path"></param>
         /// <param name="kind"></param>
@@ -64,7 +64,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -77,7 +77,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -89,6 +89,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -101,7 +102,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Path
+        /// Backing field for Path.
         /// </summary>
         protected string _Path;
         /// <summary>
@@ -127,6 +128,7 @@ namespace Jellyfin.Data.Entities
                 GetPath(ref value);
                 return (_Path = value);
             }
+
             set
             {
                 string oldValue = _Path;
@@ -139,7 +141,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Kind
+        /// Backing field for Kind.
         /// </summary>
         internal Enums.ArtKind _Kind;
         /// <summary>
@@ -152,7 +154,7 @@ namespace Jellyfin.Data.Entities
         partial void GetKind(ref Enums.ArtKind result);
 
         /// <summary>
-        /// Indexed, Required
+        /// Indexed, Required.
         /// </summary>
         [Required]
         public Enums.ArtKind Kind
@@ -163,6 +165,7 @@ namespace Jellyfin.Data.Entities
                 GetKind(ref value);
                 return (_Kind = value);
             }
+
             set
             {
                 Enums.ArtKind oldValue = _Kind;
@@ -175,7 +178,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 1 - 1
Jellyfin.Data/Entities/Book.cs

@@ -28,7 +28,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
         public Book(Guid urlid, DateTime dateadded)

+ 3 - 2
Jellyfin.Data/Entities/BookMetadata.cs

@@ -27,7 +27,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="title">The title or name of the object</param>
         /// <param name="language">ISO-639-3 3-character language codes</param>
@@ -64,7 +64,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for ISBN
+        /// Backing field for ISBN.
         /// </summary>
         protected long? _ISBN;
         /// <summary>
@@ -84,6 +84,7 @@ namespace Jellyfin.Data.Entities
                 GetISBN(ref value);
                 return (_ISBN = value);
             }
+
             set
             {
                 long? oldValue = _ISBN;

+ 15 - 10
Jellyfin.Data/Entities/Chapter.cs

@@ -25,7 +25,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="language">ISO-639-3 3-character language codes</param>
         /// <param name="timestart"></param>
@@ -60,7 +60,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -73,7 +73,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -86,6 +86,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -98,7 +99,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Name
+        /// Backing field for Name.
         /// </summary>
         protected string _Name;
         /// <summary>
@@ -123,6 +124,7 @@ namespace Jellyfin.Data.Entities
                 GetName(ref value);
                 return (_Name = value);
             }
+
             set
             {
                 string oldValue = _Name;
@@ -135,7 +137,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Language
+        /// Backing field for Language.
         /// </summary>
         protected string _Language;
         /// <summary>
@@ -149,7 +151,7 @@ namespace Jellyfin.Data.Entities
 
         /// <summary>
         /// Required, Min length = 3, Max length = 3
-        /// ISO-639-3 3-character language codes
+        /// ISO-639-3 3-character language codes.
         /// </summary>
         [Required]
         [MinLength(3)]
@@ -163,6 +165,7 @@ namespace Jellyfin.Data.Entities
                 GetLanguage(ref value);
                 return (_Language = value);
             }
+
             set
             {
                 string oldValue = _Language;
@@ -175,7 +178,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for TimeStart
+        /// Backing field for TimeStart.
         /// </summary>
         protected long _TimeStart;
         /// <summary>
@@ -188,7 +191,7 @@ namespace Jellyfin.Data.Entities
         partial void GetTimeStart(ref long result);
 
         /// <summary>
-        /// Required
+        /// Required.
         /// </summary>
         [Required]
         public long TimeStart
@@ -199,6 +202,7 @@ namespace Jellyfin.Data.Entities
                 GetTimeStart(ref value);
                 return (_TimeStart = value);
             }
+
             set
             {
                 long oldValue = _TimeStart;
@@ -211,7 +215,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for TimeEnd
+        /// Backing field for TimeEnd.
         /// </summary>
         protected long? _TimeEnd;
         /// <summary>
@@ -231,6 +235,7 @@ namespace Jellyfin.Data.Entities
                 GetTimeEnd(ref value);
                 return (_TimeEnd = value);
             }
+
             set
             {
                 long? oldValue = _TimeEnd;
@@ -243,7 +248,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 7 - 5
Jellyfin.Data/Entities/Collection.cs

@@ -9,7 +9,7 @@ namespace Jellyfin.Data.Entities
         partial void Init();
 
         /// <summary>
-        /// Default constructor
+        /// Default constructor.
         /// </summary>
         public Collection()
         {
@@ -23,7 +23,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -36,7 +36,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -49,6 +49,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -61,7 +62,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Name
+        /// Backing field for Name.
         /// </summary>
         protected string _Name;
         /// <summary>
@@ -86,6 +87,7 @@ namespace Jellyfin.Data.Entities
                 GetName(ref value);
                 return (_Name = value);
             }
+
             set
             {
                 string oldValue = _Name;
@@ -98,7 +100,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 6 - 5
Jellyfin.Data/Entities/CollectionItem.cs

@@ -28,7 +28,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="_collection0"></param>
         /// <param name="_collectionitem1"></param>
@@ -67,7 +67,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -80,7 +80,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -93,6 +93,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -105,7 +106,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]
@@ -121,7 +122,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Required
+        /// Required.
         /// </summary>
         [ForeignKey("LibraryItem_Id")]
         public virtual LibraryItem LibraryItem { get; set; }

+ 5 - 4
Jellyfin.Data/Entities/Company.cs

@@ -28,7 +28,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="_moviemetadata0"></param>
         /// <param name="_seriesmetadata1"></param>
@@ -75,7 +75,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -88,7 +88,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -101,6 +101,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -113,7 +114,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 9 - 5
Jellyfin.Data/Entities/CompanyMetadata.cs

@@ -24,7 +24,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="title">The title or name of the object</param>
         /// <param name="language">ISO-639-3 3-character language codes</param>
@@ -60,7 +60,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Description
+        /// Backing field for Description.
         /// </summary>
         protected string _Description;
         /// <summary>
@@ -85,6 +85,7 @@ namespace Jellyfin.Data.Entities
                 GetDescription(ref value);
                 return (_Description = value);
             }
+
             set
             {
                 string oldValue = _Description;
@@ -97,7 +98,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Headquarters
+        /// Backing field for Headquarters.
         /// </summary>
         protected string _Headquarters;
         /// <summary>
@@ -122,6 +123,7 @@ namespace Jellyfin.Data.Entities
                 GetHeadquarters(ref value);
                 return (_Headquarters = value);
             }
+
             set
             {
                 string oldValue = _Headquarters;
@@ -134,7 +136,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Country
+        /// Backing field for Country.
         /// </summary>
         protected string _Country;
         /// <summary>
@@ -159,6 +161,7 @@ namespace Jellyfin.Data.Entities
                 GetCountry(ref value);
                 return (_Country = value);
             }
+
             set
             {
                 string oldValue = _Country;
@@ -171,7 +174,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Homepage
+        /// Backing field for Homepage.
         /// </summary>
         protected string _Homepage;
         /// <summary>
@@ -196,6 +199,7 @@ namespace Jellyfin.Data.Entities
                 GetHomepage(ref value);
                 return (_Homepage = value);
             }
+
             set
             {
                 string oldValue = _Homepage;

+ 1 - 1
Jellyfin.Data/Entities/CustomItem.cs

@@ -28,7 +28,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
         public CustomItem(Guid urlid, DateTime dateadded)

+ 1 - 1
Jellyfin.Data/Entities/CustomItemMetadata.cs

@@ -23,7 +23,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="title">The title or name of the object</param>
         /// <param name="language">ISO-639-3 3-character language codes</param>

+ 3 - 2
Jellyfin.Data/Entities/Episode.cs

@@ -31,7 +31,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
         /// <param name="_season0"></param>
@@ -66,7 +66,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for EpisodeNumber
+        /// Backing field for EpisodeNumber.
         /// </summary>
         protected int? _EpisodeNumber;
         /// <summary>
@@ -86,6 +86,7 @@ namespace Jellyfin.Data.Entities
                 GetEpisodeNumber(ref value);
                 return (_EpisodeNumber = value);
             }
+
             set
             {
                 int? oldValue = _EpisodeNumber;

+ 7 - 4
Jellyfin.Data/Entities/EpisodeMetadata.cs

@@ -24,7 +24,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="title">The title or name of the object</param>
         /// <param name="language">ISO-639-3 3-character language codes</param>
@@ -60,7 +60,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Outline
+        /// Backing field for Outline.
         /// </summary>
         protected string _Outline;
         /// <summary>
@@ -85,6 +85,7 @@ namespace Jellyfin.Data.Entities
                 GetOutline(ref value);
                 return (_Outline = value);
             }
+
             set
             {
                 string oldValue = _Outline;
@@ -97,7 +98,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Plot
+        /// Backing field for Plot.
         /// </summary>
         protected string _Plot;
         /// <summary>
@@ -122,6 +123,7 @@ namespace Jellyfin.Data.Entities
                 GetPlot(ref value);
                 return (_Plot = value);
             }
+
             set
             {
                 string oldValue = _Plot;
@@ -134,7 +136,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Tagline
+        /// Backing field for Tagline.
         /// </summary>
         protected string _Tagline;
         /// <summary>
@@ -159,6 +161,7 @@ namespace Jellyfin.Data.Entities
                 GetTagline(ref value);
                 return (_Tagline = value);
             }
+
             set
             {
                 string oldValue = _Tagline;

+ 7 - 5
Jellyfin.Data/Entities/Genre.cs

@@ -25,7 +25,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="name"></param>
         /// <param name="_metadata0"></param>
@@ -56,7 +56,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -69,7 +69,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -82,6 +82,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -94,7 +95,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Name
+        /// Backing field for Name.
         /// </summary>
         internal string _Name;
         /// <summary>
@@ -120,6 +121,7 @@ namespace Jellyfin.Data.Entities
                 GetName(ref value);
                 return (_Name = value);
             }
+
             set
             {
                 string oldValue = _Name;
@@ -132,7 +134,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 7 - 5
Jellyfin.Data/Entities/Library.cs

@@ -25,7 +25,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="name"></param>
         public Library(string name)
@@ -51,7 +51,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -64,7 +64,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -77,6 +77,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -89,7 +90,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for Name
+        /// Backing field for Name.
         /// </summary>
         protected string _Name;
         /// <summary>
@@ -115,6 +116,7 @@ namespace Jellyfin.Data.Entities
                 GetName(ref value);
                 return (_Name = value);
             }
+
             set
             {
                 string oldValue = _Name;
@@ -127,7 +129,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]

+ 11 - 8
Jellyfin.Data/Entities/LibraryItem.cs

@@ -17,7 +17,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Public constructor with required data
+        /// Public constructor with required data.
         /// </summary>
         /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
         protected LibraryItem(Guid urlid, DateTime dateadded)
@@ -33,7 +33,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Backing field for Id
+        /// Backing field for Id.
         /// </summary>
         internal int _Id;
         /// <summary>
@@ -46,7 +46,7 @@ namespace Jellyfin.Data.Entities
         partial void GetId(ref int result);
 
         /// <summary>
-        /// Identity, Indexed, Required
+        /// Identity, Indexed, Required.
         /// </summary>
         [Key]
         [Required]
@@ -59,6 +59,7 @@ namespace Jellyfin.Data.Entities
                 GetId(ref value);
                 return (_Id = value);
             }
+
             protected set
             {
                 int oldValue = _Id;
@@ -71,7 +72,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for UrlId
+        /// Backing field for UrlId.
         /// </summary>
         internal Guid _UrlId;
         /// <summary>
@@ -96,6 +97,7 @@ namespace Jellyfin.Data.Entities
                 GetUrlId(ref value);
                 return (_UrlId = value);
             }
+
             set
             {
                 Guid oldValue = _UrlId;
@@ -108,7 +110,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Backing field for DateAdded
+        /// Backing field for DateAdded.
         /// </summary>
         protected DateTime _DateAdded;
         /// <summary>
@@ -121,7 +123,7 @@ namespace Jellyfin.Data.Entities
         partial void GetDateAdded(ref DateTime result);
 
         /// <summary>
-        /// Required
+        /// Required.
         /// </summary>
         [Required]
         public DateTime DateAdded
@@ -132,6 +134,7 @@ namespace Jellyfin.Data.Entities
                 GetDateAdded(ref value);
                 return (_DateAdded = value);
             }
+
             internal set
             {
                 DateTime oldValue = _DateAdded;
@@ -144,7 +147,7 @@ namespace Jellyfin.Data.Entities
         }
 
         /// <summary>
-        /// Required, ConcurrenyToken
+        /// Required, ConcurrenyToken.
         /// </summary>
         [ConcurrencyCheck]
         [Required]
@@ -160,7 +163,7 @@ namespace Jellyfin.Data.Entities
          *************************************************************************/
 
         /// <summary>
-        /// Required
+        /// Required.
         /// </summary>
         [ForeignKey("LibraryRoot_Id")]
         public virtual LibraryRoot LibraryRoot { get; set; }

部分文件因为文件数量过多而无法显示