support new genre images
This commit is contained in:
parent
858be5d788
commit
9e391bcffc
154
MediaBrowser.Providers/ImagesByName/GenreImageProvider.cs
Normal file
154
MediaBrowser.Providers/ImagesByName/GenreImageProvider.cs
Normal file
|
@ -0,0 +1,154 @@
|
|||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Library;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Net;
|
||||
using MediaBrowser.Model.Providers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.ImagesByName
|
||||
{
|
||||
public class GenreImageProvider : BaseMetadataProvider
|
||||
{
|
||||
private readonly IProviderManager _providerManager;
|
||||
private readonly SemaphoreSlim _resourcePool = new SemaphoreSlim(5, 5);
|
||||
|
||||
public GenreImageProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
|
||||
: base(logManager, configurationManager)
|
||||
{
|
||||
_providerManager = providerManager;
|
||||
}
|
||||
|
||||
public override bool Supports(BaseItem item)
|
||||
{
|
||||
return item is Genre;
|
||||
}
|
||||
|
||||
public override bool RequiresInternet
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public override ItemUpdateType ItemUpdateType
|
||||
{
|
||||
get
|
||||
{
|
||||
return ItemUpdateType.ImageUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
|
||||
{
|
||||
if (item.HasImage(ImageType.Primary) && item.HasImage(ImageType.Thumb))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return base.NeedsRefreshInternal(item, providerInfo);
|
||||
}
|
||||
|
||||
protected override bool RefreshOnVersionChange
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
protected override string ProviderVersion
|
||||
{
|
||||
get
|
||||
{
|
||||
return "6";
|
||||
}
|
||||
}
|
||||
|
||||
public override async Task<bool> FetchAsync(BaseItem item, bool force, BaseProviderInfo providerInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
if (item.HasImage(ImageType.Primary) && item.HasImage(ImageType.Thumb))
|
||||
{
|
||||
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
|
||||
return true;
|
||||
}
|
||||
|
||||
var images = await _providerManager.GetAvailableRemoteImages(item, cancellationToken, GenresManualImageProvider.ProviderName).ConfigureAwait(false);
|
||||
|
||||
await DownloadImages(item, images.ToList(), cancellationToken).ConfigureAwait(false);
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow, providerInfo);
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task DownloadImages(BaseItem item, List<RemoteImageInfo> images, CancellationToken cancellationToken)
|
||||
{
|
||||
if (!item.LockedFields.Contains(MetadataFields.Images))
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (!item.HasImage(ImageType.Primary))
|
||||
{
|
||||
await SaveImage(item, images, ImageType.Primary, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (!item.HasImage(ImageType.Thumb))
|
||||
{
|
||||
await SaveImage(item, images, ImageType.Thumb, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!item.LockedFields.Contains(MetadataFields.Backdrops))
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (item.BackdropImagePaths.Count == 0)
|
||||
{
|
||||
foreach (var image in images.Where(i => i.Type == ImageType.Backdrop))
|
||||
{
|
||||
await _providerManager.SaveImage(item, image.Url, _resourcePool, ImageType.Backdrop, null, cancellationToken)
|
||||
.ConfigureAwait(false);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private async Task SaveImage(BaseItem item, IEnumerable<RemoteImageInfo> images, ImageType type, CancellationToken cancellationToken)
|
||||
{
|
||||
foreach (var image in images.Where(i => i.Type == type))
|
||||
{
|
||||
try
|
||||
{
|
||||
await _providerManager.SaveImage(item, image.Url, _resourcePool, type, null, cancellationToken).ConfigureAwait(false);
|
||||
break;
|
||||
}
|
||||
catch (HttpException ex)
|
||||
{
|
||||
// Sometimes fanart has bad url's in their xml
|
||||
if (ex.StatusCode.HasValue && ex.StatusCode.Value == HttpStatusCode.NotFound)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override MetadataProviderPriority Priority
|
||||
{
|
||||
get { return MetadataProviderPriority.Third; }
|
||||
}
|
||||
}
|
||||
}
|
128
MediaBrowser.Providers/ImagesByName/GenresManualImageProvider.cs
Normal file
128
MediaBrowser.Providers/ImagesByName/GenresManualImageProvider.cs
Normal file
|
@ -0,0 +1,128 @@
|
|||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Providers;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.ImagesByName
|
||||
{
|
||||
public class GenresManualImageProvider : IImageProvider
|
||||
{
|
||||
private readonly IServerConfigurationManager _config;
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
|
||||
private readonly SemaphoreSlim _listResourcePool = new SemaphoreSlim(1, 1);
|
||||
|
||||
public GenresManualImageProvider(IServerConfigurationManager config, IHttpClient httpClient, IFileSystem fileSystem)
|
||||
{
|
||||
_config = config;
|
||||
_httpClient = httpClient;
|
||||
_fileSystem = fileSystem;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return ProviderName; }
|
||||
}
|
||||
|
||||
public static string ProviderName
|
||||
{
|
||||
get { return "Media Browser"; }
|
||||
}
|
||||
|
||||
public bool Supports(IHasImages item)
|
||||
{
|
||||
return item is Genre;
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, ImageType imageType, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, imageType == ImageType.Primary, imageType == ImageType.Backdrop, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetAllImages(IHasImages item, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, true, true, cancellationToken);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, bool posters, bool backdrops, CancellationToken cancellationToken)
|
||||
{
|
||||
var list = new List<RemoteImageInfo>();
|
||||
|
||||
if (posters)
|
||||
{
|
||||
var posterPath = Path.Combine(_config.ApplicationPaths.CachePath, "imagesbyname", "remotegenreposters.txt");
|
||||
|
||||
await EnsurePosterList(posterPath, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
list.Add(GetImage(item, posterPath, ImageType.Primary, "folder"));
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (backdrops)
|
||||
{
|
||||
var thumbsPath = Path.Combine(_config.ApplicationPaths.CachePath, "imagesbyname", "remotegenrethumbs.txt");
|
||||
|
||||
await EnsureThumbsList(thumbsPath, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
list.Add(GetImage(item, thumbsPath, ImageType.Thumb, "thumb"));
|
||||
}
|
||||
|
||||
return list.Where(i => i != null);
|
||||
}
|
||||
|
||||
private RemoteImageInfo GetImage(IHasImages item, string filename, ImageType type, string remoteFilename)
|
||||
{
|
||||
var list = ImageUtils.GetAvailableImages(filename);
|
||||
|
||||
var match = ImageUtils.FindMatch(item, list);
|
||||
|
||||
if (!string.IsNullOrEmpty(match))
|
||||
{
|
||||
var url = GetUrl(match, remoteFilename);
|
||||
|
||||
return new RemoteImageInfo
|
||||
{
|
||||
ProviderName = Name,
|
||||
Type = type,
|
||||
Url = url
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string GetUrl(string image, string filename)
|
||||
{
|
||||
return string.Format("https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/genres/{0}/{1}.jpg", image, filename);
|
||||
}
|
||||
|
||||
private Task EnsureThumbsList(string file, CancellationToken cancellationToken)
|
||||
{
|
||||
const string url = "https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/genrethumbs.txt";
|
||||
|
||||
return ImageUtils.EnsureList(url, file, _httpClient, _fileSystem, _listResourcePool, cancellationToken);
|
||||
}
|
||||
|
||||
private Task EnsurePosterList(string file, CancellationToken cancellationToken)
|
||||
{
|
||||
const string url = "https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/genreposters.txt";
|
||||
|
||||
return ImageUtils.EnsureList(url, file, _httpClient, _fileSystem, _listResourcePool, cancellationToken);
|
||||
}
|
||||
|
||||
public int Priority
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
83
MediaBrowser.Providers/ImagesByName/ImageUtils.cs
Normal file
83
MediaBrowser.Providers/ImagesByName/ImageUtils.cs
Normal file
|
@ -0,0 +1,83 @@
|
|||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.ImagesByName
|
||||
{
|
||||
public static class ImageUtils
|
||||
{
|
||||
/// <summary>
|
||||
/// Ensures the list.
|
||||
/// </summary>
|
||||
/// <param name="url">The URL.</param>
|
||||
/// <param name="file">The file.</param>
|
||||
/// <param name="httpClient">The HTTP client.</param>
|
||||
/// <param name="fileSystem">The file system.</param>
|
||||
/// <param name="semaphore">The semaphore.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task.</returns>
|
||||
public static async Task EnsureList(string url, string file, IHttpClient httpClient, IFileSystem fileSystem, SemaphoreSlim semaphore, CancellationToken cancellationToken)
|
||||
{
|
||||
var fileInfo = new FileInfo(file);
|
||||
|
||||
if (!fileInfo.Exists || (DateTime.UtcNow - fileSystem.GetLastWriteTimeUtc(fileInfo)).TotalDays > 1)
|
||||
{
|
||||
await semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
try
|
||||
{
|
||||
var temp = await httpClient.GetTempFile(new HttpRequestOptions
|
||||
{
|
||||
CancellationToken = cancellationToken,
|
||||
Progress = new Progress<double>(),
|
||||
Url = url
|
||||
|
||||
}).ConfigureAwait(false);
|
||||
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(file));
|
||||
|
||||
File.Copy(temp, file, true);
|
||||
}
|
||||
finally
|
||||
{
|
||||
semaphore.Release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static string FindMatch(IHasImages item, IEnumerable<string> images)
|
||||
{
|
||||
var name = GetComparableName(item.Name);
|
||||
|
||||
return images.FirstOrDefault(i => string.Equals(name, GetComparableName(i), StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private static string GetComparableName(string name)
|
||||
{
|
||||
return name.Replace(" ", string.Empty).Replace(".", string.Empty).Replace("&", string.Empty).Replace("!", string.Empty);
|
||||
}
|
||||
|
||||
public static IEnumerable<string> GetAvailableImages(string file)
|
||||
{
|
||||
using (var reader = new StreamReader(file))
|
||||
{
|
||||
var lines = new List<string>();
|
||||
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
var text = reader.ReadLine();
|
||||
|
||||
lines.Add(text);
|
||||
}
|
||||
|
||||
return lines;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,7 +13,7 @@ using System.Net;
|
|||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.Studios
|
||||
namespace MediaBrowser.Providers.ImagesByName
|
||||
{
|
||||
public class StudioImageProvider : BaseMetadataProvider
|
||||
{
|
||||
|
@ -69,7 +69,7 @@ namespace MediaBrowser.Providers.Studios
|
|||
{
|
||||
get
|
||||
{
|
||||
return "5";
|
||||
return "6";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
using MediaBrowser.Common.IO;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Providers;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.ImagesByName
|
||||
{
|
||||
public class StudiosManualImageProvider : IImageProvider
|
||||
{
|
||||
private readonly IServerConfigurationManager _config;
|
||||
private readonly IHttpClient _httpClient;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
|
||||
private readonly SemaphoreSlim _listResourcePool = new SemaphoreSlim(1, 1);
|
||||
|
||||
public StudiosManualImageProvider(IServerConfigurationManager config, IHttpClient httpClient, IFileSystem fileSystem)
|
||||
{
|
||||
_config = config;
|
||||
_httpClient = httpClient;
|
||||
_fileSystem = fileSystem;
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return ProviderName; }
|
||||
}
|
||||
|
||||
public static string ProviderName
|
||||
{
|
||||
get { return "Media Browser"; }
|
||||
}
|
||||
|
||||
public bool Supports(IHasImages item)
|
||||
{
|
||||
return item is Studio;
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, ImageType imageType, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, imageType == ImageType.Primary, imageType == ImageType.Backdrop, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetAllImages(IHasImages item, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, true, true, cancellationToken);
|
||||
}
|
||||
|
||||
private async Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, bool posters, bool backdrops, CancellationToken cancellationToken)
|
||||
{
|
||||
var list = new List<RemoteImageInfo>();
|
||||
|
||||
if (posters)
|
||||
{
|
||||
var posterPath = Path.Combine(_config.ApplicationPaths.CachePath, "imagesbyname", "remotestudioposters.txt");
|
||||
|
||||
await EnsurePosterList(posterPath, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
list.Add(GetImage(item, posterPath, ImageType.Primary, "folder"));
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (backdrops)
|
||||
{
|
||||
var thumbsPath = Path.Combine(_config.ApplicationPaths.CachePath, "imagesbyname", "remotestudiothumbs.txt");
|
||||
|
||||
await EnsureThumbsList(thumbsPath, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
list.Add(GetImage(item, thumbsPath, ImageType.Thumb, "thumb"));
|
||||
}
|
||||
|
||||
return list.Where(i => i != null);
|
||||
}
|
||||
|
||||
private RemoteImageInfo GetImage(IHasImages item, string filename, ImageType type, string remoteFilename)
|
||||
{
|
||||
var list = ImageUtils.GetAvailableImages(filename);
|
||||
|
||||
var match = ImageUtils.FindMatch(item, list);
|
||||
|
||||
if (!string.IsNullOrEmpty(match))
|
||||
{
|
||||
var url = GetUrl(match, remoteFilename);
|
||||
|
||||
return new RemoteImageInfo
|
||||
{
|
||||
ProviderName = Name,
|
||||
Type = type,
|
||||
Url = url
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string GetUrl(string image, string filename)
|
||||
{
|
||||
return string.Format("https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/studios/{0}/{1}.jpg", image, filename);
|
||||
}
|
||||
|
||||
private Task EnsureThumbsList(string file, CancellationToken cancellationToken)
|
||||
{
|
||||
const string url = "https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/studiothumbs.txt";
|
||||
|
||||
return ImageUtils.EnsureList(url, file, _httpClient, _fileSystem, _listResourcePool, cancellationToken);
|
||||
}
|
||||
|
||||
private Task EnsurePosterList(string file, CancellationToken cancellationToken)
|
||||
{
|
||||
const string url = "https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/imagesbyname/studioposters.txt";
|
||||
|
||||
return ImageUtils.EnsureList(url, file, _httpClient, _fileSystem, _listResourcePool, cancellationToken);
|
||||
}
|
||||
|
||||
public int Priority
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -66,6 +66,9 @@
|
|||
<Compile Include="Games\GameSystemProviderFromXml.cs" />
|
||||
<Compile Include="ImageFromMediaLocationProvider.cs" />
|
||||
<Compile Include="ImagesByNameProvider.cs" />
|
||||
<Compile Include="ImagesByName\GenreImageProvider.cs" />
|
||||
<Compile Include="ImagesByName\GenresManualImageProvider.cs" />
|
||||
<Compile Include="ImagesByName\ImageUtils.cs" />
|
||||
<Compile Include="LiveTv\ChannelProviderFromXml.cs" />
|
||||
<Compile Include="MediaInfo\AudioImageProvider.cs" />
|
||||
<Compile Include="MediaInfo\BaseFFProbeProvider.cs" />
|
||||
|
@ -120,8 +123,8 @@
|
|||
<Compile Include="Savers\SeasonXmlSaver.cs" />
|
||||
<Compile Include="Savers\SeriesXmlSaver.cs" />
|
||||
<Compile Include="Savers\XmlSaverHelpers.cs" />
|
||||
<Compile Include="Studios\StudioImageProvider.cs" />
|
||||
<Compile Include="Studios\StudiosManualImageProvider.cs" />
|
||||
<Compile Include="ImagesByName\StudioImageProvider.cs" />
|
||||
<Compile Include="ImagesByName\StudiosManualImageProvider.cs" />
|
||||
<Compile Include="TV\EpisodeImageFromMediaLocationProvider.cs" />
|
||||
<Compile Include="TV\EpisodeIndexNumberProvider.cs" />
|
||||
<Compile Include="TV\EpisodeProviderFromXml.cs" />
|
||||
|
@ -167,12 +170,6 @@
|
|||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Studios\thumbs.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Studios\posters.txt" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
|
|
@ -1,135 +0,0 @@
|
|||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Providers;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Providers.Studios
|
||||
{
|
||||
public class StudiosManualImageProvider : IImageProvider
|
||||
{
|
||||
public string Name
|
||||
{
|
||||
get { return ProviderName; }
|
||||
}
|
||||
|
||||
public static string ProviderName
|
||||
{
|
||||
get { return "Media Browser"; }
|
||||
}
|
||||
|
||||
public bool Supports(IHasImages item)
|
||||
{
|
||||
return item is Studio;
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, ImageType imageType, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, imageType == ImageType.Primary, imageType == ImageType.Backdrop, cancellationToken);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<RemoteImageInfo>> GetAllImages(IHasImages item, CancellationToken cancellationToken)
|
||||
{
|
||||
return GetImages(item, true, true, cancellationToken);
|
||||
}
|
||||
|
||||
private Task<IEnumerable<RemoteImageInfo>> GetImages(IHasImages item, bool posters, bool backdrops, CancellationToken cancellationToken)
|
||||
{
|
||||
var list = new List<RemoteImageInfo>();
|
||||
|
||||
if (posters)
|
||||
{
|
||||
list.Add(GetImage(item, "posters.txt", ImageType.Primary, "folder"));
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (backdrops)
|
||||
{
|
||||
list.Add(GetImage(item, "thumbs.txt", ImageType.Thumb, "thumb"));
|
||||
}
|
||||
|
||||
return Task.FromResult(list.Where(i => i != null));
|
||||
}
|
||||
|
||||
private RemoteImageInfo GetImage(IHasImages item, string filename, ImageType type, string remoteFilename)
|
||||
{
|
||||
var url = GetUrl(item, filename, remoteFilename);
|
||||
|
||||
if (url != null)
|
||||
{
|
||||
return new RemoteImageInfo
|
||||
{
|
||||
ProviderName = Name,
|
||||
Type = type,
|
||||
Url = url
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string GetUrl(IHasImages item, string listingFilename, string remoteFilename)
|
||||
{
|
||||
var list = GetAvailableImages(listingFilename);
|
||||
|
||||
var match = FindMatch(item, list);
|
||||
|
||||
if (!string.IsNullOrEmpty(match))
|
||||
{
|
||||
return GetUrl(match, remoteFilename);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private string FindMatch(IHasImages item, IEnumerable<string> images)
|
||||
{
|
||||
var name = GetComparableName(item.Name);
|
||||
|
||||
return images.FirstOrDefault(i => string.Equals(name, GetComparableName(i), StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private string GetComparableName(string name)
|
||||
{
|
||||
return name.Replace(" ", string.Empty).Replace(".", string.Empty).Replace("&", string.Empty).Replace("!", string.Empty);
|
||||
}
|
||||
|
||||
private string GetUrl(string image, string filename)
|
||||
{
|
||||
return string.Format("https://raw.github.com/MediaBrowser/MediaBrowser.Resources/master/images/studios/{0}/{1}.jpg", image, filename);
|
||||
}
|
||||
|
||||
private IEnumerable<string> GetAvailableImages(string filename)
|
||||
{
|
||||
var path = GetType().Namespace + "." + filename;
|
||||
|
||||
using (var stream = GetType().Assembly.GetManifestResourceStream(path))
|
||||
{
|
||||
using (var reader = new StreamReader(stream))
|
||||
{
|
||||
var lines = new List<string>();
|
||||
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
var text = reader.ReadLine();
|
||||
|
||||
lines.Add(text);
|
||||
}
|
||||
|
||||
return lines;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int Priority
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,493 +0,0 @@
|
|||
15 Gigs
|
||||
19 Entertainment
|
||||
20th Television
|
||||
321 Productions
|
||||
4K Media
|
||||
4Kids Entertainment
|
||||
A La Carte Communications
|
||||
A&E
|
||||
Aardman
|
||||
ABC
|
||||
ABC Family
|
||||
ABC News
|
||||
ABC Studios
|
||||
Above Average
|
||||
Acacia Fitness
|
||||
Action Television
|
||||
Advertising Age
|
||||
All Channel Films
|
||||
All3Media
|
||||
Alli
|
||||
Alliance Entertainment
|
||||
Alloy
|
||||
AllWarriorNetwork
|
||||
American Pop Classics
|
||||
Ananey
|
||||
Anchor Bay Entertainment
|
||||
Anderson Digital
|
||||
Animal Planet
|
||||
Animation Domination High-Def
|
||||
Anime Network
|
||||
Aniplex
|
||||
Artists Den Entertainment
|
||||
Asian Crush
|
||||
Atlantic Records
|
||||
Attention Span
|
||||
Austin City Limits Music Festival
|
||||
Australian Broadcasting Corporation
|
||||
Australian Food TV
|
||||
Avalon UK
|
||||
Azteca America
|
||||
Bandai
|
||||
Base 79
|
||||
BBC Worldwide
|
||||
Beliefnet
|
||||
Believe
|
||||
BET
|
||||
Beta Film
|
||||
Big Air Studios
|
||||
BIGFlix
|
||||
bio
|
||||
Blame Society
|
||||
Blastro Networks
|
||||
Bloody Disgusting Selects
|
||||
Bloomberg
|
||||
Bonnier TV Group
|
||||
Border Entertainment
|
||||
Brain Farm
|
||||
Brainstorm Media
|
||||
Brave New Films
|
||||
Bravo
|
||||
Broadway Video
|
||||
Brushfire Records
|
||||
Butaca
|
||||
BVTV
|
||||
C3 Entertainment
|
||||
Canal 13 de Chile
|
||||
Candlelight Media
|
||||
Candor TV
|
||||
Caracol Television
|
||||
Carsey Werner
|
||||
CBS
|
||||
CelebTV
|
||||
Charlie Rose
|
||||
Cheflive
|
||||
CHIC.TV
|
||||
Chiller
|
||||
China Lion
|
||||
Cine Real
|
||||
Cinedigm
|
||||
CINELAN
|
||||
Cinema Guild
|
||||
Cinema Libre Studio
|
||||
Cinema Purgatorio
|
||||
CineSport
|
||||
Cirque du Soleil
|
||||
Citizens United Productions No. 3
|
||||
CJ Entertainment
|
||||
Classic Media
|
||||
Clinton Global Initiative
|
||||
Cloo
|
||||
ClubWPT
|
||||
CNBC
|
||||
CODA BOOKS
|
||||
CollegeHumor
|
||||
Comedy Central
|
||||
Comedy Time
|
||||
Conde Nast Digital
|
||||
Constantin Film
|
||||
Content and Co
|
||||
Content Family
|
||||
Content Media Corporation
|
||||
Contentino
|
||||
Cooking Channel
|
||||
Crackle
|
||||
Crime & Investigation Network
|
||||
Criterion Collection
|
||||
CRM
|
||||
Cuppa Coffee
|
||||
Dark Sky Films
|
||||
Dave Matthews Band
|
||||
Davis Panzer
|
||||
Debutante Inc
|
||||
Digital Artists
|
||||
Digital Rights Group
|
||||
Digital Studios
|
||||
Discovery Channel
|
||||
Discovery
|
||||
Distribber
|
||||
Diva
|
||||
DIY Network
|
||||
DocComTV
|
||||
DramaFever
|
||||
Duopoly
|
||||
E! Entertainment
|
||||
EA Sports
|
||||
Eagle Media
|
||||
Eagle Rock
|
||||
Echo Bridge Entertainment
|
||||
Echo Pictures
|
||||
EchoBoom Sports
|
||||
Edmunds
|
||||
ElecPlay
|
||||
Electric Entertainment
|
||||
Electric Sky
|
||||
ELLE
|
||||
EMI
|
||||
Enchanted Tales
|
||||
Endemol
|
||||
Entertainment Rights
|
||||
eOne Entertainment Distribution
|
||||
Epicurious.com
|
||||
Eqal
|
||||
Esquire Network
|
||||
Estrella TV
|
||||
Everyday Edisons
|
||||
Evil Global
|
||||
Exclusive Media
|
||||
ExerciseTV
|
||||
Fanclub
|
||||
Fangoria
|
||||
FEARnet
|
||||
Fever Dreams
|
||||
Fight TV
|
||||
Film Ideas on Demand
|
||||
Film Movement
|
||||
Film Sales Company
|
||||
FilmBuff
|
||||
Finley-Holiday Films
|
||||
First Look Studios
|
||||
First Run Features
|
||||
Focus Features
|
||||
Food Network
|
||||
FORA.tv
|
||||
Ford
|
||||
FOX
|
||||
Fox College Sports
|
||||
Fox Movie Channel
|
||||
Fox News
|
||||
Fox Reality
|
||||
Fox Sports
|
||||
Fox Sports Net
|
||||
Fox Television Classics
|
||||
Frantic Films
|
||||
FremantleMedia
|
||||
FUEL TV
|
||||
FUNimation
|
||||
FX
|
||||
FXM
|
||||
FXX
|
||||
G4
|
||||
Gaiam
|
||||
Galavision
|
||||
GameTrailers
|
||||
Generate
|
||||
George Dickel
|
||||
Giant Ape Media
|
||||
Glamour Films
|
||||
GoDigital
|
||||
Golf TV
|
||||
Gong
|
||||
Gorilla Pictures
|
||||
Gravitas
|
||||
Gravitas Horror
|
||||
GreenLight Media
|
||||
GT Media
|
||||
H2
|
||||
Handmade TV
|
||||
Hat Trick
|
||||
HD Films, Inc
|
||||
Health Science Channel
|
||||
HealthiNation
|
||||
HereTV
|
||||
HGTV
|
||||
Historic Films
|
||||
History
|
||||
History en Español
|
||||
HitFix
|
||||
Hollywood Pictures
|
||||
How it Works
|
||||
Howcast
|
||||
Howdini
|
||||
Hudsun Media
|
||||
Hulu Original Series
|
||||
Hype
|
||||
Iconix
|
||||
iCue.com
|
||||
IFC
|
||||
IFC Films
|
||||
IGN
|
||||
Image Entertainment
|
||||
Imagina US
|
||||
Independent Comedy Network
|
||||
Independent International Pictures Corp
|
||||
Indie Crush
|
||||
IndieFlix
|
||||
itsallinyourhands.tv
|
||||
ITV
|
||||
ITV1
|
||||
Janson Media
|
||||
Jim Henson Family TV
|
||||
K2
|
||||
KCET
|
||||
Kidz Bop
|
||||
Kino Lorber
|
||||
KinoNation
|
||||
Klown
|
||||
Koan
|
||||
L Studio
|
||||
Lagardere
|
||||
Laguna Productions
|
||||
Latin Crush
|
||||
Legend Fighting Championship
|
||||
Legend Films
|
||||
Lifetime
|
||||
Link TV
|
||||
Lionsgate
|
||||
Liquid Comics
|
||||
Litton Entertainment
|
||||
LMN
|
||||
Local Food Sustainable Network
|
||||
Logo
|
||||
lolflix
|
||||
Long Way Round
|
||||
Look
|
||||
Lou Reda Productions
|
||||
Lucha Libre USA
|
||||
LXTV
|
||||
MAN
|
||||
Manga Entertainment
|
||||
Manolin Studios
|
||||
Mar Vista
|
||||
Martha Stewart Living
|
||||
Marvel
|
||||
Maverick Entertainment
|
||||
Maya
|
||||
MBC America
|
||||
Media Blasters
|
||||
Mentorn
|
||||
MGM
|
||||
MHz Networks
|
||||
Midnight Pulp
|
||||
Military History
|
||||
Millennium Media Services
|
||||
Modelinia
|
||||
Mojo
|
||||
MoMedia
|
||||
Monterey Media
|
||||
Moonscoop
|
||||
Moshcam
|
||||
Movieola
|
||||
Movies by OHM
|
||||
Moving Art
|
||||
MPI
|
||||
MSNBC
|
||||
MTV
|
||||
MulticomTV
|
||||
MVD Entertainment Group
|
||||
My Vortexx
|
||||
My Yoga
|
||||
MyNetworkTV
|
||||
NASA
|
||||
Nat Geo Wild
|
||||
National Geographic Channel
|
||||
NBC
|
||||
NBC News
|
||||
NBC Sports
|
||||
NBC Universal
|
||||
NBCU TV
|
||||
NCircle
|
||||
Netflix
|
||||
New Renaissance
|
||||
NHL
|
||||
Nickelodeon
|
||||
NickMom
|
||||
Nikki Sixx
|
||||
Nirvana Films
|
||||
NIS America
|
||||
Novel Ruby Productions
|
||||
NowThisNews
|
||||
nuvoTV
|
||||
O2 Media
|
||||
OhmTV
|
||||
Oops Doughnuts
|
||||
Ora TV
|
||||
Orange Lounge
|
||||
ORF Universum
|
||||
Oscilloscope Laboratories
|
||||
Oxygen
|
||||
Paley Media
|
||||
Panna
|
||||
Paranormal TV
|
||||
Passion River
|
||||
PBS Kids
|
||||
Phase 4 Films
|
||||
Players Network
|
||||
Plum TV
|
||||
PopSugar TV
|
||||
Power Rangers
|
||||
PPI Releasing
|
||||
PRO
|
||||
Pure Adrenaline
|
||||
Pure History
|
||||
Pure Nature
|
||||
Pure Science
|
||||
Questar
|
||||
Quintus Media
|
||||
Quiver
|
||||
Rajshri Media
|
||||
Raphael Saadiq
|
||||
Razor & Tie
|
||||
RCTV
|
||||
Real Magic TV
|
||||
Red Bull
|
||||
Red Hour Digital
|
||||
ReelAfrican
|
||||
ReelzChannel
|
||||
Revolver
|
||||
Rick Steves' Network
|
||||
RiffTrax
|
||||
Right Network
|
||||
Riverhorse
|
||||
Roadside Attractions
|
||||
Ron Hazelton Productions
|
||||
RooftopComedy
|
||||
Rovio
|
||||
RSA
|
||||
RT
|
||||
RTE
|
||||
S and S Entertainment
|
||||
Saavn
|
||||
Sachs Judah
|
||||
Salient Media
|
||||
Satelight
|
||||
Saturday Morning TV
|
||||
SBS
|
||||
SBS Australia
|
||||
Scholastic
|
||||
Science Channel
|
||||
Scott Entertainment
|
||||
Screen Media
|
||||
Sesame Street
|
||||
Shaftesbury
|
||||
Shemaroo
|
||||
Shochiku
|
||||
Shout! Factory
|
||||
Showtime
|
||||
Shree International
|
||||
Sky Studios
|
||||
SnagFilms
|
||||
SOFA
|
||||
SOMA
|
||||
Sonar Entertainment
|
||||
Sony Pictures Television
|
||||
SoPeachi
|
||||
Source Interlink Media
|
||||
SpaceRip
|
||||
SPEED
|
||||
Speed Racer Enterprises
|
||||
Spike
|
||||
Spike TV
|
||||
Stand Up To Cancer
|
||||
Starz
|
||||
Strand Releasing
|
||||
Strike.TV
|
||||
Sundance Channel
|
||||
SunWorld Pictures
|
||||
Sweet Irony
|
||||
Syfy
|
||||
Syndicado
|
||||
Synergetic
|
||||
Talking Baseball with Ed Randall
|
||||
Tantao Entertainment
|
||||
TasteTV
|
||||
Telepictures
|
||||
TenduTV
|
||||
The Cannell Studios
|
||||
The CW
|
||||
The Democratic National Convention
|
||||
The Denis Leary Podcasts
|
||||
The Global Film Initiative
|
||||
The Jim Henson Company
|
||||
The Kitchen Diva
|
||||
The LXD
|
||||
The Military Network
|
||||
The Morning After
|
||||
The National Film Board of Canada
|
||||
The New York Times
|
||||
The Onion
|
||||
The OnLine Network
|
||||
The Orchard
|
||||
The Rebound
|
||||
The Situation Workout
|
||||
The Sundance Institute
|
||||
The Three Stooges
|
||||
The Weinstein Company
|
||||
The White House
|
||||
The Wine Library
|
||||
The Zalman King Company
|
||||
This Week In Studios
|
||||
Thunderbird
|
||||
Tiny Island Productions
|
||||
TLA Releasing
|
||||
TLC
|
||||
TMS Entertainment
|
||||
Toei Animation
|
||||
Tokyopop
|
||||
Total College Sports
|
||||
Total Content Digital
|
||||
Touchstone Pictures
|
||||
Tr3s
|
||||
Transworld
|
||||
Travel Channel
|
||||
Troma
|
||||
TV Globo
|
||||
TV Land
|
||||
TVF International
|
||||
TVG Interactive Horseracing
|
||||
TVGN
|
||||
Twentieth Century Fox
|
||||
Uncork'd Entertainment
|
||||
UniMas
|
||||
Universal Pictures
|
||||
Universal Sports
|
||||
Universal Television
|
||||
Univision
|
||||
unwrapped.tv
|
||||
USA
|
||||
USA Network
|
||||
uStudio
|
||||
Vanguard Cinema
|
||||
Venevision
|
||||
Venus
|
||||
VH1
|
||||
Vibrant Media
|
||||
Videofashion
|
||||
viewster
|
||||
ViKi
|
||||
Virgil Films
|
||||
Vision Films
|
||||
Vivendi Entertainment
|
||||
VIZ Media
|
||||
Vogue.TV
|
||||
Wall Street Journal
|
||||
Warner Bros. Records
|
||||
WatchMojo.com
|
||||
Water.org
|
||||
WCG
|
||||
WE tv
|
||||
Web Therapy
|
||||
Well Go
|
||||
WEP
|
||||
Westchester Films
|
||||
Wolfe Video
|
||||
WWE
|
||||
Yan Can Cook
|
||||
Young Hollywood
|
||||
YourTango
|
||||
ZDF Enterprises
|
||||
ZED
|
||||
Zeitgeist Films
|
||||
Zodiak Kids
|
||||
Zodiak Rights
|
||||
ZoomTV
|
|
@ -791,7 +791,7 @@ namespace MediaBrowser.Server.Implementations.Library
|
|||
|
||||
var id = path.GetMBId(type);
|
||||
|
||||
var item = RetrieveItem(id) as T;
|
||||
var item = isNew ? null : RetrieveItem(id) as T;
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user