mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-21 17:44:43 +01:00
new Artist entity
This commit is contained in:
@@ -528,7 +528,7 @@ namespace MediaBrowser.Controller.Dto
|
||||
recursiveItemCount++;
|
||||
|
||||
// Check is recently added
|
||||
if (child.IsRecentlyAdded(user))
|
||||
if (child.IsRecentlyAdded())
|
||||
{
|
||||
rcentlyAddedItemCount++;
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
return "Artist-" + Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,5 +113,15 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
return (ProductionYear != null ? ProductionYear.Value.ToString("000-") : "")
|
||||
+ (IndexNumber != null ? IndexNumber.Value.ToString("0000 - ") : "") + Name;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the specified name has artist.
|
||||
/// </summary>
|
||||
/// <param name="name">The name.</param>
|
||||
/// <returns><c>true</c> if the specified name has artist; otherwise, <c>false</c>.</returns>
|
||||
public bool HasArtist(string name)
|
||||
{
|
||||
return Artists.Contains(name, StringComparer.OrdinalIgnoreCase) || string.Equals(AlbumArtist, name, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
/// <summary>
|
||||
/// The unknwon artist
|
||||
/// </summary>
|
||||
private static readonly MusicArtist UnknwonArtist = new MusicArtist {Name = "<Unknown>"};
|
||||
private static readonly MusicArtist UnknwonArtist = new MusicArtist { Name = "<Unknown>" };
|
||||
|
||||
/// <summary>
|
||||
/// Override this to return the folder that should be used to construct a container
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities.Audio
|
||||
{
|
||||
/// <summary>
|
||||
@@ -8,12 +6,6 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||
/// </summary>
|
||||
public class MusicArtist : Folder
|
||||
{
|
||||
public Dictionary<string, string> AlbumCovers { get; set; }
|
||||
|
||||
public override void ClearMetaValues()
|
||||
{
|
||||
AlbumCovers = null;
|
||||
base.ClearMetaValues();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,14 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// </summary>
|
||||
public abstract class BaseItem : IHasProviderIds
|
||||
{
|
||||
protected BaseItem()
|
||||
{
|
||||
Genres = new List<string>();
|
||||
TrailerUrls = new List<string>();
|
||||
Studios = new List<string>();
|
||||
People = new List<PersonInfo>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The trailer folder name
|
||||
/// </summary>
|
||||
@@ -925,16 +933,10 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <summary>
|
||||
/// Determines if the item is considered new based on user settings
|
||||
/// </summary>
|
||||
/// <param name="user">The user.</param>
|
||||
/// <returns><c>true</c> if [is recently added] [the specified user]; otherwise, <c>false</c>.</returns>
|
||||
/// <exception cref="System.ArgumentNullException"></exception>
|
||||
public bool IsRecentlyAdded(User user)
|
||||
public bool IsRecentlyAdded()
|
||||
{
|
||||
if (user == null)
|
||||
{
|
||||
throw new ArgumentNullException();
|
||||
}
|
||||
|
||||
return (DateTime.UtcNow - DateCreated).TotalDays < ConfigurationManager.Configuration.RecentItemDays;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
return "Genre-" + Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
return "Person-" + Name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
return "Studio-" + Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
|
||||
/// <returns>System.String.</returns>
|
||||
public override string GetUserDataKey()
|
||||
{
|
||||
return Name;
|
||||
return "Year-" + Name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,5 +213,13 @@ namespace MediaBrowser.Controller.Library
|
||||
/// <param name="parent">The parent.</param>
|
||||
/// <returns>IEnumerable{BaseItem}.</returns>
|
||||
IEnumerable<BaseItem> RetrieveChildren(Folder parent);
|
||||
|
||||
/// <summary>
|
||||
/// Validates the artists.
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <param name="progress">The progress.</param>
|
||||
/// <returns>Task.</returns>
|
||||
Task ValidateArtists(CancellationToken cancellationToken, IProgress<double> progress);
|
||||
}
|
||||
}
|
||||
@@ -53,8 +53,12 @@
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="MoreLinq">
|
||||
<HintPath>..\packages\morelinq.1.0.15631-beta\lib\net35\MoreLinq.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Runtime.Serialization" />
|
||||
@@ -111,9 +115,11 @@
|
||||
<Compile Include="Providers\IProviderManager.cs" />
|
||||
<Compile Include="Providers\MediaInfo\MediaEncoderHelpers.cs" />
|
||||
<Compile Include="Providers\MetadataProviderPriority.cs" />
|
||||
<Compile Include="Providers\Music\FanArtArtistByNameProvider.cs" />
|
||||
<Compile Include="Providers\Music\LastfmAlbumProvider.cs" />
|
||||
<Compile Include="Providers\Music\FanArtAlbumProvider.cs" />
|
||||
<Compile Include="Providers\Music\FanArtArtistProvider.cs" />
|
||||
<Compile Include="Providers\Music\LastfmArtistByNameProvider.cs" />
|
||||
<Compile Include="Providers\Music\LastfmArtistProvider.cs" />
|
||||
<Compile Include="Providers\Music\LastfmHelper.cs" />
|
||||
<Compile Include="Providers\Music\MusicArtistProviderFromJson.cs" />
|
||||
@@ -197,6 +203,9 @@
|
||||
<Name>MediaBrowser.Model</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>if $(ConfigurationName) == Release (
|
||||
|
||||
@@ -14,11 +14,12 @@ namespace MediaBrowser.Controller.Providers
|
||||
/// <param name="item">The item.</param>
|
||||
/// <param name="source">The source.</param>
|
||||
/// <param name="targetName">Name of the target.</param>
|
||||
/// <param name="saveLocally">if set to <c>true</c> [save locally].</param>
|
||||
/// <param name="resourcePool">The resource pool.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>Task{System.String}.</returns>
|
||||
/// <exception cref="System.ArgumentNullException">item</exception>
|
||||
Task<string> DownloadAndSaveImage(BaseItem item, string source, string targetName, SemaphoreSlim resourcePool, CancellationToken cancellationToken);
|
||||
Task<string> DownloadAndSaveImage(BaseItem item, string source, string targetName, bool saveLocally, SemaphoreSlim resourcePool, CancellationToken cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// Saves to library filesystem.
|
||||
|
||||
@@ -150,7 +150,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
Logger.Debug("FanArtProvider getting ClearLogo for " + movie.Name);
|
||||
try
|
||||
{
|
||||
movie.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(movie, path, LOGO_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
movie.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(movie, path, LOGO_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -176,7 +176,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
Logger.Debug("FanArtProvider getting ClearArt for " + movie.Name);
|
||||
try
|
||||
{
|
||||
movie.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(movie, path, ART_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
movie.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(movie, path, ART_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -199,7 +199,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
Logger.Debug("FanArtProvider getting DiscArt for " + movie.Name);
|
||||
try
|
||||
{
|
||||
movie.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(movie, path, DISC_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
movie.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(movie, path, DISC_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -223,7 +223,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
Logger.Debug("FanArtProvider getting Banner for " + movie.Name);
|
||||
try
|
||||
{
|
||||
movie.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(movie, path, BANNER_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
movie.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(movie, path, BANNER_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -247,7 +247,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
Logger.Debug("FanArtProvider getting Banner for " + movie.Name);
|
||||
try
|
||||
{
|
||||
movie.SetImage(ImageType.Thumb, await _providerManager.DownloadAndSaveImage(movie, path, THUMB_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
movie.SetImage(ImageType.Thumb, await _providerManager.DownloadAndSaveImage(movie, path, THUMB_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
|
||||
@@ -251,7 +251,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
new Regex(@"(?<name>.*)") // last resort matches the whole string as the name
|
||||
};
|
||||
|
||||
public const string LOCAL_META_FILE_NAME = "MBMovie.json";
|
||||
public const string LOCAL_META_FILE_NAME = "mbmovie.js";
|
||||
public const string ALT_META_FILE_NAME = "movie.xml";
|
||||
protected string ItemType = "movie";
|
||||
|
||||
@@ -268,7 +268,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
|
||||
}
|
||||
|
||||
if (providerInfo.LastRefreshStatus == ProviderRefreshStatus.CompletedWithErrors)
|
||||
if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success)
|
||||
{
|
||||
Logger.Debug("MovieProvider for {0} - last attempt had errors. Will try again.", item.Path);
|
||||
return true;
|
||||
@@ -281,9 +281,6 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DateTime.Today.Subtract(item.DateCreated).TotalDays > 180 && downloadDate != DateTime.MinValue)
|
||||
return false; // don't trigger a refresh data for item that are more than 6 months old and have been refreshed before
|
||||
|
||||
if (DateTime.Today.Subtract(downloadDate).TotalDays < ConfigurationManager.Configuration.MetadataRefreshDays) // only refresh every n days
|
||||
return false;
|
||||
|
||||
@@ -1034,7 +1031,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
{
|
||||
try
|
||||
{
|
||||
item.PrimaryImagePath = await ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + poster.file_path, "folder" + Path.GetExtension(poster.file_path), MovieDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
item.PrimaryImagePath = await ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + poster.file_path, "folder" + Path.GetExtension(poster.file_path), ConfigurationManager.Configuration.SaveLocalMeta, MovieDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -1066,7 +1063,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
{
|
||||
try
|
||||
{
|
||||
item.BackdropImagePaths.Add(await ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + images.backdrops[i].file_path, bdName + Path.GetExtension(images.backdrops[i].file_path), MovieDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.BackdropImagePaths.Add(await ProviderManager.DownloadAndSaveImage(item, tmdbImageUrl + images.backdrops[i].file_path, bdName + Path.GetExtension(images.backdrops[i].file_path), ConfigurationManager.Configuration.SaveLocalMeta, MovieDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace MediaBrowser.Controller.Providers.Movies
|
||||
/// <summary>
|
||||
/// The meta file name
|
||||
/// </summary>
|
||||
protected const string MetaFileName = "MBPerson.json";
|
||||
protected const string MetaFileName = "mbperson.js";
|
||||
|
||||
protected readonly IProviderManager ProviderManager;
|
||||
|
||||
|
||||
@@ -1,29 +1,34 @@
|
||||
using System.Collections.Generic;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Net;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
public class FanArtAlbumProvider : FanartBaseProvider
|
||||
{
|
||||
private readonly IProviderManager _providerManager;
|
||||
|
||||
public FanArtAlbumProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
|
||||
|
||||
protected IHttpClient HttpClient { get; private set; }
|
||||
|
||||
public FanArtAlbumProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
|
||||
: base(logManager, configurationManager)
|
||||
{
|
||||
_providerManager = providerManager;
|
||||
HttpClient = httpClient;
|
||||
}
|
||||
|
||||
public override bool Supports(BaseItem item)
|
||||
{
|
||||
return item is MusicAlbum && item.Parent is MusicArtist;
|
||||
return item is MusicAlbum;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -35,7 +40,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
|
||||
{
|
||||
//we fetch if image needed and haven't already tried recently
|
||||
return string.IsNullOrEmpty(item.PrimaryImagePath) &&
|
||||
return (string.IsNullOrEmpty(item.PrimaryImagePath) || !item.HasImage(ImageType.Disc)) &&
|
||||
DateTime.Today.Subtract(providerInfo.LastRefreshed).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays;
|
||||
}
|
||||
|
||||
@@ -45,46 +50,81 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
if (mbid == null)
|
||||
{
|
||||
Logger.Warn("No Musicbrainz id associated with album {0}", item.Name);
|
||||
SetLastRefreshed(item, DateTime.UtcNow, ProviderRefreshStatus.CompletedWithErrors);
|
||||
return false;
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
//Look at our parent for our album cover
|
||||
var artist = (MusicArtist)item.Parent;
|
||||
var url = string.Format("http://api.fanart.tv/webservice/album/{0}/{1}/xml/all/1/1", APIKey, item.GetProviderId(MetadataProviders.Musicbrainz));
|
||||
|
||||
var cover = artist.AlbumCovers != null ? GetValueOrDefault(artist.AlbumCovers, mbid, null) : null;
|
||||
var doc = new XmlDocument();
|
||||
|
||||
if (cover == null)
|
||||
try
|
||||
{
|
||||
using (var xml = await HttpClient.Get(url, FanArtResourcePool, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
doc.Load(xml);
|
||||
}
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
Logger.Warn("Unable to find cover art for {0}", item.Name);
|
||||
SetLastRefreshed(item, DateTime.UtcNow, ProviderRefreshStatus.CompletedWithErrors);
|
||||
return false;
|
||||
}
|
||||
|
||||
item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, cover, "folder.jpg", FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (doc.HasChildNodes)
|
||||
{
|
||||
if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Disc && !item.ResolveArgs.ContainsMetaFileByName(DISC_FILE))
|
||||
{
|
||||
var node = doc.SelectSingleNode("//fanart/music/albums/album//cdart/@url");
|
||||
|
||||
var path = node != null ? node.Value : null;
|
||||
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting Disc for " + item.Name);
|
||||
try
|
||||
{
|
||||
item.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(item, path, DISC_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Primary && !item.ResolveArgs.ContainsMetaFileByName(PRIMARY_FILE))
|
||||
{
|
||||
var node = doc.SelectSingleNode("//fanart/music/albums/album//albumcover/@url");
|
||||
|
||||
var path = node != null ? node.Value : null;
|
||||
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting albumcover for " + item.Name);
|
||||
try
|
||||
{
|
||||
item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, path, PRIMARY_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method for Dictionaries since they throw on not-found keys
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <typeparam name="U"></typeparam>
|
||||
/// <param name="dictionary">The dictionary.</param>
|
||||
/// <param name="key">The key.</param>
|
||||
/// <param name="defaultValue">The default value.</param>
|
||||
/// <returns>``1.</returns>
|
||||
private static U GetValueOrDefault<T, U>(Dictionary<T, U> dictionary, T key, U defaultValue)
|
||||
{
|
||||
U val;
|
||||
if (!dictionary.TryGetValue(key, out val))
|
||||
{
|
||||
val = defaultValue;
|
||||
}
|
||||
return val;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Model.Logging;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
/// <summary>
|
||||
/// Class FanArtArtistByNameProvider
|
||||
/// </summary>
|
||||
public class FanArtArtistByNameProvider : FanArtArtistProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FanArtArtistByNameProvider" /> class.
|
||||
/// </summary>
|
||||
/// <param name="httpClient">The HTTP client.</param>
|
||||
/// <param name="logManager">The log manager.</param>
|
||||
/// <param name="configurationManager">The configuration manager.</param>
|
||||
/// <param name="providerManager">The provider manager.</param>
|
||||
public FanArtArtistByNameProvider(IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
|
||||
: base(httpClient, logManager, configurationManager, providerManager)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Supportses the specified item.
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
public override bool Supports(BaseItem item)
|
||||
{
|
||||
return item is Artist;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether [save local meta].
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if [save local meta]; otherwise, <c>false</c>.</value>
|
||||
protected override bool SaveLocalMeta
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
/// <summary>
|
||||
/// Class FanArtArtistProvider
|
||||
/// </summary>
|
||||
class FanArtArtistProvider : FanartBaseProvider
|
||||
public class FanArtArtistProvider : FanartBaseProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the HTTP client.
|
||||
@@ -54,6 +54,11 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
return item is MusicArtist;
|
||||
}
|
||||
|
||||
protected virtual bool SaveLocalMeta
|
||||
{
|
||||
get { return ConfigurationManager.Configuration.SaveLocalMeta; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Shoulds the fetch.
|
||||
/// </summary>
|
||||
@@ -62,16 +67,11 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
protected override bool ShouldFetch(BaseItem item, BaseProviderInfo providerInfo)
|
||||
{
|
||||
var artist = (MusicArtist)item;
|
||||
if (item.Path == null || item.DontFetchMeta || string.IsNullOrEmpty(artist.GetProviderId(MetadataProviders.Musicbrainz))) return false; //nothing to do
|
||||
var artExists = item.ResolveArgs.ContainsMetaFileByName(ART_FILE);
|
||||
var logoExists = item.ResolveArgs.ContainsMetaFileByName(LOGO_FILE);
|
||||
var discExists = item.ResolveArgs.ContainsMetaFileByName(DISC_FILE);
|
||||
if (item.Path == null || item.DontFetchMeta || string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Musicbrainz))) return false; //nothing to do
|
||||
|
||||
return (!artExists && ConfigurationManager.Configuration.DownloadMusicArtistImages.Art)
|
||||
|| (!logoExists && ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo)
|
||||
|| (!discExists && ConfigurationManager.Configuration.DownloadMusicArtistImages.Disc)
|
||||
|| ((artist.AlbumCovers == null || artist.AlbumCovers.Count == 0) && ConfigurationManager.Configuration.DownloadMusicAlbumImages.Primary);
|
||||
return (!item.ResolveArgs.ContainsMetaFileByName(ART_FILE) && ConfigurationManager.Configuration.DownloadMusicArtistImages.Art)
|
||||
|| (!item.ResolveArgs.ContainsMetaFileByName(LOGO_FILE) && ConfigurationManager.Configuration.DownloadMusicArtistImages.Logo)
|
||||
|| (!item.ResolveArgs.ContainsMetaFileByName(DISC_FILE) && ConfigurationManager.Configuration.DownloadMusicArtistImages.Disc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -85,7 +85,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
var artist = (MusicArtist)item;
|
||||
//var artist = item;
|
||||
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
@@ -94,9 +94,9 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
if (ShouldFetch(artist, providerData))
|
||||
if (ShouldFetch(item, providerData))
|
||||
{
|
||||
var url = string.Format(FanArtBaseUrl, APIKey, artist.GetProviderId(MetadataProviders.Musicbrainz));
|
||||
var url = string.Format(FanArtBaseUrl, APIKey, item.GetProviderId(MetadataProviders.Musicbrainz));
|
||||
var doc = new XmlDocument();
|
||||
|
||||
try
|
||||
@@ -124,10 +124,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
path = node != null ? node.Value : null;
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting ClearLogo for " + artist.Name);
|
||||
Logger.Debug("FanArtProvider getting ClearLogo for " + item.Name);
|
||||
try
|
||||
{
|
||||
artist.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(artist, path, LOGO_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(item, path, LOGO_FILE, SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -146,16 +146,16 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
if (nodes != null)
|
||||
{
|
||||
var numBackdrops = 0;
|
||||
artist.BackdropImagePaths = new List<string>();
|
||||
item.BackdropImagePaths = new List<string>();
|
||||
foreach (XmlNode node in nodes)
|
||||
{
|
||||
path = node.Value;
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting Backdrop for " + artist.Name);
|
||||
Logger.Debug("FanArtProvider getting Backdrop for " + item.Name);
|
||||
try
|
||||
{
|
||||
artist.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(artist, path, ("Backdrop" + (numBackdrops > 0 ? numBackdrops.ToString() : "") + ".jpg"), FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(item, path, ("Backdrop" + (numBackdrops > 0 ? numBackdrops.ToString() : "") + ".jpg"), SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
numBackdrops++;
|
||||
if (numBackdrops >= ConfigurationManager.Configuration.MaxBackdrops) break;
|
||||
}
|
||||
@@ -175,32 +175,6 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (ConfigurationManager.Configuration.DownloadMusicAlbumImages.Primary)
|
||||
{
|
||||
var nodes = doc.SelectNodes("//fanart/music/albums/*");
|
||||
if (nodes != null)
|
||||
{
|
||||
artist.AlbumCovers = new Dictionary<string, string>();
|
||||
foreach (XmlNode node in nodes)
|
||||
{
|
||||
|
||||
var key = node.Attributes["id"] != null ? node.Attributes["id"].Value : null;
|
||||
var cover = node.SelectSingleNode("albumcover/@url");
|
||||
path = cover != null ? cover.Value : null;
|
||||
|
||||
if (!string.IsNullOrEmpty(path) && !string.IsNullOrEmpty(key))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting Album Cover for " + artist.Name);
|
||||
artist.AlbumCovers[key] = path;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
if (ConfigurationManager.Configuration.DownloadMusicArtistImages.Art && !item.ResolveArgs.ContainsMetaFileByName(ART_FILE))
|
||||
{
|
||||
var node =
|
||||
@@ -209,10 +183,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
path = node != null ? node.Value : null;
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting ClearArt for " + artist.Name);
|
||||
Logger.Debug("FanArtProvider getting ClearArt for " + item.Name);
|
||||
try
|
||||
{
|
||||
artist.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(artist, path, ART_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(item, path, ART_FILE, SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -232,10 +206,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
path = node != null ? node.Value : null;
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting Banner for " + artist.Name);
|
||||
Logger.Debug("FanArtProvider getting Banner for " + item.Name);
|
||||
try
|
||||
{
|
||||
artist.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(artist, path, BANNER_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(item, path, BANNER_FILE, SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -256,10 +230,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
path = node != null ? node.Value : null;
|
||||
if (!string.IsNullOrEmpty(path))
|
||||
{
|
||||
Logger.Debug("FanArtProvider getting Primary image for " + artist.Name);
|
||||
Logger.Debug("FanArtProvider getting Primary image for " + item.Name);
|
||||
try
|
||||
{
|
||||
artist.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(artist, path, PRIMARY_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
item.SetImage(ImageType.Primary, await _providerManager.DownloadAndSaveImage(item, path, PRIMARY_FILE, SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -272,7 +246,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
}
|
||||
}
|
||||
}
|
||||
SetLastRefreshed(artist, DateTime.UtcNow);
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Net;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
using MoreLinq;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
@@ -33,26 +34,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
|
||||
protected override async Task FetchLastfmData(BaseItem item, string id, CancellationToken cancellationToken)
|
||||
{
|
||||
// Get albu info using artist and album name
|
||||
var url = RootUrl + string.Format("method=album.getInfo&artist={0}&album={1}&api_key={2}&format=json", UrlEncode(item.Parent.Name), UrlEncode(item.Name), ApiKey);
|
||||
|
||||
LastfmGetAlbumResult result;
|
||||
|
||||
try
|
||||
{
|
||||
using (var json = await HttpClient.Get(url, LastfmResourcePool, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
result = JsonSerializer.DeserializeFromStream<LastfmGetAlbumResult>(json);
|
||||
}
|
||||
}
|
||||
catch (HttpException e)
|
||||
{
|
||||
if (e.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
throw new LastfmProviderException(string.Format("Unable to retrieve album info for {0} with artist {1}", item.Name, item.Parent.Name));
|
||||
}
|
||||
throw;
|
||||
}
|
||||
var result = await GetAlbumResult(item, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (result != null && result.album != null)
|
||||
{
|
||||
@@ -71,9 +53,60 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<LastfmGetAlbumResult> GetAlbumResult(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
var result = await GetAlbumResult(item.Parent.Name, item.Name, cancellationToken);
|
||||
|
||||
if (result != null && result.album != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var folder = (Folder)item;
|
||||
|
||||
// Get each song, distinct by the combination of AlbumArtist and Album
|
||||
var songs = folder.Children.OfType<Audio>().DistinctBy(i => (i.AlbumArtist ?? string.Empty) + (i.Album ?? string.Empty), StringComparer.OrdinalIgnoreCase).ToList();
|
||||
|
||||
foreach (var song in songs.Where(song => !string.IsNullOrEmpty(song.Album) && !string.IsNullOrEmpty(song.AlbumArtist)))
|
||||
{
|
||||
result = await GetAlbumResult(song.AlbumArtist, song.Album, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
if (result != null && result.album != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private async Task<LastfmGetAlbumResult> GetAlbumResult(string artist, string album, CancellationToken cancellationToken)
|
||||
{
|
||||
// Get albu info using artist and album name
|
||||
var url = RootUrl + string.Format("method=album.getInfo&artist={0}&album={1}&api_key={2}&format=json", UrlEncode(artist), UrlEncode(album), ApiKey);
|
||||
|
||||
using (var json = await HttpClient.Get(url, LastfmResourcePool, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
return JsonSerializer.DeserializeFromStream<LastfmGetAlbumResult>(json);
|
||||
}
|
||||
}
|
||||
|
||||
protected override Task FetchData(BaseItem item, CancellationToken cancellationToken)
|
||||
{
|
||||
return FetchLastfmData(item, string.Empty, cancellationToken);
|
||||
}
|
||||
|
||||
public override bool Supports(BaseItem item)
|
||||
{
|
||||
return item is MusicAlbum;
|
||||
}
|
||||
|
||||
protected override bool RefreshOnFileSystemStampChange
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Controller.Entities.Audio;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
/// <summary>
|
||||
/// Class LastfmArtistByNameProvider
|
||||
/// </summary>
|
||||
public class LastfmArtistByNameProvider : LastfmArtistProvider
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="LastfmArtistByNameProvider"/> class.
|
||||
/// </summary>
|
||||
/// <param name="jsonSerializer">The json serializer.</param>
|
||||
/// <param name="httpClient">The HTTP client.</param>
|
||||
/// <param name="logManager">The log manager.</param>
|
||||
/// <param name="configurationManager">The configuration manager.</param>
|
||||
/// <param name="providerManager">The provider manager.</param>
|
||||
public LastfmArtistByNameProvider(IJsonSerializer jsonSerializer, IHttpClient httpClient, ILogManager logManager, IServerConfigurationManager configurationManager, IProviderManager providerManager)
|
||||
: base(jsonSerializer, httpClient, logManager, configurationManager, providerManager)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether [save local meta].
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if [save local meta]; otherwise, <c>false</c>.</value>
|
||||
protected override bool SaveLocalMeta
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Supportses the specified item.
|
||||
/// </summary>
|
||||
/// <param name="item">The item.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
|
||||
public override bool Supports(BaseItem item)
|
||||
{
|
||||
return item is Artist;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
//Execute the Artist search against our name and assume first one is the one we want
|
||||
var url = RootUrl + string.Format("method=artist.search&artist={0}&api_key={1}&format=json", UrlEncode(item.Name), ApiKey);
|
||||
|
||||
LastfmArtistSearchResults searchResult = null;
|
||||
LastfmArtistSearchResults searchResult;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -60,29 +60,18 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
// Get artist info with provided id
|
||||
var url = RootUrl + string.Format("method=artist.getInfo&mbid={0}&api_key={1}&format=json", UrlEncode(id), ApiKey);
|
||||
|
||||
LastfmGetArtistResult result = null;
|
||||
LastfmGetArtistResult result;
|
||||
|
||||
try
|
||||
using (var json = await HttpClient.Get(url, LastfmResourcePool, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
using (var json = await HttpClient.Get(url, LastfmResourcePool, cancellationToken).ConfigureAwait(false))
|
||||
{
|
||||
result = JsonSerializer.DeserializeFromStream<LastfmGetArtistResult>(json);
|
||||
}
|
||||
}
|
||||
catch (HttpException e)
|
||||
{
|
||||
if (e.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
throw new LastfmProviderException(string.Format("Unable to retrieve artist info for {0} with id {1}", item.Name, id));
|
||||
}
|
||||
throw;
|
||||
result = JsonSerializer.DeserializeFromStream<LastfmGetArtistResult>(json);
|
||||
}
|
||||
|
||||
if (result != null && result.artist != null)
|
||||
{
|
||||
LastfmHelper.ProcessArtistData(item, result.artist);
|
||||
//And save locally if indicated
|
||||
if (ConfigurationManager.Configuration.SaveLocalMeta)
|
||||
if (SaveLocalMeta)
|
||||
{
|
||||
var ms = new MemoryStream();
|
||||
JsonSerializer.SerializeToStream(result.artist, ms);
|
||||
|
||||
@@ -1,26 +1,17 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Common.Net;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Entities;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Logging;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Model.Serialization;
|
||||
|
||||
namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
class LastfmProviderException : ApplicationException
|
||||
{
|
||||
public LastfmProviderException(string msg)
|
||||
: base(msg)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// Class MovieDbProvider
|
||||
/// </summary>
|
||||
@@ -84,6 +75,14 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
/// </summary>
|
||||
protected string LocalMetaFileName { get; set; }
|
||||
|
||||
protected virtual bool SaveLocalMeta
|
||||
{
|
||||
get
|
||||
{
|
||||
return ConfigurationManager.Configuration.SaveLocalMeta;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// If we save locally, refresh if they delete something
|
||||
/// </summary>
|
||||
@@ -91,7 +90,7 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
get
|
||||
{
|
||||
return ConfigurationManager.Configuration.SaveLocalMeta;
|
||||
return SaveLocalMeta;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,16 +172,15 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
if (item.DontFetchMeta) return false;
|
||||
|
||||
if (ConfigurationManager.Configuration.SaveLocalMeta && HasFileSystemStampChanged(item, providerInfo))
|
||||
if (RefreshOnFileSystemStampChange && HasFileSystemStampChanged(item, providerInfo))
|
||||
{
|
||||
//If they deleted something from file system, chances are, this item was mis-identified the first time
|
||||
item.SetProviderId(MetadataProviders.Musicbrainz, null);
|
||||
Logger.Debug("LastfmProvider reports file system stamp change...");
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
if (providerInfo.LastRefreshStatus == ProviderRefreshStatus.CompletedWithErrors)
|
||||
if (providerInfo.LastRefreshStatus != ProviderRefreshStatus.Success)
|
||||
{
|
||||
Logger.Debug("LastfmProvider for {0} - last attempt had errors. Will try again.", item.Path);
|
||||
return true;
|
||||
@@ -194,22 +192,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
return true;
|
||||
}
|
||||
|
||||
var downloadDate = providerInfo.LastRefreshed;
|
||||
if (DateTime.UtcNow.Subtract(providerInfo.LastRefreshed).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays) // only refresh every n days
|
||||
return true;
|
||||
|
||||
if (ConfigurationManager.Configuration.MetadataRefreshDays == -1 && downloadDate != DateTime.MinValue)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (DateTime.Today.Subtract(item.DateCreated).TotalDays > 180 && downloadDate != DateTime.MinValue)
|
||||
return false; // don't trigger a refresh data for item that are more than 6 months old and have been refreshed before
|
||||
|
||||
if (DateTime.Today.Subtract(downloadDate).TotalDays < ConfigurationManager.Configuration.MetadataRefreshDays) // only refresh every n days
|
||||
return false;
|
||||
|
||||
|
||||
Logger.Debug("LastfmProvider - " + item.Name + " needs refresh. Download date: " + downloadDate + " item created date: " + item.DateCreated + " Check for Update age: " + ConfigurationManager.Configuration.MetadataRefreshDays);
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -221,36 +207,9 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
/// <returns>Task{System.Boolean}.</returns>
|
||||
public override async Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
|
||||
{
|
||||
if (item.DontFetchMeta)
|
||||
{
|
||||
Logger.Info("LastfmProvider - Not fetching because requested to ignore " + item.Name);
|
||||
return false;
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
BaseProviderInfo providerData;
|
||||
|
||||
if (!item.ProviderData.TryGetValue(Id, out providerData))
|
||||
{
|
||||
providerData = new BaseProviderInfo();
|
||||
}
|
||||
|
||||
if (!ConfigurationManager.Configuration.SaveLocalMeta || !HasLocalMeta(item) || (force && !HasLocalMeta(item)) || (RefreshOnVersionChange && providerData.ProviderVersion != ProviderVersion))
|
||||
{
|
||||
try
|
||||
{
|
||||
await FetchData(item, cancellationToken).ConfigureAwait(false);
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
}
|
||||
catch (LastfmProviderException)
|
||||
{
|
||||
SetLastRefreshed(item, DateTime.UtcNow, ProviderRefreshStatus.CompletedWithErrors);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
Logger.Debug("LastfmProvider not fetching because local meta exists for " + item.Name);
|
||||
await FetchData(item, cancellationToken).ConfigureAwait(false);
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -6,20 +6,23 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
public static class LastfmHelper
|
||||
{
|
||||
public static string LocalArtistMetaFileName = "MBArtist.json";
|
||||
public static string LocalAlbumMetaFileName = "MBAlbum.json";
|
||||
public static string LocalArtistMetaFileName = "mbartist.js";
|
||||
public static string LocalAlbumMetaFileName = "mbalbum.js";
|
||||
|
||||
public static void ProcessArtistData(BaseItem artist, LastfmArtist data)
|
||||
{
|
||||
var overview = data.bio != null ? data.bio.content : null;
|
||||
|
||||
artist.Overview = overview;
|
||||
|
||||
var yearFormed = 0;
|
||||
|
||||
if (data.bio != null)
|
||||
{
|
||||
Int32.TryParse(data.bio.yearformed, out yearFormed);
|
||||
|
||||
artist.Overview = data.bio.content;
|
||||
|
||||
if (!string.IsNullOrEmpty(data.bio.placeformed))
|
||||
{
|
||||
artist.AddProductionLocation(data.bio.placeformed);
|
||||
}
|
||||
}
|
||||
|
||||
artist.PremiereDate = yearFormed > 0 ? new DateTime(yearFormed, 1,1) : DateTime.MinValue;
|
||||
@@ -52,7 +55,10 @@ namespace MediaBrowser.Controller.Providers.Music
|
||||
{
|
||||
foreach (var tag in tags.tag)
|
||||
{
|
||||
item.AddGenre(tag.name);
|
||||
if (!string.IsNullOrEmpty(tag.name))
|
||||
{
|
||||
item.AddGenre(tag.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
Logger.Debug("FanArtProvider getting ClearLogo for " + series.Name);
|
||||
try
|
||||
{
|
||||
series.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(series, path, LOGO_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
series.SetImage(ImageType.Logo, await _providerManager.DownloadAndSaveImage(series, path, LOGO_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -124,7 +124,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
Logger.Debug("FanArtProvider getting ClearArt for " + series.Name);
|
||||
try
|
||||
{
|
||||
series.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(series, path, ART_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
series.SetImage(ImageType.Art, await _providerManager.DownloadAndSaveImage(series, path, ART_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -148,7 +148,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
Logger.Debug("FanArtProvider getting ThumbArt for " + series.Name);
|
||||
try
|
||||
{
|
||||
series.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(series, path, THUMB_FILE, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
series.SetImage(ImageType.Disc, await _providerManager.DownloadAndSaveImage(series, path, THUMB_FILE, ConfigurationManager.Configuration.SaveLocalMeta, FanArtResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
|
||||
@@ -233,7 +233,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
|
||||
try
|
||||
{
|
||||
episode.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken);
|
||||
episode.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(episode, TVUtils.BannerUrl + p, Path.GetFileName(p), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken);
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
|
||||
@@ -177,7 +177,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
try
|
||||
{
|
||||
if (n != null)
|
||||
season.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
season.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -204,7 +204,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
TVUtils.BannerUrl + n.InnerText,
|
||||
"banner" +
|
||||
Path.GetExtension(n.InnerText),
|
||||
RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).
|
||||
ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).
|
||||
ConfigureAwait(false);
|
||||
|
||||
season.SetImage(ImageType.Banner, bannerImagePath);
|
||||
@@ -231,7 +231,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
try
|
||||
{
|
||||
if (season.BackdropImagePaths == null) season.BackdropImagePaths = new List<string>();
|
||||
season.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
season.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(season, TVUtils.BannerUrl + n.InnerText, "backdrop" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -265,7 +265,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
"backdrop" +
|
||||
Path.GetExtension(
|
||||
n.InnerText),
|
||||
RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken)
|
||||
ConfigurationManager.Configuration.SaveLocalMeta, RemoteSeriesProvider.Current.TvDbResourcePool, cancellationToken)
|
||||
.ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
|
||||
@@ -228,7 +228,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
string n = doc.SafeGetString("//banner");
|
||||
if (!string.IsNullOrWhiteSpace(n))
|
||||
{
|
||||
series.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n, "banner" + Path.GetExtension(n), TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
series.SetImage(ImageType.Banner, await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n, "banner" + Path.GetExtension(n), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
|
||||
string s = doc.SafeGetString("//Network");
|
||||
@@ -369,7 +369,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
{
|
||||
try
|
||||
{
|
||||
series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), TvDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
@@ -392,7 +392,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
{
|
||||
try
|
||||
{
|
||||
var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), TvDbResourcePool, cancellationToken);
|
||||
var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken);
|
||||
|
||||
series.SetImage(ImageType.Banner, bannerImagePath);
|
||||
}
|
||||
@@ -421,7 +421,7 @@ namespace MediaBrowser.Controller.Providers.TV
|
||||
{
|
||||
try
|
||||
{
|
||||
series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false));
|
||||
}
|
||||
catch (HttpException)
|
||||
{
|
||||
|
||||
4
MediaBrowser.Controller/packages.config
Normal file
4
MediaBrowser.Controller/packages.config
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="morelinq" version="1.0.15631-beta" targetFramework="net45" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user