Add ReadNormalizedString to XmlReaderExtensions

This commit is contained in:
Patrick Barron 2023-10-06 14:53:05 -04:00
parent 99832642ce
commit 8a7a1cc723
8 changed files with 112 additions and 372 deletions

View File

@ -14,6 +14,18 @@ namespace MediaBrowser.Controller.Extensions;
/// </summary> /// </summary>
public static class XmlReaderExtensions public static class XmlReaderExtensions
{ {
/// <summary>
/// Reads a trimmed string from the current node.
/// </summary>
/// <param name="reader">The <see cref="XmlReader"/>.</param>
/// <returns>The trimmed content.</returns>
public static string ReadNormalizedString(this XmlReader reader)
{
ArgumentNullException.ThrowIfNull(reader);
return reader.ReadElementContentAsString().Trim();
}
/// <summary> /// <summary>
/// Parses a <see cref="DateTime"/> from the current node. /// Parses a <see cref="DateTime"/> from the current node.
/// </summary> /// </summary>

View File

@ -137,21 +137,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
break; break;
case "OriginalTitle": case "OriginalTitle":
{ item.OriginalTitle = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrEmpty(val))
{
item.OriginalTitle = val;
}
break; break;
}
case "LocalTitle": case "LocalTitle":
item.Name = reader.ReadElementContentAsString(); item.Name = reader.ReadNormalizedString();
break; break;
case "CriticRating": case "CriticRating":
{ {
var text = reader.ReadElementContentAsString(); var text = reader.ReadElementContentAsString();
@ -165,63 +155,26 @@ namespace MediaBrowser.LocalMetadata.Parsers
} }
case "SortTitle": case "SortTitle":
{ item.ForcedSortName = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
item.ForcedSortName = val;
}
break; break;
}
case "Overview": case "Overview":
case "Description": case "Description":
{ item.Overview = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
item.Overview = val;
}
break; break;
}
case "Language": case "Language":
{ item.PreferredMetadataLanguage = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
item.PreferredMetadataLanguage = val;
break; break;
}
case "CountryCode": case "CountryCode":
{ item.PreferredMetadataCountryCode = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
item.PreferredMetadataCountryCode = val;
break; break;
}
case "PlaceOfBirth": case "PlaceOfBirth":
{ var placeOfBirth = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(placeOfBirth) && item is Person person)
if (!string.IsNullOrWhiteSpace(val))
{ {
if (item is Person person) person.ProductionLocations = new[] { placeOfBirth };
{
person.ProductionLocations = new[] { val };
}
} }
break; break;
}
case "LockedFields": case "LockedFields":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();
@ -263,10 +216,7 @@ namespace MediaBrowser.LocalMetadata.Parsers
{ {
if (!reader.IsEmptyElement) if (!reader.IsEmptyElement)
{ {
using (var subtree = reader.ReadSubtree()) reader.Skip();
{
FetchFromCountriesNode(subtree);
}
} }
else else
{ {
@ -278,29 +228,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
case "ContentRating": case "ContentRating":
case "MPAARating": case "MPAARating":
{ item.OfficialRating = reader.ReadNormalizedString();
var rating = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(rating))
{
item.OfficialRating = rating;
}
break; break;
}
case "CustomRating": case "CustomRating":
{ item.CustomRating = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
item.CustomRating = val;
}
break; break;
}
case "RunningTime": case "RunningTime":
{ {
var text = reader.ReadElementContentAsString(); var text = reader.ReadElementContentAsString();
@ -317,16 +249,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
} }
case "AspectRatio": case "AspectRatio":
{ var aspectRatio = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(aspectRatio) && item is IHasAspectRatio hasAspectRatio)
if (!string.IsNullOrWhiteSpace(val) && item is IHasAspectRatio hasAspectRatio)
{ {
hasAspectRatio.AspectRatio = val; hasAspectRatio.AspectRatio = aspectRatio;
} }
break; break;
}
case "LockData": case "LockData":
{ {
@ -376,32 +305,21 @@ namespace MediaBrowser.LocalMetadata.Parsers
break; break;
case "Trailer": case "Trailer":
{ var trailer = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(trailer))
if (!string.IsNullOrWhiteSpace(val))
{ {
item.AddTrailerUrl(val); item.AddTrailerUrl(trailer);
} }
break; break;
}
case "DisplayOrder": case "DisplayOrder":
{ var displayOrder = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(displayOrder) && item is IHasDisplayOrder hasDisplayOrder)
if (item is IHasDisplayOrder hasDisplayOrder)
{ {
if (!string.IsNullOrWhiteSpace(val)) hasDisplayOrder.DisplayOrder = displayOrder;
{
hasDisplayOrder.DisplayOrder = val;
}
} }
break; break;
}
case "Trailers": case "Trailers":
{ {
if (!reader.IsEmptyElement) if (!reader.IsEmptyElement)
@ -468,8 +386,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
break; break;
case "CollectionNumber": case "CollectionNumber":
var tmdbCollection = reader.ReadElementContentAsString(); var tmdbCollection = reader.ReadNormalizedString();
if (!string.IsNullOrWhiteSpace(tmdbCollection)) if (!string.IsNullOrEmpty(tmdbCollection))
{ {
item.SetProviderId(MetadataProvider.TmdbCollection, tmdbCollection); item.SetProviderId(MetadataProvider.TmdbCollection, tmdbCollection);
} }
@ -672,41 +590,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
item.Shares = list.ToArray(); item.Shares = list.ToArray();
} }
private void FetchFromCountriesNode(XmlReader reader)
{
reader.MoveToContent();
reader.Read();
// Loop through each element
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
{
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Country":
{
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
}
break;
}
default:
reader.Skip();
break;
}
}
else
{
reader.Read();
}
}
}
/// <summary> /// <summary>
/// Fetches from taglines node. /// Fetches from taglines node.
/// </summary> /// </summary>
@ -725,17 +608,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Tagline": case "Tagline":
{ item.Tagline = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(val))
{
item.Tagline = val;
}
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -766,17 +640,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Genre": case "Genre":
{ var genre = reader.ReadNormalizedString();
var genre = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(genre))
if (!string.IsNullOrWhiteSpace(genre))
{ {
item.AddGenre(genre); item.AddGenre(genre);
} }
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -804,17 +674,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Tag": case "Tag":
{ var tag = reader.ReadNormalizedString();
var tag = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(tag))
if (!string.IsNullOrWhiteSpace(tag))
{ {
tags.Add(tag); tags.Add(tag);
} }
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -880,17 +746,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Trailer": case "Trailer":
{ var trailer = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(trailer))
if (!string.IsNullOrWhiteSpace(val))
{ {
item.AddTrailerUrl(val); item.AddTrailerUrl(trailer);
} }
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -921,17 +783,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Studio": case "Studio":
{ var studio = reader.ReadNormalizedString();
var studio = reader.ReadElementContentAsString(); if (!string.IsNullOrEmpty(studio))
if (!string.IsNullOrWhiteSpace(studio))
{ {
item.AddStudio(studio); item.AddStudio(studio);
} }
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -964,17 +822,11 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "Path": case "Path":
{ linkedItem.Path = reader.ReadNormalizedString();
linkedItem.Path = reader.ReadElementContentAsString();
break; break;
}
case "ItemId": case "ItemId":
{ linkedItem.LibraryItemId = reader.ReadNormalizedString();
linkedItem.LibraryItemId = reader.ReadElementContentAsString();
break; break;
}
default: default:
reader.Skip(); reader.Skip();
break; break;
@ -1015,11 +867,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "UserId": case "UserId":
{ item.UserId = reader.ReadNormalizedString();
item.UserId = reader.ReadElementContentAsString();
break; break;
}
case "CanEdit": case "CanEdit":
{ {
item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase); item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
@ -1027,10 +876,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
} }
default: default:
{
reader.Skip(); reader.Skip();
break; break;
}
} }
} }
else else

View File

@ -1,6 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Xml; using System.Xml;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Playlists; using MediaBrowser.Controller.Playlists;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -30,12 +31,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name) switch (reader.Name)
{ {
case "PlaylistMediaType": case "PlaylistMediaType":
{ item.PlaylistMediaType = reader.ReadNormalizedString();
item.PlaylistMediaType = reader.ReadElementContentAsString();
break; break;
}
case "PlaylistItems": case "PlaylistItems":
if (!reader.IsEmptyElement) if (!reader.IsEmptyElement)
@ -94,10 +91,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
} }
default: default:
{
reader.Skip(); reader.Skip();
break; break;
}
} }
} }
else else

View File

@ -276,27 +276,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break; break;
case "originaltitle": case "originaltitle":
{ item.OriginalTitle = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrEmpty(val))
{
item.OriginalTitle = val;
}
break;
}
case "name": case "name":
case "title": case "title":
case "localtitle": case "localtitle":
item.Name = reader.ReadElementContentAsString(); item.Name = reader.ReadNormalizedString();
break; break;
case "sortname": case "sortname":
item.SortName = reader.ReadElementContentAsString(); item.SortName = reader.ReadNormalizedString();
break; break;
case "criticrating": case "criticrating":
{ {
var text = reader.ReadElementContentAsString(); var text = reader.ReadElementContentAsString();
@ -310,40 +299,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "sorttitle": case "sorttitle":
{ item.ForcedSortName = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(val))
{
item.ForcedSortName = val;
}
break;
}
case "biography": case "biography":
case "plot": case "plot":
case "review": case "review":
{ item.Overview = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(val))
{
item.Overview = val;
}
break;
}
case "language": case "language":
{ item.PreferredMetadataLanguage = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
item.PreferredMetadataLanguage = val;
break;
}
case "watched": case "watched":
{ {
var val = reader.ReadElementContentAsBoolean(); var val = reader.ReadElementContentAsBoolean();
@ -386,14 +351,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break; break;
case "countrycode": case "countrycode":
{ item.PreferredMetadataCountryCode = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
item.PreferredMetadataCountryCode = val;
break;
}
case "lockedfields": case "lockedfields":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();
@ -415,9 +374,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "tagline": case "tagline":
item.Tagline = reader.ReadElementContentAsString(); item.Tagline = reader.ReadNormalizedString();
break; break;
case "country": case "country":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();
@ -434,29 +392,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "mpaa": case "mpaa":
{ item.OfficialRating = reader.ReadNormalizedString();
var rating = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(rating))
{
item.OfficialRating = rating;
}
break;
}
case "customrating": case "customrating":
{ item.CustomRating = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(val))
{
item.CustomRating = val;
}
break;
}
case "runtime": case "runtime":
{ {
var text = reader.ReadElementContentAsString(); var text = reader.ReadElementContentAsString();
@ -470,18 +410,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "aspectratio": case "aspectratio":
var aspectRatio = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(aspectRatio) && item is IHasAspectRatio hasAspectRatio)
{ {
var val = reader.ReadElementContentAsString(); hasAspectRatio.AspectRatio = aspectRatio;
if (!string.IsNullOrWhiteSpace(val)
&& item is IHasAspectRatio hasAspectRatio)
{
hasAspectRatio.AspectRatio = val;
}
break;
} }
break;
case "lockdata": case "lockdata":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();
@ -495,17 +430,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "studio": case "studio":
var studio = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(studio))
{ {
var val = reader.ReadElementContentAsString(); item.AddStudio(studio);
if (!string.IsNullOrWhiteSpace(val))
{
item.AddStudio(val);
}
break;
} }
break;
case "director": case "director":
foreach (var director in reader.GetPersonArray(PersonKind.Director)) foreach (var director in reader.GetPersonArray(PersonKind.Director))
{ {
@ -552,31 +483,24 @@ namespace MediaBrowser.XbmcMetadata.Parsers
break; break;
case "trailer": case "trailer":
var trailer = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(trailer))
{ {
var val = reader.ReadElementContentAsString(); item.AddTrailerUrl(trailer.Replace(
"plugin://plugin.video.youtube/?action=play_video&videoid=",
if (!string.IsNullOrWhiteSpace(val)) BaseNfoSaver.YouTubeWatchUrl,
{ StringComparison.OrdinalIgnoreCase));
val = val.Replace("plugin://plugin.video.youtube/?action=play_video&videoid=", BaseNfoSaver.YouTubeWatchUrl, StringComparison.OrdinalIgnoreCase);
item.AddTrailerUrl(val);
}
break;
} }
break;
case "displayorder": case "displayorder":
var displayOrder = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(displayOrder) && item is IHasDisplayOrder hasDisplayOrder)
{ {
var val = reader.ReadElementContentAsString(); hasDisplayOrder.DisplayOrder = displayOrder;
if (item is IHasDisplayOrder hasDisplayOrder && !string.IsNullOrWhiteSpace(val))
{
hasDisplayOrder.DisplayOrder = val;
}
break;
} }
break;
case "year": case "year":
{ {
var val = reader.ReadElementContentAsString(); var val = reader.ReadElementContentAsString();
@ -656,16 +580,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
case "style": case "style":
case "tag": case "tag":
var tag = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(tag))
{ {
var val = reader.ReadElementContentAsString(); item.AddTag(tag);
if (!string.IsNullOrWhiteSpace(val))
{
item.AddTag(val);
}
break;
} }
break;
case "fileinfo": case "fileinfo":
{ {
if (!reader.IsEmptyElement) if (!reader.IsEmptyElement)

View File

@ -5,6 +5,7 @@ using System.Threading;
using System.Xml; using System.Xml;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -237,17 +238,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "showtitle": case "showtitle":
{ item.SeriesName = reader.ReadNormalizedString();
var showtitle = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(showtitle))
{
item.SeriesName = showtitle;
}
break;
}
default: default:
base.FetchDataFromXmlNode(reader, itemResult); base.FetchDataFromXmlNode(reader, itemResult);
break; break;

View File

@ -5,6 +5,7 @@ using System.Xml;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies; using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
@ -113,31 +114,23 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "artist": case "artist":
var artist = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(artist) && item is MusicVideo artistVideo)
{ {
var val = reader.ReadElementContentAsString(); var list = artistVideo.Artists.ToList();
list.Add(artist);
if (!string.IsNullOrWhiteSpace(val) && item is MusicVideo movie) artistVideo.Artists = list.ToArray();
{
var list = movie.Artists.ToList();
list.Add(val);
movie.Artists = list.ToArray();
}
break;
} }
break;
case "album": case "album":
var album = reader.ReadNormalizedString();
if (!string.IsNullOrEmpty(album) && item is MusicVideo albumVideo)
{ {
var val = reader.ReadElementContentAsString(); albumVideo.Album = album;
if (!string.IsNullOrWhiteSpace(val) && item is MusicVideo movie)
{
movie.Album = val;
}
break;
} }
break;
default: default:
base.FetchDataFromXmlNode(reader, itemResult); base.FetchDataFromXmlNode(reader, itemResult);
break; break;

View File

@ -2,6 +2,7 @@ using System.Globalization;
using System.Xml; using System.Xml;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -56,17 +57,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "seasonname": case "seasonname":
{ item.Name = reader.ReadNormalizedString();
var name = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(name))
{
item.Name = name;
}
break;
}
default: default:
base.FetchDataFromXmlNode(reader, itemResult); base.FetchDataFromXmlNode(reader, itemResult);
break; break;

View File

@ -1,9 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Xml; using System.Xml;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Extensions;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers; using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
@ -76,23 +76,11 @@ namespace MediaBrowser.XbmcMetadata.Parsers
} }
case "airs_dayofweek": case "airs_dayofweek":
{ item.AirDays = TVUtils.GetAirDays(reader.ReadElementContentAsString());
item.AirDays = TVUtils.GetAirDays(reader.ReadElementContentAsString()); break;
break;
}
case "airs_time": case "airs_time":
{ item.AirTime = reader.ReadNormalizedString();
var val = reader.ReadElementContentAsString(); break;
if (!string.IsNullOrWhiteSpace(val))
{
item.AirTime = val;
}
break;
}
case "status": case "status":
{ {
var status = reader.ReadElementContentAsString(); var status = reader.ReadElementContentAsString();