Skip to content

Commit

Permalink
Track number is now a string internally, and can be accessed with Tra…
Browse files Browse the repository at this point in the history
…ck.TrackNumberStr
  • Loading branch information
Zeugma440 committed Feb 8, 2025
1 parent 16a475d commit 5ff849a
Show file tree
Hide file tree
Showing 21 changed files with 175 additions and 53 deletions.
51 changes: 51 additions & 0 deletions ATL.unit-test/IO/HighLevel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1373,6 +1373,57 @@ private int getMP4DateFieldLength(Stream s)
return StreamUtils.DecodeBEInt32(buffer);
}

[TestMethod]
public void TagIO_RW_Track_Number_Str_Num()
{
// Using VorbisTag as it allows storing track numbers as strings
var emptyFile = "OGG/empty.ogg";

// == 1- Add a numeric track number to an empty file
string testFileLocation = TestUtils.CopyAsTempTestFile(emptyFile);
Track theTrack = new Track(testFileLocation);

theTrack.TrackNumber = 2;
Assert.IsTrue(theTrack.Save());

theTrack = new Track(testFileLocation);
Assert.AreEqual(2, theTrack.TrackNumber);
Assert.AreEqual("2", theTrack.TrackNumberStr);

// Get rid of the working copy
if (Settings.DeleteAfterSuccess) File.Delete(testFileLocation);


// == 2- Add a string track number to an empty file
testFileLocation = TestUtils.CopyAsTempTestFile(emptyFile);
theTrack = new Track(testFileLocation);

theTrack.TrackNumberStr = "02";
Assert.IsTrue(theTrack.Save());

theTrack = new Track(testFileLocation);
Assert.AreEqual(2, theTrack.TrackNumber);
Assert.AreEqual("02", theTrack.TrackNumberStr);

// Get rid of the working copy
if (Settings.DeleteAfterSuccess) File.Delete(testFileLocation);


// == 3- Add an LP string track number to an empty file
testFileLocation = TestUtils.CopyAsTempTestFile(emptyFile);
theTrack = new Track(testFileLocation);

theTrack.TrackNumberStr = "A2";
Assert.IsTrue(theTrack.Save());

theTrack = new Track(testFileLocation);
Assert.AreEqual(2, theTrack.TrackNumber);
Assert.AreEqual("A2", theTrack.TrackNumberStr);

// Get rid of the working copy
if (Settings.DeleteAfterSuccess) File.Delete(testFileLocation);
}

[TestMethod]
public void TagIO_RW_WriteSpecificTagType()
{
Expand Down
2 changes: 1 addition & 1 deletion ATL.unit-test/IO/MetaData/ID3v1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public ID3v1()
testData.Comment = "Test!";
testData.Date = DateTime.Parse("01/01/2017");
testData.Genre = "Bluegrass";
testData.TrackNumber = 22;
testData.TrackNumber = "22";
}

[TestMethod]
Expand Down
6 changes: 3 additions & 3 deletions ATL.unit-test/IO/MetaData/ID3v2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void TagIO_R_ID3v22_simple()
Assert.AreEqual("I have no IDE and i must code", theFile.ID3v2.Comment);
Assert.AreEqual(1997, theFile.ID3v2.Date.Year);
Assert.AreEqual("House", theFile.ID3v2.Genre);
Assert.AreEqual(1, theFile.ID3v2.TrackNumber);
Assert.AreEqual("1", theFile.ID3v2.TrackNumber);
Assert.AreEqual(2, theFile.ID3v2.TrackTotal);
Assert.AreEqual("COMP!", theFile.ID3v2.Composer);
Assert.AreEqual(2, theFile.ID3v2.DiscNumber);
Expand Down Expand Up @@ -109,7 +109,7 @@ public void TagIO_R_ID3v22_UTF16()
Assert.AreEqual("I have no IDE and i must code bébé 父", theFile.ID3v2.Comment);
Assert.AreEqual(1997, theFile.ID3v2.Date.Year);
Assert.AreEqual("House", theFile.ID3v2.Genre);
Assert.AreEqual(1, theFile.ID3v2.TrackNumber);
Assert.AreEqual("1", theFile.ID3v2.TrackNumber);
Assert.AreEqual(2, theFile.ID3v2.TrackTotal);
Assert.AreEqual("COMP!", theFile.ID3v2.Composer);
Assert.AreEqual(2, theFile.ID3v2.DiscNumber);
Expand Down Expand Up @@ -1068,7 +1068,7 @@ public void TagIO_R_ID3v2_HugeTrackAlbumNum()

// Supported fields
Assert.AreEqual(0, theFile.ID3v2.DiscNumber);
Assert.AreEqual(0, theFile.ID3v2.TrackNumber);
Assert.AreEqual("90000A", theFile.ID3v2.TrackNumber);
}

[TestMethod]
Expand Down
2 changes: 1 addition & 1 deletion ATL.unit-test/IO/MetaData/MP4.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public MP4()
titleFieldCode = "©nam";

// MP4 does not support leading zeroes
testData.TrackNumber = 1;
testData.TrackNumber = "1";
testData.TrackTotal = 2;
testData.DiscNumber = 3;
testData.DiscTotal = 4;
Expand Down
8 changes: 4 additions & 4 deletions ATL.unit-test/IO/MetaData/MetaIOTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ protected MetaIOTest()
testData.Date = DateTime.Parse("1997-06-20T04:04:04");
testData.Genre = "House";
testData.Popularity = null;
testData.TrackNumber = 1;
testData.TrackNumber = "01";
testData.TrackTotal = 2;
testData.Composer = "ccᱬdd";
testData.Conductor = ""; // Empty string means "supported, but not valued in test sample"
Expand Down Expand Up @@ -429,7 +429,7 @@ public void test_RW_Empty(
if (testData.PublishingDate > DateTime.MinValue) theTag.PublishingDate = DateTime.Parse("2007/02/02");
if (testData.Genre != "") theTag.Genre = "Merengue";
if (testData.Popularity != 0) theTag.Popularity = 2.5f / 5;
if (testData.TrackNumber != 0) theTag.TrackNumber = 1;
if (testData.TrackNumber != null && testData.TrackNumber != "") theTag.TrackNumber = "1";
if (testData.TrackTotal != 0) theTag.TrackTotal = 2;
if (testData.DiscNumber != 0) theTag.DiscNumber = 3;
if (testData.DiscTotal != 0) theTag.DiscTotal = 4;
Expand Down Expand Up @@ -510,7 +510,7 @@ public void test_RW_Empty(
}
if (testData.Genre != "") Assert.AreEqual("Merengue", meta.Genre);
if (testData.Popularity != 0) Assert.AreEqual(2.5f / 5, meta.Popularity);
if (testData.TrackNumber != 0) Assert.AreEqual(1, meta.TrackNumber);
if (testData.TrackNumber != null && testData.TrackNumber != "") Assert.AreEqual("1", meta.TrackNumber);
if (testData.TrackTotal != 0) Assert.AreEqual(2, meta.TrackTotal);
if (testData.DiscNumber != 0) Assert.AreEqual(3, meta.DiscNumber);
if (testData.DiscTotal != 0) Assert.AreEqual(4, meta.DiscTotal);
Expand Down Expand Up @@ -856,7 +856,7 @@ protected void readExistingTagsOnFile(AudioDataManager theFile, int nbPictures =
if (testData.Genre != "") Assert.AreEqual(testData.Genre, meta.Genre);
if (testData.Composer != "") Assert.AreEqual(testData.Composer, meta.Composer);
if (testData.Popularity != 0) Assert.AreEqual(testData.Popularity, meta.Popularity);
if (testData.TrackNumber != 0) Assert.AreEqual(testData.TrackNumber, meta.TrackNumber);
if (testData.TrackNumber != null && testData.TrackNumber != "") Assert.AreEqual(testData.TrackNumber, meta.TrackNumber);
if (testData.TrackTotal != 0) Assert.AreEqual(testData.TrackTotal, meta.TrackTotal);
if (testData.DiscNumber != 0) Assert.AreEqual(testData.DiscNumber, meta.DiscNumber);
if (testData.DiscTotal != 0) Assert.AreEqual(testData.DiscTotal, meta.DiscTotal);
Expand Down
6 changes: 3 additions & 3 deletions ATL.unit-test/IO/MetaData/SPC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public void TagIO_RW_SPC_Empty()
theTag.Artist = "Artist";
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("01/01/2008");
theTag.TrackNumber = 1;
theTag.TrackNumber = "1";
theTag.TrackTotal = 1;
theTag.DiscNumber = 2;

Expand All @@ -94,7 +94,7 @@ public void TagIO_RW_SPC_Empty()
Assert.AreEqual("Artist", theFile.NativeTag.Artist);
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual(1, theFile.NativeTag.TrackNumber);
Assert.AreEqual("1", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.DiscNumber);

// Remove the tag and check that it has been indeed removed
Expand Down Expand Up @@ -267,7 +267,7 @@ private void readExistingTagsOnFile(AudioDataManager theFile, string publisherSt
Assert.AreEqual("Yasunori Mitsuda", theFile.NativeTag.Artist);
Assert.AreEqual("", theFile.NativeTag.Comment);
Assert.AreEqual(1995, theFile.NativeTag.Date.Year);
Assert.AreEqual(23, theFile.NativeTag.TrackNumber);
Assert.AreEqual("23", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.DiscNumber);
Assert.AreEqual(publisherStr, theFile.NativeTag.Publisher);

Expand Down
6 changes: 3 additions & 3 deletions ATL.unit-test/IO/MetaData/VQF.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public void TagIO_RW_VQF_Empty()
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("01/01/2008");
theTag.Genre = "FPS";
theTag.TrackNumber = 22;
theTag.TrackNumber = "22";
theTag.TrackTotal = 23;

// Add the new tag and check that it has been indeed added with all the correct information
Expand All @@ -99,7 +99,7 @@ public void TagIO_RW_VQF_Empty()
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual("FPS", theFile.NativeTag.Genre);
Assert.AreEqual(22, theFile.NativeTag.TrackNumber);
Assert.AreEqual("22", theFile.NativeTag.TrackNumber);


// Setting a standard field using additional fields shouldn't be possible
Expand Down Expand Up @@ -277,7 +277,7 @@ private void readExistingTagsOnFile(AudioDataManager theFile, string testCopyrig
Assert.AreEqual("Rock", theFile.NativeTag.Genre);
Assert.AreEqual("this is a comment", theFile.NativeTag.Comment);
Assert.AreEqual(2016, theFile.NativeTag.Date.Year);
Assert.AreEqual(22, theFile.NativeTag.TrackNumber);
Assert.AreEqual("22", theFile.NativeTag.TrackNumber);
Assert.AreEqual(testCopyright, theFile.NativeTag.Copyright);

// Unsupported field (GERR)
Expand Down
4 changes: 2 additions & 2 deletions ATL.unit-test/IO/MetaData/Vorbis_FLAC.cs
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ public void TagIO_RW_VorbisFLAC_Empty()
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("2008/01/01");
theTag.Genre = "Merengue";
theTag.TrackNumber = 1;
theTag.TrackNumber = "1";
theTag.TrackTotal = 1;
theTag.DiscNumber = 2;
theTag.Popularity = 2.5f / 5;
Expand All @@ -220,7 +220,7 @@ public void TagIO_RW_VorbisFLAC_Empty()
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual("Merengue", theFile.NativeTag.Genre);
Assert.AreEqual(1, theFile.NativeTag.TrackNumber);
Assert.AreEqual("1", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.DiscNumber);
Assert.AreEqual((float)(2.5 / 5), theFile.NativeTag.Popularity);
Assert.AreEqual("Me", theFile.NativeTag.Composer);
Expand Down
4 changes: 2 additions & 2 deletions ATL.unit-test/IO/MetaData/Vorbis_OGG.cs
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ public void TagIO_RW_VorbisOGG_Empty(Stream stream)
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("2008/01/01"); // <-- TODO : this field is _not_ valued when passing through Track + beware of alternate formattings depending on the format
theTag.Genre = "Merengue";
theTag.TrackNumber = 1;
theTag.TrackNumber = "1";
theTag.TrackTotal = 2;
theTag.DiscNumber = 3;
theTag.DiscTotal = 4;
Expand All @@ -299,7 +299,7 @@ public void TagIO_RW_VorbisOGG_Empty(Stream stream)
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual("Merengue", theFile.NativeTag.Genre);
Assert.AreEqual(1, theFile.NativeTag.TrackNumber);
Assert.AreEqual("1", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.TrackTotal);
Assert.AreEqual(3, theFile.NativeTag.DiscNumber);
Assert.AreEqual(4, theFile.NativeTag.DiscTotal);
Expand Down
2 changes: 1 addition & 1 deletion ATL.unit-test/IO/MetaData/WAV.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private void initListInfoTestData()
Genre = "info.IGNR",
Comment = "info.ICMT",
Date = DateTime.Parse("2018-01-09T01:23:45"),
TrackNumber = 5,
TrackNumber = "5",
Popularity = 0.2f,
EncodedBy = "info.ITCH",
Encoder = "info.ISFT",
Expand Down
8 changes: 4 additions & 4 deletions ATL.unit-test/IO/MetaData/WMA.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public void TagIO_RW_WMA_Empty()
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("2008/01/01");
theTag.Genre = "Merengue";
theTag.TrackNumber = 1;
theTag.TrackNumber = "1";
theTag.TrackTotal = 1;
theTag.DiscNumber = 2;
theTag.Composer = "Me";
Expand All @@ -130,7 +130,7 @@ public void TagIO_RW_WMA_Empty()
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual("Merengue", theFile.NativeTag.Genre);
Assert.AreEqual(1, theFile.NativeTag.TrackNumber);
Assert.AreEqual("1", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.DiscNumber);
Assert.AreEqual((float)(2.0 / 5), theFile.NativeTag.Popularity);
Assert.AreEqual("Me", theFile.NativeTag.Composer);
Expand Down Expand Up @@ -213,7 +213,7 @@ public void TagIO_RW_WMA_Empty_NonWM()
theTag.Comment = "This is a test";
theTag.Date = DateTime.Parse("2008/01/01");
theTag.Genre = "Merengue";
theTag.TrackNumber = 1;
theTag.TrackNumber = "1";
theTag.TrackTotal = 1;
theTag.DiscNumber = 2;
theTag.Composer = "Me";
Expand All @@ -236,7 +236,7 @@ public void TagIO_RW_WMA_Empty_NonWM()
Assert.AreEqual("This is a test", theFile.NativeTag.Comment);
Assert.AreEqual(2008, theFile.NativeTag.Date.Year);
Assert.AreEqual("Merengue", theFile.NativeTag.Genre);
Assert.AreEqual(1, theFile.NativeTag.TrackNumber);
Assert.AreEqual("1", theFile.NativeTag.TrackNumber);
Assert.AreEqual(2, theFile.NativeTag.DiscNumber);
Assert.AreEqual("Me", theFile.NativeTag.Composer);
Assert.AreEqual("父", theFile.NativeTag.Copyright);
Expand Down
29 changes: 29 additions & 0 deletions ATL.unit-test/Misc/TrackUtilsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,35 @@ public void TrackUtils_ExtractTrackNumber()
Assert.AreEqual(0, TrackUtils.ExtractTrackNumber("99999999"));
}

[TestMethod]
public void TrackUtils_ExtractTrackNumberStr()
{
Assert.AreEqual("1", TrackUtils.ExtractTrackNumberStr("1"));
Assert.AreEqual("01", TrackUtils.ExtractTrackNumberStr("01"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr("15"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr(" 15"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr(" 15 "));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr("15 "));
Assert.AreEqual("15.1", TrackUtils.ExtractTrackNumberStr("15.1"));
Assert.AreEqual("15,1", TrackUtils.ExtractTrackNumberStr("15,1"));
Assert.AreEqual("a15a", TrackUtils.ExtractTrackNumberStr("a15a"));

Assert.AreEqual("1", TrackUtils.ExtractTrackNumberStr("1/16"));
Assert.AreEqual("01", TrackUtils.ExtractTrackNumberStr("01/16"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr("15/16"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr(" 15 / 16"));
Assert.AreEqual("15", TrackUtils.ExtractTrackNumberStr(" 15//16"));

Assert.AreEqual("A1", TrackUtils.ExtractTrackNumberStr(" A1"));
Assert.AreEqual("A1", TrackUtils.ExtractTrackNumberStr("A1"));
Assert.AreEqual("A1", TrackUtils.ExtractTrackNumberStr(" A1 "));
Assert.AreEqual("aaa", TrackUtils.ExtractTrackNumberStr("aaa"));

Assert.AreEqual("", TrackUtils.ExtractTrackNumberStr(""));
Assert.AreEqual("", TrackUtils.ExtractTrackNumberStr(null));
Assert.AreEqual("99999999", TrackUtils.ExtractTrackNumberStr("99999999"));
}

[TestMethod]
public void TrackUtils_ExtractTrackTotal()
{
Expand Down
3 changes: 2 additions & 1 deletion ATL/AudioData/AudioFileIO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Threading.Tasks;
using static ATL.AudioData.MetaDataIOFactory;
using static ATL.LyricsInfo;
using Commons;

namespace ATL.AudioData
{
Expand Down Expand Up @@ -90,7 +91,7 @@ private IMetaDataIO getAndCheckMetadata()
LogDelegator.GetLogDelegate()(Log.LV_WARNING, "Could not find any metadata");

// Consistency checks
if (result.TrackTotal > 0 && result.TrackNumber > result.TrackTotal)
if (result.TrackTotal > 0 && Utils.IsNumeric(result.TrackNumber) && Utils.ParseFirstIntegerPart(result.TrackNumber) > result.TrackTotal)
LogDelegator.GetLogDelegate()(Log.LV_INFO, "Track number (" + result.TrackNumber + ") is > total tracks (" + result.TrackTotal + ")");

if (result.DiscTotal > 0 && result.DiscNumber > result.DiscTotal)
Expand Down
10 changes: 5 additions & 5 deletions ATL/AudioData/CrossMetadataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -133,17 +133,17 @@ public string Genre
}
}
/// <inheritdoc/>
public ushort TrackNumber
public string TrackNumber
{
get
{
ushort track = 0;
string value = "";
foreach (IMetaDataIO reader in metaReaders)
{
track = reader.TrackNumber;
if (track != 0) break;
value = reader.TrackNumber;
if (value != null && value != "") break;
}
return track;
return value;
}
}
/// <inheritdoc/>
Expand Down
5 changes: 2 additions & 3 deletions ATL/AudioData/IO/Helpers/ListTag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ public static bool IsDataEligible(MetaDataHolder meta)
if (meta.Genre.Length > 0) return true;
if (meta.Date > DateTime.MinValue) return true;
if (meta.Copyright.Length > 0) return true;
if (meta.TrackNumber > 0) return true;
if (meta.Popularity > 0) return true;
if (meta.EncodedBy.Length > 0) return true;
if (meta.Encoder.Length > 0) return true;
Expand Down Expand Up @@ -210,9 +209,9 @@ private static void writeInfoPurpose(BinaryWriter w, MetaDataHolder meta, MetaDa
if (value.Length > 0) writeSizeAndNullTerminatedString("IRTD", value, w, writtenFields);
}
// Track number
if (meta.TrackNumber > 0)
if (meta.TrackNumber != null && meta.TrackNumber != "")
{
value = meta.TrackNumber.ToString();
value = meta.TrackNumber;
if (0 == value.Length && additionalFields.TryGetValue("info.TRCK", out var additionalField3)) value = additionalField3;
if (0 == value.Length && additionalFields.TryGetValue("info.IPRT", out var field4)) value = field4;
if (0 == value.Length && additionalFields.TryGetValue("info.ITRK", out var additionalField4)) value = additionalField4;
Expand Down
2 changes: 1 addition & 1 deletion ATL/AudioData/IO/ID3v1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ protected override int write(TagData tag, Stream s, string zone)

// ID3v1.1 standard
s.WriteByte(0);
s.WriteByte((byte)Math.Min(TrackUtils.ExtractTrackNumber(tag[Field.TRACK_NUMBER]), Byte.MaxValue));
s.WriteByte((byte)Math.Min(TrackUtils.ExtractTrackNumber(tag[Field.TRACK_NUMBER]), byte.MaxValue));

byte genre = byte.MaxValue;
if (tag[Field.GENRE] != null)
Expand Down
4 changes: 3 additions & 1 deletion ATL/AudioData/Interfaces/IMetaData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,10 @@ string Genre
}
/// <summary>
/// Track number
/// NB1 : Stored in string for to alow storing LP tracks (e.g. A1, A2...)
/// NB2 : Does not include total notation (e.g. 01/12); only the track number itself
/// </summary>
ushort TrackNumber
string TrackNumber
{
get;
}
Expand Down
Loading

0 comments on commit 5ff849a

Please sign in to comment.