Browse Source

beginnings of offline support

Luke Pulverenti 12 years ago
parent
commit
dc21adf1a4

+ 18 - 3
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -89,6 +89,9 @@ namespace MediaBrowser.Controller.Entities
         /// <value>The path.</value>
         public virtual string Path { get; set; }
 
+        [IgnoreDataMember]
+        protected internal bool IsOffline { get; set; }
+
         /// <summary>
         /// Gets or sets the type of the location.
         /// </summary>
@@ -97,6 +100,11 @@ namespace MediaBrowser.Controller.Entities
         {
             get
             {
+                if (IsOffline)
+                {
+                    return LocationType.Offline;
+                }
+
                 if (string.IsNullOrEmpty(Path))
                 {
                     return LocationType.Virtual;
@@ -649,13 +657,20 @@ namespace MediaBrowser.Controller.Entities
             // Support xbmc trailers (-trailer suffix on video file names)
             files.AddRange(resolveArgs.FileSystemChildren.Where(i =>
             {
-                if ((i.Attributes & FileAttributes.Directory) != FileAttributes.Directory)
+                try
                 {
-                    if (System.IO.Path.GetFileNameWithoutExtension(i.Name).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase))
+                    if ((i.Attributes & FileAttributes.Directory) != FileAttributes.Directory)
                     {
-                        return true;
+                        if (System.IO.Path.GetFileNameWithoutExtension(i.Name).EndsWith(XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) && !string.Equals(Path, i.FullName, StringComparison.OrdinalIgnoreCase))
+                        {
+                            return true;
+                        }
                     }
                 }
+                catch (IOException ex)
+                {
+                    Logger.ErrorException("Error accessing path {0}", ex, i.FullName);
+                }
 
                 return false;
             }));

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

@@ -703,15 +703,23 @@ namespace MediaBrowser.Controller.Entities
 
                 foreach (var item in itemsRemoved)
                 {
-                    BaseItem removed;
-
-                    if (!_children.TryRemove(item.Id, out removed))
+                    if (IsRootPathAvailable(item.Path))
                     {
-                        Logger.Error("Failed to remove {0}", item.Name);
+                        BaseItem removed;
+
+                        if (!_children.TryRemove(item.Id, out removed))
+                        {
+                            Logger.Error("Failed to remove {0}", item.Name);
+                        }
+                        else
+                        {
+                            LibraryManager.ReportItemRemoved(item);
+                        }
+                        item.IsOffline = false;
                     }
                     else
                     {
-                        LibraryManager.ReportItemRemoved(item);
+                        item.IsOffline = true;
                     }
                 }
 
@@ -835,6 +843,28 @@ namespace MediaBrowser.Controller.Entities
             await Task.WhenAll(tasks).ConfigureAwait(false);
         }
 
+        /// <summary>
+        /// Determines if a path's root is available or not
+        /// </summary>
+        /// <param name="path"></param>
+        /// <returns></returns>
+        private bool IsRootPathAvailable(string path)
+        {
+            var parent = System.IO.Path.GetDirectoryName(path);
+
+            while (!string.IsNullOrEmpty(parent) && !parent.ToCharArray()[0].Equals(System.IO.Path.DirectorySeparatorChar))
+            {
+                if (Directory.Exists(parent))
+                {
+                    return true;
+                }
+
+                parent = System.IO.Path.GetDirectoryName(path);
+            }
+
+            return false;
+        }
+
         /// <summary>
         /// Get the children of this folder from the actual file system
         /// </summary>
@@ -973,7 +1003,7 @@ namespace MediaBrowser.Controller.Entities
         {
             var changed = await base.RefreshMetadata(cancellationToken, forceSave, forceRefresh, allowSlowProviders, resetResolveArgs).ConfigureAwait(false);
 
-            return changed || (SupportsLinkedChildren && RefreshLinkedChildren());
+            return changed || (SupportsLinkedChildren && LocationType == LocationType.FileSystem && RefreshLinkedChildren());
         }
 
         /// <summary>

+ 12 - 3
MediaBrowser.Controller/Providers/BaseMetadataProvider.cs

@@ -390,12 +390,21 @@ namespace MediaBrowser.Controller.Providers
         /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
         private bool IncludeInFileStamp(FileSystemInfo file, string[] extensions)
         {
-            if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+            try
             {
-                return false;
+                if ((file.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
+                {
+                    return false;
+                }
+
+                return extensions.Length == 0 || extensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase);
             }
+            catch (IOException ex)
+            {
+                Logger.ErrorException("Error accessing file attributes for {0}", ex, file.FullName);
 
-            return extensions.Length == 0 || extensions.Contains(file.Extension, StringComparer.OrdinalIgnoreCase);
+                return false;
+            }
         }
     }
 }

+ 5 - 1
MediaBrowser.Model/Entities/LocationType.cs

@@ -17,6 +17,10 @@ namespace MediaBrowser.Model.Entities
         /// <summary>
         /// The virtual
         /// </summary>
-        Virtual
+        Virtual,
+        /// <summary>
+        /// The offline
+        /// </summary>
+        Offline
     }
 }