diff options
| author | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-07 16:55:05 -0400 |
|---|---|---|
| committer | Luke Pulverenti <luke.pulverenti@gmail.com> | 2013-04-07 16:55:05 -0400 |
| commit | cb39f8e7b5f71dcf0de2681d953b016e29adbc54 (patch) | |
| tree | fd2ef9a2a8b284a8810ece7b6ead4df0da3d133d /MediaBrowser.Api | |
| parent | d14c3b31ff5665b03fee07aab46532fcf3069c1a (diff) | |
extracted a media encoding interface to keep ffmpeg out of nuget packages
Diffstat (limited to 'MediaBrowser.Api')
8 files changed, 108 insertions, 29 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 6c12452fc7..a1c32dc636 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -1,8 +1,10 @@ using MediaBrowser.Common.Extensions; using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Providers.MediaInfo; using MediaBrowser.Model.Drawing; using MediaBrowser.Model.Dto; using MediaBrowser.Model.Entities; @@ -47,18 +49,26 @@ namespace MediaBrowser.Api.Playback protected IIsoManager IsoManager { get; set; } /// <summary> + /// Gets or sets the media encoder. + /// </summary> + /// <value>The media encoder.</value> + protected IMediaEncoder MediaEncoder { get; set; } + + /// <summary> /// Initializes a new instance of the <see cref="BaseStreamingService" /> class. /// </summary> /// <param name="appPaths">The app paths.</param> /// <param name="userManager">The user manager.</param> /// <param name="libraryManager">The library manager.</param> /// <param name="isoManager">The iso manager.</param> - protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) + /// <param name="mediaEncoder">The media encoder.</param> + protected BaseStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) { ApplicationPaths = appPaths; UserManager = userManager; LibraryManager = libraryManager; IsoManager = isoManager; + MediaEncoder = mediaEncoder; } /// <summary> @@ -309,9 +319,17 @@ namespace MediaBrowser.Api.Playback if (!File.Exists(path)) { - var success = Kernel.Instance.FFMpegManager.ExtractTextSubtitle(video, subtitleStream.Index, path, CancellationToken.None).Result; + InputType type; + + var inputPath = MediaEncoderHelpers.GetInputArgument(video, null, out type); - if (!success) + try + { + var task = MediaEncoder.ExtractTextSubtitle(inputPath, type, subtitleStream.Index, path, CancellationToken.None); + + Task.WaitAll(task); + } + catch { return null; } @@ -332,9 +350,13 @@ namespace MediaBrowser.Api.Playback if (!File.Exists(path)) { - var success = Kernel.Instance.FFMpegManager.ConvertTextSubtitle(subtitleStream, path, CancellationToken.None).Result; + try + { + var task = MediaEncoder.ConvertTextSubtitleToAss(subtitleStream.Path, path, CancellationToken.None); - if (!success) + Task.WaitAll(task); + } + catch { return null; } @@ -366,6 +388,16 @@ namespace MediaBrowser.Api.Playback } /// <summary> + /// Gets the probe size argument. + /// </summary> + /// <param name="item">The item.</param> + /// <returns>System.String.</returns> + protected string GetProbeSizeArgument(BaseItem item) + { + return MediaEncoder.GetProbeSizeArgument(MediaEncoderHelpers.GetInputType(item)); + } + + /// <summary> /// Gets the number of audio channels to specify on the command line /// </summary> /// <param name="request">The request.</param> @@ -477,9 +509,18 @@ namespace MediaBrowser.Api.Playback /// <returns>System.String.</returns> protected string GetInputArgument(BaseItem item, IIsoMount isoMount) { - return isoMount == null ? - Kernel.Instance.FFMpegManager.GetInputArgument(item) : - Kernel.Instance.FFMpegManager.GetInputArgument(item as Video, isoMount); + var type = InputType.AudioFile; + + var inputPath = new[] { item.Path }; + + var video = item as Video; + + if (video != null) + { + inputPath = MediaEncoderHelpers.GetInputArgument(video, isoMount, out type); + } + + return MediaEncoder.GetInputArgument(inputPath, type); } /// <summary> @@ -508,8 +549,8 @@ namespace MediaBrowser.Api.Playback RedirectStandardOutput = true, RedirectStandardError = true, - FileName = Kernel.Instance.FFMpegManager.FFMpegPath, - WorkingDirectory = Path.GetDirectoryName(Kernel.Instance.FFMpegManager.FFMpegPath), + FileName = MediaEncoder.EncoderPath, + WorkingDirectory = Path.GetDirectoryName(MediaEncoder.EncoderPath), Arguments = GetCommandLineArguments(outputPath, state), WindowStyle = ProcessWindowStyle.Hidden, @@ -655,7 +696,7 @@ namespace MediaBrowser.Api.Playback } state.AudioStream = GetMediaStream(media.MediaStreams, null, MediaStreamType.Audio, true); - + return state; } diff --git a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs index a540349f06..b40b7849d4 100644 --- a/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/AudioHlsService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Dto; @@ -33,8 +34,8 @@ namespace MediaBrowser.Api.Playback.Hls /// </summary> public class AudioHlsService : BaseHlsService { - public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) - : base(appPaths, userManager, libraryManager, isoManager) + public AudioHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs index b1879b8d23..08d4468eb9 100644 --- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs @@ -1,12 +1,12 @@ -using System.Collections.Generic; -using MediaBrowser.Common.IO; +using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; using System; +using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Threading.Tasks; namespace MediaBrowser.Api.Playback.Hls @@ -18,8 +18,8 @@ namespace MediaBrowser.Api.Playback.Hls /// </summary> public const string SegmentFilePrefix = "segment-"; - protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) - : base(appPaths, userManager, libraryManager, isoManager) + protected BaseHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } @@ -176,7 +176,7 @@ namespace MediaBrowser.Api.Playback.Hls segmentOutputPath = Path.Combine(segmentOutputPath, segmentOutputName + "%03d." + GetSegmentFileExtension(state).TrimStart('.')); - var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(state.Item); + var probeSize = GetProbeSizeArgument(state.Item); return string.Format("{0} {1} -i {2}{3} -threads 0 {4} {5} {6} -f ssegment -segment_list_flags +live -segment_time 10 -segment_list \"{7}\" \"{8}\"", probeSize, diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs index 94b9d6924a..6888a1639e 100644 --- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs @@ -1,5 +1,6 @@ using System.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; using System; @@ -25,8 +26,8 @@ namespace MediaBrowser.Api.Playback.Hls public class VideoHlsService : BaseHlsService { - public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) - : base(appPaths, userManager, libraryManager, isoManager) + public VideoHlsService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs index a7bcbf821e..50c8210fad 100644 --- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs +++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Library; using ServiceStack.ServiceHost; @@ -36,8 +37,8 @@ namespace MediaBrowser.Api.Playback.Progressive /// </summary> public class AudioService : BaseProgressiveStreamingService { - public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) - : base(appPaths, userManager, libraryManager, isoManager) + public AudioService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index 52052e16e9..c9e8e3a650 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -1,16 +1,17 @@ using MediaBrowser.Api.Images; using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Dto; +using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using MediaBrowser.Model.Entities; namespace MediaBrowser.Api.Playback.Progressive { @@ -19,8 +20,8 @@ namespace MediaBrowser.Api.Playback.Progressive /// </summary> public abstract class BaseProgressiveStreamingService : BaseStreamingService { - protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) : - base(appPaths, userManager, libraryManager, isoManager) + protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) : + base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index 6c9cc8903d..634906afc5 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -1,5 +1,6 @@ using System.IO; using MediaBrowser.Common.IO; +using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using System; @@ -46,8 +47,8 @@ namespace MediaBrowser.Api.Playback.Progressive /// </summary> public class VideoService : BaseProgressiveStreamingService { - public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager) - : base(appPaths, userManager, libraryManager, isoManager) + public VideoService(IServerApplicationPaths appPaths, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder) + : base(appPaths, userManager, libraryManager, isoManager, mediaEncoder) { } @@ -76,7 +77,7 @@ namespace MediaBrowser.Api.Playback.Progressive { var video = (Video)state.Item; - var probeSize = Kernel.Instance.FFMpegManager.GetProbeSizeArgument(video.VideoType, video.IsoType); + var probeSize = GetProbeSizeArgument(state.Item); // Get the output codec name var videoCodec = GetVideoCodec(state.VideoRequest); diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs index 59b2ebe410..62b7d5fc94 100644 --- a/MediaBrowser.Api/UserLibrary/ItemsService.cs +++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs @@ -1,4 +1,5 @@ using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.TV; using MediaBrowser.Controller.Library; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; @@ -127,6 +128,20 @@ namespace MediaBrowser.Api.UserLibrary /// <value>The video formats.</value> [ApiMember(Name = "VideoFormats", Description = "Optional filter by VideoFormat (Standard, Digital3D, Sbs3D). Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string VideoFormats { get; set; } + + /// <summary> + /// Gets or sets the series status. + /// </summary> + /// <value>The series status.</value> + [ApiMember(Name = "SeriesStatus", Description = "Optional filter by Series Status. Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] + public string SeriesStatus { get; set; } + + /// <summary> + /// Gets or sets the air days. + /// </summary> + /// <value>The air days.</value> + [ApiMember(Name = "AirDays", Description = "Optional filter by Series Air Days. Allows multiple, comma delimeted.", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] + public string AirDays { get; set; } } /// <summary> @@ -340,6 +355,23 @@ namespace MediaBrowser.Api.UserLibrary /// <returns>IEnumerable{BaseItem}.</returns> private IEnumerable<BaseItem> ApplyAdditionalFilters(GetItems request, IEnumerable<BaseItem> items) { + // Filter by Series Status + if (!string.IsNullOrEmpty(request.SeriesStatus)) + { + var vals = request.SeriesStatus.Split(','); + + items = items.OfType<Series>().Where(i => i.Status.HasValue && vals.Contains(i.Status.Value.ToString(), StringComparer.OrdinalIgnoreCase)); + } + + // Filter by Series AirDays + if (!string.IsNullOrEmpty(request.AirDays)) + { + var days = request.AirDays.Split(',').Select(d => (DayOfWeek)Enum.Parse(typeof(DayOfWeek), d, true)); + + items = items.OfType<Series>().Where(i => i.AirDays != null && days.Any(d => i.AirDays.Contains(d))); + } + + // Filter by VideoFormat if (!string.IsNullOrEmpty(request.VideoFormats)) { var formats = request.VideoFormats.Split(','); @@ -347,6 +379,7 @@ namespace MediaBrowser.Api.UserLibrary items = items.OfType<Video>().Where(i => formats.Contains(i.VideoFormat.ToString(), StringComparer.OrdinalIgnoreCase)); } + // Filter by VideoType if (!string.IsNullOrEmpty(request.VideoTypes)) { var types = request.VideoTypes.Split(','); |
