diff options
18 files changed, 51 insertions, 35 deletions
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj index 3438cebfb..67f23f055 100644 --- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj +++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj @@ -31,7 +31,7 @@ <PackageReference Include="prometheus-net.DotNetRuntime" Version="3.4.1" /> <PackageReference Include="sharpcompress" Version="0.26.0" /> <PackageReference Include="SQLitePCL.pretty.netstandard" Version="2.1.0" /> - <PackageReference Include="DotNet.Glob" Version="3.1.0" /> + <PackageReference Include="DotNet.Glob" Version="3.1.2" /> </ItemGroup> <ItemGroup> diff --git a/Jellyfin.Data/Jellyfin.Data.csproj b/Jellyfin.Data/Jellyfin.Data.csproj index 572038d00..4fb5594d4 100644 --- a/Jellyfin.Data/Jellyfin.Data.csproj +++ b/Jellyfin.Data/Jellyfin.Data.csproj @@ -1,4 +1,4 @@ -<Project Sdk="Microsoft.NET.Sdk"> +<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net5.0</TargetFramework> diff --git a/Jellyfin.Server/Jellyfin.Server.csproj b/Jellyfin.Server/Jellyfin.Server.csproj index bc000fd45..5940cf938 100644 --- a/Jellyfin.Server/Jellyfin.Server.csproj +++ b/Jellyfin.Server/Jellyfin.Server.csproj @@ -42,8 +42,8 @@ <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="5.0.1" /> <PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="5.0.1" /> - <PackageReference Include="prometheus-net" Version="4.0.0" /> - <PackageReference Include="prometheus-net.AspNetCore" Version="4.0.0" /> + <PackageReference Include="prometheus-net" Version="4.1.1" /> + <PackageReference Include="prometheus-net.AspNetCore" Version="4.1.1" /> <PackageReference Include="Serilog.AspNetCore" Version="3.4.0" /> <PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" /> diff --git a/MediaBrowser.Common/Net/IPNetAddress.cs b/MediaBrowser.Common/Net/IPNetAddress.cs index a6f5fe4b3..5fab52eac 100644 --- a/MediaBrowser.Common/Net/IPNetAddress.cs +++ b/MediaBrowser.Common/Net/IPNetAddress.cs @@ -33,7 +33,7 @@ namespace MediaBrowser.Common.Net /// <summary> /// IP4Loopback address host. /// </summary> - public static readonly IPNetAddress IP4Loopback = IPNetAddress.Parse("127.0.0.1/32"); + public static readonly IPNetAddress IP4Loopback = IPNetAddress.Parse("127.0.0.1/8"); /// <summary> /// IP6Loopback address host. diff --git a/MediaBrowser.Model/MediaBrowser.Model.csproj b/MediaBrowser.Model/MediaBrowser.Model.csproj index 334fe8209..c271a9cf8 100644 --- a/MediaBrowser.Model/MediaBrowser.Model.csproj +++ b/MediaBrowser.Model/MediaBrowser.Model.csproj @@ -1,4 +1,4 @@ -<Project Sdk="Microsoft.NET.Sdk"> +<Project Sdk="Microsoft.NET.Sdk"> <!-- ProjectGuid is only included as a requirement for SonarQube analysis --> <PropertyGroup> diff --git a/MediaBrowser.Model/Providers/ExternalIdInfo.cs b/MediaBrowser.Model/Providers/ExternalIdInfo.cs index 01784554f..afe95e6ee 100644 --- a/MediaBrowser.Model/Providers/ExternalIdInfo.cs +++ b/MediaBrowser.Model/Providers/ExternalIdInfo.cs @@ -6,16 +6,31 @@ namespace MediaBrowser.Model.Providers public class ExternalIdInfo { /// <summary> + /// Represents the external id information for serialization to the client. + /// </summary> + /// <param name="name">Name of the external id provider (IE: IMDB, MusicBrainz, etc).</param> + /// <param name="key">Key for this id. This key should be unique across all providers.</param> + /// <param name="type">Specific media type for this id</param> + /// <param name="urlFormatString">URL format string.</param> + public ExternalIdInfo(string name, string key, ExternalIdMediaType? type, string urlFormatString) + { + Name = name; + Key = key; + Type = type; + UrlFormatString = urlFormatString; + } + + /// <summary> /// Gets or sets the display name of the external id provider (IE: IMDB, MusicBrainz, etc). /// </summary> // TODO: This should be renamed to ProviderName - public string? Name { get; set; } + public string Name { get; set; } /// <summary> /// Gets or sets the unique key for this id. This key should be unique across all providers. /// </summary> // TODO: This property is not actually unique across the concrete types at the moment. It should be updated to be unique. - public string? Key { get; set; } + public string Key { get; set; } /// <summary> /// Gets or sets the specific media type for this id. This is used to distinguish between the different @@ -31,6 +46,6 @@ namespace MediaBrowser.Model.Providers /// <summary> /// Gets or sets the URL format string. /// </summary> - public string? UrlFormatString { get; set; } + public string UrlFormatString { get; set; } } } diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs index a20c47cf2..913f14d9b 100644 --- a/MediaBrowser.Providers/Manager/ProviderManager.cs +++ b/MediaBrowser.Providers/Manager/ProviderManager.cs @@ -960,13 +960,11 @@ namespace MediaBrowser.Providers.Manager public IEnumerable<ExternalIdInfo> GetExternalIdInfos(IHasProviderIds item) { return GetExternalIds(item) - .Select(i => new ExternalIdInfo - { - Name = i.ProviderName, - Key = i.Key, - Type = i.Type, - UrlFormatString = i.UrlFormatString - }); + .Select(i => new ExternalIdInfo( + name: i.ProviderName, + key: i.Key, + type: i.Type, + urlFormatString: i.UrlFormatString)); } /// <inheritdoc/> diff --git a/MediaBrowser.XbmcMetadata/EntryPoint.cs b/MediaBrowser.XbmcMetadata/EntryPoint.cs index 11b36285c..981b7b9d2 100644 --- a/MediaBrowser.XbmcMetadata/EntryPoint.cs +++ b/MediaBrowser.XbmcMetadata/EntryPoint.cs @@ -41,7 +41,7 @@ namespace MediaBrowser.XbmcMetadata return Task.CompletedTask; } - private void OnUserDataSaved(object sender, UserDataSaveEventArgs e) + private void OnUserDataSaved(object? sender, UserDataSaveEventArgs e) { if (e.SaveReason == UserDataSaveReason.PlaybackFinished || e.SaveReason == UserDataSaveReason.TogglePlayed || e.SaveReason == UserDataSaveReason.UpdateUserRating) { diff --git a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj index 87d1e9464..40f06c731 100644 --- a/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj +++ b/MediaBrowser.XbmcMetadata/MediaBrowser.XbmcMetadata.csproj @@ -19,6 +19,7 @@ <GenerateAssemblyInfo>false</GenerateAssemblyInfo> <GenerateDocumentationFile>true</GenerateDocumentationFile> <TreatWarningsAsErrors>true</TreatWarningsAsErrors> + <Nullable>enable</Nullable> </PropertyGroup> <!-- Code Analyzers--> diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index b06464409..c287113c5 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -37,6 +37,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers Logger = logger; _config = config; ProviderManager = providerManager; + _validProviderIds = new Dictionary<string, string>(); } protected CultureInfo UsCulture { get; } = new CultureInfo("en-US"); @@ -72,7 +73,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers throw new ArgumentException("The metadata file was empty or null.", nameof(metadataFile)); } - _validProviderIds = _validProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); + _validProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var idInfos = ProviderManager.GetExternalIdInfos(item.Item); @@ -376,7 +377,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers } return null; - }).Where(i => i.HasValue).Select(i => i.Value).ToArray(); + }).OfType<MetadataField>().ToArray(); } break; @@ -711,10 +712,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers default: string readerName = reader.Name; - if (_validProviderIds.TryGetValue(readerName, out string providerIdValue)) + if (_validProviderIds.TryGetValue(readerName, out string? providerIdValue)) { var id = reader.ReadElementContentAsString(); - if (!string.IsNullOrWhiteSpace(id)) + if (!string.IsNullOrWhiteSpace(providerIdValue) && !string.IsNullOrWhiteSpace(id)) { item.SetProviderId(providerIdValue, id); } diff --git a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs index b74a9fd8a..15a2fb63e 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/MovieNfoParser.cs @@ -39,8 +39,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers { case "id": { - string imdbId = reader.GetAttribute("IMDB"); - string tmdbId = reader.GetAttribute("TMDB"); + string? imdbId = reader.GetAttribute("IMDB"); + string? tmdbId = reader.GetAttribute("TMDB"); if (string.IsNullOrWhiteSpace(imdbId)) { diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs index f079d4a7e..74a724989 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs @@ -40,9 +40,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers { case "id": { - string imdbId = reader.GetAttribute("IMDB"); - string tmdbId = reader.GetAttribute("TMDB"); - string tvdbId = reader.GetAttribute("TVDB"); + string? imdbId = reader.GetAttribute("IMDB"); + string? tmdbId = reader.GetAttribute("TMDB"); + string? tvdbId = reader.GetAttribute("TVDB"); if (string.IsNullOrWhiteSpace(tvdbId)) { diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs index 6ad6c18a5..abd3e78d7 100644 --- a/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs @@ -74,6 +74,6 @@ namespace MediaBrowser.XbmcMetadata.Providers protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken); - protected abstract FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService); + protected abstract FileSystemMetadata? GetXmlFile(ItemInfo info, IDirectoryService directoryService); } } diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs index 2b1589d47..e7aa3ca07 100644 --- a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs +++ b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs @@ -50,7 +50,7 @@ namespace MediaBrowser.XbmcMetadata.Providers } /// <inheritdoc /> - protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) + protected override FileSystemMetadata? GetXmlFile(ItemInfo info, IDirectoryService directoryService) { return MovieNfoSaver.GetMovieSavePaths(info) .Select(directoryService.GetFile) diff --git a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs index d8230d188..1adc5029d 100644 --- a/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs @@ -200,7 +200,8 @@ namespace MediaBrowser.XbmcMetadata.Savers private void SaveToFile(Stream stream, string path) { - Directory.CreateDirectory(Path.GetDirectoryName(path)); + var directory = Path.GetDirectoryName(path) ?? throw new ArgumentException($"Provided path ({path}) is not valid.", nameof(path)); + Directory.CreateDirectory(directory); // On Windows, savint the file will fail if the file is hidden or readonly FileSystem.SetAttributes(path, false, false); diff --git a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs index dca796415..841121735 100644 --- a/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs +++ b/MediaBrowser.XbmcMetadata/Savers/MovieNfoSaver.cs @@ -41,7 +41,7 @@ namespace MediaBrowser.XbmcMetadata.Savers /// <inheritdoc /> protected override string GetLocalSavePath(BaseItem item) - => GetMovieSavePaths(new ItemInfo(item)).FirstOrDefault(); + => GetMovieSavePaths(new ItemInfo(item)).FirstOrDefault() ?? Path.ChangeExtension(item.Path, ".nfo"); internal static IEnumerable<string> GetMovieSavePaths(ItemInfo item) { diff --git a/tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj b/tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj index b5e8e521c..45c93987b 100644 --- a/tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj +++ b/tests/Jellyfin.Api.Tests/Jellyfin.Api.Tests.csproj @@ -13,9 +13,9 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="AutoFixture" Version="4.14.0" /> - <PackageReference Include="AutoFixture.AutoMoq" Version="4.14.0" /> - <PackageReference Include="AutoFixture.Xunit2" Version="4.14.0" /> + <PackageReference Include="AutoFixture" Version="4.15.0" /> + <PackageReference Include="AutoFixture.AutoMoq" Version="4.15.0" /> + <PackageReference Include="AutoFixture.Xunit2" Version="4.15.0" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="5.0.1" /> <PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" /> diff --git a/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj b/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj index bcd12deaf..80259a55f 100644 --- a/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj +++ b/tests/Jellyfin.Server.Implementations.Tests/Jellyfin.Server.Implementations.Tests.csproj @@ -14,8 +14,8 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="AutoFixture" Version="4.14.0" /> - <PackageReference Include="AutoFixture.AutoMoq" Version="4.14.0" /> + <PackageReference Include="AutoFixture" Version="4.15.0" /> + <PackageReference Include="AutoFixture.AutoMoq" Version="4.15.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" /> <PackageReference Include="Moq" Version="4.15.2" /> <PackageReference Include="xunit" Version="2.4.1" /> |
