diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 1e46aa9e56..4925bcd8ad 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -1083,6 +1083,23 @@ namespace MediaBrowser.Controller.Entities
return IsParentalAllowed(user);
}
+ public virtual bool IsVisibleStandalone(User user)
+ {
+ if (!IsVisible(user))
+ {
+ return false;
+ }
+
+ if (Parents.Any(i => !i.IsVisible(user)))
+ {
+ return false;
+ }
+
+ // TODO: Need some work here, e.g. is in user library, for channels, can user access channel, etc.
+
+ return true;
+ }
+
///
/// Gets a value indicating whether this instance is folder.
///
diff --git a/MediaBrowser.Model/Sync/SyncDataRequest.cs b/MediaBrowser.Model/Sync/SyncDataRequest.cs
index 3eb447b3f2..dc33239a04 100644
--- a/MediaBrowser.Model/Sync/SyncDataRequest.cs
+++ b/MediaBrowser.Model/Sync/SyncDataRequest.cs
@@ -5,12 +5,14 @@ namespace MediaBrowser.Model.Sync
public class SyncDataRequest
{
public List LocalItemIds { get; set; }
+ public List OfflineUserIds { get; set; }
public string TargetId { get; set; }
public SyncDataRequest()
{
LocalItemIds = new List();
+ OfflineUserIds = new List();
}
}
}
diff --git a/MediaBrowser.Model/Sync/SyncDataResponse.cs b/MediaBrowser.Model/Sync/SyncDataResponse.cs
index ac7ff5c84a..3799e94557 100644
--- a/MediaBrowser.Model/Sync/SyncDataResponse.cs
+++ b/MediaBrowser.Model/Sync/SyncDataResponse.cs
@@ -5,10 +5,12 @@ namespace MediaBrowser.Model.Sync
public class SyncDataResponse
{
public List ItemIdsToRemove { get; set; }
+ public Dictionary> ItemUserAccess { get; set; }
public SyncDataResponse()
{
ItemIdsToRemove = new List();
+ ItemUserAccess = new Dictionary>();
}
}
}
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index 74069e5801..33c3b97dc9 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -147,7 +147,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var currentUser = user;
channels = channels
- .Where(i => i.IsParentalAllowed(currentUser))
+ .Where(i => i.IsVisible(currentUser))
.OrderBy(i =>
{
double number = 0;
@@ -679,7 +679,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
// Avoid implicitly captured closure
var currentUser = user;
- programs = programs.Where(i => i.IsParentalAllowed(currentUser));
+ programs = programs.Where(i => i.IsVisible(currentUser));
}
var programList = programs.ToList();
@@ -714,7 +714,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv
// Avoid implicitly captured closure
var currentUser = user;
- programs = programs.Where(i => i.IsParentalAllowed(currentUser));
+ programs = programs.Where(i => i.IsVisible(currentUser));
if (query.IsAiring.HasValue)
{
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
index 6a4bc9cc44..749730f827 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs
@@ -314,6 +314,10 @@ namespace MediaBrowser.Server.Implementations.Sync
try
{
_fileSystem.DeleteDirectory(path, true);
+ }
+ catch (DirectoryNotFoundException)
+ {
+
}
catch (Exception ex)
{
@@ -664,9 +668,48 @@ namespace MediaBrowser.Server.Implementations.Sync
response.ItemIdsToRemove = response.ItemIdsToRemove.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
+ var itemsOnDevice = request.LocalItemIds
+ .Except(response.ItemIdsToRemove)
+ .ToList();
+
+ SetUserAccess(request, response, itemsOnDevice);
+
return response;
}
+ private void SetUserAccess(SyncDataRequest request, SyncDataResponse response, List itemIds)
+ {
+ var users = request.OfflineUserIds
+ .Select(_userManager.GetUserById)
+ .Where(i => i != null)
+ .ToList();
+
+ foreach (var itemId in itemIds)
+ {
+ var item = _libraryManager.GetItemById(itemId);
+
+ if (item != null)
+ {
+ var usersWithAccess = new List();
+
+ foreach (var user in users)
+ {
+ if (IsUserVisible(item, user))
+ {
+ usersWithAccess.Add(user);
+ }
+ }
+
+ response.ItemUserAccess[itemId] = users.Select(i => i.Id.ToString("N")).ToList();
+ }
+ }
+ }
+
+ private bool IsUserVisible(BaseItem item, User user)
+ {
+ return item.IsVisibleStandalone(user);
+ }
+
private bool IsLibraryItemAvailable(BaseItem item)
{
if (item == null)
@@ -723,6 +766,10 @@ namespace MediaBrowser.Server.Implementations.Sync
try
{
_fileSystem.DeleteDirectory(path, true);
+ }
+ catch (DirectoryNotFoundException)
+ {
+
}
catch (Exception ex)
{
diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
index a101f13eb3..85317cb237 100644
--- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
+++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs
@@ -407,7 +407,6 @@ namespace MediaBrowser.Server.Implementations.Sync
if (!string.IsNullOrWhiteSpace(query.TargetId))
{
whereClauses.Add("TargetId=@TargetId");
- cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
}
if (!string.IsNullOrWhiteSpace(query.UserId))
{
@@ -422,7 +421,7 @@ namespace MediaBrowser.Server.Implementations.Sync
var startIndex = query.StartIndex ?? 0;
if (startIndex > 0)
{
- whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY DateLastModified DESC LIMIT {0})",
+ whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC LIMIT {0})",
startIndex.ToString(_usCulture)));
}
@@ -431,7 +430,8 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray());
}
- cmd.CommandText += " ORDER BY DateLastModified DESC";
+ cmd.CommandText += " ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC";
+ cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
if (query.Limit.HasValue)
{
diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec
index 271bc7864a..3a5cf888da 100644
--- a/Nuget/MediaBrowser.Common.Internal.nuspec
+++ b/Nuget/MediaBrowser.Common.Internal.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Common.Internal
- 3.0.551
+ 3.0.552
MediaBrowser.Common.Internal
Luke
ebr,Luke,scottisafool
@@ -12,7 +12,7 @@
Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.
Copyright © Media Browser 2013
-
+
diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec
index 31d2c918c1..d879b37f1d 100644
--- a/Nuget/MediaBrowser.Common.nuspec
+++ b/Nuget/MediaBrowser.Common.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Common
- 3.0.551
+ 3.0.552
MediaBrowser.Common
Media Browser Team
ebr,Luke,scottisafool
diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec
index e202c66fa5..04b6126bba 100644
--- a/Nuget/MediaBrowser.Model.Signed.nuspec
+++ b/Nuget/MediaBrowser.Model.Signed.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Model.Signed
- 3.0.551
+ 3.0.552
MediaBrowser.Model - Signed Edition
Media Browser Team
ebr,Luke,scottisafool
diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec
index 34df8a8548..443e07efe0 100644
--- a/Nuget/MediaBrowser.Server.Core.nuspec
+++ b/Nuget/MediaBrowser.Server.Core.nuspec
@@ -2,7 +2,7 @@
MediaBrowser.Server.Core
- 3.0.551
+ 3.0.552
Media Browser.Server.Core
Media Browser Team
ebr,Luke,scottisafool
@@ -12,7 +12,7 @@
Contains core components required to build plugins for Media Browser Server.
Copyright © Media Browser 2013
-
+