|
|
@ -63,97 +63,89 @@ namespace MediaBrowser.Providers.TV
|
|
|
|
var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, series.ProviderIds);
|
|
|
|
var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, series.ProviderIds);
|
|
|
|
var indexOffset = TvdbSeriesProvider.GetSeriesOffset(series.ProviderIds) ?? 0;
|
|
|
|
var indexOffset = TvdbSeriesProvider.GetSeriesOffset(series.ProviderIds) ?? 0;
|
|
|
|
|
|
|
|
|
|
|
|
var files = TvdbEpisodeProvider.Current.GetEpisodeXmlFiles(episode.ParentIndexNumber + indexOffset, episode.IndexNumber, episode.IndexNumberEnd, seriesDataPath);
|
|
|
|
var nodes = TvdbEpisodeProvider.Current.GetEpisodeXmlNodes(seriesDataPath, episode.GetLookupInfo());
|
|
|
|
|
|
|
|
|
|
|
|
var result = files.Select(i => GetImageInfo(i, cancellationToken))
|
|
|
|
var result = nodes.Select(i => GetImageInfo(i, cancellationToken))
|
|
|
|
.Where(i => i != null);
|
|
|
|
.Where(i => i != null)
|
|
|
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
|
|
return Task.FromResult(result);
|
|
|
|
return Task.FromResult<IEnumerable<RemoteImageInfo>>(result);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Task.FromResult<IEnumerable<RemoteImageInfo>>(new RemoteImageInfo[] { });
|
|
|
|
return Task.FromResult<IEnumerable<RemoteImageInfo>>(new RemoteImageInfo[] { });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private RemoteImageInfo GetImageInfo(FileSystemMetadata xmlFile, CancellationToken cancellationToken)
|
|
|
|
private RemoteImageInfo GetImageInfo(XmlReader reader, CancellationToken cancellationToken)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var height = 225;
|
|
|
|
var height = 225;
|
|
|
|
var width = 400;
|
|
|
|
var width = 400;
|
|
|
|
var url = string.Empty;
|
|
|
|
var url = string.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
using (var streamReader = new StreamReader(xmlFile.FullName, Encoding.UTF8))
|
|
|
|
// Use XmlReader for best performance
|
|
|
|
{
|
|
|
|
using (reader)
|
|
|
|
// Use XmlReader for best performance
|
|
|
|
{
|
|
|
|
using (var reader = XmlReader.Create(streamReader, new XmlReaderSettings
|
|
|
|
reader.MoveToContent();
|
|
|
|
{
|
|
|
|
|
|
|
|
CheckCharacters = false,
|
|
|
|
// Loop through each element
|
|
|
|
IgnoreProcessingInstructions = true,
|
|
|
|
while (reader.Read())
|
|
|
|
IgnoreComments = true,
|
|
|
|
{
|
|
|
|
ValidationType = ValidationType.None
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
}))
|
|
|
|
|
|
|
|
{
|
|
|
|
if (reader.NodeType == XmlNodeType.Element)
|
|
|
|
reader.MoveToContent();
|
|
|
|
{
|
|
|
|
|
|
|
|
switch (reader.Name)
|
|
|
|
// Loop through each element
|
|
|
|
{
|
|
|
|
while (reader.Read())
|
|
|
|
case "thumb_width":
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
|
|
|
|
|
|
|
|
if (reader.NodeType == XmlNodeType.Element)
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
switch (reader.Name)
|
|
|
|
int rval;
|
|
|
|
{
|
|
|
|
|
|
|
|
case "thumb_width":
|
|
|
|
// int.TryParse is local aware, so it can be probamatic, force us culture
|
|
|
|
{
|
|
|
|
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
{
|
|
|
|
|
|
|
|
width = rval;
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
int rval;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
// int.TryParse is local aware, so it can be probamatic, force us culture
|
|
|
|
|
|
|
|
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
|
|
|
|
case "thumb_height":
|
|
|
|
{
|
|
|
|
{
|
|
|
|
width = rval;
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
break;
|
|
|
|
{
|
|
|
|
}
|
|
|
|
int rval;
|
|
|
|
|
|
|
|
|
|
|
|
case "thumb_height":
|
|
|
|
// int.TryParse is local aware, so it can be probamatic, force us culture
|
|
|
|
{
|
|
|
|
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
{
|
|
|
|
|
|
|
|
height = rval;
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
}
|
|
|
|
{
|
|
|
|
}
|
|
|
|
int rval;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
// int.TryParse is local aware, so it can be probamatic, force us culture
|
|
|
|
|
|
|
|
if (int.TryParse(val, NumberStyles.Integer, _usCulture, out rval))
|
|
|
|
case "filename":
|
|
|
|
{
|
|
|
|
{
|
|
|
|
height = rval;
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
}
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
url = TVUtils.BannerUrl + val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
case "filename":
|
|
|
|
}
|
|
|
|
{
|
|
|
|
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
default:
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
reader.Skip();
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
url = TVUtils.BannerUrl + val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
reader.Skip();
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(url))
|
|
|
|
if (string.IsNullOrEmpty(url))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -205,11 +197,9 @@ namespace MediaBrowser.Providers.TV
|
|
|
|
if (series != null && TvdbSeriesProvider.IsValidSeries(series.ProviderIds))
|
|
|
|
if (series != null && TvdbSeriesProvider.IsValidSeries(series.ProviderIds))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// Process images
|
|
|
|
// Process images
|
|
|
|
var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, series.ProviderIds);
|
|
|
|
var seriesXmlPath = TvdbSeriesProvider.Current.GetSeriesXmlPath(series.ProviderIds, series.GetPreferredMetadataLanguage());
|
|
|
|
|
|
|
|
|
|
|
|
var files = TvdbEpisodeProvider.Current.GetEpisodeXmlFiles(episode.ParentIndexNumber, episode.IndexNumber, episode.IndexNumberEnd, seriesDataPath);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return files.Any(i => _fileSystem.GetLastWriteTimeUtc(i) > date);
|
|
|
|
return _fileSystem.GetLastWriteTimeUtc(seriesXmlPath) > date;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|