// Copyright (c) Arlo Godfrey. All Rights Reserved.
// Licensed under the GNU Lesser General Public License, Version 3.0 with additional terms.
// See the LICENSE, LICENSE.LESSER and LICENSE.ADDITIONAL files in the project root for more information.
namespace StrixMusic.Sdk.FileMetadata.Scanners
{
///
/// Miscellaneous helpers for TagLibSharp.
///
public static class TagLibHelper
{
private static bool _manualFileTypeResolversAdded;
///
/// Adds a manual file type resolver to TagLib. Prevents it from using reflection to resolve file types.
///
public static void TryAddManualFileTypeResolver()
{
if (_manualFileTypeResolversAdded)
return;
_manualFileTypeResolversAdded = true;
// Mirrors the [SupportedMimeType] attribute that TagLib puts on each type.
TagLib.File.AddFileTypeResolver((abstr, mimeType, readStyle) => mimeType switch
{
// Aac
"taglib/aac" => new TagLib.Aac.File(abstr, readStyle),
"audio/aac" => new TagLib.Aac.File(abstr, readStyle),
// Aiff
"taglib/aif" => new TagLib.Aiff.File(abstr, readStyle),
"taglib/aiff" => new TagLib.Aiff.File(abstr, readStyle),
"audio/x-aiff" => new TagLib.Aiff.File(abstr, readStyle),
"audio/aiff" => new TagLib.Aiff.File(abstr, readStyle),
"sound/aiff" => new TagLib.Aiff.File(abstr, readStyle),
"application/x-aiff" => new TagLib.Aiff.File(abstr, readStyle),
// Ape
"taglib/ape" => new TagLib.Ape.File(abstr, readStyle),
"audio/x-ape" => new TagLib.Ape.File(abstr, readStyle),
"audio/ape" => new TagLib.Ape.File(abstr, readStyle),
"application/x-ape" => new TagLib.Ape.File(abstr, readStyle),
// Asf
"taglib/wma" => new TagLib.Asf.File(abstr, readStyle),
"taglib/wmv" => new TagLib.Asf.File(abstr, readStyle),
"taglib/asf" => new TagLib.Asf.File(abstr, readStyle),
"audio/x-ms-wma" => new TagLib.Asf.File(abstr, readStyle),
"audio/x-ms-asf" => new TagLib.Asf.File(abstr, readStyle),
"video/x-ms-asf" => new TagLib.Asf.File(abstr, readStyle),
// Audible
"taglib/aa" => new TagLib.Audible.File(abstr, readStyle),
"taglib/aax" => new TagLib.Audible.File(abstr, readStyle),
"audio/x-audible" => new TagLib.Audible.File(abstr, readStyle),
// Dsf
"taglib/dsf" => new TagLib.Dsf.File(abstr, readStyle),
"audio/x-dsf" => new TagLib.Dsf.File(abstr, readStyle),
"audio/dsf" => new TagLib.Dsf.File(abstr, readStyle),
"sound/dsf" => new TagLib.Dsf.File(abstr, readStyle),
"application/x-dsf" => new TagLib.Dsf.File(abstr, readStyle),
// Flac
"taglib/flac" => new TagLib.Flac.File(abstr, readStyle),
"audio/x-flac" => new TagLib.Flac.File(abstr, readStyle),
"application/x-flac" => new TagLib.Flac.File(abstr, readStyle),
"audio/flac" => new TagLib.Flac.File(abstr, readStyle),
// gif
"taglib/gif" => new TagLib.Gif.File(abstr, readStyle),
"image/gif" => new TagLib.Gif.File(abstr, readStyle),
// Image.NoMetadata
"taglib/bmp" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-MS-bmp" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-bmp" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/ppm" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/pgm" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/pbm" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/pnm" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-portable-pixmap" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-portable-graymap" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-portable-bitmap" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-portable-anymap" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/pcx" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/svg" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/svgz" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/x-pcx" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"image/svg+xml" => new TagLib.Image.NoMetadata.File(abstr, readStyle),
"taglib/kdc" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/orf" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/srf" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/crw" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/mrw" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/raf" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
"taglib/x3f" => new TagLib.Image.NoMetadata.File(abstr, readStyle), // FIXME: Not supported yet!
// Jpeg
"image/jpeg" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jpg" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jpeg" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jpe" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jif" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jfif" => new TagLib.Jpeg.File(abstr, readStyle),
"taglib/jfi" => new TagLib.Jpeg.File(abstr, readStyle),
// Matroska
"taglib/mkv" => new TagLib.Matroska.File(abstr, readStyle),
"taglib/mka" => new TagLib.Matroska.File(abstr, readStyle),
"taglib/mks" => new TagLib.Matroska.File(abstr, readStyle),
"taglib/webm" => new TagLib.Matroska.File(abstr, readStyle),
"video/webm" => new TagLib.Matroska.File(abstr, readStyle),
"video/x-matroska" => new TagLib.Matroska.File(abstr, readStyle),
// MusePack
"taglib/mpc" => new TagLib.MusePack.File(abstr, readStyle),
"taglib/mp+" => new TagLib.MusePack.File(abstr, readStyle),
"taglib/mpp" => new TagLib.MusePack.File(abstr, readStyle),
"audio/x-musepack" => new TagLib.MusePack.File(abstr, readStyle),
// Mpeg
"taglib/mp3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/x-mp3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"application/x-id3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/mpeg" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/x-mpeg" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/x-mpeg-3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/mpeg3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/mp3" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"taglib/m2a" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"taglib/mp2" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"taglib/mp1" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/x-mp2" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"audio/x-mp1" => new TagLib.Mpeg.AudioFile(abstr, readStyle),
"taglib/mpg" => new TagLib.Mpeg.File(abstr, readStyle),
"taglib/mpeg" => new TagLib.Mpeg.File(abstr, readStyle),
"taglib/mpe" => new TagLib.Mpeg.File(abstr, readStyle),
"taglib/mpv2" => new TagLib.Mpeg.File(abstr, readStyle),
"taglib/m2v" => new TagLib.Mpeg.File(abstr, readStyle),
"video/x-mpg" => new TagLib.Mpeg.File(abstr, readStyle),
"video/mpeg" => new TagLib.Mpeg.File(abstr, readStyle),
// Mpeg4
"taglib/m4a" => new TagLib.Mpeg4.File(abstr, readStyle),
"taglib/m4b" => new TagLib.Mpeg4.File(abstr, readStyle),
"taglib/m4v" => new TagLib.Mpeg4.File(abstr, readStyle),
"taglib/m4p" => new TagLib.Mpeg4.File(abstr, readStyle),
"audio/mp4" => new TagLib.Mpeg4.File(abstr, readStyle),
"audio/x-m4a" => new TagLib.Mpeg4.File(abstr, readStyle),
"video/mp4" => new TagLib.Mpeg4.File(abstr, readStyle),
"video/x-m4v" => new TagLib.Mpeg4.File(abstr, readStyle),
// Ogg
"taglib/ogg" => new TagLib.Ogg.File(abstr, readStyle),
"taglib/oga" => new TagLib.Ogg.File(abstr, readStyle),
"taglib/ogv" => new TagLib.Ogg.File(abstr, readStyle),
"taglib/opus" => new TagLib.Ogg.File(abstr, readStyle),
"application/x-ogg" => new TagLib.Ogg.File(abstr, readStyle),
"audio/vorbis" => new TagLib.Ogg.File(abstr, readStyle),
"audio/x-vorbis" => new TagLib.Ogg.File(abstr, readStyle),
"audio/x-vorbis+ogg" => new TagLib.Ogg.File(abstr, readStyle),
"audio/ogg" => new TagLib.Ogg.File(abstr, readStyle),
"audio/x-ogg" => new TagLib.Ogg.File(abstr, readStyle),
"video/ogg" => new TagLib.Ogg.File(abstr, readStyle),
"video/x-ogm+ogg" => new TagLib.Ogg.File(abstr, readStyle),
"video/x-theora+ogg" => new TagLib.Ogg.File(abstr, readStyle),
"video/x-theora" => new TagLib.Ogg.File(abstr, readStyle),
"audio/opus" => new TagLib.Ogg.File(abstr, readStyle),
"audio/x-opus" => new TagLib.Ogg.File(abstr, readStyle),
"audio/x-opus+ogg" => new TagLib.Ogg.File(abstr, readStyle),
// Png
"taglib/png" => new TagLib.Png.File(abstr, readStyle),
"image/png" => new TagLib.Png.File(abstr, readStyle),
// Riff
"taglib/avi" => new TagLib.Riff.File(abstr, readStyle),
"taglib/wav" => new TagLib.Riff.File(abstr, readStyle),
"taglib / divx" => new TagLib.Riff.File(abstr, readStyle),
"video/avi" => new TagLib.Riff.File(abstr, readStyle),
"video/msvideo" => new TagLib.Riff.File(abstr, readStyle),
"video/x-msvideo" => new TagLib.Riff.File(abstr, readStyle),
"image/avi" => new TagLib.Riff.File(abstr, readStyle),
"application/x-troff-msvideo" => new TagLib.Riff.File(abstr, readStyle),
"audio/avi" => new TagLib.Riff.File(abstr, readStyle),
"audio/wav" => new TagLib.Riff.File(abstr, readStyle),
"audio/wave" => new TagLib.Riff.File(abstr, readStyle),
"audio/x-wav" => new TagLib.Riff.File(abstr, readStyle),
// Tiff.Arw
"taglib/arw" => new TagLib.Tiff.Arw.File(abstr, readStyle),
"image/arw" => new TagLib.Tiff.Arw.File(abstr, readStyle),
"image/x-sony-arw" => new TagLib.Tiff.Arw.File(abstr, readStyle),
// Tiff.Cr2
"taglib/cr2" => new TagLib.Tiff.Cr2.File(abstr, readStyle),
"image/cr2" => new TagLib.Tiff.Cr2.File(abstr, readStyle),
"image/x-cannon-cr2" => new TagLib.Tiff.Cr2.File(abstr, readStyle),
// Tiff.Dng
"taglib/dng" => new TagLib.Tiff.Dng.File(abstr, readStyle),
"image/dng" => new TagLib.Tiff.Dng.File(abstr, readStyle),
"image/x-adobe-dng" => new TagLib.Tiff.Dng.File(abstr, readStyle),
// Tiff.Nef
"taglib/nef" => new TagLib.Tiff.Nef.File(abstr, readStyle),
"image/nef" => new TagLib.Tiff.Nef.File(abstr, readStyle),
"image/x-nikon-nef" => new TagLib.Tiff.Nef.File(abstr, readStyle),
// Tiff.Pef
"taglib/pef" => new TagLib.Tiff.Pef.File(abstr, readStyle),
"image/pef" => new TagLib.Tiff.Pef.File(abstr, readStyle),
"image/x-pentax-pef" => new TagLib.Tiff.Pef.File(abstr, readStyle),
// Tiff.Rw2
"taglib/rw2" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
"image/rw2" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
"image/raw" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
"taglib/raw" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
"image/x-raw" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
"image/x-panasonic-raw" => new TagLib.Tiff.Rw2.File(abstr, readStyle),
// Tiff
"taglib/tiff" => new TagLib.Tiff.File(abstr, readStyle),
"image/tiff" => new TagLib.Tiff.File(abstr, readStyle),
// WavPack
"taglib/wv" => new TagLib.WavPack.File(abstr, readStyle),
"audio/x-wavpack" => new TagLib.WavPack.File(abstr, readStyle),
_ => throw new System.NotSupportedException($"{mimeType} not supported or mapped."),
});
}
}
}