static FrameBase ReadFrame(BinaryReader reader, string frameId, FrameFlags flags, uint frameSize) { #if NETSTANDARD2_0 var frameDataBuffer = reader.ReadBytes((int)frameSize); #else // Use heap allocations for frames > 256kB (usually pictures) var frameDataBuffer = frameSize < 0x40000 ? stackalloc byte[(int)frameSize] : new byte[(int)frameSize]; reader.Read(frameDataBuffer); #endif return(FrameFactory.Build(frameId, flags, frameDataBuffer)); }
internal MetadataToTagModelAdapter(AudioMetadata metadata, int version, string encoding) { Header.Version = (byte)version; var textType = encoding switch { "UTF16" => TextType.Utf16, "UTF8" => TextType.Utf8, _ => TextType.Ascii }; AddTextFrame("TIT2", metadata.Title, textType); AddTextFrame("TPE1", metadata.Artist, textType); AddTextFrame("TALB", metadata.Album, textType); AddTextFrame("TPE2", metadata.AlbumArtist, textType); AddTextFrame("TCOM", metadata.Composer, textType); AddTextFrame("TCON", metadata.Genre, textType); AddTextFrame("COMM", metadata.Comment, textType); if (version == 3) { AddTextFrame("TDAT", GetDateText(metadata), textType); AddTextFrame("TYER", metadata.Year, textType); } else { AddTextFrame("TDRC", GetTimeStamp(metadata), textType); } AddTextFrame("TRCK", GetTrackText(metadata), textType); AddReplayGainFrame(metadata.TrackPeak, "REPLAYGAIN_TRACK_PEAK"); AddReplayGainFrame(metadata.AlbumPeak, "REPLAYGAIN_ALBUM_PEAK"); AddReplayGainFormattedFrame(metadata.TrackGain, "REPLAYGAIN_TRACK_GAIN"); AddReplayGainFormattedFrame(metadata.AlbumGain, "REPLAYGAIN_ALBUM_GAIN"); if (metadata.CoverArt == null) { return; } // Always store images in JPEG format, since MP3 is also lossy var lossyCoverArt = CoverArtFactory.ConvertToLossy(metadata.CoverArt); Frames.Add(new FramePicture { PictureType = PictureType.CoverFront, Mime = lossyCoverArt.MimeType, PictureData = lossyCoverArt.Data.ToArray() }); } void AddReplayGainFormattedFrame(string value, string description) { if (!string.IsNullOrEmpty(value)) { AddReplayGainFrame($"{value} dB", description); } } void AddReplayGainFrame(string value, string description) => AddTextFrame("TXXX", value, TextType.Ascii, description, true); void AddTextFrame(string frameId, string value, TextType textType = TextType.Ascii, string?description = null, bool fileAlter = false) { if (string.IsNullOrEmpty(value)) { return; } var frame = (FrameText)FrameFactory.Build(frameId); frame.Text = value; frame.TextType = textType; frame.FileAlter = fileAlter; if (description != null) { if (frame is IFrameDescription frameDescription) { frameDescription.Description = description; } } Frames.Add(frame); }