瀏覽代碼

Move non-jellyfin extensions to separate project

Bond_009 4 年之前
父節點
當前提交
6f8ccab788
共有 100 個文件被更改,包括 293 次插入167 次删除
  1. 1 1
      Emby.Dlna/DlnaManager.cs
  2. 1 1
      Emby.Naming/Audio/AudioFileParser.cs
  3. 1 1
      Emby.Naming/Video/VideoResolver.cs
  4. 1 1
      Emby.Server.Implementations/Channels/ChannelManager.cs
  5. 2 1
      Emby.Server.Implementations/Data/SqliteItemRepository.cs
  6. 1 1
      Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs
  7. 1 1
      Emby.Server.Implementations/HttpServer/WebSocketConnection.cs
  8. 1 1
      Emby.Server.Implementations/IO/ManagedFileSystem.cs
  9. 1 0
      Emby.Server.Implementations/Library/LibraryManager.cs
  10. 1 1
      Emby.Server.Implementations/Library/LiveStreamHelper.cs
  11. 1 1
      Emby.Server.Implementations/Library/MediaSourceManager.cs
  12. 1 1
      Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs
  13. 2 2
      Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs
  14. 1 1
      Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs
  15. 2 2
      Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
  16. 2 1
      Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
  17. 1 0
      Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs
  18. 2 2
      Emby.Server.Implementations/Localization/LocalizationManager.cs
  19. 2 2
      Emby.Server.Implementations/Plugins/PluginManager.cs
  20. 1 1
      Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs
  21. 1 0
      Emby.Server.Implementations/Session/SessionManager.cs
  22. 2 1
      Emby.Server.Implementations/Sorting/StudioComparer.cs
  23. 1 1
      Emby.Server.Implementations/Updates/InstallationManager.cs
  24. 1 1
      Jellyfin.Api/BaseJellyfinApiController.cs
  25. 1 1
      Jellyfin.Api/Controllers/ConfigurationController.cs
  26. 1 1
      Jellyfin.Api/Controllers/PluginsController.cs
  27. 1 1
      Jellyfin.Api/Controllers/TvShowsController.cs
  28. 1 1
      Jellyfin.Api/Controllers/UserLibraryController.cs
  29. 1 1
      Jellyfin.Api/Extensions/DtoExtensions.cs
  30. 1 1
      Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs
  31. 1 1
      Jellyfin.Api/Models/PlaylistDtos/CreatePlaylistDto.cs
  32. 2 2
      Jellyfin.Api/Models/SessionDtos/ClientCapabilitiesDto.cs
  33. 1 1
      Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
  34. 1 1
      Jellyfin.Server/Formatters/CamelCaseJsonProfileFormatter.cs
  35. 1 1
      Jellyfin.Server/Formatters/PascalCaseJsonProfileFormatter.cs
  36. 1 1
      Jellyfin.Server/Middleware/UrlDecodeQueryFeature.cs
  37. 1 1
      Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
  38. 16 0
      Jellyfin.sln
  39. 1 1
      MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs
  40. 1 0
      MediaBrowser.Controller/Entities/BaseItem.cs
  41. 1 1
      MediaBrowser.Controller/Entities/CollectionFolder.cs
  42. 1 1
      MediaBrowser.Controller/Entities/Extensions.cs
  43. 0 21
      MediaBrowser.Controller/Extensions/StringExtensions.cs
  44. 2 3
      MediaBrowser.Controller/Sorting/SortExtensions.cs
  45. 1 1
      MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
  46. 1 1
      MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
  47. 1 1
      MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs
  48. 1 0
      MediaBrowser.Model/Entities/VirtualFolderInfo.cs
  49. 2 1
      MediaBrowser.Model/MediaBrowser.Model.csproj
  50. 1 1
      MediaBrowser.Providers/Plugins/AudioDb/AlbumImageProvider.cs
  51. 1 1
      MediaBrowser.Providers/Plugins/AudioDb/AlbumProvider.cs
  52. 1 1
      MediaBrowser.Providers/Plugins/AudioDb/ArtistImageProvider.cs
  53. 1 1
      MediaBrowser.Providers/Plugins/AudioDb/ArtistProvider.cs
  54. 4 2
      MediaBrowser.Providers/Plugins/Omdb/JsonOmdbNotAvailableInt32Converter.cs
  55. 4 2
      MediaBrowser.Providers/Plugins/Omdb/JsonOmdbNotAvailableStringConverter.cs
  56. 2 2
      MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs
  57. 2 2
      MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs
  58. 1 1
      MediaBrowser.Providers/Properties/AssemblyInfo.cs
  59. 1 1
      MediaBrowser.Providers/Studios/StudiosImageProvider.cs
  60. 11 4
      src/Jellyfin.Extensions/AlphanumericComparator.cs
  61. 1 1
      src/Jellyfin.Extensions/CopyToExtensions.cs
  62. 2 2
      src/Jellyfin.Extensions/EnumerableExtensions.cs
  63. 30 0
      src/Jellyfin.Extensions/Jellyfin.Extensions.csproj
  64. 2 2
      src/Jellyfin.Extensions/Json/Converters/JsonBoolNumberConverter.cs
  65. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonCommaDelimitedArrayConverter.cs
  66. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonCommaDelimitedArrayConverterFactory.cs
  67. 2 2
      src/Jellyfin.Extensions/Json/Converters/JsonDateTimeConverter.cs
  68. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonDelimitedArrayConverter.cs
  69. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonGuidConverter.cs
  70. 3 7
      src/Jellyfin.Extensions/Json/Converters/JsonLowerCaseConverter.cs
  71. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonNullableGuidConverter.cs
  72. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonNullableStructConverter.cs
  73. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonNullableStructConverterFactory.cs
  74. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonPipeDelimitedArrayConverter.cs
  75. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonPipeDelimitedArrayConverterFactory.cs
  76. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonStringConverter.cs
  77. 1 1
      src/Jellyfin.Extensions/Json/Converters/JsonVersionConverter.cs
  78. 2 2
      src/Jellyfin.Extensions/Json/JsonDefaults.cs
  79. 1 1
      src/Jellyfin.Extensions/ShuffleExtensions.cs
  80. 29 9
      src/Jellyfin.Extensions/SplitStringExtensions.cs
  81. 1 1
      src/Jellyfin.Extensions/StreamExtensions.cs
  82. 2 2
      src/Jellyfin.Extensions/StringBuilderExtensions.cs
  83. 31 0
      src/Jellyfin.Extensions/StringExtensions.cs
  84. 4 5
      tests/Jellyfin.Extensions.Tests/AlphanumericComparatorTests.cs
  85. 1 2
      tests/Jellyfin.Extensions.Tests/CopyToExtensionsTests.cs
  86. 38 0
      tests/Jellyfin.Extensions.Tests/Jellyfin.Extensions.Tests.csproj
  87. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonBoolNumberTests.cs
  88. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonCommaDelimitedArrayTests.cs
  89. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonCommaDelimitedIReadOnlyListTests.cs
  90. 2 2
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonGuidConverterTests.cs
  91. 2 1
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonLowerCaseConverterTests.cs
  92. 2 2
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonNullableGuidConverterTests.cs
  93. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonStringConverterTests.cs
  94. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Converters/JsonVersionConverterTests.cs
  95. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Models/GenericBodyArrayModel.cs
  96. 3 3
      tests/Jellyfin.Extensions.Tests/Json/Models/GenericBodyIReadOnlyListModel.cs
  97. 1 2
      tests/Jellyfin.Extensions.Tests/ShuffleExtensionsTests.cs
  98. 1 2
      tests/Jellyfin.Extensions.Tests/StringExtensionsTests.cs
  99. 1 1
      tests/Jellyfin.MediaEncoding.Tests/FFprobeParserTests.cs
  100. 1 1
      tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs

+ 1 - 1
Emby.Dlna/DlnaManager.cs

@@ -14,9 +14,9 @@ using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 using Emby.Dlna.Profiles;
 using Emby.Dlna.Server;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Dlna;
 using MediaBrowser.Controller.Drawing;

+ 1 - 1
Emby.Naming/Audio/AudioFileParser.cs

@@ -1,7 +1,7 @@
 using System;
 using System.IO;
 using Emby.Naming.Common;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 
 namespace Emby.Naming.Audio
 {

+ 1 - 1
Emby.Naming/Video/VideoResolver.cs

@@ -2,7 +2,7 @@ using System;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using Emby.Naming.Common;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 
 namespace Emby.Naming.Video
 {

+ 1 - 1
Emby.Server.Implementations/Channels/ChannelManager.cs

@@ -11,7 +11,7 @@ using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;

+ 2 - 1
Emby.Server.Implementations/Data/SqliteItemRepository.cs

@@ -13,8 +13,9 @@ using System.Text.Json;
 using System.Threading;
 using Emby.Server.Implementations.Playlists;
 using Jellyfin.Data.Enums;
+using Jellyfin.Extensions;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;

+ 1 - 1
Emby.Server.Implementations/HttpServer/Security/AuthorizationContext.cs

@@ -3,7 +3,7 @@
 using System;
 using System.Collections.Generic;
 using System.Net;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Controller.Security;

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

@@ -7,7 +7,7 @@ using System.Text;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.Net;
 using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Session;

+ 1 - 1
Emby.Server.Implementations/IO/ManagedFileSystem.cs

@@ -6,8 +6,8 @@ using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Extensions;
 using MediaBrowser.Model.IO;
 using MediaBrowser.Model.System;
 using Microsoft.Extensions.Logging;

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

@@ -21,6 +21,7 @@ using Emby.Server.Implementations.Playlists;
 using Emby.Server.Implementations.ScheduledTasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Controller;

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

@@ -12,7 +12,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Dto;

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

@@ -15,7 +15,7 @@ using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.MediaEncoding;

+ 1 - 1
Emby.Server.Implementations/Library/Resolvers/Movies/MovieResolver.cs

@@ -6,7 +6,7 @@ using System.IO;
 using System.Linq;
 using System.Text.RegularExpressions;
 using Emby.Naming.Video;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Drawing;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Movies;

+ 2 - 2
Emby.Server.Implementations/LiveTv/EmbyTV/EncodedRecorder.cs

@@ -11,9 +11,9 @@ using System.Text;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
+using Jellyfin.Extensions;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Library;

+ 1 - 1
Emby.Server.Implementations/LiveTv/EmbyTV/ItemDataProvider.cs

@@ -7,7 +7,7 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Text.Json;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using Microsoft.Extensions.Logging;
 
 namespace Emby.Server.Implementations.LiveTv.EmbyTV

+ 2 - 2
Emby.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs

@@ -15,7 +15,7 @@ using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Model.Cryptography;
@@ -789,7 +789,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
             {
                 var channelNumber = GetChannelNumber(channel);
 
-                var station = allStations.Find(item => string.Equals(item.stationID, channel.stationID, StringComparison.OrdinalIgnoreCase)) 
+                var station = allStations.Find(item => string.Equals(item.stationID, channel.stationID, StringComparison.OrdinalIgnoreCase))
                     ?? new ScheduleDirect.Station
                     {
                         stationID = channel.stationID

+ 2 - 1
Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs

@@ -12,8 +12,9 @@ using System.Net.Http;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
+using Jellyfin.Extensions;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;

+ 1 - 0
Emby.Server.Implementations/LiveTv/TunerHosts/M3uParser.cs

@@ -10,6 +10,7 @@ using System.Net.Http;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;

+ 2 - 2
Emby.Server.Implementations/Localization/LocalizationManager.cs

@@ -8,8 +8,8 @@ using System.IO;
 using System.Reflection;
 using System.Text.Json;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Globalization;

+ 2 - 2
Emby.Server.Implementations/Plugins/PluginManager.cs

@@ -10,8 +10,8 @@ using System.Text.Json;
 using System.Threading.Tasks;
 using MediaBrowser.Common;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Model.Configuration;

+ 1 - 1
Emby.Server.Implementations/ScheduledTasks/ScheduledTaskWorker.cs

@@ -12,7 +12,7 @@ using System.Threading.Tasks;
 using Jellyfin.Data.Events;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Progress;
 using MediaBrowser.Model.Tasks;
 using Microsoft.Extensions.Logging;

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

@@ -12,6 +12,7 @@ using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
 using Jellyfin.Data.Events;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Events;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller;

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

@@ -4,6 +4,7 @@
 
 using System;
 using System.Linq;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Sorting;
 using MediaBrowser.Model.Querying;
@@ -30,7 +31,7 @@ namespace Emby.Server.Implementations.Sorting
                 throw new ArgumentNullException(nameof(y));
             }
 
-            return AlphanumComparator.CompareValues(x.Studios.FirstOrDefault() ?? string.Empty, y.Studios.FirstOrDefault() ?? string.Empty);
+            return AlphanumericComparator.CompareValues(x.Studios.FirstOrDefault(), y.Studios.FirstOrDefault());
         }
 
         /// <summary>

+ 1 - 1
Emby.Server.Implementations/Updates/InstallationManager.cs

@@ -11,7 +11,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using Jellyfin.Data.Events;
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Updates;

+ 1 - 1
Jellyfin.Api/BaseJellyfinApiController.cs

@@ -1,5 +1,5 @@
 using System.Net.Mime;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using Microsoft.AspNetCore.Mvc;
 
 namespace Jellyfin.Api

+ 1 - 1
Jellyfin.Api/Controllers/ConfigurationController.cs

@@ -6,7 +6,7 @@ using System.Threading.Tasks;
 using Jellyfin.Api.Attributes;
 using Jellyfin.Api.Constants;
 using Jellyfin.Api.Models.ConfigurationDtos;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.Model.Configuration;

+ 1 - 1
Jellyfin.Api/Controllers/PluginsController.cs

@@ -8,8 +8,8 @@ using System.Threading.Tasks;
 using Jellyfin.Api.Attributes;
 using Jellyfin.Api.Constants;
 using Jellyfin.Api.Models.PluginDtos;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Common.Plugins;
 using MediaBrowser.Common.Updates;
 using MediaBrowser.Model.Net;

+ 1 - 1
Jellyfin.Api/Controllers/TvShowsController.cs

@@ -6,7 +6,7 @@ using Jellyfin.Api.Constants;
 using Jellyfin.Api.Extensions;
 using Jellyfin.Api.ModelBinders;
 using Jellyfin.Data.Enums;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;

+ 1 - 1
Jellyfin.Api/Controllers/UserLibraryController.cs

@@ -9,7 +9,7 @@ using Jellyfin.Api.Extensions;
 using Jellyfin.Api.Helpers;
 using Jellyfin.Api.ModelBinders;
 using Jellyfin.Data.Enums;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;

+ 1 - 1
Jellyfin.Api/Extensions/DtoExtensions.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 using Jellyfin.Api.Helpers;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;

+ 1 - 1
Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Text.Json.Serialization;
 using Jellyfin.Data.Enums;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Querying;
 

+ 1 - 1
Jellyfin.Api/Models/PlaylistDtos/CreatePlaylistDto.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text.Json.Serialization;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 
 namespace Jellyfin.Api.Models.PlaylistDtos
 {

+ 2 - 2
Jellyfin.Api/Models/SessionDtos/ClientCapabilitiesDto.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text.Json.Serialization;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Model.Dlna;
 using MediaBrowser.Model.Session;
 
@@ -85,4 +85,4 @@ namespace Jellyfin.Api.Models.SessionDtos
             };
         }
     }
-}
+}

+ 1 - 1
Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs

@@ -21,11 +21,11 @@ using Jellyfin.Api.Constants;
 using Jellyfin.Api.Controllers;
 using Jellyfin.Api.ModelBinders;
 using Jellyfin.Data.Enums;
+using Jellyfin.Extensions.Json;
 using Jellyfin.Networking.Configuration;
 using Jellyfin.Server.Configuration;
 using Jellyfin.Server.Filters;
 using Jellyfin.Server.Formatters;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Entities;
 using Microsoft.AspNetCore.Authentication;

+ 1 - 1
Jellyfin.Server/Formatters/CamelCaseJsonProfileFormatter.cs

@@ -1,4 +1,4 @@
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using Microsoft.AspNetCore.Mvc.Formatters;
 using Microsoft.Net.Http.Headers;
 

+ 1 - 1
Jellyfin.Server/Formatters/PascalCaseJsonProfileFormatter.cs

@@ -1,5 +1,5 @@
 using System.Net.Mime;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using Microsoft.AspNetCore.Mvc.Formatters;
 using Microsoft.Net.Http.Headers;
 

+ 1 - 1
Jellyfin.Server/Middleware/UrlDecodeQueryFeature.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Web;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Http.Features;
 using Microsoft.Extensions.Primitives;

+ 1 - 1
Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs

@@ -4,9 +4,9 @@ using Emby.Server.Implementations.Data;
 using Emby.Server.Implementations.Serialization;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
+using Jellyfin.Extensions.Json;
 using Jellyfin.Server.Implementations;
 using Jellyfin.Server.Implementations.Users;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Model.Configuration;

+ 16 - 0
Jellyfin.sln

@@ -83,6 +83,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Server.Integration
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Providers.Tests", "tests\Jellyfin.Providers.Tests\Jellyfin.Providers.Tests.csproj", "{A964008C-2136-4716-B6CB-B3426C22320A}"
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Extensions", "src\Jellyfin.Extensions\Jellyfin.Extensions.csproj", "{750B8757-BE3D-4F8C-941A-FBAD94904ADA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Extensions.Tests", "tests\Jellyfin.Extensions.Tests\Jellyfin.Extensions.Tests.csproj", "{332A5C7A-F907-47CA-910E-BE6F7371B9E0}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -229,6 +235,14 @@ Global
 		{A964008C-2136-4716-B6CB-B3426C22320A}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A964008C-2136-4716-B6CB-B3426C22320A}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A964008C-2136-4716-B6CB-B3426C22320A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{750B8757-BE3D-4F8C-941A-FBAD94904ADA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{332A5C7A-F907-47CA-910E-BE6F7371B9E0}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -247,6 +261,8 @@ Global
 		{3ADBCD8C-C0F2-4956-8FDC-35D686B74CF9} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{68B0B823-A5AC-4E8B-82EA-965AAC7BF76E} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 		{A964008C-2136-4716-B6CB-B3426C22320A} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
+		{750B8757-BE3D-4F8C-941A-FBAD94904ADA} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
+		{332A5C7A-F907-47CA-910E-BE6F7371B9E0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {3448830C-EBDC-426C-85CD-7BBB9651A7FE}

+ 1 - 1
MediaBrowser.Controller/BaseItemManager/BaseItemManager.cs

@@ -3,7 +3,7 @@
 using System;
 using System.Linq;
 using System.Threading;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 1 - 0
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -13,6 +13,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Enums;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Controller.Channels;
 using MediaBrowser.Controller.Configuration;

+ 1 - 1
MediaBrowser.Controller/Entities/CollectionFolder.cs

@@ -10,7 +10,7 @@ using System.Text.Json;
 using System.Text.Json.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Controller.IO;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;

+ 1 - 1
MediaBrowser.Controller/Entities/Extensions.cs

@@ -2,7 +2,7 @@
 
 using System;
 using System.Linq;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Controller.Entities

+ 0 - 21
MediaBrowser.Controller/Extensions/StringExtensions.cs

@@ -21,27 +21,6 @@ namespace MediaBrowser.Controller.Extensions
             return Normalize(string.Concat(chars), NormalizationForm.FormC);
         }
 
-        /// <summary>
-        /// Counts the number of occurrences of [needle] in the string.
-        /// </summary>
-        /// <param name="value">The haystack to search in.</param>
-        /// <param name="needle">The character to search for.</param>
-        /// <returns>The number of occurrences of the [needle] character.</returns>
-        public static int Count(this ReadOnlySpan<char> value, char needle)
-        {
-            var count = 0;
-            var length = value.Length;
-            for (var i = 0; i < length; i++)
-            {
-                if (value[i] == needle)
-                {
-                    count++;
-                }
-            }
-
-            return count;
-        }
-
         private static string Normalize(string text, NormalizationForm form, bool stripStringOnFailure = true)
         {
             if (stripStringOnFailure)

+ 2 - 3
MediaBrowser.Controller/Sorting/SortExtensions.cs

@@ -1,16 +1,15 @@
-#nullable disable
-
 #pragma warning disable CS1591
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using Jellyfin.Extensions;
 
 namespace MediaBrowser.Controller.Sorting
 {
     public static class SortExtensions
     {
-        private static readonly AlphanumComparator _comparer = new AlphanumComparator();
+        private static readonly AlphanumericComparator _comparer = new AlphanumericComparator();
 
         public static IEnumerable<T> OrderByString<T>(this IEnumerable<T> list, Func<T, string> getName)
         {

+ 1 - 1
MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs

@@ -2,7 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Providers;

+ 1 - 1
MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs

@@ -11,9 +11,9 @@ using System.Text.Json;
 using System.Text.RegularExpressions;
 using System.Threading;
 using System.Threading.Tasks;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.MediaEncoding;
 using MediaBrowser.MediaEncoding.Probing;

+ 1 - 1
MediaBrowser.MediaEncoding/Subtitles/SubtitleEditParser.cs

@@ -2,7 +2,7 @@ using System.Globalization;
 using System.IO;
 using System.Linq;
 using System.Threading;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Model.MediaInfo;
 using Microsoft.Extensions.Logging;
 using Nikse.SubtitleEdit.Core;

+ 1 - 0
MediaBrowser.Model/Entities/VirtualFolderInfo.cs

@@ -3,6 +3,7 @@
 
 using System;
 using System.Text.Json.Serialization;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Model.Configuration;
 
 namespace MediaBrowser.Model.Entities

+ 2 - 1
MediaBrowser.Model/MediaBrowser.Model.csproj

@@ -50,7 +50,8 @@
     <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
   </ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\Jellyfin.Data\Jellyfin.Data.csproj" />
+    <ProjectReference Include="../Jellyfin.Data/Jellyfin.Data.csproj" />
+    <ProjectReference Include="../src/Jellyfin.Extensions/Jellyfin.Extensions.csproj" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
MediaBrowser.Providers/Plugins/AudioDb/AlbumImageProvider.cs

@@ -6,7 +6,7 @@ using System.Net.Http;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 1 - 1
MediaBrowser.Providers/Plugins/AudioDb/AlbumProvider.cs

@@ -11,7 +11,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.Audio;

+ 1 - 1
MediaBrowser.Providers/Plugins/AudioDb/ArtistImageProvider.cs

@@ -6,7 +6,7 @@ using System.Net.Http;
 using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 1 - 1
MediaBrowser.Providers/Plugins/AudioDb/ArtistProvider.cs

@@ -10,7 +10,7 @@ using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities.Audio;

+ 4 - 2
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableInt32Converter.cs → MediaBrowser.Providers/Plugins/Omdb/JsonOmdbNotAvailableInt32Converter.cs

@@ -1,9 +1,11 @@
-using System;
+#nullable enable
+
+using System;
 using System.ComponentModel;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace MediaBrowser.Providers.Plugins.Omdb
 {
     /// <summary>
     /// Converts a string <c>N/A</c> to <c>string.Empty</c>.

+ 4 - 2
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableStringConverter.cs → MediaBrowser.Providers/Plugins/Omdb/JsonOmdbNotAvailableStringConverter.cs

@@ -1,8 +1,10 @@
-using System;
+#nullable enable
+
+using System;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace MediaBrowser.Providers.Plugins.Omdb
 {
     /// <summary>
     /// Converts a string <c>N/A</c> to <c>string.Empty</c>.

+ 2 - 2
MediaBrowser.Providers/Plugins/Omdb/OmdbItemProvider.cs

@@ -10,8 +10,8 @@ using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common;
-using MediaBrowser.Common.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 2 - 2
MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs

@@ -10,8 +10,8 @@ using System.Text.Json;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common;
-using MediaBrowser.Common.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 1 - 1
MediaBrowser.Providers/Properties/AssemblyInfo.cs

@@ -15,7 +15,7 @@ using System.Runtime.InteropServices;
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 [assembly: NeutralResourcesLanguage("en")]
-[assembly: InternalsVisibleTo("Jellyfin.Common.Tests")]
+[assembly: InternalsVisibleTo("Jellyfin.Providers.Tests")]
 
 // Setting ComVisible to false makes the types in this assembly not visible
 // to COM components.  If you need to access a type in this assembly from

+ 1 - 1
MediaBrowser.Providers/Studios/StudiosImageProvider.cs

@@ -8,7 +8,7 @@ using System.Linq;
 using System.Net.Http;
 using System.Threading;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Extensions;
+using Jellyfin.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;

+ 11 - 4
MediaBrowser.Controller/Sorting/AlphanumComparator.cs → src/Jellyfin.Extensions/AlphanumericComparator.cs

@@ -1,12 +1,19 @@
-#pragma warning disable CS1591
-
 using System;
 using System.Collections.Generic;
 
-namespace MediaBrowser.Controller.Sorting
+namespace Jellyfin.Extensions
 {
-    public class AlphanumComparator : IComparer<string?>
+    /// <summary>
+    /// Alphanumeric <see cref="IComparer{T}" />.
+    /// </summary>
+    public class AlphanumericComparator : IComparer<string?>
     {
+        /// <summary>
+        /// Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other.
+        /// </summary>
+        /// <param name="s1">The first object to compare.</param>
+        /// <param name="s2">The second object to compare.</param>
+        /// <returns>A signed integer that indicates the relative values of <c>x</c> and <c>y</c>.</returns>
         public static int CompareValues(string? s1, string? s2)
         {
             if (s1 == null && s2 == null)

+ 1 - 1
MediaBrowser.Common/Extensions/CopyToExtensions.cs → src/Jellyfin.Extensions/CopyToExtensions.cs

@@ -1,6 +1,6 @@
 using System.Collections.Generic;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Provides <c>CopyTo</c> extensions methods for <see cref="IReadOnlyList{T}" />.

+ 2 - 2
MediaBrowser.Common/Extensions/EnumerableExtensions.cs → src/Jellyfin.Extensions/EnumerableExtensions.cs

@@ -1,7 +1,7 @@
-using System;
+using System;
 using System.Collections.Generic;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Static extensions for the <see cref="IEnumerable{T}"/> interface.

+ 30 - 0
src/Jellyfin.Extensions/Jellyfin.Extensions.csproj

@@ -0,0 +1,30 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net5.0</TargetFramework>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <GenerateDocumentationFile>true</GenerateDocumentationFile>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../../jellyfin.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+
+  <PropertyGroup>
+    <Authors>Jellyfin Contributors</Authors>
+    <RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
+    <PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="../../SharedVersion.cs" />
+  </ItemGroup>
+
+  <!-- Code Analyzers-->
+  <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
+    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
+    <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
+  </ItemGroup>
+
+</Project>

+ 2 - 2
MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonBoolNumberConverter.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts a number to a boolean.
@@ -27,4 +27,4 @@ namespace MediaBrowser.Common.Json.Converters
             writer.WriteBooleanValue(value);
         }
     }
-}
+}

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonCommaDelimitedArrayConverter.cs

@@ -3,7 +3,7 @@ using System.ComponentModel;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Convert comma delimited string to array of type.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonCommaDelimitedArrayConverterFactory.cs → src/Jellyfin.Extensions/Json/Converters/JsonCommaDelimitedArrayConverterFactory.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Json comma delimited array converter factory.

+ 2 - 2
MediaBrowser.Common/Json/Converters/JsonDateTimeConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonDateTimeConverter.cs

@@ -3,7 +3,7 @@ using System.Globalization;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Legacy DateTime converter.
@@ -31,4 +31,4 @@ namespace MediaBrowser.Common.Json.Converters
             }
         }
     }
-}
+}

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonDelimitedArrayConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonDelimitedArrayConverter.cs

@@ -3,7 +3,7 @@ using System.ComponentModel;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Convert delimited string to array of type.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonGuidConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonGuidConverter.cs

@@ -3,7 +3,7 @@ using System.Globalization;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts a GUID object or value to/from JSON.

+ 3 - 7
MediaBrowser.Model/Entities/JsonLowerCaseConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonLowerCaseConverter.cs

@@ -1,12 +1,8 @@
-#nullable disable
-// THIS IS A HACK
-// TODO: @bond Move to separate project
-
 using System;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Model.Entities
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts an object to a lowercase string.
@@ -15,7 +11,7 @@ namespace MediaBrowser.Model.Entities
     public class JsonLowerCaseConverter<T> : JsonConverter<T>
     {
         /// <inheritdoc />
-        public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
         {
             return JsonSerializer.Deserialize<T>(ref reader, options);
         }
@@ -23,7 +19,7 @@ namespace MediaBrowser.Model.Entities
         /// <inheritdoc />
         public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
         {
-            writer.WriteStringValue(value?.ToString().ToLowerInvariant());
+            writer.WriteStringValue(value?.ToString()?.ToLowerInvariant());
         }
     }
 }

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonNullableGuidConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonNullableGuidConverter.cs

@@ -3,7 +3,7 @@ using System.Globalization;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts a GUID object or value to/from JSON.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonNullableStructConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonNullableStructConverter.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts a nullable struct or value to/from JSON.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonNullableStructConverterFactory.cs → src/Jellyfin.Extensions/Json/Converters/JsonNullableStructConverterFactory.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Json nullable struct converter factory.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonPipeDelimitedArrayConverter.cs

@@ -3,7 +3,7 @@ using System.ComponentModel;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Convert Pipe delimited string to array of type.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonPipeDelimitedArrayConverterFactory.cs → src/Jellyfin.Extensions/Json/Converters/JsonPipeDelimitedArrayConverterFactory.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Json Pipe delimited array converter factory.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonStringConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonStringConverter.cs

@@ -4,7 +4,7 @@ using System.Text;
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converter to allow the serializer to read strings.

+ 1 - 1
MediaBrowser.Common/Json/Converters/JsonVersionConverter.cs → src/Jellyfin.Extensions/Json/Converters/JsonVersionConverter.cs

@@ -2,7 +2,7 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
 
-namespace MediaBrowser.Common.Json.Converters
+namespace Jellyfin.Extensions.Json.Converters
 {
     /// <summary>
     /// Converts a Version object or value to/from JSON.

+ 2 - 2
MediaBrowser.Common/Json/JsonDefaults.cs → src/Jellyfin.Extensions/Json/JsonDefaults.cs

@@ -1,8 +1,8 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 
-namespace MediaBrowser.Common.Json
+namespace Jellyfin.Extensions.Json
 {
     /// <summary>
     /// Helper class for having compatible JSON throughout the codebase.

+ 1 - 1
MediaBrowser.Common/Extensions/ShuffleExtensions.cs → src/Jellyfin.Extensions/ShuffleExtensions.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Provides <c>Shuffle</c> extensions methods for <see cref="IList{T}" />.

+ 29 - 9
MediaBrowser.Common/Extensions/SplitStringExtensions.cs → src/Jellyfin.Extensions/SplitStringExtensions.cs

@@ -1,4 +1,4 @@
-/*
+/*
 MIT License
 
 Copyright (c) 2019 Gérald Barré
@@ -22,13 +22,14 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 SOFTWARE.
  */
 
-#pragma warning disable CS1591
-#pragma warning disable CA1034
+// TODO: remove when analyzer is fixed: https://github.com/dotnet/roslyn-analyzers/issues/5158
+#pragma warning disable CA1034 // Nested types should not be visible
+
 using System;
 using System.Diagnostics.Contracts;
 using System.Runtime.InteropServices;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Extension class for splitting lines without unnecessary allocations.
@@ -42,7 +43,7 @@ namespace MediaBrowser.Common.Extensions
         /// <param name="separator">The separator to split on.</param>
         /// <returns>The enumerator struct.</returns>
         [Pure]
-        public static SplitEnumerator SpanSplit(this string str, char separator) => new (str.AsSpan(), separator);
+        public static Enumerator SpanSplit(this string str, char separator) => new (str.AsSpan(), separator);
 
         /// <summary>
         /// Creates a new span split enumerator.
@@ -51,25 +52,44 @@ namespace MediaBrowser.Common.Extensions
         /// <param name="separator">The separator to split on.</param>
         /// <returns>The enumerator struct.</returns>
         [Pure]
-        public static SplitEnumerator Split(this ReadOnlySpan<char> str, char separator) => new (str, separator);
+        public static Enumerator Split(this ReadOnlySpan<char> str, char separator) => new (str, separator);
 
+        /// <summary>
+        /// Provides an enumerator for the substrings seperated by the separator.
+        /// </summary>
         [StructLayout(LayoutKind.Auto)]
-        public ref struct SplitEnumerator
+        public ref struct Enumerator
         {
             private readonly char _separator;
             private ReadOnlySpan<char> _str;
 
-            public SplitEnumerator(ReadOnlySpan<char> str, char separator)
+            /// <summary>
+            /// Initializes a new instance of the <see cref="Enumerator"/> struct.
+            /// </summary>
+            /// <param name="str">The span to split.</param>
+            /// <param name="separator">The separator to split on.</param>
+            public Enumerator(ReadOnlySpan<char> str, char separator)
             {
                 _str = str;
                 _separator = separator;
                 Current = default;
             }
 
+            /// <summary>
+            /// Gets a reference to the item at the current position of the enumerator.
+            /// </summary>
             public ReadOnlySpan<char> Current { get; private set; }
 
-            public readonly SplitEnumerator GetEnumerator() => this;
+            /// <summary>
+            /// Returns <c>this</c>.
+            /// </summary>
+            /// <returns><c>this</c>.</returns>
+            public readonly Enumerator GetEnumerator() => this;
 
+            /// <summary>
+            /// Advances the enumerator to the next item.
+            /// </summary>
+            /// <returns><c>true</c> if there is a next element; otherwise <c>false</c>.</returns>
             public bool MoveNext()
             {
                 if (_str.Length == 0)

+ 1 - 1
MediaBrowser.Common/Extensions/StreamExtensions.cs → src/Jellyfin.Extensions/StreamExtensions.cs

@@ -3,7 +3,7 @@ using System.IO;
 using System.Linq;
 using System.Text;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Class BaseExtensions.

+ 2 - 2
MediaBrowser.Common/Extensions/StringBuilderExtensions.cs → src/Jellyfin.Extensions/StringBuilderExtensions.cs

@@ -1,7 +1,7 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Text;
 
-namespace MediaBrowser.Common.Extensions
+namespace Jellyfin.Extensions
 {
     /// <summary>
     /// Extension methods for the <see cref="StringBuilder"/> class.

+ 31 - 0
src/Jellyfin.Extensions/StringExtensions.cs

@@ -0,0 +1,31 @@
+using System;
+
+namespace Jellyfin.Extensions
+{
+    /// <summary>
+    /// Provides extensions methods for <see cref="string" />.
+    /// </summary>
+    public static class StringExtensions
+    {
+        /// <summary>
+        /// Counts the number of occurrences of [needle] in the string.
+        /// </summary>
+        /// <param name="value">The haystack to search in.</param>
+        /// <param name="needle">The character to search for.</param>
+        /// <returns>The number of occurrences of the [needle] character.</returns>
+        public static int Count(this ReadOnlySpan<char> value, char needle)
+        {
+            var count = 0;
+            var length = value.Length;
+            for (var i = 0; i < length; i++)
+            {
+                if (value[i] == needle)
+                {
+                    count++;
+                }
+            }
+
+            return count;
+        }
+    }
+}

+ 4 - 5
tests/Jellyfin.Controller.Tests/AlphanumComparatorTests.cs → tests/Jellyfin.Extensions.Tests/AlphanumericComparatorTests.cs

@@ -1,11 +1,10 @@
 using System;
 using System.Linq;
-using MediaBrowser.Controller.Sorting;
 using Xunit;
 
-namespace Jellyfin.Controller.Tests
+namespace Jellyfin.Extensions.Tests
 {
-    public class AlphanumComparatorTests
+    public class AlphanumericComparatorTests
     {
         // InlineData is pre-sorted
         [Theory]
@@ -20,10 +19,10 @@ namespace Jellyfin.Controller.Tests
         [InlineData("12345678912345678912345678913234567891", "12345678912345678912345678913234567892")]
         [InlineData("12345678912345678912345678913234567891a", "12345678912345678912345678913234567891a")]
         [InlineData("12345678912345678912345678913234567891a", "12345678912345678912345678913234567891b")]
-        public void AlphanumComparatorTest(params string?[] strings)
+        public void AlphanumericComparatorTest(params string?[] strings)
         {
             var copy = strings.Reverse().ToArray();
-            Array.Sort(copy, new AlphanumComparator());
+            Array.Sort(copy, new AlphanumericComparator());
             Assert.True(strings.SequenceEqual(copy));
         }
     }

+ 1 - 2
tests/Jellyfin.Common.Tests/Extensions/CopyToExtensionsTests.cs → tests/Jellyfin.Extensions.Tests/CopyToExtensionsTests.cs

@@ -1,9 +1,8 @@
 using System;
 using System.Collections.Generic;
-using MediaBrowser.Common.Extensions;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Extensions
+namespace Jellyfin.Extensions.Tests
 {
     public static class CopyToExtensionsTests
     {

+ 38 - 0
tests/Jellyfin.Extensions.Tests/Jellyfin.Extensions.Tests.csproj

@@ -0,0 +1,38 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net5.0</TargetFramework>
+    <IsPackable>false</IsPackable>
+    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+    <Nullable>enable</Nullable>
+    <AnalysisMode>AllEnabledByDefault</AnalysisMode>
+    <CodeAnalysisRuleSet>../jellyfin-tests.ruleset</CodeAnalysisRuleSet>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
+    <PackageReference Include="xunit" Version="2.4.1" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+      <PrivateAssets>all</PrivateAssets>
+    </PackageReference>
+    <PackageReference Include="coverlet.collector" Version="1.3.0">
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+      <PrivateAssets>all</PrivateAssets>
+    </PackageReference>
+    <PackageReference Include="FsCheck.Xunit" Version="2.15.3" />
+  </ItemGroup>
+
+  <!-- Code Analyzers -->
+  <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
+    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
+    <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="../../MediaBrowser.Model/MediaBrowser.Model.csproj" />
+    <ProjectReference Include="../../src/Jellyfin.Extensions/Jellyfin.Extensions.csproj" />
+  </ItemGroup>
+
+</Project>

+ 3 - 3
tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonBoolNumberTests.cs

@@ -1,11 +1,11 @@
-using System.Globalization;
+using System.Globalization;
 using System.Text.Json;
 using FsCheck;
 using FsCheck.Xunit;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonBoolNumberTests
     {

+ 3 - 3
tests/Jellyfin.Common.Tests/Json/JsonCommaDelimitedArrayTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonCommaDelimitedArrayTests.cs

@@ -1,11 +1,11 @@
-using System;
+using System;
 using System.Text.Json;
 using System.Text.Json.Serialization;
-using Jellyfin.Common.Tests.Models;
+using Jellyfin.Extensions.Tests.Json.Models;
 using MediaBrowser.Model.Session;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public static class JsonCommaDelimitedArrayTests
     {

+ 3 - 3
tests/Jellyfin.Common.Tests/Json/JsonCommaDelimitedIReadOnlyListTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonCommaDelimitedIReadOnlyListTests.cs

@@ -1,10 +1,10 @@
-using System.Text.Json;
+using System.Text.Json;
 using System.Text.Json.Serialization;
-using Jellyfin.Common.Tests.Models;
+using Jellyfin.Extensions.Tests.Json.Models;
 using MediaBrowser.Model.Session;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public static class JsonCommaDelimitedIReadOnlyListTests
     {

+ 2 - 2
tests/Jellyfin.Common.Tests/Json/JsonGuidConverterTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonGuidConverterTests.cs

@@ -1,9 +1,9 @@
 using System;
 using System.Text.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonGuidConverterTests
     {

+ 2 - 1
tests/Jellyfin.Model.Tests/Entities/JsonLowerCaseConverterTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonLowerCaseConverterTests.cs

@@ -1,9 +1,10 @@
 using System.Text.Json;
 using System.Text.Json.Serialization;
+using Jellyfin.Extensions.Json.Converters;
 using MediaBrowser.Model.Entities;
 using Xunit;
 
-namespace Jellyfin.Model.Tests.Entities
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonLowerCaseConverterTests
     {

+ 2 - 2
tests/Jellyfin.Common.Tests/Json/JsonNullableGuidConverterTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonNullableGuidConverterTests.cs

@@ -1,9 +1,9 @@
 using System;
 using System.Text.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonNullableGuidConverterTests
     {

+ 3 - 3
tests/Jellyfin.Common.Tests/Json/JsonStringConverterTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonStringConverterTests.cs

@@ -1,8 +1,8 @@
-using System.Text.Json;
-using MediaBrowser.Common.Json.Converters;
+using System.Text.Json;
+using Jellyfin.Extensions.Json.Converters;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonStringConverterTests
     {

+ 3 - 3
tests/Jellyfin.Common.Tests/Json/JsonVersionConverterTests.cs → tests/Jellyfin.Extensions.Tests/Json/Converters/JsonVersionConverterTests.cs

@@ -1,9 +1,9 @@
-using System;
+using System;
 using System.Text.Json;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Json
+namespace Jellyfin.Extensions.Tests.Json.Converters
 {
     public class JsonVersionConverterTests
     {

+ 3 - 3
tests/Jellyfin.Common.Tests/Models/GenericBodyArrayModel.cs → tests/Jellyfin.Extensions.Tests/Json/Models/GenericBodyArrayModel.cs

@@ -1,8 +1,8 @@
-using System.Diagnostics.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
 using System.Text.Json.Serialization;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 
-namespace Jellyfin.Common.Tests.Models
+namespace Jellyfin.Extensions.Tests.Json.Models
 {
     /// <summary>
     /// The generic body model.

+ 3 - 3
tests/Jellyfin.Common.Tests/Models/GenericBodyIReadOnlyListModel.cs → tests/Jellyfin.Extensions.Tests/Json/Models/GenericBodyIReadOnlyListModel.cs

@@ -1,8 +1,8 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Text.Json.Serialization;
-using MediaBrowser.Common.Json.Converters;
+using Jellyfin.Extensions.Json.Converters;
 
-namespace Jellyfin.Common.Tests.Models
+namespace Jellyfin.Extensions.Tests.Json.Models
 {
     /// <summary>
     /// The generic body <c>IReadOnlyList</c> model.

+ 1 - 2
tests/Jellyfin.Common.Tests/Extensions/ShuffleExtensionsTests.cs → tests/Jellyfin.Extensions.Tests/ShuffleExtensionsTests.cs

@@ -1,8 +1,7 @@
 using System;
-using MediaBrowser.Common.Extensions;
 using Xunit;
 
-namespace Jellyfin.Common.Tests.Extensions
+namespace Jellyfin.Extensions.Tests
 {
     public static class ShuffleExtensionsTests
     {

+ 1 - 2
tests/Jellyfin.Controller.Tests/Extensions/StringExtensionsTests.cs → tests/Jellyfin.Extensions.Tests/StringExtensionsTests.cs

@@ -1,8 +1,7 @@
 using System;
-using MediaBrowser.Controller.Extensions;
 using Xunit;
 
-namespace Jellyfin.Controller.Extensions.Tests
+namespace Jellyfin.Extensions.Tests
 {
     public class StringExtensionsTests
     {

+ 1 - 1
tests/Jellyfin.MediaEncoding.Tests/FFprobeParserTests.cs

@@ -1,7 +1,7 @@
 using System.IO;
 using System.Text.Json;
 using System.Threading.Tasks;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.MediaEncoding.Probing;
 using Xunit;
 

+ 1 - 1
tests/Jellyfin.MediaEncoding.Tests/Probing/ProbeResultNormalizerTests.cs

@@ -2,7 +2,7 @@ using System;
 using System.Globalization;
 using System.IO;
 using System.Text.Json;
-using MediaBrowser.Common.Json;
+using Jellyfin.Extensions.Json;
 using MediaBrowser.MediaEncoding.Probing;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.MediaInfo;

Some files were not shown because too many files changed in this diff