예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        /// <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);
                }
            }
        }
예제 #6
0
        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);
                }
            }
        }
예제 #7
0
 /// <summary>
 /// Copy constructor.
 /// </summary>
 /// <param name="frame">Frame to copy.</param>
 protected ID3v2Frame(ID3v2Frame frame)
 {
     this.frameType   = frame.frameType;
     this.headerFlags = frame.headerFlags;
 }