From 049ef9b4ecd2c884e0ddb062b606770ef7f2dfa9 Mon Sep 17 00:00:00 2001
From: Luke Pulverenti <luke.pulverenti@gmail.com>
Date: Sun, 16 Nov 2014 17:46:01 -0500
Subject: [PATCH] update naming methods

---
 MediaBrowser.Api/UserLibrary/ItemsService.cs  |  8 ++--
 .../Security/PluginSecurityManager.cs         |  7 +++-
 .../Entities/AdultVideo.cs                    | 24 +-----------
 .../Entities/Movies/Movie.cs                  |  5 +--
 MediaBrowser.Controller/Entities/TV/Series.cs |  5 +--
 .../Entities/UserViewBuilder.cs               | 20 +++++-----
 .../Library/ILibraryManager.cs                | 12 ++++++
 .../MediaBrowser.Controller.csproj            |  1 -
 .../Providers/NameParser.cs                   | 39 -------------------
 .../MediaBrowser.Providers.csproj             |  2 +-
 .../Movies/MovieDbSearch.cs                   |  9 +++--
 .../TV/TvdbSeriesProvider.cs                  |  9 +++--
 MediaBrowser.Providers/packages.config        |  2 +-
 .../FileOrganization/EpisodeFileOrganizer.cs  |  7 ++--
 .../Library/LibraryManager.cs                 | 22 ++++++++---
 .../Library/Resolvers/BaseVideoResolver.cs    |  8 ++--
 .../Library/Resolvers/TV/EpisodeResolver.cs   |  4 ++
 ...MediaBrowser.Server.Implementations.csproj |  2 +-
 .../packages.config                           |  2 +-
 .../Parsers/SeasonNfoParser.cs                |  3 +-
 20 files changed, 83 insertions(+), 108 deletions(-)
 delete mode 100644 MediaBrowser.Controller/Providers/NameParser.cs

diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index 18996e0d9f..b87ee895af 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -333,7 +333,7 @@ namespace MediaBrowser.Api.UserLibrary
                 };
             }
 
-            var items = result.Item1.Items.Where(i => ApplyAdditionalFilters(request, i, user, false));
+            var items = result.Item1.Items.Where(i => ApplyAdditionalFilters(request, i, user, false, _libraryManager));
 
             // Apply filters
             // Run them starting with the ones that are likely to reduce the list the most
@@ -467,7 +467,7 @@ namespace MediaBrowser.Api.UserLibrary
                 SortBy = request.GetOrderBy(),
                 SortOrder = request.SortOrder ?? SortOrder.Ascending,
 
-                Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true),
+                Filter = (i, u) => ApplyAdditionalFilters(request, i, u, true, _libraryManager),
 
                 Limit = request.Limit,
                 StartIndex = request.StartIndex,
@@ -635,7 +635,7 @@ namespace MediaBrowser.Api.UserLibrary
             return items;
         }
 
-        private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered)
+        private bool ApplyAdditionalFilters(GetItems request, BaseItem i, User user, bool isPreFiltered, ILibraryManager libraryManager)
         {
             if (!isPreFiltered)
             {
@@ -773,7 +773,7 @@ namespace MediaBrowser.Api.UserLibrary
                 {
                     var filterValue = request.IsYearMismatched.Value;
 
-                    if (UserViewBuilder.IsYearMismatched(i) != filterValue)
+                    if (UserViewBuilder.IsYearMismatched(i, libraryManager) != filterValue)
                     {
                         return false;
                     }
diff --git a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
index 778b2cbb0f..5ebc1e4c55 100644
--- a/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
+++ b/MediaBrowser.Common.Implementations/Security/PluginSecurityManager.cs
@@ -186,15 +186,18 @@ namespace MediaBrowser.Common.Implementations.Security
             string mb2Equivalent = null,
             string version = null)
         {
+            var lastChecked = LicenseFile.LastChecked(feature);
+
             //check the reg file first to alleviate strain on the MB admin server - must actually check in every 30 days tho
             var reg = new RegRecord
             {
-                registered = LicenseFile.LastChecked(feature) > DateTime.UtcNow.AddDays(-3)
+                // Cache the result for up to a week
+                registered = lastChecked > DateTime.UtcNow.AddDays(-7)
             };
 
             var success = reg.registered;
 
-            if (!reg.registered)
+            if (!(lastChecked > DateTime.UtcNow.AddDays(-1)))
             {
                 var mac = _networkManager.GetMacAddress();
                 var data = new Dictionary<string, string>
diff --git a/MediaBrowser.Controller/Entities/AdultVideo.cs b/MediaBrowser.Controller/Entities/AdultVideo.cs
index ec2913ab46..6c3f7851ea 100644
--- a/MediaBrowser.Controller/Entities/AdultVideo.cs
+++ b/MediaBrowser.Controller/Entities/AdultVideo.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Controller.Providers;
-using System;
+using System;
 using System.Collections.Generic;
 
 namespace MediaBrowser.Controller.Entities
@@ -16,26 +15,5 @@ namespace MediaBrowser.Controller.Entities
             Taglines = new List<string>();
             ProductionLocations = new List<string>();
         }
-
-        public override bool BeforeMetadataRefresh()
-        {
-            var hasChanges = base.BeforeMetadataRefresh();
-
-            if (!ProductionYear.HasValue)
-            {
-                int? yearInName = null;
-                string name;
-
-                NameParser.ParseName(Name, out name, out yearInName);
-
-                if (yearInName.HasValue)
-                {
-                    ProductionYear = yearInName;
-                    hasChanges = true;
-                }
-            }
-
-            return hasChanges;
-        }
     }
 }
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index c0afe3df9e..686abdaf56 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -149,10 +149,9 @@ namespace MediaBrowser.Controller.Entities.Movies
 
             if (!ProductionYear.HasValue)
             {
-                int? yearInName = null;
-                string name;
+                var info = LibraryManager.ParseName(Name);
 
-                NameParser.ParseName(Name, out name, out yearInName);
+                var yearInName = info.Year;
 
                 if (yearInName.HasValue)
                 {
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 7f6591287d..3d1051b183 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -255,10 +255,9 @@ namespace MediaBrowser.Controller.Entities.TV
 
             if (!ProductionYear.HasValue)
             {
-                int? yearInName = null;
-                string name;
+                var info = LibraryManager.ParseName(Name);
 
-                NameParser.ParseName(Name, out name, out yearInName);
+                var yearInName = info.Year;
 
                 if (yearInName.HasValue)
                 {
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 71e26b23cc..aff4af468f 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -740,7 +740,7 @@ namespace MediaBrowser.Controller.Entities
         {
             var user = query.User;
 
-            items = items.Where(i => Filter(i, user, query, userDataManager));
+            items = items.Where(i => Filter(i, user, query, userDataManager, libraryManager));
 
             items = FilterVirtualEpisodes(items,
                 query.IsMissing,
@@ -1140,7 +1140,7 @@ namespace MediaBrowser.Controller.Entities
             };
         }
 
-        private static bool Filter(BaseItem item, User user, InternalItemsQuery query, IUserDataManager userDataManager)
+        private static bool Filter(BaseItem item, User user, InternalItemsQuery query, IUserDataManager userDataManager, ILibraryManager libraryManager)
         {
             if (query.MediaTypes.Length > 0 && !query.MediaTypes.Contains(item.MediaType ?? string.Empty, StringComparer.OrdinalIgnoreCase))
             {
@@ -1321,7 +1321,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 var filterValue = query.IsYearMismatched.Value;
 
-                if (IsYearMismatched(item) != filterValue)
+                if (IsYearMismatched(item, libraryManager) != filterValue)
                 {
                     return false;
                 }
@@ -1551,8 +1551,8 @@ namespace MediaBrowser.Controller.Entities
                         return false;
                     }
                 }
-            }                
-            
+            }
+
             // Apply tag filter
             var tags = query.Tags;
             if (tags.Length > 0)
@@ -1641,7 +1641,7 @@ namespace MediaBrowser.Controller.Entities
             return view;
         }
 
-        public static bool IsYearMismatched(BaseItem item)
+        public static bool IsYearMismatched(BaseItem item, ILibraryManager libraryManager)
         {
             if (item.ProductionYear.HasValue)
             {
@@ -1649,14 +1649,14 @@ namespace MediaBrowser.Controller.Entities
 
                 if (!string.IsNullOrEmpty(path))
                 {
-                    int? yearInName;
-                    string name;
-                    NameParser.ParseName(Path.GetFileName(path), out name, out yearInName);
+                    var info = libraryManager.ParseName(Path.GetFileName(path));
+                    var yearInName = info.Year;
 
                     // Go up a level if we didn't get a year
                     if (!yearInName.HasValue)
                     {
-                        NameParser.ParseName(Path.GetFileName(Path.GetDirectoryName(path)), out name, out yearInName);
+                        info = libraryManager.ParseName(Path.GetFileName(Path.GetDirectoryName(path)));
+                        yearInName = info.Year;
                     }
 
                     if (yearInName.HasValue)
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index 68b99e4724..615ddd90ff 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -361,6 +361,11 @@ namespace MediaBrowser.Controller.Library
         /// <returns><c>true</c> if [is video file] [the specified path]; otherwise, <c>false</c>.</returns>
         bool IsVideoFile(string path);
 
+        /// <summary>
+        /// Determines whether [is audio file] [the specified path].
+        /// </summary>
+        /// <param name="path">The path.</param>
+        /// <returns><c>true</c> if [is audio file] [the specified path]; otherwise, <c>false</c>.</returns>
         bool IsAudioFile(string path);
         
         /// <summary>
@@ -405,5 +410,12 @@ namespace MediaBrowser.Controller.Library
         /// <param name="considerSeasonless">if set to <c>true</c> [consider seasonless].</param>
         /// <returns>System.Nullable&lt;System.Int32&gt;.</returns>
         int? GetEpisodeNumberFromFile(string path, bool considerSeasonless);
+
+        /// <summary>
+        /// Parses the name.
+        /// </summary>
+        /// <param name="name">The name.</param>
+        /// <returns>ItemInfo.</returns>
+        ItemLookupInfo ParseName(string name);
     }
 }
\ No newline at end of file
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 0457ea72e3..420da131ee 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -266,7 +266,6 @@
     <Compile Include="Providers\ItemIdentities.cs" />
     <Compile Include="Providers\ItemLookupInfo.cs" />
     <Compile Include="Providers\MetadataRefreshOptions.cs" />
-    <Compile Include="Providers\NameParser.cs" />
     <Compile Include="Providers\MetadataStatus.cs" />
     <Compile Include="Providers\ISeriesOrderManager.cs" />
     <Compile Include="Session\ISessionManager.cs" />
diff --git a/MediaBrowser.Controller/Providers/NameParser.cs b/MediaBrowser.Controller/Providers/NameParser.cs
deleted file mode 100644
index cdd0974eac..0000000000
--- a/MediaBrowser.Controller/Providers/NameParser.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-using System;
-using System.Text.RegularExpressions;
-
-namespace MediaBrowser.Controller.Providers
-{
-    public static class NameParser
-    {
-        static readonly Regex[] NameMatches =
-        {
-            new Regex(@"(?<name>.*)\((?<year>\d{4})\)"), // matches "My Movie (2001)" and gives us the name and the year
-            new Regex(@"(?<name>.*)(\.(?<year>\d{4})(\.|$)).*$"), 
-            new Regex(@"(?<name>.*)") // last resort matches the whole string as the name
-        };
-
-        /// <summary>
-        /// Parses the name.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="justName">Name of the just.</param>
-        /// <param name="year">The year.</param>
-        public static void ParseName(string name, out string justName, out int? year)
-        {
-            justName = null;
-            year = null;
-            foreach (var re in NameMatches)
-            {
-                Match m = re.Match(name);
-                if (m.Success)
-                {
-                    justName = m.Groups["name"].Value.Trim();
-                    string y = m.Groups["year"] != null ? m.Groups["year"].Value : null;
-                    int temp;
-                    year = Int32.TryParse(y, out temp) ? temp : (int?)null;
-                    break;
-                }
-            }
-        }
-    }
-}
diff --git a/MediaBrowser.Providers/MediaBrowser.Providers.csproj b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
index a9bca3922c..e09d70fc5e 100644
--- a/MediaBrowser.Providers/MediaBrowser.Providers.csproj
+++ b/MediaBrowser.Providers/MediaBrowser.Providers.csproj
@@ -55,7 +55,7 @@
     </Reference>
     <Reference Include="MediaBrowser.Naming, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.1\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
+      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
     </Reference>
     <Reference Include="MoreLinq, Version=1.1.17511.0, Culture=neutral, PublicKeyToken=384d532d7e88985d, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
diff --git a/MediaBrowser.Providers/Movies/MovieDbSearch.cs b/MediaBrowser.Providers/Movies/MovieDbSearch.cs
index 85a0d5fa10..ba7693043b 100644
--- a/MediaBrowser.Providers/Movies/MovieDbSearch.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbSearch.cs
@@ -1,4 +1,5 @@
 using MediaBrowser.Common.Net;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using MediaBrowser.Model.Logging;
@@ -24,6 +25,7 @@ namespace MediaBrowser.Providers.Movies
         
         private readonly ILogger _logger;
         private readonly IJsonSerializer _json;
+        private ILibraryManager _libraryManager;
 
         public MovieDbSearch(ILogger logger, IJsonSerializer json)
         {
@@ -50,13 +52,14 @@ namespace MediaBrowser.Providers.Movies
         {
             var name = idInfo.Name;
             var year = idInfo.Year;
-            int? yearInName = null;
 
             var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
 
             var tmdbImageUrl = tmdbSettings.images.base_url + "original";
-            
-            NameParser.ParseName(name, out name, out yearInName);
+
+            var parsedName = _libraryManager.ParseName(name);
+            var yearInName = parsedName.Year;
+            name = parsedName.Name;
 
             year = year ?? yearInName;
 
diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
index 97eabcfa9e..69f1123d02 100644
--- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
@@ -37,8 +37,9 @@ namespace MediaBrowser.Providers.TV
         private readonly CultureInfo _usCulture = new CultureInfo("en-US");
         private readonly ILogger _logger;
         private readonly ISeriesOrderManager _seriesOrder;
+        private readonly ILibraryManager _libraryManager;
 
-        public TvdbSeriesProvider(IZipClient zipClient, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config, ILogger logger, ISeriesOrderManager seriesOrder)
+        public TvdbSeriesProvider(IZipClient zipClient, IHttpClient httpClient, IFileSystem fileSystem, IServerConfigurationManager config, ILogger logger, ISeriesOrderManager seriesOrder, ILibraryManager libraryManager)
         {
             _zipClient = zipClient;
             _httpClient = httpClient;
@@ -46,6 +47,7 @@ namespace MediaBrowser.Providers.TV
             _config = config;
             _logger = logger;
             _seriesOrder = seriesOrder;
+            _libraryManager = libraryManager;
             Current = this;
         }
 
@@ -282,9 +284,8 @@ namespace MediaBrowser.Providers.TV
 
             if (results.Count == 0)
             {
-                int? yearInName = null;
-                string nameWithoutYear;
-                NameParser.ParseName(name, out nameWithoutYear, out yearInName);
+                var parsedName = _libraryManager.ParseName(name);
+                var nameWithoutYear = parsedName.Name;
 
                 if (!string.IsNullOrEmpty(nameWithoutYear) && !string.Equals(nameWithoutYear, name, StringComparison.OrdinalIgnoreCase))
                 {
diff --git a/MediaBrowser.Providers/packages.config b/MediaBrowser.Providers/packages.config
index 17c6f08ba1..48906c583a 100644
--- a/MediaBrowser.Providers/packages.config
+++ b/MediaBrowser.Providers/packages.config
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="MediaBrowser.BdInfo" version="1.0.0.10" targetFramework="net45" />
-  <package id="MediaBrowser.Naming" version="1.0.0.1" targetFramework="net45" />
+  <package id="MediaBrowser.Naming" version="1.0.0.2" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
   <package id="taglib" version="2.1.0.0" targetFramework="net45" />
 </packages>
\ No newline at end of file
diff --git a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
index bc6c6edff9..d4625d4028 100644
--- a/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
+++ b/MediaBrowser.Server.Implementations/FileOrganization/EpisodeFileOrganizer.cs
@@ -321,9 +321,10 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
 
         private Series GetMatchingSeries(string seriesName, FileOrganizationResult result)
         {
-            int? yearInName;
-            var nameWithoutYear = seriesName;
-            NameParser.ParseName(nameWithoutYear, out nameWithoutYear, out yearInName);
+            var parsedName = _libraryManager.ParseName(seriesName);
+
+            var yearInName = parsedName.Year;
+            var nameWithoutYear = parsedName.Name;
 
             result.ExtractedName = nameWithoutYear;
             result.ExtractedYear = yearInName;
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index 3ed6820023..e2a2ce0a4d 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -21,7 +21,6 @@ using MediaBrowser.Naming.Video;
 using MediaBrowser.Server.Implementations.Library.Resolvers.TV;
 using MediaBrowser.Server.Implementations.Library.Validators;
 using MediaBrowser.Server.Implementations.ScheduledTasks;
-using MoreLinq;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -1635,8 +1634,8 @@ namespace MediaBrowser.Server.Implementations.Library
 
         public bool IsVideoFile(string path)
         {
-            var parser = new VideoFileParser(new ExpandedVideoOptions(), new Naming.Logging.NullLogger());
-            return parser.IsVideoFile(path);
+            var resolver = new VideoResolver(new ExpandedVideoOptions(), new AudioOptions(), new Naming.Logging.NullLogger());
+            return resolver.IsVideoFile(path);
         }
 
         public bool IsAudioFile(string path)
@@ -1647,13 +1646,13 @@ namespace MediaBrowser.Server.Implementations.Library
 
         public bool IsMultiPartFile(string path)
         {
-            var parser = new MultiPartParser(new ExpandedVideoOptions(), new Naming.Logging.NullLogger());
+            var parser = new MultiPartParser(new ExpandedVideoOptions(), new AudioOptions(), new Naming.Logging.NullLogger());
             return parser.Parse(path, FileInfoType.File).IsMultiPart;
         }
 
         public bool IsMultiPartFolder(string path)
         {
-            var parser = new MultiPartParser(new ExpandedVideoOptions(), new Naming.Logging.NullLogger());
+            var parser = new MultiPartParser(new ExpandedVideoOptions(), new AudioOptions(), new Naming.Logging.NullLogger());
             return parser.Parse(path, FileInfoType.Directory).IsMultiPart;
         }
 
@@ -1676,5 +1675,18 @@ namespace MediaBrowser.Server.Implementations.Library
         {
             return SeriesResolver.GetEpisodeNumberFromFile(path, considerSeasonless);
         }
+
+        public ItemLookupInfo ParseName(string name)
+        {
+            var resolver = new VideoResolver(new ExpandedVideoOptions(), new AudioOptions(), new Naming.Logging.NullLogger());
+
+            var result = resolver.CleanDateTime(name);
+
+            return new ItemLookupInfo
+            {
+                Name = result.Name,
+                Year = result.Year
+            };
+        }
     }
 }
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
index 9ff1223b08..ba2a32c13f 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/BaseVideoResolver.cs
@@ -1,6 +1,7 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Library;
 using MediaBrowser.Model.Entities;
+using MediaBrowser.Naming.Audio;
 using MediaBrowser.Naming.Video;
 using System;
 
@@ -42,8 +43,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
             // If the path is a file check for a matching extensions
             if (!args.IsDirectory)
             {
-                var parser = new VideoFileParser(new ExpandedVideoOptions(), new Naming.Logging.NullLogger());
-                var videoInfo = parser.ParseFile(args.Path);
+                var parser = new Naming.Video.VideoResolver(new ExpandedVideoOptions(), new AudioOptions(), new Naming.Logging.NullLogger());
+                var videoInfo = parser.ResolveFile(args.Path);
 
                 if (videoInfo == null)
                 {
@@ -67,7 +68,8 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers
                         IsInMixedFolder = true,
                         IsPlaceHolder = videoInfo.IsStub,
                         IsShortcut = isShortcut,
-                        Name = videoInfo.Name
+                        Name = videoInfo.Name,
+                        ProductionYear = videoInfo.Year
                     };
 
                     if (videoInfo.IsStub)
diff --git a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
index 3082872fdf..839b14a9e1 100644
--- a/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
+++ b/MediaBrowser.Server.Implementations/Library/Resolvers/TV/EpisodeResolver.cs
@@ -70,6 +70,10 @@ namespace MediaBrowser.Server.Implementations.Library.Resolvers.TV
 
                 if (episode != null)
                 {
+                    // The base video resolver is going to fill these in, so null them out
+                    episode.ProductionYear = null;
+                    episode.Name = null;
+
                     if (season != null)
                     {
                         episode.ParentIndexNumber = season.IndexNumber;
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 87cffa44ce..36fc04fca6 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -51,7 +51,7 @@
     </Reference>
     <Reference Include="MediaBrowser.Naming, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.1\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
+      <HintPath>..\packages\MediaBrowser.Naming.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\MediaBrowser.Naming.dll</HintPath>
     </Reference>
     <Reference Include="Mono.Nat, Version=1.2.21.0, Culture=neutral, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index 2dc1af97a7..ae52e16166 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="MediaBrowser.Naming" version="1.0.0.1" targetFramework="net45" />
+  <package id="MediaBrowser.Naming" version="1.0.0.2" targetFramework="net45" />
   <package id="Mono.Nat" version="1.2.21.0" targetFramework="net45" />
   <package id="morelinq" version="1.1.0" targetFramework="net45" />
 </packages>
\ No newline at end of file
diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs
index 4c3408e0ec..1ea0053b31 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/SeasonNfoParser.cs
@@ -3,6 +3,7 @@ using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Model.Logging;
 using System.Collections.Generic;
+using System.Globalization;
 using System.Xml;
 
 namespace MediaBrowser.XbmcMetadata.Parsers
@@ -31,7 +32,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                         {
                             int num;
 
-                            if (int.TryParse(number, out num))
+                            if (int.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out num))
                             {
                                 item.IndexNumber = num;
                             }