diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-12-05 22:39:44 -0500 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-12-05 22:39:44 -0500 |
| commit | 5f0d8000a5ec26fd66c5f188f3bb517bb139b74b (patch) | |
| tree | 769514a446fc33ba812d1a9a05a66f0845c9e590 /MediaBrowser.Providers | |
| parent | ebe483db9a5d31528a644200a71f2b36ac2864bd (diff) | |
moved media streams to the database
Diffstat (limited to 'MediaBrowser.Providers')
6 files changed, 81 insertions, 128 deletions
diff --git a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs index 70d9e788d5..3914ba2647 100644 --- a/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs +++ b/MediaBrowser.Providers/ImageFromMediaLocationProvider.cs @@ -108,7 +108,12 @@ namespace MediaBrowser.Providers // Make sure current backdrop paths still exist item.ValidateBackdrops(); - item.ValidateScreenshots(); + + var hasScreenshots = item as IHasScreenshots; + if (hasScreenshots != null) + { + hasScreenshots.ValidateScreenshots(); + } cancellationToken.ThrowIfCancellationRequested(); diff --git a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs index 683dd42310..914f5b290c 100644 --- a/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs @@ -127,7 +127,7 @@ namespace MediaBrowser.Providers.MediaInfo var audio = (Audio)item; - if (string.IsNullOrEmpty(audio.PrimaryImagePath) && audio.MediaStreams.Any(s => s.Type == MediaStreamType.Video)) + if (string.IsNullOrEmpty(audio.PrimaryImagePath) && audio.HasEmbeddedImage) { try { diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs index 3594c53c5b..42ba2d7b0c 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Logging; using MediaBrowser.Model.Serialization; @@ -19,9 +20,12 @@ namespace MediaBrowser.Providers.MediaInfo /// </summary> public class FFProbeAudioInfoProvider : BaseFFProbeProvider<Audio> { - public FFProbeAudioInfoProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IMediaEncoder mediaEncoder, IJsonSerializer jsonSerializer) + private readonly IItemRepository _itemRepo; + + public FFProbeAudioInfoProvider(ILogManager logManager, IServerConfigurationManager configurationManager, IMediaEncoder mediaEncoder, IJsonSerializer jsonSerializer, IItemRepository itemRepo) : base(logManager, configurationManager, mediaEncoder, jsonSerializer) { + _itemRepo = itemRepo; } public override async Task<bool> FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken) @@ -38,7 +42,7 @@ namespace MediaBrowser.Providers.MediaInfo cancellationToken.ThrowIfCancellationRequested(); - Fetch(myItem, cancellationToken, result); + await Fetch(myItem, cancellationToken, result).ConfigureAwait(false); SetLastRefreshed(item, DateTime.UtcNow); @@ -51,22 +55,19 @@ namespace MediaBrowser.Providers.MediaInfo /// <param name="audio">The audio.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="data">The data.</param> - /// <param name="isoMount">The iso mount.</param> /// <returns>Task.</returns> - protected void Fetch(Audio audio, CancellationToken cancellationToken, MediaInfoResult data) + protected Task Fetch(Audio audio, CancellationToken cancellationToken, MediaInfoResult data) { - if (data.streams == null) - { - Logger.Error("Audio item has no streams: " + audio.Path); - return; - } + var internalStreams = data.streams ?? new MediaStreamInfo[] { }; - audio.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)) + var mediaStreams = internalStreams.Select(s => GetMediaStream(s, data.format)) .Where(i => i != null) .ToList(); + audio.HasEmbeddedImage = mediaStreams.Any(i => i.Type == MediaStreamType.Video); + // Get the first audio stream - var stream = data.streams.FirstOrDefault(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase)); + var stream = internalStreams.FirstOrDefault(s => s.codec_type.Equals("audio", StringComparison.OrdinalIgnoreCase)); if (stream != null) { @@ -90,6 +91,8 @@ namespace MediaBrowser.Providers.MediaInfo { FetchDataFromTags(audio, data.format.tags); } + + return _itemRepo.SaveMediaStreams(audio.Id, mediaStreams, cancellationToken); } /// <summary> diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs index 4fb65a764d..c09076bff4 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs @@ -304,11 +304,17 @@ namespace MediaBrowser.Providers.MediaInfo } } + List<MediaStream> mediaStreams; + if (data.streams != null) { - video.MediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)) - .Where(i => i != null) - .ToList(); + mediaStreams = data.streams.Select(s => GetMediaStream(s, data.format)) + .Where(i => i != null) + .ToList(); + } + else + { + mediaStreams = new List<MediaStream>(); } var chapters = data.Chapters ?? new List<ChapterInfo>(); @@ -316,22 +322,28 @@ namespace MediaBrowser.Providers.MediaInfo if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay)) { var inputPath = isoMount != null ? isoMount.MountedPath : video.Path; - FetchBdInfo(video, chapters, inputPath, cancellationToken); + FetchBdInfo(video, chapters, mediaStreams, inputPath, cancellationToken); } - AddExternalSubtitles(video); + AddExternalSubtitles(video, mediaStreams); FetchWtvInfo(video, force, data); - video.IsHD = video.MediaStreams.Any(i => i.Type == MediaStreamType.Video && i.Width.HasValue && i.Width.Value >= 1270); + video.IsHD = mediaStreams.Any(i => i.Type == MediaStreamType.Video && i.Width.HasValue && i.Width.Value >= 1270); - if (chapters.Count == 0 && video.MediaStreams.Any(i => i.Type == MediaStreamType.Video)) + if (chapters.Count == 0 && mediaStreams.Any(i => i.Type == MediaStreamType.Video)) { AddDummyChapters(video, chapters); } - await Kernel.Instance.FFMpegManager.PopulateChapterImages(video, chapters, false, false, cancellationToken).ConfigureAwait(false); + var videoStream = mediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + + video.VideoBitRate = videoStream == null ? null : videoStream.BitRate; + video.DefaultVideoStreamIndex = videoStream == null ? (int?)null : videoStream.Index; + video.HasSubtitles = mediaStreams.Any(i => i.Type == MediaStreamType.Subtitle); + + await Kernel.Instance.FFMpegManager.PopulateChapterImages(video, chapters, false, false, cancellationToken).ConfigureAwait(false); BaseProviderInfo providerInfo; var videoFileChanged = false; @@ -341,6 +353,8 @@ namespace MediaBrowser.Providers.MediaInfo videoFileChanged = CompareDate(video) > providerInfo.LastRefreshed; } + await _itemRepo.SaveMediaStreams(video.Id, mediaStreams, cancellationToken).ConfigureAwait(false); + // Only save chapters if forcing, if the video changed, or if there are not already any saved ones if (force || videoFileChanged || _itemRepo.GetChapter(video.Id, 0) == null) { @@ -439,7 +453,8 @@ namespace MediaBrowser.Providers.MediaInfo /// Adds the external subtitles. /// </summary> /// <param name="video">The video.</param> - private void AddExternalSubtitles(Video video) + /// <param name="currentStreams">The current streams.</param> + private void AddExternalSubtitles(Video video, List<MediaStream> currentStreams) { var useParent = !video.ResolveArgs.IsDirectory; @@ -452,7 +467,7 @@ namespace MediaBrowser.Providers.MediaInfo ? video.Parent.ResolveArgs.FileSystemChildren : video.ResolveArgs.FileSystemChildren; - var startIndex = video.MediaStreams == null ? 0 : video.MediaStreams.Count; + var startIndex = currentStreams.Count; var streams = new List<MediaStream>(); var videoFileNameWithoutExtension = Path.GetFileNameWithoutExtension(video.Path); @@ -503,11 +518,7 @@ namespace MediaBrowser.Providers.MediaInfo } } - if (video.MediaStreams == null) - { - video.MediaStreams = new List<MediaStream>(); - } - video.MediaStreams.AddRange(streams); + currentStreams.AddRange(streams); } /// <summary> @@ -556,9 +567,10 @@ namespace MediaBrowser.Providers.MediaInfo /// </summary> /// <param name="item">The item.</param> /// <param name="chapters">The chapters.</param> + /// <param name="mediaStreams">The media streams.</param> /// <param name="inputPath">The input path.</param> /// <param name="cancellationToken">The cancellation token.</param> - private void FetchBdInfo(BaseItem item, List<ChapterInfo> chapters, string inputPath, CancellationToken cancellationToken) + private void FetchBdInfo(BaseItem item, List<ChapterInfo> chapters, List<MediaStream> mediaStreams, string inputPath, CancellationToken cancellationToken) { var video = (Video)item; @@ -570,7 +582,7 @@ namespace MediaBrowser.Providers.MediaInfo int? currentWidth = null; int? currentBitRate = null; - var videoStream = video.MediaStreams.FirstOrDefault(s => s.Type == MediaStreamType.Video); + var videoStream = mediaStreams.FirstOrDefault(s => s.Type == MediaStreamType.Video); // Grab the values that ffprobe recorded if (videoStream != null) @@ -581,9 +593,9 @@ namespace MediaBrowser.Providers.MediaInfo } // Fill video properties from the BDInfo result - Fetch(video, result, chapters); + Fetch(video, mediaStreams, result, chapters); - videoStream = video.MediaStreams.FirstOrDefault(s => s.Type == MediaStreamType.Video); + videoStream = mediaStreams.FirstOrDefault(s => s.Type == MediaStreamType.Video); // Use the ffprobe values if these are empty if (videoStream != null) @@ -608,13 +620,15 @@ namespace MediaBrowser.Providers.MediaInfo /// Fills video properties from the VideoStream of the largest playlist /// </summary> /// <param name="video">The video.</param> + /// <param name="mediaStreams">The media streams.</param> /// <param name="stream">The stream.</param> /// <param name="chapters">The chapters.</param> - private void Fetch(Video video, BlurayDiscInfo stream, List<ChapterInfo> chapters) + private void Fetch(Video video, List<MediaStream> mediaStreams, BlurayDiscInfo stream, List<ChapterInfo> chapters) { // Check all input for null/empty/zero - video.MediaStreams = stream.MediaStreams; + mediaStreams.Clear(); + mediaStreams.AddRange(stream.MediaStreams); video.MainFeaturePlaylistName = stream.PlaylistName; diff --git a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs index b577420428..551f9d8f2d 100644 --- a/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs +++ b/MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs @@ -128,7 +128,7 @@ namespace MediaBrowser.Providers.MediaInfo } // Can't extract if we didn't find a video stream in the file - if (item.MediaStreams.All(m => m.Type != MediaStreamType.Video)) + if (!item.DefaultVideoStreamIndex.HasValue) { return false; } diff --git a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs index a4e4ce1a80..522b2c90bb 100644 --- a/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs +++ b/MediaBrowser.Providers/Savers/XmlSaverHelpers.cs @@ -529,8 +529,6 @@ namespace MediaBrowser.Providers.Savers /// Appends the media info. /// </summary> /// <typeparam name="T"></typeparam> - /// <param name="item">The item.</param> - /// <param name="builder">The builder.</param> public static void AddMediaInfo<T>(T item, StringBuilder builder, IItemRepository itemRepository) where T : BaseItem, IHasMediaStreams { @@ -538,105 +536,38 @@ namespace MediaBrowser.Providers.Savers builder.Append("<MediaInfo>"); - foreach (var stream in item.MediaStreams) - { - builder.Append("<" + stream.Type + ">"); - - if (!string.IsNullOrEmpty(stream.Codec)) - { - builder.Append("<Codec>" + SecurityElement.Escape(stream.Codec) + "</Codec>"); - builder.Append("<FFCodec>" + SecurityElement.Escape(stream.Codec) + "</FFCodec>"); - } - - if (stream.BitRate.HasValue) - { - builder.Append("<BitRate>" + stream.BitRate.Value.ToString(UsCulture) + "</BitRate>"); - } - - if (stream.Width.HasValue) - { - builder.Append("<Width>" + stream.Width.Value.ToString(UsCulture) + "</Width>"); - } - - if (stream.Height.HasValue) - { - builder.Append("<Height>" + stream.Height.Value.ToString(UsCulture) + "</Height>"); - } - - if (!string.IsNullOrEmpty(stream.AspectRatio)) - { - builder.Append("<AspectRatio>" + SecurityElement.Escape(stream.AspectRatio) + "</AspectRatio>"); - } - - var framerate = stream.AverageFrameRate ?? stream.RealFrameRate; - - if (framerate.HasValue) - { - builder.Append("<FrameRate>" + framerate.Value.ToString(UsCulture) + "</FrameRate>"); - } - - if (!string.IsNullOrEmpty(stream.Language)) - { - builder.Append("<Language>" + SecurityElement.Escape(stream.Language) + "</Language>"); - } + builder.Append("<Video>"); - if (!string.IsNullOrEmpty(stream.ScanType)) - { - builder.Append("<ScanType>" + SecurityElement.Escape(stream.ScanType) + "</ScanType>"); - } - - if (stream.Channels.HasValue) - { - builder.Append("<Channels>" + stream.Channels.Value.ToString(UsCulture) + "</Channels>"); - } - - if (stream.SampleRate.HasValue) - { - builder.Append("<SamplingRate>" + stream.SampleRate.Value.ToString(UsCulture) + "</SamplingRate>"); - } + if (item.RunTimeTicks.HasValue) + { + var timespan = TimeSpan.FromTicks(item.RunTimeTicks.Value); - builder.Append("<Default>" + SecurityElement.Escape(stream.IsDefault.ToString()) + "</Default>"); - builder.Append("<Forced>" + SecurityElement.Escape(stream.IsForced.ToString()) + "</Forced>"); + builder.Append("<Duration>" + Convert.ToInt64(timespan.TotalMinutes).ToString(UsCulture) + "</Duration>"); + builder.Append("<DurationSeconds>" + Convert.ToInt64(timespan.TotalSeconds).ToString(UsCulture) + "</DurationSeconds>"); + } - if (stream.Type == MediaStreamType.Video) + if (video != null && video.Video3DFormat.HasValue) + { + switch (video.Video3DFormat.Value) { - if (item.RunTimeTicks.HasValue) - { - var timespan = TimeSpan.FromTicks(item.RunTimeTicks.Value); - - builder.Append("<Duration>" + Convert.ToInt64(timespan.TotalMinutes).ToString(UsCulture) + "</Duration>"); - builder.Append("<DurationSeconds>" + Convert.ToInt64(timespan.TotalSeconds).ToString(UsCulture) + "</DurationSeconds>"); - } - - if (video != null && video.Video3DFormat.HasValue) - { - switch (video.Video3DFormat.Value) - { - case Video3DFormat.FullSideBySide: - builder.Append("<Format3D>FSBS</Format3D>"); - break; - case Video3DFormat.FullTopAndBottom: - builder.Append("<Format3D>FTAB</Format3D>"); - break; - case Video3DFormat.HalfSideBySide: - builder.Append("<Format3D>HSBS</Format3D>"); - break; - case Video3DFormat.HalfTopAndBottom: - builder.Append("<Format3D>HTAB</Format3D>"); - break; - } - } + case Video3DFormat.FullSideBySide: + builder.Append("<Format3D>FSBS</Format3D>"); + break; + case Video3DFormat.FullTopAndBottom: + builder.Append("<Format3D>FTAB</Format3D>"); + break; + case Video3DFormat.HalfSideBySide: + builder.Append("<Format3D>HSBS</Format3D>"); + break; + case Video3DFormat.HalfTopAndBottom: + builder.Append("<Format3D>HTAB</Format3D>"); + break; } - - builder.Append("</" + stream.Type + ">"); } - builder.Append("</MediaInfo>"); + builder.Append("</Video>"); - if (video != null) - { - //AddChapters(video, builder, itemRepository); - } + builder.Append("</MediaInfo>"); } } } |
