Sylloge
A C# helper library
code/Audio/Metadata/ID3/ID3Helper.cs
Go to the documentation of this file.
00001 using System;
00002 using System.Collections.Generic;
00003 using System.Linq;
00004 using System.Text;
00005 
00006 namespace Sylloge.Audio.Metadata.ID3
00007 {
00011     public static class Helper
00012     {
00013         private static System.Text.Encoding m_iso;
00014         private static System.Text.Encoding m_utf16;
00015         private static System.Text.Encoding m_utf16be;
00016         private static System.Text.Encoding m_utf8;
00017 
00018         static Helper()
00019         {
00020             Helper.m_iso = System.Text.Encoding.GetEncoding(28591); // 28591 - iso-8859-1 - Western European (ISO)
00021             Helper.m_utf16 = new UnicodeEncoding(false, true); // little-endian
00022             Helper.m_utf16be = new UnicodeEncoding(true, false);
00023             Helper.m_utf8 = System.Text.Encoding.GetEncoding(65001); // 65001 - utf-8 - Unicode (UTF-8)
00024         }
00025 
00029         public static System.Text.Encoding ISO { get { return Helper.m_iso; } }
00033         public static System.Text.Encoding UTF16 { get { return Helper.m_utf16; } }
00037         public static System.Text.Encoding UTF16BE { get { return Helper.m_utf16be; } }
00041         public static System.Text.Encoding UTF8 { get { return Helper.m_utf8; } }
00042 
00048         public static bool CheckPictureType(byte pbyte)
00049         {
00050             Array ptypes = Enum.GetValues(typeof(ID3.Picture));
00051             return pbyte <= (byte)ptypes.GetValue(ptypes.Length - 1);
00052         }
00053 
00064         public static System.Text.Encoding GetEncoding(byte ebyte)
00065         {
00066             switch (ebyte) {
00067                 case 0x00: return Helper.ISO;
00068                 case 0x01: return Helper.UTF16;
00069                 case 0x02: return Helper.UTF16BE;
00070                 case 0x03: return Helper.UTF8;
00071                 default: break;
00072             }
00073             return ID3.Helper.ISO;
00074         }
00075 
00081         public static string EnumToString(ID3.Picture type)
00082         {
00083             switch (type) {
00084                 case Picture.FileIcon:
00085                     return "32x32 pixels 'file icon' (PNG only)";
00086                 case Picture.OtherFileIcon:
00087                     return "Other file icon";
00088                 case Picture.Cover_Front:
00089                     return "Cover (front)";
00090                 case Picture.Cover_Back:
00091                     return "Cover (back)";
00092                 case Picture.Leaflet_Page:
00093                     return "Leaflet page";
00094                 case Picture.Media:
00095                     return "Media (e.g. lable side of CD)";
00096                 case Picture.Lead_Artist:
00097                     return "Lead artist/lead performer/soloist";
00098                 case Picture.Artist_Performer:
00099                     return "Artist/performer";
00100                 case Picture.Band_Orchestra:
00101                     return "Band/Orchestra";
00102                 case Picture.Lyricist:
00103                     return "Lyricist/text writer";
00104                 case Picture.Recording_Location:
00105                     return "Recording Location";
00106                 case Picture.During_Recording:
00107                     return "During recording";
00108                 case Picture.During_Performance:
00109                     return "During performance";
00110                 case Picture.Movie_Screen_Capture:
00111                     return "Movie/video screen capture";
00112                 case Picture.A_Bright_Coloured_Fish:
00113                     return "A bright coloured fish"; // Seriously ... this is in the ID3v2 spec??!??
00114                 case Picture.Band_Logotype:
00115                     return "Band/artist logotype";
00116                 case Picture.Publisher_Logotype:
00117                     return "Publisher/Studio logotype";
00118                 default: break;
00119             }
00120             return Enum.GetName(typeof(Picture), type);
00121         }
00122 
00128         public static string EnumToString(ID3.Genre value)
00129         {
00130             // Becuase the built in Enum.GetName will return a literal string representation
00131             // of the enum name (i.e. RAndB instead of R&B), we need to convert the ones with
00132             // spaces and special characters in the name to make them user friendly readable
00133             switch (value) {
00134                 case Genre.Classic_Rock:
00135                     return "Classic Rock";
00136                 case Genre.Hip_Hop:
00137                     return "Hip-Hop";
00138                 case Genre.New_Age:
00139                     return "New Age";
00140                 case Genre.RAndB:
00141                     return "R&B";
00142                 case Genre.Death_Metal:
00143                     return "Death Metal";
00144                 case Genre.Euro_Techno:
00145                     return "Euro-Techno";
00146                 case Genre.Trip_Hop:
00147                     return "Trip-Hop";
00148                 case Genre.Jazz_Funk:
00149                     return "Jazz+Funk";
00150                 case Genre.Sound_Clip:
00151                     return "Sound Clip";
00152                 case Genre.Instrumental_Pop:
00153                     return "Instrumental Pop";
00154                 case Genre.Instrumental_Rock:
00155                     return "Instrumental Rock";
00156                 case Genre.Techno_Industrial:
00157                     return "Techno-Industrial";
00158                 case Genre.Pop_Folk:
00159                     return "Pop-Folk";
00160                 case Genre.Southern_Rock:
00161                     return "Southern Rock";
00162                 case Genre.Top_40:
00163                     return "Top 40";
00164                 case Genre.Christian_Rap:
00165                     return "Christian Rap";
00166                 case Genre.Pop_Funk:
00167                     return "Pop/Funk";
00168                 case Genre.Native_American:
00169                     return "Native American";
00170                 case Genre.New_Wave:
00171                     return "New Wave";
00172                 case Genre.Lo_Fi:
00173                     return "Lo-Fi";
00174                 case Genre.Acid_Punk:
00175                     return "Acid Punk";
00176                 case Genre.Acid_Jazz:
00177                     return "Acid Jazz";
00178                 case Genre.Rock_And_Roll:
00179                     return "Rock & Roll";
00180                 case Genre.Hard_Rock:
00181                     return "Hard Rock";
00182                 case Genre.Folk_Rock:
00183                     return "Folk-Rock";
00184                 case Genre.National_Folk:
00185                     return "National Folk";
00186                 case Genre.Fast_Fusion:
00187                     return "Fast Fusion";
00188                 case Genre.Gothic_Rock:
00189                     return "Gothic Rock";
00190                 case Genre.Progressive_Rock:
00191                     return "Progressive Rock";
00192                 case Genre.Psychedelic_Rock:
00193                     return "Psychedelic Rock";
00194                 case Genre.Symphonic_Rock:
00195                     return "Symphonic Rock";
00196                 case Genre.Slow_Rock:
00197                     return "Slow Rock";
00198                 case Genre.Big_Band:
00199                     return "Big Band";
00200                 case Genre.Easy_Listening:
00201                     return "Easy Listening";
00202                 case Genre.Chamber_Music:
00203                     return "Chamber Music";
00204                 case Genre.Booty_Bass:
00205                     return "Booty Bass";
00206                 case Genre.Porn_Groove:
00207                     return "Porn Groove";
00208                 case Genre.Slow_Jam:
00209                     return "Slow Jam";
00210                 case Genre.Power_Ballad:
00211                     return "Power Ballad";
00212                 case Genre.Rhythmic_Soul:
00213                     return "Rhythmic Soul";
00214                 case Genre.Punk_Rock:
00215                     return "Punk Rock";
00216                 case Genre.Drum_Solo:
00217                     return "Drum Solo";
00218                 case Genre.A_capella:
00219                     return "A capella";
00220                 case Genre.Euro_House:
00221                     return "Euro-House";
00222                 case Genre.Dance_Hall:
00223                     return "Dance Hall";
00224                 case Genre.Goa_Trance:
00225                     return "Goa Trance";
00226                 case Genre.Drum_Bass:
00227                     return "Drum & Bass";
00228                 case Genre.Club_House:
00229                     return "Club-House";
00230                 case Genre.Hardcore_Techno:
00231                     return "Hardcore Techno";
00232                 case Genre.Afro_punk:
00233                     return "Afro-punk";
00234                 case Genre.Polsk_Punk:
00235                     return "Polsk Punk";
00236                 case Genre.Christian_Gangsta_Rap:
00237                     return "Christian Gangsta Rap";
00238                 case Genre.Heavy_Metal:
00239                     return "Heavy Metal";
00240                 case Genre.Black_Metal:
00241                     return "Black Metal";
00242                 case Genre.Contemporary_Christian:
00243                     return "Contemporary Christian";
00244                 case Genre.Christian_Rock:
00245                     return "Christian Rock";
00246                 case Genre.Thrash_Metal:
00247                     return "Thrash Metal";
00248                 case Genre.Art_Rock:
00249                     return "Art Rock";
00250                 case Genre.Big_Beat:
00251                     return "Big Beat";
00252                 case Genre.Industro_Goth:
00253                     return "Industro-Goth";
00254                 case Genre.Jam_Band:
00255                     return "Jam Band";
00256                 case Genre.Math_Rock:
00257                     return "Math Rock";
00258                 case Genre.New_Romantic:
00259                     return "New Romantic";
00260                 case Genre.Nu_Breakz:
00261                     return "Nu-Breakz";
00262                 case Genre.Post_Punk:
00263                     return "Post-Punk";
00264                 case Genre.Post_Rock:
00265                     return "Post-Rock";
00266                 case Genre.Space_Rock:
00267                     return "Space Rock";
00268                 case Genre.Trop_Rock:
00269                     return "Trop Rock";
00270                 case Genre.World_Music:
00271                     return "World Music";
00272                 case Genre.Audio_Theatre:
00273                     return "Audio Theatre";
00274                 case Genre.Neue_Deutsche_Welle:
00275                     return "Neue Deutsche Welle";
00276                 case Genre.Indie_Rock:
00277                     return "Indie Rock";
00278                 case Genre.G_Funk:
00279                     return "G-Funk";
00280                 case Genre.Garage_Rock:
00281                     return "Garage Rock";
00282                 default: break;
00283             }
00284             return Enum.GetName(typeof(Genre), value);
00285         }
00286 
00292         public static Sylloge.Audio.Metadata.ID3.Genre ParseGenre(string type)
00293         {
00294             if (type == null) { throw new ArgumentNullException("type"); }
00295             string f = type.ToLower();
00296             int c = Enum.GetValues(typeof(ID3.Genre)).Length;
00297             for (int i = 0; i < c; i++) {
00298                 if (f == Helper.EnumToString((ID3.Genre)i).ToLower()) {
00299                     return ((ID3.Genre)i);
00300                 }
00301             }
00302             return Genre.Other;
00303         }
00304 
00310         public static int ToSynchsafeInt(int ival)
00311         {
00312             int ret = 0;
00313             int mask = 0x7F;
00314             while ((mask ^ 0x7FFFFFFF) > 0) {
00315                 ret = ival & ~mask;
00316                 ret <<= 1;
00317                 ret |= ival & mask;
00318                 mask = ((mask + 1) << 8) - 1;
00319                 ival = ret;
00320             }
00321             return ret;
00322         }
00323 
00329         public static int FromSynchsafeInt(int syncint)
00330         {
00331             int ret = 0;
00332             int mask = 0x7F000000;
00333             while (mask > 0) {
00334                 ret >>= 1;
00335                 ret |= syncint & mask;
00336                 mask >>= 8;
00337             }
00338             return ret;
00339         }
00340     }
00341 }
 All Classes Namespaces Files Functions Variables Enumerations Properties Events