AudioHandler.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using MediaBrowser.Common.IO;
  2. using MediaBrowser.Common.Net.Handlers;
  3. using MediaBrowser.Controller.Entities.Audio;
  4. using MediaBrowser.Controller.Resolvers;
  5. using MediaBrowser.Model.Dto;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.ComponentModel.Composition;
  9. using System.Linq;
  10. using System.Net;
  11. namespace MediaBrowser.Api.Streaming
  12. {
  13. /// <summary>
  14. /// Providers a progressive streaming audio api
  15. /// </summary>
  16. [Export(typeof(IHttpServerHandler))]
  17. public class AudioHandler : BaseProgressiveStreamingHandler<Audio>
  18. {
  19. /// <summary>
  20. /// Handleses the request.
  21. /// </summary>
  22. /// <param name="request">The request.</param>
  23. /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
  24. public override bool HandlesRequest(HttpListenerRequest request)
  25. {
  26. return EntityResolutionHelper.AudioFileExtensions.Any(a => ApiService.IsApiUrlMatch("audio" + a, request));
  27. }
  28. /// <summary>
  29. /// Gets the audio codec.
  30. /// </summary>
  31. /// <value>The audio codec.</value>
  32. /// <exception cref="InvalidOperationException"></exception>
  33. protected override AudioCodecs? AudioCodec
  34. {
  35. get
  36. {
  37. var ext = OutputFileExtension;
  38. if (ext.Equals(".aac", StringComparison.OrdinalIgnoreCase) || ext.Equals(".m4a", StringComparison.OrdinalIgnoreCase))
  39. {
  40. return AudioCodecs.Aac;
  41. }
  42. if (ext.Equals(".mp3", StringComparison.OrdinalIgnoreCase))
  43. {
  44. return AudioCodecs.Mp3;
  45. }
  46. if (ext.Equals(".wma", StringComparison.OrdinalIgnoreCase))
  47. {
  48. return AudioCodecs.Wma;
  49. }
  50. if (ext.Equals(".oga", StringComparison.OrdinalIgnoreCase) || ext.Equals(".ogg", StringComparison.OrdinalIgnoreCase))
  51. {
  52. return AudioCodecs.Vorbis;
  53. }
  54. throw new InvalidOperationException();
  55. }
  56. }
  57. /// <summary>
  58. /// Creates arguments to pass to ffmpeg
  59. /// </summary>
  60. /// <param name="outputPath">The output path.</param>
  61. /// <param name="isoMount">The iso mount.</param>
  62. /// <returns>System.String.</returns>
  63. /// <exception cref="System.InvalidOperationException">Only aac and mp3 audio codecs are supported.</exception>
  64. /// <exception cref="InvalidOperationException">Only aac and mp3 audio codecs are supported.</exception>
  65. /// <exception cref="ArgumentException">Only aac and mp3 audio codecs are supported.</exception>
  66. protected override string GetCommandLineArguments(string outputPath, IIsoMount isoMount)
  67. {
  68. var audioTranscodeParams = new List<string>();
  69. var outputFormat = AudioCodec;
  70. if (outputFormat != AudioCodecs.Aac && outputFormat != AudioCodecs.Mp3)
  71. {
  72. throw new InvalidOperationException("Only aac and mp3 audio codecs are supported.");
  73. }
  74. if (AudioBitRate.HasValue)
  75. {
  76. audioTranscodeParams.Add("-ab " + AudioBitRate.Value);
  77. }
  78. var channels = GetNumAudioChannelsParam();
  79. if (channels.HasValue)
  80. {
  81. audioTranscodeParams.Add("-ac " + channels.Value);
  82. }
  83. var sampleRate = GetSampleRateParam();
  84. if (sampleRate.HasValue)
  85. {
  86. audioTranscodeParams.Add("-ar " + sampleRate.Value);
  87. }
  88. const string vn = " -vn";
  89. return string.Format("{0} -i {1}{2} -threads 0{5} {3} -id3v2_version 3 -write_id3v1 1 \"{4}\"",
  90. FastSeekCommandLineParameter,
  91. GetInputArgument(isoMount),
  92. SlowSeekCommandLineParameter,
  93. string.Join(" ", audioTranscodeParams.ToArray()),
  94. outputPath,
  95. vn).Trim();
  96. }
  97. }
  98. }