From 5f0d8000a5ec26fd66c5f188f3bb517bb139b74b Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 5 Dec 2013 22:39:44 -0500 Subject: [PATCH] moved media streams to the database --- MediaBrowser.Api/LibraryService.cs | 38 -- .../Playback/BaseStreamingService.cs | 22 +- .../Playback/Hls/AudioHlsService.cs | 13 +- .../Playback/Hls/BaseHlsService.cs | 21 +- .../Playback/Hls/VideoHlsService.cs | 26 +- .../BaseProgressiveStreamingService.cs | 5 +- MediaBrowser.Api/UserLibrary/ItemsService.cs | 12 +- .../Entities/Audio/Audio.cs | 14 +- MediaBrowser.Controller/Entities/Book.cs | 15 +- .../Entities/IHasMediaStreams.cs | 10 + .../Entities/IHasScreenshots.cs | 5 + MediaBrowser.Controller/Entities/Video.cs | 37 +- .../MediaBrowser.Controller.csproj | 2 + .../MediaInfo/FFMpegManager.cs | 18 +- .../Persistence/IItemRepository.cs | 16 + .../Persistence/MediaStreamQuery.cs | 26 ++ .../Resolvers/EntityResolutionHelper.cs | 2 +- .../MediaBrowser.Model.Portable.csproj | 3 - .../MediaBrowser.Model.net35.csproj | 3 - MediaBrowser.Model/Dto/ItemCounts.cs | 3 - .../Entities/IHasMediaStreams.cs | 26 -- MediaBrowser.Model/Entities/MediaStream.cs | 6 +- MediaBrowser.Model/MediaBrowser.Model.csproj | 1 - .../ImageFromMediaLocationProvider.cs | 7 +- .../MediaInfo/AudioImageProvider.cs | 2 +- .../MediaInfo/FFProbeAudioInfoProvider.cs | 25 +- .../MediaInfo/FFProbeVideoInfoProvider.cs | 56 ++- .../MediaInfo/VideoImageProvider.cs | 2 +- .../Savers/XmlSaverHelpers.cs | 117 ++---- .../BdInfo/BdInfoExaminer.cs | 4 +- .../Dto/DtoService.cs | 6 +- ...MediaBrowser.Server.Implementations.csproj | 1 + .../Persistence/SqliteItemRepository.cs | 24 ++ .../SqliteMediaStreamsRepository.cs | 377 ++++++++++++++++++ .../Persistence/SqliteUserDataRepository.cs | 18 +- .../ScheduledTasks/ChapterImagesTask.cs | 2 +- .../Sorting/VideoBitRateComparer.cs | 12 +- .../ApplicationHost.cs | 2 +- .../FFMpeg/FFMpegDownloadInfo.cs | 2 +- 39 files changed, 653 insertions(+), 328 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/IHasMediaStreams.cs create mode 100644 MediaBrowser.Controller/Persistence/MediaStreamQuery.cs delete mode 100644 MediaBrowser.Model/Entities/IHasMediaStreams.cs create mode 100644 MediaBrowser.Server.Implementations/Persistence/SqliteMediaStreamsRepository.cs diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs index 51eef225ed..48037e8015 100644 --- a/MediaBrowser.Api/LibraryService.cs +++ b/MediaBrowser.Api/LibraryService.cs @@ -370,44 +370,6 @@ namespace MediaBrowser.Api UniqueTypes = items.Select(i => i.GetClientTypeName()).Distinct().ToList() }; - var people = items.SelectMany(i => i.People) - .Select(i => i.Name) - .Distinct(StringComparer.OrdinalIgnoreCase) - .Select(i => - { - try - { - return _libraryManager.GetPerson(i); - } - catch - { - return null; - } - }) - .Where(i => i != null) - .ToList(); - - people = request.UserId.HasValue ? FilterItems(people, request, request.UserId.Value).ToList() : people; - counts.PersonCount = people.Count; - - var artists = _libraryManager.GetAllArtists(items) - .Select(i => - { - try - { - return _libraryManager.GetArtist(i); - } - catch - { - return null; - } - }) - .Where(i => i != null) - .ToList(); - - artists = request.UserId.HasValue ? FilterItems(artists, request, request.UserId.Value).ToList() : artists; - counts.ArtistCount = artists.Count; - return ToOptimizedResult(counts); } diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 9ad0703ae6..e34f0888da 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -7,6 +7,7 @@ using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.MediaInfo; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -59,7 +60,9 @@ namespace MediaBrowser.Api.Playback protected IDtoService DtoService { get; private set; } protected IFileSystem FileSystem { get; private set; } - + + protected IItemRepository ItemRepository { get; private set; } + /// /// Initializes a new instance of the class. /// @@ -68,8 +71,9 @@ namespace MediaBrowser.Api.Playback /// The library manager. /// The iso manager. /// The media encoder. - protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) + protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository) { + ItemRepository = itemRepository; FileSystem = fileSystem; DtoService = dtoService; ApplicationPaths = appPaths; @@ -803,6 +807,12 @@ namespace MediaBrowser.Api.Playback var videoRequest = request as VideoStreamRequest; + var mediaStreams = ItemRepository.GetMediaStreams(new MediaStreamQuery + { + ItemId = item.Id + + }).ToList(); + if (videoRequest != null) { if (!videoRequest.VideoCodec.HasValue) @@ -810,13 +820,13 @@ namespace MediaBrowser.Api.Playback videoRequest.VideoCodec = InferVideoCodec(url); } - state.VideoStream = GetMediaStream(media.MediaStreams, videoRequest.VideoStreamIndex, MediaStreamType.Video); - state.SubtitleStream = GetMediaStream(media.MediaStreams, videoRequest.SubtitleStreamIndex, MediaStreamType.Subtitle, false); - state.AudioStream = GetMediaStream(media.MediaStreams, videoRequest.AudioStreamIndex, MediaStreamType.Audio); + state.VideoStream = GetMediaStream(mediaStreams, videoRequest.VideoStreamIndex, MediaStreamType.Video); + state.SubtitleStream = GetMediaStream(mediaStreams, videoRequest.SubtitleStreamIndex, MediaStreamType.Subtitle, false); + state.AudioStream = GetMediaStream(mediaStreams, videoRequest.AudioStreamIndex, MediaStreamType.Audio); } else { - state.AudioStream = GetMediaStream(media.MediaStreams, null, MediaStreamType.Audio, true); + state.AudioStream = GetMediaStream(mediaStreams, null, MediaStreamType.Audio, true); } return state; diff --git a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs index 6636db05d2..073cd1b7fc 100644 --- a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using MediaBrowser.Model.IO; using ServiceStack.ServiceHost; @@ -25,16 +26,8 @@ namespace MediaBrowser.Api.Playback.Hls /// public class AudioHlsService : BaseHlsService { - /// - /// Initializes a new instance of the class. - /// - /// The app paths. - /// The user manager. - /// The library manager. - /// The iso manager. - /// The media encoder. - public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) + public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository) { } diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index 3e96cf2f82..1e5e8b82d9 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -6,6 +6,7 @@ using MediaBrowser.Controller; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using MediaBrowser.Model.IO; using System; @@ -21,6 +22,11 @@ namespace MediaBrowser.Api.Playback.Hls /// public abstract class BaseHlsService : BaseStreamingService { + protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository) + { + } + protected override string GetOutputFilePath(StreamState state) { var folder = ApplicationPaths.EncodedMediaCachePath; @@ -30,19 +36,6 @@ namespace MediaBrowser.Api.Playback.Hls return Path.Combine(folder, GetCommandLineArguments("dummy\\dummy", state, false).GetMD5() + (outputFileExtension ?? string.Empty).ToLower()); } - /// - /// Initializes a new instance of the class. - /// - /// The app paths. - /// The user manager. - /// The library manager. - /// The iso manager. - /// The media encoder. - protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) - { - } - /// /// Gets the audio arguments. /// @@ -260,7 +253,7 @@ namespace MediaBrowser.Api.Playback.Hls var itsOffsetMs = hlsVideoRequest == null ? 0 - : ((GetHlsVideoStream) state.VideoRequest).TimeStampOffsetMs; + : ((GetHlsVideoStream)state.VideoRequest).TimeStampOffsetMs; var itsOffset = itsOffsetMs == 0 ? string.Empty : string.Format("-itsoffset {0} ", TimeSpan.FromMilliseconds(itsOffsetMs).TotalSeconds); diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index dfd18ab154..b194a47fe1 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -3,6 +3,7 @@ using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.IO; using ServiceStack.ServiceHost; using System; @@ -31,17 +32,8 @@ namespace MediaBrowser.Api.Playback.Hls /// public class VideoHlsService : BaseHlsService { - /// - /// Initializes a new instance of the class. - /// - /// The app paths. - /// The user manager. - /// The library manager. - /// The iso manager. - /// The media encoder. - /// The dto service. - public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem) - : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) + public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository) { } @@ -95,13 +87,13 @@ namespace MediaBrowser.Api.Playback.Hls { volParam = ",volume=2.000000"; } - + if (state.Request.AudioSampleRate.HasValue) { - audioSampleRate= state.Request.AudioSampleRate.Value + ":"; + audioSampleRate = state.Request.AudioSampleRate.Value + ":"; } - args += string.Format(" -af \"adelay=1,aresample={0}async=1000{1}\"",audioSampleRate, volParam); + args += string.Format(" -af \"adelay=1,aresample={0}async=1000{1}\"", audioSampleRate, volParam); return args; } @@ -130,7 +122,7 @@ namespace MediaBrowser.Api.Playback.Hls var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsExternal && (state.SubtitleStream.Codec.IndexOf("pgs", StringComparison.OrdinalIgnoreCase) != -1 || state.SubtitleStream.Codec.IndexOf("dvd", StringComparison.OrdinalIgnoreCase) != -1); - + var args = "-codec:v:0 " + codec + " -preset superfast" + keyFrameArg; var bitrate = GetVideoBitrateParam(state); @@ -139,7 +131,7 @@ namespace MediaBrowser.Api.Playback.Hls { args += string.Format(" -b:v {0} -maxrate ({0}*.85) -bufsize {0}", bitrate.Value.ToString(UsCulture)); } - + // Add resolution params, if specified if (!hasGraphicalSubs) { @@ -171,7 +163,7 @@ namespace MediaBrowser.Api.Playback.Hls { args += GetInternalGraphicalSubtitleParam(state, codec); } - + return args; } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 1f0853e08b..2447302f50 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -12,7 +12,6 @@ using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.IO; -using System; using System.Collections.Generic; using System.IO; using System.Net.Http; @@ -25,13 +24,11 @@ namespace MediaBrowser.Api.Playback.Progressive /// public abstract class BaseProgressiveStreamingService : BaseStreamingService { - protected readonly IItemRepository ItemRepository; protected readonly IImageProcessor ImageProcessor; protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IItemRepository itemRepository, IDtoService dtoService, IImageProcessor imageProcessor, IFileSystem fileSystem) : - base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem) + base(appPaths, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository) { - ItemRepository = itemRepository; ImageProcessor = imageProcessor; } diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 7cb624af84..380e094633 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -226,7 +226,7 @@ namespace MediaBrowser.Api.UserLibrary [ApiMember(Name = "HasTvdbId", Description = "Optional filter by items that have a tvdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? HasTvdbId { get; set; } - + [ApiMember(Name = "IsYearMismatched", Description = "Optional filter by items that are potentially misidentified.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")] public bool? IsYearMismatched { get; set; } } @@ -984,15 +984,9 @@ namespace MediaBrowser.Api.UserLibrary if (request.HasSubtitles.HasValue) { - items = items.OfType