/// <summary> /// This function parses the next frame from the stream and returns it. /// </summary> /// <param name="stream">The stream to parse the Frame from.</param> /// <param name="version">The ID3 v2 Major version of the ID3 tag that the stream is reading.</param> /// <param name="parserFactory">A FrameParserFactory to use to create FrameParsers based on Frame IDs.</param> /// <param name="frameID">Output: outputs the frameID of the frame just parsed.</param> /// <returns>The parsed Frame object.</returns> /// <exception cref="Achamenes.ID3.NoFrameParserProvidedException"> /// Thrown if the FrameParserFactory object passed did not recognize the Frame ID for the given version. /// </exception> public static Frame Parse(System.IO.Stream stream, ID3v2MajorVersion version, FrameParserFactory parserFactory, out string frameID) { FrameHeaderParser headerParser = FrameHeaderParser.CreateFrameHeaderParser(version); FrameHeader header = headerParser.Parse(stream); frameID = ""; if (header == null) // have reached the padding, no more frames. { return(null); } frameID = header.FrameID; if (header.Length > 128 * 128 * 128 * 128) { throw new FatalException("Invalid frame length for frame with frame ID '" + frameID + "'."); } byte[] frameData = new byte[header.Length]; stream.Read(frameData, 0, frameData.Length); FrameParser parser = parserFactory.CreateFrameParser(version, header.FrameID); if (parser == null) { throw new NoFrameParserProvidedException(frameID, version, "No frame parser object is provided to parse this type of frame in this implementation."); } return(parser.ParseFrame(frameData)); }
public virtual FrameParser CreateFrameParser(ID3v2MajorVersion version, string frameID) { List <CreateParserDelegate> parsers = new List <CreateParserDelegate>(); parsers.Add(new CreateParserDelegate(Frames.AlbumTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.ArtistTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.BeatsPerMinuteTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.ComposerTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.CopyrightTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.CustomUserTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.DateTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.EncodedByTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.EncodingTimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.FileTypeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.GenreTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.GroupingTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.InitialKeyTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.LanguageTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.LengthTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.MediaTypeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OrchestraTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OriginalAlbumTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OriginalArtistTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseTimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OriginalReleaseYearTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.PartOfSetTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.PublisherTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.RecordingTimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.ReleaseTimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.SoftwareSettingsTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.TaggingTimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.TimeTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.TitleTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.TrackTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.YearTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.CommentExtendedTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.LyricsExtendedTextFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.CommercialUrlFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.CustomUserUrlFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OfficialArtistUrlFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OfficialAudioFileUrlFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.OfficialAudioSourceUrlFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.GeneralEncapsulatedObjectFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.MusicCDIdentifierFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.PictureFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.PlayCounterFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.PrivateFrame.CreateParser)); parsers.Add(new CreateParserDelegate(Frames.UniqueFileIdentifierFrame.CreateParser)); foreach (CreateParserDelegate p in parsers) { FrameParser parser = p(version, frameID); if (parser != null) { return(parser); } } return(null); }