Browse Source

Fix actor image provider

Claus Vium 6 years ago
parent
commit
373a1f72bf
1 changed files with 27 additions and 133 deletions
  1. 27 133
      MediaBrowser.Providers/People/TvdbPersonImageProvider.cs

+ 27 - 133
MediaBrowser.Providers/People/TvdbPersonImageProvider.cs

@@ -1,42 +1,35 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using System.IO;
 using System.Linq;
 using System.Linq;
-using System.Text;
 using System.Threading;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
-using System.Xml;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Dto;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.IO;
 using MediaBrowser.Model.Providers;
 using MediaBrowser.Model.Providers;
-using MediaBrowser.Model.Xml;
 using MediaBrowser.Providers.TV;
 using MediaBrowser.Providers.TV;
-using MediaBrowser.Providers.TV.TheTVDB;
+using Microsoft.Extensions.Logging;
+using TvDbSharper;
 
 
 namespace MediaBrowser.Providers.People
 namespace MediaBrowser.Providers.People
 {
 {
     public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder
     public class TvdbPersonImageProvider : IRemoteImageProvider, IHasOrder
     {
     {
-        private readonly IServerConfigurationManager _config;
-        private readonly ILibraryManager _libraryManager;
         private readonly IHttpClient _httpClient;
         private readonly IHttpClient _httpClient;
-        private readonly IFileSystem _fileSystem;
-        private readonly IXmlReaderSettingsFactory _xmlSettings;
+        private readonly ILogger _logger;
+        private readonly ILibraryManager _libraryManager;
+        private readonly TvDbClientManager _tvDbClientManager;
 
 
-        public TvdbPersonImageProvider(IServerConfigurationManager config, ILibraryManager libraryManager, IHttpClient httpClient, IFileSystem fileSystem, IXmlReaderSettingsFactory xmlSettings)
+        public TvdbPersonImageProvider(ILibraryManager libraryManager, IHttpClient httpClient, ILogger logger)
         {
         {
-            _config = config;
             _libraryManager = libraryManager;
             _libraryManager = libraryManager;
             _httpClient = httpClient;
             _httpClient = httpClient;
-            _fileSystem = fileSystem;
-            _xmlSettings = xmlSettings;
+            _logger = logger;
+            _tvDbClientManager = TvDbClientManager.Instance;
         }
         }
 
 
         public string Name => ProviderName;
         public string Name => ProviderName;
@@ -56,7 +49,7 @@ namespace MediaBrowser.Providers.People
             };
             };
         }
         }
 
 
-        public Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
+        public async Task<IEnumerable<RemoteImageInfo>> GetImages(BaseItem item, CancellationToken cancellationToken)
         {
         {
             var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
             var seriesWithPerson = _libraryManager.GetItemList(new InternalItemsQuery
             {
             {
@@ -71,139 +64,40 @@ namespace MediaBrowser.Providers.People
                 .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds))
                 .Where(i => TvdbSeriesProvider.IsValidSeries(i.ProviderIds))
                 .ToList();
                 .ToList();
 
 
-            var infos = seriesWithPerson.Select(i => GetImageFromSeriesData(i, item.Name, cancellationToken))
+            var infos = await Task.WhenAll(seriesWithPerson.Select(async i => await GetImageFromSeriesData(i, item.Name, cancellationToken))
                 .Where(i => i != null)
                 .Where(i => i != null)
-                .Take(1);
-
-            return Task.FromResult(infos);
-        }
-
-        private RemoteImageInfo GetImageFromSeriesData(Series series, string personName, CancellationToken cancellationToken)
-        {
-            //var actorsResult = await _tvDbClient.Series.GetActorsAsync(Convert.ToInt32(tvdbId), cancellationToken);
-
-            return null; // GetImageInfo(actorXmlPath, personName, cancellationToken);
-        }
-
-        private RemoteImageInfo GetImageInfo(string xmlFile, string personName, CancellationToken cancellationToken)
-        {
-            var settings = _xmlSettings.Create(false);
-
-            settings.CheckCharacters = false;
-            settings.IgnoreProcessingInstructions = true;
-            settings.IgnoreComments = true;
-
-            using (var fileStream = _fileSystem.GetFileStream(xmlFile, FileOpenMode.Open, FileAccessMode.Read, FileShareMode.Read))
-            {
-                using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
-                {
-                    // Use XmlReader for best performance
-                    using (var reader = XmlReader.Create(streamReader, settings))
-                    {
-                        reader.MoveToContent();
-                        reader.Read();
-
-                        // Loop through each element
-                        while (!reader.EOF && reader.ReadState == ReadState.Interactive)
-                        {
-                            cancellationToken.ThrowIfCancellationRequested();
+                .Take(1));
 
 
-                            if (reader.NodeType == XmlNodeType.Element)
-                            {
-                                switch (reader.Name)
-                                {
-                                    case "Actor":
-                                        {
-                                            if (reader.IsEmptyElement)
-                                            {
-                                                reader.Read();
-                                                continue;
-                                            }
-                                            using (var subtree = reader.ReadSubtree())
-                                            {
-                                                var info = FetchImageInfoFromActorNode(personName, subtree);
-
-                                                if (info != null)
-                                                {
-                                                    return info;
-                                                }
-                                            }
-                                            break;
-                                        }
-                                    default:
-                                        reader.Skip();
-                                        break;
-                                }
-                            }
-                            else
-                            {
-                                reader.Read();
-                            }
-                        }
-                    }
-                }
-            }
-
-            return null;
+            return infos;
         }
         }
 
 
-        /// <summary>
-        /// Fetches the data from actor node.
-        /// </summary>
-        /// <param name="personName">Name of the person.</param>
-        /// <param name="reader">The reader.</param>
-        /// <returns>System.String.</returns>
-        private RemoteImageInfo FetchImageInfoFromActorNode(string personName, XmlReader reader)
+        private async Task<RemoteImageInfo> GetImageFromSeriesData(Series series, string personName, CancellationToken cancellationToken)
         {
         {
-            string name = null;
-            string image = null;
+            var tvdbId = Convert.ToInt32(series.GetProviderId(MetadataProviders.Tvdb));
 
 
-            reader.MoveToContent();
-            reader.Read();
-
-            // Loop through each element
-            while (!reader.EOF && reader.ReadState == ReadState.Interactive)
+            try
             {
             {
-                if (reader.NodeType == XmlNodeType.Element)
+                var actorsResult = await _tvDbClientManager.GetActorsAsync(tvdbId, cancellationToken);
+                var actor = actorsResult.Data.FirstOrDefault(a =>
+                    string.Equals(a.Name, personName, StringComparison.OrdinalIgnoreCase) &&
+                    !string.IsNullOrEmpty(a.Image));
+                if (actor == null)
                 {
                 {
-                    switch (reader.Name)
-                    {
-                        case "Name":
-                            {
-                                name = (reader.ReadElementContentAsString() ?? string.Empty).Trim();
-                                break;
-                            }
-
-                        case "Image":
-                            {
-                                image = (reader.ReadElementContentAsString() ?? string.Empty).Trim();
-                                break;
-                            }
-
-                        default:
-                            reader.Skip();
-                            break;
-                    }
+                    return null;
                 }
                 }
-                else
-                {
-                    reader.Read();
-                }
-            }
 
 
-            if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(image) &&
-                string.Equals(name, personName, StringComparison.OrdinalIgnoreCase))
-            {
                 return new RemoteImageInfo
                 return new RemoteImageInfo
                 {
                 {
-                    Url = TVUtils.BannerUrl + image,
+                    Url = TVUtils.BannerUrl + actor.Image,
                     Type = ImageType.Primary,
                     Type = ImageType.Primary,
                     ProviderName = Name
                     ProviderName = Name
-
                 };
                 };
             }
             }
-
-            return null;
+            catch (TvDbServerException e)
+            {
+                _logger.LogError(e, "Failed to retrieve actor {ActorName} from series {SeriesTvdbId}", personName, tvdbId);
+                return null;
+            }
         }
         }
 
 
         public int Order => 1;
         public int Order => 1;