mirror of
https://github.com/ZuneDev/ZuneModdingHelper.git
synced 2026-07-27 13:12:21 -07:00
Improved MBID Locator reliability
This commit is contained in:
@@ -14,6 +14,11 @@ namespace ZuneModCore.Mods
|
|||||||
public const string ZUNE_MEDIA_ID_NAME = "ZuneMediaID";
|
public const string ZUNE_MEDIA_ID_NAME = "ZuneMediaID";
|
||||||
public const string ZUNE_COLLECTION_ID_NAME = "ZuneCollectionID";
|
public const string ZUNE_COLLECTION_ID_NAME = "ZuneCollectionID";
|
||||||
|
|
||||||
|
private static readonly string[] KNOWN_EXTS = new[]
|
||||||
|
{
|
||||||
|
".mp3", ".mp4", ".m4a", ".wav"
|
||||||
|
};
|
||||||
|
|
||||||
public override string Id => nameof(FeaturesOverrideMod);
|
public override string Id => nameof(FeaturesOverrideMod);
|
||||||
|
|
||||||
public override string Title => "MusicBrainz ID Locator";
|
public override string Title => "MusicBrainz ID Locator";
|
||||||
@@ -53,11 +58,16 @@ namespace ZuneModCore.Mods
|
|||||||
return $"The folder '{folder.FullName}' does not exist.";
|
return $"The folder '{folder.FullName}' does not exist.";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (FileInfo file in folder.EnumerateFiles("*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
|
foreach (FileInfo file in folder.GetFiles("*.*", recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
UpdateMbidInFile(file);
|
if (KNOWN_EXTS.Contains(file.Extension))
|
||||||
|
UpdateMbidInFile(file);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
System.Diagnostics.Debug.WriteLine(file);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -114,30 +124,43 @@ namespace ZuneModCore.Mods
|
|||||||
{
|
{
|
||||||
var frames = id3v2.GetFrames<TagLib.Id3v2.PrivateFrame>();
|
var frames = id3v2.GetFrames<TagLib.Id3v2.PrivateFrame>();
|
||||||
|
|
||||||
var albumArtistFrame = frames.FirstOrDefault(f => f.Owner == ZUNE_ALBUM_ARTIST_MEDIA_ID_NAME);
|
// Note the use of .ToList(): this is because calling RemoveFrame() will
|
||||||
if (albumArtistFrame == null && tag.MusicBrainzReleaseArtistId != null)
|
// modify the underlying collection, causing an exception to be thrown
|
||||||
|
// when attempting the next iteration of the for loop
|
||||||
|
|
||||||
|
if (tag.MusicBrainzReleaseArtistId != null)
|
||||||
{
|
{
|
||||||
albumArtistFrame = new TagLib.Id3v2.PrivateFrame(ZUNE_ALBUM_ARTIST_MEDIA_ID_NAME);
|
foreach (var oldAlbumArtistFrame in frames.Where(f => f.Owner == ZUNE_ALBUM_ARTIST_MEDIA_ID_NAME).ToList())
|
||||||
albumArtistFrame.PrivateData = new TagLib.ByteVector(
|
id3v2.RemoveFrame(oldAlbumArtistFrame);
|
||||||
new Guid(tag.MusicBrainzReleaseArtistId).ToByteArray());
|
|
||||||
|
TagLib.Id3v2.PrivateFrame albumArtistFrame = new(ZUNE_ALBUM_ARTIST_MEDIA_ID_NAME)
|
||||||
|
{
|
||||||
|
PrivateData = new(new Guid(tag.MusicBrainzReleaseArtistId).ToByteArray())
|
||||||
|
};
|
||||||
id3v2.AddFrame(albumArtistFrame);
|
id3v2.AddFrame(albumArtistFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
var albumFrame = frames.FirstOrDefault(f => f.Owner == ZUNE_ALBUM_MEDIA_ID_NAME);
|
if (tag.MusicBrainzReleaseId != null)
|
||||||
if (albumFrame == null && tag.MusicBrainzReleaseId != null)
|
|
||||||
{
|
{
|
||||||
albumFrame = new TagLib.Id3v2.PrivateFrame(ZUNE_ALBUM_MEDIA_ID_NAME);
|
foreach (var oldAlbumFrame in frames.Where(f => f.Owner == ZUNE_ALBUM_MEDIA_ID_NAME).ToList())
|
||||||
albumFrame.PrivateData = new TagLib.ByteVector(
|
id3v2.RemoveFrame(oldAlbumFrame);
|
||||||
new Guid(tag.MusicBrainzReleaseId).ToByteArray());
|
|
||||||
|
TagLib.Id3v2.PrivateFrame albumFrame = new(ZUNE_ALBUM_MEDIA_ID_NAME)
|
||||||
|
{
|
||||||
|
PrivateData = new(new Guid(tag.MusicBrainzReleaseId).ToByteArray())
|
||||||
|
};
|
||||||
id3v2.AddFrame(albumFrame);
|
id3v2.AddFrame(albumFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
var trackFrame = frames.FirstOrDefault(f => f.Owner == ZUNE_MEDIA_ID_NAME);
|
if (tag.MusicBrainzTrackId != null)
|
||||||
if (trackFrame == null && tag.MusicBrainzTrackId != null)
|
|
||||||
{
|
{
|
||||||
trackFrame = new TagLib.Id3v2.PrivateFrame(ZUNE_MEDIA_ID_NAME);
|
foreach (var oldTrackFrame in frames.Where(f => f.Owner == ZUNE_MEDIA_ID_NAME).ToList())
|
||||||
trackFrame.PrivateData = new TagLib.ByteVector(
|
id3v2.RemoveFrame(oldTrackFrame);
|
||||||
new Guid(tag.MusicBrainzTrackId).ToByteArray());
|
|
||||||
|
TagLib.Id3v2.PrivateFrame trackFrame = new(ZUNE_MEDIA_ID_NAME)
|
||||||
|
{
|
||||||
|
PrivateData = new(new Guid(tag.MusicBrainzTrackId).ToByteArray())
|
||||||
|
};
|
||||||
id3v2.AddFrame(trackFrame);
|
id3v2.AddFrame(trackFrame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user