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,74 @@
using System.Linq;
using System.Threading;
using MusicMetaTagger.Core.Model;
using MusicMetaTagger.Core.Queries;
using MusicMetaTagger.Core.Services;
using MusicMetaTagger.Core.Utility;
namespace MusicMetaTagger.Client.AllMusicGuide.Services.Searchers
{
public class AlbumArtistSearcher : ITrackSearcher
{
private readonly IMusicGuide _musicGuide;
public AlbumArtistSearcher(IMusicGuide musicGuide)
{
_musicGuide = musicGuide;
}
public event StatusHandler SearchStatusUpdate;
private void OnStatusUpdate(string status)
{
if (SearchStatusUpdate != null)
SearchStatusUpdate.Invoke(new StatusEventArgs(status));
}
public Track SearchTrack(TrackQuery trackQuery, CancellationToken canellationToken)
{
if (string.IsNullOrEmpty(trackQuery.AlbumTitle)
|| string.IsNullOrEmpty(trackQuery.ArtistName))
return null;
var albumResults = ScoreUtility.ScoreResults(_musicGuide.SearchAlbum, trackQuery.AlbumTitle).ToList();
var artistName = GetArtistName(trackQuery);
var artistResults = ScoreUtility.ScoreResults(_musicGuide.SearchArtist, artistName);
if (canellationToken.IsCancellationRequested)
return null;
var matchingAlbums = ScoreUtility.Match(
albumResults, artistResults,
(album, artist) =>
album.ArtistId == artist.ArtistId).ToList();
if (trackQuery.AlbumPartOfCompilation)
matchingAlbums = matchingAlbums.Union(
from album in albumResults
where
album.Obj.ArtistId == null
|| album.Obj.AlbumTitle.Contains("Soundtrack")
select album
).ToList();
if (canellationToken.IsCancellationRequested)
return null;
OnStatusUpdate("Found " + matchingAlbums.Count() + " potential matching albums");
return (from album in matchingAlbums
let tracks = _musicGuide.GetAlbum(album.Obj.AlbumId).Tracks
let match = TrackSimilarity.MatchTrack(trackQuery, tracks)
where match != null
select match).FirstOrDefault();
}
private static string GetArtistName(TrackQuery trackQuery)
{
var artistName = trackQuery.ArtistName;
if (!string.IsNullOrEmpty(trackQuery.AlbumArtistName) && !trackQuery.AlbumArtistName.Contains("Various"))
artistName = trackQuery.AlbumArtistName;
return artistName;
}
}
}
@@ -0,0 +1,40 @@
using System.Linq;
using System.Threading;
using MusicMetaTagger.Core.Model;
using MusicMetaTagger.Core.Queries;
using MusicMetaTagger.Core.Services;
using MusicMetaTagger.Core.Utility;
namespace MusicMetaTagger.Client.AllMusicGuide.Services.Searchers
{
public class AlbumSearcher : ITrackSearcher
{
private readonly IMusicGuide _musicGuide;
public AlbumSearcher(IMusicGuide musicGuide)
{
_musicGuide = musicGuide;
}
public event StatusHandler SearchStatusUpdate;
public Track SearchTrack(TrackQuery trackQuery, CancellationToken canellationToken)
{
if (string.IsNullOrEmpty(trackQuery.AlbumTitle))
return null;
var albumResults = ScoreUtility.ScoreResults(_musicGuide.SearchAlbum, trackQuery.AlbumTitle);
foreach (ScoreContainer<AlbumResult> album in albumResults.Take(10))
{
if (canellationToken.IsCancellationRequested)
return null;
var tracks = _musicGuide.GetAlbum(album.Obj.AlbumId).Tracks;
var match = TrackSimilarity.MatchTrack(trackQuery, tracks);
if (match != null) return match;
}
return null;
}
}
}
@@ -0,0 +1,59 @@
using System.Linq;
using System.Threading;
using MusicMetaTagger.Core.Model;
using MusicMetaTagger.Core.Queries;
using MusicMetaTagger.Core.Services;
using MusicMetaTagger.Core.Utility;
namespace MusicMetaTagger.Client.AllMusicGuide.Services.Searchers
{
public class SongArtistSearcher : ITrackSearcher
{
private readonly IMusicGuide _musicGuide;
public SongArtistSearcher(IMusicGuide musicGuide)
{
_musicGuide = musicGuide;
}
public event StatusHandler SearchStatusUpdate;
public Track SearchTrack(TrackQuery trackQuery, CancellationToken canellationToken)
{
if (string.IsNullOrEmpty(trackQuery.TrackTitle)
|| string.IsNullOrEmpty(trackQuery.ArtistName))
return null;
var songResults = ScoreUtility.ScoreResults(_musicGuide.SearchSong, trackQuery.TrackTitle);
var artistName = GetArtistName(trackQuery);
var artistResults = ScoreUtility.ScoreResults(_musicGuide.SearchArtist, artistName);
if (canellationToken.IsCancellationRequested)
return null;
var matchingSongs = ScoreUtility.Match(songResults, artistResults, (s, a) => s.ArtistId == a.ArtistId).ToList();
foreach (var song in matchingSongs)
{
foreach (var album in _musicGuide.GetSong(song.Obj.SongId).AppearsOnAlbum)
{
if (canellationToken.IsCancellationRequested)
return null;
var tracks = _musicGuide.GetAlbum(album.AlbumId).Tracks;
var match = TrackSimilarity.MatchTrack(trackQuery, tracks);
if (match != null) return match;
}
}
return null;
}
private static string GetArtistName(TrackQuery trackQuery)
{
var artistName = trackQuery.ArtistName;
if (!string.IsNullOrEmpty(trackQuery.AlbumArtistName) && !trackQuery.AlbumArtistName.Contains("Various"))
artistName = trackQuery.AlbumArtistName;
return artistName;
}
}
}