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
+262
View File
@@ -0,0 +1,262 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using WMPLib;
namespace MusicMetaTagger.UI
{
/// <summary>
/// </summary>
/// <remarks>
/// Attribute Reference http://msdn2.microsoft.com/en-us/library/bb248367.aspx
/// </remarks>
public class MediaPlayerLibraryInterface : IMusicLibraryInterface
{
#region Private members
/// <summary>
/// Relates TrackQuery object to the
/// </summary>
private Dictionary<TrackQueryStatus, IWMPMedia> _trackQueryTracks;
/// <summary>
/// Media player interface object (COM)
/// </summary>
private WindowsMediaPlayer _windowsMediaPlayer;
#endregion
#region Private methods
/// <summary>
/// Gets the IWMPMedia track from the associated TrackQueryStatus.
/// </summary>
/// <param name = "trackQueryStatus">The track query status.</param>
/// <returns></returns>
private IWMPMedia GetTrack(TrackQueryStatus trackQueryStatus)
{
if (!_trackQueryTracks.ContainsKey(trackQueryStatus))
throw new ApplicationException("Doesn't contain track" + trackQueryStatus.TrackTitle);
return _trackQueryTracks[trackQueryStatus];
}
#endregion
#region IMusicLibraryInterface methods
/// <summary>
/// Gets the track queries.
/// </summary>
/// <param name = "libraryQuery">The library query.</param>
/// <param name = "callback">The callback.</param>
/// <returns></returns>
public List<TrackQueryStatus> GetTrackQueries(LibraryQuery libraryQuery, IProgressCallback callback)
{
if (_trackQueryTracks == null)
_trackQueryTracks = new Dictionary<TrackQueryStatus, IWMPMedia>();
var trackQueries = new List<TrackQueryStatus>();
callback.SetText("Opening Media Player Library");
_windowsMediaPlayer = new WindowsMediaPlayer();
var mediaCollection = _windowsMediaPlayer.mediaCollection;
callback.SetText("Getting tracks");
var playlist = mediaCollection.getAll();
var trackCount = libraryQuery.ScanLimit <= 0 ? playlist.count : Math.Min(playlist.count, libraryQuery.ScanLimit);
callback.SetRange(0, trackCount);
callback.Begin();
for (var i = 1; i <= trackCount; i++)
{
callback.Increment(1);
if (i%5 == 0 || i == trackCount)
callback.SetText(string.Format("Scanning track# {0} / {1}, Found {2} matches", i, trackCount, trackQueries.Count));
if (callback.IsAborting)
break;
var track = playlist.Item[i];
var trackQuery =
new TrackQueryStatus
{
TrackTitle = track.getItemInfo("Title"),
ArtistName = track.getItemInfo("Author"),
AlbumTitle = track.getItemInfo("AlbumId")
};
var durationString = track.getItemInfo("Duration");
if (string.IsNullOrEmpty(durationString))
durationString = "1";
trackQuery.TrackLength =
new TimeSpan(0, 0, 0, Convert.ToInt32(Convert.ToDouble(durationString)));
var originalIndexString = track.getItemInfo("OriginalIndex");
if (!string.IsNullOrEmpty(originalIndexString))
trackQuery.TrackNumber = Convert.ToInt32(originalIndexString);
var acquisitionTime = Convert.ToDateTime(track.getItemInfo("AcquisitionTime"));
if (libraryQuery.AddedAfter > acquisitionTime)
continue;
if (libraryQuery.BlankGenre && !string.IsNullOrEmpty(track.getItemInfo("Genre")))
continue;
if (libraryQuery.BlankRating && !string.IsNullOrEmpty(track.getItemInfo("UserRating")))
continue;
if (libraryQuery.BlankYear && !string.IsNullOrEmpty(track.getItemInfo("ReleaseDateYear")))
continue;
if (!libraryQuery.MatchTrackQuery(trackQuery))
continue;
trackQueries.Add(trackQuery);
_trackQueryTracks.Add(trackQuery, track);
}
return trackQueries;
}
/// <summary>
/// Updates the album art.
/// </summary>
/// <remarks>
/// http://msdn2.microsoft.com/en-us/library/aa392196.aspx
/// </remarks>
/// <param name = "trackQuery">The track query.</param>
/// <param name = "albumArt">The album art file info.</param>
/// <param name = "overwrite">if set to <c>true</c> [overwrite].</param>
/// <returns>True if update was successful, false otherwise</returns>
public bool UpdateAlbumArt(TrackQueryStatus trackQuery, FileInfo albumArt, bool overwrite)
{
//IWMPMedia track = GetTrack(trackQuery);
//IWMPMedia3 t = track as IWMPMedia3;
//Object o = t.getItemInfoByType("WM/Picture", "", 0);
//int [] ha;
//WMPicture pic = new WMPicture();
//Marshal.Copy(ha., 0, pic, );
// http://www.ureader.com/message/33380790.aspx
return false;
}
/// <summary>
/// Updates the genre.
/// </summary>
/// <param name = "trackQuery">The track query.</param>
/// <param name = "genre">The genre.</param>
/// <param name = "overwrite">if set to <c>true</c> [overwrite].</param>
/// <returns>True if update was successful, false otherwise</returns>
public bool UpdateGenre(TrackQueryStatus trackQuery, string genre, bool overwrite)
{
var track = GetTrack(trackQuery);
if (string.IsNullOrEmpty(track.getItemInfo("WM/Genre")) || overwrite)
{
track.setItemInfo("WM/Genre", genre);
return true;
}
return false;
}
/// <summary>
/// Updates the year.
/// </summary>
/// <param name = "trackQuery">The track query.</param>
/// <param name = "year">The year.</param>
/// <param name = "overwrite">if set to <c>true</c> [overwrite].</param>
/// <returns>True if update was successful, false otherwise</returns>
public bool UpdateYear(TrackQueryStatus trackQuery, int year, bool overwrite)
{
var track = GetTrack(trackQuery);
if (track.isReadOnlyItem("WM/Year"))
return false;
if (string.IsNullOrEmpty(track.getItemInfo("WM/Year")) || overwrite)
{
track.setItemInfo("WM/Year", year.ToString(CultureInfo.InvariantCulture));
return true;
}
return false;
}
/// <summary>
/// Updates the rating.
/// </summary>
/// <param name = "trackQuery">The track query.</param>
/// <param name = "rating">The rating from 0 to 100.</param>
/// <param name = "overwrite">if set to <c>true</c> overwrite existing value.</param>
/// <returns>True if update was successful, false otherwise</returns>
public bool UpdateRating(TrackQueryStatus trackQuery, int rating, bool overwrite)
{
var track = GetTrack(trackQuery);
if (Convert.ToInt32(track.getItemInfo("UserRating")) == 0 || overwrite)
{
track.setItemInfo("UserRating", rating.ToString(CultureInfo.InvariantCulture));
return true;
}
return false;
}
public bool AddComment(TrackQueryStatus trackQuery, string comment)
{
// TODO: implement
return false;
}
/// <summary>
/// Returns true if the trackQuery represents an Mp3.
/// </summary>
/// <returns></returns>
public bool IsMp3(TrackQueryStatus trackQuery)
{
var track = GetTrack(trackQuery);
try
{
var trackFileInfo = new FileInfo(track.sourceURL);
return trackFileInfo.Extension.ToUpper() == "MP3";
}
catch
{
}
return false;
}
/// <summary>
/// Returns the Mp3 represented by this trackQuery
/// </summary>
/// <param name = "trackQuery"></param>
/// <returns></returns>
public FileInfo GetMp3FileInfo(TrackQueryStatus trackQuery)
{
var track = GetTrack(trackQuery);
try
{
return new FileInfo(track.sourceURL);
}
catch
{
}
return null;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct WMPicture
{
public readonly IntPtr pwszMIMEType;
public readonly byte bPictureType;
public readonly IntPtr pwszDescription;
[MarshalAs(UnmanagedType.U4)] public readonly int dwDataLen;
public readonly IntPtr pbData;
}
#endregion
}
}