diff --git a/AzzyBot-Next/Services/Modules/AzuraCastFileService.cs b/AzzyBot-Next/Services/Modules/AzuraCastFileService.cs index c4ba4a58..628001ff 100644 --- a/AzzyBot-Next/Services/Modules/AzuraCastFileService.cs +++ b/AzzyBot-Next/Services/Modules/AzuraCastFileService.cs @@ -1,30 +1,60 @@ -using System.Threading; +using System; +using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; +using AzzyBot.Database; +using AzzyBot.Database.Entities; using AzzyBot.Logging; using AzzyBot.Services.Interfaces; +using AzzyBot.Utilities.Encryption; +using AzzyBot.Utilities.Records.AzuraCast; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace AzzyBot.Services.Modules; -public sealed class AzuraCastFileService(IHostApplicationLifetime applicationLifetime, ILogger logger, IQueuedBackgroundTask taskQueue, AzuraCastService azuraCast) +public sealed class AzuraCastFileService(IHostApplicationLifetime applicationLifetime, ILogger logger, IQueuedBackgroundTask taskQueue, AzuraCastApiService azuraCast, DbActions dbActions) { private readonly ILogger _logger = logger; private readonly IQueuedBackgroundTask _taskQueue = taskQueue; - private readonly AzuraCastService _azuraCast = azuraCast; + private readonly AzuraCastApiService _azuraCast = azuraCast; + private readonly DbActions _dbActions = dbActions; private readonly CancellationToken _cancellationToken = applicationLifetime.ApplicationStopping; public void StartAzuraCastFileService() { - _logger.AzuraCastFileServiceStarted(); + _logger.AzuraCastFileServiceStart(); - return; + Task.Run(async () => await BuildWorkItemAsync(_cancellationToken), _cancellationToken); } - private async ValueTask BuildWorkItemAsync(CancellationToken cancellationToken) + public async ValueTask BuildWorkItemAsync(CancellationToken cancellationToken) { _logger.AzuraCastFileServiceWorkItem(); + while (!cancellationToken.IsCancellationRequested) + { + try + { + foreach (GuildsEntity guild in await _dbActions.GetGuildsAsync()) + { + if (guild.AzuraCast is null) + continue; + + AzuraCastEntity azuraCast = guild.AzuraCast; + foreach (AzuraCastStationEntity station in azuraCast.Stations) + { + IReadOnlyList onlineFiles = await _azuraCast.GetFilesOnlineAsync(new(Crypto.Decrypt(azuraCast.BaseUrl)), Crypto.Decrypt(station.ApiKey), station.StationId); + IReadOnlyList localFiles = await _azuraCast.GetFilesLocalAsync(station.Id, station.StationId); + + + } + } + } + catch (OperationCanceledException) + { } + } + return; } } diff --git a/AzzyBot-Next/Utilities/Records/AzuraCast/FilesRecord.cs b/AzzyBot-Next/Utilities/Records/AzuraCast/FilesRecord.cs new file mode 100644 index 00000000..56dbeed9 --- /dev/null +++ b/AzzyBot-Next/Utilities/Records/AzuraCast/FilesRecord.cs @@ -0,0 +1,24 @@ +using System.Text.Json.Serialization; + +namespace AzzyBot.Utilities.Records.AzuraCast; + +public sealed record FilesRecord +{ + [JsonPropertyName("unique_id")] + public required string UniqueId { get; init; } + + [JsonPropertyName("path")] + public required string Path { get; init; } + + [JsonPropertyName("song_id")] + public required string SongId { get; init; } + + [JsonPropertyName("artist")] + public required string Artist { get; init; } + + [JsonPropertyName("title")] + public required string Title { get; init; } + + [JsonPropertyName("album")] + public string Album { get; init; } = string.Empty; +}