fix: some cleanup and fixing runtime bugs, refs NOISSUE

This commit is contained in:
2025-05-31 13:41:03 +02:00
parent dbd83ebb6a
commit 0d2ec3712e
23 changed files with 269 additions and 128 deletions

View File

@@ -4,17 +4,17 @@ public class SongResolver
{
private readonly IEnumerable<ISongValidator> _songValidators;
private readonly ILogger logger;
private readonly ILogger<SongResolver> logger;
public SongResolver()
public SongResolver(ILogger<SongResolver> logger)
{
using ILoggerFactory factory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Information));
this.logger = factory.CreateLogger("SongResolver");
this.logger = logger;
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")))) {
.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);
@@ -32,23 +32,25 @@ public class SongResolver
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 {
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)

View File

@@ -14,9 +14,9 @@ public class SpotifyValidator : UriBasedSongValidatorBase
spotifyApiClient = new SpotifyApiClient();
}
public override async Task<bool> CanExtractSongMetadataAsync(Uri songUri)
public override Task<bool> CanExtractSongMetadataAsync(Uri songUri)
{
return this.CanValidateUri(songUri);
return Task.FromResult(this.CanValidateUri(songUri));
}
public override async Task<Song> ValidateAsync(Uri songUri)
@@ -25,7 +25,7 @@ public class SpotifyValidator : UriBasedSongValidatorBase
var trackIdMatch = regexp.Match(songUri.ToString()).Groups[2].Value;
var track = await spotifyApiClient.GetTrackByIdAsync(trackIdMatch);
var song = new Song
{
Name = track.Name,

View File

@@ -5,9 +5,9 @@ public class YoutubeMusicValidator : UriBasedSongValidatorBase
{
public override string UriValidatorRegex => @"^(https?://)?(music\.youtube\.com/watch\?v=|youtu\.be/)([a-zA-Z0-9_-]{11})";
public override async Task<bool> CanExtractSongMetadataAsync(Uri songUri)
public override Task<bool> CanExtractSongMetadataAsync(Uri songUri)
{
return this.CanValidateUri(songUri);
return Task.FromResult(this.CanValidateUri(songUri));
}
public override async Task<Song> ValidateAsync(Uri songUri)
@@ -15,12 +15,12 @@ public class YoutubeMusicValidator : UriBasedSongValidatorBase
var title = string.Empty;
var artist = string.Empty;
using(HttpClient httpClient = new HttpClient())
using (HttpClient httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(songUri);
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
using(var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
using (var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
{
// document.getElementsByTagName("ytmusic-player-queue-item")[0].getElementsByClassName("song-title")[0].innerHTML
title = document.QuerySelector(".ytmusic-player-queue-item")?.QuerySelector(".song-title")?.InnerHtml;
@@ -28,7 +28,9 @@ public class YoutubeMusicValidator : UriBasedSongValidatorBase
artist = document.QuerySelector(".ytmusic-player-queue-item")?.QuerySelector(".byline")?.InnerHtml;
}
}
#pragma warning disable CS8604 // Possible null reference argument.
#pragma warning disable CS8604 // Possible null reference argument.
var song = new Song
{
Name = title,
@@ -37,6 +39,8 @@ public class YoutubeMusicValidator : UriBasedSongValidatorBase
Provider = SongProvider.YouTube,
SpotifyId = this.LookupSpotifyId(title, artist)
};
#pragma warning restore CS8604 // Possible null reference argument.
#pragma warning restore CS8604 // Possible null reference argument.
return song;
}

View File

@@ -8,14 +8,16 @@ public class YoutubeValidator : UriBasedSongValidatorBase
public override async Task<bool> CanExtractSongMetadataAsync(Uri songUri)
{
using(HttpClient httpClient = new HttpClient())
using (HttpClient httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(songUri);
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
using(var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
using (var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
{
#pragma warning disable CS8602 // Dereference of a possibly null reference.
var documentContents = (document.ChildNodes[1] as HtmlElement).InnerHtml;
#pragma warning restore CS8602 // Dereference of a possibly null reference.
var titleElement = document.QuerySelectorAll(".yt-video-attribute-view-model__title")[0];
var artistParentElement = document.QuerySelectorAll(".yt-video-attribute-view-model__secondary-subtitle")[0];
@@ -29,18 +31,20 @@ public class YoutubeValidator : UriBasedSongValidatorBase
var title = string.Empty;
var artist = string.Empty;
using(HttpClient httpClient = new HttpClient())
using (HttpClient httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(songUri);
var config = Configuration.Default.WithDefaultLoader();
var context = BrowsingContext.New(config);
using(var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
using (var document = await context.OpenAsync(async req => req.Content(await response.Content.ReadAsStringAsync())))
{
title = document.QuerySelectorAll(".yt-video-attribute-view-model__title")[0]?.InnerHtml;
artist = document.QuerySelectorAll(".yt-video-attribute-view-model__secondary-subtitle")[0]?.Children[0]?.InnerHtml;
}
}
#pragma warning disable CS8604 // Possible null reference argument.
#pragma warning disable CS8604 // Possible null reference argument.
var song = new Song
{
Name = title,
@@ -49,6 +53,8 @@ public class YoutubeValidator : UriBasedSongValidatorBase
Provider = SongProvider.YouTube,
SpotifyId = this.LookupSpotifyId(title, artist)
};
#pragma warning restore CS8604 // Possible null reference argument.
#pragma warning restore CS8604 // Possible null reference argument.
return song;
}