diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-07-05 10:54:14 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-07-05 10:54:14 -0400 |
| commit | dc21adf1a4c832e057d7ec91901e528d3100868e (patch) | |
| tree | 0002f20bd730475ed042e7fcd9e384c4a107a802 | |
| parent | ae559e0ed11450cb737dfd40d41fead5d021ae48 (diff) | |
beginnings of offline support
| -rw-r--r-- | MediaBrowser.Controller/Entities/BaseItem.cs | 21 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Entities/Folder.cs | 42 | ||||
| -rw-r--r-- | MediaBrowser.Controller/Providers/BaseMetadataProvider.cs | 15 | ||||
| -rw-r--r-- | MediaBrowser.Model/Entities/LocationType.cs | 6 |
4 files changed, 71 insertions, 13 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index 1cbe5b635..794ff86fd 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/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; })); diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs index 297d513e5..cab3058ef 100644 --- a/MediaBrowser.Controller/Entities/Folder.cs +++ b/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; } } @@ -836,6 +844,28 @@ namespace MediaBrowser.Controller.Entities } /// <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> /// <returns>IEnumerable{BaseItem}.</returns> @@ -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> diff --git a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs b/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs index a8540f4bd..a05266b0c 100644 --- a/MediaBrowser.Controller/Providers/BaseMetadataProvider.cs +++ b/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; + } } } } diff --git a/MediaBrowser.Model/Entities/LocationType.cs b/MediaBrowser.Model/Entities/LocationType.cs index 3adf03024..e6c2a843b 100644 --- a/MediaBrowser.Model/Entities/LocationType.cs +++ b/MediaBrowser.Model/Entities/LocationType.cs @@ -17,6 +17,10 @@ namespace MediaBrowser.Model.Entities /// <summary> /// The virtual /// </summary> - Virtual + Virtual, + /// <summary> + /// The offline + /// </summary> + Offline } } |
