New: Show processing time for pending items on Calendar and Queue

pull/4/head
Mark McDowall 10 years ago
parent 3b26e82644
commit c21ffcb5e4

@ -1,7 +1,6 @@
using System;
using NzbDrone.Api.REST;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Tv;
using NzbDrone.Api.Series;
using NzbDrone.Api.Episodes;
@ -16,6 +15,7 @@ namespace NzbDrone.Api.Queue
public String Title { get; set; }
public Decimal Sizeleft { get; set; }
public TimeSpan? Timeleft { get; set; }
public DateTime? EstimatedCompletionTime { get; set; }
public String Status { get; set; }
public String ErrorMessage { get; set; }
}

@ -29,21 +29,18 @@ namespace NzbDrone.Core.Download.Pending
private readonly IPendingReleaseRepository _repository;
private readonly ISeriesService _seriesService;
private readonly IParsingService _parsingService;
private readonly IDownloadService _downloadService;
private readonly IEventAggregator _eventAggregator;
private readonly Logger _logger;
public PendingReleaseService(IPendingReleaseRepository repository,
ISeriesService seriesService,
IParsingService parsingService,
IDownloadService downloadService,
IEventAggregator eventAggregator,
Logger logger)
{
_repository = repository;
_seriesService = seriesService;
_parsingService = parsingService;
_downloadService = downloadService;
_eventAggregator = eventAggregator;
_logger = logger;
}
@ -141,6 +138,9 @@ namespace NzbDrone.Core.Download.Pending
{
foreach (var episode in pendingRelease.RemoteEpisode.Episodes)
{
var ect = pendingRelease.Release.PublishDate.AddHours(
pendingRelease.RemoteEpisode.Series.Profile.Value.GrabDelay);
var queue = new Queue.Queue
{
Id = episode.Id ^ (pendingRelease.Id << 16),
@ -150,10 +150,8 @@ namespace NzbDrone.Core.Download.Pending
Title = pendingRelease.Title,
Size = pendingRelease.RemoteEpisode.Release.Size,
Sizeleft = pendingRelease.RemoteEpisode.Release.Size,
Timeleft =
pendingRelease.Release.PublishDate.AddHours(
pendingRelease.RemoteEpisode.Series.Profile.Value.GrabDelay)
.Subtract(DateTime.UtcNow),
Timeleft = ect.Subtract(DateTime.UtcNow),
EstimatedCompletionTime = ect,
Status = "Pending",
RemoteEpisode = pendingRelease.RemoteEpisode
};

@ -15,6 +15,7 @@ namespace NzbDrone.Core.Queue
public String Title { get; set; }
public Decimal Sizeleft { get; set; }
public TimeSpan? Timeleft { get; set; }
public DateTime? EstimatedCompletionTime { get; set; }
public String Status { get; set; }
public String ErrorMessage { get; set; }
public RemoteEpisode RemoteEpisode { get; set; }

@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using System.Collections.Generic;
using NLog;
using NzbDrone.Core.Download;
@ -57,6 +58,11 @@ namespace NzbDrone.Core.Queue
queue.ErrorMessage = queueItem.StatusMessage;
}
if (queue.Timeleft.HasValue)
{
queue.EstimatedCompletionTime = DateTime.UtcNow.Add(queue.Timeleft.Value);
}
queued.Add(queue);
}
}

@ -10,10 +10,11 @@ define(
'System/StatusModel',
'History/Queue/QueueCollection',
'Config',
'Shared/FormatHelpers',
'Mixins/backbone.signalr.mixin',
'fullcalendar',
'jquery.easypiechart'
], function ($, vent, Marionette, moment, CalendarCollection, StatusModel, QueueCollection, Config) {
], function ($, vent, Marionette, moment, CalendarCollection, StatusModel, QueueCollection, Config, FormatHelpers) {
return Marionette.ItemView.extend({
storageKey: 'calendar.view',
@ -62,6 +63,16 @@ define(
container: 'body'
});
}
if (event.pending) {
this.$(element).find('.fc-event-time')
.after('<span class="pending pull-right"><i class="icon-time"></i></span>');
this.$(element).find('.pending').tooltip({
title: 'Release will be processed {0}'.format(event.pending),
container: 'body'
});
}
},
_getEvents: function (view) {
@ -94,7 +105,9 @@ define(
allDay : false,
statusLevel : self._getStatusLevel(model, end),
progress : self._getDownloadProgress(model),
pending : self._getPendingInfo(model),
releaseTitle: self._getReleaseTitle(model),
downloading : QueueCollection.findEpisode(model.get('id')),
model : model
};
@ -151,6 +164,16 @@ define(
return 100 - (downloading.get('sizeleft') / downloading.get('size') * 100);
},
_getPendingInfo: function (element) {
var pending = QueueCollection.findEpisode(element.get('id'));
if (!pending || pending.get('status').toLocaleLowerCase() !== 'pending') {
return undefined;
}
return new moment(pending.get('estimatedCompletionTime')).fromNow();
},
_getReleaseTitle: function (element) {
var downloading = QueueCollection.findEpisode(element.get('id'));

@ -21,6 +21,10 @@
.fc-event {
.clickable;
.pending {
margin-right : 4px;
}
}
th {

@ -3,8 +3,9 @@
define(
[
'Cells/NzbDroneCell',
'filesize'
], function (NzbDroneCell, fileSize) {
'filesize',
'moment'
], function (NzbDroneCell, fileSize, Moment) {
return NzbDroneCell.extend({
className: 'timeleft-cell',
@ -17,7 +18,7 @@ define(
//If the release is pending we want to use the timeleft as the time it will be processed at
if (this.cellValue.get('status').toLowerCase() === 'pending') {
this.$el.html('-');
this.$el.attr('title', 'Will be processed again in: {0}'.format(this.cellValue.get('timeleft')));
this.$el.attr('title', 'Will be processed {0}'.format(new Moment(this.cellValue.get('estimatedCompletionTime')).calendar()));
this.$el.attr('data-container', 'body');
return this;

Loading…
Cancel
Save