Thursday, December 20, 2007

ID3 tag reader

public class ID3Reader
{
public string FileName;
public string Title;
public string Artist;
public string Album;
public string Year;
public string Comment;
public int GenerID;
public string GenreName;
public int Track;

public bool hasTag;

private string[] genre = new string[] { "Blues","ClassicRock","Country","Dance","Disco","Funk","Grunge","HipHop","Jazz",
"Metal","NewAge","Oldies","Other","Pop","R&B","Rap","Reggae","Rock","Techno",
"Industrial","Alternative","Ska","DeathMetal","Pranks","Soundtrack","Euro-Techno",
"Ambient","TripHop","Vocal","Jazz-Funk","Fusion","Trance","Classical","Instrumental",
"Acid", "House", "Game", "SoundClip", "Gospel", "Noise", "Alt.Rock", "Bass", "Soul", "Punk",
"Space", "Meditative", "InstrumentalPop", "InstrumentalRock", "Ethnic", "Gothic", "Darkwave",
"Techno-Industrial", "Electronic", "Pop/Folk", "Eurodance", "Dream", "SouthernRock", "Comedy",
"Cult", "GangstaRap", "Top40", "ChristianRap", "Pop/Funk", "Jungle", "NativeAmerican", "Cabaret",
"NewWave", "Psychedelic", "Rave", "Showtunes", "Trailer", "Lo-fi", "Tribal", "AcidPunk",
"AcidJazz", "Polka", "Retro", "Musical", "Rock'n'Roll", "HardRock", "Folk", "Folk/Rock",
"NationalFolk","Swing", "FastFusion", "Bebob", "Latin", "Revival", "Celtic", "BlueGrass",
"AvantGarde", "GothicRock", "ProgressiveRock", "PsychedelicRock", "SymphonicRock",
"SlowRock", "BigBand", "Chorus", "EasyListening", "Acoustic", "Humour", "Speech", "Chanson",
"Opera", "ChamberMusic", "Sonata", "Symphony", "BootyBass", "Primus", "PornGroove", "Satire",
"SlowJam", "Club", "Tango", "Samba", "Folklore", "Ballad", "PowerBallad", "RhythmicSoul",
"Freestyle", "Duet", "PunkRock", "DrumSolo", "Euro-House", "DanceHall", "Goa", "Drum&Bass",
"Club-House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "PolskPunk", "Beat",
"ChristianGangstaRap", "HeavyMetal", "BlackMetal", "Crossover", "ContemporaryChristian",
"ChristianRock", "Merengue", "Salsa", "ThrashMetal","Anime","JPop","SynthPop" };

public ID3Reader()
{
hasTag = false;
FileName = string.Empty;
Title = string.Empty;
Artist = string.Empty;
Album = string.Empty;
Year = string.Empty;
Comment = string.Empty;
GenreName = string.Empty;
GenerID = 0;
Track = 0;
}

public ID3Reader(string fileName)
{
hasTag = false;
FileName = fileName;
Title = string.Empty;
Artist = string.Empty;
Album = string.Empty;
Year = string.Empty;
Comment = string.Empty;
GenreName = string.Empty;
GenerID = 0;
Track = 0;
}

public void Read()
{
// Read the 128 byte ID3 tag into a byte array
FileStream oFileStream;
oFileStream = new FileStream(this.FileName, FileMode.Open);
byte[] bBuffer = new byte[128];
oFileStream.Seek(-128, SeekOrigin.End);
oFileStream.Read(bBuffer, 0, 128);
oFileStream.Close();

// Convert the Byte Array to a String
Encoding instEncoding = new ASCIIEncoding(); // NB: Encoding is an Abstract class
string id3Tag = instEncoding.GetString(bBuffer);

// If there is an attched ID3 v1.x TAG then read it
if (id3Tag.Substring(0, 3) == "TAG")
{
this.Title = id3Tag.Substring(3, 30).Trim();
this.Artist = id3Tag.Substring(33, 30).Trim();
this.Album = id3Tag.Substring(63, 30).Trim();
this.Year = id3Tag.Substring(93, 4).Trim();
this.Comment = id3Tag.Substring(97, 28).Trim();

// Get the track number if TAG conforms to ID3 v1.1
if (id3Tag[125] == 0)
this.Track = bBuffer[126];
else
this.Track = 0;
this.GenerID = bBuffer[127];
this.GenreName = this.genre[GenerID];
this.hasTag = true;
// ********* IF USED IN ANGER: ENSURE to test for non-numeric year
}
else
{
this.hasTag = false;
}
}

}


now, how to use this class...

ID3Reader id3Reader = new ID3Reader(f.FullName);
try
{
id3Reader.Read();
}
catch (Exception ex)
{
}

//and use members to fetch data...
string title = id3Reader.Title;
string artist = id3Reader.Artist;
string album = id3Reader.Album;
string year = id3Reader.Year;
string comment = id3Reader.Comment;
int tracknumber = id3Reader.Track;
string genre = id3Reader.GenreName

No comments: