using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Tv7Playlist.Core; namespace Tv7Playlist.Controllers { [Route("api/playlist")] [ApiController] public class PlaylistApiController : Controller { private const string PlayListContentType = "audio/mpegurl"; private readonly IAppConfig _appConfig; private readonly ILogger _logger; private readonly IPlaylistBuilder _playlistBuilder; private readonly IPlaylistSynchronizer _playlistSynchronizer; public PlaylistApiController(ILogger logger, IPlaylistSynchronizer playlistSynchronizer, IPlaylistBuilder playlistBuilder, IAppConfig appConfig) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _playlistSynchronizer = playlistSynchronizer ?? throw new ArgumentNullException(nameof(playlistSynchronizer)); _playlistBuilder = playlistBuilder ?? throw new ArgumentNullException(nameof(playlistBuilder)); _appConfig = appConfig ?? throw new ArgumentNullException(nameof(appConfig)); } [HttpGet] [Route("")] public async Task GetPlaylist() { var playlistStream = await _playlistBuilder.GeneratePlaylistAsync(); var downloadFileName = GetDownloadFileName(); _logger.LogInformation(LoggingEvents.Playlist, "Sending updated playlist {filename}", downloadFileName); return new FileStreamResult(playlistStream, PlayListContentType) { FileDownloadName = downloadFileName }; } [HttpPost] [Route("")] public async Task Synchronize() { await _playlistSynchronizer.SynchronizeAsync(); return Ok(); } private string GetDownloadFileName() { var downloadFileName = _appConfig.DownloadFileName; if (string.IsNullOrEmpty(downloadFileName)) downloadFileName = "playlist.m3u"; return downloadFileName; } } }