aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-07-05 10:54:14 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-07-05 10:54:14 -0400
commitdc21adf1a4c832e057d7ec91901e528d3100868e (patch)
tree0002f20bd730475ed042e7fcd9e384c4a107a802
parentae559e0ed11450cb737dfd40d41fead5d021ae48 (diff)
beginnings of offline support
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs21
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs42
-rw-r--r--MediaBrowser.Controller/Providers/BaseMetadataProvider.cs15
-rw-r--r--MediaBrowser.Model/Entities/LocationType.cs6
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
}
}