From 099b4d3e5b617a9e1fcff689fb1f81290641840d Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 27 Oct 2016 14:30:20 -0400 Subject: [PATCH] update providers to use core interfaces --- .../ImagesByName/ImageUtils.cs | 23 +- MediaBrowser.Providers/Manager/ImageSaver.cs | 17 +- .../Manager/ItemImageProvider.cs | 8 +- .../MediaInfo/AudioImageProvider.cs | 4 +- .../Movies/FanartMovieImageProvider.cs | 2 +- .../Movies/MovieDbImageProvider.cs | 7 +- .../People/MovieDbPersonProvider.cs | 2 +- .../People/TvdbPersonImageProvider.cs | 67 +++--- .../TV/TheTVDB/TvdbSeriesProvider.cs | 198 ++++++++++++------ 9 files changed, 205 insertions(+), 123 deletions(-) diff --git a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs index a433a2fb8d..bbcbbda905 100644 --- a/MediaBrowser.Providers/ImagesByName/ImageUtils.cs +++ b/MediaBrowser.Providers/ImagesByName/ImageUtils.cs @@ -70,23 +70,26 @@ namespace MediaBrowser.Providers.ImagesByName .Replace("/", string.Empty); } - public static IEnumerable GetAvailableImages(string file) + public static IEnumerable GetAvailableImages(string file, IFileSystem fileSystem) { - using (var reader = new StreamReader(file)) + using (var fileStream = fileSystem.GetFileStream(file, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read)) { - var lines = new List(); - - while (!reader.EndOfStream) + using (var reader = new StreamReader(fileStream)) { - var text = reader.ReadLine(); + var lines = new List(); - if (!string.IsNullOrWhiteSpace(text)) + while (!reader.EndOfStream) { - lines.Add(text); + var text = reader.ReadLine(); + + if (!string.IsNullOrWhiteSpace(text)) + { + lines.Add(text); + } } - } - return lines; + return lines; + } } } } diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs index b8b2042bfe..d4bfad1742 100644 --- a/MediaBrowser.Providers/Manager/ImageSaver.cs +++ b/MediaBrowser.Providers/Manager/ImageSaver.cs @@ -174,14 +174,14 @@ namespace MediaBrowser.Providers.Manager try { - var currentFile = new FileInfo(currentPath); + var currentFile = _fileSystem.GetFileInfo(currentPath); // This will fail if the file is hidden if (currentFile.Exists) { - if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + if (currentFile.IsHidden) { - currentFile.Attributes &= ~FileAttributes.Hidden; + _fileSystem.SetHidden(currentFile.FullName, false); } _fileSystem.DeleteFile(currentFile.FullName); @@ -256,14 +256,14 @@ namespace MediaBrowser.Providers.Manager _fileSystem.CreateDirectory(Path.GetDirectoryName(path)); // If the file is currently hidden we'll have to remove that or the save will fail - var file = new FileInfo(path); + var file = _fileSystem.GetFileInfo(path); // This will fail if the file is hidden if (file.Exists) { - if ((file.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + if (file.IsHidden) { - file.Attributes &= ~FileAttributes.Hidden; + _fileSystem.SetHidden(file.FullName, false); } } @@ -275,10 +275,7 @@ namespace MediaBrowser.Providers.Manager if (_config.Configuration.SaveMetadataHidden) { - file.Refresh(); - - // Add back the attribute - file.Attributes |= FileAttributes.Hidden; + _fileSystem.SetHidden(file.FullName, true); } } finally diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs index 8de56109a8..e9a675b0a8 100644 --- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs +++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs @@ -372,14 +372,14 @@ namespace MediaBrowser.Providers.Manager } // Delete the source file - var currentFile = new FileInfo(image.Path); + var currentFile = _fileSystem.GetFileInfo(image.Path); // Deletion will fail if the file is hidden so remove the attribute first if (currentFile.Exists) { - if ((currentFile.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) + if (currentFile.IsHidden) { - currentFile.Attributes &= ~FileAttributes.Hidden; + _fileSystem.SetHidden(currentFile.FullName, false); } _fileSystem.DeleteFile(currentFile.FullName); @@ -613,7 +613,7 @@ namespace MediaBrowser.Providers.Manager { try { - if (item.GetImages(imageType).Any(i => new FileInfo(i.Path).Length == response.ContentLength.Value)) + if (item.GetImages(imageType).Any(i => _fileSystem.GetFileInfo(i.Path).Length == response.ContentLength.Value)) { response.Content.Dispose(); continue; diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs index a2ba9ec2a2..fee11d989c 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs @@ -87,11 +87,11 @@ namespace MediaBrowser.Providers.MediaInfo var tempFile = await _mediaEncoder.ExtractAudioImage(item.Path, imageStreamIndex, cancellationToken).ConfigureAwait(false); - File.Copy(tempFile, path, true); + _fileSystem.CopyFile(tempFile, path, true); try { - File.Delete(tempFile); + _fileSystem.DeleteFile(tempFile); } catch { diff --git a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs index 61783f8f8f..cde7eda2f4 100644 --- a/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs +++ b/MediaBrowser.Providers/Movies/FanartMovieImageProvider.cs @@ -118,7 +118,7 @@ namespace MediaBrowser.Providers.Movies { // No biggie. Don't blow up } - catch (DirectoryNotFoundException) + catch (IOException) { // No biggie. Don't blow up } diff --git a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs index 49f341f26f..f2e544d0a1 100644 --- a/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs +++ b/MediaBrowser.Providers/Movies/MovieDbImageProvider.cs @@ -14,6 +14,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Model.IO; namespace MediaBrowser.Providers.Movies { @@ -21,11 +22,13 @@ namespace MediaBrowser.Providers.Movies { private readonly IJsonSerializer _jsonSerializer; private readonly IHttpClient _httpClient; + private readonly IFileSystem _fileSystem; - public MovieDbImageProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient) + public MovieDbImageProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, IFileSystem fileSystem) { _jsonSerializer = jsonSerializer; _httpClient = httpClient; + _fileSystem = fileSystem; } public string Name @@ -196,7 +199,7 @@ namespace MediaBrowser.Providers.Movies if (!string.IsNullOrEmpty(path)) { - var fileInfo = new FileInfo(path); + var fileInfo = _fileSystem.GetFileInfo(path); if (fileInfo.Exists) { diff --git a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs index 03d4950b22..caf9d58825 100644 --- a/MediaBrowser.Providers/People/MovieDbPersonProvider.cs +++ b/MediaBrowser.Providers/People/MovieDbPersonProvider.cs @@ -82,7 +82,7 @@ namespace MediaBrowser.Providers.People }; result.SetProviderId(MetadataProviders.Tmdb, info.id.ToString(_usCulture)); - result.SetProviderId(MetadataProviders.Imdb, info.imdb_id.ToString(_usCulture)); + result.SetProviderId(MetadataProviders.Imdb, info.imdb_id); return new[] { result }; } diff --git a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs index 2d4d484e60..944078fc58 100644 --- a/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs +++ b/MediaBrowser.Providers/People/TvdbPersonImageProvider.cs @@ -15,6 +15,8 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using System.Xml; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Xml; namespace MediaBrowser.Providers.People { @@ -23,12 +25,16 @@ namespace MediaBrowser.Providers.People private readonly IServerConfigurationManager _config; private readonly ILibraryManager _libraryManager; private readonly IHttpClient _httpClient; + private readonly IFileSystem _fileSystem; + private readonly IXmlReaderSettingsFactory _xmlSettings; - public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager libraryManager, IHttpClient httpClient) + public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager libraryManager, IHttpClient httpClient, IFileSystem fileSystem, IXmlReaderSettingsFactory xmlSettings) { _config = config; _libraryManager = libraryManager; _httpClient = httpClient; + _fileSystem = fileSystem; + _xmlSettings = xmlSettings; } public string Name @@ -89,7 +95,7 @@ namespace MediaBrowser.Providers.People { return null; } - catch (DirectoryNotFoundException) + catch (IOException) { return null; } @@ -97,46 +103,47 @@ namespace MediaBrowser.Providers.People private RemoteImageInfo GetImageInfo(string xmlFile, string personName, CancellationToken cancellationToken) { - var settings = new XmlReaderSettings - { - CheckCharacters = false, - IgnoreProcessingInstructions = true, - IgnoreComments = true, - ValidationType = ValidationType.None - }; + var settings = _xmlSettings.Create(false); - using (var streamReader = new StreamReader(xmlFile, Encoding.UTF8)) + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; + + using (var fileStream = _fileSystem.GetFileStream(xmlFile, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read)) { - // Use XmlReader for best performance - using (var reader = XmlReader.Create(streamReader, settings)) + using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) { - 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()) { - switch (reader.Name) + cancellationToken.ThrowIfCancellationRequested(); + + if (reader.NodeType == XmlNodeType.Element) { - case "Actor": - { - using (var subtree = reader.ReadSubtree()) + switch (reader.Name) + { + case "Actor": { - var info = FetchImageInfoFromActorNode(personName, subtree); - - if (info != null) + using (var subtree = reader.ReadSubtree()) { - return info; + var info = FetchImageInfoFromActorNode(personName, subtree); + + if (info != null) + { + return info; + } } + break; } + default: + reader.Skip(); break; - } - default: - reader.Skip(); - break; + } } } } diff --git a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs index 3618e4ddc2..9dbc4a963b 100644 --- a/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs +++ b/MediaBrowser.Providers/TV/TheTVDB/TvdbSeriesProvider.cs @@ -35,12 +35,12 @@ namespace MediaBrowser.Providers.TV private readonly IZipClient _zipClient; private readonly IHttpClient _httpClient; private readonly IFileSystem _fileSystem; + private readonly IXmlReaderSettingsFactory _xmlSettings; private readonly IServerConfigurationManager _config; private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly ILogger _logger; private readonly ILibraryManager _libraryManager; private readonly IMemoryStreamProvider _memoryStreamProvider; - private readonly IXmlReaderSettingsFactory _xmlSettings; private readonly ILocalizationManager _localizationManager; public TvdbSeriesProvider(IZipClient zipClient, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config, ILogger logger, ILibraryManager libraryManager, IMemoryStreamProvider memoryStreamProvider, IXmlReaderSettingsFactory xmlSettings, ILocalizationManager localizationManager) @@ -512,9 +512,11 @@ namespace MediaBrowser.Providers.TV private async Task> FindSeriesInternal(string name, string language, CancellationToken cancellationToken) { var url = string.Format(SeriesSearchUrl, WebUtility.UrlEncode(name), NormalizeLanguage(language)); - var doc = new XmlDocument(); + var searchResults = new List(); + + var comparableName = GetComparableName(name); - using (var results = await _httpClient.Get(new HttpRequestOptions + using (var stream = await _httpClient.Get(new HttpRequestOptions { Url = url, ResourcePool = TvDbResourcePool, @@ -522,100 +524,170 @@ namespace MediaBrowser.Providers.TV }).ConfigureAwait(false)) { - doc.Load(results); - } + var settings = _xmlSettings.Create(false); - var searchResults = new List(); + settings.CheckCharacters = false; + settings.IgnoreProcessingInstructions = true; + settings.IgnoreComments = true; - if (doc.HasChildNodes) - { - var nodes = doc.SelectNodes("//Series"); - var comparableName = GetComparableName(name); - if (nodes != null) + using (var streamReader = new StreamReader(stream, Encoding.UTF8)) { - foreach (XmlNode node in nodes) + // Use XmlReader for best performance + using (var reader = XmlReader.Create(streamReader, settings)) { - var searchResult = new RemoteSearchResult + reader.MoveToContent(); + + // Loop through each element + while (reader.Read()) { - SearchProviderName = Name - }; + cancellationToken.ThrowIfCancellationRequested(); - var titles = new List(); + if (reader.NodeType == XmlNodeType.Element) + { + switch (reader.Name) + { + case "Series": + { + using (var subtree = reader.ReadSubtree()) + { + var searchResult = GetSeriesSearchResultFromSubTree(subtree, comparableName); + if (searchResult != null) + { + searchResult.SearchProviderName = Name; + searchResults.Add(searchResult); + } + } + break; + } - var nameNode = node.SelectSingleNode("./SeriesName"); - if (nameNode != null) - { - titles.Add(GetComparableName(nameNode.InnerText)); + default: + reader.Skip(); + break; + } + } } + } + } + } - var aliasNode = node.SelectSingleNode("./AliasNames"); - if (aliasNode != null) - { - var alias = aliasNode.InnerText.Split('|').Select(GetComparableName); - titles.AddRange(alias); - } + if (searchResults.Count == 0) + { + _logger.Info("TVDb Provider - Could not find " + name + ". Check name on Thetvdb.org."); + } - var imdbIdNode = node.SelectSingleNode("./IMDB_ID"); - if (imdbIdNode != null) - { - var val = imdbIdNode.InnerText; - if (!string.IsNullOrWhiteSpace(val)) + return searchResults; + } + + private RemoteSearchResult GetSeriesSearchResultFromSubTree(XmlReader reader, string comparableName) + { + var searchResult = new RemoteSearchResult + { + SearchProviderName = Name + }; + + var titles = new List(); + string seriesId = null; + + reader.MoveToContent(); + + while (reader.Read()) + { + if (reader.NodeType == XmlNodeType.Element) + { + switch (reader.Name) + { + case "SeriesName": { - searchResult.SetProviderId(MetadataProviders.Imdb, val); + var val = reader.ReadElementContentAsString(); + + if (!string.IsNullOrWhiteSpace(val)) + { + titles.Add(GetComparableName(val)); + } + break; } - } - var bannerNode = node.SelectSingleNode("./banner"); - if (bannerNode != null) - { - var val = bannerNode.InnerText; - if (!string.IsNullOrWhiteSpace(val)) + case "AliasNames": { - searchResult.ImageUrl = TVUtils.BannerUrl + val; + var val = reader.ReadElementContentAsString(); + + var alias = (val ?? string.Empty).Split(new [] { '|' }, StringSplitOptions.RemoveEmptyEntries).Select(GetComparableName); + titles.AddRange(alias); + break; } - } - var airDateNode = node.SelectSingleNode("./FirstAired"); - if (airDateNode != null) - { - var val = airDateNode.InnerText; - if (!string.IsNullOrWhiteSpace(val)) + case "IMDB_ID": { - DateTime date; - if (DateTime.TryParse(val, out date)) + var val = reader.ReadElementContentAsString(); + + if (!string.IsNullOrWhiteSpace(val)) { - searchResult.ProductionYear = date.Year; + searchResult.SetProviderId(MetadataProviders.Imdb, val); } + break; } - } - foreach (var title in titles) - { - if (string.Equals(title, comparableName, StringComparison.OrdinalIgnoreCase)) + case "banner": { - var id = node.SelectSingleNode("./seriesid") ?? - node.SelectSingleNode("./id"); + var val = reader.ReadElementContentAsString(); - if (id != null) + if (!string.IsNullOrWhiteSpace(val)) { - searchResult.Name = title; - searchResult.SetProviderId(MetadataProviders.Tvdb, id.InnerText); - searchResults.Add(searchResult); + searchResult.ImageUrl = TVUtils.BannerUrl + val; } break; } - _logger.Info("TVDb Provider - " + title + " did not match " + comparableName); - } + + case "FirstAired": + { + var val = reader.ReadElementContentAsString(); + + if (!string.IsNullOrWhiteSpace(val)) + { + DateTime date; + if (DateTime.TryParse(val, out date)) + { + searchResult.ProductionYear = date.Year; + } + } + break; + } + + case "id": + case "seriesid": + { + var val = reader.ReadElementContentAsString(); + + if (!string.IsNullOrWhiteSpace(val)) + { + seriesId = val; + } + break; + } + + default: + reader.Skip(); + break; } } } - if (searchResults.Count == 0) + foreach (var title in titles) { - _logger.Info("TVDb Provider - Could not find " + name + ". Check name on Thetvdb.org."); + if (string.Equals(title, comparableName, StringComparison.OrdinalIgnoreCase)) + { + if (!string.IsNullOrWhiteSpace(seriesId)) + { + searchResult.Name = title; + searchResult.SetProviderId(MetadataProviders.Tvdb, seriesId); + return searchResult; + } + break; + } + _logger.Info("TVDb Provider - " + title + " did not match " + comparableName); } - return searchResults; + return null; } ///