|
@@ -39,6 +39,7 @@ using MediaBrowser.Model.FileOrganization;
|
|
using MediaBrowser.Model.System;
|
|
using MediaBrowser.Model.System;
|
|
using MediaBrowser.Model.Threading;
|
|
using MediaBrowser.Model.Threading;
|
|
using MediaBrowser.Model.Extensions;
|
|
using MediaBrowser.Model.Extensions;
|
|
|
|
+using MediaBrowser.Model.Querying;
|
|
|
|
|
|
namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
{
|
|
{
|
|
@@ -1512,7 +1513,7 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
_timerProvider.AddOrUpdate(timer, false);
|
|
_timerProvider.AddOrUpdate(timer, false);
|
|
|
|
|
|
SaveRecordingMetadata(timer, recordPath, seriesPath);
|
|
SaveRecordingMetadata(timer, recordPath, seriesPath);
|
|
- EnforceKeepUpTo(timer);
|
|
|
|
|
|
+ EnforceKeepUpTo(timer, seriesPath);
|
|
};
|
|
};
|
|
|
|
|
|
await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken)
|
|
await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken)
|
|
@@ -1583,12 +1584,16 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
}, _logger);
|
|
}, _logger);
|
|
}
|
|
}
|
|
|
|
|
|
- private async void EnforceKeepUpTo(TimerInfo timer)
|
|
|
|
|
|
+ private async void EnforceKeepUpTo(TimerInfo timer, string seriesPath)
|
|
{
|
|
{
|
|
if (string.IsNullOrWhiteSpace(timer.SeriesTimerId))
|
|
if (string.IsNullOrWhiteSpace(timer.SeriesTimerId))
|
|
{
|
|
{
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ if (string.IsNullOrWhiteSpace(seriesPath))
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
var seriesTimerId = timer.SeriesTimerId;
|
|
var seriesTimerId = timer.SeriesTimerId;
|
|
var seriesTimer = _seriesTimerProvider.GetAll().FirstOrDefault(i => string.Equals(i.Id, seriesTimerId, StringComparison.OrdinalIgnoreCase));
|
|
var seriesTimer = _seriesTimerProvider.GetAll().FirstOrDefault(i => string.Equals(i.Id, seriesTimerId, StringComparison.OrdinalIgnoreCase));
|
|
@@ -1621,6 +1626,43 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
.ToList();
|
|
.ToList();
|
|
|
|
|
|
await DeleteLibraryItemsForTimers(timersToDelete).ConfigureAwait(false);
|
|
await DeleteLibraryItemsForTimers(timersToDelete).ConfigureAwait(false);
|
|
|
|
+
|
|
|
|
+ var librarySeries = _libraryManager.FindByPath(seriesPath, true) as Folder;
|
|
|
|
+
|
|
|
|
+ if (librarySeries == null)
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var episodesToDelete = (await librarySeries.GetItems(new InternalItemsQuery
|
|
|
|
+ {
|
|
|
|
+ SortBy = new[] { ItemSortBy.DateCreated },
|
|
|
|
+ SortOrder = SortOrder.Descending,
|
|
|
|
+ IsVirtualItem = false,
|
|
|
|
+ IsFolder = false,
|
|
|
|
+ Recursive = true
|
|
|
|
+
|
|
|
|
+ }).ConfigureAwait(false))
|
|
|
|
+ .Items
|
|
|
|
+ .Where(i => i.LocationType == LocationType.FileSystem && _fileSystem.FileExists(i.Path))
|
|
|
|
+ .Skip(seriesTimer.KeepUpTo - 1)
|
|
|
|
+ .ToList();
|
|
|
|
+
|
|
|
|
+ foreach (var item in episodesToDelete)
|
|
|
|
+ {
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ await _libraryManager.DeleteItem(item, new DeleteOptions
|
|
|
|
+ {
|
|
|
|
+ DeleteFileLocation = true
|
|
|
|
+
|
|
|
|
+ }).ConfigureAwait(false);
|
|
|
|
+ }
|
|
|
|
+ catch (Exception ex)
|
|
|
|
+ {
|
|
|
|
+ _logger.ErrorException("Error deleting item", ex);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
finally
|
|
finally
|
|
{
|
|
{
|
|
@@ -1658,7 +1700,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
|
await _libraryManager.DeleteItem(libraryItem, new DeleteOptions
|
|
await _libraryManager.DeleteItem(libraryItem, new DeleteOptions
|
|
{
|
|
{
|
|
DeleteFileLocation = true
|
|
DeleteFileLocation = true
|
|
- });
|
|
|
|
|
|
+
|
|
|
|
+ }).ConfigureAwait(false);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|