66 lines
2.3 KiB
C#
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;
|
|
}
|
|
} |