diff options
Diffstat (limited to 'MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs')
| -rw-r--r-- | MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs new file mode 100644 index 000000000..bc2d26bcc --- /dev/null +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -0,0 +1,151 @@ +using MediaBrowser.Controller; +using MediaBrowser.Controller.Entities; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Model.Dto; +using System.IO; +using System.Threading.Tasks; + +namespace MediaBrowser.Api.Playback.Progressive +{ + /// <summary> + /// Class BaseProgressiveStreamingService + /// </summary> + public abstract class BaseProgressiveStreamingService : BaseStreamingService + { + /// <summary> + /// Initializes a new instance of the <see cref="BaseProgressiveStreamingService" /> class. + /// </summary> + /// <param name="appPaths">The app paths.</param> + protected BaseProgressiveStreamingService(IServerApplicationPaths appPaths) + : base(appPaths) + { + } + + /// <summary> + /// Gets the output file extension. + /// </summary> + /// <param name="state">The state.</param> + /// <returns>System.String.</returns> + protected override string GetOutputFileExtension(StreamState state) + { + var ext = base.GetOutputFileExtension(state); + + if (!string.IsNullOrEmpty(ext)) + { + return ext; + } + + // Try to infer based on the desired video codec + if (state.Request.VideoCodec.HasValue) + { + var video = state.Item as Video; + + if (video != null) + { + switch (state.Request.VideoCodec.Value) + { + case VideoCodecs.H264: + return ".ts"; + case VideoCodecs.Theora: + return ".ogv"; + case VideoCodecs.Vpx: + return ".webm"; + case VideoCodecs.Wmv: + return ".asf"; + } + } + } + + // Try to infer based on the desired audio codec + if (state.Request.AudioCodec.HasValue) + { + var audio = state.Item as Audio; + + if (audio != null) + { + switch (state.Request.AudioCodec.Value) + { + case AudioCodecs.Aac: + return ".aac"; + case AudioCodecs.Mp3: + return ".mp3"; + case AudioCodecs.Vorbis: + return ".ogg"; + case AudioCodecs.Wma: + return ".wma"; + } + } + } + + return null; + } + + /// <summary> + /// Gets the type of the transcoding job. + /// </summary> + /// <value>The type of the transcoding job.</value> + protected override TranscodingJobType TranscodingJobType + { + get { return TranscodingJobType.Progressive; } + } + + /// <summary> + /// Processes the request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns>Task.</returns> + protected object ProcessRequest(StreamRequest request) + { + var state = GetState(request); + + if (request.Static) + { + return ToStaticFileResult(state.Item.Path); + } + + var outputPath = GetOutputFilePath(state); + + if (File.Exists(outputPath) && !Plugin.Instance.HasActiveTranscodingJob(outputPath, TranscodingJobType.Progressive)) + { + return ToStaticFileResult(outputPath); + } + + return GetStreamResult(state).Result; + } + + /// <summary> + /// Gets the stream result. + /// </summary> + /// <param name="state">The state.</param> + /// <returns>Task{System.Object}.</returns> + private async Task<ProgressiveStreamWriter> GetStreamResult(StreamState state) + { + // Use the command line args with a dummy playlist path + var outputPath = GetOutputFilePath(state); + + if (!File.Exists(outputPath)) + { + await StartFFMpeg(state, outputPath).ConfigureAwait(false); + } + else + { + Plugin.Instance.OnTranscodeBeginRequest(outputPath, TranscodingJobType.Progressive); + } + + return new ProgressiveStreamWriter + { + Path = outputPath, + State = state + }; + } + + /// <summary> + /// Deletes the partial stream files. + /// </summary> + /// <param name="outputFilePath">The output file path.</param> + protected override void DeletePartialStreamFiles(string outputFilePath) + { + File.Delete(outputFilePath); + } + } +} |
