|
@@ -25,9 +25,6 @@ using System.IO;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Threading.Tasks;
|
|
-
|
|
|
|
-using MediaBrowser.Controller.IO;
|
|
|
|
-using MediaBrowser.Model.IO;
|
|
|
|
using MediaBrowser.Model.Globalization;
|
|
using MediaBrowser.Model.Globalization;
|
|
|
|
|
|
namespace MediaBrowser.Providers.MediaInfo
|
|
namespace MediaBrowser.Providers.MediaInfo
|
|
@@ -49,8 +46,6 @@ namespace MediaBrowser.Providers.MediaInfo
|
|
private readonly IChapterManager _chapterManager;
|
|
private readonly IChapterManager _chapterManager;
|
|
private readonly ILibraryManager _libraryManager;
|
|
private readonly ILibraryManager _libraryManager;
|
|
|
|
|
|
- private readonly CultureInfo _usCulture = new CultureInfo("en-US");
|
|
|
|
-
|
|
|
|
public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager)
|
|
public FFProbeVideoInfo(ILogger logger, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepo, IBlurayExaminer blurayExaminer, ILocalizationManager localization, IApplicationPaths appPaths, IJsonSerializer json, IEncodingManager encodingManager, IFileSystem fileSystem, IServerConfigurationManager config, ISubtitleManager subtitleManager, IChapterManager chapterManager, ILibraryManager libraryManager)
|
|
{
|
|
{
|
|
_logger = logger;
|
|
_logger = logger;
|
|
@@ -565,8 +560,8 @@ namespace MediaBrowser.Providers.MediaInfo
|
|
titleNumber = primaryTitle.VideoTitleSetNumber;
|
|
titleNumber = primaryTitle.VideoTitleSetNumber;
|
|
item.RunTimeTicks = GetRuntime(primaryTitle);
|
|
item.RunTimeTicks = GetRuntime(primaryTitle);
|
|
}
|
|
}
|
|
-
|
|
|
|
- return GetPrimaryPlaylistVobFiles(item, mount, titleNumber)
|
|
|
|
|
|
+
|
|
|
|
+ return _mediaEncoder.GetPrimaryPlaylistVobFiles(item.Path, mount, titleNumber)
|
|
.Select(Path.GetFileName)
|
|
.Select(Path.GetFileName)
|
|
.ToArray();
|
|
.ToArray();
|
|
}
|
|
}
|
|
@@ -616,82 +611,5 @@ namespace MediaBrowser.Providers.MediaInfo
|
|
|
|
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
-
|
|
|
|
- private IEnumerable<string> GetPrimaryPlaylistVobFiles(Video video, IIsoMount isoMount, uint? titleNumber)
|
|
|
|
- {
|
|
|
|
- // min size 300 mb
|
|
|
|
- const long minPlayableSize = 314572800;
|
|
|
|
-
|
|
|
|
- var root = isoMount != null ? isoMount.MountedPath : video.Path;
|
|
|
|
-
|
|
|
|
- // 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(root, new[] { ".vob" }, false, true)
|
|
|
|
- .OrderBy(i => i.FullName)
|
|
|
|
- .ToList();
|
|
|
|
-
|
|
|
|
- // If we didn't find any satisfying the min length, just take them all
|
|
|
|
- if (allVobs.Count == 0)
|
|
|
|
- {
|
|
|
|
- _logger.Error("No vobs found in dvd structure.");
|
|
|
|
- return new List<string>();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (titleNumber.HasValue)
|
|
|
|
- {
|
|
|
|
- var prefix = string.Format("VTS_0{0}_", titleNumber.Value.ToString(_usCulture));
|
|
|
|
- var vobs = allVobs.Where(i => i.Name.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)).ToList();
|
|
|
|
-
|
|
|
|
- if (vobs.Count > 0)
|
|
|
|
- {
|
|
|
|
- var minSizeVobs = vobs
|
|
|
|
- .SkipWhile(f => f.Length < minPlayableSize)
|
|
|
|
- .ToList();
|
|
|
|
-
|
|
|
|
- return minSizeVobs.Count == 0 ? vobs.Select(i => i.FullName) : minSizeVobs.Select(i => i.FullName);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- _logger.Info("Could not determine vob file list for {0} using DvdLib. Will scan using file sizes.", video.Path);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var files = allVobs
|
|
|
|
- .SkipWhile(f => f.Length < minPlayableSize)
|
|
|
|
- .ToList();
|
|
|
|
-
|
|
|
|
- // If we didn't find any satisfying the min length, just take them all
|
|
|
|
- if (files.Count == 0)
|
|
|
|
- {
|
|
|
|
- _logger.Warn("Vob size filter resulted in zero matches. Taking all vobs.");
|
|
|
|
- files = allVobs;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Assuming they're named "vts_05_01", take all files whose second part matches that of the first file
|
|
|
|
- if (files.Count > 0)
|
|
|
|
- {
|
|
|
|
- var parts = _fileSystem.GetFileNameWithoutExtension(files[0]).Split('_');
|
|
|
|
-
|
|
|
|
- if (parts.Length == 3)
|
|
|
|
- {
|
|
|
|
- var title = parts[1];
|
|
|
|
-
|
|
|
|
- files = files.TakeWhile(f =>
|
|
|
|
- {
|
|
|
|
- var fileParts = _fileSystem.GetFileNameWithoutExtension(f).Split('_');
|
|
|
|
-
|
|
|
|
- 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.Warn("Vob filename filter resulted in zero matches. Taking all vobs.");
|
|
|
|
- files = allVobs;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- return files.Select(i => i.FullName);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|