diff --git a/MediaBrowser.Controller/Extensions/XmlReaderExtensions.cs b/MediaBrowser.Controller/Extensions/XmlReaderExtensions.cs
index 8e4b7c8594..cb239e3145 100644
--- a/MediaBrowser.Controller/Extensions/XmlReaderExtensions.cs
+++ b/MediaBrowser.Controller/Extensions/XmlReaderExtensions.cs
@@ -5,6 +5,7 @@ using System.Linq;
using System.Xml;
using Jellyfin.Data.Enums;
using MediaBrowser.Controller.Entities;
+using Microsoft.Extensions.Logging;
namespace MediaBrowser.Controller.Extensions;
@@ -13,6 +14,52 @@ namespace MediaBrowser.Controller.Extensions;
///
public static class XmlReaderExtensions
{
+ ///
+ /// Parses a from the current node.
+ ///
+ /// The .
+ /// The to use on failure.
+ /// The parsed .
+ /// A value indicating whether the parsing succeeded.
+ public static bool TryReadDateTime(this XmlReader reader, ILogger logger, out DateTime value)
+ {
+ ArgumentNullException.ThrowIfNull(reader);
+ ArgumentNullException.ThrowIfNull(logger);
+
+ var text = reader.ReadElementContentAsString();
+ if (DateTime.TryParse(
+ text,
+ CultureInfo.InvariantCulture,
+ DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
+ out value))
+ {
+ return true;
+ }
+
+ logger.LogWarning("Invalid date: {Date}", text);
+ return false;
+ }
+
+ ///
+ /// Parses a from the current node.
+ ///
+ /// The .
+ /// The date format string.
+ /// The parsed .
+ /// A value indicating whether the parsing succeeded.
+ public static bool TryReadDateTimeExact(this XmlReader reader, string formatString, out DateTime value)
+ {
+ ArgumentNullException.ThrowIfNull(reader);
+ ArgumentNullException.ThrowIfNull(formatString);
+
+ return DateTime.TryParseExact(
+ reader.ReadElementContentAsString(),
+ formatString,
+ CultureInfo.InvariantCulture,
+ DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
+ out value);
+ }
+
///
/// Parses a from the xml node.
///
diff --git a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
index d62862be40..b77b2b43e4 100644
--- a/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
+++ b/MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs
@@ -129,26 +129,13 @@ namespace MediaBrowser.LocalMetadata.Parsers
switch (reader.Name)
{
- // DateCreated
case "Added":
- {
- var val = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(val))
+ if (reader.TryReadDateTime(Logger, out var dateCreated))
{
- if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal, out var added))
- {
- item.DateCreated = added;
- }
- else
- {
- Logger.LogWarning("Invalid Added value found: {Value}", val);
- }
+ item.DateCreated = dateCreated;
}
break;
- }
-
case "OriginalTitle":
{
var val = reader.ReadElementContentAsString();
@@ -465,37 +452,21 @@ namespace MediaBrowser.LocalMetadata.Parsers
case "BirthDate":
case "PremiereDate":
case "FirstAired":
- {
- var firstAired = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(firstAired))
+ if (reader.TryReadDateTimeExact("yyyy-MM-dd", out var firstAired))
{
- if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal, out var airDate) && airDate.Year > 1850)
- {
- item.PremiereDate = airDate;
- item.ProductionYear = airDate.Year;
- }
+ item.PremiereDate = firstAired;
+ item.ProductionYear = firstAired.Year;
}
break;
- }
-
case "DeathDate":
case "EndDate":
- {
- var firstAired = reader.ReadElementContentAsString();
-
- if (!string.IsNullOrWhiteSpace(firstAired))
+ if (reader.TryReadDateTimeExact("yyyy-MM-dd", out var endDate))
{
- if (DateTime.TryParseExact(firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal | DateTimeStyles.AdjustToUniversal, out var airDate) && airDate.Year > 1850)
- {
- item.EndDate = airDate;
- }
+ item.EndDate = endDate;
}
break;
- }
-
case "CollectionNumber":
var tmdbCollection = reader.ReadElementContentAsString();
if (!string.IsNullOrWhiteSpace(tmdbCollection))
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
index 797ce59e05..6e02add775 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
@@ -268,23 +268,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
switch (reader.Name)
{
- // DateCreated
case "dateadded":
+ if (reader.TryReadDateTime(Logger, out var dateCreated))
{
- var val = reader.ReadElementContentAsString();
-
- if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var added))
- {
- item.DateCreated = added;
- }
- else
- {
- Logger.LogWarning("Invalid Added value found: {Value}", val);
- }
-
- break;
+ item.DateCreated = dateCreated;
}
+ break;
case "originaltitle":
{
var val = reader.ReadElementContentAsString();
@@ -373,9 +363,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
{
var val = reader.ReadElementContentAsString();
if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var count)
- && Guid.TryParse(nfoConfiguration.UserId, out var guid))
+ && Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
{
- var user = _userManager.GetUserById(guid);
+ var user = _userManager.GetUserById(playCountUserId);
userData = _userDataManager.GetUserData(user, item);
userData.PlayCount = count;
_userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
@@ -385,26 +375,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
}
case "lastplayed":
+ if (reader.TryReadDateTime(Logger, out var lastPlayed)
+ && Guid.TryParse(nfoConfiguration.UserId, out var lastPlayedUserId))
{
- var val = reader.ReadElementContentAsString();
- if (Guid.TryParse(nfoConfiguration.UserId, out var guid))
- {
- if (DateTime.TryParse(val, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var added))
- {
- var user = _userManager.GetUserById(guid);
- userData = _userDataManager.GetUserData(user, item);
- userData.LastPlayedDate = added;
- _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
- }
- else
- {
- Logger.LogWarning("Invalid lastplayed value found: {Value}", val);
- }
- }
-
- break;
+ var user = _userManager.GetUserById(lastPlayedUserId);
+ userData = _userDataManager.GetUserData(user, item);
+ userData.LastPlayedDate = lastPlayed;
+ _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
}
+ break;
case "countrycode":
{
var val = reader.ReadElementContentAsString();
@@ -641,34 +621,20 @@ namespace MediaBrowser.XbmcMetadata.Parsers
case "formed":
case "premiered":
case "releasedate":
+ if (reader.TryReadDateTimeExact(nfoConfiguration.ReleaseDateFormat, out var releaseDate))
{
- var formatString = nfoConfiguration.ReleaseDateFormat;
-
- var val = reader.ReadElementContentAsString();
-
- if (DateTime.TryParseExact(val, formatString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var date) && date.Year > 1850)
- {
- item.PremiereDate = date;
- item.ProductionYear = date.Year;
- }
-
- break;
+ item.PremiereDate = releaseDate;
+ item.ProductionYear = releaseDate.Year;
}
+ break;
case "enddate":
+ if (reader.TryReadDateTimeExact(nfoConfiguration.ReleaseDateFormat, out var endDate))
{
- var formatString = nfoConfiguration.ReleaseDateFormat;
-
- var val = reader.ReadElementContentAsString();
-
- if (DateTime.TryParseExact(val, formatString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var date) && date.Year > 1850)
- {
- item.EndDate = date;
- }
-
- break;
+ item.EndDate = endDate;
}
+ break;
case "genre":
{
var val = reader.ReadElementContentAsString();