Browse Source

Add TryReadInt to XmlReaderExtensions

Patrick Barron 1 year ago
parent
commit
0e51ffa169

+ 13 - 0
MediaBrowser.Controller/Extensions/XmlReaderExtensions.cs

@@ -26,6 +26,19 @@ public static class XmlReaderExtensions
         return reader.ReadElementContentAsString().Trim();
     }
 
+    /// <summary>
+    /// Reads an int from the current node.
+    /// </summary>
+    /// <param name="reader">The <see cref="XmlReader"/>.</param>
+    /// <param name="value">The parsed <c>int</c>.</param>
+    /// <returns>A value indicating whether the parsing succeeded.</returns>
+    public static bool TryReadInt(this XmlReader reader, out int value)
+    {
+        ArgumentNullException.ThrowIfNull(reader);
+
+        return int.TryParse(reader.ReadElementContentAsString(), CultureInfo.InvariantCulture, out value);
+    }
+
     /// <summary>
     /// Parses a <see cref="DateTime"/> from the current node.
     /// </summary>

+ 5 - 18
MediaBrowser.LocalMetadata/Parsers/BaseItemXmlParser.cs

@@ -234,20 +234,16 @@ namespace MediaBrowser.LocalMetadata.Parsers
                     item.CustomRating = reader.ReadNormalizedString();
                     break;
                 case "RunningTime":
-                {
-                    var text = reader.ReadElementContentAsString();
-
-                    if (!string.IsNullOrWhiteSpace(text))
+                    var runtimeText = reader.ReadElementContentAsString();
+                    if (!string.IsNullOrWhiteSpace(runtimeText))
                     {
-                        if (int.TryParse(text.AsSpan().LeftPart(' '), NumberStyles.Integer, CultureInfo.InvariantCulture, out var runtime))
+                        if (int.TryParse(runtimeText.AsSpan().LeftPart(' '), NumberStyles.Integer, CultureInfo.InvariantCulture, out var runtime))
                         {
                             item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
                         }
                     }
 
                     break;
-                }
-
                 case "AspectRatio":
                     var aspectRatio = reader.ReadNormalizedString();
                     if (!string.IsNullOrEmpty(aspectRatio) && item is IHasAspectRatio hasAspectRatio)
@@ -256,7 +252,6 @@ namespace MediaBrowser.LocalMetadata.Parsers
                     }
 
                     break;
-
                 case "LockData":
                 {
                     var val = reader.ReadElementContentAsString();
@@ -336,20 +331,12 @@ namespace MediaBrowser.LocalMetadata.Parsers
                 }
 
                 case "ProductionYear":
-                {
-                    var val = reader.ReadElementContentAsString();
-
-                    if (!string.IsNullOrWhiteSpace(val))
+                    if (reader.TryReadInt(out var productionYear) && productionYear > 1850)
                     {
-                        if (int.TryParse(val, out var productionYear) && productionYear > 1850)
-                        {
-                            item.ProductionYear = productionYear;
-                        }
+                        item.ProductionYear = productionYear;
                     }
 
                     break;
-                }
-
                 case "Rating":
                 case "IMDBrating":
                 {

+ 14 - 27
MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs

@@ -325,20 +325,16 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                     }
 
                 case "playcount":
+                    if (reader.TryReadInt(out var count)
+                        && Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
                     {
-                        var val = reader.ReadElementContentAsString();
-                        if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var count)
-                            && Guid.TryParse(nfoConfiguration.UserId, out var playCountUserId))
-                        {
-                            var user = _userManager.GetUserById(playCountUserId);
-                            userData = _userDataManager.GetUserData(user, item);
-                            userData.PlayCount = count;
-                            _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
-                        }
-
-                        break;
+                        var user = _userManager.GetUserById(playCountUserId);
+                        userData = _userDataManager.GetUserData(user, item);
+                        userData.PlayCount = count;
+                        _userDataManager.SaveUserData(user, item, userData, UserDataSaveReason.Import, CancellationToken.None);
                     }
 
+                    break;
                 case "lastplayed":
                     if (reader.TryReadDateTime(Logger, out var lastPlayed)
                         && Guid.TryParse(nfoConfiguration.UserId, out var lastPlayedUserId))
@@ -398,17 +394,13 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                     item.CustomRating = reader.ReadNormalizedString();
                     break;
                 case "runtime":
+                    var runtimeText = reader.ReadElementContentAsString();
+                    if (int.TryParse(runtimeText.AsSpan().LeftPart(' '), NumberStyles.Integer, CultureInfo.InvariantCulture, out var runtime))
                     {
-                        var text = reader.ReadElementContentAsString();
-
-                        if (int.TryParse(text.AsSpan().LeftPart(' '), NumberStyles.Integer, CultureInfo.InvariantCulture, out var runtime))
-                        {
-                            item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
-                        }
-
-                        break;
+                        item.RunTimeTicks = TimeSpan.FromMinutes(runtime).Ticks;
                     }
 
+                    break;
                 case "aspectratio":
                     var aspectRatio = reader.ReadNormalizedString();
                     if (!string.IsNullOrEmpty(aspectRatio) && item is IHasAspectRatio hasAspectRatio)
@@ -502,17 +494,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 
                     break;
                 case "year":
+                    if (reader.TryReadInt(out var productionYear) && productionYear > 1850)
                     {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (int.TryParse(val, out var productionYear) && productionYear > 1850)
-                        {
-                            item.ProductionYear = productionYear;
-                        }
-
-                        break;
+                        item.ProductionYear = productionYear;
                     }
 
+                    break;
                 case "rating":
                     {
                         var rating = reader.ReadElementContentAsString();

+ 19 - 101
MediaBrowser.XbmcMetadata/Parsers/EpisodeNfoParser.cs

@@ -1,5 +1,4 @@
 using System;
-using System.Globalization;
 using System.IO;
 using System.Threading;
 using System.Xml;
@@ -113,130 +112,49 @@ namespace MediaBrowser.XbmcMetadata.Parsers
             switch (reader.Name)
             {
                 case "season":
+                    if (reader.TryReadInt(out var seasonNumber))
                     {
-                        var number = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(number))
-                        {
-                            if (int.TryParse(number, out var num))
-                            {
-                                item.ParentIndexNumber = num;
-                            }
-                        }
-
-                        break;
+                        item.ParentIndexNumber = seasonNumber;
                     }
 
+                    break;
                 case "episode":
+                    if (reader.TryReadInt(out var episodeNumber))
                     {
-                        var number = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(number))
-                        {
-                            if (int.TryParse(number, out var num))
-                            {
-                                item.IndexNumber = num;
-                            }
-                        }
-
-                        break;
+                        item.IndexNumber = episodeNumber;
                     }
 
+                    break;
                 case "episodenumberend":
+                    if (reader.TryReadInt(out var episodeNumberEnd))
                     {
-                        var number = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(number))
-                        {
-                            if (int.TryParse(number, out var num))
-                            {
-                                item.IndexNumberEnd = num;
-                            }
-                        }
-
-                        break;
+                        item.IndexNumberEnd = episodeNumberEnd;
                     }
 
+                    break;
                 case "airsbefore_episode":
+                case "displayepisode":
+                    if (reader.TryReadInt(out var airsBeforeEpisode))
                     {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(val))
-                        {
-                            // int.TryParse is local aware, so it can be problematic, force us culture
-                            if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var rval))
-                            {
-                                item.AirsBeforeEpisodeNumber = rval;
-                            }
-                        }
-
-                        break;
+                        item.AirsBeforeEpisodeNumber = airsBeforeEpisode;
                     }
 
+                    break;
                 case "airsafter_season":
+                    if (reader.TryReadInt(out var airsAfterSeason))
                     {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(val))
-                        {
-                            // int.TryParse is local aware, so it can be problematic, force us culture
-                            if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var rval))
-                            {
-                                item.AirsAfterSeasonNumber = rval;
-                            }
-                        }
-
-                        break;
+                        item.AirsAfterSeasonNumber = airsAfterSeason;
                     }
 
+                    break;
                 case "airsbefore_season":
-                    {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(val))
-                        {
-                            // int.TryParse is local aware, so it can be problematic, force us culture
-                            if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var rval))
-                            {
-                                item.AirsBeforeSeasonNumber = rval;
-                            }
-                        }
-
-                        break;
-                    }
-
                 case "displayseason":
+                    if (reader.TryReadInt(out var airsBeforeSeason))
                     {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(val))
-                        {
-                            // int.TryParse is local aware, so it can be problematic, force us culture
-                            if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var rval))
-                            {
-                                item.AirsBeforeSeasonNumber = rval;
-                            }
-                        }
-
-                        break;
-                    }
-
-                case "displayepisode":
-                    {
-                        var val = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(val))
-                        {
-                            // int.TryParse is local aware, so it can be problematic, force us culture
-                            if (int.TryParse(val, NumberStyles.Integer, CultureInfo.InvariantCulture, out var rval))
-                            {
-                                item.AirsBeforeEpisodeNumber = rval;
-                            }
-                        }
-
-                        break;
+                        item.AirsBeforeSeasonNumber = airsBeforeSeason;
                     }
 
+                    break;
                 case "showtitle":
                     item.SeriesName = reader.ReadNormalizedString();
                     break;

+ 3 - 12
MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs

@@ -1,4 +1,3 @@
-using System.Globalization;
 using System.Xml;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Entities.TV;
@@ -42,20 +41,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
             switch (reader.Name)
             {
                 case "seasonnumber":
+                    if (reader.TryReadInt(out var seasonNumber))
                     {
-                        var number = reader.ReadElementContentAsString();
-
-                        if (!string.IsNullOrWhiteSpace(number))
-                        {
-                            if (int.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out var num))
-                            {
-                                item.IndexNumber = num;
-                            }
-                        }
-
-                        break;
+                        item.IndexNumber = seasonNumber;
                     }
 
+                    break;
                 case "seasonname":
                     item.Name = reader.ReadNormalizedString();
                     break;