예제 #1
0
        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));
        }
예제 #2
0
        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);
        }