using MediaBrowser.Common.IO; using MediaBrowser.Common.MediaInfo; using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Dto; using MediaBrowser.Controller.Library; using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.Persistence; using MediaBrowser.Model.Dto; using MediaBrowser.Model.IO; using ServiceStack; using System; namespace MediaBrowser.Api.Playback.Hls { /// /// Class GetHlsAudioStream /// [Route("/Audio/{Id}/stream.m3u8", "GET")] [Api(Description = "Gets an audio stream using HTTP live streaming.")] public class GetHlsAudioStream : StreamRequest { } /// /// Class AudioHlsService /// public class AudioHlsService : BaseHlsService { public AudioHlsService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository, ILiveTvManager liveTvManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository, liveTvManager) { } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetHlsAudioStream request) { return ProcessRequest(request); } /// /// Gets the audio arguments. /// /// The state. /// System.String. protected override string GetAudioArguments(StreamState state) { var codec = GetAudioCodec(state.Request); var args = "-codec:a " + codec; var channels = GetNumAudioChannelsParam(state.Request, state.AudioStream); if (channels.HasValue) { args += " -ac " + channels.Value; } if (state.Request.AudioSampleRate.HasValue) { args += " -ar " + state.Request.AudioSampleRate.Value; } if (state.Request.AudioBitRate.HasValue) { args += " -ab " + state.Request.AudioBitRate.Value; } return args; } /// /// Gets the video arguments. /// /// The state. /// if set to true [perform subtitle conversion]. /// System.String. protected override string GetVideoArguments(StreamState state, bool performSubtitleConversion) { // No video return string.Empty; } /// /// Gets the segment file extension. /// /// The state. /// System.String. /// Must specify either aac or mp3 audio codec. /// Only aac and mp3 audio codecs are supported. protected override string GetSegmentFileExtension(StreamState state) { if (state.Request.AudioCodec == AudioCodecs.Aac) { return ".aac"; } if (state.Request.AudioCodec == AudioCodecs.Mp3) { return ".mp3"; } throw new ArgumentException("Must specify either aac or mp3 audio codec."); } /// /// Gets the map args. /// /// The state. /// System.String. protected override string GetMapArgs(StreamState state) { return string.Format("-map 0:{0}", state.AudioStream.Index); } } }