diff options
| author | LukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com> | 2012-08-12 11:41:40 -0400 |
|---|---|---|
| committer | LukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com> | 2012-08-12 11:41:40 -0400 |
| commit | 55aa5cb87388a7422831e795d30ef457395f5267 (patch) | |
| tree | c739a010e3e202578eca4834ed2e27f3d4b8ab14 /MediaBrowser.Api/HttpHandlers/AudioHandler.cs | |
| parent | f7ea68615b1e2463fd21989b051db2bf8cde6779 (diff) | |
Added more audio streaming improvements and extracted BaseMediaHandler
Diffstat (limited to 'MediaBrowser.Api/HttpHandlers/AudioHandler.cs')
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/AudioHandler.cs | 157 |
1 files changed, 6 insertions, 151 deletions
diff --git a/MediaBrowser.Api/HttpHandlers/AudioHandler.cs b/MediaBrowser.Api/HttpHandlers/AudioHandler.cs index 51d7ba06a..c3c27c568 100644 --- a/MediaBrowser.Api/HttpHandlers/AudioHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/AudioHandler.cs @@ -1,21 +1,16 @@ using System;
using System.Collections.Generic;
-using System.Diagnostics;
using System.IO;
using System.Linq;
-using System.Net;
-using System.Threading.Tasks;
-using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.Logging;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.Net.Handlers;
-using MediaBrowser.Controller;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Api.HttpHandlers
{
public class AudioHandler : BaseMediaHandler<Audio>
{
+ /// <summary>
+ /// Supported values: mp3,flac,ogg,wav,asf
+ /// </summary>
public IEnumerable<string> AudioFormats
{
get
@@ -35,7 +30,7 @@ namespace MediaBrowser.Api.HttpHandlers {
get
{
- string val = QueryString["audioformats"];
+ string val = QueryString["audiobitrates"];
if (string.IsNullOrEmpty(val))
{
@@ -48,13 +43,13 @@ namespace MediaBrowser.Api.HttpHandlers private int? GetMaxAcceptedBitRate(string audioFormat)
{
- int index = AudioFormats.ToList().IndexOf(audioFormat);
-
if (!AudioBitRates.Any())
{
return null;
}
+ int index = AudioFormats.ToList().IndexOf(audioFormat);
+
return AudioBitRates.ElementAt(index);
}
@@ -134,144 +129,4 @@ namespace MediaBrowser.Api.HttpHandlers return "-i \"" + LibraryItem.Path + "\" -vn " + string.Join(" ", audioTranscodeParams.ToArray()) + " -";
}
}
-
- public abstract class BaseMediaHandler<T> : BaseHandler
- where T : BaseItem, new()
- {
- private T _LibraryItem;
- /// <summary>
- /// Gets the library item that will be played, if any
- /// </summary>
- protected T LibraryItem
- {
- get
- {
- if (_LibraryItem == null)
- {
- string id = QueryString["id"];
-
- if (!string.IsNullOrEmpty(id))
- {
- _LibraryItem = Kernel.Instance.GetItemById(Guid.Parse(id)) as T;
- }
- }
-
- return _LibraryItem;
- }
- }
-
- public int? AudioChannels
- {
- get
- {
- string val = QueryString["audiochannels"];
-
- if (string.IsNullOrEmpty(val))
- {
- return null;
- }
-
- return int.Parse(val);
- }
- }
-
- public int? AudioSampleRate
- {
- get
- {
- string val = QueryString["audiosamplerate"];
-
- if (string.IsNullOrEmpty(val))
- {
- return 44100;
- }
-
- return int.Parse(val);
- }
- }
-
- public override string ContentType
- {
- get
- {
- return MimeTypes.GetMimeType("." + GetOutputFormat());
- }
- }
-
- public override bool CompressResponse
- {
- get
- {
- return false;
- }
- }
-
- public override void ProcessRequest(HttpListenerContext ctx)
- {
- HttpListenerContext = ctx;
-
- if (!RequiresConversion())
- {
- new StaticFileHandler() { Path = LibraryItem.Path }.ProcessRequest(ctx);
- return;
- }
-
- base.ProcessRequest(ctx);
- }
-
- protected abstract string GetCommandLineArguments();
- protected abstract string GetOutputFormat();
- protected abstract bool RequiresConversion();
-
- protected async override Task WriteResponseToOutputStream(Stream stream)
- {
- ProcessStartInfo startInfo = new ProcessStartInfo();
-
- startInfo.CreateNoWindow = true;
-
- startInfo.UseShellExecute = false;
- startInfo.RedirectStandardOutput = true;
- startInfo.RedirectStandardError = true;
-
- startInfo.FileName = ApiService.FFMpegPath;
- startInfo.WorkingDirectory = ApiService.FFMpegDirectory;
- startInfo.Arguments = GetCommandLineArguments();
-
- Logger.LogInfo(startInfo.FileName + " " + startInfo.Arguments);
-
- Process process = new Process();
- process.StartInfo = startInfo;
-
- // FFMpeg writes debug info to StdErr. This is useful when debugging so let's put it in the log directory.
- FileStream logStream = new FileStream(Path.Combine(ApplicationPaths.LogDirectoryPath, "ffmpeg-" + Guid.NewGuid().ToString() + ".txt"), FileMode.Create);
-
- try
- {
- process.Start();
-
- // MUST read both stdout and stderr asynchronously or a deadlock may occurr
- // If we ever decide to disable the ffmpeg log then you must uncomment the below line.
- //process.BeginErrorReadLine();
-
- Task errorTask = Task.Run(async () => { await process.StandardError.BaseStream.CopyToAsync(logStream); });
-
- await process.StandardOutput.BaseStream.CopyToAsync(stream);
-
- process.WaitForExit();
-
- await errorTask;
-
- Logger.LogInfo("FFMpeg exited with code " + process.ExitCode);
- }
- catch (Exception ex)
- {
- Logger.LogException(ex);
- }
- finally
- {
- logStream.Dispose();
- process.Dispose();
- }
- }
- }
}
|
