diff --git a/Rhapsody.sln b/Rhapsody.sln index 1cb4ed7..d6676d8 100644 --- a/Rhapsody.sln +++ b/Rhapsody.sln @@ -5,6 +5,8 @@ VisualStudioVersion = 15.0.26124.0 MinimumVisualStudioVersion = 15.0.26124.0 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rhapsody", "src\Rhapsody.csproj", "{055F55B0-D3D5-4F99-8EA1-3429B35E6294}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dysc", "..\Dysc\src\Dysc.csproj", "{7BA2777E-6357-45BC-A30C-70A09FF65BD8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,5 +32,17 @@ Global {055F55B0-D3D5-4F99-8EA1-3429B35E6294}.Release|x64.Build.0 = Release|Any CPU {055F55B0-D3D5-4F99-8EA1-3429B35E6294}.Release|x86.ActiveCfg = Release|Any CPU {055F55B0-D3D5-4F99-8EA1-3429B35E6294}.Release|x86.Build.0 = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|x64.ActiveCfg = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|x64.Build.0 = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|x86.ActiveCfg = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Debug|x86.Build.0 = Debug|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|Any CPU.Build.0 = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|x64.ActiveCfg = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|x64.Build.0 = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|x86.ActiveCfg = Release|Any CPU + {7BA2777E-6357-45BC-A30C-70A09FF65BD8}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/Controllers/PingController.cs b/src/Controllers/PingController.cs index 65e01a3..83d5989 100644 --- a/src/Controllers/PingController.cs +++ b/src/Controllers/PingController.cs @@ -1,12 +1,12 @@ using System; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; +using Rhapsody.Payloads.Outbound; namespace Rhapsody.Controllers { [Route("api/[controller]"), ApiController, Produces("application/json")] public sealed class PingController : ControllerBase { private readonly IMemoryCache _memoryCache; - private const string CACHE_KEY = "_Time"; public PingController(IMemoryCache memoryCache) { _memoryCache = memoryCache; @@ -14,13 +14,13 @@ public PingController(IMemoryCache memoryCache) { [HttpGet] public IActionResult Ping() { - if (_memoryCache.TryGetValue(CACHE_KEY, out DateTimeOffset old)) { - return Ok(old); + if (_memoryCache.TryGetValue("PING", out DateTimeOffset old)) { + return RestResponse.Ok(old); } - old = DateTimeOffset.Now; - _memoryCache.Set(CACHE_KEY, old); - return Ok(old); + old = DateTimeOffset.UtcNow; + _memoryCache.Set("PING", old); + return RestResponse.Ok(old); } } } \ No newline at end of file diff --git a/src/Controllers/SearchController.cs b/src/Controllers/SearchController.cs index edc2387..7476ead 100644 --- a/src/Controllers/SearchController.cs +++ b/src/Controllers/SearchController.cs @@ -1,15 +1,10 @@ using System; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Dysc; -using Dysc.Providers; -using Dysc.Search; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; -using Rhapsody.Extensions; using Rhapsody.Internals.Attributes; using Rhapsody.Payloads.Outbound; @@ -17,12 +12,12 @@ namespace Rhapsody.Controllers { [Route("api/[controller]"), ApiController, Produces("application/json")] [ServiceFilter(typeof(ProviderFilterAttribute))] public sealed class SearchController : ControllerBase { - private readonly DyscClient _dyscClient; + private readonly Dysk _dysk; private readonly IMemoryCache _memoryCache; private readonly ILogger _logger; - public SearchController(DyscClient dyscClient, ILogger logger, IMemoryCache memoryCache) { - _dyscClient = dyscClient; + public SearchController(Dysk dysk, ILogger logger, IMemoryCache memoryCache) { + _dysk = dysk; _logger = logger; _memoryCache = memoryCache; } @@ -32,61 +27,58 @@ public SearchController(DyscClient dyscClient, ILogger logger, [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - public ValueTask GetYouTubeAsync(string query) { - return SearchAsync(ProviderType.YouTube, query); + public ValueTask GetYouTubeAsync(string query, bool isPlaylist = false) { + return SearchAsync(SourceProvider.YouTube, query, isPlaylist); } [HttpGet("soundcloud")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - public ValueTask GetSoundCloudAsync(string query) { - return SearchAsync(ProviderType.SoundCloud, query); + public ValueTask GetSoundCloudAsync(string query, bool isPlaylist = false) { + return SearchAsync(SourceProvider.SoundCloud, query, isPlaylist); } [HttpGet("bandcamp")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - public ValueTask GetBandCampAsync(string query) { - return SearchAsync(ProviderType.BandCamp, query); + public ValueTask GetBandCampAsync(string query, bool isPlaylist = false) { + return SearchAsync(SourceProvider.BandCamp, query, isPlaylist); } [HttpGet("hearthisat")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - public ValueTask GetHearThisAtAsync(string query) { - return SearchAsync(ProviderType.HearThisAt, query); + public ValueTask GetHearThisAtAsync(string query, bool isPlaylist = false) { + return SearchAsync(SourceProvider.HearThisAt, query, isPlaylist); } [HttpGet("http")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] [ProducesResponseType(StatusCodes.Status400BadRequest)] - public ValueTask GetHttpAsync(string query) { + public ValueTask GetHttpAsync(string query, bool isPlaylist = false) { return !Uri.IsWellFormedUriString(query, UriKind.Absolute) ? new ValueTask(RestResponse.Error("Query must be an absolute URI string.")) - : SearchAsync(ProviderType.Http, query); + : SearchAsync(SourceProvider.Http, query, isPlaylist); } - private async ValueTask SearchAsync(ProviderType providerType, string query) { + private async ValueTask SearchAsync(SourceProvider providerType, string query, bool isPlaylist) { if (string.IsNullOrWhiteSpace(query)) { return RestResponse.Error("Query must not be empty."); } try { - var provider = _dyscClient.GetProvider(providerType); - if (TrySearchCache(providerType, query, out var searchResponse)) { - } - else { - searchResponse = await provider.SearchAsync(query); - _memoryCache.Set(providerType, new[] { - searchResponse - }); + var provider = _dysk.GetProvider(providerType); + if (isPlaylist) { + var playlistResult = await provider.GetPlaylistAsync(query); + return RestResponse.Ok(playlistResult); } - return RestResponse.Ok(searchResponse); + var trackResults = await provider.SearchAsync(query); + return RestResponse.Ok(trackResults); } catch (Exception exception) { _logger.LogCritical(exception, exception.StackTrace); @@ -94,7 +86,8 @@ private async ValueTask SearchAsync(ProviderType providerType, st } } - private bool TrySearchCache(ProviderType providerType, string query, out SearchResponse searchResponse) { + /* + private bool TrySearchCache(SourceProvider providerType, string query, out SearchResponse searchResponse) { searchResponse = default; if (!_memoryCache.TryGetValue(providerType, out ICollection searchResponses)) { return false; @@ -125,8 +118,9 @@ private bool TrySearchCache(ProviderType providerType, string query, out SearchR searchResponse = response; return true; } - + return false; } + */ } } \ No newline at end of file diff --git a/src/Extensions/MiscExtensions.cs b/src/Extensions/MiscExtensions.cs index ce9e006..c8486e5 100644 --- a/src/Extensions/MiscExtensions.cs +++ b/src/Extensions/MiscExtensions.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Colorful; -using Dysc.Providers; +using Dysc; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Rhapsody.Objects; @@ -101,7 +101,7 @@ public static ApplicationOptions VerifyOptions() { }, DefaultLevel = LogLevel.Trace }, - Providers = Enum.GetNames(typeof(ProviderType)) + Providers = Enum.GetNames(typeof(SourceProvider)) .ToDictionary(x => x.ToLower(), x => true) }; var serialize = applicationOptions.Serialize(); diff --git a/src/Internals/Logging/LoggerProvider.cs b/src/Internals/Logging/LoggerProvider.cs index 2f5cb4d..c4d1925 100644 --- a/src/Internals/Logging/LoggerProvider.cs +++ b/src/Internals/Logging/LoggerProvider.cs @@ -30,12 +30,12 @@ public readonly ILogger CreateLogger(string categoryName) { if (_filters.TryGetFilter(ref categoryName, out var logLevel)) { } - if (_loggers.TryGetValue(categoryName, out var logger)) { - return logger; - } + if (_loggers.TryGetValue(categoryName, out var logger)) { + return logger; + } - logger = new ColorfulLogger(categoryName, _defaultLevel, this); + logger = new ColorfulLogger(categoryName, logLevel, this); _loggers.TryAdd(categoryName, logger); return logger; } diff --git a/src/Internals/Middlewares/ExceptionMiddleware.cs b/src/Internals/Middlewares/ExceptionMiddleware.cs index 9ae3f99..b339013 100644 --- a/src/Internals/Middlewares/ExceptionMiddleware.cs +++ b/src/Internals/Middlewares/ExceptionMiddleware.cs @@ -18,7 +18,7 @@ public async Task Invoke(HttpContext context) { await _requestDelegate(context); } catch (Exception ex) { - _logger.LogError(ex, ex.StackTrace); + _logger.LogError(ex.Message, ex.StackTrace); context.Response.StatusCode = 500; } } diff --git a/src/Program.cs b/src/Program.cs index 502fe4e..0b5f40b 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -54,7 +54,7 @@ await Host.CreateDefaultBuilder() collection.Configure(context.Configuration); collection.AddScoped(); - collection.AddSingleton(); + collection.AddSingleton(); }) .RunConsoleAsync(); } diff --git a/src/Properties/launchSettings.json b/src/Properties/launchSettings.json new file mode 100644 index 0000000..c013471 --- /dev/null +++ b/src/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:57080/", + "sslPort": 44302 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Rhapsody": { + "commandName": "Project", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/src/configuration.json b/src/configuration.json new file mode 100644 index 0000000..5e8cbfb --- /dev/null +++ b/src/configuration.json @@ -0,0 +1 @@ +{"endpoint":{"host":"*","port":2020,"fallbackRandom":false},"authentication":{"password":"Rhapsody","endpoints":["/api/search","/ws"]},"logging":{"defaultLevel":"Trace","filters":{"System.*":3}},"providers":{"youtube":true,"soundcloud":true,"bandcamp":true,"hearthisat":true,"http":true}} \ No newline at end of file diff --git a/src/wwwroot/css/custom.css b/src/wwwroot/css/custom.css index ce4b796..b0ff268 100644 --- a/src/wwwroot/css/custom.css +++ b/src/wwwroot/css/custom.css @@ -90,4 +90,26 @@ html, body { .menu.active .bar:nth-child(3) ul li { opacity: 1; +} + +.has-border-radius-20 { + border-radius: 20px; +} + +.has-border-radius-15 { + border-radius: 15px; +} + +.has-shadow { + box-shadow: 0 1px 10px black; +} + +.is-tea-pink { + color: #131313 !important; + background-color: #fcd4fb !important; +} + +.is-somewhat-yellow { + color: #131313 !important; + background-color: #fff454 !important; } \ No newline at end of file diff --git a/src/wwwroot/index.html b/src/wwwroot/index.html index 567720e..247bbd6 100644 --- a/src/wwwroot/index.html +++ b/src/wwwroot/index.html @@ -29,8 +29,8 @@ -
+

Yeee hawe

-
+ \ No newline at end of file