mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-06-01 04:34:26 -04:00
More miscellaneous cleanup
This commit is contained in:
parent
0e51ffa169
commit
1d0ecd3188
@ -253,17 +253,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case "LockData":
|
case "LockData":
|
||||||
{
|
item.IsLocked = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
|
||||||
var val = reader.ReadElementContentAsString();
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(val))
|
|
||||||
{
|
|
||||||
item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case "Network":
|
case "Network":
|
||||||
foreach (var name in reader.GetStringArray())
|
foreach (var name in reader.GetStringArray())
|
||||||
{
|
{
|
||||||
@ -857,11 +848,8 @@ namespace MediaBrowser.LocalMetadata.Parsers
|
|||||||
item.UserId = reader.ReadNormalizedString();
|
item.UserId = reader.ReadNormalizedString();
|
||||||
break;
|
break;
|
||||||
case "CanEdit":
|
case "CanEdit":
|
||||||
{
|
|
||||||
item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
|
item.CanEdit = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
reader.Skip();
|
reader.Skip();
|
||||||
break;
|
break;
|
||||||
|
@ -262,9 +262,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> itemResult)
|
protected virtual void FetchDataFromXmlNode(XmlReader reader, MetadataResult<T> itemResult)
|
||||||
{
|
{
|
||||||
var item = itemResult.Item;
|
var item = itemResult.Item;
|
||||||
|
|
||||||
var nfoConfiguration = _config.GetNfoConfiguration();
|
var nfoConfiguration = _config.GetNfoConfiguration();
|
||||||
UserItemData? userData = null;
|
UserItemData? userData;
|
||||||
|
|
||||||
switch (reader.Name)
|
switch (reader.Name)
|
||||||
{
|
{
|
||||||
@ -287,17 +286,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
item.SortName = reader.ReadNormalizedString();
|
item.SortName = reader.ReadNormalizedString();
|
||||||
break;
|
break;
|
||||||
case "criticrating":
|
case "criticrating":
|
||||||
|
var criticRatingText = reader.ReadElementContentAsString();
|
||||||
|
if (float.TryParse(criticRatingText, CultureInfo.InvariantCulture, out var value))
|
||||||
{
|
{
|
||||||
var text = reader.ReadElementContentAsString();
|
item.CriticRating = value;
|
||||||
|
|
||||||
if (float.TryParse(text, CultureInfo.InvariantCulture, out var value))
|
|
||||||
{
|
|
||||||
item.CriticRating = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
case "sorttitle":
|
case "sorttitle":
|
||||||
item.ForcedSortName = reader.ReadNormalizedString();
|
item.ForcedSortName = reader.ReadNormalizedString();
|
||||||
break;
|
break;
|
||||||
@ -310,20 +305,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
item.PreferredMetadataLanguage = reader.ReadNormalizedString();
|
item.PreferredMetadataLanguage = reader.ReadNormalizedString();
|
||||||
break;
|
break;
|
||||||
case "watched":
|
case "watched":
|
||||||
|
var played = reader.ReadElementContentAsBoolean();
|
||||||
|
if (!string.IsNullOrWhiteSpace(nfoConfiguration.UserId))
|
||||||
{
|
{
|
||||||
var val = reader.ReadElementContentAsBoolean();
|
var user = _userManager.GetUserById(Guid.Parse(nfoConfiguration.UserId));
|
||||||
|
userData = _userDataManager.GetUserData(user, item);
|
||||||
if (!string.IsNullOrWhiteSpace(nfoConfiguration.UserId))
|
userData.Played = played;
|
||||||
{
|
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
||||||
var user = _userManager.GetUserById(Guid.Parse(nfoConfiguration.UserId));
|
|
||||||
userData = _userDataManager.GetUserData(user, item);
|
|
||||||
userData.Played = val;
|
|
||||||
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
case "playcount":
|
case "playcount":
|
||||||
if (reader.TryReadInt(out var count)
|
if (reader.TryReadInt(out var count)
|
||||||
&& Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
|
&& Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
|
||||||
@ -410,17 +401,8 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case "lockdata":
|
case "lockdata":
|
||||||
{
|
item.IsLocked = string.Equals(reader.ReadElementContentAsString(), "true", StringComparison.OrdinalIgnoreCase);
|
||||||
var val = reader.ReadElementContentAsString();
|
break;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(val))
|
|
||||||
{
|
|
||||||
item.IsLocked = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "studio":
|
case "studio":
|
||||||
var studio = reader.ReadNormalizedString();
|
var studio = reader.ReadNormalizedString();
|
||||||
if (!string.IsNullOrEmpty(studio))
|
if (!string.IsNullOrEmpty(studio))
|
||||||
@ -501,33 +483,17 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case "rating":
|
case "rating":
|
||||||
|
var rating = reader.ReadElementContentAsString().Replace(',', '.');
|
||||||
|
// All external meta is saving this as '.' for decimal I believe...but just to be sure
|
||||||
|
if (float.TryParse(rating, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var communityRating))
|
||||||
{
|
{
|
||||||
var rating = reader.ReadElementContentAsString();
|
item.CommunityRating = communityRating;
|
||||||
|
|
||||||
// All external meta is saving this as '.' for decimal I believe...but just to be sure
|
|
||||||
if (float.TryParse(rating.Replace(',', '.'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var val))
|
|
||||||
{
|
|
||||||
item.CommunityRating = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
case "ratings":
|
case "ratings":
|
||||||
{
|
FetchFromRatingsNode(reader, item);
|
||||||
if (!reader.IsEmptyElement)
|
break;
|
||||||
{
|
|
||||||
using var subtree = reader.ReadSubtree();
|
|
||||||
FetchFromRatingsNode(subtree, item);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "aired":
|
case "aired":
|
||||||
case "formed":
|
case "formed":
|
||||||
case "premiered":
|
case "premiered":
|
||||||
@ -575,46 +541,26 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case "fileinfo":
|
case "fileinfo":
|
||||||
{
|
FetchFromFileInfoNode(reader, item);
|
||||||
if (!reader.IsEmptyElement)
|
break;
|
||||||
{
|
|
||||||
using (var subtree = reader.ReadSubtree())
|
|
||||||
{
|
|
||||||
FetchFromFileInfoNode(subtree, item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "uniqueid":
|
case "uniqueid":
|
||||||
|
if (reader.IsEmptyElement)
|
||||||
{
|
{
|
||||||
if (reader.IsEmptyElement)
|
reader.Read();
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var provider = reader.GetAttribute("type");
|
|
||||||
var id = reader.ReadElementContentAsString();
|
|
||||||
if (!string.IsNullOrWhiteSpace(provider) && !string.IsNullOrWhiteSpace(id))
|
|
||||||
{
|
|
||||||
item.SetProviderId(provider, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var provider = reader.GetAttribute("type");
|
||||||
|
var providerId = reader.ReadElementContentAsString();
|
||||||
|
if (!string.IsNullOrWhiteSpace(provider) && !string.IsNullOrWhiteSpace(providerId))
|
||||||
|
{
|
||||||
|
item.SetProviderId(provider, providerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
case "thumb":
|
case "thumb":
|
||||||
{
|
FetchThumbNode(reader, itemResult, "thumb");
|
||||||
FetchThumbNode(reader, itemResult, "thumb");
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "fanart":
|
case "fanart":
|
||||||
{
|
{
|
||||||
if (reader.IsEmptyElement)
|
if (reader.IsEmptyElement)
|
||||||
@ -719,242 +665,188 @@ namespace MediaBrowser.XbmcMetadata.Parsers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FetchFromFileInfoNode(XmlReader reader, T item)
|
private void FetchFromFileInfoNode(XmlReader parentReader, T item)
|
||||||
{
|
{
|
||||||
|
if (parentReader.IsEmptyElement)
|
||||||
|
{
|
||||||
|
parentReader.Read();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var reader = parentReader.ReadSubtree();
|
||||||
reader.MoveToContent();
|
reader.MoveToContent();
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
// Loop through each element
|
// Loop through each element
|
||||||
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
||||||
{
|
{
|
||||||
if (reader.NodeType == XmlNodeType.Element)
|
if (reader.NodeType != XmlNodeType.Element)
|
||||||
{
|
|
||||||
switch (reader.Name)
|
|
||||||
{
|
|
||||||
case "streamdetails":
|
|
||||||
{
|
|
||||||
if (reader.IsEmptyElement)
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var subtree = reader.ReadSubtree())
|
|
||||||
{
|
|
||||||
FetchFromStreamDetailsNode(subtree, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
reader.Skip();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (reader.Name)
|
||||||
|
{
|
||||||
|
case "streamdetails":
|
||||||
|
FetchFromStreamDetailsNode(reader, item);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.Skip();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FetchFromStreamDetailsNode(XmlReader reader, T item)
|
private void FetchFromStreamDetailsNode(XmlReader parentReader, T item)
|
||||||
{
|
{
|
||||||
|
if (parentReader.IsEmptyElement)
|
||||||
|
{
|
||||||
|
parentReader.Read();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var reader = parentReader.ReadSubtree();
|
||||||
reader.MoveToContent();
|
reader.MoveToContent();
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
// Loop through each element
|
// Loop through each element
|
||||||
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
||||||
{
|
{
|
||||||
if (reader.NodeType == XmlNodeType.Element)
|
if (reader.NodeType != XmlNodeType.Element)
|
||||||
{
|
|
||||||
switch (reader.Name)
|
|
||||||
{
|
|
||||||
case "video":
|
|
||||||
{
|
|
||||||
if (reader.IsEmptyElement)
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var subtree = reader.ReadSubtree())
|
|
||||||
{
|
|
||||||
FetchFromVideoNode(subtree, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "subtitle":
|
|
||||||
{
|
|
||||||
if (reader.IsEmptyElement)
|
|
||||||
{
|
|
||||||
reader.Read();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var subtree = reader.ReadSubtree())
|
|
||||||
{
|
|
||||||
FetchFromSubtitleNode(subtree, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
reader.Skip();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (reader.Name)
|
||||||
|
{
|
||||||
|
case "video":
|
||||||
|
FetchFromVideoNode(reader, item);
|
||||||
|
break;
|
||||||
|
case "subtitle":
|
||||||
|
FetchFromSubtitleNode(reader, item);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.Skip();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FetchFromVideoNode(XmlReader reader, T item)
|
private void FetchFromVideoNode(XmlReader parentReader, T item)
|
||||||
{
|
{
|
||||||
|
if (parentReader.IsEmptyElement)
|
||||||
|
{
|
||||||
|
parentReader.Read();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var reader = parentReader.ReadSubtree();
|
||||||
reader.MoveToContent();
|
reader.MoveToContent();
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
// Loop through each element
|
// Loop through each element
|
||||||
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
||||||
{
|
{
|
||||||
if (reader.NodeType == XmlNodeType.Element)
|
if (reader.NodeType != XmlNodeType.Element || item is not Video video)
|
||||||
{
|
|
||||||
switch (reader.Name)
|
|
||||||
{
|
|
||||||
case "format3d":
|
|
||||||
{
|
|
||||||
var val = reader.ReadElementContentAsString();
|
|
||||||
|
|
||||||
var video = item as Video;
|
|
||||||
|
|
||||||
if (video is not null)
|
|
||||||
{
|
|
||||||
if (string.Equals("HSBS", val, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
video.Video3DFormat = Video3DFormat.HalfSideBySide;
|
|
||||||
}
|
|
||||||
else if (string.Equals("HTAB", val, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
|
|
||||||
}
|
|
||||||
else if (string.Equals("FTAB", val, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
video.Video3DFormat = Video3DFormat.FullTopAndBottom;
|
|
||||||
}
|
|
||||||
else if (string.Equals("FSBS", val, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
video.Video3DFormat = Video3DFormat.FullSideBySide;
|
|
||||||
}
|
|
||||||
else if (string.Equals("MVC", val, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
video.Video3DFormat = Video3DFormat.MVC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "aspect":
|
|
||||||
{
|
|
||||||
var val = reader.ReadElementContentAsString();
|
|
||||||
|
|
||||||
if (item is Video video)
|
|
||||||
{
|
|
||||||
video.AspectRatio = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "width":
|
|
||||||
{
|
|
||||||
var val = reader.ReadElementContentAsInt();
|
|
||||||
|
|
||||||
if (item is Video video)
|
|
||||||
{
|
|
||||||
video.Width = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "height":
|
|
||||||
{
|
|
||||||
var val = reader.ReadElementContentAsInt();
|
|
||||||
|
|
||||||
if (item is Video video)
|
|
||||||
{
|
|
||||||
video.Height = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "durationinseconds":
|
|
||||||
{
|
|
||||||
var val = reader.ReadElementContentAsInt();
|
|
||||||
|
|
||||||
if (item is Video video)
|
|
||||||
{
|
|
||||||
video.RunTimeTicks = new TimeSpan(0, 0, val).Ticks;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
reader.Skip();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (reader.Name)
|
||||||
|
{
|
||||||
|
case "format3d":
|
||||||
|
var format = reader.ReadElementContentAsString();
|
||||||
|
if (string.Equals("HSBS", format, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
video.Video3DFormat = Video3DFormat.HalfSideBySide;
|
||||||
|
}
|
||||||
|
else if (string.Equals("HTAB", format, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
video.Video3DFormat = Video3DFormat.HalfTopAndBottom;
|
||||||
|
}
|
||||||
|
else if (string.Equals("FTAB", format, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
video.Video3DFormat = Video3DFormat.FullTopAndBottom;
|
||||||
|
}
|
||||||
|
else if (string.Equals("FSBS", format, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
video.Video3DFormat = Video3DFormat.FullSideBySide;
|
||||||
|
}
|
||||||
|
else if (string.Equals("MVC", format, StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
video.Video3DFormat = Video3DFormat.MVC;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "aspect":
|
||||||
|
video.AspectRatio = reader.ReadNormalizedString();
|
||||||
|
break;
|
||||||
|
case "width":
|
||||||
|
video.Width = reader.ReadElementContentAsInt();
|
||||||
|
break;
|
||||||
|
case "height":
|
||||||
|
video.Height = reader.ReadElementContentAsInt();
|
||||||
|
break;
|
||||||
|
case "durationinseconds":
|
||||||
|
video.RunTimeTicks = new TimeSpan(0, 0, reader.ReadElementContentAsInt()).Ticks;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.Skip();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FetchFromSubtitleNode(XmlReader reader, T item)
|
private void FetchFromSubtitleNode(XmlReader parentReader, T item)
|
||||||
{
|
{
|
||||||
|
if (parentReader.IsEmptyElement)
|
||||||
|
{
|
||||||
|
parentReader.Read();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var reader = parentReader.ReadSubtree();
|
||||||
reader.MoveToContent();
|
reader.MoveToContent();
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
// Loop through each element
|
// Loop through each element
|
||||||
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
while (!reader.EOF && reader.ReadState == ReadState.Interactive)
|
||||||
{
|
{
|
||||||
if (reader.NodeType == XmlNodeType.Element)
|
if (reader.NodeType != XmlNodeType.Element)
|
||||||
{
|
|
||||||
switch (reader.Name)
|
|
||||||
{
|
|
||||||
case "language":
|
|
||||||
_ = reader.ReadElementContentAsString();
|
|
||||||
if (item is Video video)
|
|
||||||
{
|
|
||||||
video.HasSubtitles = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
reader.Skip();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (reader.Name)
|
||||||
|
{
|
||||||
|
case "language":
|
||||||
|
_ = reader.ReadElementContentAsString();
|
||||||
|
if (item is Video video)
|
||||||
|
{
|
||||||
|
video.HasSubtitles = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reader.Skip();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void FetchFromRatingsNode(XmlReader reader, T item)
|
private void FetchFromRatingsNode(XmlReader parentReader, T item)
|
||||||
{
|
{
|
||||||
|
if (parentReader.IsEmptyElement)
|
||||||
|
{
|
||||||
|
parentReader.Read();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
using var reader = parentReader.ReadSubtree();
|
||||||
reader.MoveToContent();
|
reader.MoveToContent();
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user