/// <summary> /// Reads an ID3v2 tag from a stream. Returns null if no ID3v2 tag can be found /// in the stream. /// </summary> /// <param name="stream">The stream to read.</param> /// <returns>The tag read from the stream, or null if no ID3v2 tag can be found.</returns> public static ID3v2Tag ReadTag(Stream stream) { ID3Versions version = LookForTag(stream); ID3v2Tag tag = null; if ((version & ID3Versions.V2) == ID3Versions.V2) { tag = new ID3v2Tag(); tag.headerFlags = ReadFlags(stream, version); int tagSize = ReadTagSize(stream); // Go to the first byte after the header stream.Seek(TAG_HEADER_LENGTH, SeekOrigin.Begin); while (stream.Position < tagSize) { ID3v2Frame newFrame = ID3v2Frame.ReadFrame(stream, version); if (newFrame != null) { tag.AddFrame(newFrame); } else { break; } } } return(tag); }
/// <summary> /// Adds a frame to the tag. /// </summary> /// <param name="newFrame">The frame to add.</param> public void AddFrame(ID3v2Frame newFrame) { if (newFrame == null) { throw new ArgumentNullException("newFrame"); } if (frames.ContainsKey(newFrame.Type)) { ID3v2Frame existingFrame = frames[newFrame.Type]; FrameComposite composite = existingFrame as FrameComposite; if (composite == null) { composite = new FrameComposite(existingFrame.Type); composite.AddFrame(existingFrame); frames.Remove(newFrame.Type); frames.Add(composite.Type, composite); } composite.AddFrame(newFrame); } else { frames.Add(newFrame.Type, newFrame); } }
/// <summary> /// Reads and returns a frame from a stream. /// </summary> /// <param name="stream">The stream to read from.</param> /// <param name="version">The ID3v2 version of the tag being parsed.</param> /// <returns>The frame read from the stream.</returns> public static ID3v2Frame ReadFrame(Stream stream, ID3Versions version) { if (stream == null) { throw new ArgumentNullException("stream"); } ID3v2Frame frame = null; FrameParameters parameters = new FrameParameters(version); byte[] header = new byte[parameters.HeaderLength]; char[] idChars = new char[parameters.IDLength]; byte[] sizeBytes = new byte[parameters.SizeLength]; byte[] flags = new byte[parameters.FlagsLength]; byte[] frameData; string frameID; int size; stream.Read(header, 0, header.Length); Array.Copy(header, 0, idChars, 0, idChars.Length); Array.Copy(header, parameters.IDLength, sizeBytes, 0, sizeBytes.Length); Array.Copy(header, parameters.IDLength + parameters.SizeLength, flags, 0, flags.Length); if (idChars[0] != 0x0) { frameID = new String(idChars); if (parameters.SizeIsSynchSafe) { size = SynchsafeInteger.UnSynchsafe(sizeBytes); } else { size = EncodedInteger.ToInt(sizeBytes); } frameData = new byte[size]; stream.Read(frameData, 0, frameData.Length); FrameType frameType = FrameRegistry.GetFrameType(frameID, version); frame = FrameRegistry.GetNewFrame(frameType); frame.Initialize(flags, frameData, version); } else { frame = null; } return(frame); }
private ID3v2Frame GetFirstFrame(FrameType frameType) { ID3v2Frame frame = null; if (frames.ContainsKey(frameType)) { frame = frames[frameType]; FrameComposite composite = frame as FrameComposite; if (composite != null) { frame = composite[0] as ID3v2Frame; } } return(frame); }
/// <summary> /// Removes a given frame from the tag. /// </summary> /// <param name="frame">The frame to remove.</param> public void RemoveFrame(ID3v2Frame frame) { if (frame == null) { throw new ArgumentNullException("frame"); } if (frames.ContainsKey(frame.Type)) { ID3v2Frame existingFrame = frames[frame.Type]; FrameComposite composite = existingFrame as FrameComposite; if (composite != null && composite != frame) { composite.RemoveFrame(frame); } else { frames.Remove(frame.Type); } } }
public virtual ID3v2Frame this[FrameType frameType] { get { ID3v2Frame frame = null; if (frames.ContainsKey(frameType)) { frame = frames[frameType]; } return(frame); } set { if (value == null) { RemoveFrame(frameType); } else { AddFrame(value); } } }
/// <summary> /// Copy constructor. /// </summary> /// <param name="frame">Frame to copy.</param> protected ID3v2Frame(ID3v2Frame frame) { this.frameType = frame.frameType; this.headerFlags = frame.headerFlags; }