This release contains many design changes and code refactorings of the framework. In addition, some new features and bug fixes were also done.
There are several breaking features due to the design changes; please read the notes below for details.
- Added support for the following ID3 v2.3 frames:
- TIT1 :: Content group description
- TIT3 :: Subtitle/Description refinement
- TSSE :: Software/hardware and settings used for encoding
- Added code to recognize ID3 v2.2 and v2.4 tags. This means that even if your MP3 file is tagged with one of these versions, you can call the following methods on Mp3Stream and Mp3File:
- GetTag(int, int)
- HasTagOfVersion(int, int)
The GetAllTags and GetTag methods will return an Id3Tag instance with the version information set. However, no other data is available and any further actions on this tag will return in a NotSupportedException exception being thrown.
A new property - IsSupported - has been added to the Id3Tag class to indicate whether the tag is currently supported by the framework.
- Added new methods in Id3Tag to manipulate frames:
- Cleanup() - removes unassigned tags.
- Clear() - removes all frames
- Remove<TFrame>() - removes the frame of a specified type
- RemoveAll<TFrame>(Func<TFrame, bool>) - removes multiple frames that match a given condition
- The PictureFrame class two new methods - LoadImage(Stream) and SaveImage(Stream).
- Removed the version-specific tag classes (Id3v23Tag, Id3v1Tag, etc) and made the base Id3Tag class sealed. This is now the only class that represents an ID3 tag.
- The Id3Tag.Frames property has been made internal and the class itself implements IEnumerable<Id3Frame> now, so it can be used to traverse through all assigned frames in the tag.
- Changed all text encoding defaults to ISO-8859-1, instead of Unicode.
- Renamed the NumericTextFrame base class to NumericFrame and the DateTimeTextFrame base class to DateTimeFrame. There was no need to indicate that these were text-based frames, since that was an internal implementation detail.
- Changed the frame class hierarchy. Added new base classes to represent text-based frames - TextFrameBase and TextFrameBase<T>. TextFrame is now TextFrameBase<string>, NumericFrame is TextFrameBase<int?>, DateTimeFrame is TextFrameBase<DateTime?> and ListTextFrame is TextFrameBase<IList<string>>.
- As a result of the above change, the NumericFrame.AsInt, DateTimeFrame.AsDateTime and ListTextFrame.Values properties are now called Value.
- The Id3FrameList class is now internal and cannot be accessed from other projects.
- The Id3TagFamily enum members have been renamed to Version2x and Version1x from FileStartTag and FileEndTag respectively.
- The YearFrame class has been changed to derive from NumericFrame instead of DateTimeFrame to improve its usability.
- #23307 :: The track number frame did not comply with the ID3 v2.3 spec, which allowed an extended format of <track number>/<track count>. It only supported a single numeric value.
The fix was to derive it from TextFrameBase<int>, so that the Value property represented the track number, and added a new property called TrackCount that represented the number of tracks (an optional value).
- #23300 :: When extracting the text value of a DateTimeFrame to write to the ID3 tag, the text is not formatted using the DateTimeFormat property, resulting in a longer string value being written, and thereby corrupting the ID3 tag.