mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-04 06:48:35 +01:00
fixed an issue with the video image provider requiring two-pass refreshing
This commit is contained in:
@@ -93,7 +93,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
await Fetch(myItem, cancellationToken, result, isoMount).ConfigureAwait(false);
|
||||
Fetch(myItem, cancellationToken, result, isoMount);
|
||||
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
@@ -180,7 +180,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
/// <param name="result">The result.</param>
|
||||
/// <param name="isoMount">The iso mount.</param>
|
||||
/// <returns>Task.</returns>
|
||||
protected abstract Task Fetch(T item, CancellationToken cancellationToken, FFProbeResult result, IIsoMount isoMount);
|
||||
protected abstract void Fetch(T item, CancellationToken cancellationToken, FFProbeResult result, IIsoMount isoMount);
|
||||
|
||||
/// <summary>
|
||||
/// Converts ffprobe stream info to our MediaStream class
|
||||
|
||||
@@ -57,12 +57,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
|
||||
if (video != null)
|
||||
{
|
||||
// Can't extract images if there are no video streams
|
||||
if (video.MediaStreams == null || video.MediaStreams.All(m => m.Type != MediaStreamType.Video))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (video.VideoType == VideoType.Iso && video.IsoType.HasValue && _isoManager.CanMount(item.Path))
|
||||
{
|
||||
return true;
|
||||
@@ -93,17 +87,21 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
{
|
||||
var video = (Video)item;
|
||||
|
||||
var filename = item.Id + "_" + item.DateModified.Ticks + "_primary";
|
||||
|
||||
var path = Kernel.Instance.FFMpegManager.VideoImageCache.GetResourcePath(filename, ".jpg");
|
||||
|
||||
if (!Kernel.Instance.FFMpegManager.VideoImageCache.ContainsFilePath(path))
|
||||
// We can only extract images from videos if we know there's an embedded video stream
|
||||
if (video.MediaStreams != null && video.MediaStreams.Any(m => m.Type == MediaStreamType.Video))
|
||||
{
|
||||
return ExtractImage(video, path, cancellationToken);
|
||||
}
|
||||
var filename = item.Id + "_" + item.DateModified.Ticks + "_primary";
|
||||
|
||||
// Image is already in the cache
|
||||
item.PrimaryImagePath = path;
|
||||
var path = Kernel.Instance.FFMpegManager.VideoImageCache.GetResourcePath(filename, ".jpg");
|
||||
|
||||
if (!Kernel.Instance.FFMpegManager.VideoImageCache.ContainsFilePath(path))
|
||||
{
|
||||
return ExtractImage(video, path, cancellationToken);
|
||||
}
|
||||
|
||||
// Image is already in the cache
|
||||
item.PrimaryImagePath = path;
|
||||
}
|
||||
}
|
||||
|
||||
SetLastRefreshed(item, DateTime.UtcNow);
|
||||
|
||||
@@ -42,41 +42,38 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
/// <param name="data">The data.</param>
|
||||
/// <param name="isoMount">The iso mount.</param>
|
||||
/// <returns>Task.</returns>
|
||||
protected override Task Fetch(Audio audio, CancellationToken cancellationToken, FFProbeResult data, IIsoMount isoMount)
|
||||
protected override void Fetch(Audio audio, CancellationToken cancellationToken, FFProbeResult data, IIsoMount isoMount)
|
||||
{
|
||||
return Task.Run(() =>
|
||||
if (data.streams == null)
|
||||
{
|
||||
if (data.streams == null)
|
||||
{
|
||||
Logger.Error("Audio item has no streams: " + audio.Path);
|
||||
return;
|
||||
}
|
||||
Logger.Error("Audio item has no streams: " + audio.Path);
|
||||
return;
|
||||
}
|
||||
|
||||
audio.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)).ToList();
|
||||
audio.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)).ToList();
|
||||
|
||||
// Get the first audio stream
|
||||
var stream = data.streams.First(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase));
|
||||
// Get the first audio stream
|
||||
var stream = data.streams.First(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
// Get duration from stream properties
|
||||
var duration = stream.duration;
|
||||
// Get duration from stream properties
|
||||
var duration = stream.duration;
|
||||
|
||||
// If it's not there go into format properties
|
||||
if (string.IsNullOrEmpty(duration))
|
||||
{
|
||||
duration = data.format.duration;
|
||||
}
|
||||
// If it's not there go into format properties
|
||||
if (string.IsNullOrEmpty(duration))
|
||||
{
|
||||
duration = data.format.duration;
|
||||
}
|
||||
|
||||
// If we got something, parse it
|
||||
if (!string.IsNullOrEmpty(duration))
|
||||
{
|
||||
audio.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(duration, UsCulture)).Ticks;
|
||||
}
|
||||
// If we got something, parse it
|
||||
if (!string.IsNullOrEmpty(duration))
|
||||
{
|
||||
audio.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(duration, UsCulture)).Ticks;
|
||||
}
|
||||
|
||||
if (data.format.tags != null)
|
||||
{
|
||||
FetchDataFromTags(audio, data.format.tags);
|
||||
}
|
||||
});
|
||||
if (data.format.tags != null)
|
||||
{
|
||||
FetchDataFromTags(audio, data.format.tags);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -187,44 +187,41 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
|
||||
/// <param name="data">The data.</param>
|
||||
/// <param name="isoMount">The iso mount.</param>
|
||||
/// <returns>Task.</returns>
|
||||
protected override Task Fetch(Video video, CancellationToken cancellationToken, FFProbeResult data, IIsoMount isoMount)
|
||||
protected override void Fetch(Video video, CancellationToken cancellationToken, FFProbeResult data, IIsoMount isoMount)
|
||||
{
|
||||
return Task.Run(() =>
|
||||
if (data.format != null)
|
||||
{
|
||||
if (data.format != null)
|
||||
// For dvd's this may not always be accurate, so don't set the runtime if the item already has one
|
||||
var needToSetRuntime = video.VideoType != VideoType.Dvd || video.RunTimeTicks == null || video.RunTimeTicks.Value == 0;
|
||||
|
||||
if (needToSetRuntime && !string.IsNullOrEmpty(data.format.duration))
|
||||
{
|
||||
// For dvd's this may not always be accurate, so don't set the runtime if the item already has one
|
||||
var needToSetRuntime = video.VideoType != VideoType.Dvd || video.RunTimeTicks == null || video.RunTimeTicks.Value == 0;
|
||||
|
||||
if (needToSetRuntime && !string.IsNullOrEmpty(data.format.duration))
|
||||
{
|
||||
video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, UsCulture)).Ticks;
|
||||
}
|
||||
video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration, UsCulture)).Ticks;
|
||||
}
|
||||
}
|
||||
|
||||
if (data.streams != null)
|
||||
{
|
||||
video.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)).ToList();
|
||||
}
|
||||
if (data.streams != null)
|
||||
{
|
||||
video.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)).ToList();
|
||||
}
|
||||
|
||||
if (data.Chapters != null)
|
||||
{
|
||||
video.Chapters = data.Chapters;
|
||||
}
|
||||
if (data.Chapters != null)
|
||||
{
|
||||
video.Chapters = data.Chapters;
|
||||
}
|
||||
|
||||
if (video.Chapters == null || video.Chapters.Count == 0)
|
||||
{
|
||||
AddDummyChapters(video);
|
||||
}
|
||||
if (video.Chapters == null || video.Chapters.Count == 0)
|
||||
{
|
||||
AddDummyChapters(video);
|
||||
}
|
||||
|
||||
if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay))
|
||||
{
|
||||
var inputPath = isoMount != null ? isoMount.MountedPath : video.Path;
|
||||
FetchBdInfo(video, inputPath, BdInfoCache, cancellationToken);
|
||||
}
|
||||
if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay))
|
||||
{
|
||||
var inputPath = isoMount != null ? isoMount.MountedPath : video.Path;
|
||||
FetchBdInfo(video, inputPath, BdInfoCache, cancellationToken);
|
||||
}
|
||||
|
||||
AddExternalSubtitles(video);
|
||||
});
|
||||
AddExternalSubtitles(video);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user