private bool ReadData(Stream stream, bool readData) { if ((_header = ID3v2Header.FromStream(stream)) != null) { byte[] buffer = new byte[_header.DataLength]; if (stream.Read(buffer, 0, buffer.Length) < buffer.Length) { return(false); } if (_header.IsUnsync && _header.Version != ID3Version.ID3v2_4) { buffer = UnSyncBuffer(buffer); } _content = buffer; MemoryStream contentStream = new MemoryStream(buffer); switch (_header.Version) { case ID3Version.ID3v2_2: Parse2(); break; case ID3Version.ID3v2_3: Parse3(contentStream); break; case ID3Version.ID3v2_4: Parse4(contentStream); break; default: throw new ID3Exception("Invalid Version: [2.{0};{1}]", _header.RawVersion[0], _header.RawVersion[1]); } if (readData) { ReadFrames(contentStream); } contentStream.Dispose(); return(true); } else { Debug.WriteLine("ID3v2::ReadData: No ID3v2 Header found."); return(false); } }
public static ID3v2Header FromStream(Stream stream) { if (stream == null) { throw new ArgumentNullException("stream"); } if (!stream.CanRead) { throw new ArgumentException("stream not readable"); } if (!stream.CanSeek) { throw new ArgumentException("stream not seekable"); } BinaryReader reader = new BinaryReader(stream); ID3v2Header header; byte[] buffer = new byte[HeaderLength]; int read = stream.Read(buffer, 0, buffer.Length); if (read < 10) { throw new EndOfStreamException(); } if (buffer[0] == 0x49 && //I buffer[1] == 0x44 && //D buffer[2] == 0x33) { header = new ID3v2Header(); header.Version = (ID3Version)buffer[3]; header.RawVersion = new byte[] { buffer[3], buffer[4] }; header.Flags = (ID3v2HeaderFlags)buffer[5]; /*header.DataLength = buffer[6] * (1 << 21); * header.DataLength += buffer[7] * (1 << 14); * header.DataLength += buffer[8] * (1 << 7); * header.DataLength += buffer[9]; */ header.DataLength = ID3Utils.ReadInt32(buffer, 6, true); return(header); } stream.Position -= read; return(null); }