bool ParseFramesV2(ID3v2Reader reader) { while (reader.State == ID3v2ReaderState.ReadFrames) { if (!reader.ReadFrame(out var frame)) { return(false); } if (frame == null) { continue; } switch (frame.ID) { case "COM": /* TODO */ break; case "TT2": /* TODO */ break; case "TP1": /* TODO */ break; case "TRK": /* TODO */ break; case "TEN": /* TODO */ break; case "TCO": /* TODO */ break; default: // TODO IMPLEMENT ME break; } frames.Add(frame); } return(true); }
/// <summary> /// Parses the specified buffer starting at index to load all data for this frame /// This function will throw exceptions on parser errors. /// </summary> /// <param name="frameReader">FrameReader to read from.</param> public override bool Parse(DataFrameReader frameReader) { var reader = new ID3v2Reader(frameReader); // read header Header = reader.ReadHeader(out data); if (Header == null) { return(false); } // read extended header (may be null) if (!reader.ReadExtendedHeader(out extendedHeader)) { return(false); } // read frames switch (Header.Version) { case 2: if (!ParseFramesV2(reader)) { return(false); } break; case 3: case 4: if (!ParseFrames(reader)) { return(false); } break; default: return(false); } // read footer if (reader.State == ID3v2ReaderState.ReadFooter) { if (!reader.ReadFooter(out footer)) { return(false); } } return(true); }
bool ParseFrames(ID3v2Reader reader) { while (reader.State == ID3v2ReaderState.ReadFrames) { if (!reader.ReadFrame(out var frame)) { if (frames.Count > 0) { if (reader.Available > 0) { Trace.WriteLine(string.Format("Invalid frame in id3v2 tag, ignoring remaining data of {0} bytes.", reader.Available)); ParserError = true; } return(true); } return(false); } if (frame == null) { continue; } switch (frame.ID) { case "APIC": frame = new ID3v2APICFrame(frame); break; case "COMM": frame = new ID3v2COMMFrame(frame); break; case "ETCO": frame = new ID3v2ETCOFrame(frame); break; case "GEOB": /*TODO*/ break; case "IPLS": frame = new ID3v2IPLSFrame(frame); break; case "MCDI": frame = new ID3v2MCDIFrame(frame); break; case "MLLT": frame = new ID3v2MLLTFrame(frame); break; case "NCON": /*TODO*/ break; case "PCNT": frame = new ID3v2PCNTFrame(frame); break; case "PRIV": frame = new ID3v2PRIVFrame(frame); break; case "SYLT": frame = new ID3v2SYLTFrame(frame); break; case "SYTC": frame = new ID3v2SYTCFrame(frame); break; case "TXXX": frame = new ID3v2TXXXFrame(frame); break; case "UFID": frame = new ID3v2UFIDFrame(frame); break; case "USLT": frame = new ID3v2USLTFrame(frame); break; case "WXXX": frame = new ID3v2WXXXFrame(frame); break; case "XSLT": frame = new ID3v2XSLTFrame(frame); break; default: // TODO IMPLEMENT ME switch (frame.ID[0]) { case 'W': frame = new ID3v2WebFrame(frame); break; case 'T': frame = new ID3v2TextFrame(frame); break; default: Trace.WriteLine(string.Format("Unknown ID3v2 frame type {0}", frame.ID)); break; } break; } frames.Add(frame); } return(true); }