2015-02-01 20:01:21 +01:00
|
|
|
|
using MediaBrowser.Common.Configuration;
|
2014-04-25 04:45:06 +02:00
|
|
|
|
using MediaBrowser.Common.IO;
|
2014-06-09 21:16:14 +02:00
|
|
|
|
using MediaBrowser.Controller.Chapters;
|
2014-05-07 04:28:19 +02:00
|
|
|
|
using MediaBrowser.Controller.Configuration;
|
2014-02-09 22:11:11 +01:00
|
|
|
|
using MediaBrowser.Controller.Entities;
|
2014-02-06 05:39:16 +01:00
|
|
|
|
using MediaBrowser.Controller.Entities.Audio;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
using MediaBrowser.Controller.Entities.Movies;
|
|
|
|
|
using MediaBrowser.Controller.Entities.TV;
|
|
|
|
|
using MediaBrowser.Controller.Library;
|
|
|
|
|
using MediaBrowser.Controller.LiveTv;
|
|
|
|
|
using MediaBrowser.Controller.Localization;
|
2014-02-20 17:37:41 +01:00
|
|
|
|
using MediaBrowser.Controller.MediaEncoding;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
using MediaBrowser.Controller.Persistence;
|
|
|
|
|
using MediaBrowser.Controller.Providers;
|
2014-05-07 04:28:19 +02:00
|
|
|
|
using MediaBrowser.Controller.Subtitles;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
using MediaBrowser.Model.Entities;
|
|
|
|
|
using MediaBrowser.Model.IO;
|
|
|
|
|
using MediaBrowser.Model.Logging;
|
|
|
|
|
using MediaBrowser.Model.MediaInfo;
|
2014-02-10 19:39:41 +01:00
|
|
|
|
using MediaBrowser.Model.Serialization;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
using System;
|
2015-02-01 20:01:21 +01:00
|
|
|
|
using System.IO;
|
2014-05-07 04:28:19 +02:00
|
|
|
|
using System.Linq;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2015-10-04 06:23:11 +02:00
|
|
|
|
using CommonIO;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Providers.MediaInfo
|
|
|
|
|
{
|
|
|
|
|
public class FFProbeProvider : ICustomMetadataProvider<Episode>,
|
2014-02-06 05:39:16 +01:00
|
|
|
|
ICustomMetadataProvider<MusicVideo>,
|
|
|
|
|
ICustomMetadataProvider<Movie>,
|
|
|
|
|
ICustomMetadataProvider<LiveTvVideoRecording>,
|
|
|
|
|
ICustomMetadataProvider<LiveTvAudioRecording>,
|
|
|
|
|
ICustomMetadataProvider<Video>,
|
|
|
|
|
ICustomMetadataProvider<Audio>,
|
2014-09-11 03:57:11 +02:00
|
|
|
|
IHasItemChangeMonitor,
|
2014-02-19 06:21:03 +01:00
|
|
|
|
IHasOrder,
|
2015-03-05 07:34:36 +01:00
|
|
|
|
IForcedProvider,
|
|
|
|
|
IPreRefreshProvider
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
|
|
|
|
private readonly ILogger _logger;
|
|
|
|
|
private readonly IIsoManager _isoManager;
|
|
|
|
|
private readonly IMediaEncoder _mediaEncoder;
|
|
|
|
|
private readonly IItemRepository _itemRepo;
|
|
|
|
|
private readonly IBlurayExaminer _blurayExaminer;
|
|
|
|
|
private readonly ILocalizationManager _localization;
|
2014-02-09 22:11:11 +01:00
|
|
|
|
private readonly IApplicationPaths _appPaths;
|
|
|
|
|
private readonly IJsonSerializer _json;
|
2014-02-20 17:37:41 +01:00
|
|
|
|
private readonly IEncodingManager _encodingManager;
|
2014-04-25 04:45:06 +02:00
|
|
|
|
private readonly IFileSystem _fileSystem;
|
2014-05-07 04:28:19 +02:00
|
|
|
|
private readonly IServerConfigurationManager _config;
|
|
|
|
|
private readonly ISubtitleManager _subtitleManager;
|
2014-06-09 21:16:14 +02:00
|
|
|
|
private readonly IChapterManager _chapterManager;
|
2015-06-29 03:10:45 +02:00
|
|
|
|
private readonly ILibraryManager _libraryManager;
|
2014-02-06 05:39:16 +01:00
|
|
|
|
|
2014-02-04 21:19:29 +01:00
|
|
|
|
public string Name
|
|
|
|
|
{
|
|
|
|
|
get { return "ffprobe"; }
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(Episode item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return FetchVideoInfo(item, options, cancellationToken);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(MusicVideo item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return FetchVideoInfo(item, options, cancellationToken);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(Movie item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return FetchVideoInfo(item, options, cancellationToken);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(LiveTvVideoRecording item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return FetchVideoInfo(item, options, cancellationToken);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(Video item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-06 05:39:16 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return FetchVideoInfo(item, options, cancellationToken);
|
2014-02-06 05:39:16 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(Audio item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-06 05:39:16 +01:00
|
|
|
|
{
|
|
|
|
|
return FetchAudioInfo(item, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchAsync(LiveTvAudioRecording item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-06 05:39:16 +01:00
|
|
|
|
{
|
|
|
|
|
return FetchAudioInfo(item, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-29 03:10:45 +02:00
|
|
|
|
public FFProbeProvider(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)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
|
|
|
|
_logger = logger;
|
|
|
|
|
_isoManager = isoManager;
|
|
|
|
|
_mediaEncoder = mediaEncoder;
|
|
|
|
|
_itemRepo = itemRepo;
|
|
|
|
|
_blurayExaminer = blurayExaminer;
|
|
|
|
|
_localization = localization;
|
2014-02-09 22:11:11 +01:00
|
|
|
|
_appPaths = appPaths;
|
|
|
|
|
_json = json;
|
2014-02-23 07:14:48 +01:00
|
|
|
|
_encodingManager = encodingManager;
|
2014-04-25 04:45:06 +02:00
|
|
|
|
_fileSystem = fileSystem;
|
2014-05-07 04:28:19 +02:00
|
|
|
|
_config = config;
|
|
|
|
|
_subtitleManager = subtitleManager;
|
2014-06-09 21:16:14 +02:00
|
|
|
|
_chapterManager = chapterManager;
|
2015-06-29 03:10:45 +02:00
|
|
|
|
_libraryManager = libraryManager;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-10 19:39:41 +01:00
|
|
|
|
private readonly Task<ItemUpdateType> _cachedTask = Task.FromResult(ItemUpdateType.None);
|
2014-06-09 21:16:14 +02:00
|
|
|
|
public Task<ItemUpdateType> FetchVideoInfo<T>(T item, MetadataRefreshOptions options, CancellationToken cancellationToken)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
where T : Video
|
|
|
|
|
{
|
|
|
|
|
if (item.LocationType != LocationType.FileSystem)
|
|
|
|
|
{
|
|
|
|
|
return _cachedTask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (item.VideoType == VideoType.Iso && !_isoManager.CanMount(item.Path))
|
|
|
|
|
{
|
|
|
|
|
return _cachedTask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (item.VideoType == VideoType.HdDvd)
|
|
|
|
|
{
|
|
|
|
|
return _cachedTask;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-15 02:05:09 +02:00
|
|
|
|
if (item.IsPlaceHolder)
|
2014-03-03 06:11:03 +01:00
|
|
|
|
{
|
|
|
|
|
return _cachedTask;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-15 02:05:09 +02:00
|
|
|
|
if (item.IsShortcut)
|
|
|
|
|
{
|
|
|
|
|
FetchShortcutInfo(item);
|
2015-07-13 23:26:11 +02:00
|
|
|
|
return Task.FromResult(ItemUpdateType.MetadataImport);
|
2014-10-15 02:05:09 +02:00
|
|
|
|
}
|
2015-06-29 03:10:45 +02:00
|
|
|
|
|
|
|
|
|
var prober = new FFProbeVideoInfo(_logger, _isoManager, _mediaEncoder, _itemRepo, _blurayExaminer, _localization, _appPaths, _json, _encodingManager, _fileSystem, _config, _subtitleManager, _chapterManager, _libraryManager);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return prober.ProbeVideo(item, options, cancellationToken);
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
|
2014-10-15 02:05:09 +02:00
|
|
|
|
private void FetchShortcutInfo(Video video)
|
|
|
|
|
{
|
2015-09-13 23:32:02 +02:00
|
|
|
|
video.ShortcutPath = _fileSystem.ReadAllText(video.Path);
|
2014-10-15 02:05:09 +02:00
|
|
|
|
}
|
|
|
|
|
|
2014-02-06 05:39:16 +01:00
|
|
|
|
public Task<ItemUpdateType> FetchAudioInfo<T>(T item, CancellationToken cancellationToken)
|
|
|
|
|
where T : Audio
|
|
|
|
|
{
|
|
|
|
|
if (item.LocationType != LocationType.FileSystem)
|
|
|
|
|
{
|
|
|
|
|
return _cachedTask;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-29 03:10:45 +02:00
|
|
|
|
var prober = new FFProbeAudioInfo(_mediaEncoder, _itemRepo, _appPaths, _json, _libraryManager);
|
2014-02-06 05:39:16 +01:00
|
|
|
|
|
|
|
|
|
return prober.Probe(item, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-11 03:57:11 +02:00
|
|
|
|
public bool HasChanged(IHasMetadata item, MetadataStatus status, IDirectoryService directoryService)
|
2014-02-04 21:19:29 +01:00
|
|
|
|
{
|
2014-09-11 03:57:11 +02:00
|
|
|
|
if (status.ItemDateModified.HasValue)
|
2014-02-10 19:39:41 +01:00
|
|
|
|
{
|
2014-09-11 03:57:11 +02:00
|
|
|
|
if (status.ItemDateModified.Value != item.DateModified)
|
2014-08-29 02:49:25 +02:00
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-02-10 21:11:46 +01:00
|
|
|
|
if (item.SupportsLocalMetadata)
|
2014-02-10 19:39:41 +01:00
|
|
|
|
{
|
|
|
|
|
var video = item as Video;
|
|
|
|
|
|
2014-03-03 06:11:03 +01:00
|
|
|
|
if (video != null && !video.IsPlaceHolder)
|
2014-02-10 19:39:41 +01:00
|
|
|
|
{
|
2014-06-09 21:16:14 +02:00
|
|
|
|
return !video.SubtitleFiles
|
2014-07-26 19:30:15 +02:00
|
|
|
|
.SequenceEqual(SubtitleResolver.GetSubtitleFiles(video, directoryService, _fileSystem, false)
|
2014-06-09 21:16:14 +02:00
|
|
|
|
.Select(i => i.FullName)
|
|
|
|
|
.OrderBy(i => i), StringComparer.OrdinalIgnoreCase);
|
2014-02-10 19:39:41 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
2014-02-09 00:44:49 +01:00
|
|
|
|
|
|
|
|
|
public int Order
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
// Run last
|
|
|
|
|
return 100;
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-02-04 21:19:29 +01:00
|
|
|
|
}
|
|
|
|
|
}
|