Browse Source

Add TryParseDateTime and TryParseDateTimeExact to XmlReaderExtensions

Patrick Barron 1 year ago
parent
commit
99832642ce

+ 47 - 0
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;
 /// </summary>
 public static class XmlReaderExtensions
 {
+    /// <summary>
+    /// Parses a <see cref="DateTime"/> from the current node.
+    /// </summary>
+    /// <param name="reader">The <see cref="XmlReader"/>.</param>
+    /// <param name="logger">The <see cref="ILogger"/> to use on failure.</param>
+    /// <param name="value">The parsed <see cref="DateTime"/>.</param>
+    /// <returns>A value indicating whether the parsing succeeded.</returns>
+    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;
+    }
+
+    /// <summary>
+    /// Parses a <see cref="DateTime"/> from the current node.
+    /// </summary>
+    /// <param name="reader">The <see cref="XmlReader"/>.</param>
+    /// <param name="formatString">The date format string.</param>
+    /// <param name="value">The parsed <see cref="DateTime"/>.</param>
+    /// <returns>A value indicating whether the parsing succeeded.</returns>
+    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);
+    }
+
     /// <summary>
     /// Parses a <see cref="PersonInfo"/> from the xml node.
     /// </summary>

+ 7 - 36
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))

+ 19 - 53
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();