Hallo Martin,
Wie vor einigen Tagen versprochen poste ich hier ein kurzes Beispiel zum
Auslesen der ID3v1-Tags aus MP3-Dateien.
No warranty! ;-)
Gru�,
Bj�rn Waide
/************************************************
* MP3FileInfo
*
* Diese Demo-Konsolen-Applikation liest alle im
* �bergebenen Pfad enthaltenen MP3-Dateien ein
* und gibt die Namen plus evtl. vorhandener
* ID3v1-Infos aus.
*
* Autor: Bj�rn Waide ([EMAIL PROTECTED])
* Erstellt: 02/2002
*
************************************************/
using System;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
namespace MP3
{
/// <summary>
/// Dient nur als Datenstrukur f�r die ID3v1-Informationen.
/// </summary>
public class ID3v1Info
{
public String Title;
public String Artist;
public String Album;
public int Year;
public String Comment;
public byte Genre;
public byte Track;
}//end ID3v1Info
public class MP3FileInfo
{
/// <summary>
/// Liest alle im Pfad enthaltenen Dateien, die dem
Suchmuster entsprechen,
/// ein und gibt Dateiname plus evtl. vorhandener
ID3v1-Tags auf der Konsole
/// aus.
/// </summary>
/// <param name="path">Absoluter Pfad des einzulesenden
Verzeichnisses.</param>
/// <param name="search">Suchpattern f�r die
Dateinamen.</param>
public static void ShowFiles(String path, String search)
{
try
{
string[] allFiles =
Directory.GetFiles(path, search);
for (int i=0; i<allFiles.Length; i++)
{
FileInfo info = new
FileInfo(allFiles[i]);
ID3v1Info id3Info =
ReadID3v1Info(info);
Console.WriteLine("\nName : "
+ info.Name);
if (id3Info != null)
{
Console.WriteLine("Album
: " + id3Info.Album);
Console.WriteLine("Artist : " + id3Info.Artist);
Console.WriteLine("Comment : " + id3Info.Comment);
Console.WriteLine("Genre
: " + id3Info.Genre);
Console.WriteLine("Title
: " + id3Info.Title);
Console.WriteLine("Track
: " + id3Info.Track);
Console.WriteLine("Year
: " + id3Info.Year);
}//if
}//for
}
catch (Exception e)
{
throw e;
}//try/catch
}//ShowFiles
/// <summary>
/// Besorgt die ID3v1 Informationen aus der mp3-Datei
/// und speichert sie in dem Struct ID3v1Info
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static ID3v1Info ReadID3v1Info(FileInfo file)
{
Stream s = file.OpenRead();
//bei 0 Byte Dateien
if (s.Length < 128)
{
return null;
}//end if
// Now read in s into a byte buffer.
byte[] bytes = new byte[128];
s.Seek(-128, SeekOrigin.End);
int numBytesToRead = 128;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to
numBytesToRead.
int n = s.Read(bytes, numBytesRead,
numBytesToRead);
if (n==0) // We're at EOF
break;
numBytesRead += n;
numBytesToRead -= n;
}//end while
s.Close();
//hat file �berhaupt ein ID3v1 Abschnitt?
//Dieser mu� mit "TAG" beginnen
String tag = ConvertByteToString(bytes, 0, 2);
if (tag != "TAG")
{
return null;
}
ID3v1Info TagInfo = new ID3v1Info();
TagInfo.Title = ConvertByteToString(bytes, 3,
32);
TagInfo.Artist = ConvertByteToString(bytes, 33,
62);
TagInfo.Album = ConvertByteToString(bytes, 63,
92);
try
{
TagInfo.Year =
Int32.Parse(ConvertByteToString(bytes, 93, 96));
}
catch (FormatException)
{
TagInfo.Year = 0;
}//end try/catch
byte flag = bytes[125];
if (flag == 0)
{
TagInfo.Comment =
ConvertByteToString(bytes, 97, 124);
TagInfo.Track = bytes[126];
}
else
{
TagInfo.Comment =
ConvertByteToString(bytes, 97, 126);
TagInfo.Track = 0;
}//end if flag
TagInfo.Genre = bytes[127];
return TagInfo;
}//end ReadID3v1Info
/// <summary>
/// Gibt ein �bergebenes Byte-Array als String zur�ck.
/// Dabei wird nur der Ausschnitt von pos1 bis pos2
ber�cksichtigt
/// </summary>
/// <param name="bytes">Zu konvertierendes
Byte-Array</param>
/// <param name="pos1">Position, ab der konvertiert
werden soll.</param>
/// <param name="pos2">Position, bis zu der konvertiert
werden soll.</param>
/// <returns></returns>
public static String ConvertByteToString(byte[] bytes,
int pos1, int pos2)
{
//pos2 mu� gr��er oder gleich pos1 sein und
//pos2 darf L�nge des Arrays nicht �berschreiten
if ((pos1 > pos2) || (pos2 > bytes.Length - 1))
{
throw new ArgumentException("Aruments
out of range");
}
//L�nge des zu betrachtenden Ausschnittes
int length = pos2 - pos1 + 1;
//neues Char-Array anlegen der L�nge length
Char[] chars = new Char[length];
//packe alle Byte von pos1 bis pos2 als
//Char konvertiert in Array chars
for (int i=0; i<length; i++)
{
chars[i] =
Convert.ToChar(bytes[i+pos1]);
}//end for
//konvertiere Char-Array in String und gebe es
zur�ck
return new String(chars);
}//end ConvertByteToString
/// <summary>
/// Einstiegs-Methode. Als Parameter werden der
einzulesende Pfadname
/// und optional ein Suchpattern der Form "*.mp3"
erwartet.
/// </summary>
[STAThread]
static public void Main(string[] args)
{
String search = "*.mp3";
if (args.Length < 1)
{
Console.WriteLine("Angabe eines
Pfadnamens erforderlich!");
return;
}
else
{
if (args.Length >= 2)
{
search = args[1];
}//if
}//if
try
{
ShowFiles(args[0], search);
}
catch (ArgumentException e)
{
Console.WriteLine("Error: " +
e.Message);
}
catch (Exception e)
{
Console.WriteLine("Error: " +
e.Message);
}//try/catch
}//Main
}//MP3FileInfo
}//MP3
| [dotnetdecsharp] als [email protected] subscribed
| http://www.dotnetgerman.com/archiv/dotnetdecsharp/ = Listenarchiv
| Listenregeln, sowie An- und Abmeldung zu dieser Liste:
| http://www.dotnetgerman.com/listen/dotnetdecsharp.asp