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, }