|
|
|
@ -14,24 +14,21 @@ using Microsoft.Extensions.Logging;
|
|
|
|
|
namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Provides a base class for parsing metadata xml
|
|
|
|
|
/// Provides a base class for parsing metadata xml.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
/// <typeparam name="T">Type of item xml parser.</typeparam>
|
|
|
|
|
public class BaseItemXmlParser<T>
|
|
|
|
|
where T : BaseItem
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The logger
|
|
|
|
|
/// </summary>
|
|
|
|
|
protected ILogger<BaseItemXmlParser<T>> Logger { get; private set; }
|
|
|
|
|
protected IProviderManager ProviderManager { get; private set; }
|
|
|
|
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
|
|
|
|
|
|
|
|
|
private Dictionary<string, string> _validProviderIds;
|
|
|
|
|
private Dictionary<string, string>? _validProviderIds;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Initializes a new instance of the <see cref="BaseItemXmlParser{T}" /> class.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="logger">The logger.</param>
|
|
|
|
|
/// <param name="logger">Instance of the <see cref="ILogger{BaseItemXmlParser}"/> interface.</param>
|
|
|
|
|
/// <param name="providerManager">Instance of the <see cref="IProviderManager"/> interface.</param>
|
|
|
|
|
public BaseItemXmlParser(ILogger<BaseItemXmlParser<T>> logger, IProviderManager providerManager)
|
|
|
|
|
{
|
|
|
|
|
Logger = logger;
|
|
|
|
@ -39,12 +36,22 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Fetches metadata for an item from one xml file
|
|
|
|
|
/// Gets the logger.
|
|
|
|
|
/// </summary>
|
|
|
|
|
protected ILogger<BaseItemXmlParser<T>> Logger { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the provider manager.
|
|
|
|
|
/// </summary>
|
|
|
|
|
protected IProviderManager ProviderManager { get; private set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Fetches metadata for an item from one xml file.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">The item.</param>
|
|
|
|
|
/// <param name="metadataFile">The metadata file.</param>
|
|
|
|
|
/// <param name="cancellationToken">The cancellation token.</param>
|
|
|
|
|
/// <exception cref="ArgumentNullException"></exception>
|
|
|
|
|
/// <exception cref="ArgumentNullException">Item is null.</exception>
|
|
|
|
|
public void Fetch(MetadataResult<T> item, string metadataFile, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (item == null)
|
|
|
|
@ -57,7 +64,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
throw new ArgumentException("The metadata file was empty or null.", nameof(metadataFile));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var settings = new XmlReaderSettings()
|
|
|
|
|
var settings = new XmlReaderSettings
|
|
|
|
|
{
|
|
|
|
|
ValidationType = ValidationType.None,
|
|
|
|
|
CheckCharacters = false,
|
|
|
|
@ -78,10 +85,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Additional Mappings
|
|
|
|
|
// Additional Mappings
|
|
|
|
|
_validProviderIds.Add("IMDB", "Imdb");
|
|
|
|
|
|
|
|
|
|
//Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken);
|
|
|
|
|
// Fetch(item, metadataFile, settings, Encoding.GetEncoding("ISO-8859-1"), cancellationToken);
|
|
|
|
|
Fetch(item, metadataFile, settings, Encoding.UTF8, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -97,10 +104,9 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.ResetPeople();
|
|
|
|
|
|
|
|
|
|
using (var fileStream = File.OpenRead(metadataFile))
|
|
|
|
|
using (var streamReader = new StreamReader(fileStream, encoding))
|
|
|
|
|
using (var reader = XmlReader.Create(streamReader, settings))
|
|
|
|
|
{
|
|
|
|
|
using var fileStream = File.OpenRead(metadataFile);
|
|
|
|
|
using var streamReader = new StreamReader(fileStream, encoding);
|
|
|
|
|
using var reader = XmlReader.Create(streamReader, settings);
|
|
|
|
|
reader.MoveToContent();
|
|
|
|
|
reader.Read();
|
|
|
|
|
|
|
|
|
@ -119,12 +125,9 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Fetches metadata from one Xml Element
|
|
|
|
|
/// Fetches metadata from one Xml Element.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="reader">The reader.</param>
|
|
|
|
|
/// <param name="itemResult">The item result.</param>
|
|
|
|
@ -150,6 +153,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
Logger.LogWarning("Invalid Added value found: " + val);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -161,6 +165,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.OriginalTitle = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -191,6 +196,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.ForcedSortName = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -231,10 +237,9 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
|
{
|
|
|
|
|
var person = item as Person;
|
|
|
|
|
if (person != null)
|
|
|
|
|
if (item is Person person)
|
|
|
|
|
{
|
|
|
|
|
person.ProductionLocations = new string[] { val };
|
|
|
|
|
person.ProductionLocations = new[] { val };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -255,8 +260,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
}).Where(i => i.HasValue).Select(i => i.Value).ToArray();
|
|
|
|
|
}).Where(i => i.HasValue).Select(i => i!.Value).ToArray();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
@ -275,6 +279,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -284,13 +289,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
FetchFromCountriesNode(subtree, item);
|
|
|
|
|
FetchFromCountriesNode(subtree);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -303,6 +309,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.OfficialRating = rating;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -314,6 +321,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.CustomRating = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -328,6 +336,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -340,6 +349,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
hasAspectRatio.AspectRatio = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -351,6 +361,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -362,8 +373,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item.AddStudio(name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -375,10 +388,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
itemResult.AddPerson(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "Writer":
|
|
|
|
|
{
|
|
|
|
|
foreach (var p in SplitNames(reader.ReadElementContentAsString()).Select(v => new PersonInfo { Name = v.Trim(), Type = PersonType.Writer }))
|
|
|
|
@ -387,21 +403,23 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
itemResult.AddPerson(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "Actors":
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var actors = reader.ReadInnerXml();
|
|
|
|
|
|
|
|
|
|
if (actors.Contains("<"))
|
|
|
|
|
if (actors.Contains("<", StringComparison.Ordinal))
|
|
|
|
|
{
|
|
|
|
|
// This is one of the mis-named "Actors" full nodes created by MB2
|
|
|
|
|
// Create a reader and pass it to the persons node processor
|
|
|
|
|
FetchDataFromPersonsNode(XmlReader.Create(new StringReader("<Persons>" + actors + "</Persons>")), itemResult);
|
|
|
|
|
using var xmlReader = XmlReader.Create(new StringReader($"<Persons>{actors}</Persons>"));
|
|
|
|
|
FetchDataFromPersonsNode(xmlReader, itemResult);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -412,9 +430,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
itemResult.AddPerson(p);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -426,8 +446,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
itemResult.AddPerson(p);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -439,6 +461,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.AddTrailerUrl(val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -454,6 +477,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
hasDisplayOrder.DisplayOrder = val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -461,15 +485,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
FetchDataFromTrailersNode(subtree, item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -491,7 +514,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
case "Rating":
|
|
|
|
|
case "IMDBrating":
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var rating = reader.ReadElementContentAsString();
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(rating))
|
|
|
|
@ -502,6 +524,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
item.CommunityRating = val;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -545,21 +568,21 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.SetProviderId(MetadataProvider.TmdbCollection, tmdbCollection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case "Genres":
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
FetchFromGenresNode(subtree, item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -567,15 +590,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
FetchFromTagsNode(subtree, item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -583,15 +605,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
FetchDataFromPersonsNode(subtree, itemResult);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -599,15 +620,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
FetchFromStudiosNode(subtree, item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -615,19 +635,17 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
if (!reader.IsEmptyElement)
|
|
|
|
|
{
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
var hasShares = item as IHasShares;
|
|
|
|
|
if (hasShares != null)
|
|
|
|
|
using var subtree = reader.ReadSubtree();
|
|
|
|
|
if (item is IHasShares hasShares)
|
|
|
|
|
{
|
|
|
|
|
FetchFromSharesNode(subtree, hasShares);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
reader.Read();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -635,9 +653,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
|
|
|
|
|
|
var video = item as Video;
|
|
|
|
|
|
|
|
|
|
if (video != null)
|
|
|
|
|
if (item is Video video)
|
|
|
|
|
{
|
|
|
|
|
if (string.Equals("HSBS", val, StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
@ -660,13 +676,14 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
video.Video3DFormat = Video3DFormat.MVC;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
string readerName = reader.Name;
|
|
|
|
|
if (_validProviderIds.TryGetValue(readerName, out string providerIdValue))
|
|
|
|
|
if (_validProviderIds!.TryGetValue(readerName, out string providerIdValue))
|
|
|
|
|
{
|
|
|
|
|
var id = reader.ReadElementContentAsString();
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(id))
|
|
|
|
@ -680,10 +697,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void FetchFromSharesNode(XmlReader reader, IHasShares item)
|
|
|
|
|
{
|
|
|
|
|
var list = new List<Share>();
|
|
|
|
@ -718,6 +735,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
reader.Skip();
|
|
|
|
@ -756,7 +774,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
|
|
|
|
|
case "CanEdit":
|
|
|
|
|
{
|
|
|
|
|
share.CanEdit = string.Equals(reader.ReadElementContentAsString(), true.ToString(), StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
share.CanEdit = string.Equals(reader.ReadElementContentAsString(), true.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -774,7 +792,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
return share;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void FetchFromCountriesNode(XmlReader reader, T item)
|
|
|
|
|
private void FetchFromCountriesNode(XmlReader reader)
|
|
|
|
|
{
|
|
|
|
|
reader.MoveToContent();
|
|
|
|
|
reader.Read();
|
|
|
|
@ -793,6 +811,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(val))
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -833,8 +852,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.Tagline = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
reader.Skip();
|
|
|
|
|
break;
|
|
|
|
@ -872,6 +893,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.AddGenre(genre);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -909,6 +931,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
tags.Add(tag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -951,6 +974,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
reader.Read();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var subtree = reader.ReadSubtree())
|
|
|
|
|
{
|
|
|
|
|
foreach (var person in GetPersonsFromXmlNode(subtree))
|
|
|
|
@ -959,9 +983,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item.AddPerson(person);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -997,6 +1023,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.AddTrailerUrl(val);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1037,6 +1064,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
item.AddStudio(studio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1086,6 +1114,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
type = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1097,8 +1126,10 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
role = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "SortOrder":
|
|
|
|
|
{
|
|
|
|
|
var val = reader.ReadElementContentAsString();
|
|
|
|
@ -1110,6 +1141,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
sortOrder = intVal;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1124,23 +1156,19 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var personInfo = new PersonInfo
|
|
|
|
|
{
|
|
|
|
|
Name = name.Trim(),
|
|
|
|
|
Role = role,
|
|
|
|
|
Type = type,
|
|
|
|
|
SortOrder = sortOrder
|
|
|
|
|
};
|
|
|
|
|
var personInfo = new PersonInfo { Name = name.Trim(), Role = role, Type = type, SortOrder = sortOrder };
|
|
|
|
|
|
|
|
|
|
return new[] { personInfo };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected LinkedChild GetLinkedChild(XmlReader reader)
|
|
|
|
|
{
|
|
|
|
|
var linkedItem = new LinkedChild
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get linked child.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="reader">The xml reader.</param>
|
|
|
|
|
/// <returns>The linked child.</returns>
|
|
|
|
|
protected LinkedChild? GetLinkedChild(XmlReader reader)
|
|
|
|
|
{
|
|
|
|
|
Type = LinkedChildType.Manual
|
|
|
|
|
};
|
|
|
|
|
var linkedItem = new LinkedChild { Type = LinkedChildType.Manual };
|
|
|
|
|
|
|
|
|
|
reader.MoveToContent();
|
|
|
|
|
reader.Read();
|
|
|
|
@ -1157,6 +1185,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
linkedItem.Path = reader.ReadElementContentAsString();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case "ItemId":
|
|
|
|
|
{
|
|
|
|
|
linkedItem.LibraryItemId = reader.ReadElementContentAsString();
|
|
|
|
@ -1183,7 +1212,12 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected Share GetShare(XmlReader reader)
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Get share.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="reader">The xml reader.</param>
|
|
|
|
|
/// <returns>The share.</returns>
|
|
|
|
|
protected Share? GetShare(XmlReader reader)
|
|
|
|
|
{
|
|
|
|
|
var item = new Share();
|
|
|
|
|
|
|
|
|
@ -1208,6 +1242,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
{
|
|
|
|
|
reader.Skip();
|
|
|
|
@ -1230,19 +1265,19 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Used to split names of comma or pipe delimeted genres and people
|
|
|
|
|
/// Used to split names of comma or pipe delimited genres and people.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="value">The value.</param>
|
|
|
|
|
/// <returns>IEnumerable{System.String}.</returns>
|
|
|
|
|
private IEnumerable<string> SplitNames(string value)
|
|
|
|
|
{
|
|
|
|
|
value = value ?? string.Empty;
|
|
|
|
|
value ??= string.Empty;
|
|
|
|
|
|
|
|
|
|
// Only split by comma if there is no pipe in the string
|
|
|
|
|
// We have to be careful to not split names like Matthew, Jr.
|
|
|
|
|
var separator = value.IndexOf('|') == -1 && value.IndexOf(';') == -1 ? new[] { ',' } : new[] { '|', ';' };
|
|
|
|
|
var separator = value.IndexOf('|', StringComparison.Ordinal) == -1
|
|
|
|
|
&& value.IndexOf(';', StringComparison.Ordinal) == -1 ? new[] { ',' } : new[] { '|', ';' };
|
|
|
|
|
|
|
|
|
|
value = value.Trim().Trim(separator);
|
|
|
|
|
|
|
|
|
@ -1250,7 +1285,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Provides an additional overload for string.split
|
|
|
|
|
/// Provides an additional overload for string.split.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="val">The val.</param>
|
|
|
|
|
/// <param name="separators">The separators.</param>
|
|
|
|
@ -1260,6 +1295,5 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|
|
|
|
{
|
|
|
|
|
return val.Split(separators, options);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|