diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-30 03:02:23 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2016-10-30 03:02:23 -0400 |
| commit | f676ea63156f959d08eb4d324274ef2fef853933 (patch) | |
| tree | 65d53b2a41d0805f73fa8c4cab5d1b52c6a545c0 | |
| parent | 3c305512c054527fb8fe1629d6aabb7e0009bc38 (diff) | |
make local metadata project portable
31 files changed, 603 insertions, 926 deletions
diff --git a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs index cf95e4629..9f5a12104 100644 --- a/MediaBrowser.LocalMetadata/BaseXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/BaseXmlProvider.cs @@ -40,7 +40,7 @@ namespace MediaBrowser.LocalMetadata { result.HasMetadata = false; } - catch (DirectoryNotFoundException) + catch (IOException) { result.HasMetadata = false; } diff --git a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs index 6b2056289..8a6dde6c4 100644 --- a/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/ImagesByNameImageProvider.cs @@ -49,7 +49,7 @@ namespace MediaBrowser.LocalMetadata.Images { return new LocalImageProvider(_fileSystem).GetImages(item, path, directoryService); } - catch (DirectoryNotFoundException) + catch (IOException) { return new List<LocalImageInfo>(); } diff --git a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs index e4ddb409f..b29182d96 100644 --- a/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs +++ b/MediaBrowser.LocalMetadata/Images/InternalMetadataFolderImageProvider.cs @@ -69,7 +69,7 @@ namespace MediaBrowser.LocalMetadata.Images { return new LocalImageProvider(_fileSystem).GetImages(item, path, directoryService); } - catch (DirectoryNotFoundException) + catch (IOException) { return new List<LocalImageInfo>(); } diff --git a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj index f2812eb3a..8193e6afd 100644 --- a/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj +++ b/MediaBrowser.LocalMetadata/MediaBrowser.LocalMetadata.csproj @@ -9,10 +9,11 @@ <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>MediaBrowser.LocalMetadata</RootNamespace> <AssemblyName>MediaBrowser.LocalMetadata</AssemblyName> - <TargetFrameworkVersion>v4.6</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> - <TargetFrameworkProfile /> + <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <TargetFrameworkProfile>Profile7</TargetFrameworkProfile> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> @@ -32,12 +33,6 @@ <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> - <Reference Include="System" /> - <Reference Include="System.Core" /> - <Reference Include="Microsoft.CSharp" /> - <Reference Include="System.Xml" /> - </ItemGroup> - <ItemGroup> <Compile Include="..\SharedVersion.cs"> <Link>Properties\SharedVersion.cs</Link> </Compile> @@ -75,7 +70,6 @@ <Compile Include="Savers\GameXmlSaver.cs" /> <Compile Include="Savers\PersonXmlSaver.cs" /> <Compile Include="Savers\PlaylistXmlSaver.cs" /> - <Compile Include="Savers\XmlSaverHelpers.cs" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\MediaBrowser.Common\MediaBrowser.Common.csproj"> @@ -91,7 +85,7 @@ <Name>MediaBrowser.Model</Name> </ProjectReference> </ItemGroup> - <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <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"> diff --git a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs index a5d9947f4..d54e41308 100644 --- a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs @@ -9,7 +9,9 @@ using System.Xml; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { @@ -28,14 +30,19 @@ namespace MediaBrowser.LocalMetadata.Parsers private Dictionary<string, string> _validProviderIds; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } + protected IFileSystem FileSystem { get; private set; } + /// <summary> /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class. /// </summary> /// <param name="logger">The logger.</param> - public BaseItemXmlParser(ILogger logger, IProviderManager providerManager) + public BaseItemXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) { Logger = logger; ProviderManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; + FileSystem = fileSystem; } /// <summary> @@ -57,15 +64,13 @@ namespace MediaBrowser.LocalMetadata.Parsers throw new ArgumentNullException(); } - var settings = new XmlReaderSettings - { - CheckCharacters = false, - IgnoreProcessingInstructions = true, - IgnoreComments = true, - ValidationType = ValidationType.None - }; + var settings = XmlReaderSettingsFactory.Create(false); + + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - _validProviderIds = _validProviderIds = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); + _validProviderIds = _validProviderIds = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); var idInfos = ProviderManager.GetExternalIdInfos(item.Item); @@ -97,21 +102,24 @@ namespace MediaBrowser.LocalMetadata.Parsers { item.ResetPeople(); - using (var streamReader = new StreamReader(metadataFile, encoding)) + using (Stream fileStream = FileSystem.OpenRead(metadataFile)) { - // Use XmlReader for best performance - using (var reader = XmlReader.Create(streamReader, settings)) + using (var streamReader = new StreamReader(fileStream, encoding)) { - reader.MoveToContent(); - - // Loop through each element - while (reader.Read()) + // Use XmlReader for best performance + using (var reader = XmlReader.Create(streamReader, settings)) { - cancellationToken.ThrowIfCancellationRequested(); + reader.MoveToContent(); - if (reader.NodeType == XmlNodeType.Element) + // Loop through each element + while (reader.Read()) { - FetchDataFromXmlNode(reader, item); + cancellationToken.ThrowIfCancellationRequested(); + + if (reader.NodeType == XmlNodeType.Element) + { + FetchDataFromXmlNode(reader, item); + } } } } @@ -521,7 +529,7 @@ namespace MediaBrowser.LocalMetadata.Parsers { // 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(new XmlTextReader(new StringReader("<Persons>" + actors + "</Persons>")), itemResult); + FetchDataFromPersonsNode(XmlReader.Create(new StringReader("<Persons>" + actors + "</Persons>")), itemResult); } else { diff --git a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs index 9ebb357c6..d792373bf 100644 --- a/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/BoxSetXmlParser.cs @@ -4,16 +4,13 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System.Collections.Generic; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { public class BoxSetXmlParser : BaseItemXmlParser<BoxSet> { - public BoxSetXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<BoxSet> item) { switch (reader.Name) @@ -68,5 +65,9 @@ namespace MediaBrowser.LocalMetadata.Parsers item.Item.LinkedChildren = list; } + + public BoxSetXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs index 698f71e3c..9adc4e5a9 100644 --- a/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/EpisodeXmlParser.cs @@ -11,6 +11,7 @@ using System.Xml; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { @@ -22,8 +23,8 @@ namespace MediaBrowser.LocalMetadata.Parsers private List<LocalImageInfo> _imagesFound; private readonly IFileSystem _fileSystem; - public EpisodeXmlParser(ILogger logger, IFileSystem fileSystem, IProviderManager providerManager) - : base(logger, providerManager) + public EpisodeXmlParser(ILogger logger, IFileSystem fileSystem, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings) + : base(logger, providerManager, xmlSettings, fileSystem) { _fileSystem = fileSystem; } diff --git a/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs index 75df53958..8bf09e546 100644 --- a/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/GameSystemXmlParser.cs @@ -5,16 +5,13 @@ using MediaBrowser.Model.Logging; using System.Threading; using System.Threading.Tasks; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { public class GameSystemXmlParser : BaseItemXmlParser<GameSystem> { - public GameSystemXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - private readonly Task _cachedTask = Task.FromResult(true); public Task FetchAsync(MetadataResult<GameSystem> item, string metadataFile, CancellationToken cancellationToken) { @@ -62,5 +59,9 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } } + + public GameSystemXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs index 956b8baef..abce0582c 100644 --- a/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/GameXmlParser.cs @@ -5,7 +5,9 @@ using System.Xml; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { @@ -16,11 +18,6 @@ namespace MediaBrowser.LocalMetadata.Parsers { private readonly CultureInfo _usCulture = new CultureInfo("en-US"); - public GameXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - private readonly Task _cachedTask = Task.FromResult(true); public Task FetchAsync(MetadataResult<Game> item, string metadataFile, CancellationToken cancellationToken) { @@ -83,5 +80,9 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } } + + public GameXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs index 6e78d365e..08c895c43 100644 --- a/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/MovieXmlParser.cs @@ -3,6 +3,8 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { @@ -12,11 +14,6 @@ namespace MediaBrowser.LocalMetadata.Parsers public class BaseVideoXmlParser<T> : BaseItemXmlParser<T> where T : Video { - public BaseVideoXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - /// <summary> /// Fetches the data from XML node. /// </summary> @@ -46,19 +43,22 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } } + + public BaseVideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } public class MovieXmlParser : BaseVideoXmlParser<Movie> { - public MovieXmlParser(ILogger logger, IProviderManager providerManager) : base(logger, providerManager) + public MovieXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) { } } public class VideoXmlParser : BaseVideoXmlParser<Video> { - public VideoXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) + public VideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) { } } diff --git a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs index 5f0b447e8..f612d1108 100644 --- a/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/MusicVideoXmlParser.cs @@ -3,21 +3,14 @@ using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Logging; using System; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { public class MusicVideoXmlParser : BaseVideoXmlParser<MusicVideo> { /// <summary> - /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class. - /// </summary> - /// <param name="logger">The logger.</param> - public MusicVideoXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - - /// <summary> /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> @@ -50,5 +43,9 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } } + + public MusicVideoXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs index de46c0a86..4c45545fc 100644 --- a/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/PlaylistXmlParser.cs @@ -6,16 +6,13 @@ using System; using System.Collections.Generic; using System.Linq; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { public class PlaylistXmlParser : BaseItemXmlParser<Playlist> { - public PlaylistXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - protected override void FetchDataFromXmlNode(XmlReader reader, MetadataResult<Playlist> result) { var item = result.Item; @@ -139,5 +136,9 @@ namespace MediaBrowser.LocalMetadata.Parsers item.Shares = list; } + + public PlaylistXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs index 7b7fb4751..2ddd84378 100644 --- a/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs +++ b/MediaBrowser.LocalMetadata/Parsers/SeriesXmlParser.cs @@ -4,7 +4,9 @@ using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Providers; using MediaBrowser.Model.Entities; +using MediaBrowser.Model.IO; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Parsers { @@ -14,15 +16,6 @@ namespace MediaBrowser.LocalMetadata.Parsers public class SeriesXmlParser : BaseItemXmlParser<Series> { /// <summary> - /// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class. - /// </summary> - /// <param name="logger">The logger.</param> - public SeriesXmlParser(ILogger logger, IProviderManager providerManager) - : base(logger, providerManager) - { - } - - /// <summary> /// Fetches the data from XML node. /// </summary> /// <param name="reader">The reader.</param> @@ -116,5 +109,9 @@ namespace MediaBrowser.LocalMetadata.Parsers break; } } + + public SeriesXmlParser(ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory, IFileSystem fileSystem) : base(logger, providerManager, xmlReaderSettingsFactory, fileSystem) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs index af8c84786..88c51caaa 100644 --- a/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/BoxSetXmlProvider.cs @@ -7,6 +7,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -17,17 +18,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public BoxSetXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public BoxSetXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<BoxSet> result, string path, CancellationToken cancellationToken) { - new BoxSetXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new BoxSetXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs index 29f879cb0..7e0f1707f 100644 --- a/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/EpisodeXmlProvider.cs @@ -9,6 +9,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -16,12 +17,14 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + private readonly IXmlReaderSettingsFactory _xmlSettings; - public EpisodeXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public EpisodeXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + _xmlSettings = xmlSettings; } protected override void Fetch(MetadataResult<Episode> result, string path, CancellationToken cancellationToken) @@ -29,7 +32,7 @@ namespace MediaBrowser.LocalMetadata.Providers var images = new List<LocalImageInfo>(); var chapters = new List<ChapterInfo>(); - new EpisodeXmlParser(_logger, FileSystem, _providerManager).Fetch(result, images, path, cancellationToken); + new EpisodeXmlParser(_logger, FileSystem, _providerManager, _xmlSettings).Fetch(result, images, path, cancellationToken); result.Images = images; } diff --git a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs index 5322de98f..45cd8eb93 100644 --- a/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/FolderXmlProvider.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -17,17 +18,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public FolderXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + 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).Fetch(result, path, cancellationToken); + new BaseItemXmlParser<Folder>(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs index 9f4c662a2..8054b1204 100644 --- a/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/GameSystemXmlProvider.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -14,17 +15,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + private readonly IXmlReaderSettingsFactory _xmlSettings; - public GameSystemXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public GameSystemXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + _xmlSettings = xmlSettings; } protected override void Fetch(MetadataResult<GameSystem> result, string path, CancellationToken cancellationToken) { - new GameSystemXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new GameSystemXmlParser(_logger, _providerManager, _xmlSettings, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs index 91371e044..888eff416 100644 --- a/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/GameXmlProvider.cs @@ -7,6 +7,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -14,17 +15,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + private readonly IXmlReaderSettingsFactory _xmlSettings; - public GameXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public GameXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlSettings) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + _xmlSettings = xmlSettings; } protected override void Fetch(MetadataResult<Game> result, string path, CancellationToken cancellationToken) { - new GameXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new GameXmlParser(_logger, _providerManager, _xmlSettings, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs index 36c2e1ebe..0e59db75f 100644 --- a/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/MovieXmlProvider.cs @@ -7,6 +7,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -14,17 +15,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public MovieXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public MovieXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<Movie> result, string path, CancellationToken cancellationToken) { - new MovieXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new MovieXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs index 0ccd8cbc6..e0bbb119f 100644 --- a/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/MusicVideoXmlProvider.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -13,17 +14,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public MusicVideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public MusicVideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<MusicVideo> result, string path, CancellationToken cancellationToken) { - new MusicVideoXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new MusicVideoXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs index 1fac21c28..72cd1c4c8 100644 --- a/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/PersonXmlProvider.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -14,17 +15,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public PersonXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public PersonXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<Person> result, string path, CancellationToken cancellationToken) { - new BaseItemXmlParser<Person>(_logger, _providerManager).Fetch(result, path, cancellationToken); + new BaseItemXmlParser<Person>(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs index 4986976bd..cd839f9cc 100644 --- a/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/PlaylistXmlProvider.cs @@ -7,6 +7,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -14,17 +15,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public PlaylistXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public PlaylistXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<Playlist> result, string path, CancellationToken cancellationToken) { - new PlaylistXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new PlaylistXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs index 30530e85d..ce006ef38 100644 --- a/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/SeriesXmlProvider.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Providers; using MediaBrowser.LocalMetadata.Parsers; using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -17,17 +18,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public SeriesXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public SeriesXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<Series> result, string path, CancellationToken cancellationToken) { - new SeriesXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new SeriesXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs index a62f606c8..4a7149657 100644 --- a/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs +++ b/MediaBrowser.LocalMetadata/Providers/VideoXmlProvider.cs @@ -6,6 +6,7 @@ using System.Threading; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Providers { @@ -13,17 +14,19 @@ namespace MediaBrowser.LocalMetadata.Providers { private readonly ILogger _logger; private readonly IProviderManager _providerManager; + protected IXmlReaderSettingsFactory XmlReaderSettingsFactory { get; private set; } - public VideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager) + public VideoXmlProvider(IFileSystem fileSystem, ILogger logger, IProviderManager providerManager, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem) { _logger = logger; _providerManager = providerManager; + XmlReaderSettingsFactory = xmlReaderSettingsFactory; } protected override void Fetch(MetadataResult<Video> result, string path, CancellationToken cancellationToken) { - new VideoXmlParser(_logger, _providerManager).Fetch(result, path, cancellationToken); + new VideoXmlParser(_logger, _providerManager, XmlReaderSettingsFactory, FileSystem).Fetch(result, path, cancellationToken); } protected override FileSystemMetadata GetXmlFile(ItemInfo info, IDirectoryService directoryService) diff --git a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs index 23cdf00b6..85877cc5a 100644 --- a/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/BaseXmlSaver.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; +using System.Security; using System.Text; using System.Threading; using System.Xml; @@ -14,6 +15,7 @@ using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Persistence; +using MediaBrowser.Controller.Playlists; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Extensions; @@ -176,7 +178,10 @@ namespace MediaBrowser.LocalMetadata.Savers /// </summary> /// <param name="item">The item.</param> /// <returns>System.String.</returns> - protected abstract string GetRootElementName(IHasMetadata item); + protected virtual string GetRootElementName(IHasMetadata item) + { + return "Item"; + } /// <summary> /// Determines whether [is enabled for] [the specified item]. @@ -300,6 +305,393 @@ namespace MediaBrowser.LocalMetadata.Savers { var writtenProviderIds = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + if (!string.IsNullOrEmpty(item.OfficialRating)) + { + writer.WriteElementString("ContentRating", item.OfficialRating); + } + + //if (!string.IsNullOrEmpty(item.OfficialRatingDescription)) + //{ + // builder.Append("<MPAADescription>" + SecurityElement.Escape(item.OfficialRatingDescription) + "</MPAADescription>"); + //} + + //builder.Append("<Added>" + SecurityElement.Escape(item.DateCreated.ToLocalTime().ToString("G")) + "</Added>"); + + //builder.Append("<LockData>" + item.IsLocked.ToString().ToLower() + "</LockData>"); + + //if (item.LockedFields.Count > 0) + //{ + // builder.Append("<LockedFields>" + string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray()) + "</LockedFields>"); + //} + + //if (!string.IsNullOrEmpty(item.DisplayMediaType)) + //{ + // builder.Append("<Type>" + SecurityElement.Escape(item.DisplayMediaType) + "</Type>"); + //} + + //if (item.CriticRating.HasValue) + //{ + // builder.Append("<CriticRating>" + SecurityElement.Escape(item.CriticRating.Value.ToString(UsCulture)) + "</CriticRating>"); + //} + + //if (!string.IsNullOrEmpty(item.CriticRatingSummary)) + //{ + // builder.Append("<CriticRatingSummary><![CDATA[" + item.CriticRatingSummary + "]]></CriticRatingSummary>"); + //} + + //if (!string.IsNullOrEmpty(item.Overview)) + //{ + // builder.Append("<Overview><![CDATA[" + item.Overview + "]]></Overview>"); + //} + + //var hasOriginalTitle = item as IHasOriginalTitle; + //if (hasOriginalTitle != null) + //{ + // if (!string.IsNullOrEmpty(hasOriginalTitle.OriginalTitle)) + // { + // builder.Append("<OriginalTitle>" + SecurityElement.Escape(hasOriginalTitle.OriginalTitle) + "</OriginalTitle>"); + // } + //} + + //if (!string.IsNullOrEmpty(item.ShortOverview)) + //{ + // builder.Append("<ShortOverview><![CDATA[" + item.ShortOverview + "]]></ShortOverview>"); + //} + + //if (!string.IsNullOrEmpty(item.CustomRating)) + //{ + // builder.Append("<CustomRating>" + SecurityElement.Escape(item.CustomRating) + "</CustomRating>"); + //} + + //if (!string.IsNullOrEmpty(item.Name) && !(item is Episode)) + //{ + // builder.Append("<LocalTitle>" + SecurityElement.Escape(item.Name) + "</LocalTitle>"); + //} + + //if (!string.IsNullOrEmpty(item.ForcedSortName)) + //{ + // builder.Append("<SortTitle>" + SecurityElement.Escape(item.ForcedSortName) + "</SortTitle>"); + //} + + //if (item.PremiereDate.HasValue) + //{ + // if (item is Person) + // { + // builder.Append("<BirthDate>" + SecurityElement.Escape(item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "</BirthDate>"); + // } + // else if (!(item is Episode)) + // { + // builder.Append("<PremiereDate>" + SecurityElement.Escape(item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "</PremiereDate>"); + // } + //} + + //if (item.EndDate.HasValue) + //{ + // if (item is Person) + // { + // builder.Append("<DeathDate>" + SecurityElement.Escape(item.EndDate.Value.ToString("yyyy-MM-dd")) + "</DeathDate>"); + // } + // else if (!(item is Episode)) + // { + // builder.Append("<EndDate>" + SecurityElement.Escape(item.EndDate.Value.ToString("yyyy-MM-dd")) + "</EndDate>"); + // } + //} + + //var hasTrailers = item as IHasTrailers; + //if (hasTrailers != null) + //{ + // if (hasTrailers.RemoteTrailers.Count > 0) + // { + // builder.Append("<Trailers>"); + + // foreach (var trailer in hasTrailers.RemoteTrailers) + // { + // builder.Append("<Trailer>" + SecurityElement.Escape(trailer.Url) + "</Trailer>"); + // } + + // builder.Append("</Trailers>"); + // } + //} + + ////if (hasProductionLocations.ProductionLocations.Count > 0) + ////{ + //// builder.Append("<Countries>"); + + //// foreach (var name in hasProductionLocations.ProductionLocations) + //// { + //// builder.Append("<Country>" + SecurityElement.Escape(name) + "</Country>"); + //// } + + //// builder.Append("</Countries>"); + ////} + + //var hasDisplayOrder = item as IHasDisplayOrder; + //if (hasDisplayOrder != null && !string.IsNullOrEmpty(hasDisplayOrder.DisplayOrder)) + //{ + // builder.Append("<DisplayOrder>" + SecurityElement.Escape(hasDisplayOrder.DisplayOrder) + "</DisplayOrder>"); + //} + + //var hasMetascore = item as IHasMetascore; + //if (hasMetascore != null && hasMetascore.Metascore.HasValue) + //{ + // builder.Append("<Metascore>" + SecurityElement.Escape(hasMetascore.Metascore.Value.ToString(UsCulture)) + "</Metascore>"); + //} + + //var hasAwards = item as IHasAwards; + //if (hasAwards != null && !string.IsNullOrEmpty(hasAwards.AwardSummary)) + //{ + // builder.Append("<AwardSummary>" + SecurityElement.Escape(hasAwards.AwardSummary) + "</AwardSummary>"); + //} + + //var hasBudget = item as IHasBudget; + //if (hasBudget != null) + //{ + // if (hasBudget.Budget.HasValue) + // { + // builder.Append("<Budget>" + SecurityElement.Escape(hasBudget.Budget.Value.ToString(UsCulture)) + "</Budget>"); + // } + + // if (hasBudget.Revenue.HasValue) + // { + // builder.Append("<Revenue>" + SecurityElement.Escape(hasBudget.Revenue.Value.ToString(UsCulture)) + "</Revenue>"); + // } + //} + + //if (item.CommunityRating.HasValue) + //{ + // builder.Append("<Rating>" + SecurityElement.Escape(item.CommunityRating.Value.ToString(UsCulture)) + "</Rating>"); + //} + //if (item.VoteCount.HasValue) + //{ + // builder.Append("<VoteCount>" + SecurityElement.Escape(item.VoteCount.Value.ToString(UsCulture)) + "</VoteCount>"); + //} + + //if (item.ProductionYear.HasValue && !(item is Person)) + //{ + // builder.Append("<ProductionYear>" + SecurityElement.Escape(item.ProductionYear.Value.ToString(UsCulture)) + "</ProductionYear>"); + //} + + //if (!string.IsNullOrEmpty(item.HomePageUrl)) + //{ + // builder.Append("<Website>" + SecurityElement.Escape(item.HomePageUrl) + "</Website>"); + //} + + //var hasAspectRatio = item as IHasAspectRatio; + //if (hasAspectRatio != null) + //{ + // if (!string.IsNullOrEmpty(hasAspectRatio.AspectRatio)) + // { + // builder.Append("<AspectRatio>" + SecurityElement.Escape(hasAspectRatio.AspectRatio) + "</AspectRatio>"); + // } + //} + + //if (!string.IsNullOrEmpty(item.PreferredMetadataLanguage)) + //{ + // builder.Append("<Language>" + SecurityElement.Escape(item.PreferredMetadataLanguage) + "</Language>"); + //} + //if (!string.IsNullOrEmpty(item.PreferredMetadataCountryCode)) + //{ + // builder.Append("<CountryCode>" + SecurityElement.Escape(item.PreferredMetadataCountryCode) + "</CountryCode>"); + //} + + //// Use original runtime here, actual file runtime later in MediaInfo + //var runTimeTicks = item.RunTimeTicks; + + //if (runTimeTicks.HasValue) + //{ + // var timespan = TimeSpan.FromTicks(runTimeTicks.Value); + + // builder.Append("<RunningTime>" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + "</RunningTime>"); + //} + + //if (item.ProviderIds != null) + //{ + // foreach (var providerKey in item.ProviderIds.Keys) + // { + // var providerId = item.ProviderIds[providerKey]; + // if (!string.IsNullOrEmpty(providerId)) + // { + // builder.Append(string.Format("<{0}>{1}</{0}>", providerKey + "Id", SecurityElement.Escape(providerId))); + // } + // } + //} + + //if (!string.IsNullOrWhiteSpace(item.Tagline)) + //{ + // builder.Append("<Taglines>"); + // builder.Append("<Tagline>" + SecurityElement.Escape(item.Tagline) + "</Tagline>"); + // builder.Append("</Taglines>"); + //} + + //if (item.Genres.Count > 0) + //{ + // builder.Append("<Genres>"); + + // foreach (var genre in item.Genres) + // { + // builder.Append("<Genre>" + SecurityElement.Escape(genre) + "</Genre>"); + // } + + // builder.Append("</Genres>"); + //} + + //if (item.Studios.Count > 0) + //{ + // builder.Append("<Studios>"); + + // foreach (var studio in item.Studios) + // { + // builder.Append("<Studio>" + SecurityElement.Escape(studio) + "</Studio>"); + // } + + // builder.Append("</Studios>"); + //} + + //if (item.Tags.Count > 0) + //{ + // builder.Append("<Tags>"); + + // foreach (var tag in item.Tags) + // { + // builder.Append("<Tag>" + SecurityElement.Escape(tag) + "</Tag>"); + // } + + // builder.Append("</Tags>"); + //} + + //if (item.Keywords.Count > 0) + //{ + // builder.Append("<PlotKeywords>"); + + // foreach (var tag in item.Keywords) + // { + // builder.Append("<PlotKeyword>" + SecurityElement.Escape(tag) + "</PlotKeyword>"); + // } + + // builder.Append("</PlotKeywords>"); + //} + + //var people = libraryManager.GetPeople(item); + + //if (people.Count > 0) + //{ + // builder.Append("<Persons>"); + + // foreach (var person in people) + // { + // builder.Append("<Person>"); + // builder.Append("<Name>" + SecurityElement.Escape(person.Name) + "</Name>"); + // builder.Append("<Type>" + SecurityElement.Escape(person.Type) + "</Type>"); + // builder.Append("<Role>" + SecurityElement.Escape(person.Role) + "</Role>"); + + // if (person.SortOrder.HasValue) + // { + // builder.Append("<SortOrder>" + SecurityElement.Escape(person.SortOrder.Value.ToString(UsCulture)) + "</SortOrder>"); + // } + + // builder.Append("</Person>"); + // } + + // builder.Append("</Persons>"); + //} + + //var boxset = item as BoxSet; + //if (boxset != null) + //{ + // AddLinkedChildren(boxset, builder, "CollectionItems", "CollectionItem"); + //} + + //var playlist = item as Playlist; + //if (playlist != null) + //{ + // AddLinkedChildren(playlist, builder, "PlaylistItems", "PlaylistItem"); + //} + + //var hasShares = item as IHasShares; + //if (hasShares != null) + //{ + // AddShares(hasShares, builder); + //} + } + + public static void AddShares(IHasShares item, StringBuilder builder) + { + //builder.Append("<Shares>"); + + //foreach (var share in item.Shares) + //{ + // builder.Append("<Share>"); + + // builder.Append("<UserId>" + SecurityElement.Escape(share.UserId) + "</UserId>"); + // builder.Append("<CanEdit>" + SecurityElement.Escape(share.CanEdit.ToString().ToLower()) + "</CanEdit>"); + + // builder.Append("</Share>"); + //} + + //builder.Append("</Shares>"); + } + + /// <summary> + /// Appends the media info. + /// </summary> + /// <typeparam name="T"></typeparam> + public static void AddMediaInfo<T>(T item, StringBuilder builder, IItemRepository itemRepository) + where T : BaseItem + { + var video = item as Video; + + if (video != null) + { + //AddChapters(video, builder, itemRepository); + + if (video.Video3DFormat.HasValue) + { + switch (video.Video3DFormat.Value) + { + case Video3DFormat.FullSideBySide: + builder.Append("<Format3D>FSBS</Format3D>"); + break; + case Video3DFormat.FullTopAndBottom: + builder.Append("<Format3D>FTAB</Format3D>"); + break; + case Video3DFormat.HalfSideBySide: + builder.Append("<Format3D>HSBS</Format3D>"); + break; + case Video3DFormat.HalfTopAndBottom: + builder.Append("<Format3D>HTAB</Format3D>"); + break; + case Video3DFormat.MVC: + builder.Append("<Format3D>MVC</Format3D>"); + break; + } + } + } + } + + public static void AddLinkedChildren(Folder item, StringBuilder builder, string pluralNodeName, string singularNodeName) + { + //var items = item.LinkedChildren + // .Where(i => i.Type == LinkedChildType.Manual) + // .ToList(); + + //if (items.Count == 0) + //{ + // return; + //} + + //builder.Append("<" + pluralNodeName + ">"); + //foreach (var link in items) + //{ + // builder.Append("<" + singularNodeName + ">"); + + // if (!string.IsNullOrWhiteSpace(link.Path)) + // { + // builder.Append("<Path>" + SecurityElement.Escape((link.Path)) + "</Path>"); + // } + + // builder.Append("</" + singularNodeName + ">"); + //} + //builder.Append("</" + pluralNodeName + ">"); } private static bool IsPersonType(PersonInfo person, string type) diff --git a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs index c8a2fec90..8167f6002 100644 --- a/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/BoxSetXmlSaver.cs @@ -6,40 +6,18 @@ using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; +using System.Xml; using MediaBrowser.Common.IO; using MediaBrowser.Controller.IO; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Savers { - public class BoxSetXmlSaver : IMetadataFileSaver + public class BoxSetXmlSaver : BaseXmlSaver { - public string Name - { - get - { - return XmlProviderUtils.Name; - } - } - - private readonly IServerConfigurationManager _config; - private readonly ILibraryManager _libraryManager; - private readonly IFileSystem _fileSystem; - - public BoxSetXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager, IFileSystem fileSystem) - { - _config = config; - _libraryManager = libraryManager; - _fileSystem = fileSystem; - } - - /// <summary> - /// Determines whether [is enabled for] [the specified item]. - /// </summary> - /// <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 bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) + public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { if (!item.SupportsLocalMetadata) { @@ -49,35 +27,17 @@ namespace MediaBrowser.LocalMetadata.Savers return item is BoxSet && updateType >= ItemUpdateType.MetadataDownload; } - /// <summary> - /// Saves the specified item. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - public void Save(IHasMetadata item, CancellationToken cancellationToken) + protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) { - var builder = new StringBuilder(); - - builder.Append("<Item>"); - - XmlSaverHelpers.AddCommonNodes((BoxSet)item, _libraryManager, builder); - - builder.Append("</Item>"); - - var xmlFilePath = GetSavePath(item); - - XmlSaverHelpers.Save(builder, xmlFilePath, new List<string>(), _config, _fileSystem); } - /// <summary> - /// Gets the save path. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>System.String.</returns> - public string GetSavePath(IHasMetadata item) + protected override string GetLocalSavePath(IHasMetadata item) { return Path.Combine(item.Path, "collection.xml"); } + + public BoxSetXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger, xmlReaderSettingsFactory) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs index a68d9adc2..84b766a6a 100644 --- a/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/PersonXmlSaver.cs @@ -3,94 +3,55 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; using System.Collections.Generic; using System.IO; -using System.Security; -using System.Text; -using System.Threading; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; +using System.Xml; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Savers { /// <summary> /// Class PersonXmlSaver /// </summary> - public class PersonXmlSaver : IMetadataFileSaver + public class PersonXmlSaver : BaseXmlSaver { - public string Name + public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { - get + if (!item.SupportsLocalMetadata) { - return XmlProviderUtils.Name; + return false; } - } - private readonly IServerConfigurationManager _config; - private readonly ILibraryManager _libraryManager; - private readonly IFileSystem _fileSystem; - - public PersonXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager, IFileSystem fileSystem) - { - _config = config; - _libraryManager = libraryManager; - _fileSystem = fileSystem; + return item is Person && updateType >= ItemUpdateType.MetadataDownload; } - /// <summary> - /// Determines whether [is enabled for] [the specified item]. - /// </summary> - /// <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 bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) + protected override List<string> GetTagsUsed() { - if (!item.SupportsLocalMetadata) + var list = new List<string> { - return false; - } + "PlaceOfBirth" + }; - return item is Person && updateType >= ItemUpdateType.MetadataDownload; + return list; } - /// <summary> - /// Saves the specified item. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - public void Save(IHasMetadata item, CancellationToken cancellationToken) + protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) { var person = (Person)item; - var builder = new StringBuilder(); - - builder.Append("<Item>"); - - XmlSaverHelpers.AddCommonNodes(person, _libraryManager, builder); - if (person.ProductionLocations.Count > 0) { - builder.Append("<PlaceOfBirth>" + SecurityElement.Escape(person.ProductionLocations[0]) + "</PlaceOfBirth>"); + writer.WriteElementString("PlaceOfBirth", person.ProductionLocations[0]); } - - builder.Append("</Item>"); - - var xmlFilePath = GetSavePath(item); - - XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> - { - "PlaceOfBirth" - }, _config, _fileSystem); } - /// <summary> - /// Gets the save path. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>System.String.</returns> - public string GetSavePath(IHasMetadata item) + protected override string GetLocalSavePath(IHasMetadata item) { return Path.Combine(item.Path, "person.xml"); } + + public PersonXmlSaver(IFileSystem fileSystem, IServerConfigurationManager configurationManager, ILibraryManager libraryManager, IUserManager userManager, IUserDataManager userDataManager, ILogger logger, IXmlReaderSettingsFactory xmlReaderSettingsFactory) : base(fileSystem, configurationManager, libraryManager, userManager, userDataManager, logger, xmlReaderSettingsFactory) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs index 6d9fe21ee..ef28dde36 100644 --- a/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs +++ b/MediaBrowser.LocalMetadata/Savers/PlaylistXmlSaver.cs @@ -4,43 +4,16 @@ using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Playlists; using System.Collections.Generic; using System.IO; -using System.Security; -using System.Text; -using System.Threading; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; +using System.Xml; using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Xml; namespace MediaBrowser.LocalMetadata.Savers { - public class PlaylistXmlSaver : IMetadataFileSaver + public class PlaylistXmlSaver : BaseXmlSaver { - public string Name - { - get - { - return XmlProviderUtils.Name; - } - } - - private readonly IServerConfigurationManager _config; - private readonly ILibraryManager _libraryManager; - private readonly IFileSystem _fileSystem; - - public PlaylistXmlSaver(IServerConfigurationManager config, ILibraryManager libraryManager, IFileSystem fileSystem) - { - _config = config; - _libraryManager = libraryManager; - _fileSystem = fileSystem; - } - - /// <summary> - /// Determines whether [is enabled for] [the specified item]. - /// </summary> - /// <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 bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) + public override bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType) { if (!item.SupportsLocalMetadata) { @@ -50,47 +23,34 @@ namespace MediaBrowser.LocalMetadata.Savers return item is Playlist && updateType >= ItemUpdateType.MetadataImport; } - /// <summary> - /// Saves the specified item. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="cancellationToken">The cancellation token.</param> - /// <returns>Task.</returns> - public void Save(IHasMetadata item, CancellationToken cancellationToken) + protected override List<string> GetTagsUsed() { - var playlist = (Playlist)item; - - var builder = new StringBuilder(); - - builder.Append("<Item>"); - - if (!string.IsNullOrEmpty(playlist.PlaylistMediaType)) + var list = new List<string> { - builder.Append("<PlaylistMediaType>" + SecurityElement.Escape(playlist.PlaylistMediaType) + "</PlaylistMediaType>"); - } - - XmlSaverHelpers.AddCommonNodes(playlist, _libraryManager, builder); + "OwnerUserId", + "PlaylistMediaType" + }; - builder.Append("</Item>"); + return list; + } - var xmlFilePath = GetSavePath(item); + protected override void WriteCustomElements(IHasMetadata item, XmlWriter writer) + { + var game = (Playlist)item; - XmlSaverHelpers.Save(builder, xmlFilePath, new List<string> + if (!string.IsNullOrEmpty(game.PlaylistMediaType)) { - "OwnerUserId", - "PlaylistMediaType" - - }, _config, _fileSystem); + writer.WriteElementString("PlaylistMediaType", game.PlaylistMediaType); + } } - /// <summary> - /// Gets the save path. - /// </summary> - /// <param name="item">The item.</param> - /// <returns>System.String.</returns> - public string GetSavePath(IHasMetadata item) + protected override string GetLocalSavePath(IHasMetadata item) { return Path.Combine(item.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) + { + } } } diff --git a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs deleted file mode 100644 index 1767b23fe..000000000 --- a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs +++ /dev/null @@ -1,649 +0,0 @@ -using MediaBrowser.Controller.Configuration; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Entities.Movies; -using MediaBrowser.Controller.Entities.TV; -using MediaBrowser.Controller.Library; -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Controller.Playlists; -using MediaBrowser.Model.Entities; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Security; -using System.Text; -using System.Xml; -using MediaBrowser.Common.IO; -using MediaBrowser.Controller.IO; -using MediaBrowser.Model.IO; - -namespace MediaBrowser.LocalMetadata.Savers -{ - /// <summary> - /// Class XmlHelpers - /// </summary> - public static class XmlSaverHelpers - { - private static readonly Dictionary<string, string> CommonTags = new[] { - - "Added", - "AspectRatio", - "AudioDbAlbumId", - "AudioDbArtistId", - "AwardSummary", - "BirthDate", - "Budget", - - // Deprecated. No longer saving in this field. - "certification", - - "Chapters", - "ContentRating", - "Countries", - "CustomRating", - "CriticRating", - "CriticRatingSummary", - "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", - "Metascore", - - // Deprecated. No longer saving in this field. - "MPAARating", - - "MPAADescription", - - "MusicBrainzArtistId", - "MusicBrainzAlbumArtistId", - "MusicBrainzAlbumId", - "MusicBrainzReleaseGroupId", - - // Deprecated. No longer saving in this field. - "MusicbrainzId", - - "Overview", - "ShortOverview", - "Persons", - "PlotKeywords", - "PremiereDate", - "ProductionYear", - "Rating", - "Revenue", - "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", - "Type", - "TVRageId", - "VoteCount", - "Website", - "Zap2ItId", - "CollectionItems", - "PlaylistItems", - "Shares" - - }.ToDictionary(i => i, StringComparer.OrdinalIgnoreCase); - - /// <summary> - /// The us culture - /// </summary> - private static readonly CultureInfo UsCulture = new CultureInfo("en-US"); - - /// <summary> - /// Saves the specified XML. - /// </summary> - /// <param name="xml">The XML.</param> - /// <param name="path">The path.</param> - /// <param name="xmlTagsUsed">The XML tags used.</param> - public static void Save(StringBuilder xml, string path, List<string> xmlTagsUsed, IServerConfigurationManager config, IFileSystem fileSystem) - { - if (fileSystem.FileExists(path)) - { - var position = xml.ToString().LastIndexOf("</", StringComparison.OrdinalIgnoreCase); - xml.Insert(position, GetCustomTags(path, xmlTagsUsed)); - } - - var xmlDocument = new XmlDocument(); - xmlDocument.LoadXml(xml.ToString()); - - //Add the new node to the document. - xmlDocument.InsertBefore(xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", "yes"), xmlDocument.DocumentElement); - - fileSystem.CreateDirectory(Path.GetDirectoryName(path)); - - var wasHidden = false; - - var file = new FileInfo(path); - - // This will fail if the file is hidden - if (file.Exists) - { - if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) - { - file.Attributes &= ~FileAttributes.Hidden; - - wasHidden = true; - } - } - - using (var filestream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read)) - { - using (var streamWriter = new StreamWriter(filestream, Encoding.UTF8)) - { - xmlDocument.Save(streamWriter); - } - } - - if (wasHidden || config.Configuration.SaveMetadataHidden) - { - file.Refresh(); - - // Add back the attribute - file.Attributes |= FileAttributes.Hidden; - } - } - - /// <summary> - /// Gets the custom tags. - /// </summary> - /// <param name="path">The path.</param> - /// <param name="xmlTagsUsed">The XML tags used.</param> - /// <returns>System.String.</returns> - private static string GetCustomTags(string path, List<string> xmlTagsUsed) - { - var settings = new XmlReaderSettings - { - CheckCharacters = false, - IgnoreProcessingInstructions = true, - IgnoreComments = true, - ValidationType = ValidationType.None - }; - - var builder = new StringBuilder(); - - using (var streamReader = new StreamReader(path, Encoding.UTF8)) - { - // Use XmlReader for best performance - using (var reader = XmlReader.Create(streamReader, settings)) - { - reader.MoveToContent(); - - // Loop through each element - while (reader.Read()) - { - if (reader.NodeType == XmlNodeType.Element) - { - var name = reader.Name; - - if (!CommonTags.ContainsKey(name) && !xmlTagsUsed.Contains(name, StringComparer.OrdinalIgnoreCase)) - { - builder.AppendLine(reader.ReadOuterXml()); - } - else - { - reader.Skip(); - } - } - } - } - } - - return builder.ToString(); - } - - /// <summary> - /// Adds the common nodes. - /// </summary> - /// <param name="item">The item.</param> - /// <param name="builder">The builder.</param> - public static void AddCommonNodes(BaseItem item, ILibraryManager libraryManager, StringBuilder builder) - { - if (!string.IsNullOrEmpty(item.OfficialRating)) - { - builder.Append("<ContentRating>" + SecurityElement.Escape(item.OfficialRating) + "</ContentRating>"); - } - - if (!string.IsNullOrEmpty(item.OfficialRatingDescription)) - { - builder.Append("<MPAADescription>" + SecurityElement.Escape(item.OfficialRatingDescription) + "</MPAADescription>"); - } - - builder.Append("<Added>" + SecurityElement.Escape(item.DateCreated.ToLocalTime().ToString("G")) + "</Added>"); - - builder.Append("<LockData>" + item.IsLocked.ToString().ToLower() + "</LockData>"); - - if (item.LockedFields.Count > 0) - { - builder.Append("<LockedFields>" + string.Join("|", item.LockedFields.Select(i => i.ToString()).ToArray()) + "</LockedFields>"); - } - - if (!string.IsNullOrEmpty(item.DisplayMediaType)) - { - builder.Append("<Type>" + SecurityElement.Escape(item.DisplayMediaType) + "</Type>"); - } - - if (item.CriticRating.HasValue) - { - builder.Append("<CriticRating>" + SecurityElement.Escape(item.CriticRating.Value.ToString(UsCulture)) + "</CriticRating>"); - } - - if (!string.IsNullOrEmpty(item.CriticRatingSummary)) - { - builder.Append("<CriticRatingSummary><![CDATA[" + item.CriticRatingSummary + "]]></CriticRatingSummary>"); - } - - if (!string.IsNullOrEmpty(item.Overview)) - { - builder.Append("<Overview><![CDATA[" + item.Overview + "]]></Overview>"); - } - - var hasOriginalTitle = item as IHasOriginalTitle; - if (hasOriginalTitle != null) - { - if (!string.IsNullOrEmpty(hasOriginalTitle.OriginalTitle)) - { - builder.Append("<OriginalTitle>" + SecurityElement.Escape(hasOriginalTitle.OriginalTitle) + "</OriginalTitle>"); - } - } - - if (!string.IsNullOrEmpty(item.ShortOverview)) - { - builder.Append("<ShortOverview><![CDATA[" + item.ShortOverview + "]]></ShortOverview>"); - } - - if (!string.IsNullOrEmpty(item.CustomRating)) - { - builder.Append("<CustomRating>" + SecurityElement.Escape(item.CustomRating) + "</CustomRating>"); - } - - if (!string.IsNullOrEmpty(item.Name) && !(item is Episode)) - { - builder.Append("<LocalTitle>" + SecurityElement.Escape(item.Name) + "</LocalTitle>"); - } - - if (!string.IsNullOrEmpty(item.ForcedSortName)) - { - builder.Append("<SortTitle>" + SecurityElement.Escape(item.ForcedSortName) + "</SortTitle>"); - } - - if (item.PremiereDate.HasValue) - { - if (item is Person) - { - builder.Append("<BirthDate>" + SecurityElement.Escape(item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "</BirthDate>"); - } - else if (!(item is Episode)) - { - builder.Append("<PremiereDate>" + SecurityElement.Escape(item.PremiereDate.Value.ToLocalTime().ToString("yyyy-MM-dd")) + "</PremiereDate>"); - } - } - - if (item.EndDate.HasValue) - { - if (item is Person) - { - builder.Append("<DeathDate>" + SecurityElement.Escape(item.EndDate.Value.ToString("yyyy-MM-dd")) + "</DeathDate>"); - } - else if (!(item is Episode)) - { - builder.Append("<EndDate>" + SecurityElement.Escape(item.EndDate.Value.ToString("yyyy-MM-dd")) + "</EndDate>"); - } - } - - var hasTrailers = item as IHasTrailers; - if (hasTrailers != null) - { - if (hasTrailers.RemoteTrailers.Count > 0) - { - builder.Append("<Trailers>"); - - foreach (var trailer in hasTrailers.RemoteTrailers) - { - builder.Append("<Trailer>" + SecurityElement.Escape(trailer.Url) + "</Trailer>"); - } - - builder.Append("</Trailers>"); - } - } - - //if (hasProductionLocations.ProductionLocations.Count > 0) - //{ - // builder.Append("<Countries>"); - - // foreach (var name in hasProductionLocations.ProductionLocations) - // { - // builder.Append("<Country>" + SecurityElement.Escape(name) + "</Country>"); - // } - - // builder.Append("</Countries>"); - //} - - var hasDisplayOrder = item as IHasDisplayOrder; - if (hasDisplayOrder != null && !string.IsNullOrEmpty(hasDisplayOrder.DisplayOrder)) - { - builder.Append("<DisplayOrder>" + SecurityElement.Escape(hasDisplayOrder.DisplayOrder) + "</DisplayOrder>"); - } - - var hasMetascore = item as IHasMetascore; - if (hasMetascore != null && hasMetascore.Metascore.HasValue) - { - builder.Append("<Metascore>" + SecurityElement.Escape(hasMetascore.Metascore.Value.ToString(UsCulture)) + "</Metascore>"); - } - - var hasAwards = item as IHasAwards; - if (hasAwards != null && !string.IsNullOrEmpty(hasAwards.AwardSummary)) - { - builder.Append("<AwardSummary>" + SecurityElement.Escape(hasAwards.AwardSummary) + "</AwardSummary>"); - } - - var hasBudget = item as IHasBudget; - if (hasBudget != null) - { - if (hasBudget.Budget.HasValue) - { - builder.Append("<Budget>" + SecurityElement.Escape(hasBudget.Budget.Value.ToString(UsCulture)) + "</Budget>"); - } - - if (hasBudget.Revenue.HasValue) - { - builder.Append("<Revenue>" + SecurityElement.Escape(hasBudget.Revenue.Value.ToString(UsCulture)) + "</Revenue>"); - } - } - - if (item.CommunityRating.HasValue) - { - builder.Append("<Rating>" + SecurityElement.Escape(item.CommunityRating.Value.ToString(UsCulture)) + "</Rating>"); - } - if (item.VoteCount.HasValue) - { - builder.Append("<VoteCount>" + SecurityElement.Escape(item.VoteCount.Value.ToString(UsCulture)) + "</VoteCount>"); - } - - if (item.ProductionYear.HasValue && !(item is Person)) - { - builder.Append("<ProductionYear>" + SecurityElement.Escape(item.ProductionYear.Value.ToString(UsCulture)) + "</ProductionYear>"); - } - - if (!string.IsNullOrEmpty(item.HomePageUrl)) - { - builder.Append("<Website>" + SecurityElement.Escape(item.HomePageUrl) + "</Website>"); - } - - var hasAspectRatio = item as IHasAspectRatio; - if (hasAspectRatio != null) - { - if (!string.IsNullOrEmpty(hasAspectRatio.AspectRatio)) - { - builder.Append("<AspectRatio>" + SecurityElement.Escape(hasAspectRatio.AspectRatio) + "</AspectRatio>"); - } - } - - if (!string.IsNullOrEmpty(item.PreferredMetadataLanguage)) - { - builder.Append("<Language>" + SecurityElement.Escape(item.PreferredMetadataLanguage) + "</Language>"); - } - if (!string.IsNullOrEmpty(item.PreferredMetadataCountryCode)) - { - builder.Append("<CountryCode>" + SecurityElement.Escape(item.PreferredMetadataCountryCode) + "</CountryCode>"); - } - - // Use original runtime here, actual file runtime later in MediaInfo - var runTimeTicks = item.RunTimeTicks; - - if (runTimeTicks.HasValue) - { - var timespan = TimeSpan.FromTicks(runTimeTicks.Value); - - builder.Append("<RunningTime>" + Convert.ToInt32(timespan.TotalMinutes).ToString(UsCulture) + "</RunningTime>"); - } - - if (item.ProviderIds != null) - { - foreach (var providerKey in item.ProviderIds.Keys) - { - var providerId = item.ProviderIds[providerKey]; - if (!string.IsNullOrEmpty(providerId)) - { - builder.Append(string.Format("<{0}>{1}</{0}>", providerKey + "Id", SecurityElement.Escape(providerId))); - } - } - } - - if (!string.IsNullOrWhiteSpace(item.Tagline)) - { - builder.Append("<Taglines>"); - builder.Append("<Tagline>" + SecurityElement.Escape(item.Tagline) + "</Tagline>"); - builder.Append("</Taglines>"); - } - - if (item.Genres.Count > 0) - { - builder.Append("<Genres>"); - - foreach (var genre in item.Genres) - { - builder.Append("<Genre>" + SecurityElement.Escape(genre) + "</Genre>"); - } - - builder.Append("</Genres>"); - } - - if (item.Studios.Count > 0) - { - builder.Append("<Studios>"); - - foreach (var studio in item.Studios) - { - builder.Append("<Studio>" + SecurityElement.Escape(studio) + "</Studio>"); - } - - builder.Append("</Studios>"); - } - - if (item.Tags.Count > 0) - { - builder.Append("<Tags>"); - - foreach (var tag in item.Tags) - { - builder.Append("<Tag>" + SecurityElement.Escape(tag) + "</Tag>"); - } - - builder.Append("</Tags>"); - } - - if (item.Keywords.Count > 0) - { - builder.Append("<PlotKeywords>"); - - foreach (var tag in item.Keywords) - { - builder.Append("<PlotKeyword>" + SecurityElement.Escape(tag) + "</PlotKeyword>"); - } - - builder.Append("</PlotKeywords>"); - } - - var people = libraryManager.GetPeople(item); - - if (people.Count > 0) - { - builder.Append("<Persons>"); - - foreach (var person in people) - { - builder.Append("<Person>"); - builder.Append("<Name>" + SecurityElement.Escape(person.Name) + "</Name>"); - builder.Append("<Type>" + SecurityElement.Escape(person.Type) + "</Type>"); - builder.Append("<Role>" + SecurityElement.Escape(person.Role) + "</Role>"); - - if (person.SortOrder.HasValue) - { - builder.Append("<SortOrder>" + SecurityElement.Escape(person.SortOrder.Value.ToString(UsCulture)) + "</SortOrder>"); - } - - builder.Append("</Person>"); - } - - builder.Append("</Persons>"); - } - - var boxset = item as BoxSet; - if (boxset != null) - { - AddLinkedChildren(boxset, builder, "CollectionItems", "CollectionItem"); - } - - var playlist = item as Playlist; - if (playlist != null) - { - AddLinkedChildren(playlist, builder, "PlaylistItems", "PlaylistItem"); - } - - var hasShares = item as IHasShares; - if (hasShares != null) - { - AddShares(hasShares, builder); - } - } - - public static void AddShares(IHasShares item, StringBuilder builder) - { - builder.Append("<Shares>"); - - foreach (var share in item.Shares) - { - builder.Append("<Share>"); - - builder.Append("<UserId>" + SecurityElement.Escape(share.UserId) + "</UserId>"); - builder.Append("<CanEdit>" + SecurityElement.Escape(share.CanEdit.ToString().ToLower()) + "</CanEdit>"); - - builder.Append("</Share>"); - } - - builder.Append("</Shares>"); - } - - public static void AddChapters(Video item, StringBuilder builder, IItemRepository repository) - { - var chapters = repository.GetChapters(item.Id); - - builder.Append("<Chapters>"); - - foreach (var chapter in chapters) - { - builder.Append("<Chapter>"); - builder.Append("<Name>" + SecurityElement.Escape(chapter.Name) + "</Name>"); - - var time = TimeSpan.FromTicks(chapter.StartPositionTicks); - var ms = Convert.ToInt64(time.TotalMilliseconds); - - builder.Append("<StartPositionMs>" + SecurityElement.Escape(ms.ToString(UsCulture)) + "</StartPositionMs>"); - builder.Append("</Chapter>"); - } - - builder.Append("</Chapters>"); - } - - /// <summary> - /// Appends the media info. - /// </summary> - /// <typeparam name="T"></typeparam> - public static void AddMediaInfo<T>(T item, StringBuilder builder, IItemRepository itemRepository) - where T : BaseItem - { - var video = item as Video; - - if (video != null) - { - //AddChapters(video, builder, itemRepository); - - if (video.Video3DFormat.HasValue) - { - switch (video.Video3DFormat.Value) - { - case Video3DFormat.FullSideBySide: - builder.Append("<Format3D>FSBS</Format3D>"); - break; - case Video3DFormat.FullTopAndBottom: - builder.Append("<Format3D>FTAB</Format3D>"); - break; - case Video3DFormat.HalfSideBySide: - builder.Append("<Format3D>HSBS</Format3D>"); - break; - case Video3DFormat.HalfTopAndBottom: - builder.Append("<Format3D>HTAB</Format3D>"); - break; - case Video3DFormat.MVC: - builder.Append("<Format3D>MVC</Format3D>"); - break; - } - } - } - } - - public static void AddLinkedChildren(Folder item, StringBuilder builder, string pluralNodeName, string singularNodeName) - { - var items = item.LinkedChildren - .Where(i => i.Type == LinkedChildType.Manual) - .ToList(); - - if (items.Count == 0) - { - return; - } - - builder.Append("<" + pluralNodeName + ">"); - foreach (var link in items) - { - builder.Append("<" + singularNodeName + ">"); - - if (!string.IsNullOrWhiteSpace(link.Path)) - { - builder.Append("<Path>" + SecurityElement.Escape((link.Path)) + "</Path>"); - } - - builder.Append("</" + singularNodeName + ">"); - } - builder.Append("</" + pluralNodeName + ">"); - } - } -} diff --git a/MediaBrowser.LocalMetadata/project.json b/MediaBrowser.LocalMetadata/project.json new file mode 100644 index 000000000..61c570126 --- /dev/null +++ b/MediaBrowser.LocalMetadata/project.json @@ -0,0 +1,7 @@ +{ + "supports": {}, + "dependencies": {}, + "frameworks": { + ".NETPortable,Version=v4.5,Profile=Profile7": {} + } +}
\ No newline at end of file diff --git a/MediaBrowser.LocalMetadata/project.lock.json b/MediaBrowser.LocalMetadata/project.lock.json new file mode 100644 index 000000000..c14072cdb --- /dev/null +++ b/MediaBrowser.LocalMetadata/project.lock.json @@ -0,0 +1,12 @@ +{ + "locked": false, + "version": 1, + "targets": { + ".NETPortable,Version=v4.5,Profile=Profile7": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "": [], + ".NETPortable,Version=v4.5,Profile=Profile7": [] + } +}
\ No newline at end of file |
