Initial commit — AllMusicGuide scraper and music metadata tagger

This commit is contained in:
2026-05-10 02:49:16 +00:00
commit 4a541ca04b
194 changed files with 46364 additions and 0 deletions
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class AlbumResultPageScraper : ScraperBase<List<AlbumResult>, AlbumResultPageClient, AlbumResultPageParser>
{
}
}
@@ -0,0 +1,10 @@
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class AlbumScraper : ScraperBase<Album, AlbumClient, AlbumParser>
{
}
}
@@ -0,0 +1,24 @@
using System.Collections.Generic;
using System.Linq;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class ArtistDiscographyScraper : IScraper<List<ArtistDiscography>>
{
public List<ArtistDiscography> Scrape(string artistId)
{
var parser = new ArtistDiscographyPageParser();
var xmlClients =
new IXmlClientBase[]
{
new ArtistDiscographyAlbumPageClient(),
new ArtistDiscographyCompilationPageClient(),
new ArtistDiscographyEpSinglesPageClient()
};
return xmlClients.Select(c => c.Read(artistId)).SelectMany(parser.Parse).ToList();
}
}
}
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class ArtistResultPageScraper : ScraperBase<List<ArtistResult>, ArtistResultPageClient, ArtistResultPageParser>
{
}
}
@@ -0,0 +1,19 @@
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class ArtistScraper : ScraperBase<Artist, ArtistClient, ArtistParser>
{
public new Artist Scrape(string artistId)
{
var artist = base.Scrape(artistId);
var artistDiscographyScraper = new ArtistDiscographyScraper();
artist.Discography = artistDiscographyScraper.Scrape(artistId);
return artist;
}
}
}
@@ -0,0 +1,7 @@
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public interface IScraper<out TEntity>
{
TEntity Scrape(string criteria);
}
}
@@ -0,0 +1,16 @@
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public abstract class ScraperBase<TEntity, TClient, TParser> : IScraper<TEntity>
where TClient : IXmlClientBase, new()
where TParser : IParser<TEntity>, new()
{
public TEntity Scrape(string criteria)
{
var xmlDocument = new TClient().Read(criteria);
return new TParser().Parse(xmlDocument);
}
}
}
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class SongResultPageScraper : ScraperBase<List<SongResult>, SongResultPageClient, SongResultPageParser>
{
}
}
@@ -0,0 +1,10 @@
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Client;
using MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Parser;
using MusicMetaTagger.Core.Model;
namespace MusicMetaTagger.Client.AllMusicGuide.RemoteDataAccess.Scraper
{
public class SongScraper : ScraperBase<Song, SongClient, SongParser>
{
}
}