Update to 3.5.2 and .net core 2.1

This commit is contained in:
stefan
2018-09-12 19:26:21 +02:00
parent c32d865638
commit 48facb797e
1419 changed files with 27525 additions and 88927 deletions

View File

@@ -10,11 +10,11 @@ using MediaBrowser.Model.IO;
namespace MediaBrowser.LocalMetadata
{
public abstract class BaseXmlProvider<T> : ILocalMetadataProvider<T>, IHasItemChangeMonitor, IHasOrder
where T : IHasMetadata, new()
where T : BaseItem, new()
{
protected IFileSystem FileSystem;
public async Task<MetadataResult<T>> GetMetadata(ItemInfo info,
public Task<MetadataResult<T>> GetMetadata(ItemInfo info,
IDirectoryService directoryService,
CancellationToken cancellationToken)
{
@@ -24,7 +24,7 @@ namespace MediaBrowser.LocalMetadata
if (file == null)
{
return result;
return Task.FromResult(result);
}
var path = file.FullName;
@@ -45,7 +45,7 @@ namespace MediaBrowser.LocalMetadata
result.HasMetadata = false;
}
return result;
return Task.FromResult(result);
}
protected abstract void Fetch(MetadataResult<T> result, string path, CancellationToken cancellationToken);
@@ -57,7 +57,7 @@ namespace MediaBrowser.LocalMetadata
protected abstract FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService);
public bool HasChanged(IHasMetadata item, IDirectoryService directoryService)
public bool HasChanged(BaseItem item, IDirectoryService directoryService)
{
var file = GetXmlFile(new ItemInfo(item), directoryService);

View File

@@ -21,7 +21,7 @@ namespace MediaBrowser.LocalMetadata.Images
get { return "Collection Folder Images"; }
}
public bool Supports(IHasMetadata item)
public bool Supports(BaseItem item)
{
return item is CollectionFolder && item.SupportsLocalMetadata;
}
@@ -35,7 +35,7 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
public List<LocalImageInfo> GetImages(IHasMetadata item, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var collectionFolder = (CollectionFolder)item;

View File

@@ -29,12 +29,12 @@ namespace MediaBrowser.LocalMetadata.Images
get { return 0; }
}
public bool Supports(IHasMetadata item)
public bool Supports(BaseItem item)
{
return item is Episode && item.SupportsLocalMetadata;
}
public List<LocalImageInfo> GetImages(IHasMetadata item, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var parentPath = _fileSystem.GetDirectoryName(item.Path);

View File

@@ -26,7 +26,7 @@ namespace MediaBrowser.LocalMetadata.Images
get { return "Internal Images"; }
}
public bool Supports(IHasMetadata item)
public bool Supports(BaseItem item)
{
if (item is Photo)
{
@@ -61,7 +61,7 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
public List<LocalImageInfo> GetImages(IHasMetadata item, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var path = item.GetInternalMetadataPath();

View File

@@ -32,12 +32,12 @@ namespace MediaBrowser.LocalMetadata.Images
get { return 0; }
}
public bool Supports(IHasMetadata item)
public bool Supports(BaseItem item)
{
if (item.SupportsLocalMetadata)
{
// Episode has it's own provider
if (item.IsOwnedItem || item is Episode || item is Audio || item is Photo)
if (item is Episode || item is Audio || item is Photo)
{
return false;
}
@@ -53,7 +53,7 @@ namespace MediaBrowser.LocalMetadata.Images
{
var series = season.Series;
if (series != null && series.LocationType == LocationType.FileSystem)
if (series != null && series.IsFileProtocol)
{
return true;
}
@@ -63,9 +63,9 @@ namespace MediaBrowser.LocalMetadata.Images
return false;
}
private IEnumerable<FileSystemMetadata> GetFiles(IHasMetadata item, bool includeDirectories, IDirectoryService directoryService)
private IEnumerable<FileSystemMetadata> GetFiles(BaseItem item, bool includeDirectories, IDirectoryService directoryService)
{
if (item.LocationType != LocationType.FileSystem)
if (!item.IsFileProtocol)
{
return new List<FileSystemMetadata>();
}
@@ -85,7 +85,7 @@ namespace MediaBrowser.LocalMetadata.Images
.OrderBy(i => BaseItem.SupportedImageExtensionsList.IndexOf(i.Extension ?? string.Empty));
}
public List<LocalImageInfo> GetImages(IHasMetadata item, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, IDirectoryService directoryService)
{
var files = GetFiles(item, true, directoryService).ToList();
@@ -96,12 +96,12 @@ namespace MediaBrowser.LocalMetadata.Images
return list;
}
public List<LocalImageInfo> GetImages(IHasMetadata item, string path, bool isPathInMediaFolder, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, string path, bool isPathInMediaFolder, IDirectoryService directoryService)
{
return GetImages(item, new[] { path }, isPathInMediaFolder, directoryService);
}
public List<LocalImageInfo> GetImages(IHasMetadata item, IEnumerable<string> paths, bool arePathsInMediaFolders, IDirectoryService directoryService)
public List<LocalImageInfo> GetImages(BaseItem item, IEnumerable<string> paths, bool arePathsInMediaFolders, IDirectoryService directoryService)
{
IEnumerable<FileSystemMetadata> files = paths.SelectMany(i => _fileSystem.GetFiles(i, BaseItem.SupportedImageExtensions, true, false));
@@ -115,7 +115,7 @@ namespace MediaBrowser.LocalMetadata.Images
return list;
}
private void PopulateImages(IHasMetadata item, List<LocalImageInfo> images, List<FileSystemMetadata> files, bool supportParentSeriesFiles, IDirectoryService directoryService)
private void PopulateImages(BaseItem item, List<LocalImageInfo> images, List<FileSystemMetadata> files, bool supportParentSeriesFiles, IDirectoryService directoryService)
{
if (supportParentSeriesFiles)
{
@@ -259,7 +259,7 @@ namespace MediaBrowser.LocalMetadata.Images
"movie"
};
private void PopulatePrimaryImages(IHasMetadata item, List<LocalImageInfo> images, List<FileSystemMetadata> files, string imagePrefix, bool isInMixedFolder)
private void PopulatePrimaryImages(BaseItem item, List<LocalImageInfo> images, List<FileSystemMetadata> files, string imagePrefix, bool isInMixedFolder)
{
string[] imageFileNames;
@@ -315,7 +315,7 @@ namespace MediaBrowser.LocalMetadata.Images
}
}
private void PopulateBackdrops(IHasMetadata 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, IDirectoryService directoryService)
{
if (!string.IsNullOrEmpty(item.Path))
{
@@ -416,7 +416,7 @@ namespace MediaBrowser.LocalMetadata.Images
var seasonNumber = season.IndexNumber;
var series = season.Series;
if (!seasonNumber.HasValue || series.LocationType != LocationType.FileSystem)
if (!seasonNumber.HasValue || !series.IsFileProtocol)
{
return;
}

View File

@@ -1,85 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs"/>
</ItemGroup>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{7EF9F3E0-697D-42F3-A08F-19DEB5F84392}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>MediaBrowser.LocalMetadata</RootNamespace>
<AssemblyName>MediaBrowser.LocalMetadata</AssemblyName>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<TargetFrameworkProfile>Profile7</TargetFrameworkProfile>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFramework>netcoreapp2.1</TargetFramework>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\SharedVersion.cs">
<Link>Properties\SharedVersion.cs</Link>
</Compile>
<Compile Include="BaseXmlProvider.cs" />
<Compile Include="Images\CollectionFolderImageProvider.cs" />
<Compile Include="Images\EpisodeLocalImageProvider.cs" />
<Compile Include="Images\InternalMetadataFolderImageProvider.cs" />
<Compile Include="Images\LocalImageProvider.cs" />
<Compile Include="Parsers\BaseItemXmlParser.cs" />
<Compile Include="Parsers\BoxSetXmlParser.cs" />
<Compile Include="Parsers\GameSystemXmlParser.cs" />
<Compile Include="Parsers\GameXmlParser.cs" />
<Compile Include="Parsers\PlaylistXmlParser.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Providers\BoxSetXmlProvider.cs" />
<Compile Include="Providers\FolderXmlProvider.cs" />
<Compile Include="Providers\GameSystemXmlProvider.cs" />
<Compile Include="Providers\GameXmlProvider.cs" />
<Compile Include="Providers\PlaylistXmlProvider.cs" />
<Compile Include="Savers\BaseXmlSaver.cs" />
<Compile Include="Savers\BoxSetXmlSaver.cs" />
<Compile Include="Savers\FolderXmlSaver.cs" />
<Compile Include="Savers\GameSystemXmlSaver.cs" />
<Compile Include="Savers\GameXmlSaver.cs" />
<Compile Include="Savers\PersonXmlSaver.cs" />
<Compile Include="Savers\PlaylistXmlSaver.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj">
<Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
<Name>MediaBrowser.Common</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
<Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
<Name>MediaBrowser.Controller</Name>
</ProjectReference>
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj">
<Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
<Name>MediaBrowser.Model</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="EmitMSBuildWarning" BeforeTargets="Build">
<Warning Text="Packages containing MSBuild targets and props files cannot be fully installed in projects targeting multiple frameworks. The MSBuild targets and props files have been ignored." />
</Target>
</Project>

View File

@@ -253,18 +253,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
break;
}
case "Website":
{
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
item.HomePageUrl = val;
}
break;
}
case "LockedFields":
{
var val = reader.ReadElementContentAsString();
@@ -462,13 +450,9 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
var hasTrailers = item as IHasTrailers;
if (hasTrailers != null)
if (!string.IsNullOrWhiteSpace(val))
{
if (!string.IsNullOrWhiteSpace(val))
{
hasTrailers.AddTrailerUrl(val);
}
item.AddTrailerUrl(val);
}
break;
}
@@ -494,11 +478,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
using (var subtree = reader.ReadSubtree())
{
var hasTrailers = item as IHasTrailers;
if (hasTrailers != null)
{
FetchDataFromTrailersNode(subtree, hasTrailers);
}
FetchDataFromTrailersNode(subtree, item);
}
}
else
@@ -726,9 +706,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
}
}
private void FetchFromSharesNode(XmlReader reader, IHasShares item)
{
var list = new List<Share>();
reader.MoveToContent();
reader.Read();
@@ -746,20 +727,24 @@ namespace MediaBrowser.LocalMetadata.Parsers
reader.Read();
continue;
}
using (var subtree = reader.ReadSubtree())
using (var subReader = reader.ReadSubtree())
{
var share = GetShareFromNode(subtree);
if (share != null)
var child = GetShare(subReader);
if (child != null)
{
item.Shares.Add(share);
list.Add(child);
}
}
break;
}
default:
reader.Skip();
break;
{
reader.Skip();
break;
}
}
}
else
@@ -767,6 +752,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
reader.Read();
}
}
item.Shares = list.ToArray();
}
private Share GetShareFromNode(XmlReader reader)
@@ -1012,7 +999,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
}
private void FetchDataFromTrailersNode(XmlReader reader, IHasTrailers item)
private void FetchDataFromTrailersNode(XmlReader reader, T item)
{
reader.MoveToContent();
reader.Read();
@@ -1193,6 +1180,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
linkedItem.Path = reader.ReadElementContentAsString();
break;
}
case "ItemId":
{
linkedItem.LibraryItemId = reader.ReadElementContentAsString();
break;
}
default:
reader.Skip();
@@ -1206,7 +1198,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
// This is valid
if (!string.IsNullOrWhiteSpace(linkedItem.Path))
if (!string.IsNullOrWhiteSpace(linkedItem.Path) || !string.IsNullOrWhiteSpace(linkedItem.LibraryItemId))
{
return linkedItem;
}
@@ -1277,7 +1269,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
value = value.Trim().Trim(separator);
return string.IsNullOrWhiteSpace(value) ? new string[] { } : Split(value, separator, StringSplitOptions.RemoveEmptyEntries);
return string.IsNullOrWhiteSpace(value) ? Array.Empty<string>() : Split(value, separator, StringSplitOptions.RemoveEmptyEntries);
}
/// <summary>
@@ -1287,7 +1279,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
/// <param name="separators">The separators.</param>
/// <param name="options">The options.</param>
/// <returns>System.String[][].</returns>
private static string[] Split(string val, char[] separators, StringSplitOptions options)
private string[] Split(string val, char[] separators, StringSplitOptions options)
{
return val.Split(separators, options);
}

View File

@@ -12,14 +12,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
public class GameSystemXmlParser : BaseItemXmlParser<GameSystem>
{
private readonly Task _cachedTask = Task.FromResult(true);
public Task FetchAsync(MetadataResult<GameSystem> item, string metadataFile, CancellationToken cancellationToken)
{
Fetch(item, metadataFile, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
return _cachedTask;
return Task.CompletedTask;
}
/// <summary>

View File

@@ -18,14 +18,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
{
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private readonly Task _cachedTask = Task.FromResult(true);
public Task FetchAsync(MetadataResult<Game> item, string metadataFile, CancellationToken cancellationToken)
{
Fetch(item, metadataFile, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
return _cachedTask;
return Task.CompletedTask;
}
/// <summary>

View File

@@ -20,21 +20,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
case "OwnerUserId":
{
var userId = reader.ReadElementContentAsString();
if (!item.Shares.Any(i => string.Equals(userId, i.UserId, StringComparison.OrdinalIgnoreCase)))
{
item.Shares.Add(new Share
{
UserId = userId,
CanEdit = true
});
}
break;
}
case "PlaylistMediaType":
{
item.PlaylistMediaType = reader.ReadElementContentAsString();
@@ -57,21 +42,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
}
break;
case "Shares":
if (!reader.IsEmptyElement)
{
using (var subReader = reader.ReadSubtree())
{
FetchFromSharesNode(subReader, item);
}
}
else
{
reader.Read();
}
break;
default:
base.FetchDataFromXmlNode(reader, result);
break;
@@ -128,56 +98,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
item.LinkedChildren = list.ToArray(list.Count);
}
private void FetchFromSharesNode(XmlReader reader, Playlist item)
{
var list = new List<Share>();
reader.MoveToContent();
reader.Read();
// Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Share":
{
if (reader.IsEmptyElement)
{
reader.Read();
continue;
}
using (var subReader = reader.ReadSubtree())
{
var child = GetShare(subReader);
if (child != null)
{
list.Add(child);
}
}
break;
}
default:
{
reader.Skip();
break;
}
}
}
else
{
reader.Read();
}
}
item.Shares = list;
}
public PlaylistXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem)
{
}

View File

@@ -1,41 +0,0 @@
using System.IO;
using System.Threading;
using MediaBrowser.Model.IO;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Providers;
using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Xml;
namespace MediaBrowser.LocalMetadata.Providers
{
/// <summary>
/// Provides metadata for Folders and all subclasses by parsing folder.xml
/// </summary>
public class FolderXmlProvider : BaseXmlProvider<Folder>
{
private readonly ILogger _logger;
private readonly IProviderManager _providerManager;
protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; }
public FolderXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
: base(fileSystem)
{
_logger = logger;
_providerManager = providerManager;
XmlReaderSettingsFactory = xmlReaderSettingsFactory;
}
protected override void Fetch(MetadataResult<Folder> result, string path, CancellationToken cancellationToken)
{
new BaseItemXmlParser<Folder>(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken);
}
protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
{
return directoryService.GetFile(Path.Combine(info.Path, "folder.xml"));
}
}
}

View File

@@ -4,7 +4,7 @@ using MediaBrowser.LocalMetadata.Parsers;
using MediaBrowser.Model.Logging;
using System.IO;
using System.Threading;
using MediaBrowser.LocalMetadata.Savers;
using MediaBrowser.Controller.IO;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Xml;
@@ -32,7 +32,7 @@ namespace MediaBrowser.LocalMetadata.Providers
protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService)
{
return directoryService.GetFile(Path.Combine(info.Path, "playlist.xml"));
return directoryService.GetFile(PlaylistXmlSaver.GetSavePath(info.Path, FileSystem));
}
}
}

View File

@@ -29,92 +29,6 @@ namespace MediaBrowser.LocalMetadata.Savers
{
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
private static readonly Dictionary<string, string> CommonTags = new[] {
"Added",
"AspectRatio",
"AudioDbAlbumId",
"AudioDbArtistId",
"BirthDate",
// Deprecated. No longer saving in this field.
"certification",
"Chapters",
"ContentRating",
"Countries",
"CustomRating",
"CriticRating",
"DeathDate",
"DisplayOrder",
"EndDate",
"Genres",
"Genre",
"GamesDbId",
// Deprecated. No longer saving in this field.
"IMDB_ID",
"IMDB",
// Deprecated. No longer saving in this field.
"IMDbId",
"Language",
"LocalTitle",
"OriginalTitle",
"LockData",
"LockedFields",
"Format3D",
// Deprecated. No longer saving in this field.
"MPAARating",
"MusicBrainzArtistId",
"MusicBrainzAlbumArtistId",
"MusicBrainzAlbumId",
"MusicBrainzReleaseGroupId",
// Deprecated. No longer saving in this field.
"MusicbrainzId",
"Overview",
"Persons",
"PremiereDate",
"ProductionYear",
"Rating",
"RottenTomatoesId",
"RunningTime",
// Deprecated. No longer saving in this field.
"Runtime",
"SortTitle",
"Studios",
"Tags",
// Deprecated. No longer saving in this field.
"TagLine",
"Taglines",
"TMDbCollectionId",
"TMDbId",
// Deprecated. No longer saving in this field.
"Trailer",
"Trailers",
"TVcomId",
"TvDbId",
"TVRageId",
"Website",
"Zap2ItId",
"CollectionItems",
"PlaylistItems",
"Shares"
}.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase);
public BaseXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger, IXmlReaderSettingsFactory xmlReaderSettingsFactory)
{
FileSystem = fileSystem;
@@ -150,7 +64,7 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
public string GetSavePath(IHasMetadata item)
public string GetSavePath(BaseItem item)
{
return GetLocalSavePath(item);
}
@@ -160,14 +74,14 @@ namespace MediaBrowser.LocalMetadata.Savers
/// </summary>
/// <param name="item">The item.</param>
/// <returns>System.String.</returns>
protected abstract string GetLocalSavePath(IHasMetadata item);
protected abstract string GetLocalSavePath(BaseItem item);
/// <summary>
/// Gets the name of the root element.
/// </summary>
/// <param name="item">The item.</param>
/// <returns>System.String.</returns>
protected virtual string GetRootElementName(IHasMetadata item)
protected virtual string GetRootElementName(BaseItem item)
{
return "Item";
}
@@ -178,14 +92,9 @@ namespace MediaBrowser.LocalMetadata.Savers
/// <param name="item">The item.</param>
/// <param name="updateType">Type of the update.</param>
/// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
public abstract bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType);
public abstract bool IsEnabledFor(BaseItem item, ItemUpdateType updateType);
protected virtual List<string> GetTagsUsed()
{
return new List<string>();
}
public void Save(IHasMetadata item, CancellationToken cancellationToken)
public void Save(BaseItem item, CancellationToken cancellationToken)
{
var path = GetSavePath(item);
@@ -204,27 +113,15 @@ namespace MediaBrowser.LocalMetadata.Savers
private void SaveToFile(Stream stream, string path)
{
FileSystem.CreateDirectory(FileSystem.GetDirectoryName(path));
var file = FileSystem.GetFileInfo(path);
var wasHidden = false;
// This will fail if the file is hidden
if (file.Exists)
{
if (file.IsHidden)
{
wasHidden = true;
}
FileSystem.SetAttributes(path, false, false);
}
// On Windows, savint the file will fail if the file is hidden or readonly
FileSystem.SetAttributes(path, false, false);
using (var filestream = FileSystem.GetFileStream(path, FileOpenMode.Create, FileAccessMode.Write, FileShareMode.Read))
{
stream.CopyTo(filestream);
}
if (wasHidden || ConfigurationManager.Configuration.SaveMetadataHidden)
if (ConfigurationManager.Configuration.SaveMetadataHidden)
{
SetHidden(path, true);
}
@@ -242,7 +139,7 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
private void Save(IHasMetadata item, Stream stream, string xmlPath)
private void Save(BaseItem item, Stream stream, string xmlPath)
{
var settings = new XmlWriterSettings
{
@@ -259,7 +156,7 @@ namespace MediaBrowser.LocalMetadata.Savers
writer.WriteStartElement(root);
var baseItem = item as BaseItem;
var baseItem = item;
if (baseItem != null)
{
@@ -268,32 +165,13 @@ namespace MediaBrowser.LocalMetadata.Savers
WriteCustomElements(item, writer);
var tagsUsed = GetTagsUsed();
try
{
AddCustomTags(xmlPath, tagsUsed, writer, Logger, FileSystem);
}
catch (FileNotFoundException)
{
}
catch (IOException)
{
}
catch (XmlException ex)
{
Logger.ErrorException("Error reading existng xml", ex);
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
protected abstract void WriteCustomElements(IHasMetadata item, XmlWriter writer);
protected abstract void WriteCustomElements(BaseItem item, XmlWriter writer);
public const string DateAddedFormat = "yyyy-MM-dd HH:mm:ss";
@@ -373,20 +251,16 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
var hasTrailers = item as IHasTrailers;
if (hasTrailers != null)
if (item.RemoteTrailers.Length > 0)
{
if (hasTrailers.RemoteTrailers.Length > 0)
writer.WriteStartElement("Trailers");
foreach (var trailer in item.RemoteTrailers)
{
writer.WriteStartElement("Trailers");
foreach (var trailer in hasTrailers.RemoteTrailers)
{
writer.WriteElementString("Trailer", trailer.Url);
}
writer.WriteEndElement();
writer.WriteElementString("Trailer", trailer.Url);
}
writer.WriteEndElement();
}
if (item.ProductionLocations.Length > 0)
@@ -417,11 +291,6 @@ namespace MediaBrowser.LocalMetadata.Savers
writer.WriteElementString("ProductionYear", item.ProductionYear.Value.ToString(UsCulture));
}
if (!string.IsNullOrEmpty(item.HomePageUrl))
{
writer.WriteElementString("Website", item.HomePageUrl);
}
var hasAspectRatio = item as IHasAspectRatio;
if (hasAspectRatio != null)
{
@@ -447,7 +316,7 @@ namespace MediaBrowser.LocalMetadata.Savers
{
var timespan = TimeSpan.FromTicks(runTimeTicks.Value);
writer.WriteElementString("RunningTime", Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture));
writer.WriteElementString("RunningTime", Math.Floor(timespan.TotalMinutes).ToString(UsCulture));
}
if (item.ProviderIds != null)
@@ -469,7 +338,7 @@ namespace MediaBrowser.LocalMetadata.Savers
writer.WriteEndElement();
}
if (item.Genres.Count > 0)
if (item.Genres.Length > 0)
{
writer.WriteStartElement("Genres");
@@ -536,7 +405,7 @@ namespace MediaBrowser.LocalMetadata.Savers
}
var playlist = item as Playlist;
if (playlist != null)
if (playlist != null && !Playlist.IsPlaylistFile(playlist.Path))
{
AddLinkedChildren(playlist, writer, "PlaylistItems", "PlaylistItem");
}
@@ -617,10 +486,19 @@ namespace MediaBrowser.LocalMetadata.Savers
foreach (var link in items)
{
if (!string.IsNullOrWhiteSpace(link.Path))
if (!string.IsNullOrWhiteSpace(link.Path) || !string.IsNullOrWhiteSpace(link.LibraryItemId))
{
writer.WriteStartElement(singularNodeName);
writer.WriteElementString("Path", link.Path);
if (!string.IsNullOrWhiteSpace(link.Path))
{
writer.WriteElementString("Path", link.Path);
}
if (!string.IsNullOrWhiteSpace(link.LibraryItemId))
{
writer.WriteElementString("ItemId", link.LibraryItemId);
}
writer.WriteEndElement();
}
}
@@ -628,62 +506,9 @@ namespace MediaBrowser.LocalMetadata.Savers
writer.WriteEndElement();
}
private static bool IsPersonType(PersonInfo person, string type)
private bool IsPersonType(PersonInfo person, string type)
{
return string.Equals(person.Type, type, StringComparison.OrdinalIgnoreCase) || string.Equals(person.Role, type, StringComparison.OrdinalIgnoreCase);
}
private void AddCustomTags(string path, List<string> xmlTagsUsed, XmlWriter writer, ILogger logger, IFileSystem fileSystem)
{
var settings = XmlReaderSettingsFactory.Create(false);
settings.CheckCharacters = false;
settings.IgnoreProcessingInstructions = true;
settings.IgnoreComments = true;
using (var fileStream = fileSystem.OpenRead(path))
{
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
{
// Use XmlReader for best performance
using (var reader = XmlReader.Create(streamReader, settings))
{
try
{
reader.MoveToContent();
}
catch (Exception ex)
{
logger.ErrorException("Error reading existing xml tags from {0}.", ex, path);
return;
}
reader.Read();
// Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
{
if (reader.NodeType == XmlNodeType.Element)
{
var name = reader.Name;
if (!CommonTags.ContainsKey(name) && !xmlTagsUsed.Contains(name, StringComparer.OrdinalIgnoreCase))
{
writer.WriteNode(reader, false);
}
else
{
reader.Skip();
}
}
else
{
reader.Read();
}
}
}
}
}
}
}
}

View File

@@ -17,7 +17,7 @@ namespace MediaBrowser.LocalMetadata.Savers
{
public class BoxSetXmlSaver : BaseXmlSaver
{
public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
{
@@ -27,11 +27,11 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is BoxSet && updateType >= ItemUpdateType.MetadataDownload;
}
protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
}
protected override string GetLocalSavePath(IHasMetadata item)
protected override string GetLocalSavePath(BaseItem item)
{
return Path.Combine(item.Path, "collection.xml");
}

View File

@@ -1,60 +0,0 @@
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Playlists;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Xml;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Xml;
namespace MediaBrowser.LocalMetadata.Savers
{
public class FolderXmlSaver : BaseXmlSaver
{
protected override string GetLocalSavePath(IHasMetadata item)
{
return Path.Combine(item.Path, "folder.xml");
}
protected override string GetRootElementName(IHasMetadata item)
{
return "Item";
}
public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
{
return false;
}
if (item is Folder)
{
if (!(item is Series) && !(item is BoxSet) && !(item is MusicArtist) && !(item is MusicAlbum) &&
!(item is Season) &&
!(item is GameSystem) &&
!(item is Playlist))
{
return updateType >= ItemUpdateType.MetadataEdit;
}
}
return false;
}
protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
{
}
public FolderXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger, xmlReaderSettingsFactory)
{
}
}
}

View File

@@ -16,7 +16,7 @@ namespace MediaBrowser.LocalMetadata.Savers
{
}
public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
{
@@ -26,17 +26,7 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is GameSystem && updateType >= ItemUpdateType.MetadataDownload;
}
protected override List<string> GetTagsUsed()
{
var list = new List<string>
{
"GameSystem"
};
return list;
}
protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
var gameSystem = (GameSystem)item;
@@ -46,12 +36,12 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
protected override string GetLocalSavePath(IHasMetadata item)
protected override string GetLocalSavePath(BaseItem item)
{
return Path.Combine(item.Path, "gamesystem.xml");
}
protected override string GetRootElementName(IHasMetadata item)
protected override string GetRootElementName(BaseItem item)
{
return "Item";
}

View File

@@ -16,9 +16,9 @@ namespace MediaBrowser.LocalMetadata.Savers
/// </summary>
public class GameXmlSaver : BaseXmlSaver
{
private static readonly CultureInfo UsCulture = new CultureInfo("en-US");
private readonly CultureInfo UsCulture = new CultureInfo("en-US");
public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
{
@@ -28,18 +28,7 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is Game && updateType >= ItemUpdateType.MetadataDownload;
}
protected override List<string> GetTagsUsed()
{
var list = new List<string>
{
"GameSystem",
"Players"
};
return list;
}
protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
var game = (Game)item;
@@ -53,12 +42,12 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
protected override string GetLocalSavePath(IHasMetadata item)
protected override string GetLocalSavePath(BaseItem item)
{
return GetGameSavePath((Game)item);
}
protected override string GetRootElementName(IHasMetadata item)
protected override string GetRootElementName(BaseItem item)
{
return "Item";
}

View File

@@ -13,7 +13,7 @@ namespace MediaBrowser.LocalMetadata.Savers
{
public class PlaylistXmlSaver : BaseXmlSaver
{
public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
public override bool IsEnabledFor(BaseItem item, ItemUpdateType updateType)
{
if (!item.SupportsLocalMetadata)
{
@@ -23,18 +23,7 @@ namespace MediaBrowser.LocalMetadata.Savers
return item is Playlist && updateType >= ItemUpdateType.MetadataImport;
}
protected override List<string> GetTagsUsed()
{
var list = new List<string>
{
"OwnerUserId",
"PlaylistMediaType"
};
return list;
}
protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer)
protected override void WriteCustomElements(BaseItem item, XmlWriter writer)
{
var game = (Playlist)item;
@@ -44,9 +33,21 @@ namespace MediaBrowser.LocalMetadata.Savers
}
}
protected override string GetLocalSavePath(IHasMetadata item)
protected override string GetLocalSavePath(BaseItem item)
{
return Path.Combine(item.Path, "playlist.xml");
return GetSavePath(item.Path, FileSystem);
}
public static string GetSavePath(string itemPath, IFileSystem fileSystem)
{
var path = itemPath;
if (Playlist.IsPlaylistFile(path))
{
return Path.ChangeExtension(itemPath, ".xml");
}
return Path.Combine(path, "playlist.xml");
}
public PlaylistXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger, xmlReaderSettingsFactory)