feat: implement song submission support, refs #5
This commit is contained in:
@@ -1,9 +1,22 @@
|
||||
using AngleSharp;
|
||||
using AngleSharp.Dom;
|
||||
using YouTubeMusicAPI.Client;
|
||||
|
||||
public class YoutubeMusicValidator : UriBasedSongValidatorBase
|
||||
{
|
||||
public override string UriValidatorRegex => @"^(https?://)?(music\.youtube\.com/watch\?v=|youtu\.be/)([a-zA-Z0-9_-]{11})";
|
||||
public override string UriValidatorRegex => @"^(https?://)?(music\.youtube\.com/playlist\?list=)([a-zA-Z0-9_-]+)";
|
||||
|
||||
private YouTubeMusicClient youtubeClient;
|
||||
|
||||
public YoutubeMusicValidator(ILogger logger, SpotifyApiClient spotifyApiClient) : base(logger, spotifyApiClient)
|
||||
{
|
||||
youtubeClient = new YouTubeMusicClient(logger, "AT", null, null, null);
|
||||
}
|
||||
|
||||
public override SongProvider GetSongProvider()
|
||||
{
|
||||
return SongProvider.YoutubeMusic;
|
||||
}
|
||||
|
||||
public override Task<bool> CanExtractSongMetadataAsync(Uri songUri)
|
||||
{
|
||||
@@ -12,35 +25,23 @@ public class YoutubeMusicValidator : UriBasedSongValidatorBase
|
||||
|
||||
public override async Task<Song> ValidateAsync(Uri songUri)
|
||||
{
|
||||
var title = string.Empty;
|
||||
var artist = string.Empty;
|
||||
var match = this.GetUriMatch(songUri);
|
||||
var playlistId = match.Groups[3].Value;
|
||||
|
||||
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())))
|
||||
{
|
||||
// document.getElementsByTagName("ytmusic-player-queue-item")[0].getElementsByClassName("song-title")[0].innerHTML
|
||||
title = document.QuerySelector(".ytmusic-player-queue-item")?.QuerySelector(".song-title")?.InnerHtml;
|
||||
// document.getElementsByTagName("ytmusic-player-queue-item")[0].getElementsByClassName("byline")[0].innerHTML
|
||||
artist = document.QuerySelector(".ytmusic-player-queue-item")?.QuerySelector(".byline")?.InnerHtml;
|
||||
}
|
||||
}
|
||||
var playlistResult = await youtubeClient.GetCommunityPlaylistInfoAsync(playlistId);
|
||||
var songData = playlistResult.Songs[0];
|
||||
|
||||
var title = songData.Name;
|
||||
var artist = songData.Artists[0].Name;
|
||||
|
||||
#pragma warning disable CS8604 // Possible null reference argument.
|
||||
#pragma warning disable CS8604 // Possible null reference argument.
|
||||
var song = new Song
|
||||
{
|
||||
Name = title,
|
||||
Artist = artist,
|
||||
Url = songUri.ToString(),
|
||||
Provider = SongProvider.YouTube,
|
||||
SpotifyId = this.LookupSpotifyId(title, artist)
|
||||
Provider = SongProvider.YoutubeMusic,
|
||||
SpotifyId = await this.LookupSpotifyIdAsync(title, artist)
|
||||
};
|
||||
#pragma warning restore CS8604 // Possible null reference argument.
|
||||
#pragma warning restore CS8604 // Possible null reference argument.
|
||||
|
||||
return song;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user