diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-20 20:33:05 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-20 20:33:05 -0500 |
| commit | 767cdc1f6f6a63ce997fc9476911e2c361f9d402 (patch) | |
| tree | 49add55976f895441167c66cfa95e5c7688d18ce /MediaBrowser.Api/Streaming/AudioHandler.cs | |
| parent | 845554722efaed872948a9e0f7202e3ef52f1b6e (diff) | |
Pushing missing changes
Diffstat (limited to 'MediaBrowser.Api/Streaming/AudioHandler.cs')
| -rw-r--r-- | MediaBrowser.Api/Streaming/AudioHandler.cs | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/MediaBrowser.Api/Streaming/AudioHandler.cs b/MediaBrowser.Api/Streaming/AudioHandler.cs new file mode 100644 index 000000000..685e17dbc --- /dev/null +++ b/MediaBrowser.Api/Streaming/AudioHandler.cs @@ -0,0 +1,112 @@ +using MediaBrowser.Common.IO; +using MediaBrowser.Common.Net.Handlers; +using MediaBrowser.Controller.Entities.Audio; +using MediaBrowser.Controller.Resolvers; +using MediaBrowser.Model.DTO; +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Linq; +using System.Net; + +namespace MediaBrowser.Api.Streaming +{ + /// <summary> + /// Providers a progressive streaming audio api + /// </summary> + [Export(typeof(IHttpServerHandler))] + public class AudioHandler : BaseProgressiveStreamingHandler<Audio> + { + /// <summary> + /// Handleses the request. + /// </summary> + /// <param name="request">The request.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> + public override bool HandlesRequest(HttpListenerRequest request) + { + return EntityResolutionHelper.AudioFileExtensions.Any(a => ApiService.IsApiUrlMatch("audio" + a, request)); + } + + /// <summary> + /// Gets the audio codec. + /// </summary> + /// <value>The audio codec.</value> + /// <exception cref="InvalidOperationException"></exception> + protected override AudioCodecs? AudioCodec + { + get + { + var ext = OutputFileExtension; + + if (ext.Equals(".aac", StringComparison.OrdinalIgnoreCase) || ext.Equals(".m4a", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Aac; + } + if (ext.Equals(".mp3", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Mp3; + } + if (ext.Equals(".wma", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Wma; + } + if (ext.Equals(".oga", StringComparison.OrdinalIgnoreCase) || ext.Equals(".ogg", StringComparison.OrdinalIgnoreCase)) + { + return AudioCodecs.Vorbis; + } + + throw new InvalidOperationException(); + } + } + + /// <summary> + /// Creates arguments to pass to ffmpeg + /// </summary> + /// <param name="outputPath">The output path.</param> + /// <param name="isoMount">The iso mount.</param> + /// <returns>System.String.</returns> + /// <exception cref="System.InvalidOperationException">Only aac and mp3 audio codecs are supported.</exception> + /// <exception cref="InvalidOperationException">Only aac and mp3 audio codecs are supported.</exception> + /// <exception cref="ArgumentException">Only aac and mp3 audio codecs are supported.</exception> + protected override string GetCommandLineArguments(string outputPath, IIsoMount isoMount) + { + var audioTranscodeParams = new List<string>(); + + var outputFormat = AudioCodec; + + if (outputFormat != AudioCodecs.Aac && outputFormat != AudioCodecs.Mp3) + { + throw new InvalidOperationException("Only aac and mp3 audio codecs are supported."); + } + + if (AudioBitRate.HasValue) + { + audioTranscodeParams.Add("-ab " + AudioBitRate.Value); + } + + var channels = GetNumAudioChannelsParam(); + + if (channels.HasValue) + { + audioTranscodeParams.Add("-ac " + channels.Value); + } + + var sampleRate = GetSampleRateParam(); + + if (sampleRate.HasValue) + { + audioTranscodeParams.Add("-ar " + sampleRate.Value); + } + + const string vn = " -vn"; + + return string.Format("{0} -i {1}{2} -threads 0{5} {3} -id3v2_version 3 -write_id3v1 1 \"{4}\"", + FastSeekCommandLineParameter, + GetInputArgument(isoMount), + SlowSeekCommandLineParameter, + string.Join(" ", audioTranscodeParams.ToArray()), + outputPath, + vn).Trim(); + } + } +} |
