Exemplo n.º 1
0
 public override async Task FromStreamAsync(Stream stream, uint tagLength, TagVersion version)
 {
     switch (version)
     {
         case TagVersion.V23:
             if (tagLength > 1)
             {
                 long startPosition = stream.Position;
                 int peek = stream.ReadByte();
                 if (peek == 0x00)
                 {
                     Text = await stream.ReadAnsiString(startPosition + tagLength).ConfigureAwait(false);
                 }
                 else if (peek == 0x01)
                 {
                     Text = await stream.ReadUnicodeStringAsync(startPosition + tagLength).ConfigureAwait(false);
                 }
                 else
                 {
                     throw new ArgumentException("frame does not contain valid text data!", "frame");
                 }
             }
             else
             {
                 throw new ArgumentException("frame does not contain valid text data!", "frame");
             }
             break;
         default:
             throw new NotImplementedException("Reading " + version.ToString() + " has not been implemented!");
     }
 }
Exemplo n.º 2
0
        public override async Task FromStreamAsync(Stream stream, uint tagLength, TagVersion version)
        {
            long streamStart = stream.Position;
            int encoding = stream.ReadByte();
            switch (version)
            {
                case TagVersion.V24:
                case TagVersion.V23:
                    if (encoding == 0x00)
                    {
                        MimeType = await stream.ReadAnsiString(streamStart + tagLength).ConfigureAwait(false);
                        PictureType = (AttachedPictureType)stream.ReadByte();

                        Description = await stream.ReadAnsiString(streamStart + tagLength).ConfigureAwait(false);
                        Data = new byte[tagLength - (stream.Position - streamStart)];
                        await stream.ReadAsync(Data, 0, Data.Length).ConfigureAwait(false);
                    }
                    else if (encoding == 0x01)
                    {
                        MimeType = await stream.ReadAnsiString(streamStart + tagLength).ConfigureAwait(false);
                        PictureType = (AttachedPictureType)stream.ReadByte();
                        Description = await stream.ReadUnicodeStringAsync(streamStart + tagLength).ConfigureAwait(false);
                        Data = new byte[tagLength - (stream.Position - streamStart)];
                        await stream.ReadAsync(Data, 0, Data.Length).ConfigureAwait(false);
                    }
                    break;
                default:
                    Debug.WriteLine("APIC: Version not implemented - " + version.ToString());
                    break;
            }
        }
Exemplo n.º 3
0
 internal override byte[] GetContentBytes(TagVersion version)
 {
     List<byte> bytes = new List<byte>();
     switch (version)
     {
         case TagVersion.V23:
             bytes.Add(0x00);
             bytes.AddRange(Encoding.Default.GetBytes("eng"));
             if (!string.IsNullOrEmpty(Description))
             {
                 bytes.AddRange(Encoding.Default.GetBytes(Description));
             }
             bytes.Add(0x00);
             if (!string.IsNullOrEmpty(Text))
             {
                 bytes.AddRange(Encoding.Default.GetBytes(Text));
             }
             bytes.Add(0x00);
             break;
         case TagVersion.V24:
         default:
             throw new ArgumentException("Version " + version.ToString() + " is not supported for this frame!", nameof(version));
     }
     return bytes.ToArray();
 }
Exemplo n.º 4
0
 internal override string GetTagId(TagVersion version)
 {
     switch (version)
     {
         case TagVersion.V23:
             return "TMED";
         default:
             throw new NotImplementedException("Frame{" + ToString() + "} has not been implemented for version " + version.ToString());
     }
 }
Exemplo n.º 5
0
 internal override string GetTagId(TagVersion version)
 {
     switch (version)
     {
         case TagVersion.V23:
         case TagVersion.V24:
             return "APIC";
         default:
             throw new ArgumentException("Version " + version.ToString() + " is not supported for this frame!", nameof(version));
     }
 }
Exemplo n.º 6
0
 internal override byte[] GetContentBytes(TagVersion version)
 {
     switch (version)
     {
         case TagVersion.V23:
             List<byte> bytes = new List<byte>();
             bytes.AddRange(Encoding.Default.GetBytes(Description));
             bytes.Add(0x00);
             bytes.AddRange(Value);
             return bytes.ToArray();
         default:
             throw new NotImplementedException("Writing " + version.ToString() + " has not been implemented!");
     }
 }
Exemplo n.º 7
0
 internal override byte[] GetContentBytes(TagVersion version)
 {
     List<byte> bytes = new List<byte>();
     switch (version)
     {
         case TagVersion.V23:
             bytes.AddRange(Encoding.Default.GetBytes(OwnerIdentifier));
             bytes.Add(0x00);
             bytes.AddRange(Identifier);
             break;
         case TagVersion.V24:
         default:
             throw new ArgumentException("Version " + version.ToString() + " is not supported for this frame!", nameof(version));
     }
     return bytes.ToArray();
 }
Exemplo n.º 8
0
 public override async Task FromStreamAsync(Stream stream, uint tagLength, TagVersion version)
 {
     switch (version)
     {
         case TagVersion.V23:
             if (tagLength > 1)
             {
                 long streamStart = stream.Position;
                 Description = await stream.ReadAnsiString(streamStart + tagLength).ConfigureAwait(false);
                 Value = new byte[tagLength - (stream.Position - streamStart)];
                 await stream.ReadAsync(Value, 0, Value.Length).ConfigureAwait(false);
             }
             else
             {
                 throw new ArgumentException("frame does not contain valid data!", "frame");
             }
             break;
         default:
             throw new NotImplementedException("Reading " + version.ToString() + " has not been implemented!");
     }
 }
Exemplo n.º 9
0
        internal override byte[] GetContentBytes(TagVersion version)
        {
            switch (version)
            {
                case TagVersion.V23:
                    var bytes = new List<byte>();
                    if (Encoding == Encoding.GetEncoding("ISO-8859-1"))
                    {
                        bytes.Add(0x00);
                        if (!string.IsNullOrEmpty(Text))
                        {
                            bytes.AddRange(Encoding.GetBytes(Text));
                        }
                        bytes.Add(0x00);
                    }
                    else if (Encoding == Encoding.Unicode || Encoding == Encoding.BigEndianUnicode)
                    {
                        bytes.Add(0x01);
                        if (!string.IsNullOrEmpty(Text))
                        {
                            bytes.AddRange(Encoding.GetPreamble());
                            bytes.AddRange(Encoding.GetBytes(Text));
                        }
                        bytes.Add(0x00);
                        bytes.Add(0x00);
                    }
                    else
                    {
                        throw new InvalidOperationException("Unknown encoding!");
                    }

                    return bytes.ToArray();
                default:
                    throw new NotImplementedException("Writing " + version.ToString() + " has not been implemented!");
            }
        }
Exemplo n.º 10
0
        public async Task Write(Stream stream, TagVersion version)
        {
            using (var memoryStream = new MemoryStream())
            {
                foreach (Frame id3Frame in Frames)
                {
                    await id3Frame.WriteAsync(memoryStream, version).ConfigureAwait(false);
                }

                await stream.WriteAsync(Constants.ID3Header, 0, Constants.ID3Header.Length).ConfigureAwait(false);
                switch (version)
                {
                    case TagVersion.V22:
                        stream.WriteByte(0x02);
                        break;
                    case TagVersion.V23:
                        stream.WriteByte(0x03);
                        break;
                    case TagVersion.V24:
                        stream.WriteByte(0x04);
                        break;
                    default:
                        throw new ArgumentException("Unable to write ID3 Tag with version = " + version.ToString(), nameof(version));
                }
                stream.WriteByte(0x00);
                stream.WriteByte(0x00);

                long size = memoryStream.Length;
                stream.WriteByte((byte)(size / (128 * 128 * 128)));
                stream.WriteByte((byte)((size % (128 * 128 * 128)) / (128 * 128)));
                stream.WriteByte((byte)((size % (128 * 128)) / 128));
                stream.WriteByte((byte)(size % 128));

                await memoryStream.CopyToAsync(stream).ConfigureAwait(false);
            }
        }
Exemplo n.º 11
0
        internal override string GetTagId(TagVersion version)
        {
            switch (version)
            {
            case TagVersion.V23:
                return("TPUB");

            default:
                throw new NotImplementedException("Frame{" + ToString() + "} has not been implemented for version " + version.ToString());
            }
        }
Exemplo n.º 12
0
        public async Task Write(Stream stream, TagVersion version)
        {
            using (var memoryStream = new MemoryStream())
            {
                foreach (Frame id3Frame in Frames)
                {
                    await id3Frame.WriteAsync(memoryStream, version).ConfigureAwait(false);
                }

                await stream.WriteAsync(Constants.ID3Header, 0, Constants.ID3Header.Length).ConfigureAwait(false);

                switch (version)
                {
                case TagVersion.V22:
                    stream.WriteByte(0x02);
                    break;

                case TagVersion.V23:
                    stream.WriteByte(0x03);
                    break;

                case TagVersion.V24:
                    stream.WriteByte(0x04);
                    break;

                default:
                    throw new ArgumentException("Unable to write ID3 Tag with version = " + version.ToString(), nameof(version));
                }
                stream.WriteByte(0x00);
                stream.WriteByte(0x00);

                long size = memoryStream.Length;
                stream.WriteByte((byte)(size / (128 * 128 * 128)));
                stream.WriteByte((byte)((size % (128 * 128 * 128)) / (128 * 128)));
                stream.WriteByte((byte)((size % (128 * 128)) / 128));
                stream.WriteByte((byte)(size % 128));

                await memoryStream.CopyToAsync(stream).ConfigureAwait(false);
            }
        }