AudioHandler.cs 3.9 KB

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