diff --git a/Tv7Playlist.Core/IAppConfig.cs b/Tv7Playlist.Core/IAppConfig.cs new file mode 100644 index 0000000..97e1a05 --- /dev/null +++ b/Tv7Playlist.Core/IAppConfig.cs @@ -0,0 +1,13 @@ +namespace Tv7Playlist.Core +{ + public interface IAppConfig + { + string TV7Url { get; set; } + + SourceTypeEnum SourceType { get; set; } + + string UdpxyUrl { get; set; } + + string DownloadFileName { get; set; } + } +} \ No newline at end of file diff --git a/Tv7Playlist.Core/IPlaylistLoader.cs b/Tv7Playlist.Core/IPlaylistLoader.cs new file mode 100644 index 0000000..390856e --- /dev/null +++ b/Tv7Playlist.Core/IPlaylistLoader.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Tv7Playlist.Core.Parsers; + +namespace Tv7Playlist.Core +{ + public interface IPlaylistLoader + { + Task> LoadPlaylistFromUrl(); + } +} \ No newline at end of file diff --git a/Tv7Playlist.Core/Parsers/IPlaylistParser.cs b/Tv7Playlist.Core/Parsers/IPlaylistParser.cs index 24b2ff4..9e179d9 100644 --- a/Tv7Playlist.Core/Parsers/IPlaylistParser.cs +++ b/Tv7Playlist.Core/Parsers/IPlaylistParser.cs @@ -6,6 +6,6 @@ namespace Tv7Playlist.Core.Parsers { public interface IPlaylistParser { - Task> ParseFromStream(Stream stream); + Task> ParseFromStreamAsync(Stream stream); } } \ No newline at end of file diff --git a/Tv7Playlist.Core/Parsers/M3u/M3UParser.cs b/Tv7Playlist.Core/Parsers/M3u/M3UParser.cs index 22182dd..c65bbd5 100644 --- a/Tv7Playlist.Core/Parsers/M3u/M3UParser.cs +++ b/Tv7Playlist.Core/Parsers/M3u/M3UParser.cs @@ -20,7 +20,7 @@ namespace Tv7Playlist.Core.Parsers.M3u _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } - public async Task> ParseFromStream(Stream stream) + public async Task> ParseFromStreamAsync(Stream stream) { if (stream == null) throw new ArgumentNullException(nameof(stream)); diff --git a/Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs b/Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs index 9073a57..24d1ecc 100644 --- a/Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs +++ b/Tv7Playlist.Core/Parsers/Xspf/XspfParser.cs @@ -10,7 +10,7 @@ namespace Tv7Playlist.Core.Parsers.Xspf { public class XspfParser : IPlaylistParser { - public Task> ParseFromStream(Stream stream) + public Task> ParseFromStreamAsync(Stream stream) { var deserializedList = DeserializePlaylist(stream); diff --git a/Tv7Playlist.Core/PlaylistLoader.cs b/Tv7Playlist.Core/PlaylistLoader.cs new file mode 100644 index 0000000..e0fce6e --- /dev/null +++ b/Tv7Playlist.Core/PlaylistLoader.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Tv7Playlist.Core.Parsers; + +namespace Tv7Playlist.Core +{ + public class PlaylistLoader : IPlaylistLoader + { + private readonly ILogger _logger; + private readonly IPlaylistParser _playlistParser; + private readonly string _tv7Url; + + public PlaylistLoader(ILogger logger, IAppConfig appConfig, IPlaylistParser playlistParser) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _playlistParser = playlistParser ?? throw new ArgumentNullException(nameof(playlistParser)); + + _tv7Url = appConfig.TV7Url; + + } + + public async Task> LoadPlaylistFromUrl() + { + using (var httpClient = new HttpClient()) + { + _logger.LogInformation(LoggingEvents.Playlist, "Downloading playlist from {tv7url}", _tv7Url); + + var tv7Response = await httpClient.GetAsync(_tv7Url); + if (!tv7Response.IsSuccessStatusCode) + { + _logger.LogWarning(LoggingEvents.PlaylistNotFound, "Could not download playlist from {tv7url}. The StatusCode was: {StatusCode}", _tv7Url, tv7Response.StatusCode); + } + + return await ParseTracksFromResponseAsync(tv7Response); + } + } + + private async Task> ParseTracksFromResponseAsync(HttpResponseMessage tv7Response) + { + _logger.LogInformation(LoggingEvents.Playlist, "Parse"); + + using (var tv7ReadStream = await tv7Response.Content.ReadAsStreamAsync()) + { + return await _playlistParser.ParseFromStreamAsync(tv7ReadStream); + } + } + } +} \ No newline at end of file diff --git a/Tv7Playlist.Core/SourceTypeEnum.cs b/Tv7Playlist.Core/SourceTypeEnum.cs new file mode 100644 index 0000000..fb6b7fa --- /dev/null +++ b/Tv7Playlist.Core/SourceTypeEnum.cs @@ -0,0 +1,8 @@ +namespace Tv7Playlist.Core +{ + public enum SourceTypeEnum + { + M3U, + Xspf + } +} \ No newline at end of file diff --git a/Tv7Playlist.Core/Tv7Playlist.Core.csproj b/Tv7Playlist.Core/Tv7Playlist.Core.csproj index dd2d8d6..084863e 100644 --- a/Tv7Playlist.Core/Tv7Playlist.Core.csproj +++ b/Tv7Playlist.Core/Tv7Playlist.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 diff --git a/Tv7Playlist/AppConfig.cs b/Tv7Playlist/AppConfig.cs index f92f998..3e546bb 100644 --- a/Tv7Playlist/AppConfig.cs +++ b/Tv7Playlist/AppConfig.cs @@ -1,15 +1,11 @@ using System; +using Tv7Playlist.Core; namespace Tv7Playlist { - public class AppConfig + public class AppConfig : IAppConfig { - public enum SourceTypeEnum - { - M3U, - Xspf - } - + private string _tv7Url; private string _udpxyUrl; diff --git a/Tv7Playlist/Controllers/HomeController.cs b/Tv7Playlist/Controllers/HomeController.cs index 444fe8e..7292c0e 100644 --- a/Tv7Playlist/Controllers/HomeController.cs +++ b/Tv7Playlist/Controllers/HomeController.cs @@ -4,12 +4,25 @@ using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; using Tv7Playlist.Models; namespace Tv7Playlist.Controllers { public class HomeController : Controller { + private readonly ILogger _logger; + + public HomeController(ILogger logger, IConfiguration configuration) + { + if (configuration == null) throw new ArgumentNullException(nameof(configuration)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + var appConfig = configuration.Get(); + + } + public IActionResult Index() { return View(); diff --git a/Tv7Playlist/Startup.cs b/Tv7Playlist/Startup.cs index a43f8c3..cc8298e 100644 --- a/Tv7Playlist/Startup.cs +++ b/Tv7Playlist/Startup.cs @@ -37,8 +37,11 @@ namespace Tv7Playlist options.MinimumSameSitePolicy = SameSiteMode.None; }); - ConfigureParser(services); - ConfigureDatabase(services); + var appConfig = ConfigureAppConfig(services); + + LogConfiguration(appConfig); + ConfigureParser(services, appConfig); + ConfigureDatabase(services, appConfig); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } @@ -46,8 +49,6 @@ namespace Tv7Playlist // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { - LogConfiguration(); - if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); @@ -66,41 +67,49 @@ namespace Tv7Playlist app.UseMvc(routes => { routes.MapRoute( - name: "default", - template: "{controller=Home}/{action=Index}/{id?}"); + "default", + "{controller=Home}/{action=Index}/{id?}"); }); } - private void ConfigureParser(IServiceCollection services) + private void ConfigureParser(IServiceCollection services, IAppConfig appConfig) { - var type = Configuration.Get().SourceType; + services.AddTransient(); + + var type = appConfig.SourceType; switch (type) { - case AppConfig.SourceTypeEnum.M3U: + case SourceTypeEnum.M3U: services.AddTransient(); break; - case AppConfig.SourceTypeEnum.Xspf: + case SourceTypeEnum.Xspf: services.AddTransient(); break; default: throw new ArgumentOutOfRangeException(); } } - - private static void ConfigureDatabase(IServiceCollection services) + + private IAppConfig ConfigureAppConfig(IServiceCollection services) + { + var appConfig = Configuration.Get(); + services.AddSingleton(appConfig); + return appConfig; + } + + private static void ConfigureDatabase(IServiceCollection services, IAppConfig appConfig) { //TODO: Move to settings to make it configurable within docker. var connection = "Data Source=playlist.db"; services.AddDbContext(options => options.UseSqlite(connection)); } - private void LogConfiguration() + private void LogConfiguration(IAppConfig appConfig) { - var appConfig = Configuration.Get(); _logger.LogInformation(LoggingEvents.Startup, "Using TV7 URL: {TV7Url}", appConfig.TV7Url); _logger.LogInformation(LoggingEvents.Startup, "Using Udpxy URL: {UdpxyUrl}", appConfig.UdpxyUrl); _logger.LogInformation(LoggingEvents.Startup, "Using DownloadFileName: {DownloadFileName}", appConfig.DownloadFileName); } } -} +} \ No newline at end of file