Simon Diesenreiter dbd83ebb6a
Some checks failed
CI / linter (9.0.X, ubuntu-latest) (push) Failing after 1m3s
CI / tests_linux (9.0.X, ubuntu-latest) (push) Has been skipped
SonarQube Scan / SonarQube Trigger (push) Failing after 4m47s
feat: basic initial implementation of spotify client link validator and song submission form refs: NOISSUE
2025-05-30 22:51:44 +02:00

66 lines
2.3 KiB
C#

using Microsoft.Extensions.Logging;
public class SongResolver
{
private readonly IEnumerable<ISongValidator> _songValidators;
private readonly ILogger logger;
public SongResolver()
{
using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Information));
this.logger = factory.CreateLogger("SongResolver");
this._songValidators = new List<ISongValidator>();
foreach (Type mytype in System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(mytype => mytype.GetInterfaces().Contains(typeof(ISongValidator)) && !(mytype.Name.EndsWith("Base")))) {
if (Activator.CreateInstance(mytype) is ISongValidator validator)
{
logger.LogDebug("Registering song validator: {ValidatorType}", mytype.Name);
this._songValidators = this._songValidators.Append(validator);
}
}
}
public async Task<Song> ResolveSongAsync(Uri songUri)
{
foreach (var validator in _songValidators)
{
if (validator.CanValidateUri(songUri))
{
if (!await validator.CanExtractSongMetadataAsync(songUri))
{
this.logger.LogWarning("Cannot extract metadata for song URI: {SongUri}", songUri);
return new Song {
Artist = "Unknown Artist",
Name = "Unknown Title",
Url = songUri.ToString(),
Provider = SongProvider.PlainHttp,
};
}
return await validator.ValidateAsync(songUri);
}
}
return new Song {
Artist = "Unknown Artist",
Name = "Unknown Title",
Url = songUri.ToString(),
Provider = SongProvider.PlainHttp,
};
}
public bool CanValidate(Uri songUri)
{
foreach (var validator in _songValidators)
{
if (validator.CanValidateUri(songUri))
{
return true;
}
}
return false;
}
}