beginnings of offline support

pull/702/head
Luke Pulverenti 11 years ago
parent ae559e0ed1
commit dc21adf1a4

@ -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;
}));

@ -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>

@ -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;
}
}
}
}

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

Loading…
Cancel
Save