Explorar el Código

fix refresh of tv recordings

Luke Pulverenti hace 11 años
padre
commit
cf9ef0e43d
Se han modificado 34 ficheros con 88 adiciones y 187 borrados
  1. 1 11
      MediaBrowser.Api/Library/LibraryService.cs
  2. 5 9
      MediaBrowser.Api/LibraryService.cs
  3. 10 0
      MediaBrowser.Controller/Entities/BaseItem.cs
  4. 6 39
      MediaBrowser.Controller/Entities/Folder.cs
  5. 6 0
      MediaBrowser.Controller/Entities/IHasImages.cs
  6. 2 2
      MediaBrowser.Controller/Entities/TV/Episode.cs
  7. 16 2
      MediaBrowser.Controller/Entities/UserRootFolder.cs
  8. 0 13
      MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
  9. 0 13
      MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
  10. 1 11
      MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs
  11. 3 4
      MediaBrowser.Providers/All/LocalImageProvider.cs
  12. 6 1
      MediaBrowser.Providers/BaseXmlProvider.cs
  13. 1 1
      MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs
  14. 2 6
      MediaBrowser.Providers/Manager/ImageSaver.cs
  15. 1 1
      MediaBrowser.Providers/Manager/ProviderManager.cs
  16. 1 1
      MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs
  17. 1 2
      MediaBrowser.Providers/Savers/AlbumXmlSaver.cs
  18. 1 2
      MediaBrowser.Providers/Savers/ArtistXmlSaver.cs
  19. 1 2
      MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs
  20. 1 2
      MediaBrowser.Providers/Savers/ChannelXmlSaver.cs
  21. 1 2
      MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs
  22. 1 2
      MediaBrowser.Providers/Savers/FolderXmlSaver.cs
  23. 1 2
      MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs
  24. 1 2
      MediaBrowser.Providers/Savers/GameXmlSaver.cs
  25. 1 2
      MediaBrowser.Providers/Savers/MovieXmlSaver.cs
  26. 1 2
      MediaBrowser.Providers/Savers/PersonXmlSaver.cs
  27. 1 2
      MediaBrowser.Providers/Savers/SeasonXmlSaver.cs
  28. 1 2
      MediaBrowser.Providers/Savers/SeriesXmlSaver.cs
  29. 1 24
      MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs
  30. 10 0
      MediaBrowser.Providers/TV/EpisodeXmlProvider.cs
  31. 2 3
      MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
  32. 0 1
      MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs
  33. 1 16
      MediaBrowser.Server.Implementations/Library/LibraryManager.cs
  34. 1 5
      MediaBrowser.Server.Implementations/Session/SessionManager.cs

+ 1 - 11
MediaBrowser.Api/Library/LibraryService.cs

@@ -69,17 +69,7 @@ namespace MediaBrowser.Api.Library
         public object Get(GetPhyscialPaths request)
         {
             var result = _libraryManager.RootFolder.Children
-                .SelectMany(c =>
-                {
-                    var locationType = c.LocationType;
-
-                    if (locationType != LocationType.Remote && locationType != LocationType.Virtual)
-                    {
-                        return c.PhysicalLocations;
-                    }
-
-                    return new List<string>();
-                })
+                .SelectMany(c => c.PhysicalLocations)
                 .ToList();
 
             return ToOptimizedSerializedResultUsingCache(result);

+ 5 - 9
MediaBrowser.Api/LibraryService.cs

@@ -243,8 +243,8 @@ namespace MediaBrowser.Api
         public object Get(GetFile request)
         {
             var item = _dtoService.GetItemByDtoId(request.Id);
-
-            if (item.LocationType == LocationType.Remote || item.LocationType == LocationType.Virtual)
+            var locationType = item.LocationType;
+            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
             {
                 throw new ArgumentException("This command cannot be used for remote or virtual items.");
             }
@@ -331,8 +331,7 @@ namespace MediaBrowser.Api
         {
             if (item.Parent is AggregateFolder)
             {
-                return user.RootFolder.GetChildren(user, true).FirstOrDefault(i => i.LocationType == LocationType.FileSystem &&
-                                                                                   i.PhysicalLocations.Contains(item.Path));
+                return user.RootFolder.GetChildren(user, true).FirstOrDefault(i => i.PhysicalLocations.Contains(item.Path));
             }
 
             return item;
@@ -442,12 +441,9 @@ namespace MediaBrowser.Api
 
             var parent = item.Parent;
 
-            if (item.LocationType == LocationType.Offline)
-            {
-                throw new InvalidOperationException(string.Format("{0} is currently offline.", item.Name));
-            }
+            var locationType = item.LocationType;
 
-            if (item.LocationType == LocationType.FileSystem)
+            if (locationType == LocationType.FileSystem || locationType == LocationType.Offline)
             {
                 foreach (var path in item.GetDeletePaths().ToList())
                 {

+ 10 - 0
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -157,6 +157,16 @@ namespace MediaBrowser.Controller.Entities
             }
         }
 
+        public virtual bool SupportsLocalMetadata
+        {
+            get
+            {
+                var locationType = LocationType;
+
+                return locationType == LocationType.FileSystem || locationType == LocationType.Offline;
+            }
+        }
+
         /// <summary>
         /// This is just a helper for convenience
         /// </summary>

+ 6 - 39
MediaBrowser.Controller/Entities/Folder.cs

@@ -1052,50 +1052,17 @@ namespace MediaBrowser.Controller.Entities
                 throw new ArgumentNullException();
             }
 
-            try
+            if (string.Equals(Path, path, StringComparison.OrdinalIgnoreCase))
             {
-                var locationType = LocationType;
-
-                if (locationType == LocationType.Remote && string.Equals(Path, path, StringComparison.OrdinalIgnoreCase))
-                {
-                    return this;
-                }
-
-                if (locationType != LocationType.Virtual && PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
-                {
-                    return this;
-                }
-            }
-            catch (IOException ex)
-            {
-                Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
+                return this;
             }
 
-            return RecursiveChildren.Where(i => i.LocationType != LocationType.Virtual).FirstOrDefault(i =>
+            if (PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
             {
-                try
-                {
-                    if (string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase))
-                    {
-                        return true;
-                    }
-
-                    if (i.LocationType != LocationType.Remote)
-                    {
-                        if (i.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase))
-                        {
-                            return true;
-                        }
-                    }
+                return this;
+            }
 
-                    return false;
-                }
-                catch (IOException ex)
-                {
-                    Logger.ErrorException("Error getting ResolveArgs for {0}", ex, Path);
-                    return false;
-                }
-            });
+            return RecursiveChildren.FirstOrDefault(i => string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase) || i.PhysicalLocations.Contains(path, StringComparer.OrdinalIgnoreCase));
         }
 
         public override bool IsPlayed(User user)

+ 6 - 0
MediaBrowser.Controller/Entities/IHasImages.cs

@@ -136,6 +136,12 @@ namespace MediaBrowser.Controller.Entities
         /// </summary>
         /// <returns><c>true</c> if [is save local metadata enabled]; otherwise, <c>false</c>.</returns>
         bool IsSaveLocalMetadataEnabled();
+
+        /// <summary>
+        /// Gets a value indicating whether [supports local metadata].
+        /// </summary>
+        /// <value><c>true</c> if [supports local metadata]; otherwise, <c>false</c>.</value>
+        bool SupportsLocalMetadata { get; }
     }
 
     public static class HasImagesExtensions

+ 2 - 2
MediaBrowser.Controller/Entities/TV/Episode.cs

@@ -185,7 +185,7 @@ namespace MediaBrowser.Controller.Entities.TV
         {
             get
             {
-                return LocationType == Model.Entities.LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value < DateTime.UtcNow;
+                return LocationType == LocationType.Virtual && PremiereDate.HasValue && PremiereDate.Value < DateTime.UtcNow;
             }
         }
 
@@ -198,7 +198,7 @@ namespace MediaBrowser.Controller.Entities.TV
         [IgnoreDataMember]
         public bool IsVirtualUnaired
         {
-            get { return LocationType == Model.Entities.LocationType.Virtual && IsUnaired; }
+            get { return LocationType == LocationType.Virtual && IsUnaired; }
         }
 
         [IgnoreDataMember]

+ 16 - 2
MediaBrowser.Controller/Entities/UserRootFolder.cs

@@ -1,6 +1,7 @@
-using System.Collections.Generic;
-using System.Linq;
+using MediaBrowser.Controller.Library;
 using MediaBrowser.Controller.Providers;
+using System.Collections.Generic;
+using System.Linq;
 
 namespace MediaBrowser.Controller.Entities
 {
@@ -18,5 +19,18 @@ namespace MediaBrowser.Controller.Entities
         {
             return base.GetNonCachedChildren(directoryService).Concat(LibraryManager.RootFolder.VirtualChildren);
         }
+
+        public override ItemUpdateType BeforeMetadataRefresh()
+        {
+            var updateType = base.BeforeMetadataRefresh();
+
+            if (string.Equals("default", Name, System.StringComparison.OrdinalIgnoreCase))
+            {
+                Name = "Default Media Library";
+                updateType = updateType | ItemUpdateType.MetadataEdit;
+            }
+
+            return updateType;
+        }
     }
 }

+ 0 - 13
MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs

@@ -25,19 +25,6 @@ namespace MediaBrowser.Controller.LiveTv
 
         public string ServiceName { get; set; }
 
-        /// <summary>
-        /// Returns the folder containing the item.
-        /// If the item is a folder, it returns the folder itself
-        /// </summary>
-        /// <value>The containing folder path.</value>
-        public override string ContainingFolderPath
-        {
-            get
-            {
-                return Path;
-            }
-        }
-
         /// <summary>
         /// Gets a value indicating whether this instance is owned item.
         /// </summary>

+ 0 - 13
MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs

@@ -46,19 +46,6 @@ namespace MediaBrowser.Controller.LiveTv
             }
         }
 
-        /// <summary>
-        /// Returns the folder containing the item.
-        /// If the item is a folder, it returns the folder itself
-        /// </summary>
-        /// <value>The containing folder path.</value>
-        public override string ContainingFolderPath
-        {
-            get
-            {
-                return Path;
-            }
-        }
-
         /// <summary>
         /// Gets a value indicating whether this instance is owned item.
         /// </summary>

+ 1 - 11
MediaBrowser.Providers/All/InternalMetadataFolderImageProvider.cs

@@ -2,7 +2,6 @@
 using MediaBrowser.Controller.Entities;
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Providers;
-using MediaBrowser.Model.Entities;
 using System.Collections.Generic;
 using System.IO;
 
@@ -35,16 +34,7 @@ namespace MediaBrowser.Providers.All
                 return true;
             }
 
-            var locationType = item.LocationType;
-
-            if (locationType == LocationType.FileSystem ||
-                locationType == LocationType.Offline)
-            {
-                return false;
-            }
-
-            // These always save locally
-            if (item is IItemByName || item is User)
+            if (item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 3 - 4
MediaBrowser.Providers/All/LocalImageProvider.cs

@@ -2,6 +2,7 @@
 using MediaBrowser.Controller.Entities.Audio;
 using MediaBrowser.Controller.Entities.Movies;
 using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.LiveTv;
 using MediaBrowser.Controller.Providers;
 using MediaBrowser.Model.Entities;
 using System;
@@ -26,9 +27,7 @@ namespace MediaBrowser.Providers.All
 
         public bool Supports(IHasImages item)
         {
-            var locationType = item.LocationType;
-
-            if (locationType == LocationType.FileSystem)
+            if (item.SupportsLocalMetadata)
             {
                 // Episode has it's own provider
                 if (item.IsOwnedItem || item is Episode || item is Audio)
@@ -39,7 +38,7 @@ namespace MediaBrowser.Providers.All
                 return true;
             }
 
-            if (locationType == LocationType.Virtual)
+            if (item.LocationType == LocationType.Virtual)
             {
                 var season = item as Season;
 

+ 6 - 1
MediaBrowser.Providers/BaseXmlProvider.cs

@@ -60,9 +60,14 @@ namespace MediaBrowser.Providers
 
         protected abstract FileInfo GetXmlFile(ItemInfo info);
 
+        protected virtual FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+        {
+            return GetXmlFile(info);
+        }
+
         public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
         {
-            var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path });
+            var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path }, directoryService);
 
             if (file == null)
             {

+ 1 - 1
MediaBrowser.Providers/Folders/CollectionFolderImageProvider.cs

@@ -15,7 +15,7 @@ namespace MediaBrowser.Providers.Folders
 
         public bool Supports(IHasImages item)
         {
-            return item is CollectionFolder && item.LocationType == LocationType.FileSystem;
+            return item is CollectionFolder && item.SupportsLocalMetadata;
         }
 
         public int Order

+ 2 - 6
MediaBrowser.Providers/Manager/ImageSaver.cs

@@ -93,13 +93,9 @@ namespace MediaBrowser.Providers.Manager
                 {
                     var series = season.Series;
 
-                    if (series != null)
+                    if (series != null && series.SupportsLocalMetadata)
                     {
-                        var seriesLocationType = series.LocationType;
-                        if (seriesLocationType == LocationType.FileSystem || seriesLocationType == LocationType.Offline)
-                        {
-                            saveLocally = true;
-                        }
+                        saveLocally = true;
                     }
                 }
             }

+ 1 - 1
MediaBrowser.Providers/Manager/ProviderManager.cs

@@ -351,7 +351,7 @@ namespace MediaBrowser.Providers.Manager
                 return false;
             }
 
-            if (item.LocationType != LocationType.FileSystem && provider is ILocalMetadataProvider)
+            if (!item.SupportsLocalMetadata && provider is ILocalMetadataProvider)
             {
                 return false;
             }

+ 1 - 1
MediaBrowser.Providers/MediaInfo/FFProbeProvider.cs

@@ -148,7 +148,7 @@ namespace MediaBrowser.Providers.MediaInfo
                 return true;
             }
 
-            if (item.LocationType == LocationType.FileSystem)
+            if (item.SupportsLocalMetadata)
             {
                 var video = item as Video;
 

+ 1 - 2
MediaBrowser.Providers/Savers/AlbumXmlSaver.cs

@@ -27,8 +27,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/ArtistXmlSaver.cs

@@ -27,8 +27,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/BoxSetXmlSaver.cs

@@ -27,8 +27,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/ChannelXmlSaver.cs

@@ -22,8 +22,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/EpisodeXmlSaver.cs

@@ -31,8 +31,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/FolderXmlSaver.cs

@@ -29,8 +29,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/GameSystemXmlSaver.cs

@@ -27,8 +27,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/GameXmlSaver.cs

@@ -31,8 +31,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/MovieXmlSaver.cs

@@ -41,8 +41,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/PersonXmlSaver.cs

@@ -31,8 +31,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/SeasonXmlSaver.cs

@@ -27,8 +27,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 2
MediaBrowser.Providers/Savers/SeriesXmlSaver.cs

@@ -28,8 +28,7 @@ namespace MediaBrowser.Providers.Savers
         /// <returns><c>true</c> if [is enabled for] [the specified item]; otherwise, <c>false</c>.</returns>
         public bool IsEnabledFor(IHasMetadata item, ItemUpdateType updateType)
         {
-            var locationType = item.LocationType;
-            if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
+            if (!item.SupportsLocalMetadata)
             {
                 return false;
             }

+ 1 - 24
MediaBrowser.Providers/TV/EpisodeLocalImageProvider.cs

@@ -18,7 +18,7 @@ namespace MediaBrowser.Providers.TV
 
         public bool Supports(IHasImages item)
         {
-            return item is Episode && item.LocationType == LocationType.FileSystem;
+            return item is Episode && item.SupportsLocalMetadata;
         }
 
         public List<LocalImageInfo> GetImages(IHasImages item, IDirectoryService directoryService)
@@ -77,28 +77,5 @@ namespace MediaBrowser.Providers.TV
               })
               .ToList();
         }
-
-        private List<LocalImageInfo> GetFilesFromMetadataFolder(string filenameWithoutExtension, IEnumerable<FileInfo> metadataFiles)
-        {
-            return metadataFiles
-              .Where(i =>
-              {
-                  if (BaseItem.SupportedImageExtensions.Contains(i.Extension))
-                  {
-                      if (string.Equals(filenameWithoutExtension, Path.GetFileNameWithoutExtension(i.Name), StringComparison.OrdinalIgnoreCase))
-                      {
-                          return true;
-                      }
-                  }
-
-                  return false;
-              })
-              .Select(i => new LocalImageInfo
-              {
-                  FileInfo = i,
-                  Type = ImageType.Primary
-              })
-              .ToList();
-        }
     }
 }

+ 10 - 0
MediaBrowser.Providers/TV/EpisodeXmlProvider.cs

@@ -30,5 +30,15 @@ namespace MediaBrowser.Providers.TV
 
             return new FileInfo(metadataFile);
         }
+
+        protected override FileInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+        {
+            var metadataPath = Path.GetDirectoryName(info.Path);
+            metadataPath = Path.Combine(metadataPath, "metadata");
+
+            var metadataFile = Path.Combine(metadataPath, Path.ChangeExtension(Path.GetFileName(info.Path), ".xml"));
+
+            return directoryService.GetFile(metadataFile);
+        }
     }
 }

+ 2 - 3
MediaBrowser.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs

@@ -273,8 +273,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
             {
                 if (item.LocationType == LocationType.FileSystem)
                 {
-                    return collections.Where(i => i.LocationType == LocationType.FileSystem &&
-                                                  i.PhysicalLocations.Contains(item.Path)).Cast<T>();
+                    return collections.Where(i => i.PhysicalLocations.Contains(item.Path)).Cast<T>();
                 }
             }
 
@@ -283,7 +282,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
             {
                 if (item.Id == user.RootFolder.Id)
                 {
-                    return new T[] { item };
+                    return new[] { item };
                 }
 
                 return new T[] { };

+ 0 - 1
MediaBrowser.Server.Implementations/IO/LibraryMonitor.cs

@@ -161,7 +161,6 @@ namespace MediaBrowser.Server.Implementations.IO
                 .RootFolder
                 .Children
                 .OfType<Folder>()
-                .Where(i => i.LocationType != LocationType.Remote && i.LocationType != LocationType.Virtual)
                 .SelectMany(f => f.PhysicalLocations)
                 .Distinct(StringComparer.OrdinalIgnoreCase)
                 .OrderBy(i => i)

+ 1 - 16
MediaBrowser.Server.Implementations/Library/LibraryManager.cs

@@ -1399,22 +1399,7 @@ namespace MediaBrowser.Server.Implementations.Library
                 .Distinct()
                 .SelectMany(i => i.Children)
                 .OfType<CollectionFolder>()
-                .Where(i =>
-                {
-                    var locationType = i.LocationType;
-
-                    if (locationType == LocationType.Remote || locationType == LocationType.Virtual)
-                    {
-                        return false;
-                    }
-
-                    if (string.Equals(i.Path, item.Path, StringComparison.OrdinalIgnoreCase))
-                    {
-                        return true;
-                    }
-
-                    return i.PhysicalLocations.Contains(item.Path);
-                })
+                .Where(i => string.Equals(i.Path, item.Path, StringComparison.OrdinalIgnoreCase) || i.PhysicalLocations.Contains(item.Path))
                 .Select(i => i.CollectionType)
                 .Where(i => !string.IsNullOrEmpty(i))
                 .Distinct()

+ 1 - 5
MediaBrowser.Server.Implementations/Session/SessionManager.cs

@@ -615,13 +615,9 @@ namespace MediaBrowser.Server.Implementations.Session
             }
 
             var items = command.ItemIds.Select(i => _libraryManager.GetItemById(new Guid(i)))
+                .Where(i => i.LocationType != LocationType.Virtual)
                 .ToList();
 
-            if (items.Any(i => i.LocationType == LocationType.Virtual))
-            {
-                throw new ArgumentException("Virtual items are not playable.");
-            }
-
             if (command.PlayCommand != PlayCommand.PlayNow)
             {
                 if (items.Any(i => !session.QueueableMediaTypes.Contains(i.MediaType, StringComparer.OrdinalIgnoreCase)))