I've been reorganizing my media library using the very cool MusicBrainz Picard, but of course all my m3u files broke. So I wrote the free M3U.NET library, and then wrote a utility called FixM3U that regenerates an M3U file by searching your music folder for the media files based on whatever extended M3U information is available:
> FixM3u.exe /order:title,artist foo.m3u bar.m3u ...
The M3U.NET library itself has a fairly simple interface:
// Parsing M3U files.
public static class M3u
{
// Write a media list to an extended M3U file.
public static string Write(IEnumerable<MediaFile> media);
// Parse an M3U file.
public static IEnumerable<MediaFile> Parse(
string input,
DirectiveOrder order);
// Parse an M3U file.
public static IEnumerable<MediaFile> Parse(
IEnumerable<string> lines,
DirectiveOrder order);
}
The 3 exported types are straightforward. A MediaFile just has a full path to the file itself and a list of directives supported by the extended M3U format:
// A media file description.
public sealed class MediaFile
{
// The full absolute path to the file.
public string Path { get; set; }
// Extended M3U directives.
public List<MediaDirective> Directives { get; set; }
}
The directives are represented in this library as key-value pairs:
// An extended M3U directive.
public struct MediaDirective
{
// The directive name.
public string Name { get; set; }
// The directive value.
public string Value { get; set; }
// The separator delineating this field from the next.
public char? Separator { get; set; }
}
The currently supported keys are "Artist", "Title" and "Length".
The M3U format is supposed to order directives as "length, artist - title", but iTunes seems to reverse the order of artist and title. I've thus made this configurable via a parsing parameter of type DirectiveOrder, and you can specify the ordering when parsing:
// The order of the title and artist directives.
public enum DirectiveOrder
{
// Artist followed by title.
ArtistTitle,
// Title followed by artist.
TitleArtist,
}
Comments