* src/AudioFileIO.cs: Get the list of file readers using reflection, and keep a lookup table of mime types as well as extensions. * src/Util/CustomAttributes.cs, src/Makefile.am: New attribute classes to reflect supported extensions and supported mime-types. * src/Mpc/MpcFileReader.cs, src/M4a/M4aFileReader.cs, src/Mp3/Mp3FileReader.cs, src/Ape/MonkeyFileReader.cs, src/Flac/FlacFileReader.cs, src/Ogg/OggFileReader.cs: Add supported extensions and mime-type attributes. Index: src/Mpc/MpcFileReader.cs =================================================================== --- src/Mpc/MpcFileReader.cs (revision 48051) +++ src/Mpc/MpcFileReader.cs (working copy) @@ -36,6 +36,9 @@ using Entagged.Audioformats.Ape.Util; namespace Entagged.Audioformats.Mpc { + [SupportedExtension ("mpc")] + [SupportedExtension ("mp+")] + [SupportedMimeType ("entagged/mpc")] public class MpcFileReader : AudioFileReader { private MpcInfoReader ir = new MpcInfoReader(); Index: src/M4a/M4aFileReader.cs =================================================================== --- src/M4a/M4aFileReader.cs (revision 48051) +++ src/M4a/M4aFileReader.cs (working copy) @@ -33,6 +33,10 @@ namespace Entagged.Audioformats.M4a { + [SupportedExtension ("m4a")] + [SupportedExtension ("m4p")] + [SupportedMimeType ("audio/x-m4a")] + [SupportedMimeType ("entagged/m4a")] public class M4aFileReader : AudioFileReader { private M4aInfoReader ir = new M4aInfoReader(); Index: src/AudioFileIO.cs =================================================================== --- src/AudioFileIO.cs (revision 48051) +++ src/AudioFileIO.cs (working copy) @@ -39,40 +39,42 @@ * */ -using Entagged.Audioformats.Ape; using Entagged.Audioformats.Exceptions; -using Entagged.Audioformats.Flac; using Entagged.Audioformats.Util; -using Entagged.Audioformats.Mp3; -using Entagged.Audioformats.Mpc; -using Entagged.Audioformats.Ogg; -using Entagged.Audioformats.M4a; +using System.Reflection; using System.Collections; using System.IO; using System; namespace Entagged.Audioformats { public class AudioFileIO { - //These tables contains all the readers/writers associated with extension as a key - private static Hashtable readers = new Hashtable(); + //These tables contains all the readers writers associated with extensions/mimetypes + private static Hashtable extensions = new Hashtable(); + private static Hashtable mimetypes = new Hashtable(); - //Initialize the different readers/writers + //Initialize the different readers/writers using reflection static AudioFileIO() { - //Tag Readers - readers["mp3"] = new Mp3FileReader(); - readers["ogg"] = new OggFileReader(); - readers["flac"] = new FlacFileReader(); - readers["mpc"] = new MpcFileReader(); - readers["mp+"]= readers["mpc"]; - readers["ape"] = new MonkeyFileReader(); - readers["m4a"] = new M4aFileReader(); - readers["m4p"] = readers["m4a"]; + Assembly assembly = Assembly.GetExecutingAssembly(); + + foreach (Type type in assembly.GetTypes()) { + if (! type.IsSubclassOf(typeof(AudioFileReader))) + continue; + + AudioFileReader reader = (AudioFileReader) Activator.CreateInstance(type); + Attribute [] attrs = Attribute.GetCustomAttributes(type, typeof(SupportedExtension)); + foreach (SupportedExtension attr in attrs) + extensions.Add (attr.Extension, reader); + + attrs = Attribute.GetCustomAttributes (type, typeof(SupportedMimeType)); + foreach (SupportedMimeType attr in attrs) + mimetypes.Add (attr.MimeType, reader); + } } public static AudioFile Read(string f) { string ext = Utils.GetExtension(f); - object afr = readers[ext]; + object afr = extensions[ext]; if( afr == null) throw new CannotReadException("No Reader associated to this extension: "+ext); Index: src/Mp3/Mp3FileReader.cs =================================================================== --- src/Mp3/Mp3FileReader.cs (revision 48051) +++ src/Mp3/Mp3FileReader.cs (working copy) @@ -40,6 +40,9 @@ using Entagged.Audioformats.Mp3.Util; namespace Entagged.Audioformats.Mp3 { + [SupportedExtension ("mp3")] + [SupportedMimeType ("audio/x-mp3")] + [SupportedMimeType ("entagged/mp3")] public class Mp3FileReader : AudioFileReader { private Mp3InfoReader ir = new Mp3InfoReader(); Index: src/Ape/MonkeyFileReader.cs =================================================================== --- src/Ape/MonkeyFileReader.cs (revision 48051) +++ src/Ape/MonkeyFileReader.cs (working copy) @@ -35,6 +35,8 @@ using Entagged.Audioformats.Ape.Util; namespace Entagged.Audioformats.Ape { + [SupportedExtension ("ape")] + [SupportedMimeType ("entagged/ape")] public class MonkeyFileReader : AudioFileReader { private ApeTagReader ape = new ApeTagReader(); Index: src/Flac/FlacFileReader.cs =================================================================== --- src/Flac/FlacFileReader.cs (revision 48051) +++ src/Flac/FlacFileReader.cs (working copy) @@ -35,6 +35,9 @@ using Entagged.Audioformats.Util; namespace Entagged.Audioformats.Flac { + [SupportedExtension ("flac")] + [SupportedMimeType ("audio/x-flac")] + [SupportedMimeType ("entagged/flac")] public class FlacFileReader : AudioFileReader { private FlacInfoReader ir = new FlacInfoReader(); Index: src/Makefile.am =================================================================== --- src/Makefile.am (revision 48051) +++ src/Makefile.am (working copy) @@ -26,6 +26,7 @@ $(srcdir)/Flac/Util/MetadataBlockHeader.cs \ $(srcdir)/Util/AudioFileReader.cs \ $(srcdir)/Util/ByteBuffer.cs \ + $(srcdir)/Util/CustomAttributes.cs \ $(srcdir)/Util/TagField.cs \ $(srcdir)/Util/Utils.cs \ $(srcdir)/Mp3/Id3Tag.cs \ Index: src/Ogg/OggFileReader.cs =================================================================== --- src/Ogg/OggFileReader.cs (revision 48051) +++ src/Ogg/OggFileReader.cs (working copy) @@ -35,6 +35,9 @@ using Entagged.Audioformats.Ogg.Util; namespace Entagged.Audioformats.Ogg { + [SupportedExtension ("ogg")] + [SupportedMimeType ("application/ogg")] + [SupportedMimeType ("entagged/ogg")] public class OggFileReader : AudioFileReader { private OggInfoReader ir = new OggInfoReader();