implement sync item removals

This commit is contained in:
Luke Pulverenti 2014-12-30 14:16:01 -05:00
parent 8d10ee581c
commit 5e6354854d
6 changed files with 66 additions and 22 deletions

View File

@ -1,4 +1,5 @@
 using System.Collections.Generic;
namespace MediaBrowser.Model.Sync namespace MediaBrowser.Model.Sync
{ {
public class SyncJobItemQuery public class SyncJobItemQuery
@ -27,6 +28,11 @@ namespace MediaBrowser.Model.Sync
/// Gets or sets the status. /// Gets or sets the status.
/// </summary> /// </summary>
/// <value>The status.</value> /// <value>The status.</value>
public SyncJobItemStatus? Status { get; set; } public List<SyncJobItemStatus> Statuses { get; set; }
public SyncJobItemQuery()
{
Statuses = new List<SyncJobItemStatus>();
}
} }
} }

View File

@ -19,6 +19,7 @@
"TitleMediaBrowser": "Media Browser", "TitleMediaBrowser": "Media Browser",
"ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.", "ThisWizardWillGuideYou": "This wizard will help guide you through the setup process. To begin, please select your preferred language.",
"TellUsAboutYourself": "Tell us about yourself", "TellUsAboutYourself": "Tell us about yourself",
"ButtonQuickStartGuide": "Quick start guide",
"LabelYourFirstName": "Your first name:", "LabelYourFirstName": "Your first name:",
"MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.", "MoreUsersCanBeAddedLater": "More users can be added later within the Dashboard.",
"UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.", "UserProfilesIntro": "Media Browser includes built-in support for user profiles, enabling each user to have their own display settings, playstate and parental controls.",

View File

@ -62,7 +62,7 @@ namespace MediaBrowser.Server.Implementations.Sync
// Respect ItemLimit, if set // Respect ItemLimit, if set
if (job.ItemLimit.HasValue) if (job.ItemLimit.HasValue)
{ {
if (jobItems.Count >= job.ItemLimit.Value) if (jobItems.Count(j => j.Status != SyncJobItemStatus.RemovedFromDevice && j.Status != SyncJobItemStatus.Failed) >= job.ItemLimit.Value)
{ {
break; break;
} }
@ -310,9 +310,10 @@ namespace MediaBrowser.Server.Implementations.Sync
{ {
await EnsureSyncJobs(cancellationToken).ConfigureAwait(false); await EnsureSyncJobs(cancellationToken).ConfigureAwait(false);
// If it already has a converting status then is must have been aborted during conversion
var result = _syncRepo.GetJobItems(new SyncJobItemQuery var result = _syncRepo.GetJobItems(new SyncJobItemQuery
{ {
Status = SyncJobItemStatus.Queued Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Queued, SyncJobItemStatus.Converting }
}); });
var jobItems = result.Items; var jobItems = result.Items;
@ -327,10 +328,7 @@ namespace MediaBrowser.Server.Implementations.Sync
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
if (item.Status == SyncJobItemStatus.Queued) await ProcessJobItem(item, cancellationToken).ConfigureAwait(false);
{
await ProcessJobItem(item, cancellationToken).ConfigureAwait(false);
}
var job = _syncRepo.GetJob(item.JobId); var job = _syncRepo.GetJob(item.JobId);
await UpdateJobStatus(job).ConfigureAwait(false); await UpdateJobStatus(job).ConfigureAwait(false);

View File

@ -392,7 +392,7 @@ namespace MediaBrowser.Server.Implementations.Sync
var jobItemResult = GetJobItems(new SyncJobItemQuery var jobItemResult = GetJobItems(new SyncJobItemQuery
{ {
TargetId = targetId, TargetId = targetId,
Status = SyncJobItemStatus.Transferring Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Transferring }
}); });
return jobItemResult.Items.Select(GetJobItemInfo) return jobItemResult.Items.Select(GetJobItemInfo)
@ -404,21 +404,65 @@ namespace MediaBrowser.Server.Implementations.Sync
var jobItemResult = GetJobItems(new SyncJobItemQuery var jobItemResult = GetJobItems(new SyncJobItemQuery
{ {
TargetId = request.TargetId, TargetId = request.TargetId,
Status = SyncJobItemStatus.Synced Statuses = new List<SyncJobItemStatus> { SyncJobItemStatus.Synced }
}); });
var response = new SyncDataResponse();
foreach (var jobItem in jobItemResult.Items) foreach (var jobItem in jobItemResult.Items)
{ {
if (!request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase)) if (request.LocalItemIds.Contains(jobItem.ItemId, StringComparer.OrdinalIgnoreCase))
{ {
var job = _repo.GetJob(jobItem.JobId);
var user = _userManager.GetUserById(job.UserId);
if (user == null)
{
// Tell the device to remove it since the user is gone now
response.ItemIdsToRemove.Add(jobItem.ItemId);
}
else if (job.UnwatchedOnly)
{
var libraryItem = _libraryManager.GetItemById(jobItem.ItemId);
if (IsLibraryItemAvailable(libraryItem))
{
if (libraryItem.IsPlayed(user) && libraryItem is Video)
{
// Tell the device to remove it since it has been played
response.ItemIdsToRemove.Add(jobItem.ItemId);
}
}
else
{
// Tell the device to remove it since it's no longer available
response.ItemIdsToRemove.Add(jobItem.ItemId);
}
}
}
else
{
// Content is no longer on the device
jobItem.Status = SyncJobItemStatus.RemovedFromDevice; jobItem.Status = SyncJobItemStatus.RemovedFromDevice;
await _repo.Update(jobItem).ConfigureAwait(false); await _repo.Update(jobItem).ConfigureAwait(false);
} }
} }
var response = new SyncDataResponse();
response.ItemIdsToRemove = response.ItemIdsToRemove.Distinct(StringComparer.OrdinalIgnoreCase).ToList();
return response; return response;
} }
private bool IsLibraryItemAvailable(BaseItem item)
{
if (item == null)
{
return false;
}
// TODO: Make sure it hasn't been deleted
return true;
}
} }
} }

View File

@ -467,10 +467,11 @@ namespace MediaBrowser.Server.Implementations.Sync
cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId; cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId;
} }
if (query.Status.HasValue) if (query.Statuses.Count > 0)
{ {
whereClauses.Add("Status=@Status"); var statuses = string.Join(",", query.Statuses.Select(i => "'" + i.ToString() + "'").ToArray());
cmd.Parameters.Add(cmd, "@Status", DbType.String).Value = query.Status.Value.ToString();
whereClauses.Add(string.Format("Status in ({0})", statuses));
} }
var whereTextWithoutPaging = whereClauses.Count == 0 ? var whereTextWithoutPaging = whereClauses.Count == 0 ?

View File

@ -216,15 +216,9 @@
<Content Include="dashboard-ui\css\images\icons\remote.png"> <Content Include="dashboard-ui\css\images\icons\remote.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\css\images\items\folders\edit.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\css\images\items\folders\home.png"> <Content Include="dashboard-ui\css\images\items\folders\home.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\css\images\items\folders\report.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\css\images\icons\audiocd.png"> <Content Include="dashboard-ui\css\images\icons\audiocd.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>