Fix BD and DVD folder probing and playback

This commit is contained in:
Shadowghost 2023-02-03 20:03:55 +01:00
parent 519709bf10
commit ddfdec7f46
6 changed files with 148 additions and 126 deletions

View File

@ -525,7 +525,10 @@ public class TranscodingJobHelper : IDisposable
if (state.SubtitleStream is not null && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode) if (state.SubtitleStream is not null && state.SubtitleDeliveryMethod == SubtitleDeliveryMethod.Encode)
{ {
var attachmentPath = Path.Combine(_appPaths.CachePath, "attachments", state.MediaSource.Id); var attachmentPath = Path.Combine(_appPaths.CachePath, "attachments", state.MediaSource.Id);
await _attachmentExtractor.ExtractAllAttachments(state.MediaPath, state.MediaSource, attachmentPath, cancellationTokenSource.Token).ConfigureAwait(false); if (state.VideoType != VideoType.Dvd)
{
await _attachmentExtractor.ExtractAllAttachments(state.MediaPath, state.MediaSource, attachmentPath, cancellationTokenSource.Token).ConfigureAwait(false);
}
if (state.SubtitleStream.IsExternal && string.Equals(Path.GetExtension(state.SubtitleStream.Path), ".mks", StringComparison.OrdinalIgnoreCase)) if (state.SubtitleStream.IsExternal && string.Equals(Path.GetExtension(state.SubtitleStream.Path), ".mks", StringComparison.OrdinalIgnoreCase))
{ {

View File

@ -535,6 +535,16 @@ namespace MediaBrowser.Controller.MediaEncoding
{ {
var mediaPath = state.MediaPath ?? string.Empty; var mediaPath = state.MediaPath ?? string.Empty;
if (state.MediaSource.VideoType == VideoType.Dvd)
{
return _mediaEncoder.GetInputArgument(_mediaEncoder.GetPrimaryPlaylistVobFiles(state.MediaPath, null).ToList(), state.MediaSource);
}
if (state.MediaSource.VideoType == VideoType.BluRay)
{
return _mediaEncoder.GetInputArgument(_mediaEncoder.GetPrimaryPlaylistM2TsFiles(state.MediaPath, null).ToList(), state.MediaSource);
}
return _mediaEncoder.GetInputArgument(mediaPath, state.MediaSource); return _mediaEncoder.GetInputArgument(mediaPath, state.MediaSource);
} }

View File

@ -153,6 +153,14 @@ namespace MediaBrowser.Controller.MediaEncoding
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
string GetInputArgument(string inputFile, MediaSourceInfo mediaSource); string GetInputArgument(string inputFile, MediaSourceInfo mediaSource);
/// <summary>
/// Gets the input argument.
/// </summary>
/// <param name="inputFiles">The input files.</param>
/// <param name="mediaSource">The mediaSource.</param>
/// <returns>System.String.</returns>
string GetInputArgument(IReadOnlyList<string> inputFiles, MediaSourceInfo mediaSource);
/// <summary> /// <summary>
/// Gets the input argument for an external subtitle file. /// Gets the input argument for an external subtitle file.
/// </summary> /// </summary>
@ -195,5 +203,13 @@ namespace MediaBrowser.Controller.MediaEncoding
/// <param name="titleNumber">The title number to start with.</param> /// <param name="titleNumber">The title number to start with.</param>
/// <returns>A playlist.</returns> /// <returns>A playlist.</returns>
IEnumerable<string> GetPrimaryPlaylistVobFiles(string path, uint? titleNumber); IEnumerable<string> GetPrimaryPlaylistVobFiles(string path, uint? titleNumber);
/// <summary>
/// Gets the primary playlist of .m2ts files.
/// </summary>
/// <param name="path">The to the .m2ts files.</param>
/// <param name="titleNumber">The title number to start with.</param>
/// <returns>A playlist.</returns>
IEnumerable<string> GetPrimaryPlaylistM2TsFiles(string path, uint? titleNumber);
} }
} }

View File

@ -1,7 +1,9 @@
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;
using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
namespace MediaBrowser.MediaEncoding.Encoder namespace MediaBrowser.MediaEncoding.Encoder
@ -15,21 +17,38 @@ namespace MediaBrowser.MediaEncoding.Encoder
return string.Format(CultureInfo.InvariantCulture, "\"{0}\"", inputFile); return string.Format(CultureInfo.InvariantCulture, "\"{0}\"", inputFile);
} }
return GetConcatInputArgument(inputFile, inputPrefix); return GetFileInputArgument(inputFile, inputPrefix);
}
public static string GetInputArgument(string inputPrefix, IReadOnlyList<string> inputFiles, MediaProtocol protocol)
{
if (protocol != MediaProtocol.File)
{
return string.Format(CultureInfo.InvariantCulture, "\"{0}\"", inputFiles[0]);
}
return GetConcatInputArgument(inputFiles, inputPrefix);
} }
/// <summary> /// <summary>
/// Gets the concat input argument. /// Gets the concat input argument.
/// </summary> /// </summary>
/// <param name="inputFile">The input file.</param> /// <param name="inputFiles">The input files.</param>
/// <param name="inputPrefix">The input prefix.</param> /// <param name="inputPrefix">The input prefix.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
private static string GetConcatInputArgument(string inputFile, string inputPrefix) private static string GetConcatInputArgument(IReadOnlyList<string> inputFiles, string inputPrefix)
{ {
// Get all streams // Get all streams
// If there's more than one we'll need to use the concat command // If there's more than one we'll need to use the concat command
if (inputFiles.Count > 1)
{
var files = string.Join("|", inputFiles.Select(NormalizePath));
return string.Format(CultureInfo.InvariantCulture, "concat:\"{0}\"", files);
}
// Determine the input path for video files // Determine the input path for video files
return GetFileInputArgument(inputFile, inputPrefix); return GetFileInputArgument(inputFiles[0], inputPrefix);
} }
/// <summary> /// <summary>

View File

@ -51,6 +51,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
private readonly IServerConfigurationManager _configurationManager; private readonly IServerConfigurationManager _configurationManager;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly ILocalizationManager _localization; private readonly ILocalizationManager _localization;
private readonly IBlurayExaminer _blurayExaminer;
private readonly IConfiguration _config; private readonly IConfiguration _config;
private readonly IServerConfigurationManager _serverConfig; private readonly IServerConfigurationManager _serverConfig;
private readonly string _startupOptionFFmpegPath; private readonly string _startupOptionFFmpegPath;
@ -95,6 +96,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
ILogger<MediaEncoder> logger, ILogger<MediaEncoder> logger,
IServerConfigurationManager configurationManager, IServerConfigurationManager configurationManager,
IFileSystem fileSystem, IFileSystem fileSystem,
IBlurayExaminer blurayExaminer,
ILocalizationManager localization, ILocalizationManager localization,
IConfiguration config, IConfiguration config,
IServerConfigurationManager serverConfig) IServerConfigurationManager serverConfig)
@ -102,6 +104,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
_logger = logger; _logger = logger;
_configurationManager = configurationManager; _configurationManager = configurationManager;
_fileSystem = fileSystem; _fileSystem = fileSystem;
_blurayExaminer = blurayExaminer;
_localization = localization; _localization = localization;
_config = config; _config = config;
_serverConfig = serverConfig; _serverConfig = serverConfig;
@ -117,16 +120,22 @@ namespace MediaBrowser.MediaEncoding.Encoder
/// <inheritdoc /> /// <inheritdoc />
public string ProbePath => _ffprobePath; public string ProbePath => _ffprobePath;
/// <inheritdoc />
public Version EncoderVersion => _ffmpegVersion; public Version EncoderVersion => _ffmpegVersion;
/// <inheritdoc />
public bool IsPkeyPauseSupported => _isPkeyPauseSupported; public bool IsPkeyPauseSupported => _isPkeyPauseSupported;
/// <inheritdoc />
public bool IsVaapiDeviceAmd => _isVaapiDeviceAmd; public bool IsVaapiDeviceAmd => _isVaapiDeviceAmd;
/// <inheritdoc />
public bool IsVaapiDeviceInteliHD => _isVaapiDeviceInteliHD; public bool IsVaapiDeviceInteliHD => _isVaapiDeviceInteliHD;
/// <inheritdoc />
public bool IsVaapiDeviceInteli965 => _isVaapiDeviceInteli965; public bool IsVaapiDeviceInteli965 => _isVaapiDeviceInteli965;
/// <inheritdoc />
public bool IsVaapiDeviceSupportVulkanFmtModifier => _isVaapiDeviceSupportVulkanFmtModifier; public bool IsVaapiDeviceSupportVulkanFmtModifier => _isVaapiDeviceSupportVulkanFmtModifier;
/// <summary> /// <summary>
@ -344,26 +353,31 @@ namespace MediaBrowser.MediaEncoding.Encoder
_ffmpegVersion = validator.GetFFmpegVersion(); _ffmpegVersion = validator.GetFFmpegVersion();
} }
/// <inheritdoc />
public bool SupportsEncoder(string encoder) public bool SupportsEncoder(string encoder)
{ {
return _encoders.Contains(encoder, StringComparer.OrdinalIgnoreCase); return _encoders.Contains(encoder, StringComparer.OrdinalIgnoreCase);
} }
/// <inheritdoc />
public bool SupportsDecoder(string decoder) public bool SupportsDecoder(string decoder)
{ {
return _decoders.Contains(decoder, StringComparer.OrdinalIgnoreCase); return _decoders.Contains(decoder, StringComparer.OrdinalIgnoreCase);
} }
/// <inheritdoc />
public bool SupportsHwaccel(string hwaccel) public bool SupportsHwaccel(string hwaccel)
{ {
return _hwaccels.Contains(hwaccel, StringComparer.OrdinalIgnoreCase); return _hwaccels.Contains(hwaccel, StringComparer.OrdinalIgnoreCase);
} }
/// <inheritdoc />
public bool SupportsFilter(string filter) public bool SupportsFilter(string filter)
{ {
return _filters.Contains(filter, StringComparer.OrdinalIgnoreCase); return _filters.Contains(filter, StringComparer.OrdinalIgnoreCase);
} }
/// <inheritdoc />
public bool SupportsFilterWithOption(FilterOptionType option) public bool SupportsFilterWithOption(FilterOptionType option)
{ {
if (_filtersWithOption.TryGetValue((int)option, out var val)) if (_filtersWithOption.TryGetValue((int)option, out var val))
@ -394,24 +408,16 @@ namespace MediaBrowser.MediaEncoding.Encoder
return true; return true;
} }
/// <summary> /// <inheritdoc />
/// Gets the media info.
/// </summary>
/// <param name="request">The request.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
public Task<MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken) public Task<MediaInfo> GetMediaInfo(MediaInfoRequest request, CancellationToken cancellationToken)
{ {
var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters; var extractChapters = request.MediaType == DlnaProfileType.Video && request.ExtractChapters;
var inputFile = request.MediaSource.Path;
string analyzeDuration = string.Empty; string analyzeDuration = string.Empty;
string ffmpegAnalyzeDuration = _config.GetFFmpegAnalyzeDuration() ?? string.Empty; string ffmpegAnalyzeDuration = _config.GetFFmpegAnalyzeDuration() ?? string.Empty;
if (request.MediaSource.AnalyzeDurationMs > 0) if (request.MediaSource.AnalyzeDurationMs > 0)
{ {
analyzeDuration = "-analyzeduration " + analyzeDuration = "-analyzeduration " + (request.MediaSource.AnalyzeDurationMs * 1000).ToString();
(request.MediaSource.AnalyzeDurationMs * 1000).ToString();
} }
else if (!string.IsNullOrEmpty(ffmpegAnalyzeDuration)) else if (!string.IsNullOrEmpty(ffmpegAnalyzeDuration))
{ {
@ -419,7 +425,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
} }
return GetMediaInfoInternal( return GetMediaInfoInternal(
GetInputArgument(inputFile, request.MediaSource), GetInputArgument(request.MediaSource.Path, request.MediaSource),
request.MediaSource.Path, request.MediaSource.Path,
request.MediaSource.Protocol, request.MediaSource.Protocol,
extractChapters, extractChapters,
@ -429,36 +435,24 @@ namespace MediaBrowser.MediaEncoding.Encoder
cancellationToken); cancellationToken);
} }
/// <summary> /// <inheritdoc />
/// Gets the input argument. public string GetInputArgument(IReadOnlyList<string> inputFiles, MediaSourceInfo mediaSource)
/// </summary>
/// <param name="inputFile">The input file.</param>
/// <param name="mediaSource">The mediaSource.</param>
/// <returns>System.String.</returns>
/// <exception cref="ArgumentException">Unrecognized InputType.</exception>
public string GetInputArgument(string inputFile, MediaSourceInfo mediaSource)
{ {
var prefix = "file"; return EncodingUtils.GetInputArgument("file", inputFiles, mediaSource.Protocol);
if (mediaSource.VideoType == VideoType.BluRay
|| mediaSource.IsoType == IsoType.BluRay)
{
prefix = "bluray";
}
return EncodingUtils.GetInputArgument(prefix, inputFile, mediaSource.Protocol);
} }
/// <summary> /// <inheritdoc />
/// Gets the input argument for an external subtitle file. public string GetInputArgument(string inputFile, MediaSourceInfo mediaSource)
/// </summary> {
/// <param name="inputFile">The input file.</param> return EncodingUtils.GetInputArgument("file", new List<string>() { inputFile }, mediaSource.Protocol);
/// <returns>System.String.</returns> }
/// <exception cref="ArgumentException">Unrecognized InputType.</exception>
/// <inheritdoc />
public string GetExternalSubtitleInputArgument(string inputFile) public string GetExternalSubtitleInputArgument(string inputFile)
{ {
const string Prefix = "file"; const string Prefix = "file";
return EncodingUtils.GetInputArgument(Prefix, inputFile, MediaProtocol.File); return EncodingUtils.GetInputArgument(Prefix, new List<string> { inputFile }, MediaProtocol.File);
} }
/// <summary> /// <summary>
@ -549,6 +543,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
} }
} }
/// <inheritdoc />
public Task<string> ExtractAudioImage(string path, int? imageStreamIndex, CancellationToken cancellationToken) public Task<string> ExtractAudioImage(string path, int? imageStreamIndex, CancellationToken cancellationToken)
{ {
var mediaSource = new MediaSourceInfo var mediaSource = new MediaSourceInfo
@ -559,11 +554,13 @@ namespace MediaBrowser.MediaEncoding.Encoder
return ExtractImage(path, null, null, imageStreamIndex, mediaSource, true, null, null, ImageFormat.Jpg, cancellationToken); return ExtractImage(path, null, null, imageStreamIndex, mediaSource, true, null, null, ImageFormat.Jpg, cancellationToken);
} }
/// <inheritdoc />
public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream videoStream, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken) public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream videoStream, Video3DFormat? threedFormat, TimeSpan? offset, CancellationToken cancellationToken)
{ {
return ExtractImage(inputFile, container, videoStream, null, mediaSource, false, threedFormat, offset, ImageFormat.Jpg, cancellationToken); return ExtractImage(inputFile, container, videoStream, null, mediaSource, false, threedFormat, offset, ImageFormat.Jpg, cancellationToken);
} }
/// <inheritdoc />
public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream imageStream, int? imageStreamIndex, ImageFormat? targetFormat, CancellationToken cancellationToken) public Task<string> ExtractVideoImage(string inputFile, string container, MediaSourceInfo mediaSource, MediaStream imageStream, int? imageStreamIndex, ImageFormat? targetFormat, CancellationToken cancellationToken)
{ {
return ExtractImage(inputFile, container, imageStream, imageStreamIndex, mediaSource, false, null, null, targetFormat, cancellationToken); return ExtractImage(inputFile, container, imageStream, imageStreamIndex, mediaSource, false, null, null, targetFormat, cancellationToken);
@ -767,6 +764,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
} }
} }
/// <inheritdoc />
public string GetTimeParameter(long ticks) public string GetTimeParameter(long ticks)
{ {
var time = TimeSpan.FromTicks(ticks); var time = TimeSpan.FromTicks(ticks);
@ -868,80 +866,56 @@ namespace MediaBrowser.MediaEncoding.Encoder
/// <inheritdoc /> /// <inheritdoc />
public IEnumerable<string> GetPrimaryPlaylistVobFiles(string path, uint? titleNumber) public IEnumerable<string> GetPrimaryPlaylistVobFiles(string path, uint? titleNumber)
{ {
// min size 300 mb // Eliminate menus and intros by omitting VIDEO_TS.VOB and all subsequent title VOBs ending with _0.VOB
const long MinPlayableSize = 314572800;
// Try to eliminate menus and intros by skipping all files at the front of the list that are less than the minimum size
// Once we reach a file that is at least the minimum, return all subsequent ones
var allVobs = _fileSystem.GetFiles(path, true) var allVobs = _fileSystem.GetFiles(path, true)
.Where(file => string.Equals(file.Extension, ".vob", StringComparison.OrdinalIgnoreCase)) .Where(file => string.Equals(file.Extension, ".VOB", StringComparison.OrdinalIgnoreCase))
.Where(file => !string.Equals(file.Name, "VIDEO_TS.VOB", StringComparison.OrdinalIgnoreCase))
.Where(file => !file.Name.EndsWith("_0.VOB", StringComparison.OrdinalIgnoreCase))
.OrderBy(i => i.FullName) .OrderBy(i => i.FullName)
.ToList(); .ToList();
// If we didn't find any satisfying the min length, just take them all
if (allVobs.Count == 0)
{
_logger.LogWarning("No vobs found in dvd structure.");
return Enumerable.Empty<string>();
}
if (titleNumber.HasValue) if (titleNumber.HasValue)
{ {
var prefix = string.Format( var prefix = string.Format(CultureInfo.InvariantCulture, "VTS_{0:D2}_", titleNumber.Value);
CultureInfo.InvariantCulture,
titleNumber.Value >= 10 ? "VTS_{0}_" : "VTS_0{0}_",
titleNumber.Value);
var vobs = allVobs.Where(i => i.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)).ToList(); var vobs = allVobs.Where(i => i.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)).ToList();
if (vobs.Count > 0) if (vobs.Count > 0)
{ {
var minSizeVobs = vobs return vobs.Select(i => i.FullName);
.SkipWhile(f => f.Length < MinPlayableSize)
.ToList();
return minSizeVobs.Count == 0 ? vobs.Select(i => i.FullName) : minSizeVobs.Select(i => i.FullName);
} }
_logger.LogWarning("Could not determine vob file list for {Path} using DvdLib. Will scan using file sizes.", path); _logger.LogWarning("Could not determine VOB file list for title {Title} of {Path}.", titleNumber, path);
} }
var files = allVobs // Check for multiple big titles (> 900 MB)
.SkipWhile(f => f.Length < MinPlayableSize) var titles = allVobs
.Where(vob => vob.Length >= 900 * 1024 * 1024)
.Select(vob => _fileSystem.GetFileNameWithoutExtension(vob).Split('_')[1])
.GroupBy(x => x)
.Select(y => y.First())
.ToList(); .ToList();
// If we didn't find any satisfying the min length, just take them all // Fall back to first title if no big title is found
if (files.Count == 0) if (titles.FirstOrDefault() == null)
{ {
_logger.LogWarning("Vob size filter resulted in zero matches. Taking all vobs."); titles.Add(_fileSystem.GetFileNameWithoutExtension(allVobs[0]).Split('_')[1]);
files = allVobs;
} }
// Assuming they're named "vts_05_01", take all files whose second part matches that of the first file // Aggregate all VOBs of the titles
if (files.Count > 0) return allVobs
{ .Where(vob => titles.Contains(_fileSystem.GetFileNameWithoutExtension(vob).Split('_')[1]))
var parts = _fileSystem.GetFileNameWithoutExtension(files[0]).Split('_'); .Select(i => i.FullName)
.ToList();
}
if (parts.Length == 3) public IEnumerable<string> GetPrimaryPlaylistM2TsFiles(string path, uint? titleNumber)
{ {
var title = parts[1]; var validPlaybackFiles = _blurayExaminer.GetDiscInfo(path).Files;
var directoryFiles = _fileSystem.GetFiles(path + "/BDMV/STREAM/");
files = files.TakeWhile(f => return directoryFiles
{ .Where(f => validPlaybackFiles.Contains(f.Name, StringComparer.OrdinalIgnoreCase))
var fileParts = _fileSystem.GetFileNameWithoutExtension(f).Split('_'); .Select(f => f.FullName);
return fileParts.Length == 3 && string.Equals(title, fileParts[1], StringComparison.OrdinalIgnoreCase);
}).ToList();
// If this resulted in not getting any vobs, just take them all
if (files.Count == 0)
{
_logger.LogWarning("Vob filename filter resulted in zero matches. Taking all vobs.");
files = allVobs;
}
}
}
return files.Select(i => i.FullName);
} }
public bool CanExtractSubtitles(string codec) public bool CanExtractSubtitles(string codec)

View File

@ -90,37 +90,50 @@ namespace MediaBrowser.Providers.MediaInfo
if (!item.IsShortcut || options.EnableRemoteContentProbe) if (!item.IsShortcut || options.EnableRemoteContentProbe)
{ {
string[] streamFileNames = null;
if (item.VideoType == VideoType.Dvd) if (item.VideoType == VideoType.Dvd)
{ {
streamFileNames = FetchFromDvdLib(item); // Fetch metadata of first VOB
var vobs = _mediaEncoder.GetPrimaryPlaylistVobFiles(item.Path, null).ToList();
mediaInfoResult = await GetMediaInfo(
new Video
{
Path = vobs.First()
},
cancellationToken).ConfigureAwait(false);
if (streamFileNames.Length == 0) // Remove first VOB
vobs.RemoveAt(0);
// Add runtime from all other VOBs
foreach (var vob in vobs)
{ {
_logger.LogError("No playable vobs found in dvd structure, skipping ffprobe."); var tmpMediaInfo = await GetMediaInfo(
return ItemUpdateType.MetadataImport; new Video
{
Path = vob
},
cancellationToken).ConfigureAwait(false);
mediaInfoResult.RunTimeTicks += tmpMediaInfo.RunTimeTicks;
} }
} }
else if (item.VideoType == VideoType.BluRay) else
{ {
var inputPath = item.Path; if (item.VideoType == VideoType.BluRay)
blurayDiscInfo = GetBDInfo(inputPath);
streamFileNames = blurayDiscInfo.Files;
if (streamFileNames.Length == 0)
{ {
_logger.LogError("No playable vobs found in bluray structure, skipping ffprobe."); blurayDiscInfo = GetBDInfo(item.Path);
return ItemUpdateType.MetadataImport;
if (blurayDiscInfo.Files.Length == 0)
{
_logger.LogError("No playable vobs found in bluray structure, skipping ffprobe.");
return ItemUpdateType.MetadataImport;
}
} }
mediaInfoResult = await GetMediaInfo(item, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
} }
streamFileNames ??= Array.Empty<string>();
mediaInfoResult = await GetMediaInfo(item, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
} }
@ -189,19 +202,8 @@ namespace MediaBrowser.Providers.MediaInfo
} }
mediaAttachments = mediaInfo.MediaAttachments; mediaAttachments = mediaInfo.MediaAttachments;
video.TotalBitrate = mediaInfo.Bitrate; video.TotalBitrate = mediaInfo.Bitrate;
// video.FormatName = (mediaInfo.Container ?? string.Empty) video.RunTimeTicks = mediaInfo.RunTimeTicks;
// .Replace("matroska", "mkv", StringComparison.OrdinalIgnoreCase);
// For DVDs 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 is null || video.RunTimeTicks.Value == 0;
if (needToSetRuntime)
{
video.RunTimeTicks = mediaInfo.RunTimeTicks;
}
video.Size = mediaInfo.Size; video.Size = mediaInfo.Size;
if (video.VideoType == VideoType.VideoFile) if (video.VideoType == VideoType.VideoFile)
@ -321,8 +323,6 @@ namespace MediaBrowser.Providers.MediaInfo
{ {
var video = (Video)item; var video = (Video)item;
// video.PlayableStreamFileNames = blurayInfo.Files.ToList();
// Use BD Info if it has multiple m2ts. Otherwise, treat it like a video file and rely more on ffprobe output // Use BD Info if it has multiple m2ts. Otherwise, treat it like a video file and rely more on ffprobe output
if (blurayInfo.Files.Length > 1) if (blurayInfo.Files.Length > 1)
{ {