mirror of https://github.com/jellyfin/jellyfin.git
Prioritize metadata merging by preferred language
This commit is contained in:
parent
0c95297269
commit
896cc59936
|
@ -13,13 +13,14 @@ namespace MediaBrowser.Controller.Providers
|
|||
public MetadataResult()
|
||||
{
|
||||
Images = new List<LocalImageInfo>();
|
||||
ResultLanguage = "en";
|
||||
}
|
||||
|
||||
public List<PersonInfo> People { get; set; }
|
||||
|
||||
public bool HasMetadata { get; set; }
|
||||
public T Item { get; set; }
|
||||
|
||||
public string ResultLanguage { get; set; }
|
||||
public void AddPerson(PersonInfo p)
|
||||
{
|
||||
if (People == null)
|
||||
|
|
|
@ -646,6 +646,8 @@ namespace MediaBrowser.Providers.Manager
|
|||
{
|
||||
var refreshResult = new RefreshResult();
|
||||
|
||||
var results = new List<MetadataResult<TItemType>>();
|
||||
|
||||
foreach (var provider in providers)
|
||||
{
|
||||
var providerName = provider.GetType().Name;
|
||||
|
@ -662,7 +664,7 @@ namespace MediaBrowser.Providers.Manager
|
|||
|
||||
if (result.HasMetadata)
|
||||
{
|
||||
MergeData(result, temp, new List<MetadataFields>(), false, false);
|
||||
results.Add(result);
|
||||
|
||||
refreshResult.UpdateType = refreshResult.UpdateType | ItemUpdateType.MetadataDownload;
|
||||
}
|
||||
|
@ -683,6 +685,38 @@ namespace MediaBrowser.Providers.Manager
|
|||
}
|
||||
}
|
||||
|
||||
var orderedResults = new List<MetadataResult<TItemType>>();
|
||||
|
||||
if (string.IsNullOrEmpty(id.MetadataLanguage))
|
||||
{
|
||||
orderedResults.AddRange(results);
|
||||
}
|
||||
else
|
||||
{
|
||||
// prioritize results with matching ResultLanguage
|
||||
foreach (var result in results)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(result.ResultLanguage) && result.ResultLanguage == id.MetadataLanguage)
|
||||
{
|
||||
orderedResults.Add(result);
|
||||
}
|
||||
}
|
||||
|
||||
// add all other results
|
||||
foreach (var result in results)
|
||||
{
|
||||
if (!orderedResults.Contains(result))
|
||||
{
|
||||
orderedResults.Add(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var result in results)
|
||||
{
|
||||
MergeData(result, temp, new List<MetadataFields>(), false, false);
|
||||
}
|
||||
|
||||
return refreshResult;
|
||||
}
|
||||
|
||||
|
|
|
@ -92,6 +92,12 @@ namespace MediaBrowser.Providers.TV
|
|||
|
||||
result.HasMetadata = true;
|
||||
|
||||
if (!string.IsNullOrEmpty(response.overview))
|
||||
{
|
||||
// if overview is non-empty, we can assume that localized data was returned
|
||||
result.ResultLanguage = info.MetadataLanguage;
|
||||
}
|
||||
|
||||
var item = new Episode();
|
||||
result.Item = item;
|
||||
|
||||
|
|
|
@ -168,7 +168,7 @@ namespace MediaBrowser.Providers.TV
|
|||
{
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
result.Item = await FetchSeriesData(tmdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false);
|
||||
result = await FetchMovieData(tmdbId, info.MetadataLanguage, info.MetadataCountryCode, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
result.HasMetadata = result.Item != null;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ namespace MediaBrowser.Providers.TV
|
|||
return result;
|
||||
}
|
||||
|
||||
private async Task<Series> FetchSeriesData(string tmdbId, string language, string preferredCountryCode, CancellationToken cancellationToken)
|
||||
private async Task<MetadataResult<Series>> FetchMovieData(string tmdbId, string language, string preferredCountryCode, CancellationToken cancellationToken)
|
||||
{
|
||||
string dataFilePath = null;
|
||||
RootObject seriesInfo = null;
|
||||
|
@ -199,11 +199,13 @@ namespace MediaBrowser.Providers.TV
|
|||
|
||||
await EnsureSeriesInfo(tmdbId, language, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
var item = new Series();
|
||||
var result = new MetadataResult<Series>();
|
||||
result.Item = new Series();
|
||||
result.ResultLanguage = seriesInfo.ResultLanguage;
|
||||
|
||||
ProcessMainInfo(item, seriesInfo, preferredCountryCode);
|
||||
ProcessMainInfo(result.Item, seriesInfo, preferredCountryCode);
|
||||
|
||||
return item;
|
||||
return result;
|
||||
}
|
||||
|
||||
private void ProcessMainInfo(Series series, RootObject seriesInfo, string preferredCountryCode)
|
||||
|
@ -354,6 +356,11 @@ namespace MediaBrowser.Providers.TV
|
|||
}).ConfigureAwait(false))
|
||||
{
|
||||
mainResult = _jsonSerializer.DeserializeFromStream<RootObject>(json);
|
||||
|
||||
if (!string.IsNullOrEmpty(language))
|
||||
{
|
||||
mainResult.ResultLanguage = language;
|
||||
}
|
||||
}
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
@ -385,6 +392,7 @@ namespace MediaBrowser.Providers.TV
|
|||
var englishResult = _jsonSerializer.DeserializeFromStream<RootObject>(json);
|
||||
|
||||
mainResult.overview = englishResult.overview;
|
||||
mainResult.ResultLanguage = "en";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -627,6 +635,7 @@ namespace MediaBrowser.Providers.TV
|
|||
public ExternalIds external_ids { get; set; }
|
||||
public Videos videos { get; set; }
|
||||
public ContentRatings content_ratings { get; set; }
|
||||
public string ResultLanguage { get; set; }
|
||||
}
|
||||
|
||||
public int Order
|
||||
|
|
|
@ -713,6 +713,17 @@ namespace MediaBrowser.Providers.TV
|
|||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case "Language":
|
||||
{
|
||||
var val = reader.ReadElementContentAsString();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(val))
|
||||
{
|
||||
result.ResultLanguage = val;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ namespace MediaBrowser.Providers.TV
|
|||
var seriesXmlPath = GetSeriesXmlPath(seriesProviderIds, metadataLanguage);
|
||||
var actorsXmlPath = Path.Combine(seriesDataPath, "actors.xml");
|
||||
|
||||
FetchSeriesInfo(series, seriesXmlPath, cancellationToken);
|
||||
FetchSeriesInfo(result, seriesXmlPath, cancellationToken);
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
|
@ -607,7 +607,7 @@ namespace MediaBrowser.Providers.TV
|
|||
return name.Trim();
|
||||
}
|
||||
|
||||
private void FetchSeriesInfo(Series item, string seriesXmlPath, CancellationToken cancellationToken)
|
||||
private void FetchSeriesInfo(MetadataResult<Series> result, string seriesXmlPath, CancellationToken cancellationToken)
|
||||
{
|
||||
var settings = new XmlReaderSettings
|
||||
{
|
||||
|
@ -639,7 +639,7 @@ namespace MediaBrowser.Providers.TV
|
|||
{
|
||||
using (var subtree = reader.ReadSubtree())
|
||||
{
|
||||
FetchDataFromSeriesNode(item, subtree, cancellationToken);
|
||||
FetchDataFromSeriesNode(result, subtree, cancellationToken);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -667,9 +667,9 @@ namespace MediaBrowser.Providers.TV
|
|||
}
|
||||
}
|
||||
|
||||
if (item.Status.HasValue && item.Status.Value == SeriesStatus.Ended && episiodeAirDates.Count > 0)
|
||||
if (result.Item.Status.HasValue && result.Item.Status.Value == SeriesStatus.Ended && episiodeAirDates.Count > 0)
|
||||
{
|
||||
item.EndDate = episiodeAirDates.Max();
|
||||
result.Item.EndDate = episiodeAirDates.Max();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -861,8 +861,10 @@ namespace MediaBrowser.Providers.TV
|
|||
}
|
||||
}
|
||||
|
||||
private void FetchDataFromSeriesNode(Series item, XmlReader reader, CancellationToken cancellationToken)
|
||||
private void FetchDataFromSeriesNode(MetadataResult<Series> result, XmlReader reader, CancellationToken cancellationToken)
|
||||
{
|
||||
Series item = result.Item;
|
||||
|
||||
reader.MoveToContent();
|
||||
|
||||
// Loop through each element
|
||||
|
@ -886,6 +888,12 @@ namespace MediaBrowser.Providers.TV
|
|||
break;
|
||||
}
|
||||
|
||||
case "Language":
|
||||
{
|
||||
result.ResultLanguage = (reader.ReadElementContentAsString() ?? string.Empty).Trim();
|
||||
break;
|
||||
}
|
||||
|
||||
case "Airs_DayOfWeek":
|
||||
{
|
||||
var val = reader.ReadElementContentAsString();
|
||||
|
|
Loading…
Reference in New Issue