aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBond-009 <bond.009@outlook.com>2020-06-17 18:07:59 +0200
committerGitHub <noreply@github.com>2020-06-17 18:07:59 +0200
commitfbefddbb816319a77bdf96d1c2216609bef13081 (patch)
tree6e5ca373c100bad498eaa7cf9d68e25a857978d0
parentfde63e16cb4fc5db355833eb8623375c553a678e (diff)
parent8604b712bde8ae670f6007301f46bdb1b75f4a14 (diff)
Merge pull request #3334 from crobibero/warning-local-metadata
Remove warnings from MediaBrowser.LocalMetadata
-rw-r--r--MediaBrowser.LocalMetadata/BaseXmlProvider.cs63
-rw-r--r--MediaBrowser.LocalMetadata/Images/CollectionFolderLocalImageProvider.cs (renamed from MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs)19
-rw-r--r--MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs28
-rw-r--r--MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs20
-rw-r--r--MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs146
-rw-r--r--MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj22
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs1095
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs55
-rw-r--r--MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs63
-rw-r--r--MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs8
-rw-r--r--MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs13
-rw-r--r--MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs109
-rw-r--r--MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs25
-rw-r--r--MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs34
-rw-r--r--MediaBrowser.LocalMetadata/XmlProviderUtils.cs13
15 files changed, 964 insertions, 749 deletions
diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
index 4770d2bee..b036a2cc8 100644
--- a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs
@@ -7,12 +7,43 @@ using MediaBrowser.Model.IO;
namespace MediaBrowser.LocalMetadata
{
+ /// <summary>
+ /// The BaseXmlProvider.
+ /// </summary>
+ /// <typeparam name="T">Type of provider.</typeparam>
public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasItemChangeMonitor, IHasOrder
where T : BaseItem, new()
{
- protected IFileSystem FileSystem;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BaseXmlProvider{T}"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ protected BaseXmlProvider(IFileSystem fileSystem)
+ {
+ this.FileSystem = fileSystem;
+ }
+
+ /// <inheritdoc />
+ public string Name => XmlProviderUtils.Name;
- public Task<MetadataResult<T>> GetMetadata(ItemInfo info,
+ /// After Nfo
+ /// <inheritdoc />
+ public virtual int Order => 1;
+
+ /// <summary>
+ /// Gets the IFileSystem.
+ /// </summary>
+ protected IFileSystem FileSystem { get; }
+
+ /// <summary>
+ /// Gets metadata for item.
+ /// </summary>
+ /// <param name="info">The item info.</param>
+ /// <param name="directoryService">Instance of the <see cref="IDirectoryService"/> interface.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>The metadata for item.</returns>
+ public Task<MetadataResult<T>> GetMetadata(
+ ItemInfo info,
IDirectoryService directoryService,
CancellationToken cancellationToken)
{
@@ -46,15 +77,23 @@ namespace MediaBrowser.LocalMetadata
return Task.FromResult(result);
}
+ /// <summary>
+ /// Get metadata from path.
+ /// </summary>
+ /// <param name="result">Resulting metadata.</param>
+ /// <param name="path">The path.</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
- protected BaseXmlProvider(IFileSystem fileSystem)
- {
- FileSystem = fileSystem;
- }
-
+ /// <summary>
+ /// Get metadata from xml file.
+ /// </summary>
+ /// <param name="info">Item inf.</param>
+ /// <param name="directoryService">Instance of the <see cref="IDirectoryService"/> interface.</param>
+ /// <returns>The file system metadata.</returns>
protected abstract FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService);
+ /// <inheritdoc />
public bool HasChanged(BaseItem item, IDirectoryService directoryService)
{
var file = GetXmlFile(new ItemInfo(item), directoryService);
@@ -66,15 +105,5 @@ namespace MediaBrowser.LocalMetadata
return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > item.DateLastSaved;
}
-
- public string Name => XmlProviderUtils.Name;
-
- // After Nfo
- public virtual int Order => 1;
- }
-
- static class XmlProviderUtils
- {
- public static string Name => "Emby Xml";
}
}
diff --git a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/CollectionFolderLocalImageProvider.cs
index 3bab1243c..556bb6a0e 100644
--- a/MediaBrowser.LocalMetadata/Images/CollectionFolderImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/CollectionFolderLocalImageProvider.cs
@@ -5,30 +5,41 @@ using MediaBrowser.Model.IO;
namespace MediaBrowser.LocalMetadata.Images
{
+ /// <summary>
+ /// Collection folder local image provider.
+ /// </summary>
public class CollectionFolderLocalImageProvider : ILocalImageProvider, IHasOrder
{
private readonly IFileSystem _fileSystem;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="CollectionFolderLocalImageProvider"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
public CollectionFolderLocalImageProvider(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
+ /// <inheritdoc />
public string Name => "Collection Folder Images";
+ /// Run after LocalImageProvider
+ /// <inheritdoc />
+ public int Order => 1;
+
+ /// <inheritdoc />
public bool Supports(BaseItem item)
{
return item is CollectionFolder && item.SupportsLocalMetadata;
}
- // Run after LocalImageProvider
- public int Order => 1;
-
+ /// <inheritdoc />
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var collectionFolder = (CollectionFolder)item;
- return new LocalImageProvider(_fileSystem).GetImages(item, collectionFolder.PhysicalLocations, true, directoryService);
+ return new LocalImageProvider(_fileSystem).GetImages(item, collectionFolder.PhysicalLocations, directoryService);
}
}
}
diff --git a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
index 9d23d80b8..393ad2efb 100644
--- a/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/EpisodeLocalImageProvider.cs
@@ -10,24 +10,35 @@ using MediaBrowser.Model.IO;
namespace MediaBrowser.LocalMetadata.Images
{
- public class EpisodeLocalLocalImageProvider : ILocalImageProvider, IHasOrder
+ /// <summary>
+ /// Episode local image provider.
+ /// </summary>
+ public class EpisodeLocalImageProvider : ILocalImageProvider, IHasOrder
{
private readonly IFileSystem _fileSystem;
- public EpisodeLocalLocalImageProvider(IFileSystem fileSystem)
+ /// <summary>
+ /// Initializes a new instance of the <see cref="EpisodeLocalImageProvider"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ public EpisodeLocalImageProvider(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
+ /// <inheritdoc />
public string Name => "Local Images";
+ /// <inheritdoc />
public int Order => 0;
+ /// <inheritdoc />
public bool Supports(BaseItem item)
{
return item is Episode && item.SupportsLocalMetadata;
}
+ /// <inheritdoc />
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var parentPath = Path.GetDirectoryName(item.Path);
@@ -58,20 +69,11 @@ namespace MediaBrowser.LocalMetadata.Images
if (string.Equals(filenameWithoutExtension, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase))
{
- list.Add(new LocalImageInfo
- {
- FileInfo = i,
- Type = ImageType.Primary
- });
+ list.Add(new LocalImageInfo { FileInfo = i, Type = ImageType.Primary });
}
-
else if (string.Equals(thumbName, currentNameWithoutExtension, StringComparison.OrdinalIgnoreCase))
{
- list.Add(new LocalImageInfo
- {
- FileInfo = i,
- Type = ImageType.Primary
- });
+ list.Add(new LocalImageInfo { FileInfo = i, Type = ImageType.Primary });
}
}
}
diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
index 5137e4c68..509b5d700 100644
--- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs
@@ -9,12 +9,21 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Images
{
+ /// <summary>
+ /// Internal metadata folder image provider.
+ /// </summary>
public class InternalMetadataFolderImageProvider : ILocalImageProvider, IHasOrder
{
private readonly IServerConfigurationManager _config;
private readonly IFileSystem _fileSystem;
private readonly ILogger<InternalMetadataFolderImageProvider> _logger;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="InternalMetadataFolderImageProvider"/> class.
+ /// </summary>
+ /// <param name="config">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{InternalMetadataFolderImageProvider}"/> interface.</param>
public InternalMetadataFolderImageProvider(
IServerConfigurationManager config,
IFileSystem fileSystem,
@@ -25,8 +34,14 @@ namespace MediaBrowser.LocalMetadata.Images
_logger = logger;
}
+ /// Make sure this is last so that all other locations are scanned first
+ /// <inheritdoc />
+ public int Order => 1000;
+
+ /// <inheritdoc />
public string Name => "Internal Images";
+ /// <inheritdoc />
public bool Supports(BaseItem item)
{
if (item is Photo)
@@ -52,9 +67,8 @@ namespace MediaBrowser.LocalMetadata.Images
return true;
}
- // Make sure this is last so that all other locations are scanned first
- public int Order => 1000;
+ /// <inheritdoc />
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var path = item.GetInternalMetadataPath();
@@ -66,7 +80,7 @@ namespace MediaBrowser.LocalMetadata.Images
try
{
- return new LocalImageProvider(_fileSystem).GetImages(item, path, false, directoryService);
+ return new LocalImageProvider(_fileSystem).GetImages(item, path, directoryService);
}
catch (IOException ex)
{
diff --git a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
index 16807f5a4..914db5305 100644
--- a/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
+++ b/MediaBrowser.LocalMetadata/Images/LocalImageProvider.cs
@@ -13,19 +13,71 @@ using MediaBrowser.Model.IO;
namespace MediaBrowser.LocalMetadata.Images
{
+ /// <summary>
+ /// Local image provider.
+ /// </summary>
public class LocalImageProvider : ILocalImageProvider, IHasOrder
{
+ private static readonly string[] _commonImageFileNames =
+ {
+ "poster",
+ "folder",
+ "cover",
+ "default"
+ };
+
+ private static readonly string[] _musicImageFileNames =
+ {
+ "folder",
+ "poster",
+ "cover",
+ "default"
+ };
+
+ private static readonly string[] _personImageFileNames =
+ {
+ "folder",
+ "poster"
+ };
+
+ private static readonly string[] _seriesImageFileNames =
+ {
+ "poster",
+ "folder",
+ "cover",
+ "default",
+ "show"
+ };
+
+ private static readonly string[] _videoImageFileNames =
+ {
+ "poster",
+ "folder",
+ "cover",
+ "default",
+ "movie"
+ };
+
private readonly IFileSystem _fileSystem;
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="LocalImageProvider"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
public LocalImageProvider(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
+ /// <inheritdoc />
public string Name => "Local Images";
+ /// <inheritdoc />
public int Order => 0;
+ /// <inheritdoc />
public bool Supports(BaseItem item)
{
if (item.SupportsLocalMetadata)
@@ -42,15 +94,10 @@ namespace MediaBrowser.LocalMetadata.Images
if (item.LocationType == LocationType.Virtual)
{
var season = item as Season;
-
- if (season != null)
+ var series = season?.Series;
+ if (series != null && series.IsFileProtocol)
{
- var series = season.Series;
-
- if (series != null && series.IsFileProtocol)
- {
- return true;
- }
+ return true;
}
}
@@ -85,6 +132,7 @@ namespace MediaBrowser.LocalMetadata.Images
.OrderBy(i => Array.IndexOf(BaseItem.SupportedImageExtensions, i.Extension ?? string.Empty));
}
+ /// <inheritdoc />
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var files = GetFiles(item, true, directoryService).ToList();
@@ -96,12 +144,26 @@ namespace MediaBrowser.LocalMetadata.Images
return list;
}
- public List<LocalImageInfo> GetImages(BaseItem item, string path, bool isPathInMediaFolder, IDirectoryService directoryService)
+ /// <summary>
+ /// Get images for item.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="path">The images path.</param>
+ /// <param name="directoryService">Instance of the <see cref="IDirectoryService"/> interface.</param>
+ /// <returns>The local image info.</returns>
+ public List<LocalImageInfo> GetImages(BaseItem item, string path, IDirectoryService directoryService)
{
- return GetImages(item, new[] { path }, isPathInMediaFolder, directoryService);
+ return GetImages(item, new[] { path }, directoryService);
}
- public List<LocalImageInfo> GetImages(BaseItem item, IEnumerable<string> paths, bool arePathsInMediaFolders, IDirectoryService directoryService)
+ /// <summary>
+ /// Get images for item from multiple paths.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="paths">The image paths.</param>
+ /// <param name="directoryService">Instance of the <see cref="IDirectoryService"/> interface.</param>
+ /// <returns>The local image info.</returns>
+ public List<LocalImageInfo> GetImages(BaseItem item, IEnumerable<string> paths, IDirectoryService directoryService)
{
IEnumerable<FileSystemMetadata> files = paths.SelectMany(i => _fileSystem.GetFiles(i, BaseItem.SupportedImageExtensions, true, false));
@@ -196,7 +258,7 @@ namespace MediaBrowser.LocalMetadata.Images
if (!isEpisode && !isSong && !isPerson)
{
- PopulateBackdrops(item, images, files, imagePrefix, isInMixedFolder, directoryService);
+ PopulateBackdrops(item, images, files, imagePrefix, isInMixedFolder);
}
if (item is IHasScreenshots)
@@ -205,46 +267,6 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
- private static readonly string[] CommonImageFileNames = new[]
- {
- "poster",
- "folder",
- "cover",
- "default"
- };
-
- private static readonly string[] MusicImageFileNames = new[]
- {
- "folder",
- "poster",
- "cover",
- "default"
- };
-
- private static readonly string[] PersonImageFileNames = new[]
- {
- "folder",
- "poster"
- };
-
- private static readonly string[] SeriesImageFileNames = new[]
- {
- "poster",
- "folder",
- "cover",
- "default",
- "show"
- };
-
- private static readonly string[] VideoImageFileNames = new[]
- {
- "poster",
- "folder",
- "cover",
- "default",
- "movie"
- };
-
private void PopulatePrimaryImages(BaseItem item, List<LocalImageInfo> images, List<FileSystemMetadata> files, string imagePrefix, bool isInMixedFolder)
{
string[] imageFileNames;
@@ -252,24 +274,24 @@ namespace MediaBrowser.LocalMetadata.Images
if (item is MusicAlbum || item is MusicArtist || item is PhotoAlbum)
{
// these prefer folder
- imageFileNames = MusicImageFileNames;
+ imageFileNames = _musicImageFileNames;
}
else if (item is Person)
{
// these prefer folder
- imageFileNames = PersonImageFileNames;
+ imageFileNames = _personImageFileNames;
}
else if (item is Series)
{
- imageFileNames = SeriesImageFileNames;
+ imageFileNames = _seriesImageFileNames;
}
else if (item is Video && !(item is Episode))
{
- imageFileNames = VideoImageFileNames;
+ imageFileNames = _videoImageFileNames;
}
else
{
- imageFileNames = CommonImageFileNames;
+ imageFileNames = _commonImageFileNames;
}
var fileNameWithoutExtension = item.FileNameWithoutExtension;
@@ -301,7 +323,7 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
- private void PopulateBackdrops(BaseItem item, List<LocalImageInfo> images, List<FileSystemMetadata> files, string imagePrefix, bool isInMixedFolder, IDirectoryService directoryService)
+ private void PopulateBackdrops(BaseItem item, List<LocalImageInfo> images, List<FileSystemMetadata> files, string imagePrefix, bool isInMixedFolder)
{
if (!string.IsNullOrEmpty(item.Path))
{
@@ -328,13 +350,13 @@ namespace MediaBrowser.LocalMetadata.Images
if (extraFanartFolder != null)
{
- PopulateBackdropsFromExtraFanart(extraFanartFolder.FullName, images, directoryService);
+ PopulateBackdropsFromExtraFanart(extraFanartFolder.FullName, images);
}
PopulateBackdrops(images, files, imagePrefix, "backdrop", "backdrop", isInMixedFolder, ImageType.Backdrop);
}
- private void PopulateBackdropsFromExtraFanart(string path, List<LocalImageInfo> images, IDirectoryService directoryService)
+ private void PopulateBackdropsFromExtraFanart(string path, List<LocalImageInfo> images)
{
var imageFiles = _fileSystem.GetFiles(path, BaseItem.SupportedImageExtensions, false, false);
@@ -395,8 +417,6 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
- private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-
private void PopulateSeasonImagesFromSeriesFolder(Season season, List<LocalImageInfo> images, IDirectoryService directoryService)
{
var seasonNumber = season.IndexNumber;
@@ -410,7 +430,7 @@ namespace MediaBrowser.LocalMetadata.Images
var seriesFiles = GetFiles(series, false, directoryService).ToList();
// Try using the season name
- var prefix = season.Name.ToLowerInvariant().Replace(" ", string.Empty);
+ var prefix = season.Name.Replace(" ", string.Empty, StringComparison.Ordinal).ToLowerInvariant();
var filenamePrefixes = new List<string> { prefix };
diff --git a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
index 24104d779..529e7065c 100644
--- a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
+++ b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj
@@ -10,14 +10,28 @@
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
</ItemGroup>
- <ItemGroup>
- <Compile Include="..\SharedVersion.cs" />
- </ItemGroup>
-
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
+ <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="..\SharedVersion.cs" />
+ </ItemGroup>
+
+ <!-- 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>
diff --git a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
index 0b567af32..e11ceb826 100644
--- a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
@@ -16,23 +16,19 @@ namespace MediaBrowser.LocalMetadata.Parsers
/// <summary>
/// Provides a base class for parsing metadata xml.
/// </summary>
- /// <typeparam name="T"></typeparam>
+ /// <typeparam name="T">Type of item xml parser.</typeparam>
public class BaseItemXmlParser<T>
where T : BaseItem
{
- /// <summary>
- /// The logger.
- /// </summary>
- protected ILogger<BaseItemXmlParser<T>> Logger { get; private set; }
-
- protected IProviderManager ProviderManager { get; private set; }
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
- private Dictionary<string, string> _validProviderIds;
+ private Dictionary<string, string>? _validProviderIds;
/// <summary>
/// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
/// </summary>
- /// <param name="logger">The logger.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{BaseItemXmlParser}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
public BaseItemXmlParser(ILogger<BaseItemXmlParser<T>> logger, IProviderManager providerManager)
{
Logger = logger;
@@ -40,12 +36,22 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
/// <summary>
+ /// Gets the logger.
+ /// </summary>
+ protected ILogger<BaseItemXmlParser<T>> Logger { get; private set; }
+
+ /// <summary>
+ /// Gets the provider manager.
+ /// </summary>
+ protected IProviderManager ProviderManager { get; private set; }
+
+ /// <summary>
/// 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">Item is null.</exception>
public void Fetch(MetadataResult<T> item, string metadataFile, CancellationToken cancellationToken)
{
if (item == null)
@@ -58,7 +64,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
throw new ArgumentException("The metadata file was empty or null.", nameof(metadataFile));
}
- var settings = new XmlReaderSettings()
+ var settings = new XmlReaderSettings
{
ValidationType = ValidationType.None,
CheckCharacters = false,
@@ -98,32 +104,28 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
item.ResetPeople();
- using (var fileStream = File.OpenRead(metadataFile))
- using (var streamReader = new StreamReader(fileStream, encoding))
- using (var reader = XmlReader.Create(streamReader, settings))
+ using var fileStream = File.OpenRead(metadataFile);
+ using var streamReader = new StreamReader(fileStream, encoding);
+ using var reader = XmlReader.Create(streamReader, settings);
+ reader.MoveToContent();
+ reader.Read();
+
+ // Loop through each element
+ while (!reader.EOF && reader.ReadState == ReadState.Interactive)
{
- reader.MoveToContent();
- reader.Read();
+ cancellationToken.ThrowIfCancellationRequested();
- // Loop through each element
- while (!reader.EOF && reader.ReadState == ReadState.Interactive)
+ if (reader.NodeType == XmlNodeType.Element)
{
- cancellationToken.ThrowIfCancellationRequested();
-
- if (reader.NodeType == XmlNodeType.Element)
- {
- FetchDataFromXmlNode(reader, item);
- }
- else
- {
- reader.Read();
- }
+ FetchDataFromXmlNode(reader, item);
+ }
+ else
+ {
+ reader.Read();
}
}
}
- private readonly CultureInfo _usCulture = new CultureInfo("en-US");
-
/// <summary>
/// Fetches metadata from one Xml Element.
/// </summary>
@@ -137,308 +139,292 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
// DateCreated
case "Added":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ if (DateTime.TryParse(val, out var added))
{
- if (DateTime.TryParse(val, out var added))
- {
- item.DateCreated = added.ToUniversalTime();
- }
- else
- {
- Logger.LogWarning("Invalid Added value found: " + val);
- }
+ item.DateCreated = added.ToUniversalTime();
+ }
+ else
+ {
+ Logger.LogWarning("Invalid Added value found: " + val);
}
-
- break;
}
- case "OriginalTitle":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- if (!string.IsNullOrEmpty(val))
- {
- item.OriginalTitle = val;
- }
+ case "OriginalTitle":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrEmpty(val))
+ {
+ item.OriginalTitle = val;
}
+ break;
+ }
+
case "LocalTitle":
item.Name = reader.ReadElementContentAsString();
break;
case "CriticRating":
- {
- var text = reader.ReadElementContentAsString();
+ {
+ var text = reader.ReadElementContentAsString();
- if (!string.IsNullOrEmpty(text))
+ if (!string.IsNullOrEmpty(text))
+ {
+ if (float.TryParse(text, NumberStyles.Any, _usCulture, out var value))
{
- if (float.TryParse(text, NumberStyles.Any, _usCulture, out var value))
- {
- item.CriticRating = value;
- }
+ item.CriticRating = value;
}
-
- break;
}
- case "SortTitle":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.ForcedSortName = val;
- }
+ case "SortTitle":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.ForcedSortName = val;
}
+ break;
+ }
+
case "Overview":
case "Description":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.Overview = val;
- }
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.Overview = val;
}
+ break;
+ }
+
case "Language":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- item.PreferredMetadataLanguage = val;
+ item.PreferredMetadataLanguage = val;
- break;
- }
+ break;
+ }
case "CountryCode":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- item.PreferredMetadataCountryCode = val;
+ item.PreferredMetadataCountryCode = val;
- break;
- }
+ break;
+ }
case "PlaceOfBirth":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ if (item is Person person)
{
- var person = item as Person;
- if (person != null)
- {
- person.ProductionLocations = new string[] { val };
- }
+ person.ProductionLocations = new[] { val };
}
-
- break;
}
+ break;
+ }
+
case "LockedFields":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.LockedFields = val.Split('|').Select(i =>
{
- item.LockedFields = val.Split('|').Select(i =>
+ if (Enum.TryParse(i, true, out MetadataField field))
{
- if (Enum.TryParse(i, true, out MetadataField field))
- {
- return (MetadataField?)field;
- }
-
- return null;
- }).Where(i => i.HasValue).Select(i => i.Value).ToArray();
- }
+ return (MetadataField?)field;
+ }
- break;
+ return null;
+ }).Where(i => i.HasValue).Select(i => i!.Value).ToArray();
}
+ break;
+ }
+
case "TagLines":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchFromTaglinesNode(subtree, item);
- }
- }
- else
+ using (var subtree = reader.ReadSubtree())
{
- reader.Read();
+ FetchFromTaglinesNode(subtree, item);
}
-
- break;
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "Countries":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchFromCountriesNode(subtree, item);
- }
- }
- else
+ using (var subtree = reader.ReadSubtree())
{
- reader.Read();
+ FetchFromCountriesNode(subtree);
}
-
- break;
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "ContentRating":
case "MPAARating":
- {
- var rating = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(rating))
- {
- item.OfficialRating = rating;
- }
+ {
+ var rating = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(rating))
+ {
+ item.OfficialRating = rating;
}
- case "CustomRating":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.CustomRating = val;
- }
+ case "CustomRating":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.CustomRating = val;
}
+ break;
+ }
+
case "RunningTime":
- {
- var text = reader.ReadElementContentAsString();
+ {
+ var text = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(text))
+ if (!string.IsNullOrWhiteSpace(text))
+ {
+ if (int.TryParse(text.Split(' ')[0], NumberStyles.Integer, _usCulture, out var runtime))
{
- if (int.TryParse(text.Split(' ')[0], NumberStyles.Integer, _usCulture, out var runtime))
- {
- item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
- }
+ item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
}
-
- break;
}
- case "AspectRatio":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- var hasAspectRatio = item as IHasAspectRatio;
- if (!string.IsNullOrWhiteSpace(val) && hasAspectRatio != null)
- {
- hasAspectRatio.AspectRatio = val;
- }
+ case "AspectRatio":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ var hasAspectRatio = item as IHasAspectRatio;
+ if (!string.IsNullOrWhiteSpace(val) && hasAspectRatio != null)
+ {
+ hasAspectRatio.AspectRatio = val;
}
- case "LockData":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
- }
+ case "LockData":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
}
+ break;
+ }
+
case "Network":
+ {
+ foreach (var name in SplitNames(reader.ReadElementContentAsString()))
{
- foreach (var name in SplitNames(reader.ReadElementContentAsString()))
+ if (string.IsNullOrWhiteSpace(name))
{
- if (string.IsNullOrWhiteSpace(name))
- {
- continue;
- }
-
- item.AddStudio(name);
+ continue;
}
- break;
+ item.AddStudio(name);
}
+ break;
+ }
+
case "Director":
+ {
+ foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
{
- foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Director }))
+ if (string.IsNullOrWhiteSpace(p.Name))
{
- if (string.IsNullOrWhiteSpace(p.Name))
- {
- continue;
- }
-
- itemResult.AddPerson(p);
+ continue;
}
- break;
+ itemResult.AddPerson(p);
}
+
+ break;
+ }
+
case "Writer":
+ {
+ foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
{
- foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
+ if (string.IsNullOrWhiteSpace(p.Name))
{
- if (string.IsNullOrWhiteSpace(p.Name))
- {
- continue;
- }
-
- itemResult.AddPerson(p);
+ continue;
}
- break;
+ itemResult.AddPerson(p);
}
- case "Actors":
- {
-
- var actors = reader.ReadInnerXml();
-
- if (actors.Contains("<"))
- {
- // This is one of the mis-named "Actors" full nodes created by MB2
- // Create a reader and pass it to the persons node processor
- FetchDataFromPersonsNode(XmlReader.Create(new StringReader("<Persons>" + actors + "</Persons>")), itemResult);
- }
- else
- {
- // Old-style piped string
- foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
- {
- if (string.IsNullOrWhiteSpace(p.Name))
- {
- continue;
- }
+ break;
+ }
- itemResult.AddPerson(p);
- }
- }
+ case "Actors":
+ {
+ var actors = reader.ReadInnerXml();
- break;
+ if (actors.Contains("<", StringComparison.Ordinal))
+ {
+ // This is one of the mis-named "Actors" full nodes created by MB2
+ // Create a reader and pass it to the persons node processor
+ using var xmlReader = XmlReader.Create(new StringReader($"<Persons>{actors}</Persons>"));
+ FetchDataFromPersonsNode(xmlReader, itemResult);
}
-
- case "GuestStars":
+ else
{
- foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
+ // Old-style piped string
+ foreach (var p in SplitNames(actors).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Actor }))
{
if (string.IsNullOrWhiteSpace(p.Name))
{
@@ -447,122 +433,135 @@ namespace MediaBrowser.LocalMetadata.Parsers
itemResult.AddPerson(p);
}
-
- break;
}
- case "Trailer":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- if (!string.IsNullOrWhiteSpace(val))
+ case "GuestStars":
+ {
+ foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.GuestStar }))
+ {
+ if (string.IsNullOrWhiteSpace(p.Name))
{
- item.AddTrailerUrl(val);
+ continue;
}
- break;
+ itemResult.AddPerson(p);
}
- case "DisplayOrder":
- {
- var val = reader.ReadElementContentAsString();
+ break;
+ }
- var hasDisplayOrder = item as IHasDisplayOrder;
- if (hasDisplayOrder != null)
- {
- if (!string.IsNullOrWhiteSpace(val))
- {
- hasDisplayOrder.DisplayOrder = val;
- }
- }
+ case "Trailer":
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.AddTrailerUrl(val);
}
- case "Trailers":
+ break;
+ }
+
+ case "DisplayOrder":
+ {
+ var val = reader.ReadElementContentAsString();
+
+ var hasDisplayOrder = item as IHasDisplayOrder;
+ if (hasDisplayOrder != null)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchDataFromTrailersNode(subtree, item);
- }
- }
- else
+ if (!string.IsNullOrWhiteSpace(val))
{
- reader.Read();
+ hasDisplayOrder.DisplayOrder = val;
}
+ }
- break;
+ break;
+ }
+
+ case "Trailers":
+ {
+ if (!reader.IsEmptyElement)
+ {
+ using var subtree = reader.ReadSubtree();
+ FetchDataFromTrailersNode(subtree, item);
}
+ else
+ {
+ reader.Read();
+ }
+
+ break;
+ }
case "ProductionYear":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ if (int.TryParse(val, out var productionYear) && productionYear > 1850)
{
- if (int.TryParse(val, out var productionYear) && productionYear > 1850)
- {
- item.ProductionYear = productionYear;
- }
+ item.ProductionYear = productionYear;
}
-
- break;
}
+ break;
+ }
+
case "Rating":
case "IMDBrating":
- {
-
- var rating = reader.ReadElementContentAsString();
+ {
+ var rating = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(rating))
+ if (!string.IsNullOrWhiteSpace(rating))
+ {
+ // All external meta is saving this as '.' for decimal I believe...but just to be sure
+ if (float.TryParse(rating.Replace(',', '.'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var val))
{
- // All external meta is saving this as '.' for decimal I believe...but just to be sure
- if (float.TryParse(rating.Replace(',', '.'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var val))
- {
- item.CommunityRating = val;
- }
+ item.CommunityRating = val;
}
-
- break;
}
+ break;
+ }
+
case "BirthDate":
case "PremiereDate":
case "FirstAired":
- {
- var firstAired = reader.ReadElementContentAsString();
+ {
+ var firstAired = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(firstAired))
+ if (!string.IsNullOrWhiteSpace(firstAired))
+ {
+ if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var airDate) && airDate.Year > 1850)
{
- if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var airDate) && airDate.Year > 1850)
- {
- item.PremiereDate = airDate.ToUniversalTime();
- item.ProductionYear = airDate.Year;
- }
+ item.PremiereDate = airDate.ToUniversalTime();
+ item.ProductionYear = airDate.Year;
}
-
- break;
}
+ break;
+ }
+
case "DeathDate":
case "EndDate":
- {
- var firstAired = reader.ReadElementContentAsString();
+ {
+ var firstAired = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(firstAired))
+ if (!string.IsNullOrWhiteSpace(firstAired))
+ {
+ if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var airDate) && airDate.Year > 1850)
{
- if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal, out var airDate) && airDate.Year > 1850)
- {
- item.EndDate = airDate.ToUniversalTime();
- }
+ item.EndDate = airDate.ToUniversalTime();
}
-
- break;
}
+ break;
+ }
+
case "CollectionNumber":
var tmdbCollection = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(tmdbCollection))
@@ -573,145 +572,132 @@ namespace MediaBrowser.LocalMetadata.Parsers
break;
case "Genres":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchFromGenresNode(subtree, item);
- }
- }
- else
- {
- reader.Read();
- }
-
- break;
+ using var subtree = reader.ReadSubtree();
+ FetchFromGenresNode(subtree, item);
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "Tags":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchFromTagsNode(subtree, item);
- }
- }
- else
- {
- reader.Read();
- }
-
- break;
+ using var subtree = reader.ReadSubtree();
+ FetchFromTagsNode(subtree, item);
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "Persons":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchDataFromPersonsNode(subtree, itemResult);
- }
- }
- else
- {
- reader.Read();
- }
-
- break;
+ using var subtree = reader.ReadSubtree();
+ FetchDataFromPersonsNode(subtree, itemResult);
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "Studios":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
- {
- using (var subtree = reader.ReadSubtree())
- {
- FetchFromStudiosNode(subtree, item);
- }
- }
- else
- {
- reader.Read();
- }
-
- break;
+ using var subtree = reader.ReadSubtree();
+ FetchFromStudiosNode(subtree, item);
+ }
+ else
+ {
+ reader.Read();
}
+ break;
+ }
+
case "Shares":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
+ using var subtree = reader.ReadSubtree();
+ if (item is IHasShares hasShares)
{
- using (var subtree = reader.ReadSubtree())
- {
- var hasShares = item as IHasShares;
- if (hasShares != null)
- {
- FetchFromSharesNode(subtree, hasShares);
- }
- }
+ FetchFromSharesNode(subtree, hasShares);
}
- else
- {
- reader.Read();
- }
-
- break;
}
-
- case "Format3D":
+ else
{
- var val = reader.ReadElementContentAsString();
+ reader.Read();
+ }
+
+ break;
+ }
- var video = item as Video;
+ case "Format3D":
+ {
+ var val = reader.ReadElementContentAsString();
- if (video != null)
+ if (item is Video video)
+ {
+ if (string.Equals("HSBS", val, StringComparison.OrdinalIgnoreCase))
{
- if (string.Equals("HSBS", val, StringComparison.OrdinalIgnoreCase))
- {
- video.Video3DFormat = Video3DFormat.HalfSideBySide;
- }
- else if (string.Equals("HTAB", val, StringComparison.OrdinalIgnoreCase))
- {
- video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
- }
- else if (string.Equals("FTAB", val, StringComparison.OrdinalIgnoreCase))
- {
- video.Video3DFormat = Video3DFormat.FullTopAndBottom;
- }
- else if (string.Equals("FSBS", val, StringComparison.OrdinalIgnoreCase))
- {
- video.Video3DFormat = Video3DFormat.FullSideBySide;
- }
- else if (string.Equals("MVC", val, StringComparison.OrdinalIgnoreCase))
- {
- video.Video3DFormat = Video3DFormat.MVC;
- }
+ video.Video3DFormat = Video3DFormat.HalfSideBySide;
+ }
+ else if (string.Equals("HTAB", val, StringComparison.OrdinalIgnoreCase))
+ {
+ video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
+ }
+ else if (string.Equals("FTAB", val, StringComparison.OrdinalIgnoreCase))
+ {
+ video.Video3DFormat = Video3DFormat.FullTopAndBottom;
+ }
+ else if (string.Equals("FSBS", val, StringComparison.OrdinalIgnoreCase))
+ {
+ video.Video3DFormat = Video3DFormat.FullSideBySide;
+ }
+ else if (string.Equals("MVC", val, StringComparison.OrdinalIgnoreCase))
+ {
+ video.Video3DFormat = Video3DFormat.MVC;
}
-
- break;
}
+ break;
+ }
+
default:
+ {
+ string readerName = reader.Name;
+ if (_validProviderIds!.TryGetValue(readerName, out string providerIdValue))
{
- string readerName = reader.Name;
- if (_validProviderIds.TryGetValue(readerName, out string providerIdValue))
- {
- var id = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(id))
- {
- item.SetProviderId(providerIdValue, id);
- }
- }
- else
+ var id = reader.ReadElementContentAsString();
+ if (!string.IsNullOrWhiteSpace(id))
{
- reader.Skip();
+ item.SetProviderId(providerIdValue, id);
}
-
- break;
}
+ else
+ {
+ reader.Skip();
+ }
+
+ break;
+ }
}
}
@@ -730,31 +716,31 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Share":
+ {
+ if (reader.IsEmptyElement)
{
- if (reader.IsEmptyElement)
- {
- reader.Read();
- continue;
- }
+ reader.Read();
+ continue;
+ }
- using (var subReader = reader.ReadSubtree())
- {
- var child = GetShare(subReader);
+ using (var subReader = reader.ReadSubtree())
+ {
+ var child = GetShare(subReader);
- if (child != null)
- {
- list.Add(child);
- }
+ if (child != null)
+ {
+ list.Add(child);
}
-
- break;
}
+ break;
+ }
+
default:
- {
- reader.Skip();
- break;
- }
+ {
+ reader.Skip();
+ break;
+ }
}
}
else
@@ -781,16 +767,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "UserId":
- {
- share.UserId = reader.ReadElementContentAsString();
- break;
- }
+ {
+ share.UserId = reader.ReadElementContentAsString();
+ break;
+ }
case "CanEdit":
- {
- share.CanEdit = string.Equals(reader.ReadElementContentAsString(), true.ToString(), StringComparison.OrdinalIgnoreCase);
- break;
- }
+ {
+ share.CanEdit = string.Equals(reader.ReadElementContentAsString(), true.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase);
+ break;
+ }
default:
reader.Skip();
@@ -806,7 +792,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
return share;
}
- private void FetchFromCountriesNode(XmlReader reader, T item)
+ private void FetchFromCountriesNode(XmlReader reader)
{
reader.MoveToContent();
reader.Read();
@@ -819,16 +805,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Country":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- }
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -859,17 +845,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Tagline":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.Tagline = val;
- }
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.Tagline = val;
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -900,17 +886,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Genre":
- {
- var genre = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(genre))
- {
- item.AddGenre(genre);
- }
+ {
+ var genre = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(genre))
+ {
+ item.AddGenre(genre);
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -938,17 +924,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Tag":
- {
- var tag = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(tag))
- {
- tags.Add(tag);
- }
+ {
+ var tag = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(tag))
+ {
+ tags.Add(tag);
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -982,29 +968,29 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
case "Person":
case "Actor":
+ {
+ if (reader.IsEmptyElement)
{
- if (reader.IsEmptyElement)
- {
- reader.Read();
- continue;
- }
+ reader.Read();
+ continue;
+ }
- using (var subtree = reader.ReadSubtree())
+ using (var subtree = reader.ReadSubtree())
+ {
+ foreach (var person in GetPersonsFromXmlNode(subtree))
{
- foreach (var person in GetPersonsFromXmlNode(subtree))
+ if (string.IsNullOrWhiteSpace(person.Name))
{
- if (string.IsNullOrWhiteSpace(person.Name))
- {
- continue;
- }
-
- item.AddPerson(person);
+ continue;
}
- }
- break;
+ item.AddPerson(person);
+ }
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -1030,17 +1016,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Trailer":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- item.AddTrailerUrl(val);
- }
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.AddTrailerUrl(val);
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -1071,17 +1057,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Studio":
- {
- var studio = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(studio))
- {
- item.AddStudio(studio);
- }
+ {
+ var studio = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(studio))
+ {
+ item.AddStudio(studio);
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -1102,7 +1088,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
private IEnumerable<PersonInfo> GetPersonsFromXmlNode(XmlReader reader)
{
var name = string.Empty;
- var type = PersonType.Actor; // If type is not specified assume actor
+ var type = PersonType.Actor; // If type is not specified assume actor
var role = string.Empty;
int? sortOrder = null;
@@ -1121,43 +1107,44 @@ namespace MediaBrowser.LocalMetadata.Parsers
break;
case "Type":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
- {
- type = val;
- }
+ {
+ var val = reader.ReadElementContentAsString();
- break;
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ type = val;
}
+ break;
+ }
+
case "Role":
+ {
+ var val = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(val))
{
- var val = reader.ReadElementContentAsString();
+ role = val;
+ }
- if (!string.IsNullOrWhiteSpace(val))
- {
- role = val;
- }
+ break;
+ }
- break;
- }
case "SortOrder":
- {
- var val = reader.ReadElementContentAsString();
+ {
+ var val = reader.ReadElementContentAsString();
- if (!string.IsNullOrWhiteSpace(val))
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ if (int.TryParse(val, NumberStyles.Integer, _usCulture, out var intVal))
{
- if (int.TryParse(val, NumberStyles.Integer, _usCulture, out var intVal))
- {
- sortOrder = intVal;
- }
+ sortOrder = intVal;
}
-
- break;
}
+ break;
+ }
+
default:
reader.Skip();
break;
@@ -1169,23 +1156,19 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
}
- var personInfo = new PersonInfo
- {
- Name = name.Trim(),
- Role = role,
- Type = type,
- SortOrder = sortOrder
- };
+ var personInfo = new PersonInfo { Name = name.Trim(), Role = role, Type = type, SortOrder = sortOrder };
return new[] { personInfo };
}
- protected LinkedChild GetLinkedChild(XmlReader reader)
+ /// <summary>
+ /// Get linked child.
+ /// </summary>
+ /// <param name="reader">The xml reader.</param>
+ /// <returns>The linked child.</returns>
+ protected LinkedChild? GetLinkedChild(XmlReader reader)
{
- var linkedItem = new LinkedChild
- {
- Type = LinkedChildType.Manual
- };
+ var linkedItem = new LinkedChild { Type = LinkedChildType.Manual };
reader.MoveToContent();
reader.Read();
@@ -1198,15 +1181,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "Path":
- {
- linkedItem.Path = reader.ReadElementContentAsString();
- break;
- }
+ {
+ linkedItem.Path = reader.ReadElementContentAsString();
+ break;
+ }
+
case "ItemId":
- {
- linkedItem.LibraryItemId = reader.ReadElementContentAsString();
- break;
- }
+ {
+ linkedItem.LibraryItemId = reader.ReadElementContentAsString();
+ break;
+ }
default:
reader.Skip();
@@ -1228,7 +1212,12 @@ namespace MediaBrowser.LocalMetadata.Parsers
return null;
}
- protected Share GetShare(XmlReader reader)
+ /// <summary>
+ /// Get share.
+ /// </summary>
+ /// <param name="reader">The xml reader.</param>
+ /// <returns>The share.</returns>
+ protected Share? GetShare(XmlReader reader)
{
var item = new Share();
@@ -1243,22 +1232,22 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "UserId":
- {
- item.UserId = reader.ReadElementContentAsString();
- break;
- }
+ {
+ item.UserId = reader.ReadElementContentAsString();
+ break;
+ }
case "CanEdit":
- {
- item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
- break;
- }
+ {
+ item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
+ break;
+ }
default:
- {
- reader.Skip();
- break;
- }
+ {
+ reader.Skip();
+ break;
+ }
}
}
else
@@ -1276,19 +1265,19 @@ namespace MediaBrowser.LocalMetadata.Parsers
return null;
}
-
/// <summary>
- /// Used to split names of comma or pipe delimeted genres and people.
+ /// Used to split names of comma or pipe delimited genres and people.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>IEnumerable{System.String}.</returns>
private IEnumerable<string> SplitNames(string value)
{
- value = value ?? string.Empty;
+ value ??= string.Empty;
// 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);
@@ -1296,7 +1285,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
/// <summary>
- /// Provides an additional overload for string.split
+ /// Provides an additional overload for string.split.
/// </summary>
/// <param name="val">The val.</param>
/// <param name="separators">The separators.</param>
diff --git a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
index dd4eefa50..ff846830b 100644
--- a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs
@@ -7,8 +7,22 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Parsers
{
+ /// <summary>
+ /// The box set xml parser.
+ /// </summary>
public class BoxSetXmlParser : BaseItemXmlParser<BoxSet>
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BoxSetXmlParser"/> class.
+ /// </summary>
+ /// <param name="logger">Instance of the <see cref="ILogger{BoxSetXmlParset}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
+ public BoxSetXmlParser(ILogger<BoxSetXmlParser> logger, IProviderManager providerManager)
+ : base(logger, providerManager)
+ {
+ }
+
+ /// <inheritdoc />
protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<BoxSet> item)
{
switch (reader.Name)
@@ -50,32 +64,32 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "CollectionItem":
+ {
+ if (!reader.IsEmptyElement)
{
- if (!reader.IsEmptyElement)
+ using (var subReader = reader.ReadSubtree())
{
- using (var subReader = reader.ReadSubtree())
- {
- var child = GetLinkedChild(subReader);
+ var child = GetLinkedChild(subReader);
- if (child != null)
- {
- list.Add(child);
- }
+ if (child != null)
+ {
+ list.Add(child);
}
}
- else
- {
- reader.Read();
- }
-
- break;
}
-
- default:
+ else
{
- reader.Skip();
- break;
+ reader.Read();
}
+
+ break;
+ }
+
+ default:
+ {
+ reader.Skip();
+ break;
+ }
}
}
else
@@ -86,10 +100,5 @@ namespace MediaBrowser.LocalMetadata.Parsers
item.Item.LinkedChildren = list.ToArray();
}
-
- public BoxSetXmlParser(ILogger<BoxSetXmlParser> logger, IProviderManager providerManager)
- : base(logger, providerManager)
- {
- }
}
}
diff --git a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
index 941ed1b95..78c0fa8ad 100644
--- a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs
@@ -7,8 +7,22 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Parsers
{
+ /// <summary>
+ /// Playlist xml parser.
+ /// </summary>
public class PlaylistXmlParser : BaseItemXmlParser<Playlist>
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PlaylistXmlParser"/> class.
+ /// </summary>
+ /// <param name="logger">Instance of the <see cref="ILogger{PlaylistXmlParser}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
+ public PlaylistXmlParser(ILogger<PlaylistXmlParser> logger, IProviderManager providerManager)
+ : base(logger, providerManager)
+ {
+ }
+
+ /// <inheritdoc />
protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Playlist> result)
{
var item = result.Item;
@@ -16,11 +30,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "PlaylistMediaType":
- {
- item.PlaylistMediaType = reader.ReadElementContentAsString();
+ {
+ item.PlaylistMediaType = reader.ReadElementContentAsString();
- break;
- }
+ break;
+ }
case "PlaylistItems":
@@ -59,31 +73,31 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "PlaylistItem":
+ {
+ if (reader.IsEmptyElement)
{
- if (reader.IsEmptyElement)
- {
- reader.Read();
- continue;
- }
+ reader.Read();
+ continue;
+ }
- using (var subReader = reader.ReadSubtree())
- {
- var child = GetLinkedChild(subReader);
+ using (var subReader = reader.ReadSubtree())
+ {
+ var child = GetLinkedChild(subReader);
- if (child != null)
- {
- list.Add(child);
- }
+ if (child != null)
+ {
+ list.Add(child);
}
-
- break;
}
+ break;
+ }
+
default:
- {
- reader.Skip();
- break;
- }
+ {
+ reader.Skip();
+ break;
+ }
}
}
else
@@ -94,10 +108,5 @@ namespace MediaBrowser.LocalMetadata.Parsers
item.LinkedChildren = list.ToArray();
}
-
- public PlaylistXmlParser(ILogger<PlaylistXmlParser> logger, IProviderManager providerManager)
- : base(logger, providerManager)
- {
- }
}
}
diff --git a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
index 2d115a591..cc705a9df 100644
--- a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs
@@ -16,6 +16,12 @@ namespace MediaBrowser.LocalMetadata.Providers
private readonly ILogger<BoxSetXmlParser> _logger;
private readonly IProviderManager _providerManager;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BoxSetXmlProvider"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{BoxSetXmlParser}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
public BoxSetXmlProvider(IFileSystem fileSystem, ILogger<BoxSetXmlParser> logger, IProviderManager providerManager)
: base(fileSystem)
{
@@ -23,11 +29,13 @@ namespace MediaBrowser.LocalMetadata.Providers
_providerManager = providerManager;
}
+ /// <inheritdoc />
protected override void Fetch(MetadataResult<BoxSet> result, string path, CancellationToken cancellationToken)
{
new BoxSetXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
}
+ /// <inheritdoc />
protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
{
return directoryService.GetFile(Path.Combine(info.Path, "collection.xml"));
diff --git a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
index d4e2bc8e5..36f3048ad 100644
--- a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
+++ b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs
@@ -8,11 +8,20 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Providers
{
+ /// <summary>
+ /// Playlist xml provider.
+ /// </summary>
public class PlaylistXmlProvider : BaseXmlProvider<Playlist>
{
private readonly ILogger<PlaylistXmlParser> _logger;
private readonly IProviderManager _providerManager;
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PlaylistXmlProvider"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{PlaylistXmlParser}"/> interface.</param>
+ /// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
public PlaylistXmlProvider(
IFileSystem fileSystem,
ILogger<PlaylistXmlParser> logger,
@@ -23,14 +32,16 @@ namespace MediaBrowser.LocalMetadata.Providers
_providerManager = providerManager;
}
+ /// <inheritdoc />
protected override void Fetch(MetadataResult<Playlist> result, string path, CancellationToken cancellationToken)
{
new PlaylistXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken);
}
+ /// <inheritdoc />
protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
{
- return directoryService.GetFile(PlaylistXmlSaver.GetSavePath(info.Path, FileSystem));
+ return directoryService.GetFile(PlaylistXmlSaver.GetSavePath(info.Path));
}
}
}
diff --git a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
index 70fd63ff3..7a4823e1b 100644
--- a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs
@@ -17,10 +17,25 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Savers
{
+ /// <inheritdoc />
public abstract class BaseXmlSaver : IMetadataFileSaver
{
- private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
+ /// <summary>
+ /// Gets the date added format.
+ /// </summary>
+ public const string DateAddedFormat = "yyyy-MM-dd HH:mm:ss";
+ private static readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BaseXmlSaver"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="configurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
+ /// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{BaseXmlSaver}"/> interface.</param>
public BaseXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger<BaseXmlSaver> logger)
{
FileSystem = fileSystem;
@@ -31,20 +46,40 @@ namespace MediaBrowser.LocalMetadata.Savers
Logger = logger;
}
+ /// <summary>
+ /// Gets the file system.
+ /// </summary>
protected IFileSystem FileSystem { get; private set; }
+ /// <summary>
+ /// Gets the configuration manager.
+ /// </summary>
protected IServerConfigurationManager ConfigurationManager { get; private set; }
+ /// <summary>
+ /// Gets the library manager.
+ /// </summary>
protected ILibraryManager LibraryManager { get; private set; }
+ /// <summary>
+ /// Gets the user manager.
+ /// </summary>
protected IUserManager UserManager { get; private set; }
+ /// <summary>
+ /// Gets the user data manager.
+ /// </summary>
protected IUserDataManager UserDataManager { get; private set; }
+ /// <summary>
+ /// Gets the logger.
+ /// </summary>
protected ILogger<BaseXmlSaver> Logger { get; private set; }
+ /// <inheritdoc />
public string Name => XmlProviderUtils.Name;
+ /// <inheritdoc />
public string GetSavePath(BaseItem item)
{
return GetLocalSavePath(item);
@@ -75,20 +110,19 @@ namespace MediaBrowser.LocalMetadata.Savers
/// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
public abstract bool IsEnabledFor(BaseItem item, ItemUpdateType updateType);
+ /// <inheritdoc />
public void Save(BaseItem item, CancellationToken cancellationToken)
{
var path = GetSavePath(item);
- using (var memoryStream = new MemoryStream())
- {
- Save(item, memoryStream, path);
+ using var memoryStream = new MemoryStream();
+ Save(item, memoryStream);
- memoryStream.Position = 0;
+ memoryStream.Position = 0;
- cancellationToken.ThrowIfCancellationRequested();
+ cancellationToken.ThrowIfCancellationRequested();
- SaveToFile(memoryStream, path);
- }
+ SaveToFile(memoryStream, path);
}
private void SaveToFile(Stream stream, string path)
@@ -120,7 +154,7 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
- private void Save(BaseItem item, Stream stream, string xmlPath)
+ private void Save(BaseItem item, Stream stream)
{
var settings = new XmlWriterSettings
{
@@ -141,7 +175,7 @@ namespace MediaBrowser.LocalMetadata.Savers
if (baseItem != null)
{
- AddCommonNodes(baseItem, writer, LibraryManager, UserManager, UserDataManager, FileSystem, ConfigurationManager);
+ AddCommonNodes(baseItem, writer, LibraryManager);
}
WriteCustomElements(item, writer);
@@ -152,22 +186,27 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
+ /// <summary>
+ /// Write custom elements.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="writer">The xml writer.</param>
protected abstract void WriteCustomElements(BaseItem item, XmlWriter writer);
- public const string DateAddedFormat = "yyyy-MM-dd HH:mm:ss";
-
/// <summary>
/// Adds the common nodes.
/// </summary>
- /// <returns>Task.</returns>
- public static void AddCommonNodes(BaseItem item, XmlWriter writer, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataRepo, IFileSystem fileSystem, IServerConfigurationManager config)
+ /// <param name="item">The item.</param>
+ /// <param name="writer">The xml writer.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ public static void AddCommonNodes(BaseItem item, XmlWriter writer, ILibraryManager libraryManager)
{
if (!string.IsNullOrEmpty(item.OfficialRating))
{
writer.WriteElementString("ContentRating", item.OfficialRating);
}
- writer.WriteElementString("Added", item.DateCreated.ToLocalTime().ToString("G"));
+ writer.WriteElementString("Added", item.DateCreated.ToLocalTime().ToString("G", CultureInfo.InvariantCulture));
writer.WriteElementString("LockData", item.IsLocked.ToString(CultureInfo.InvariantCulture).ToLowerInvariant());
@@ -178,7 +217,7 @@ namespace MediaBrowser.LocalMetadata.Savers
if (item.CriticRating.HasValue)
{
- writer.WriteElementString("CriticRating", item.CriticRating.Value.ToString(UsCulture));
+ writer.WriteElementString("CriticRating", item.CriticRating.Value.ToString(_usCulture));
}
if (!string.IsNullOrEmpty(item.Overview))
@@ -211,11 +250,11 @@ namespace MediaBrowser.LocalMetadata.Savers
{
if (item is Person)
{
- writer.WriteElementString("BirthDate", item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd"));
+ writer.WriteElementString("BirthDate", item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
}
else if (!(item is Episode))
{
- writer.WriteElementString("PremiereDate", item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd"));
+ writer.WriteElementString("PremiereDate", item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
}
}
@@ -223,11 +262,11 @@ namespace MediaBrowser.LocalMetadata.Savers
{
if (item is Person)
{
- writer.WriteElementString("DeathDate", item.EndDate.Value.ToLocalTime().ToString("yyyy-MM-dd"));
+ writer.WriteElementString("DeathDate", item.EndDate.Value.ToLocalTime().ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
}
else if (!(item is Episode))
{
- writer.WriteElementString("EndDate", item.EndDate.Value.ToLocalTime().ToString("yyyy-MM-dd"));
+ writer.WriteElementString("EndDate", item.EndDate.Value.ToLocalTime().ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
}
}
@@ -263,12 +302,12 @@ namespace MediaBrowser.LocalMetadata.Savers
if (item.CommunityRating.HasValue)
{
- writer.WriteElementString("Rating", item.CommunityRating.Value.ToString(UsCulture));
+ writer.WriteElementString("Rating", item.CommunityRating.Value.ToString(_usCulture));
}
if (item.ProductionYear.HasValue && !(item is Person))
{
- writer.WriteElementString("ProductionYear", item.ProductionYear.Value.ToString(UsCulture));
+ writer.WriteElementString("ProductionYear", item.ProductionYear.Value.ToString(_usCulture));
}
var hasAspectRatio = item as IHasAspectRatio;
@@ -295,9 +334,9 @@ namespace MediaBrowser.LocalMetadata.Savers
if (runTimeTicks.HasValue)
{
- var timespan = TimeSpan.FromTicks(runTimeTicks.Value);
+ var timespan = TimeSpan.FromTicks(runTimeTicks!.Value);
- writer.WriteElementString("RunningTime", Math.Floor(timespan.TotalMinutes).ToString(UsCulture));
+ writer.WriteElementString("RunningTime", Math.Floor(timespan.TotalMinutes).ToString(_usCulture));
}
if (item.ProviderIds != null)
@@ -370,7 +409,7 @@ namespace MediaBrowser.LocalMetadata.Savers
if (person.SortOrder.HasValue)
{
- writer.WriteElementString("SortOrder", person.SortOrder.Value.ToString(UsCulture));
+ writer.WriteElementString("SortOrder", person.SortOrder.Value.ToString(_usCulture));
}
writer.WriteEndElement();
@@ -400,6 +439,11 @@ namespace MediaBrowser.LocalMetadata.Savers
AddMediaInfo(item, writer);
}
+ /// <summary>
+ /// Add shares.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="writer">The xml writer.</param>
public static void AddShares(IHasShares item, XmlWriter writer)
{
writer.WriteStartElement("Shares");
@@ -422,13 +466,13 @@ namespace MediaBrowser.LocalMetadata.Savers
/// <summary>
/// Appends the media info.
/// </summary>
- /// <typeparam name="T"></typeparam>
+ /// <param name="item">The item.</param>
+ /// <param name="writer">The xml writer.</param>
+ /// <typeparam name="T">Type of item.</typeparam>
public static void AddMediaInfo<T>(T item, XmlWriter writer)
where T : BaseItem
{
- var video = item as Video;
-
- if (video != null)
+ if (item is Video video)
{
if (video.Video3DFormat.HasValue)
{
@@ -454,6 +498,13 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
+ /// <summary>
+ /// ADd linked children.
+ /// </summary>
+ /// <param name="item">The item.</param>
+ /// <param name="writer">The xml writer.</param>
+ /// <param name="pluralNodeName">The plural node name.</param>
+ /// <param name="singularNodeName">The singular node name.</param>
public static void AddLinkedChildren(Folder item, XmlWriter writer, string pluralNodeName, string singularNodeName)
{
var items = item.LinkedChildren
diff --git a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
index 1dc09bf18..b08387b0c 100644
--- a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs
@@ -9,8 +9,26 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Savers
{
+ /// <summary>
+ /// Box set xml saver.
+ /// </summary>
public class BoxSetXmlSaver : BaseXmlSaver
{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="BoxSetXmlSaver"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="configurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
+ /// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{BoxSetXmlSaver}"/> interface.</param>
+ public BoxSetXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger<BoxSetXmlSaver> logger)
+ : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
+ {
+ }
+
+ /// <inheritdoc />
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
@@ -21,18 +39,15 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is BoxSet && updateType >= ItemUpdateType.MetadataDownload;
}
+ /// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
}
+ /// <inheritdoc />
protected override string GetLocalSavePath(BaseItem item)
{
return Path.Combine(item.Path, "collection.xml");
}
-
- public BoxSetXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger<BoxSetXmlSaver> logger)
- : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
- {
- }
}
}
diff --git a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
index bbb0a3501..c2f106423 100644
--- a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
+++ b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs
@@ -9,6 +9,9 @@ using Microsoft.Extensions.Logging;
namespace MediaBrowser.LocalMetadata.Savers
{
+ /// <summary>
+ /// Playlist xml saver.
+ /// </summary>
public class PlaylistXmlSaver : BaseXmlSaver
{
/// <summary>
@@ -16,6 +19,21 @@ namespace MediaBrowser.LocalMetadata.Savers
/// </summary>
public const string DefaultPlaylistFilename = "playlist.xml";
+ /// <summary>
+ /// Initializes a new instance of the <see cref="PlaylistXmlSaver"/> class.
+ /// </summary>
+ /// <param name="fileSystem">Instance of the <see cref="IFileSystem"/> interface.</param>
+ /// <param name="configurationManager">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
+ /// <param name="libraryManager">Instance of the <see cref="ILibraryManager"/> interface.</param>
+ /// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
+ /// <param name="userDataManager">Instance of the <see cref="IUserDataManager"/> interface.</param>
+ /// <param name="logger">Instance of the <see cref="ILogger{PlaylistXmlSaver}"/> interface.</param>
+ public PlaylistXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger<PlaylistXmlSaver> logger)
+ : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
+ {
+ }
+
+ /// <inheritdoc />
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
@@ -26,6 +44,7 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is Playlist && updateType >= ItemUpdateType.MetadataImport;
}
+ /// <inheritdoc />
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
var game = (Playlist)item;
@@ -36,12 +55,18 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
+ /// <inheritdoc />
protected override string GetLocalSavePath(BaseItem item)
{
- return GetSavePath(item.Path, FileSystem);
+ return GetSavePath(item.Path);
}
- public static string GetSavePath(string itemPath, IFileSystem fileSystem)
+ /// <summary>
+ /// Get the save path.
+ /// </summary>
+ /// <param name="itemPath">The item path.</param>
+ /// <returns>The save path.</returns>
+ public static string GetSavePath(string itemPath)
{
var path = itemPath;
@@ -52,10 +77,5 @@ namespace MediaBrowser.LocalMetadata.Savers
return Path.Combine(path, DefaultPlaylistFilename);
}
-
- public PlaylistXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger<PlaylistXmlSaver> logger)
- : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger)
- {
- }
}
}
diff --git a/MediaBrowser.LocalMetadata/XmlProviderUtils.cs b/MediaBrowser.LocalMetadata/XmlProviderUtils.cs
new file mode 100644
index 000000000..e247b8bb8
--- /dev/null
+++ b/MediaBrowser.LocalMetadata/XmlProviderUtils.cs
@@ -0,0 +1,13 @@
+namespace MediaBrowser.LocalMetadata
+{
+ /// <summary>
+ /// The xml provider utils.
+ /// </summary>
+ public static class XmlProviderUtils
+ {
+ /// <summary>
+ /// Gets the name.
+ /// </summary>
+ public static string Name => "Emby Xml";
+ }
+}