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!"); } }
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; } }
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(); }
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()); } }
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)); } }
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!"); } }
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(); }
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!"); } }
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!"); } }
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); } }
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()); } }