diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
index 3789bcac90..2b39c74e23 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
@@ -542,7 +542,7 @@ namespace MediaBrowser.Controller.MediaEncoding
if (state.MediaSource.VideoType == VideoType.BluRay)
{
- return _mediaEncoder.GetInputArgument(_mediaEncoder.GetPrimaryPlaylistM2TsFiles(state.MediaPath, null).ToList(), state.MediaSource);
+ return _mediaEncoder.GetInputArgument(_mediaEncoder.GetPrimaryPlaylistM2tsFiles(state.MediaPath).ToList(), state.MediaSource);
}
return _mediaEncoder.GetInputArgument(mediaPath, state.MediaSource);
diff --git a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
index 716adc8f0b..83be267a7a 100644
--- a/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
+++ b/MediaBrowser.Controller/MediaEncoding/IMediaEncoder.cs
@@ -208,9 +208,8 @@ namespace MediaBrowser.Controller.MediaEncoding
/// Gets the primary playlist of .m2ts files.
///
/// The to the .m2ts files.
- /// The title number to start with.
/// A playlist.
- IEnumerable GetPrimaryPlaylistM2TsFiles(string path, uint? titleNumber);
+ IEnumerable GetPrimaryPlaylistM2tsFiles(string path);
///
/// Generates a FFmpeg concat config for the source.
diff --git a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
index 49c81923b4..05ea7a86d4 100644
--- a/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
+++ b/MediaBrowser.MediaEncoding/Encoder/MediaEncoder.cs
@@ -873,7 +873,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
///
public IEnumerable GetPrimaryPlaylistVobFiles(string path, uint? titleNumber)
{
- // Eliminate menus and intros by omitting VIDEO_TS.VOB and all subsequent title VOBs ending with _0.VOB
+ // Eliminate menus and intros by omitting VIDEO_TS.VOB and all subsequent title .vob files ending with _0.VOB
var allVobs = _fileSystem.GetFiles(path, true)
.Where(file => string.Equals(file.Extension, ".VOB", StringComparison.OrdinalIgnoreCase))
.Where(file => !string.Equals(file.Name, "VIDEO_TS.VOB", StringComparison.OrdinalIgnoreCase))
@@ -891,7 +891,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
return vobs.Select(i => i.FullName);
}
- _logger.LogWarning("Could not determine VOB file list for title {Title} of {Path}.", titleNumber, path);
+ _logger.LogWarning("Could not determine .vob files for title {Title} of {Path}.", titleNumber, path);
}
// Check for multiple big titles (> 900 MB)
@@ -908,18 +908,22 @@ namespace MediaBrowser.MediaEncoding.Encoder
titles.Add(_fileSystem.GetFileNameWithoutExtension(allVobs[0]).AsSpan().RightPart('_').ToString());
}
- // Aggregate all VOBs of the titles
+ // Aggregate all .vob files of the titles
return allVobs
.Where(vob => titles.Contains(_fileSystem.GetFileNameWithoutExtension(vob).AsSpan().RightPart('_').ToString()))
.Select(i => i.FullName)
.ToList();
}
- public IEnumerable GetPrimaryPlaylistM2TsFiles(string path, uint? titleNumber)
+ public IEnumerable GetPrimaryPlaylistM2tsFiles(string path)
{
+ // Get all playable .m2ts files
var validPlaybackFiles = _blurayExaminer.GetDiscInfo(path).Files;
+
+ // Get all files from the BDMV/STREAMING directory
var directoryFiles = _fileSystem.GetFiles(Path.Join(path, "BDMV", "STREAM"));
+ // Only return playable local .m2ts files
return directoryFiles
.Where(f => validPlaybackFiles.Contains(f.Name, StringComparer.OrdinalIgnoreCase))
.Select(f => f.FullName);
@@ -927,6 +931,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
public void GenerateConcatConfig(MediaSourceInfo source, string concatFilePath)
{
+ // Get all playable files
var files = new List();
var videoType = source.VideoType;
if (videoType == VideoType.Dvd)
@@ -935,11 +940,11 @@ namespace MediaBrowser.MediaEncoding.Encoder
}
else if (videoType == VideoType.BluRay)
{
- files = GetPrimaryPlaylistM2TsFiles(source.Path, null).ToList();
+ files = GetPrimaryPlaylistM2tsFiles(source.Path).ToList();
}
+ // Generate concat configuration entries for each file
var lines = new List();
-
foreach (var path in files)
{
var mediaInfoResult = GetMediaInfo(
@@ -957,10 +962,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
var duration = TimeSpan.FromTicks(mediaInfoResult.RunTimeTicks.Value).TotalSeconds;
+ // Add file path stanza to concat configuration
lines.Add("file " + "'" + path + "'");
+
+ // Add duration stanza to concat configuration
lines.Add("duration " + duration);
}
+ // Write concat configuration
File.WriteAllLines(concatFilePath, lines);
}
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index f75de47f30..7200d674c2 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -91,8 +91,17 @@ namespace MediaBrowser.Providers.MediaInfo
{
if (item.VideoType == VideoType.Dvd)
{
- // Fetch metadata of first VOB
+ // Get list of playable .vob files
var vobs = _mediaEncoder.GetPrimaryPlaylistVobFiles(item.Path, null).ToList();
+
+ // Return if no playable .vob files are found
+ if (vobs.Count == 0)
+ {
+ _logger.LogError("No playable .vob files found in DVD structure, skipping FFprobe.");
+ return ItemUpdateType.MetadataImport;
+ }
+
+ // Fetch metadata of first .vob file
mediaInfoResult = await GetMediaInfo(
new Video
{
@@ -100,10 +109,10 @@ namespace MediaBrowser.Providers.MediaInfo
},
cancellationToken).ConfigureAwait(false);
- // Remove first VOB
+ // Remove first .vob file
vobs.RemoveAt(0);
- // Add runtime from all other VOBs
+ // Sum up the runtime of all .vob files
foreach (var vob in vobs)
{
var tmpMediaInfo = await GetMediaInfo(
@@ -118,20 +127,26 @@ namespace MediaBrowser.Providers.MediaInfo
}
else if (item.VideoType == VideoType.BluRay)
{
+ // Get BD disc information
blurayDiscInfo = GetBDInfo(item.Path);
- var m2ts = _mediaEncoder.GetPrimaryPlaylistM2TsFiles(item.Path, null).ToList();
+
+ // Get playable .m2ts files
+ var m2ts = _mediaEncoder.GetPrimaryPlaylistM2tsFiles(item.Path).ToList();
+
+ // Return if no playable .m2ts files are found
+ if (blurayDiscInfo.Files.Length == 0 || m2ts.Count == 0)
+ {
+ _logger.LogError("No playable .m2ts files found in Blu-ray structure, skipping FFprobe.");
+ return ItemUpdateType.MetadataImport;
+ }
+
+ // Fetch metadata of first .m2ts file
mediaInfoResult = await GetMediaInfo(
new Video
{
Path = m2ts.First()
},
cancellationToken).ConfigureAwait(false);
-
- if (blurayDiscInfo.Files.Length == 0)
- {
- _logger.LogError("No playable vobs found in bluray structure, skipping ffprobe.");
- return ItemUpdateType.MetadataImport;
- }
}
else
{