aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Providers
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2013-12-05 22:39:44 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2013-12-05 22:39:44 -0500
commit5f0d8000a5ec26fd66c5f188f3bb517bb139b74b (patch)
tree769514a446fc33ba812d1a9a05a66f0845c9e590 /MediaBrowser.Providers
parentebe483db9a5d31528a644200a71f2b36ac2864bd (diff)
moved media streams to the database
Diffstat (limited to 'MediaBrowser.Providers')
-rw-r--r--MediaBrowser.Providers/ImageFromMediaLocationProvider.cs7
-rw-r--r--MediaBrowser.Providers/MediaInfo/AudioImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeAudioInfoProvider.cs25
-rw-r--r--MediaBrowser.Providers/MediaInfo/FFProbeVideoInfoProvider.cs56
-rw-r--r--MediaBrowser.Providers/MediaInfo/VideoImageProvider.cs2
-rw-r--r--MediaBrowser.Providers/Savers/XmlSaverHelpers.cs117
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>");
}
}
}