From bba0c564c7f9db6a6d5d2b16b1c8ae453eeaed34 Mon Sep 17 00:00:00 2001
From: Luke Pulverenti <luke.pulverenti@gmail.com>
Date: Mon, 17 Oct 2016 12:35:29 -0400
Subject: [PATCH] remove dead interface objects

---
 MediaBrowser.Api/ItemUpdateService.cs         | 14 +---
 .../Logging/NLogger.cs                        |  4 +-
 MediaBrowser.Controller/Entities/BaseItem.cs  |  2 +-
 .../Entities/BasePluginFolder.cs              |  2 +-
 .../Entities/IByReferenceItem.cs              | 12 ----
 .../Entities/IHasCriticRating.cs              | 20 ------
 .../Entities/IHasShortOverview.cs             | 12 ----
 .../Entities/ILibraryItem.cs                  | 28 --------
 .../Entities/ImageSourceInfo.cs               | 10 ---
 .../Entities/Movies/Movie.cs                  |  2 +-
 MediaBrowser.Controller/Entities/TV/Season.cs |  2 +-
 MediaBrowser.Controller/Entities/Trailer.cs   |  2 +-
 .../Entities/UserViewBuilder.cs               | 11 +--
 MediaBrowser.Controller/Entities/Video.cs     |  1 -
 .../LiveTv/LiveTvChannel.cs                   | 11 +--
 .../MediaBrowser.Controller.csproj            |  5 --
 .../Providers/BaseItemXmlParser.cs            | 20 ++----
 .../Providers/DynamicImageResponse.cs         |  1 -
 .../Providers/IProviderManager.cs             | 22 +-----
 MediaBrowser.Dlna/Didl/DidlBuilder.cs         |  5 +-
 .../Savers/XmlSaverHelpers.cs                 | 26 +++----
 MediaBrowser.Providers/Manager/ImageSaver.cs  |  6 +-
 .../Manager/ItemImageProvider.cs              |  4 +-
 .../Manager/MetadataService.cs                | 19 +++--
 .../Manager/ProviderManager.cs                |  9 +--
 .../Manager/ProviderUtils.cs                  | 28 +++-----
 MediaBrowser.Providers/Omdb/OmdbProvider.cs   | 72 ++++++++-----------
 .../Library/LibraryManager.cs                 |  2 +-
 .../LiveTv/EmbyTV/EmbyTV.cs                   | 18 +----
 .../LiveTv/LiveTvDtoService.cs                |  6 +-
 .../Photos/BaseDynamicImageProvider.cs        |  2 +-
 .../Sorting/CriticRatingComparer.cs           |  4 +-
 .../Parsers/BaseNfoParser.cs                  | 20 ++----
 33 files changed, 101 insertions(+), 301 deletions(-)
 delete mode 100644 MediaBrowser.Controller/Entities/IByReferenceItem.cs
 delete mode 100644 MediaBrowser.Controller/Entities/IHasCriticRating.cs
 delete mode 100644 MediaBrowser.Controller/Entities/IHasShortOverview.cs
 delete mode 100644 MediaBrowser.Controller/Entities/ILibraryItem.cs
 delete mode 100644 MediaBrowser.Controller/Entities/ImageSourceInfo.cs

diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index 16e8a434a1..78aa5e1657 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -245,12 +245,8 @@ namespace MediaBrowser.Api
 
             item.OriginalTitle = string.IsNullOrWhiteSpace(request.OriginalTitle) ? null : request.OriginalTitle;
 
-            var hasCriticRating = item as IHasCriticRating;
-            if (hasCriticRating != null)
-            {
-                hasCriticRating.CriticRating = request.CriticRating;
-                hasCriticRating.CriticRatingSummary = request.CriticRatingSummary;
-            }
+            item.CriticRating = request.CriticRating;
+            item.CriticRatingSummary = request.CriticRatingSummary;
 
             item.DisplayMediaType = request.DisplayMediaType;
             item.CommunityRating = request.CommunityRating;
@@ -279,11 +275,7 @@ namespace MediaBrowser.Api
                 item.Tagline = request.Taglines.FirstOrDefault();
             }
 
-            var hasShortOverview = item as IHasShortOverview;
-            if (hasShortOverview != null)
-            {
-                hasShortOverview.ShortOverview = request.ShortOverview;
-            }
+            item.ShortOverview = request.ShortOverview;
 
             item.Keywords = request.Keywords;
 
diff --git a/MediaBrowser.Common.Implementations/Logging/NLogger.cs b/MediaBrowser.Common.Implementations/Logging/NLogger.cs
index 97bc437a0f..11f41261a2 100644
--- a/MediaBrowser.Common.Implementations/Logging/NLogger.cs
+++ b/MediaBrowser.Common.Implementations/Logging/NLogger.cs
@@ -127,7 +127,9 @@ namespace MediaBrowser.Common.Implementations.Logging
             {
                 for (var i = 0; i < paramList.Length; i++)
                 {
-                    message = message.Replace("{" + i + "}", paramList[i].ToString());
+                    var obj = paramList[i];
+
+                    message = message.Replace("{" + i + "}", (obj == null ? "null" : obj.ToString()));
                 }
             }
 
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 3ebefa2170..e1a7741c94 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -33,7 +33,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class BaseItem
     /// </summary>
-    public abstract class BaseItem : IHasProviderIds, ILibraryItem, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo<ItemLookupInfo>
+    public abstract class BaseItem : IHasProviderIds, IHasImages, IHasUserData, IHasMetadata, IHasLookupInfo<ItemLookupInfo>
     {
         protected BaseItem()
         {
diff --git a/MediaBrowser.Controller/Entities/BasePluginFolder.cs b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
index 5a1ad6b157..bd109af7a7 100644
--- a/MediaBrowser.Controller/Entities/BasePluginFolder.cs
+++ b/MediaBrowser.Controller/Entities/BasePluginFolder.cs
@@ -7,7 +7,7 @@ namespace MediaBrowser.Controller.Entities
     /// Plugins derive from and export this class to create a folder that will appear in the root along
     /// with all the other actual physical folders in the system.
     /// </summary>
-    public abstract class BasePluginFolder : Folder, ICollectionFolder, IByReferenceItem
+    public abstract class BasePluginFolder : Folder, ICollectionFolder
     {
         public virtual string CollectionType
         {
diff --git a/MediaBrowser.Controller/Entities/IByReferenceItem.cs b/MediaBrowser.Controller/Entities/IByReferenceItem.cs
deleted file mode 100644
index b071473e11..0000000000
--- a/MediaBrowser.Controller/Entities/IByReferenceItem.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-namespace MediaBrowser.Controller.Entities
-{
-    /// <summary>
-    /// This is a marker class that tells us that a particular item type may be physically resolved
-    /// more than once within the library and we need to be sure to resolve them all to the same
-    /// instance of that item.
-    /// </summary>
-    public interface IByReferenceItem
-    {
-    }
-}
diff --git a/MediaBrowser.Controller/Entities/IHasCriticRating.cs b/MediaBrowser.Controller/Entities/IHasCriticRating.cs
deleted file mode 100644
index d2b93759d8..0000000000
--- a/MediaBrowser.Controller/Entities/IHasCriticRating.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-namespace MediaBrowser.Controller.Entities
-{
-    /// <summary>
-    /// Interface IHasCriticRating
-    /// </summary>
-    public interface IHasCriticRating
-    {
-        /// <summary>
-        /// Gets or sets the critic rating.
-        /// </summary>
-        /// <value>The critic rating.</value>
-        float? CriticRating { get; set; }
-
-        /// <summary>
-        /// Gets or sets the critic rating summary.
-        /// </summary>
-        /// <value>The critic rating summary.</value>
-        string CriticRatingSummary { get; set; }
-    }
-}
diff --git a/MediaBrowser.Controller/Entities/IHasShortOverview.cs b/MediaBrowser.Controller/Entities/IHasShortOverview.cs
deleted file mode 100644
index 437201faaf..0000000000
--- a/MediaBrowser.Controller/Entities/IHasShortOverview.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-
-namespace MediaBrowser.Controller.Entities
-{
-    public interface IHasShortOverview
-    {
-        /// <summary>
-        /// Gets or sets the short overview.
-        /// </summary>
-        /// <value>The short overview.</value>
-        string ShortOverview { get; set; }
-    }
-}
diff --git a/MediaBrowser.Controller/Entities/ILibraryItem.cs b/MediaBrowser.Controller/Entities/ILibraryItem.cs
deleted file mode 100644
index b2f39608f3..0000000000
--- a/MediaBrowser.Controller/Entities/ILibraryItem.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System;
-
-namespace MediaBrowser.Controller.Entities
-{
-    /// <summary>
-    /// Interface ILibraryItem
-    /// </summary>
-    public interface ILibraryItem
-    {
-        /// <summary>
-        /// Gets the name.
-        /// </summary>
-        /// <value>The name.</value>
-        string Name { get; }
-
-        /// <summary>
-        /// Gets the id.
-        /// </summary>
-        /// <value>The id.</value>
-        Guid Id { get; }
-
-        /// <summary>
-        /// Gets the path.
-        /// </summary>
-        /// <value>The path.</value>
-        string Path { get; }
-    }
-}
diff --git a/MediaBrowser.Controller/Entities/ImageSourceInfo.cs b/MediaBrowser.Controller/Entities/ImageSourceInfo.cs
deleted file mode 100644
index 6dc072431c..0000000000
--- a/MediaBrowser.Controller/Entities/ImageSourceInfo.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-
-namespace MediaBrowser.Controller.Entities
-{
-    public class ImageSourceInfo
-    {
-        public Guid ImagePathMD5 { get; set; }
-        public Guid ImageUrlMD5 { get; set; }
-    }
-}
diff --git a/MediaBrowser.Controller/Entities/Movies/Movie.cs b/MediaBrowser.Controller/Entities/Movies/Movie.cs
index dea42c463a..f13adb21c7 100644
--- a/MediaBrowser.Controller/Entities/Movies/Movie.cs
+++ b/MediaBrowser.Controller/Entities/Movies/Movie.cs
@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Movies
     /// <summary>
     /// Class Movie
     /// </summary>
-    public class Movie : Video, IHasCriticRating, IHasSpecialFeatures, IHasBudget, IHasTrailers, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle
+    public class Movie : Video, IHasSpecialFeatures, IHasBudget, IHasTrailers, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle
     {
         public List<Guid> SpecialFeatureIds { get; set; }
 
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 62af141593..ce13f5fc5f 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -36,7 +36,7 @@ namespace MediaBrowser.Controller.Entities.TV
         {
             get
             {
-                return true;
+                return false;
             }
         }
 
diff --git a/MediaBrowser.Controller/Entities/Trailer.cs b/MediaBrowser.Controller/Entities/Trailer.cs
index 0bcd5c14e8..0780cfec5e 100644
--- a/MediaBrowser.Controller/Entities/Trailer.cs
+++ b/MediaBrowser.Controller/Entities/Trailer.cs
@@ -10,7 +10,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// Class Trailer
     /// </summary>
-    public class Trailer : Video, IHasCriticRating, IHasBudget, IHasMetascore, IHasOriginalTitle, IHasLookupInfo<TrailerInfo>
+    public class Trailer : Video, IHasBudget, IHasMetascore, IHasOriginalTitle, IHasLookupInfo<TrailerInfo>
     {
         public Trailer()
         {
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 3b7e3c5d29..38397572e3 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -1668,16 +1668,7 @@ namespace MediaBrowser.Controller.Entities
             {
                 var val = query.MinCriticRating.Value;
 
-                var hasCriticRating = item as IHasCriticRating;
-
-                if (hasCriticRating != null)
-                {
-                    if (!(hasCriticRating.CriticRating.HasValue && hasCriticRating.CriticRating >= val))
-                    {
-                        return false;
-                    }
-                }
-                else
+                if (!(item.CriticRating.HasValue && item.CriticRating >= val))
                 {
                     return false;
                 }
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index e87b726b23..78d7a7fdd9 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -24,7 +24,6 @@ namespace MediaBrowser.Controller.Entities
         IHasAspectRatio,
         ISupportsPlaceHolders,
         IHasMediaSources,
-        IHasShortOverview,
         IThemeMedia
     {
         [IgnoreDataMember]
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
index 610d4b6f8a..5e99d6fa3f 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvChannel.cs
@@ -78,14 +78,17 @@ namespace MediaBrowser.Controller.LiveTv
 
         protected override string CreateSortName()
         {
-            double number = 0;
-
             if (!string.IsNullOrEmpty(Number))
             {
-                double.TryParse(Number, NumberStyles.Any, CultureInfo.InvariantCulture, out number);
+                double number = 0;
+
+                if (double.TryParse(Number, NumberStyles.Any, CultureInfo.InvariantCulture, out number))
+                {
+                    return number.ToString("00000-") + (Name ?? string.Empty);
+                }
             }
 
-            return number.ToString("00000-") + (Name ?? string.Empty);
+            return Number + "-" + (Name ?? string.Empty);
         }
 
         [IgnoreDataMember]
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 11ed0f6741..a8062af19f 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -132,10 +132,8 @@
     <Compile Include="Entities\Game.cs" />
     <Compile Include="Entities\GameGenre.cs" />
     <Compile Include="Entities\GameSystem.cs" />
-    <Compile Include="Entities\IByReferenceItem.cs" />
     <Compile Include="Entities\IHasAspectRatio.cs" />
     <Compile Include="Entities\IHasBudget.cs" />
-    <Compile Include="Entities\IHasCriticRating.cs" />
     <Compile Include="Entities\IHasDisplayOrder.cs" />
     <Compile Include="Entities\IHasId.cs" />
     <Compile Include="Entities\IHasImages.cs" />
@@ -146,15 +144,12 @@
     <Compile Include="Entities\IHasProgramAttributes.cs" />
     <Compile Include="Entities\IHasScreenshots.cs" />
     <Compile Include="Entities\IHasSeries.cs" />
-    <Compile Include="Entities\IHasShortOverview.cs" />
     <Compile Include="Entities\IHasSpecialFeatures.cs" />
     <Compile Include="Entities\IHasStartDate.cs" />
     <Compile Include="Entities\IHasTrailers.cs" />
     <Compile Include="Entities\IHasUserData.cs" />
     <Compile Include="Entities\IHiddenFromDisplay.cs" />
     <Compile Include="Entities\IItemByName.cs" />
-    <Compile Include="Entities\ILibraryItem.cs" />
-    <Compile Include="Entities\ImageSourceInfo.cs" />
     <Compile Include="Entities\IMetadataContainer.cs" />
     <Compile Include="Entities\InternalItemsQuery.cs" />
     <Compile Include="Entities\InternalPeopleQuery.cs" />
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
index 13d43eee67..931af293cc 100644
--- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
@@ -185,14 +185,12 @@ namespace MediaBrowser.Controller.Providers
                     {
                         var text = reader.ReadElementContentAsString();
 
-                        var hasCriticRating = item as IHasCriticRating;
-
-                        if (hasCriticRating != null && !string.IsNullOrEmpty(text))
+                        if (!string.IsNullOrEmpty(text))
                         {
                             float value;
                             if (float.TryParse(text, NumberStyles.Any, _usCulture, out value))
                             {
-                                hasCriticRating.CriticRating = value;
+                                item.CriticRating = value;
                             }
                         }
 
@@ -292,12 +290,7 @@ namespace MediaBrowser.Controller.Providers
 
                         if (!string.IsNullOrWhiteSpace(val))
                         {
-                            var hasShortOverview = item as IHasShortOverview;
-
-                            if (hasShortOverview != null)
-                            {
-                                hasShortOverview.ShortOverview = val;
-                            }
+                            item.ShortOverview = val;
                         }
 
                         break;
@@ -309,12 +302,7 @@ namespace MediaBrowser.Controller.Providers
 
                         if (!string.IsNullOrWhiteSpace(val))
                         {
-                            var hasCriticRating = item as IHasCriticRating;
-
-                            if (hasCriticRating != null)
-                            {
-                                hasCriticRating.CriticRatingSummary = val;
-                            }
+                            item.CriticRatingSummary = val;
                         }
 
                         break;
diff --git a/MediaBrowser.Controller/Providers/DynamicImageResponse.cs b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs
index fdd1891ed6..d19a28a24c 100644
--- a/MediaBrowser.Controller/Providers/DynamicImageResponse.cs
+++ b/MediaBrowser.Controller/Providers/DynamicImageResponse.cs
@@ -12,7 +12,6 @@ namespace MediaBrowser.Controller.Providers
         public Stream Stream { get; set; }
         public ImageFormat Format { get; set; }
         public bool HasImage { get; set; }
-        public string InternalCacheKey { get; set; }
 
         public void SetFormatFromMimeType(string mimeType)
         {
diff --git a/MediaBrowser.Controller/Providers/IProviderManager.cs b/MediaBrowser.Controller/Providers/IProviderManager.cs
index d3e5685bb1..428651ed5b 100644
--- a/MediaBrowser.Controller/Providers/IProviderManager.cs
+++ b/MediaBrowser.Controller/Providers/IProviderManager.cs
@@ -69,28 +69,8 @@ namespace MediaBrowser.Controller.Providers
         /// <summary>
         /// Saves the image.
         /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="source">The source.</param>
-        /// <param name="mimeType">Type of the MIME.</param>
-        /// <param name="type">The type.</param>
-        /// <param name="imageIndex">Index of the image.</param>
-        /// <param name="internalCacheKey">The internal cache key.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
-        /// <returns>Task.</returns>
-        Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken);
-
-        /// <summary>
-        /// Saves the image.
-        /// </summary>
-        /// <param name="item">The item.</param>
-        /// <param name="source">The source.</param>
-        /// <param name="mimeType">Type of the MIME.</param>
-        /// <param name="type">The type.</param>
-        /// <param name="imageIndex">Index of the image.</param>
-        /// <param name="internalCacheKey">The internal cache key.</param>
-        /// <param name="cancellationToken">The cancellation token.</param>
         /// <returns>Task.</returns>
-        Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken);
+        Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken);
         
         /// <summary>
         /// Adds the metadata providers.
diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
index f53dec3bff..1330c54c2c 100644
--- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs
+++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
@@ -585,10 +585,9 @@ namespace MediaBrowser.Dlna.Didl
             {
                 var desc = item.Overview;
 
-                var hasShortOverview = item as IHasShortOverview;
-                if (hasShortOverview != null && !string.IsNullOrEmpty(hasShortOverview.ShortOverview))
+                if (!string.IsNullOrEmpty(item.ShortOverview))
                 {
-                    desc = hasShortOverview.ShortOverview;
+                    desc = item.ShortOverview;
                 }
 
                 if (!string.IsNullOrWhiteSpace(desc))
diff --git a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
index c9810b0423..3148405583 100644
--- a/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
+++ b/MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs
@@ -258,18 +258,14 @@ namespace MediaBrowser.LocalMetadata.Savers
                 builder.Append("<Type>" + SecurityElement.Escape(item.DisplayMediaType) + "</Type>");
             }
 
-            var hasCriticRating = item as IHasCriticRating;
-            if (hasCriticRating != null)
+            if (item.CriticRating.HasValue)
             {
-                if (hasCriticRating.CriticRating.HasValue)
-                {
-                    builder.Append("<CriticRating>" + SecurityElement.Escape(hasCriticRating.CriticRating.Value.ToString(UsCulture)) + "</CriticRating>");
-                }
+                builder.Append("<CriticRating>" + SecurityElement.Escape(item.CriticRating.Value.ToString(UsCulture)) + "</CriticRating>");
+            }
 
-                if (!string.IsNullOrEmpty(hasCriticRating.CriticRatingSummary))
-                {
-                    builder.Append("<CriticRatingSummary><![CDATA[" + hasCriticRating.CriticRatingSummary + "]]></CriticRatingSummary>");
-                }
+            if (!string.IsNullOrEmpty(item.CriticRatingSummary))
+            {
+                builder.Append("<CriticRatingSummary><![CDATA[" + item.CriticRatingSummary + "]]></CriticRatingSummary>");
             }
 
             if (!string.IsNullOrEmpty(item.Overview))
@@ -285,14 +281,10 @@ namespace MediaBrowser.LocalMetadata.Savers
                     builder.Append("<OriginalTitle>" + SecurityElement.Escape(hasOriginalTitle.OriginalTitle) + "</OriginalTitle>");
                 }
             }
-            
-            var hasShortOverview = item as IHasShortOverview;
-            if (hasShortOverview != null)
+
+            if (!string.IsNullOrEmpty(item.ShortOverview))
             {
-                if (!string.IsNullOrEmpty(hasShortOverview.ShortOverview))
-                {
-                    builder.Append("<ShortOverview><![CDATA[" + hasShortOverview.ShortOverview + "]]></ShortOverview>");
-                }
+                builder.Append("<ShortOverview><![CDATA[" + item.ShortOverview + "]]></ShortOverview>");
             }
 
             if (!string.IsNullOrEmpty(item.CustomRating))
diff --git a/MediaBrowser.Providers/Manager/ImageSaver.cs b/MediaBrowser.Providers/Manager/ImageSaver.cs
index 5203adc9d1..7e1fa89847 100644
--- a/MediaBrowser.Providers/Manager/ImageSaver.cs
+++ b/MediaBrowser.Providers/Manager/ImageSaver.cs
@@ -72,7 +72,7 @@ namespace MediaBrowser.Providers.Manager
             return SaveImage(item, source, mimeType, type, imageIndex, null, cancellationToken);
         }
 
-        public async Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
+        public async Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken)
         {
             if (string.IsNullOrEmpty(mimeType))
             {
@@ -109,9 +109,9 @@ namespace MediaBrowser.Providers.Manager
                     }
                 }
             }
-            if (!string.IsNullOrEmpty(internalCacheKey))
+            if (saveLocallyWithMedia.HasValue && !saveLocallyWithMedia.Value)
             {
-                saveLocally = false;
+                saveLocally = saveLocallyWithMedia.Value;
             }
 
             if (!imageIndex.HasValue && item.AllowsMultipleImages(type))
diff --git a/MediaBrowser.Providers/Manager/ItemImageProvider.cs b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
index 87da835dcc..898fa522df 100644
--- a/MediaBrowser.Providers/Manager/ItemImageProvider.cs
+++ b/MediaBrowser.Providers/Manager/ItemImageProvider.cs
@@ -156,14 +156,14 @@ namespace MediaBrowser.Providers.Manager
 
                                     var stream = _fileSystem.GetFileStream(response.Path, FileMode.Open, FileAccess.Read, FileShare.Read, true);
 
-                                    await _providerManager.SaveImage(item, stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
+                                    await _providerManager.SaveImage(item, stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
                                 }
                             }
                             else
                             {
                                 var mimeType = "image/" + response.Format.ToString().ToLower();
 
-                                await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, response.InternalCacheKey, cancellationToken).ConfigureAwait(false);
+                                await _providerManager.SaveImage(item, response.Stream, mimeType, imageType, null, cancellationToken).ConfigureAwait(false);
                             }
 
                             downloadedImages.Add(imageType);
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index c470f55f2b..41cacbe0a8 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -353,19 +353,16 @@ namespace MediaBrowser.Providers.Manager
         {
             var updateType = ItemUpdateType.None;
 
-            if (isFullRefresh || currentUpdateType > ItemUpdateType.None)
+            var folder = item as Folder;
+            if (folder != null && folder.SupportsDateLastMediaAdded)
             {
-                var folder = item as Folder;
-                if (folder != null && folder.SupportsDateLastMediaAdded)
-                {
-                    var items = folder.GetRecursiveChildren(i => !i.IsFolder).Select(i => i.DateCreated).ToList();
-                    var date = items.Count == 0 ? (DateTime?)null : items.Max();
+                var items = folder.GetRecursiveChildren(i => !i.IsFolder).Select(i => i.DateCreated).ToList();
+                var date = items.Count == 0 ? (DateTime?)null : items.Max();
 
-                    if ((!folder.DateLastMediaAdded.HasValue && date.HasValue) || folder.DateLastMediaAdded != date)
-                    {
-                        folder.DateLastMediaAdded = date;
-                        updateType = ItemUpdateType.MetadataEdit;
-                    }
+                if ((!folder.DateLastMediaAdded.HasValue && date.HasValue) || folder.DateLastMediaAdded != date)
+                {
+                    folder.DateLastMediaAdded = date;
+                    updateType = ItemUpdateType.MetadataImport;
                 }
             }
 
diff --git a/MediaBrowser.Providers/Manager/ProviderManager.cs b/MediaBrowser.Providers/Manager/ProviderManager.cs
index ae1d60eb9f..dfeceed7d4 100644
--- a/MediaBrowser.Providers/Manager/ProviderManager.cs
+++ b/MediaBrowser.Providers/Manager/ProviderManager.cs
@@ -140,12 +140,7 @@ namespace MediaBrowser.Providers.Manager
             return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, source, mimeType, type, imageIndex, cancellationToken);
         }
 
-        public Task SaveImage(IHasImages item, Stream source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
-        {
-            return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, source, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
-        }
-
-        public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, string internalCacheKey, CancellationToken cancellationToken)
+        public Task SaveImage(IHasImages item, string source, string mimeType, ImageType type, int? imageIndex, bool? saveLocallyWithMedia, CancellationToken cancellationToken)
         {
             if (string.IsNullOrWhiteSpace(source))
             {
@@ -154,7 +149,7 @@ namespace MediaBrowser.Providers.Manager
 
             var fileStream = _fileSystem.GetFileStream(source, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, true);
 
-            return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, fileStream, mimeType, type, imageIndex, internalCacheKey, cancellationToken);
+            return new ImageSaver(ConfigurationManager, _libraryMonitor, _fileSystem, _logger, _memoryStreamProvider).SaveImage(item, fileStream, mimeType, type, imageIndex, saveLocallyWithMedia, cancellationToken);
         }
 
         public async Task<IEnumerable<RemoteImageInfo>> GetAvailableRemoteImages(IHasImages item, RemoteImageQuery query, CancellationToken cancellationToken)
diff --git a/MediaBrowser.Providers/Manager/ProviderUtils.cs b/MediaBrowser.Providers/Manager/ProviderUtils.cs
index fabe08f334..178e861a30 100644
--- a/MediaBrowser.Providers/Manager/ProviderUtils.cs
+++ b/MediaBrowser.Providers/Manager/ProviderUtils.cs
@@ -236,15 +236,9 @@ namespace MediaBrowser.Providers.Manager
 
         private static void MergeShortOverview(BaseItem source, BaseItem target, List<MetadataFields> lockedFields, bool replaceData)
         {
-            var sourceHasShortOverview = source as IHasShortOverview;
-            var targetHasShortOverview = target as IHasShortOverview;
-
-            if (sourceHasShortOverview != null && targetHasShortOverview != null)
+            if (replaceData || string.IsNullOrEmpty(target.ShortOverview))
             {
-                if (replaceData || string.IsNullOrEmpty(targetHasShortOverview.ShortOverview))
-                {
-                    targetHasShortOverview.ShortOverview = sourceHasShortOverview.ShortOverview;
-                }
+                target.ShortOverview = source.ShortOverview;
             }
         }
 
@@ -311,20 +305,14 @@ namespace MediaBrowser.Providers.Manager
 
         private static void MergeCriticRating(BaseItem source, BaseItem target, List<MetadataFields> lockedFields, bool replaceData)
         {
-            var sourceCast = source as IHasCriticRating;
-            var targetCast = target as IHasCriticRating;
-
-            if (sourceCast != null && targetCast != null)
+            if (replaceData || !target.CriticRating.HasValue)
             {
-                if (replaceData || !targetCast.CriticRating.HasValue)
-                {
-                    targetCast.CriticRating = sourceCast.CriticRating;
-                }
+                target.CriticRating = source.CriticRating;
+            }
 
-                if (replaceData || string.IsNullOrEmpty(targetCast.CriticRatingSummary))
-                {
-                    targetCast.CriticRatingSummary = sourceCast.CriticRatingSummary;
-                }
+            if (replaceData || string.IsNullOrEmpty(target.CriticRatingSummary))
+            {
+                target.CriticRatingSummary = source.CriticRatingSummary;
             }
         }
 
diff --git a/MediaBrowser.Providers/Omdb/OmdbProvider.cs b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
index f3766f007b..8fb4d8fccf 100644
--- a/MediaBrowser.Providers/Omdb/OmdbProvider.cs
+++ b/MediaBrowser.Providers/Omdb/OmdbProvider.cs
@@ -66,28 +66,24 @@ namespace MediaBrowser.Providers.Omdb
                     item.ProductionYear = year;
                 }
 
-                var hasCriticRating = item as IHasCriticRating;
-                if (hasCriticRating != null)
-                {
-                    // Seeing some bogus RT data on omdb for series, so filter it out here
-                    // RT doesn't even have tv series
-                    int tomatoMeter;
+            // Seeing some bogus RT data on omdb for series, so filter it out here
+            // RT doesn't even have tv series
+            int tomatoMeter;
 
-                    if (!string.IsNullOrEmpty(result.tomatoMeter)
-                        && int.TryParse(result.tomatoMeter, NumberStyles.Integer, _usCulture, out tomatoMeter)
-                        && tomatoMeter >= 0)
-                    {
-                        hasCriticRating.CriticRating = tomatoMeter;
-                    }
+            if (!string.IsNullOrEmpty(result.tomatoMeter)
+                && int.TryParse(result.tomatoMeter, NumberStyles.Integer, _usCulture, out tomatoMeter)
+                && tomatoMeter >= 0)
+            {
+                item.CriticRating = tomatoMeter;
+            }
 
-                    if (!string.IsNullOrEmpty(result.tomatoConsensus)
-                        && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase))
-                    {
-                        hasCriticRating.CriticRatingSummary = WebUtility.HtmlDecode(result.tomatoConsensus);
-                    }
-                }
+            if (!string.IsNullOrEmpty(result.tomatoConsensus)
+                && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase))
+            {
+                item.CriticRatingSummary = WebUtility.HtmlDecode(result.tomatoConsensus);
+            }
 
-                int voteCount;
+            int voteCount;
 
                 if (!string.IsNullOrEmpty(result.imdbVotes)
                     && int.TryParse(result.imdbVotes, NumberStyles.Number, _usCulture, out voteCount)
@@ -167,25 +163,21 @@ namespace MediaBrowser.Providers.Omdb
                 item.ProductionYear = year;
             }
 
-            var hasCriticRating = item as IHasCriticRating;
-            if (hasCriticRating != null)
-            {
-                // Seeing some bogus RT data on omdb for series, so filter it out here
-                // RT doesn't even have tv series
-                int tomatoMeter;
+            // Seeing some bogus RT data on omdb for series, so filter it out here
+            // RT doesn't even have tv series
+            int tomatoMeter;
 
-                if (!string.IsNullOrEmpty(result.tomatoMeter)
-                    && int.TryParse(result.tomatoMeter, NumberStyles.Integer, _usCulture, out tomatoMeter)
-                    && tomatoMeter >= 0)
-                {
-                    hasCriticRating.CriticRating = tomatoMeter;
-                }
+            if (!string.IsNullOrEmpty(result.tomatoMeter)
+                && int.TryParse(result.tomatoMeter, NumberStyles.Integer, _usCulture, out tomatoMeter)
+                && tomatoMeter >= 0)
+            {
+                item.CriticRating = tomatoMeter;
+            }
 
-                if (!string.IsNullOrEmpty(result.tomatoConsensus)
-                    && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase))
-                {
-                    hasCriticRating.CriticRatingSummary = WebUtility.HtmlDecode(result.tomatoConsensus);
-                }
+            if (!string.IsNullOrEmpty(result.tomatoConsensus)
+                && !string.Equals(result.tomatoConsensus, "No consensus yet.", StringComparison.OrdinalIgnoreCase))
+            {
+                item.CriticRatingSummary = WebUtility.HtmlDecode(result.tomatoConsensus);
             }
 
             int voteCount;
@@ -420,12 +412,8 @@ namespace MediaBrowser.Providers.Omdb
                 hasAwards.AwardSummary = WebUtility.HtmlDecode(result.Awards);
             }
 
-            var hasShortOverview = item as IHasShortOverview;
-            if (hasShortOverview != null)
-            {
-                // Imdb plots are usually pretty short
-                hasShortOverview.ShortOverview = result.Plot;
-            }
+            // Imdb plots are usually pretty short
+            item.ShortOverview = result.Plot;
 
             //if (!string.IsNullOrWhiteSpace(result.Director))
             //{
diff --git a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
index b2302cf867..a45d7ae5f1 100644
--- a/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
+++ b/MediaBrowser.Server.Implementations/Library/LibraryManager.cs
@@ -2838,7 +2838,7 @@ namespace MediaBrowser.Server.Implementations.Library
 
         private bool ValidateNetworkPath(string path)
         {
-            if (Environment.OSVersion.Platform == PlatformID.Win32NT || !path.StartsWith("\\\\", StringComparison.OrdinalIgnoreCase))
+            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
             {
                 return Directory.Exists(path);
             }
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index 9b69b84d36..0939d1c6b2 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -1854,23 +1854,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
                         ParentIndexNumber = program.SeasonNumber.Value,
                         IndexNumber = program.EpisodeNumber.Value,
                         AncestorIds = seriesIds,
-                        ExcludeLocationTypes = new[] { LocationType.Virtual }
-                    });
-
-                    if (result.TotalRecordCount > 0)
-                    {
-                        return true;
-                    }
-                }
-
-                if (!string.IsNullOrWhiteSpace(program.EpisodeTitle))
-                {
-                    var result = _libraryManager.GetItemsResult(new InternalItemsQuery
-                    {
-                        IncludeItemTypes = new[] { typeof(Episode).Name },
-                        Name = program.EpisodeTitle,
-                        AncestorIds = seriesIds,
-                        ExcludeLocationTypes = new[] { LocationType.Virtual }
+                        IsVirtualItem = false
                     });
 
                     if (result.TotalRecordCount > 0)
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs
index 8c46b45972..c7a2d295d9 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvDtoService.cs
@@ -72,7 +72,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
             {
                 dto.ProgramInfo = _dtoService.GetBaseItemDto(program, new DtoOptions());
 
-                dto.ProgramInfo.TimerId = dto.Id;
+                if (info.Status != RecordingStatus.Cancelled && info.Status != RecordingStatus.Error)
+                {
+                    dto.ProgramInfo.TimerId = dto.Id;
+                    dto.ProgramInfo.Status = info.Status.ToString();
+                }
 
                 dto.ProgramInfo.SeriesTimerId = dto.SeriesTimerId;
             }
diff --git a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
index abf0f34255..22d7ba3bec 100644
--- a/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
+++ b/MediaBrowser.Server.Implementations/Photos/BaseDynamicImageProvider.cs
@@ -144,7 +144,7 @@ namespace MediaBrowser.Server.Implementations.Photos
                 return ItemUpdateType.None;
             }
 
-            await ProviderManager.SaveImage(item, outputPath, "image/png", imageType, null, Guid.NewGuid().ToString("N"), cancellationToken).ConfigureAwait(false);
+            await ProviderManager.SaveImage(item, outputPath, "image/png", imageType, null, false, cancellationToken).ConfigureAwait(false);
 
             return ItemUpdateType.ImageUpdate;
         }
diff --git a/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs b/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs
index d01f7ed1b3..9484130cbc 100644
--- a/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs
+++ b/MediaBrowser.Server.Implementations/Sorting/CriticRatingComparer.cs
@@ -22,9 +22,7 @@ namespace MediaBrowser.Server.Implementations.Sorting
 
         private float GetValue(BaseItem x)
         {
-            var hasCriticRating = x as IHasCriticRating;
-
-            return hasCriticRating == null ? 0 : hasCriticRating.CriticRating ?? 0;
+            return x.CriticRating ?? 0;
         }
 
         /// <summary>
diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
index 8c45b8001d..59f6e87220 100644
--- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
+++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs
@@ -294,14 +294,12 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                     {
                         var text = reader.ReadElementContentAsString();
 
-                        var hasCriticRating = item as IHasCriticRating;
-
-                        if (hasCriticRating != null && !string.IsNullOrEmpty(text))
+                        if (!string.IsNullOrEmpty(text))
                         {
                             float value;
                             if (float.TryParse(text, NumberStyles.Any, _usCulture, out value))
                             {
-                                hasCriticRating.CriticRating = value;
+                                item.CriticRating = value;
                             }
                         }
 
@@ -388,12 +386,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 
                         if (!string.IsNullOrWhiteSpace(val))
                         {
-                            var hasShortOverview = item as IHasShortOverview;
-
-                            if (hasShortOverview != null)
-                            {
-                                hasShortOverview.ShortOverview = val;
-                            }
+                            item.ShortOverview = val;
                         }
                         break;
                     }
@@ -418,12 +411,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 
                         if (!string.IsNullOrWhiteSpace(val))
                         {
-                            var hasCriticRating = item as IHasCriticRating;
-
-                            if (hasCriticRating != null)
-                            {
-                                hasCriticRating.CriticRatingSummary = val;
-                            }
+                            item.CriticRatingSummary = val;
                         }
 
                         break;