updated tvdb search
This commit is contained in:
parent
f5919990c9
commit
b3127f19b5
|
@ -455,7 +455,7 @@ namespace MediaBrowser.Api
|
|||
|
||||
var user = _userManager.GetUserById(id);
|
||||
|
||||
var task = user.Name.Equals(dtoUser.Name, StringComparison.Ordinal) ?
|
||||
var task = string.Equals(user.Name, dtoUser.Name, StringComparison.Ordinal) ?
|
||||
_userManager.UpdateUser(user) :
|
||||
_userManager.RenameUser(user, dtoUser.Name);
|
||||
|
||||
|
|
|
@ -894,12 +894,14 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <returns>System.String.</returns>
|
||||
public string GetUserDataKey()
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(_userDataKey))
|
||||
if (string.IsNullOrWhiteSpace(_userDataKey))
|
||||
{
|
||||
return _userDataKey;
|
||||
var key = CreateUserDataKey();
|
||||
_userDataKey = key;
|
||||
return key;
|
||||
}
|
||||
|
||||
return _userDataKey ?? (_userDataKey = CreateUserDataKey());
|
||||
return _userDataKey;
|
||||
}
|
||||
|
||||
protected virtual string CreateUserDataKey()
|
||||
|
@ -914,6 +916,12 @@ namespace MediaBrowser.Controller.Entities
|
|||
return current.IsInMixedFolder == newItem.IsInMixedFolder;
|
||||
}
|
||||
|
||||
public void AfterMetadataRefresh()
|
||||
{
|
||||
_sortName = null;
|
||||
_userDataKey = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the preferred metadata language.
|
||||
/// </summary>
|
||||
|
|
|
@ -121,12 +121,6 @@ namespace MediaBrowser.Controller.Entities
|
|||
return args;
|
||||
}
|
||||
|
||||
// Cache this since it will be used a lot
|
||||
/// <summary>
|
||||
/// The null task result
|
||||
/// </summary>
|
||||
private static readonly Task NullTaskResult = Task.FromResult<object>(null);
|
||||
|
||||
/// <summary>
|
||||
/// Compare our current children (presumably just read from the repo) with the current state of the file system and adjust for any changes
|
||||
/// ***Currently does not contain logic to maintain items that are unavailable in the file system***
|
||||
|
@ -138,7 +132,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <param name="refreshOptions">The refresh options.</param>
|
||||
/// <param name="directoryService">The directory service.</param>
|
||||
/// <returns>Task.</returns>
|
||||
protected override async Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
|
||||
protected override Task ValidateChildrenInternal(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
|
||||
{
|
||||
var list = PhysicalLocationsList.ToList();
|
||||
|
||||
|
@ -146,8 +140,10 @@ namespace MediaBrowser.Controller.Entities
|
|||
|
||||
if (!list.SequenceEqual(PhysicalLocationsList))
|
||||
{
|
||||
await UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
|
||||
return UpdateToRepository(ItemUpdateType.MetadataImport, cancellationToken);
|
||||
}
|
||||
|
||||
return Task.FromResult(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -373,12 +373,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <returns>Task.</returns>
|
||||
public Task ValidateChildren(IProgress<double> progress, CancellationToken cancellationToken, MetadataRefreshOptions metadataRefreshOptions, bool recursive = true)
|
||||
{
|
||||
return ValidateChildrenWithCancellationSupport(progress, cancellationToken, recursive, true, metadataRefreshOptions, metadataRefreshOptions.DirectoryService);
|
||||
}
|
||||
|
||||
private Task ValidateChildrenWithCancellationSupport(IProgress<double> progress, CancellationToken cancellationToken, bool recursive, bool refreshChildMetadata, MetadataRefreshOptions refreshOptions, IDirectoryService directoryService)
|
||||
{
|
||||
return ValidateChildrenInternal(progress, cancellationToken, recursive, refreshChildMetadata, refreshOptions, directoryService);
|
||||
return ValidateChildrenInternal(progress, cancellationToken, recursive, true, metadataRefreshOptions, metadataRefreshOptions.DirectoryService);
|
||||
}
|
||||
|
||||
private Dictionary<Guid, BaseItem> GetActualChildrenDictionary()
|
||||
|
@ -676,7 +671,7 @@ namespace MediaBrowser.Controller.Entities
|
|||
}
|
||||
});
|
||||
|
||||
await child.ValidateChildrenWithCancellationSupport(innerProgress, cancellationToken, true, false, null, directoryService)
|
||||
await child.ValidateChildrenInternal(innerProgress, cancellationToken, true, false, null, directoryService)
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,5 +54,10 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// Gets the item identities.
|
||||
/// </summary>
|
||||
List<IItemIdentity> Identities { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Afters the metadata refresh.
|
||||
/// </summary>
|
||||
void AfterMetadataRefresh();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -138,6 +138,7 @@ namespace MediaBrowser.Controller.Entities.Movies
|
|||
|
||||
public async Task RefreshAllMetadata(MetadataRefreshOptions refreshOptions, IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
var b = this;
|
||||
// Refresh bottom up, children first, then the boxset
|
||||
// By then hopefully the movies within will have Tmdb collection values
|
||||
var items = GetRecursiveChildren().ToList();
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
using MediaBrowser.Controller.Providers;
|
||||
using MediaBrowser.Model.Configuration;
|
||||
using MediaBrowser.Model.Entities;
|
||||
using MediaBrowser.Model.Users;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
using MediaBrowser.Model.Users;
|
||||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
|
|
|
@ -229,16 +229,16 @@ namespace MediaBrowser.Controller.Entities
|
|||
/// <returns>System.String.</returns>
|
||||
private string GetConfigurationDirectoryPath(string username)
|
||||
{
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
throw new ArgumentNullException("username");
|
||||
}
|
||||
|
||||
var parentPath = ConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath;
|
||||
|
||||
// Legacy
|
||||
if (!UsesIdForConfigurationPath)
|
||||
{
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
throw new ArgumentNullException("username");
|
||||
}
|
||||
|
||||
var safeFolderName = FileSystem.GetValidFilename(username);
|
||||
|
||||
return System.IO.Path.Combine(ConfigurationManager.ApplicationPaths.UserConfigurationDirectoryPath, safeFolderName);
|
||||
|
|
|
@ -114,7 +114,7 @@ namespace MediaBrowser.Providers.Manager
|
|||
catch (Exception ex)
|
||||
{
|
||||
localImagesFailed = true;
|
||||
Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name);
|
||||
Logger.ErrorException("Error validating images for {0}", ex, item.Path ?? item.Name ?? "Unknown name");
|
||||
refreshResult.AddStatus(ProviderRefreshStatus.Failure, ex.Message);
|
||||
}
|
||||
|
||||
|
@ -182,6 +182,8 @@ namespace MediaBrowser.Providers.Manager
|
|||
{
|
||||
await SaveProviderResult(itemOfType, refreshResult, refreshOptions.DirectoryService).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
itemOfType.AfterMetadataRefresh();
|
||||
}
|
||||
|
||||
private void MergeIdentities(TItemType item, TIdType id)
|
||||
|
|
|
@ -14,6 +14,8 @@ using MediaBrowser.Providers.Movies;
|
|||
using MediaBrowser.Providers.TV;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
@ -35,19 +37,75 @@ namespace MediaBrowser.Providers.Omdb
|
|||
_libraryManager = libraryManager;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
|
||||
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
return new List<RemoteSearchResult>();
|
||||
return GetSearchResults(searchInfo, "series", cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(TrailerInfo searchInfo, CancellationToken cancellationToken)
|
||||
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
return new List<RemoteSearchResult>();
|
||||
return GetSearchResults(searchInfo, "movie", cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(MovieInfo searchInfo, CancellationToken cancellationToken)
|
||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ItemLookupInfo searchInfo, string type, CancellationToken cancellationToken)
|
||||
{
|
||||
return new List<RemoteSearchResult>();
|
||||
var list = new List<RemoteSearchResult>();
|
||||
|
||||
var imdbId = searchInfo.GetProviderId(MetadataProviders.Imdb);
|
||||
if (!string.IsNullOrWhiteSpace(imdbId))
|
||||
{
|
||||
return list;
|
||||
}
|
||||
|
||||
var url = "http://www.omdbapi.com/?plot=short&r=json";
|
||||
|
||||
var name = searchInfo.Name;
|
||||
var year = searchInfo.Year;
|
||||
|
||||
if (year.HasValue)
|
||||
{
|
||||
url += "&y=" + year.Value.ToString(CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
url += "&t=" + WebUtility.UrlEncode(name);
|
||||
url += "&type=" + type;
|
||||
|
||||
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
||||
{
|
||||
Url = url,
|
||||
ResourcePool = OmdbProvider.ResourcePool,
|
||||
CancellationToken = cancellationToken,
|
||||
CacheMode = CacheMode.Unconditional,
|
||||
CacheLength = TimeSpan.FromDays(7)
|
||||
|
||||
}).ConfigureAwait(false))
|
||||
{
|
||||
var result = _jsonSerializer.DeserializeFromStream<SearchResult>(stream);
|
||||
|
||||
if (string.Equals(result.Response, "true", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var item = new RemoteSearchResult();
|
||||
|
||||
item.SearchProviderName = Name;
|
||||
item.Name = result.Title;
|
||||
item.SetProviderId(MetadataProviders.Imdb, result.imdbID);
|
||||
|
||||
int parsedYear;
|
||||
if (int.TryParse(result.Year, NumberStyles.Any, CultureInfo.InvariantCulture, out parsedYear))
|
||||
{
|
||||
item.ProductionYear = parsedYear;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(result.Poster) && !string.Equals(result.Poster, "N/A", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
item.ImageUrl = result.Poster;
|
||||
}
|
||||
|
||||
list.Add(item);
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public Task<MetadataResult<ChannelVideoItem>> GetMetadata(ChannelItemLookupInfo info, CancellationToken cancellationToken)
|
||||
|
@ -60,9 +118,14 @@ namespace MediaBrowser.Providers.Omdb
|
|||
return GetMovieResult<ChannelVideoItem>(info, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ChannelItemLookupInfo searchInfo, CancellationToken cancellationToken)
|
||||
public Task<IEnumerable<RemoteSearchResult>> GetSearchResults(ChannelItemLookupInfo searchInfo, CancellationToken cancellationToken)
|
||||
{
|
||||
return new List<RemoteSearchResult>();
|
||||
if (searchInfo.ContentType != ChannelMediaContentType.MovieExtra || searchInfo.ExtraType != ExtraType.Trailer)
|
||||
{
|
||||
return Task.FromResult<IEnumerable<RemoteSearchResult>>(new List<RemoteSearchResult>());
|
||||
}
|
||||
|
||||
return GetSearchResults(searchInfo, "movie", cancellationToken);
|
||||
}
|
||||
|
||||
public string Name
|
||||
|
@ -185,7 +248,36 @@ namespace MediaBrowser.Providers.Omdb
|
|||
|
||||
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
return _httpClient.GetResponse(new HttpRequestOptions
|
||||
{
|
||||
CancellationToken = cancellationToken,
|
||||
Url = url,
|
||||
ResourcePool = OmdbProvider.ResourcePool
|
||||
});
|
||||
}
|
||||
|
||||
class SearchResult
|
||||
{
|
||||
public string Title { get; set; }
|
||||
public string Year { get; set; }
|
||||
public string Rated { get; set; }
|
||||
public string Released { get; set; }
|
||||
public string Runtime { get; set; }
|
||||
public string Genre { get; set; }
|
||||
public string Director { get; set; }
|
||||
public string Writer { get; set; }
|
||||
public string Actors { get; set; }
|
||||
public string Plot { get; set; }
|
||||
public string Language { get; set; }
|
||||
public string Country { get; set; }
|
||||
public string Awards { get; set; }
|
||||
public string Poster { get; set; }
|
||||
public string Metascore { get; set; }
|
||||
public string imdbRating { get; set; }
|
||||
public string imdbVotes { get; set; }
|
||||
public string imdbID { get; set; }
|
||||
public string Type { get; set; }
|
||||
public string Response { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,11 +28,13 @@ namespace MediaBrowser.Providers.TV
|
|||
internal static TvdbEpisodeProvider Current;
|
||||
private readonly IFileSystem _fileSystem;
|
||||
private readonly IServerConfigurationManager _config;
|
||||
private readonly IHttpClient _httpClient;
|
||||
|
||||
public TvdbEpisodeProvider(IFileSystem fileSystem, IServerConfigurationManager config)
|
||||
public TvdbEpisodeProvider(IFileSystem fileSystem, IServerConfigurationManager config, IHttpClient httpClient)
|
||||
{
|
||||
_fileSystem = fileSystem;
|
||||
_config = config;
|
||||
_httpClient = httpClient;
|
||||
Current = this;
|
||||
}
|
||||
|
||||
|
@ -731,7 +733,12 @@ namespace MediaBrowser.Providers.TV
|
|||
|
||||
public Task<HttpResponseInfo> GetImageResponse(string url, CancellationToken cancellationToken)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
return _httpClient.GetResponse(new HttpRequestOptions
|
||||
{
|
||||
CancellationToken = cancellationToken,
|
||||
Url = url,
|
||||
ResourcePool = TvdbSeriesProvider.Current.TvDbResourcePool
|
||||
});
|
||||
}
|
||||
|
||||
public Task<EpisodeIdentity> FindIdentity(EpisodeInfo info)
|
||||
|
|
|
@ -304,8 +304,6 @@ namespace MediaBrowser.Providers.TV
|
|||
|
||||
private async Task<IEnumerable<RemoteSearchResult>> FindSeriesInternal(string name, CancellationToken cancellationToken)
|
||||
{
|
||||
// TODO: Support returning more data, including image url's for the identify function
|
||||
|
||||
var url = string.Format(RootUrl + SeriesQuery, WebUtility.UrlEncode(name));
|
||||
var doc = new XmlDocument();
|
||||
|
||||
|
@ -330,6 +328,11 @@ namespace MediaBrowser.Providers.TV
|
|||
{
|
||||
foreach (XmlNode node in nodes)
|
||||
{
|
||||
var searchResult = new RemoteSearchResult
|
||||
{
|
||||
SearchProviderName = Name
|
||||
};
|
||||
|
||||
var titles = new List<string>();
|
||||
|
||||
var nameNode = node.SelectSingleNode("./SeriesName");
|
||||
|
@ -345,19 +348,35 @@ namespace MediaBrowser.Providers.TV
|
|||
titles.AddRange(alias);
|
||||
}
|
||||
|
||||
var imdbIdNode = node.SelectSingleNode("./IMDB_ID");
|
||||
if (imdbIdNode != null)
|
||||
{
|
||||
var val = imdbIdNode.InnerText;
|
||||
if (!string.IsNullOrWhiteSpace(val))
|
||||
{
|
||||
searchResult.SetProviderId(MetadataProviders.Imdb, val);
|
||||
}
|
||||
}
|
||||
|
||||
var bannerNode = node.SelectSingleNode("./banner");
|
||||
if (bannerNode != null)
|
||||
{
|
||||
var val = bannerNode.InnerText;
|
||||
if (!string.IsNullOrWhiteSpace(val))
|
||||
{
|
||||
searchResult.ImageUrl = TVUtils.BannerUrl + val;
|
||||
}
|
||||
}
|
||||
|
||||
if (titles.Any(t => string.Equals(t, comparableName, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
var id = node.SelectSingleNode("./seriesid");
|
||||
var id = node.SelectSingleNode("./seriesid") ??
|
||||
node.SelectSingleNode("./id");
|
||||
|
||||
if (id != null)
|
||||
{
|
||||
var searchResult = new RemoteSearchResult
|
||||
{
|
||||
Name = titles.FirstOrDefault(),
|
||||
SearchProviderName = Name
|
||||
};
|
||||
|
||||
searchResult.Name = titles.FirstOrDefault();
|
||||
searchResult.SetProviderId(MetadataProviders.Tvdb, id.InnerText);
|
||||
|
||||
searchResults.Add(searchResult);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -162,8 +162,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||
{
|
||||
SyncJobItemStatus.Converting,
|
||||
SyncJobItemStatus.Queued,
|
||||
SyncJobItemStatus.Transferring,
|
||||
SyncJobItemStatus.Synced
|
||||
SyncJobItemStatus.Transferring
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
"HeaderVideo": "Video",
|
||||
"HeaderPaths": "Paths",
|
||||
"CategorySync": "Sync",
|
||||
"RegisterWithPayPal": "Register with PayPal",
|
||||
"HeaderSyncRequiresSupporterMembership": "Sync Requires a Supporter Membership",
|
||||
"HeaderEnjoyDayTrial": "Enjoy a 14 Day Free Trial",
|
||||
"LabelSyncTempPath": "Temporary file path:",
|
||||
|
|
|
@ -2167,11 +2167,6 @@
|
|||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="dashboard-ui\css\images\supporter\registerpaypal.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="dashboard-ui\css\images\notifications\done.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
|
|
Loading…
Reference in New Issue
Block a user