mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-21 05:00:39 +02:00
Added some ffprobe error handling
This commit is contained in:
parent
bbbe6164dc
commit
37dd0c8bdd
|
@ -35,8 +35,11 @@ namespace MediaBrowser.Controller.FFMpeg
|
||||||
|
|
||||||
FFProbeResult result = Run(item.Path);
|
FFProbeResult result = Run(item.Path);
|
||||||
|
|
||||||
// Fire and forget
|
if (result != null)
|
||||||
CacheResult(result, cachePath);
|
{
|
||||||
|
// Fire and forget
|
||||||
|
CacheResult(result, cachePath);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,6 @@ namespace MediaBrowser.Controller.Providers
|
||||||
|
|
||||||
protected override void Fetch(Audio audio, FFProbeResult data)
|
protected override void Fetch(Audio audio, FFProbeResult data)
|
||||||
{
|
{
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
Logger.LogInfo("Null FFProbeResult for {0} {1}", audio.Id, audio.Name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MediaStream stream = data.streams.First(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase));
|
MediaStream stream = data.streams.First(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
string bitrate = null;
|
string bitrate = null;
|
||||||
|
@ -176,16 +170,25 @@ namespace MediaBrowser.Controller.Providers
|
||||||
|
|
||||||
FFProbeResult result = FFProbe.Run(myItem, CacheDirectory);
|
FFProbeResult result = FFProbe.Run(myItem, CacheDirectory);
|
||||||
|
|
||||||
if (result.format.tags != null)
|
if (result == null)
|
||||||
|
{
|
||||||
|
Logger.LogInfo("Null FFProbeResult for {0} {1}", item.Id, item.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.format != null && result.format.tags != null)
|
||||||
{
|
{
|
||||||
result.format.tags = ConvertDictionaryToCaseInSensitive(result.format.tags);
|
result.format.tags = ConvertDictionaryToCaseInSensitive(result.format.tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (MediaStream stream in result.streams)
|
if (result.streams != null)
|
||||||
{
|
{
|
||||||
if (stream.tags != null)
|
foreach (MediaStream stream in result.streams)
|
||||||
{
|
{
|
||||||
stream.tags = ConvertDictionaryToCaseInSensitive(stream.tags);
|
if (stream.tags != null)
|
||||||
|
{
|
||||||
|
stream.tags = ConvertDictionaryToCaseInSensitive(stream.tags);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,40 +27,40 @@ namespace MediaBrowser.Controller.Providers
|
||||||
|
|
||||||
protected override void Fetch(Video video, FFProbeResult data)
|
protected override void Fetch(Video video, FFProbeResult data)
|
||||||
{
|
{
|
||||||
if (data == null)
|
if (data.format != null)
|
||||||
{
|
{
|
||||||
Logger.LogInfo("Null FFProbeResult for {0} {1}", video.Id, video.Name);
|
if (!string.IsNullOrEmpty(data.format.duration))
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(data.format.duration))
|
|
||||||
{
|
|
||||||
video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration)).Ticks;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(data.format.bit_rate))
|
|
||||||
{
|
|
||||||
video.BitRate = int.Parse(data.format.bit_rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For now, only read info about first video stream
|
|
||||||
// Files with multiple video streams are possible, but extremely rare
|
|
||||||
bool foundVideo = false;
|
|
||||||
|
|
||||||
foreach (MediaStream stream in data.streams)
|
|
||||||
{
|
|
||||||
if (stream.codec_type.Equals("video", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
{
|
||||||
if (!foundVideo)
|
video.RunTimeTicks = TimeSpan.FromSeconds(double.Parse(data.format.duration)).Ticks;
|
||||||
{
|
|
||||||
FetchFromVideoStream(video, stream);
|
|
||||||
}
|
|
||||||
|
|
||||||
foundVideo = true;
|
|
||||||
}
|
}
|
||||||
else if (stream.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase))
|
|
||||||
|
if (!string.IsNullOrEmpty(data.format.bit_rate))
|
||||||
{
|
{
|
||||||
FetchFromAudioStream(video, stream);
|
video.BitRate = int.Parse(data.format.bit_rate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.streams != null)
|
||||||
|
{
|
||||||
|
// For now, only read info about first video stream
|
||||||
|
// Files with multiple video streams are possible, but extremely rare
|
||||||
|
bool foundVideo = false;
|
||||||
|
|
||||||
|
foreach (MediaStream stream in data.streams)
|
||||||
|
{
|
||||||
|
if (stream.codec_type.Equals("video", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
if (!foundVideo)
|
||||||
|
{
|
||||||
|
FetchFromVideoStream(video, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
foundVideo = true;
|
||||||
|
}
|
||||||
|
else if (stream.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
FetchFromAudioStream(video, stream);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,6 +111,17 @@ namespace MediaBrowser.Controller.Providers
|
||||||
streams.Add(audio);
|
streams.Add(audio);
|
||||||
video.AudioStreams = streams;
|
video.AudioStreams = streams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void FetchFromSubtitleStream(Video video, MediaStream stream)
|
||||||
|
{
|
||||||
|
SubtitleStream subtitle = new SubtitleStream();
|
||||||
|
|
||||||
|
subtitle.Language = GetDictionaryValue(stream.tags, "language");
|
||||||
|
|
||||||
|
List<SubtitleStream> streams = video.Subtitles ?? new List<SubtitleStream>();
|
||||||
|
streams.Add(subtitle);
|
||||||
|
video.Subtitles = streams;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines if there's already enough info in the Video object to allow us to skip running ffprobe
|
/// Determines if there's already enough info in the Video object to allow us to skip running ffprobe
|
||||||
|
|
Loading…
Reference in a new issue