Fix some warnings

* Add analyzers to MediaBrowser.XbmcMetadata
* Enable TreatWarningsAsErrors for MediaBrowser.XbmcMetadata
* Add analyzers to MediaBrowser.WebDashboard
* Enable TreatWarningsAsErrors for MediaBrowser.WebDashboard
* Disable SA1600 in favor of CS1591
This commit is contained in:
Bond_009
2020-02-23 12:11:43 +01:00
parent 72c98e41ca
commit 07cc4be6a7
463 changed files with 532 additions and 628 deletions

View File

@@ -0,0 +1,15 @@
#pragma warning disable CS1591
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.XbmcMetadata.Configuration
{
public static class NfoConfigurationExtension
{
public static XbmcMetadataOptions GetNfoConfiguration(this IConfigurationManager manager)
{
return manager.GetConfiguration<XbmcMetadataOptions>("xbmcmetadata");
}
}
}

View File

@@ -1,10 +1,12 @@
#pragma warning disable CS1591
using System.Collections.Generic;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.XbmcMetadata.Configuration
{
public class ConfigurationFactory : IConfigurationFactory
public class NfoConfigurationFactory : IConfigurationFactory
{
/// <inheritdoc />
public IEnumerable<ConfigurationStore> GetConfigurations()
@@ -19,12 +21,4 @@ namespace MediaBrowser.XbmcMetadata.Configuration
};
}
}
public static class ConfigurationExtension
{
public static XbmcMetadataOptions GetNfoConfiguration(this IConfigurationManager manager)
{
return manager.GetConfiguration<XbmcMetadataOptions>("xbmcmetadata");
}
}
}

View File

@@ -1,3 +1,5 @@
#pragma warning disable CS1591
using System;
using System.Threading.Tasks;
using MediaBrowser.Common.Configuration;
@@ -12,7 +14,7 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata
{
public class EntryPoint : IServerEntryPoint
public sealed class EntryPoint : IServerEntryPoint
{
private readonly IUserDataManager _userDataManager;
private readonly ILogger _logger;

View File

@@ -13,6 +13,19 @@
<TargetFramework>netstandard2.1</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<!-- Code Analyzers-->
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
<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>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
</Project>

View File

@@ -1,3 +1,5 @@
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -27,6 +29,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
/// <summary>
/// Initializes a new instance of the <see cref="BaseNfoParser{T}" /> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public BaseNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
{
Logger = logger;
@@ -48,13 +53,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
protected virtual string MovieDbParserSearchString => "themoviedb.org/movie/";
/// <summary>
/// Fetches metadata for an item from one xml file
/// Fetches metadata for an item from one xml file.
/// </summary>
/// <param name="item">The item.</param>
/// <param name="metadataFile">The metadata file.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <exception cref="ArgumentNullException">
/// </exception>
/// <exception cref="ArgumentNullException"><c>item</c> is <c>null</c>.</exception>
/// <exception cref="ArgumentException"><c>metadataFile</c> is <c>null</c> or empty.</exception>
public void Fetch(MetadataResult<T> item, string metadataFile, CancellationToken cancellationToken)
{
if (item == null)
@@ -80,7 +85,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
}
//Additional Mappings
// Additional Mappings
_validProviderIds.Add("collectionnumber", "TmdbCollection");
_validProviderIds.Add("tmdbcolid", "TmdbCollection");
_validProviderIds.Add("imdb_id", "Imdb");
@@ -123,6 +128,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
}
}
return;
}
@@ -196,14 +202,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
catch (XmlException)
{
}
}
}
protected void ParseProviderLinks(T item, string xml)
{
//Look for a match for the Regex pattern "tt" followed by 7 digits
// Look for a match for the Regex pattern "tt" followed by 7 digits
var m = Regex.Match(xml, @"tt([0-9]{7})", RegexOptions.IgnoreCase);
if (m.Success)
{
@@ -267,6 +272,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
Logger.LogWarning("Invalid Added value found: " + val);
}
}
break;
}
@@ -278,6 +284,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.OriginalTitle = val;
}
break;
}
@@ -309,6 +316,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.ForcedSortName = val;
}
break;
}
@@ -358,7 +366,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
return null;
}).Where(i => i.HasValue).Select(i => i.Value).ToArray();
}
@@ -373,6 +380,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.Tagline = val;
}
break;
}
@@ -387,6 +395,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
.Where(i => !string.IsNullOrWhiteSpace(i))
.ToArray();
}
break;
}
@@ -398,6 +407,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.OfficialRating = rating;
}
break;
}
@@ -409,6 +419,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.CustomRating = val;
}
break;
}
@@ -423,6 +434,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
}
}
break;
}
@@ -435,6 +447,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
hasAspectRatio.AspectRatio = val;
}
break;
}
@@ -446,6 +459,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
}
break;
}
@@ -455,16 +469,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (!string.IsNullOrWhiteSpace(val))
{
//var parts = val.Split('/')
// .Select(i => i.Trim())
// .Where(i => !string.IsNullOrWhiteSpace(i));
//foreach (var p in parts)
//{
// item.AddStudio(p);
//}
item.AddStudio(val);
}
break;
}
@@ -477,10 +484,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
itemResult.AddPerson(p);
}
break;
}
case "credits":
{
var val = reader.ReadElementContentAsString();
@@ -496,9 +506,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
itemResult.AddPerson(p);
}
}
break;
}
@@ -511,8 +523,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
continue;
}
itemResult.AddPerson(p);
}
break;
}
@@ -534,6 +548,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
reader.Read();
}
break;
}
@@ -547,6 +562,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.AddTrailerUrl(val);
}
break;
}
@@ -562,6 +578,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
hasDisplayOrder.DisplayOrder = val;
}
}
break;
}
@@ -582,7 +599,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
case "rating":
{
var rating = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(rating))
@@ -593,6 +609,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.CommunityRating = val;
}
}
break;
}
@@ -649,6 +666,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.AddGenre(p);
}
}
break;
}
@@ -660,6 +678,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.AddTag(val);
}
break;
}
@@ -676,6 +695,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
reader.Read();
}
break;
}
@@ -693,6 +713,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
reader.Skip();
}
break;
}
}
@@ -716,10 +737,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
reader.Read();
continue;
}
using (var subtree = reader.ReadSubtree())
{
FetchFromStreamDetailsNode(subtree, item);
}
break;
}
@@ -754,10 +777,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
reader.Read();
continue;
}
using (var subtree = reader.ReadSubtree())
{
FetchFromVideoNode(subtree, item);
}
break;
}
@@ -814,6 +839,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
video.Video3DFormat = Video3DFormat.MVC;
}
}
break;
}
@@ -863,8 +889,10 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
role = val;
}
break;
}
case "sortorder":
{
var val = reader.ReadElementContentAsString();
@@ -876,6 +904,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
sortOrder = intVal;
}
}
break;
}
@@ -909,7 +938,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
};
/// <summary>
/// Used to split names of comma or pipe delimeted genres and people
/// Used to split names of comma or pipe delimeted genres and people.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>IEnumerable{System.String}.</returns>
@@ -919,7 +948,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
// Only split by comma if there is no pipe in the string
// We have to be careful to not split names like Matthew, Jr.
var separator = value.IndexOf('|') == -1 && value.IndexOf(';') == -1 ? new[] { ',' } : new[] { '|', ';' };
var separator = value.IndexOf('|', StringComparison.Ordinal) == -1 && value.IndexOf(';', StringComparison.Ordinal) == -1
? new[] { ',' }
: new[] { '|', ';' };
value = value.Trim().Trim(separator);

View File

@@ -11,8 +11,17 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Parsers
{
/// <summary>
/// Nfo parser for episodes.
/// </summary>
public class EpisodeNfoParser : BaseNfoParser<Episode>
{
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeNfoParser"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public EpisodeNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(logger, config, providerManager)
{
@@ -63,7 +72,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
catch (XmlException)
{
}
}
}
@@ -86,6 +94,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.ParentIndexNumber = num;
}
}
break;
}
@@ -100,6 +109,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.IndexNumber = num;
}
}
break;
}
@@ -114,6 +124,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.IndexNumberEnd = num;
}
}
break;
}
@@ -197,7 +208,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break;
}
default:
base.FetchDataFromXmlNode(reader, itemResult);
break;

View File

@@ -11,8 +11,17 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Parsers
{
/// <summary>
/// Nfo parser for movies.
/// </summary>
public class MovieNfoParser : BaseNfoParser<Video>
{
/// <summary>
/// Initializes a new instance of the <see cref="MovieNfoParser"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public MovieNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(logger, config, providerManager)
{
@@ -50,6 +59,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break;
}
case "set":
{
var movie = item as Movie;
@@ -65,7 +75,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
if (!string.IsNullOrWhiteSpace(val) && movie != null)
{
// TODO Handle this better later
if (val.IndexOf('<') == -1)
if (val.IndexOf('<', StringComparison.Ordinal) == -1)
{
movie.CollectionName = val;
}
@@ -119,9 +129,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
private void ParseSetXml(string xml, Movie movie)
{
//xml = xml.Substring(xml.IndexOf('<'));
//xml = xml.Substring(0, xml.LastIndexOf('>'));
// These are not going to be valid xml so no sense in causing the provider to fail and spamming the log with exceptions
try
{
@@ -155,7 +162,6 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
catch (XmlException)
{
}
}
}

View File

@@ -7,8 +7,17 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Parsers
{
/// <summary>
/// Nfo parser for seasons.
/// </summary>
public class SeasonNfoParser : BaseNfoParser<Season>
{
/// <summary>
/// Initializes a new instance of the <see cref="SeasonNfoParser"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public SeasonNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(logger, config, providerManager)
{
@@ -32,6 +41,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
item.IndexNumber = num;
}
}
break;
}

View File

@@ -9,8 +9,17 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Parsers
{
/// <summary>
/// Nfo parser for series.
/// </summary>
public class SeriesNfoParser : BaseNfoParser<Series>
{
/// <summary>
/// Initializes a new instance of the <see cref="SeriesNfoParser"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public SeriesNfoParser(ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(logger, config, providerManager)
{
@@ -39,20 +48,25 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
tvdbId = reader.ReadElementContentAsString();
}
if (!string.IsNullOrWhiteSpace(imdbId))
{
item.SetProviderId(MetadataProviders.Imdb, imdbId);
}
if (!string.IsNullOrWhiteSpace(tmdbId))
{
item.SetProviderId(MetadataProviders.Tmdb, tmdbId);
}
if (!string.IsNullOrWhiteSpace(tvdbId))
{
item.SetProviderId(MetadataProviders.Tvdb, tvdbId);
}
break;
}
case "airs_dayofweek":
{
item.AirDays = TVUtils.GetAirDays(reader.ReadElementContentAsString());
@@ -67,6 +81,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
item.AirTime = val;
}
break;
}

View File

@@ -9,13 +9,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for albums.
/// </summary>
public class AlbumNfoProvider : BaseNfoProvider<MusicAlbum>
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
public AlbumNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
/// <summary>
/// Initializes a new instance of the <see cref="AlbumNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public AlbumNfoProvider(
ILogger<AlbumNfoProvider> logger,
IFileSystem fileSystem,
IConfigurationManager config,
IProviderManager providerManager)
: base(fileSystem)
{
_logger = logger;

View File

@@ -9,12 +9,22 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for artists.
/// </summary>
public class ArtistNfoProvider : BaseNfoProvider<MusicArtist>
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
/// <summary>
/// Initializes a new instance of the <see cref="ArtistNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public ArtistNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(fileSystem)
{

View File

@@ -1,3 +1,5 @@
#pragma warning disable CS1591
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -18,6 +20,9 @@ namespace MediaBrowser.XbmcMetadata.Providers
_fileSystem = fileSystem;
}
/// <inheritdoc />
public string Name => BaseNfoSaver.SaverName;
/// <inheritdoc />
public Task<MetadataResult<T>> GetMetadata(
ItemInfo info,
@@ -54,12 +59,6 @@ namespace MediaBrowser.XbmcMetadata.Providers
return Task.FromResult(result);
}
/// <inheritdoc />
protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
/// <inheritdoc />
protected abstract FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService);
/// <inheritdoc />
public bool HasChanged(BaseItem item, IDirectoryService directoryService)
{
@@ -73,6 +72,8 @@ namespace MediaBrowser.XbmcMetadata.Providers
return file.Exists && _fileSystem.GetLastWriteTimeUtc(file) > item.DateLastSaved;
}
public string Name => BaseNfoSaver.SaverName;
protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
protected abstract FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService);
}
}

View File

@@ -1,3 +1,5 @@
#pragma warning disable CS1591
using System.Linq;
using System.Threading;
using MediaBrowser.Common.Configuration;
@@ -10,14 +12,18 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
public class BaseVideoNfoProvider<T> : BaseNfoProvider<T>
public abstract class BaseVideoNfoProvider<T> : BaseNfoProvider<T>
where T : Video, new()
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
public BaseVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
public BaseVideoNfoProvider(
ILogger logger,
IFileSystem fileSystem,
IConfigurationManager config,
IProviderManager providerManager)
: base(fileSystem)
{
_logger = logger;

View File

@@ -9,13 +9,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for episodes.
/// </summary>
public class EpisodeNfoProvider : BaseNfoProvider<Episode>
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
public EpisodeNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public EpisodeNfoProvider(
ILogger<EpisodeNfoProvider> logger,
IFileSystem fileSystem,
IConfigurationManager config,
IProviderManager providerManager)
: base(fileSystem)
{
_logger = logger;

View File

@@ -1,5 +1,4 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
@@ -7,26 +6,20 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for movies.
/// </summary>
public class MovieNfoProvider : BaseVideoNfoProvider<Movie>
{
public MovieNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(fileSystem, logger, config, providerManager)
{
}
}
public class MusicVideoNfoProvider : BaseVideoNfoProvider<MusicVideo>
{
public MusicVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(fileSystem, logger, config, providerManager)
{
}
}
public class VideoNfoProvider : BaseVideoNfoProvider<Video>
{
public VideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
: base(fileSystem, logger, config, providerManager)
/// <summary>
/// Initializes a new instance of the <see cref="MovieNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public MovieNfoProvider(ILogger<MovieNfoProvider> logger, IFileSystem fileSystem, IConfigurationManager config, IProviderManager providerManager)
: base(logger, fileSystem, config, providerManager)
{
}
}

View File

@@ -0,0 +1,26 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for music videos.
/// </summary>
public class MusicVideoNfoProvider : BaseVideoNfoProvider<MusicVideo>
{
/// <summary>
/// Initializes a new instance of the <see cref="MusicVideoNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public MusicVideoNfoProvider(ILogger<MusicVideoNfoProvider> logger, IFileSystem fileSystem, IConfigurationManager config, IProviderManager providerManager)
: base(logger, fileSystem, config, providerManager)
{
}
}
}

View File

@@ -9,13 +9,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for seasons.
/// </summary>
public class SeasonNfoProvider : BaseNfoProvider<Season>
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
public SeasonNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
/// <summary>
/// Initializes a new instance of the <see cref="SeasonNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public SeasonNfoProvider(
ILogger logger,
IFileSystem fileSystem,
IConfigurationManager config,
IProviderManager providerManager)
: base(fileSystem)
{
_logger = logger;
@@ -34,4 +48,3 @@ namespace MediaBrowser.XbmcMetadata.Providers
=> directoryService.GetFile(Path.Combine(info.Path, "season.nfo"));
}
}

View File

@@ -9,13 +9,23 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for series.
/// </summary>
public class SeriesNfoProvider : BaseNfoProvider<Series>
{
private readonly ILogger _logger;
private readonly IConfigurationManager _config;
private readonly IProviderManager _providerManager;
public SeriesNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config, IProviderManager providerManager)
/// <summary>
/// Initializes a new instance of the <see cref="SeriesNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public SeriesNfoProvider(ILogger<SeriesNfoProvider> logger, IFileSystem fileSystem, IConfigurationManager config, IProviderManager providerManager)
: base(fileSystem)
{
_logger = logger;

View File

@@ -0,0 +1,26 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.IO;
using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Providers
{
/// <summary>
/// Nfo provider for videos.
/// </summary>
public class VideoNfoProvider : BaseVideoNfoProvider<Video>
{
/// <summary>
/// Initializes a new instance of the <see cref="VideoNfoProvider"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="fileSystem">The file system.</param>
/// <param name="config">the configuration manager.</param>
/// <param name="providerManager">The provider manager.</param>
public VideoNfoProvider(ILogger<VideoNfoProvider> logger, IFileSystem fileSystem, IConfigurationManager config, IProviderManager providerManager)
: base(logger, fileSystem, config, providerManager)
{
}
}
}

View File

@@ -13,15 +13,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for albums.
/// </summary>
public class AlbumNfoSaver : BaseNfoSaver
{
/// <summary>
/// Initializes a new instance of the <see cref="AlbumNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public AlbumNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataManager,
ILogger logger)
ILogger<AlbumNfoSaver> logger)
: base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
{
}
@@ -74,7 +86,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (track.RunTimeTicks.HasValue)
{
var time = TimeSpan.FromTicks(track.RunTimeTicks.Value).ToString(@"mm\:ss");
var time = TimeSpan.FromTicks(track.RunTimeTicks.Value).ToString(@"mm\:ss", CultureInfo.InvariantCulture);
writer.WriteElementString("duration", time);
}

View File

@@ -12,9 +12,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for artsist.
/// </summary>
public class ArtistNfoSaver : BaseNfoSaver
{
public ArtistNfoSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger)
/// <summary>
/// Initializes a new instance of the <see cref="ArtistNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public ArtistNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataManager,
ILogger<ArtistNfoSaver> logger)
: base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
{
}
@@ -40,7 +58,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
var formatString = ConfigurationManager.GetNfoConfiguration().ReleaseDateFormat;
writer.WriteElementString("disbanded", artist.EndDate.Value.ToLocalTime().ToString(formatString));
writer.WriteElementString("disbanded", artist.EndDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
}
var albums = artist

View File

@@ -1,3 +1,5 @@
#pragma warning disable CS1591
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -28,6 +30,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
public const string YouTubeWatchUrl = "https://www.youtube.com/watch?v=";
// filters control characters but allows only properly-formed surrogate sequences
private const string _invalidXMLCharsRegex = @"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]";
private static readonly HashSet<string> _commonTags = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
"plot",
@@ -94,9 +99,6 @@ namespace MediaBrowser.XbmcMetadata.Savers
"countrycode"
};
// filters control characters but allows only properly-formed surrogate sequences
private const string _invalidXMLCharsRegex = @"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]";
protected BaseNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
@@ -247,7 +249,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (baseItem != null)
{
AddCommonNodes(baseItem, writer, LibraryManager, UserManager, UserDataManager, FileSystem, ConfigurationManager);
AddCommonNodes(baseItem, writer, LibraryManager, UserManager, UserDataManager, ConfigurationManager);
}
WriteCustomElements(item, writer);
@@ -265,11 +267,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
catch (FileNotFoundException)
{
}
catch (IOException)
{
}
catch (XmlException ex)
{
@@ -364,8 +364,8 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString("samplingrate", stream.SampleRate.Value.ToString(CultureInfo.InvariantCulture));
}
writer.WriteElementString("default", stream.IsDefault.ToString());
writer.WriteElementString("forced", stream.IsForced.ToString());
writer.WriteElementString("default", stream.IsDefault.ToString(CultureInfo.InvariantCulture));
writer.WriteElementString("forced", stream.IsForced.ToString(CultureInfo.InvariantCulture));
if (stream.Type == MediaStreamType.Video)
{
@@ -384,7 +384,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (item is Video video)
{
//AddChapters(video, builder, itemRepository);
// AddChapters(video, builder, itemRepository);
if (video.Video3DFormat.HasValue)
{
@@ -420,21 +420,19 @@ namespace MediaBrowser.XbmcMetadata.Savers
/// <summary>
/// Adds the common nodes.
/// </summary>
/// <returns>Task.</returns>
private void AddCommonNodes(
BaseItem item,
XmlWriter writer,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataRepo,
IFileSystem fileSystem,
IServerConfigurationManager config)
{
var writtenProviderIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
var overview = (item.Overview ?? string.Empty)
.StripHtml()
.Replace("&quot;", "'");
.Replace("&quot;", "'", StringComparison.Ordinal);
var options = config.GetNfoConfiguration();
@@ -455,7 +453,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
var outline = (item.Tagline ?? string.Empty)
.StripHtml()
.Replace("&quot;", "'");
.Replace("&quot;", "'", StringComparison.Ordinal);
writer.WriteElementString("outline", outline);
}
@@ -476,7 +474,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString("lockedfields", string.Join("|", item.LockedFields));
}
writer.WriteElementString("dateadded", item.DateCreated.ToLocalTime().ToString(DateAddedFormat));
writer.WriteElementString("dateadded", item.DateCreated.ToLocalTime().ToString(DateAddedFormat, CultureInfo.InvariantCulture));
writer.WriteElementString("title", item.Name ?? string.Empty);
@@ -590,6 +588,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString("language", item.PreferredMetadataLanguage);
}
if (!string.IsNullOrEmpty(item.PreferredMetadataCountryCode))
{
writer.WriteElementString("countrycode", item.PreferredMetadataCountryCode);
@@ -603,16 +602,16 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString(
"formed",
item.PremiereDate.Value.ToLocalTime().ToString(formatString));
item.PremiereDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
}
else
{
writer.WriteElementString(
"premiered",
item.PremiereDate.Value.ToLocalTime().ToString(formatString));
item.PremiereDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
writer.WriteElementString(
"releasedate",
item.PremiereDate.Value.ToLocalTime().ToString(formatString));
item.PremiereDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
}
}
@@ -624,7 +623,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteElementString(
"enddate",
item.EndDate.Value.ToLocalTime().ToString(formatString));
item.EndDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
}
}
@@ -780,12 +779,12 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (options.SaveImagePathsInNfo)
{
AddImages(item, writer, libraryManager, config);
AddImages(item, writer, libraryManager);
}
AddUserData(item, writer, userManager, userDataRepo, options);
AddActors(people, writer, libraryManager, fileSystem, config, options.SaveImagePathsInNfo);
AddActors(people, writer, libraryManager, options.SaveImagePathsInNfo);
if (item is BoxSet folder)
{
@@ -828,7 +827,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
return url.Replace(YouTubeWatchUrl, "plugin://plugin.video.youtube/?action=play_video&videoid=", StringComparison.OrdinalIgnoreCase);
}
private void AddImages(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IServerConfigurationManager config)
private void AddImages(BaseItem item, XmlWriter writer, ILibraryManager libraryManager)
{
writer.WriteStartElement("art");
@@ -836,12 +835,12 @@ namespace MediaBrowser.XbmcMetadata.Savers
if (image != null)
{
writer.WriteElementString("poster", GetImagePathToSave(image, libraryManager, config));
writer.WriteElementString("poster", GetImagePathToSave(image, libraryManager));
}
foreach (var backdrop in item.GetImages(ImageType.Backdrop))
{
writer.WriteElementString("fanart", GetImagePathToSave(backdrop, libraryManager, config));
writer.WriteElementString("fanart", GetImagePathToSave(backdrop, libraryManager));
}
writer.WriteEndElement();
@@ -893,7 +892,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString(
"lastplayed",
userdata.LastPlayedDate.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss").ToLowerInvariant());
userdata.LastPlayedDate.Value.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).ToLowerInvariant());
}
writer.WriteStartElement("resume");
@@ -911,7 +910,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
writer.WriteEndElement();
}
private void AddActors(List<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, IFileSystem fileSystem, IServerConfigurationManager config, bool saveImagePath)
private void AddActors(List<PersonInfo> people, XmlWriter writer, ILibraryManager libraryManager, bool saveImagePath)
{
foreach (var person in people)
{
@@ -953,7 +952,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString(
"thumb",
GetImagePathToSave(image, libraryManager, config));
GetImagePathToSave(image, libraryManager));
}
}
@@ -961,7 +960,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
}
private string GetImagePathToSave(ItemImageInfo image, ILibraryManager libraryManager, IServerConfigurationManager config)
private string GetImagePathToSave(ItemImageInfo image, ILibraryManager libraryManager)
{
if (!image.IsLocalFile)
{

View File

@@ -12,15 +12,33 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for episodes.
/// </summary>
public class EpisodeNfoSaver : BaseNfoSaver
{
public EpisodeNfoSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger)
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
/// <summary>
/// Initializes a new instance of the <see cref="EpisodeNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public EpisodeNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataManager,
ILogger<EpisodeNfoSaver> logger)
: base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
{
}
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
/// <inheritdoc />
protected override string GetLocalSavePath(BaseItem item)
=> Path.ChangeExtension(item.Path, ".nfo");
@@ -57,7 +75,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
var formatString = ConfigurationManager.GetNfoConfiguration().ReleaseDateFormat;
writer.WriteElementString("aired", episode.PremiereDate.Value.ToLocalTime().ToString(formatString));
writer.WriteElementString("aired", episode.PremiereDate.Value.ToLocalTime().ToString(formatString, CultureInfo.InvariantCulture));
}
if (!episode.ParentIndexNumber.HasValue || episode.ParentIndexNumber.Value == 0)

View File

@@ -14,9 +14,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for movies.
/// </summary>
public class MovieNfoSaver : BaseNfoSaver
{
public MovieNfoSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger)
/// <summary>
/// Initializes a new instance of the <see cref="MovieNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public MovieNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataManager,
ILogger<MovieNfoSaver> logger)
: base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
{
}
@@ -25,7 +43,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
protected override string GetLocalSavePath(BaseItem item)
=> GetMovieSavePaths(new ItemInfo(item)).FirstOrDefault();
public static IEnumerable<string> GetMovieSavePaths(ItemInfo item)
internal static IEnumerable<string> GetMovieSavePaths(ItemInfo item)
{
if (item.VideoType == VideoType.Dvd && !item.IsPlaceHolder)
{
@@ -42,13 +60,6 @@ namespace MediaBrowser.XbmcMetadata.Savers
}
else
{
// http://kodi.wiki/view/NFO_files/Movies
// movie.nfo will override all and any .nfo files in the same folder as the media files if you use the "Use foldernames for lookups" setting. If you don't, then moviename.nfo is used
//if (!item.IsInMixedFolder && item.ItemType == typeof(Movie))
//{
// list.Add(Path.Combine(item.ContainingFolderPath, "movie.nfo"));
//}
yield return Path.ChangeExtension(item.Path, ".nfo");
if (!item.IsInMixedFolder)
@@ -95,6 +106,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
{
writer.WriteElementString("artist", artist);
}
if (!string.IsNullOrEmpty(musicVideo.Album))
{
writer.WriteElementString("album", musicVideo.Album);

View File

@@ -11,15 +11,27 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for seasons.
/// </summary>
public class SeasonNfoSaver : BaseNfoSaver
{
/// <summary>
/// Initializes a new instance of the <see cref="SeasonNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public SeasonNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
ILibraryManager libraryManager,
IUserManager userManager,
IUserDataManager userDataManager,
ILogger logger)
ILogger<SeasonNfoSaver> logger)
: base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
{
}

View File

@@ -12,8 +12,20 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.XbmcMetadata.Savers
{
/// <summary>
/// Nfo saver for series.
/// </summary>
public class SeriesNfoSaver : BaseNfoSaver
{
/// <summary>
/// Initializes a new instance of the <see cref="SeriesNfoSaver"/> class.
/// </summary>
/// <param name="fileSystem">The file system.</param>
/// <param name="configurationManager">the server configuration manager.</param>
/// <param name="libraryManager">The library manager.</param>
/// <param name="userManager">The user manager.</param>
/// <param name="userDataManager">The user data manager.</param>
/// <param name="logger">The logger.</param>
public SeriesNfoSaver(
IFileSystem fileSystem,
IServerConfigurationManager configurationManager,
@@ -56,7 +68,7 @@ namespace MediaBrowser.XbmcMetadata.Savers
: language;
writer.WriteStartElement("url");
writer.WriteAttributeString("cache", string.Format("{0}.xml", tvdb));
writer.WriteAttributeString("cache", tvdb + ".xml");
writer.WriteString(
string.Format(
CultureInfo.InvariantCulture,