예제 #1
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (Items.Count == 0)
            {
                return(new byte[0]);
            }

            // Set TextEncoding to Unicode/UTF8 if required
            if (TextEncoding == EncodingType.ISO88591)
            {
                foreach (ILanguageItem languageItem in Items)
                {
                    byte[] languageCodeData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, languageItem.LanguageCode, true);
                    this.RequiresFix(tagVersion, languageItem.LanguageCode, languageCodeData);
                }
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)TextEncoding);
                bool isTerminated = true; //(tagVersion == TagVersion.ID3v24);
                for (int i = 0; i < Items.Count; i++)
                {
                    ILanguageItem languageItem = Items[i];
                    if (i == Items.Count - 1)
                    {
                        isTerminated = false;
                    }
                    frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, languageItem.LanguageCode, isTerminated));
                }
                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #2
0
파일: AudioText.cs 프로젝트: Livila/stuffa
        public byte[] GetAudioData(AudioScramblingMode audioScramblingMode)
        {
            if (audioScramblingMode == AudioScramblingMode.Default)
            {
                audioScramblingMode = (_isMpegOrAac ? AudioScramblingMode.Unsynchronization : AudioScramblingMode.Scrambling);
            }

            switch (audioScramblingMode)
            {
            case AudioScramblingMode.Scrambling:
                return(Scramble(_audioData));

            case AudioScramblingMode.Unsynchronization:
                return(ID3v2Utils.ReadUnsynchronized(_audioData));

            default:
                if (_audioData == null)
                {
                    return(null);
                }
                else
                {
                    return((byte[])_audioData.Clone());
                }
            }
        }
예제 #3
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (_additionalData == null || _additionalData.Length == 0)
            {
                return(new byte[0]);
            }

            if (tagVersion == ID3v2TagVersion.ID3v22)
            {
                if (_frameIdentifier == null || _frameIdentifier.Length != 3)
                {
                    return(new byte[0]);
                }
            }
            else
            {
                if (_frameIdentifier == null || _frameIdentifier.Length != 4)
                {
                    return(new byte[0]);
                }
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.Write(ByteUtils.ISO88591GetBytes(_frameIdentifier));
                frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, _url, true));
                frameData.Write(_additionalData);

                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #4
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            Reset();

            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                OwnerIdentifier = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                if (bytesLeft > 0)
                {
                    MethodSymbol = stream.Read1(ref bytesLeft);
                    if (bytesLeft > 0)
                    {
                        EncryptionData = stream.Read(bytesLeft);
                        bytesLeft      = 0;
                    }
                }
            }

            if (bytesLeft != 0)
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #5
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                UserEmail = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                if (bytesLeft > 0)
                {
                    Rating = stream.Read1(ref bytesLeft);
                    if (bytesLeft > 0)
                    {
                        byte[] playCount = stream.Read(bytesLeft);
                        PlayCount = ByteUtils.ConvertToInt64(playCount);
                    }
                    else
                    {
                        PlayCount = 0;
                    }
                }
                else
                {
                    Rating    = 0;
                    PlayCount = 0;
                }
            }
            else
            {
                UserEmail = null;
                Rating    = 0;
                PlayCount = 0;
            }
        }
예제 #6
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            // TODO: Test

            if (string.IsNullOrEmpty(Text))
            {
                return(new byte[0]);
            }

            byte[] contentDescriptorData;
            byte[] textData;
            do
            {
                contentDescriptorData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, ContentDescriptor, true);
                textData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Text, false);
            } while (
                this.RequiresFix(tagVersion, ContentDescriptor, contentDescriptorData) ||
                this.RequiresFix(tagVersion, Text, textData)
                );

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(ByteUtils.ISO88591GetBytes(LanguageCode));
                frameData.Write(contentDescriptorData);
                frameData.Write(textData);
                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #7
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (string.IsNullOrEmpty(_value))
            {
                return(new byte[0]);
            }

            byte[] descriptionData;
            byte[] valueData;
            do
            {
                descriptionData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Description, true);
                valueData       = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Value, false);
            } while (
                this.RequiresFix(tagVersion, Description, descriptionData) ||
                this.RequiresFix(tagVersion, Value, valueData)
                );

            using (MemoryStream stream = new MemoryStream())
            {
                stream.WriteByte((byte)TextEncoding);
                stream.Write(descriptionData);
                stream.Write(valueData);
                return(_frameHeader.GetBytes(stream, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #8
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft >= 4)
            {
                TextEncoding = (EncodingType)stream.Read1(ref bytesLeft);
                MimeType     = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                if (bytesLeft > 0)
                {
                    FileName = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                    if (bytesLeft > 0)
                    {
                        Description = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                        if (bytesLeft > 0)
                        {
                            EncapsulatedObject = stream.Read(bytesLeft);
                            bytesLeft          = 0;
                        }
                    }
                }
            }

            // Seek to end of frame
            if (bytesLeft > 0)
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #9
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (_encapsulatedObject == null || _encapsulatedObject.Length == 0)
            {
                return(new byte[0]);
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                byte[] fileNameData;
                byte[] descriptionData;

                do
                {
                    fileNameData    = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, FileName, true);
                    descriptionData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Description, true);
                } while (
                    this.RequiresFix(tagVersion, FileName, fileNameData) ||
                    this.RequiresFix(tagVersion, Description, descriptionData)
                    );

                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, MimeType, true));
                frameData.Write(fileNameData);
                frameData.Write(descriptionData);
                frameData.Write(_encapsulatedObject);

                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #10
0
파일: Comments.cs 프로젝트: kiliman/IdSharp
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (string.IsNullOrEmpty(Value))
            {
                return(new byte[0]);
            }

            if (LanguageCode == null || LanguageCode.Length != 3)
            {
                LanguageCode = "eng";
            }

            byte[] descriptionData;
            byte[] valueData;

            do
            {
                descriptionData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Description, true);
                valueData       = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Value, false);
            } while (
                this.RequiresFix(tagVersion, Description, descriptionData) ||
                this.RequiresFix(tagVersion, Value, valueData)
                );

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(ByteUtils.ISO88591GetBytes(LanguageCode));
                frameData.Write(descriptionData);
                frameData.Write(valueData);
                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #11
0
파일: AudioText.cs 프로젝트: Livila/stuffa
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (_audioData == null || _audioData.Length == 0)
            {
                return(new byte[0]);
            }

            string frameID = GetFrameID(tagVersion);

            if (frameID == null)
            {
                return(new byte[0]);
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                byte[] mimeType = ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, MimeType, true);

                byte[] equivText;
                do
                {
                    equivText = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, EquivalentText, true);
                } while (this.RequiresFix(tagVersion, EquivalentText, equivText));

                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(mimeType, 0, mimeType.Length);
                frameData.WriteByte((byte)(_isMpegOrAac ? 0 : 1));
                frameData.Write(equivText, 0, equivText.Length);
                frameData.Write(_audioData, 0, _audioData.Length);

                return(_frameHeader.GetBytes(frameData, tagVersion, frameID));
            }
        }
예제 #12
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (Items.Count == 0)
            {
                return(new byte[0]);
            }

            // Sets appropriate TextEncoding if ISO-8859-1 is insufficient
            if (TextEncoding == EncodingType.ISO88591)
            {
                foreach (IInvolvedPerson involvedPerson in Items)
                {
                    if (string.IsNullOrEmpty(involvedPerson.Involvement) && string.IsNullOrEmpty(involvedPerson.Name))
                    {
                        continue;
                    }

                    byte[] involvementData = ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, involvedPerson.Involvement, true);
                    byte[] nameData        = ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, involvedPerson.Name, true);

                    if (this.RequiresFix(tagVersion, involvedPerson.Involvement, involvementData))
                    {
                        break;
                    }
                    if (this.RequiresFix(tagVersion, involvedPerson.Name, nameData))
                    {
                        break;
                    }
                }
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)_textEncoding);

                bool foundItem = false;
                foreach (IInvolvedPerson involvedPerson in Items)
                {
                    if (string.IsNullOrEmpty(involvedPerson.Involvement) && string.IsNullOrEmpty(involvedPerson.Name))
                    {
                        continue;
                    }

                    frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, involvedPerson.Involvement, true));
                    frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, involvedPerson.Name, true));
                    foundItem = true;
                }

                if (!foundItem)
                {
                    return(new byte[0]);
                }

                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #13
0
 public override byte[] GetBytes(ID3v2TagVersion tagVersion)
 {
     using (MemoryStream frameData = new MemoryStream())
     {
         frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, _ownerIdentifier, true));
         frameData.WriteByte(_groupSymbol);
         if (_groupDependentData != null)
         {
             frameData.Write(_groupDependentData);
         }
         return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
     }
 }
예제 #14
0
 public override byte[] GetBytes(ID3v2TagVersion tagVersion)
 {
     using (MemoryStream stream = new MemoryStream())
     {
         stream.Write(ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, OwnerIdentifier, true));
         stream.Write(ByteUtils.Get2Bytes(PreviewStart));
         stream.Write(ByteUtils.Get2Bytes(PreviewLength));
         if (_encryptionInfo != null)
         {
             stream.Write(_encryptionInfo);
         }
         return(_frameHeader.GetBytes(stream, tagVersion, GetFrameID(tagVersion)));
     }
 }
예제 #15
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (_rating == 0 && _playCount == 0)
            {
                return(new byte[0]);
            }

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, EncodingType.ISO88591, _userEmail, true));
                frameData.WriteByte(_rating);
                frameData.Write(ByteUtils.GetBytesMinimal(_playCount));
                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #16
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                OwnerIdentifier = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                if (bytesLeft > 0)
                {
                    PrivateData = stream.Read(bytesLeft);
                }
            }
        }
예제 #17
0
        public static bool RequiresFix(this ITextEncoding frame, ID3v2TagVersion tagVersion, string value, byte[] data)
        {
            if (frame.TextEncoding != EncodingType.ISO88591)
            {
                return(false);
            }

            if (value != null && value != ID3v2Utils.ReadString(frame.TextEncoding, data, data.Length))
            {
                frame.TextEncoding = tagVersion == ID3v2TagVersion.ID3v24 ? EncodingType.UTF8 : EncodingType.Unicode;
                return(true);
            }

            return(false);
        }
예제 #18
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (_pictureData == null || _pictureData.Length == 0)
            {
                return(new byte[0]);
            }

            // iTunes doesn't like Unicode in APIC descriptions - fixed in iTunes 7.1.0.59
            //TextEncoding = EncodingType.ISO88591;

            using (MemoryStream stream = new MemoryStream())
            {
                byte[] descriptionData;

                do
                {
                    descriptionData = ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, _description, true);
                } while (
                    this.RequiresFix(tagVersion, _description, descriptionData)
                    );

                stream.WriteByte((byte)_textEncoding);
                if (tagVersion == ID3v2TagVersion.ID3v22)
                {
                    string format = PictureExtension;
                    if (string.IsNullOrEmpty(format) || format.Length < 3)
                    {
                        format = "   ";
                    }
                    else if (format.Length > 3)
                    {
                        format = format.Substring(0, 3);
                    }

                    stream.Write(Encoding.ASCII.GetBytes(format));
                }
                else
                {
                    SetMimeType();       // iTunes needs this set properly
                    stream.Write(ByteUtils.ISO88591GetBytes(_mimeType));
                    stream.WriteByte(0); // terminator
                }
                stream.WriteByte((byte)_pictureType);
                stream.Write(descriptionData);
                stream.Write(_pictureData);
                return(_frameHeader.GetBytes(stream, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #19
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _languageItems.Clear();

            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft >= 4)
            {
                TextEncoding = (EncodingType)stream.Read1(ref bytesLeft);
                // This could be implemented many ways
                // engfraspa etc
                // eng 0x00 fra 0x00 spa 0x00 etc
                // English
                // English 0x00 French 0x00 Spanish 0x00

                // TODO: Finish implementation
                string languageCode = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                if (languageCode.Length != 3)
                {
                    if (languageCode.ToLower() == "english" || languageCode.ToLower() == "en")
                    {
                        Items.AddNew().LanguageCode = "eng";
                    }
                    else
                    {
                        foreach (KeyValuePair <string, string> kvp in LanguageHelper.Languages)
                        {
                            if (kvp.Value.ToLower() == languageCode.ToLower())
                            {
                                Items.AddNew().LanguageCode = kvp.Key;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    Items.AddNew().LanguageCode = languageCode;
                }
            }

            if (bytesLeft > 0)
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #20
0
파일: AudioText.cs 프로젝트: Livila/stuffa
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);
            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                TextEncoding = (EncodingType)stream.Read1(ref bytesLeft);
                if (bytesLeft > 0)
                {
                    MimeType = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                    if (bytesLeft > 1)
                    {
                        byte flags = stream.Read1(ref bytesLeft);
                        _isMpegOrAac   = ((flags & 0x01) == 0x00);
                        EquivalentText = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                        if (bytesLeft > 0)
                        {
                            _audioData = stream.Read(bytesLeft);
                            bytesLeft  = 0;
                        }
                    }
                    else
                    {
                        EquivalentText = null;
                        _audioData     = null;
                    }
                }
                else
                {
                    MimeType       = null;
                    EquivalentText = null;
                    _audioData     = null;
                }
            }
            else
            {
                TextEncoding   = EncodingType.ISO88591;
                MimeType       = null;
                EquivalentText = null;
                _audioData     = null;
            }

            if (bytesLeft > 0)
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #21
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                OwnerIdentifier = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                if (bytesLeft >= 4)
                {
                    PreviewStart  = stream.ReadInt16(ref bytesLeft);
                    PreviewLength = stream.ReadInt16(ref bytesLeft);
                    if (bytesLeft > 0)
                    {
                        EncryptionInfo = stream.Read(bytesLeft);
                        bytesLeft      = 0;
                    }
                    else
                    {
                        // Incomplete frame
                        EncryptionInfo = null;
                    }
                }
                else
                {
                    // Incomplete frame
                    PreviewStart   = 0;
                    PreviewLength  = 0;
                    EncryptionInfo = null;
                }
            }
            else
            {
                // Incomplete frame
                OwnerIdentifier = null;
                PreviewStart    = 0;
                PreviewLength   = 0;
                EncryptionInfo  = null;
            }

            // Seek to end of frame
            if (bytesLeft != 0)
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #22
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);
            if (_frameHeader.FrameSizeExcludingAdditions > 0)
            {
                TextEncoding = (EncodingType)stream.Read1();
                int bytesLeft = _frameHeader.FrameSizeExcludingAdditions - 1;
                Description = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                Value       = ID3v2Utils.ReadString(TextEncoding, stream, bytesLeft);
            }
            else
            {
                /*String msg = String.Format("0 length frame '{0}' at position {1}", "TXXX", stream.Position);
                 * Trace.WriteLine(msg);*/

                Description = string.Empty;
                Value       = string.Empty;
            }
        }
예제 #23
0
파일: TextFrame.cs 프로젝트: Livila/stuffa
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            // Some taggers write 0 byte sized frames (which is explicitly forbidden by the spec)
            if (_frameHeader.FrameSizeExcludingAdditions >= 1)
            {
                TextEncoding = (EncodingType)stream.Read1();
                Value        = ID3v2Utils.ReadString(_textEncoding, stream, _frameHeader.FrameSizeExcludingAdditions - 1);
            }
            else
            {
                //String msg = String.Format("Under-sized ({0} bytes) text frame at position {1}", m_FrameHeader.FrameSizeExcludingAdditions, stream.Position);
                //Trace.WriteLine(msg);

                TextEncoding = EncodingType.ISO88591;
                Value        = "";
            }
        }
예제 #24
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);

            int bytesLeft   = _frameHeader.FrameSizeExcludingAdditions;
            int frameIDSize = (tagReadingInfo.TagVersion == ID3v2TagVersion.ID3v22 ? 3 : 4);

            if (bytesLeft > frameIDSize)
            {
                FrameIdentifier = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, frameIDSize);
                bytesLeft      -= frameIDSize;
                Url             = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, ref bytesLeft);
                AdditionalData  = stream.Read(bytesLeft);
            }
            else
            {
                stream.Seek(bytesLeft, SeekOrigin.Current);
            }
        }
예제 #25
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (Items.Count == 0)
            {
                return(new byte[0]);
            }

            if (TextEncoding == EncodingType.ISO88591)
            {
                foreach (ISynchronizedTextItem item in Items)
                {
                    byte[] textData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, item.Text, true);
                    if (this.RequiresFix(tagVersion, item.Text, textData))
                    {
                        break;
                    }
                }
            }

            byte[] contentDescriptorData;
            do
            {
                contentDescriptorData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, ContentDescriptor, true);
            } while (this.RequiresFix(tagVersion, ContentDescriptor, contentDescriptorData));

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(ByteUtils.ISO88591GetBytes(LanguageCode));
                frameData.WriteByte((byte)TimestampFormat);
                frameData.WriteByte((byte)ContentType);
                frameData.Write(contentDescriptorData);
                foreach (ISynchronizedTextItem item in Items)
                {
                    frameData.Write(ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, item.Text, true));
                    frameData.Write(ByteUtils.Get4Bytes(item.Timestamp));
                }

                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #26
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (string.IsNullOrEmpty(_value))
            {
                return(new byte[0]);
            }

            byte[] valueData;
            do
            {
                valueData = ID3v2Utils.GetStringBytes(tagVersion, _textEncoding, _value, false);
            } while (this.RequiresFix(tagVersion, _value, valueData));

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)_textEncoding);
                frameData.Write(ByteUtils.ISO88591GetBytes(_languageCode));
                frameData.Write(valueData);
                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #27
0
파일: AudioText.cs 프로젝트: Livila/stuffa
 public void SetAudioData(string mimeType, byte[] audioData, bool isMpegOrAac)
 {
     MimeType     = mimeType;
     _isMpegOrAac = isMpegOrAac;
     if (audioData == null)
     {
         _audioData = null;
     }
     else
     {
         if (_isMpegOrAac)
         {
             _audioData = ID3v2Utils.ConvertToUnsynchronized(_audioData);
         }
         else
         {
             _audioData = Scramble(_audioData);
         }
     }
     RaisePropertyChanged("AudioData");
 }
예제 #28
0
        public override byte[] GetBytes(ID3v2TagVersion tagVersion)
        {
            if (string.IsNullOrEmpty(Value))
            {
                return(new byte[0]);
            }

            byte[] descriptionData;
            do
            {
                descriptionData = ID3v2Utils.GetStringBytes(tagVersion, TextEncoding, Description, true);
            } while (this.RequiresFix(tagVersion, Description, descriptionData));

            using (MemoryStream frameData = new MemoryStream())
            {
                frameData.WriteByte((byte)TextEncoding);
                frameData.Write(descriptionData);
                frameData.Write(ByteUtils.ISO88591GetBytes(Value));

                return(_frameHeader.GetBytes(frameData, tagVersion, GetFrameID(tagVersion)));
            }
        }
예제 #29
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);
            if (_frameHeader.FrameSizeExcludingAdditions >= 4)
            {
                TextEncoding = (EncodingType)stream.Read1();
                LanguageCode = ID3v2Utils.ReadString(EncodingType.ISO88591, stream, 3);

                int tmpBytesLeft = _frameHeader.FrameSizeExcludingAdditions - 1 /*encoding*/ - 3 /*language code*/;
                ContentDescriptor = ID3v2Utils.ReadString(TextEncoding, stream, ref tmpBytesLeft);

                Text = ID3v2Utils.ReadString(_textEncoding, stream, tmpBytesLeft);
            }
            else
            {
                string msg = string.Format("Under-sized ({0} bytes) unsynchronized text frame at position {1}", _frameHeader.FrameSizeExcludingAdditions, stream.Position);
                Trace.WriteLine(msg);

                LanguageCode      = "eng";
                ContentDescriptor = "";
                Text = "";
            }
        }
예제 #30
0
        public override void Read(TagReadingInfo tagReadingInfo, Stream stream)
        {
            _frameHeader.Read(tagReadingInfo, ref stream);
            _involvedPersons.Clear();

            int bytesLeft = _frameHeader.FrameSizeExcludingAdditions;

            if (bytesLeft > 0)
            {
                TextEncoding = (EncodingType)stream.Read1(ref bytesLeft);
                while (bytesLeft > 0)
                {
                    string involvement = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);
                    string name        = ID3v2Utils.ReadString(TextEncoding, stream, ref bytesLeft);

                    if (!string.IsNullOrEmpty(involvement) || !string.IsNullOrEmpty(name))
                    {
                        IInvolvedPerson involvedPerson = _involvedPersons.AddNew();
                        involvedPerson.Involvement = involvement;
                        involvedPerson.Name        = name;
                    }
                }
            }
        }