diff options
Diffstat (limited to 'MediaBrowser.Api')
4 files changed, 102 insertions, 9 deletions
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs index 159106437..b31b9b861 100644 --- a/MediaBrowser.Api/Playback/BaseStreamingService.cs +++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs @@ -610,6 +610,17 @@ namespace MediaBrowser.Api.Playback var media = (IHasMediaStreams)item; + var url = Request.PathInfo; + + if (!request.AudioCodec.HasValue) + { + request.AudioCodec = InferAudioCodec(url); + } + if (!request.VideoCodec.HasValue) + { + request.VideoCodec = InferVideoCodec(url); + } + return new StreamState { Item = item, @@ -617,8 +628,58 @@ namespace MediaBrowser.Api.Playback AudioStream = GetMediaStream(media.MediaStreams, request.AudioStreamIndex, MediaStreamType.Audio, true), VideoStream = GetMediaStream(media.MediaStreams, request.VideoStreamIndex, MediaStreamType.Video, true), SubtitleStream = GetMediaStream(media.MediaStreams, request.SubtitleStreamIndex, MediaStreamType.Subtitle, false), - Url = Request.PathInfo + Url = url }; } + + /// <summary> + /// Infers the audio codec based on the url + /// </summary> + /// <param name="url">The URL.</param> + /// <returns>System.Nullable{AudioCodecs}.</returns> + private AudioCodecs? InferAudioCodec(string url) + { + var ext = Path.GetExtension(url); + + if (string.Equals(ext, ".mp3", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Mp3; + } + if (string.Equals(ext, ".aac", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Aac; + } + if (string.Equals(ext, ".wam", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Wma; + } + + return null; + } + + /// <summary> + /// Infers the video codec. + /// </summary> + /// <param name="url">The URL.</param> + /// <returns>System.Nullable{VideoCodecs}.</returns> + private VideoCodecs? InferVideoCodec(string url) + { + var ext = Path.GetExtension(url); + + if (string.Equals(ext, ".asf", StringComparison.OrdinalIgnoreCase)) + { + return VideoCodecs.Wmv; + } + if (string.Equals(ext, ".webm", StringComparison.OrdinalIgnoreCase)) + { + return VideoCodecs.Vpx; + } + if (string.Equals(ext, ".ogg", StringComparison.OrdinalIgnoreCase)) + { + return VideoCodecs.Theora; + } + + return null; + } } } diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs index dcb7d96e3..850e8ff3b 100644 --- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs +++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs @@ -7,12 +7,12 @@ namespace MediaBrowser.Api.Playback.Progressive /// <summary> /// Class GetAudioStream /// </summary> - [Route("/Audio/{Id}.mp3", "GET")] - [Route("/Audio/{Id}.wma", "GET")] - [Route("/Audio/{Id}.aac", "GET")] - [Route("/Audio/{Id}.flac", "GET")] - [Route("/Audio/{Id}.ogg", "GET")] - [Route("/Audio/{Id}", "GET")] + [Route("/Audio/{Id}/stream.mp3", "GET")] + [Route("/Audio/{Id}/stream.wma", "GET")] + [Route("/Audio/{Id}/stream.aac", "GET")] + [Route("/Audio/{Id}/stream.flac", "GET")] + [Route("/Audio/{Id}/stream.ogg", "GET")] + [Route("/Audio/{Id}/stream", "GET")] public class GetAudioStream : StreamRequest { diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index bc2d26bcc..62ca74df9 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -1,4 +1,5 @@ -using MediaBrowser.Controller; +using MediaBrowser.Common.Net; +using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.Entities.Audio; using MediaBrowser.Model.Dto; @@ -123,6 +124,8 @@ namespace MediaBrowser.Api.Playback.Progressive // Use the command line args with a dummy playlist path var outputPath = GetOutputFilePath(state); + Response.ContentType = MimeTypes.GetMimeType(outputPath); + if (!File.Exists(outputPath)) { await StartFFMpeg(state, outputPath).ConfigureAwait(false); diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs index b43b4bfbc..cb02518d1 100644 --- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs +++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs @@ -1,11 +1,30 @@ using MediaBrowser.Controller; using MediaBrowser.Controller.Entities; -using MediaBrowser.Model.Logging; using System; +using ServiceStack.ServiceHost; namespace MediaBrowser.Api.Playback.Progressive { /// <summary> + /// Class GetAudioStream + /// </summary> + [Route("/Videos/{Id}/stream.ts", "GET")] + [Route("/Videos/{Id}/stream.webm", "GET")] + [Route("/Videos/{Id}/stream.asf", "GET")] + [Route("/Videos/{Id}/stream.wmv", "GET")] + [Route("/Videos/{Id}/stream.ogv", "GET")] + [Route("/Videos/{Id}/stream.mp4", "GET")] + [Route("/Videos/{Id}/stream.m4v", "GET")] + [Route("/Videos/{Id}/stream.mkv", "GET")] + [Route("/Videos/{Id}/stream.mpeg", "GET")] + [Route("/Videos/{Id}/stream.avi", "GET")] + [Route("/Videos/{Id}/stream", "GET")] + public class GetVideoStream : StreamRequest + { + + } + + /// <summary> /// Class VideoService /// </summary> public class VideoService : BaseProgressiveStreamingService @@ -20,6 +39,16 @@ namespace MediaBrowser.Api.Playback.Progressive } /// <summary> + /// Gets the specified request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>System.Object.</returns> + public object Get(GetVideoStream request) + { + return ProcessRequest(request); + } + + /// <summary> /// Gets the command line arguments. /// </summary> /// <param name="outputPath">The output path.</param> |
