|
|
|
@ -4,9 +4,7 @@ using MediaBrowser.Controller.Entities;
|
|
|
|
|
using MediaBrowser.Controller.Library;
|
|
|
|
|
using MediaBrowser.Controller.MediaEncoding;
|
|
|
|
|
using MediaBrowser.Controller.Persistence;
|
|
|
|
|
using MediaBrowser.Model.Entities;
|
|
|
|
|
using MediaBrowser.Model.Logging;
|
|
|
|
|
using MoreLinq;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
@ -30,10 +28,6 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
|
|
|
|
|
/// </summary>
|
|
|
|
|
private readonly ILibraryManager _libraryManager;
|
|
|
|
|
|
|
|
|
|
private readonly List<Video> _newlyAddedItems = new List<Video>();
|
|
|
|
|
|
|
|
|
|
private const int NewItemDelay = 30000;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The current new item timer
|
|
|
|
|
/// </summary>
|
|
|
|
@ -59,70 +53,6 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
|
|
|
|
|
_itemRepo = itemRepo;
|
|
|
|
|
_appPaths = appPaths;
|
|
|
|
|
_encodingManager = encodingManager;
|
|
|
|
|
|
|
|
|
|
libraryManager.ItemAdded += libraryManager_ItemAdded;
|
|
|
|
|
libraryManager.ItemUpdated += libraryManager_ItemAdded;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void libraryManager_ItemAdded(object sender, ItemChangeEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
var video = e.Item as Video;
|
|
|
|
|
|
|
|
|
|
if (video != null)
|
|
|
|
|
{
|
|
|
|
|
lock (_newlyAddedItems)
|
|
|
|
|
{
|
|
|
|
|
_newlyAddedItems.Add(video);
|
|
|
|
|
|
|
|
|
|
if (NewItemTimer == null)
|
|
|
|
|
{
|
|
|
|
|
NewItemTimer = new Timer(NewItemTimerCallback, null, NewItemDelay, Timeout.Infinite);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
NewItemTimer.Change(NewItemDelay, Timeout.Infinite);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async void NewItemTimerCallback(object state)
|
|
|
|
|
{
|
|
|
|
|
List<Video> newItems;
|
|
|
|
|
|
|
|
|
|
// Lock the list and release all resources
|
|
|
|
|
lock (_newlyAddedItems)
|
|
|
|
|
{
|
|
|
|
|
newItems = _newlyAddedItems.DistinctBy(i => i.Id).ToList();
|
|
|
|
|
_newlyAddedItems.Clear();
|
|
|
|
|
|
|
|
|
|
NewItemTimer.Dispose();
|
|
|
|
|
NewItemTimer = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Limit to video files to reduce changes of ffmpeg crash dialog
|
|
|
|
|
foreach (var item in newItems
|
|
|
|
|
.Where(i => i.LocationType == LocationType.FileSystem && i.VideoType == VideoType.VideoFile && string.IsNullOrEmpty(i.PrimaryImagePath) && i.DefaultVideoStreamIndex.HasValue)
|
|
|
|
|
.Take(1))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var chapters = _itemRepo.GetChapters(item.Id).ToList();
|
|
|
|
|
|
|
|
|
|
await _encodingManager.RefreshChapterImages(new ChapterImageRefreshOptions
|
|
|
|
|
{
|
|
|
|
|
SaveChapters = true,
|
|
|
|
|
ExtractImages = true,
|
|
|
|
|
Video = item,
|
|
|
|
|
Chapters = chapters
|
|
|
|
|
|
|
|
|
|
}, CancellationToken.None);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.ErrorException("Error creating image for {0}", ex, item.Name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -133,7 +63,14 @@ namespace MediaBrowser.Server.Implementations.ScheduledTasks
|
|
|
|
|
{
|
|
|
|
|
return new ITaskTrigger[]
|
|
|
|
|
{
|
|
|
|
|
new DailyTrigger { TimeOfDay = TimeSpan.FromHours(4) }
|
|
|
|
|
new DailyTrigger
|
|
|
|
|
{
|
|
|
|
|
TimeOfDay = TimeSpan.FromHours(3),
|
|
|
|
|
TaskOptions = new TaskExecutionOptions
|
|
|
|
|
{
|
|
|
|
|
MaxRuntimeMs = Convert.ToInt32(TimeSpan.FromHours(5).TotalMilliseconds)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|