Merge pull request #1925 from MediaBrowser/dev

Dev
pull/702/head
Luke 8 years ago committed by GitHub
commit 63ae4310f4

@ -120,6 +120,15 @@ namespace MediaBrowser.MediaEncoding.Subtitles
bool preserveOriginalTimestamps,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(itemId))
{
throw new ArgumentNullException("itemId");
}
if (string.IsNullOrWhiteSpace(mediaSourceId))
{
throw new ArgumentNullException("mediaSourceId");
}
var subtitle = await GetSubtitleStream(itemId, mediaSourceId, subtitleStreamIndex, cancellationToken)
.ConfigureAwait(false);
@ -141,10 +150,19 @@ namespace MediaBrowser.MediaEncoding.Subtitles
int subtitleStreamIndex,
CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(itemId))
{
throw new ArgumentNullException("itemId");
}
if (string.IsNullOrWhiteSpace(mediaSourceId))
{
throw new ArgumentNullException("mediaSourceId");
}
var mediaSources = await _mediaSourceManager.GetPlayackMediaSources(itemId, null, false, new[] { MediaType.Audio, MediaType.Video }, cancellationToken).ConfigureAwait(false);
var mediaSource = mediaSources
.First(i => string.Equals(i.Id, mediaSourceId));
.First(i => string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase));
var subtitleStream = mediaSource.MediaStreams
.First(i => i.Type == MediaStreamType.Subtitle && i.Index == subtitleStreamIndex);
@ -609,7 +627,8 @@ namespace MediaBrowser.MediaEncoding.Subtitles
throw;
}
process.StandardError.BaseStream.CopyToAsync(logFileStream);
// Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
Task.Run(() => StartStreamingLog(process.StandardError.BaseStream, logFileStream));
var ranToCompletion = process.WaitForExit(300000);
@ -686,6 +705,33 @@ namespace MediaBrowser.MediaEncoding.Subtitles
}
}
private async Task StartStreamingLog(Stream source, Stream target)
{
try
{
using (var reader = new StreamReader(source))
{
while (!reader.EndOfStream)
{
var line = await reader.ReadLineAsync().ConfigureAwait(false);
var bytes = Encoding.UTF8.GetBytes(Environment.NewLine + line);
await target.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
await target.FlushAsync().ConfigureAwait(false);
}
}
}
catch (ObjectDisposedException)
{
// Don't spam the log. This doesn't seem to throw in windows, but sometimes under linux
}
catch (Exception ex)
{
_logger.ErrorException("Error reading ffmpeg log", ex);
}
}
/// <summary>
/// Sets the ass font.
/// </summary>

@ -142,77 +142,52 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
private Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
private async Task UpdateToLatestSchema(CancellationToken cancellationToken, IProgress<double> progress)
{
return UpdateToLatestSchema(0, 0, null, cancellationToken, progress);
}
private async Task UpdateToLatestSchema(int queryStartIndex, int progressStartIndex, int? totalRecordCount, CancellationToken cancellationToken, IProgress<double> progress)
{
IEnumerable<BaseItem> items;
int numItemsToSave;
var pageSize = 1000;
if (totalRecordCount.HasValue)
{
var list = _libraryManager.GetItemList(new InternalItemsQuery
{
IsCurrentSchema = false,
ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
StartIndex = queryStartIndex,
Limit = pageSize
}).ToList();
items = list;
numItemsToSave = list.Count;
}
else
var itemIds = _libraryManager.GetItemIds(new InternalItemsQuery
{
var itemsResult = _libraryManager.GetItemsResult(new InternalItemsQuery
{
IsCurrentSchema = false,
ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name },
StartIndex = queryStartIndex,
Limit = pageSize
});
totalRecordCount = itemsResult.TotalRecordCount;
items = itemsResult.Items;
numItemsToSave = itemsResult.Items.Length;
}
IsCurrentSchema = false,
ExcludeItemTypes = new[] { typeof(LiveTvProgram).Name }
});
var numItems = totalRecordCount.Value;
var numComplete = 0;
var numItems = itemIds.Count;
_logger.Debug("Upgrading schema for {0} items", numItems);
if (numItemsToSave > 0)
foreach (var itemId in itemIds)
{
try
{
await _itemRepo.SaveItems(items, cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
cancellationToken.ThrowIfCancellationRequested();
if (itemId != Guid.Empty)
{
_logger.ErrorException("Error saving item", ex);
// Somehow some invalid data got into the db. It probably predates the boundary checking
var item = _libraryManager.GetItemById(itemId);
if (item != null)
{
try
{
await _itemRepo.SaveItem(item, cancellationToken).ConfigureAwait(false);
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
_logger.ErrorException("Error saving item", ex);
}
}
}
progressStartIndex += pageSize;
double percent = progressStartIndex;
numComplete++;
double percent = numComplete;
percent /= numItems;
progress.Report(percent * 100);
var newStartIndex = queryStartIndex + (pageSize - numItemsToSave);
await UpdateToLatestSchema(newStartIndex, progressStartIndex, totalRecordCount, cancellationToken, progress).ConfigureAwait(false);
}
else
{
progress.Report(100);
}
progress.Report(100);
}
private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress)

Loading…
Cancel
Save