Beispiel #1
0
        protected override int write(TagData tag, BinaryWriter w, string zone)
        {
            long   counterPos;
            uint   counter = 0;
            string vendor;

            if (AdditionalFields.ContainsKey(VENDOR_METADATA_ID))
            {
                vendor = AdditionalFields[VENDOR_METADATA_ID];
            }
            else
            {
                // Even when no existing field, vendor field is mandatory in OGG structure
                // => a file with no vendor is a FLAC file
                vendor = VENDOR_DEFAULT_FLAC;
            }

            w.Write((uint)vendor.Length);
            w.Write(Encoding.UTF8.GetBytes(vendor));

            counterPos = w.BaseStream.Position;
            w.Write((uint)0); // Tag counter placeholder to be rewritten in a few lines

            counter = writeFrames(tag, w);

            if (writeMetadataFramingBit)
            {
                w.Write((byte)1);                          // Framing bit (mandatory for OGG container)
            }
            // PADDING MANAGEMENT
            // Write the remaining padding bytes, if any detected during initial reading
            if (managePadding)
            {
                long paddingSizeToWrite;
                if (tag.PaddingSize > -1)
                {
                    paddingSizeToWrite = tag.PaddingSize;
                }
                else
                {
                    paddingSizeToWrite = TrackUtils.ComputePaddingSize(initialPaddingOffset, initialPaddingSize, initialPaddingOffset, w.BaseStream.Position);
                }
                if (paddingSizeToWrite > 0)
                {
                    for (int i = 0; i < paddingSizeToWrite; i++)
                    {
                        w.Write((byte)0);
                    }
                }
            }

            long finalPos = w.BaseStream.Position;

            w.BaseStream.Seek(counterPos, SeekOrigin.Begin);
            w.Write(counter);
            w.BaseStream.Seek(finalPos, SeekOrigin.Begin);

            return((int)counter);
        }
        protected override int write(TagData tag, BinaryWriter w, string zone)
        {
            long   counterPos;
            uint   counter = 0;
            string vendor;

            if (AdditionalFields.ContainsKey(VENDOR_METADATA_ID))
            {
                vendor = AdditionalFields[VENDOR_METADATA_ID];
            }
            else
            {
                // Even when no existing field, vendor field is mandatory in OGG structure
                // => a file with no vendor is a FLAC file
                vendor = VENDOR_DEFAULT_FLAC;
            }

            w.Write((uint)vendor.Length);
            w.Write(Encoding.UTF8.GetBytes(vendor));

            counterPos = w.BaseStream.Position;
            w.Write((uint)0); // Tag counter placeholder to be rewritten in a few lines

            counter = writeFrames(tag, w);

            if (writeMetadataFramingBit)
            {
                w.Write((byte)1);                          // Framing bit (mandatory for OGG container)
            }
            // NB : Foobar2000 adds a padding block of 2048 bytes here for OGG container, regardless of the type or size of written fields
            if (Settings.EnablePadding)
            {
                for (int i = 0; i < 2048; i++)
                {
                    w.Write((byte)0);
                }
            }

            long finalPos = w.BaseStream.Position;

            w.BaseStream.Seek(counterPos, SeekOrigin.Begin);
            w.Write(counter);
            w.BaseStream.Seek(finalPos, SeekOrigin.Begin);

            return((int)counter);
        }
Beispiel #3
0
        protected override int write(TagData tag, BinaryWriter w, string zone)
        {
            int result = 6;

            w.Write(Utils.BuildStrictLengthStringBytes(tag.Title, 32, 0, Encoding.UTF8));
            w.Write(Utils.BuildStrictLengthStringBytes(tag.Album, 32, 0, Encoding.UTF8));
            w.Write(Utils.BuildStrictLengthStringBytes(tag.Copyright, 32, 0, Encoding.UTF8));
            string str = "";

            if (AdditionalFields.ContainsKey("EMULATOR"))
            {
                str = AdditionalFields["EMULATOR"];
            }
            w.Write(Utils.BuildStrictLengthStringBytes(str, 32, 0, Encoding.UTF8));
            str = "";
            if (AdditionalFields.ContainsKey("DUMPER"))
            {
                str = AdditionalFields["DUMPER"];
            }
            w.Write(Utils.BuildStrictLengthStringBytes(str, 32, 0, Encoding.UTF8));
            w.Write(Utils.BuildStrictLengthStringBytes(tag.Comment, 256, 0, Encoding.UTF8));

            return(result);
        }
Beispiel #4
0
        // Write GD3 tag
        protected override int write(TagData tag, BinaryWriter w, string zone)
        {
            byte[] endString = new byte[2] {
                0, 0
            };
            int      result = 11; // 11 field to write
            long     sizePos;
            string   str;
            Encoding unicodeEncoder = Encoding.Unicode;

            w.Write(Utils.Latin1Encoding.GetBytes(GD3_SIGNATURE));
            w.Write(0x00000100); // Version number

            sizePos = w.BaseStream.Position;
            w.Write(0);

            w.Write(unicodeEncoder.GetBytes(tag.Title));
            w.Write(endString); // Strings must be null-terminated
            str = "";
            if (AdditionalFields.ContainsKey("TITLE_J"))
            {
                str = AdditionalFields["TITLE_J"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);

            w.Write(unicodeEncoder.GetBytes(tag.Album));
            w.Write(endString);
            str = "";
            if (AdditionalFields.ContainsKey("GAME_J"))
            {
                str = AdditionalFields["GAME_J"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);

            str = "";
            if (AdditionalFields.ContainsKey("SYSTEM"))
            {
                str = AdditionalFields["SYSTEM"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);
            str = "";
            if (AdditionalFields.ContainsKey("SYSTEM_J"))
            {
                str = AdditionalFields["SYSTEM_J"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);

            w.Write(unicodeEncoder.GetBytes(tag.Artist));
            w.Write(endString);
            str = "";
            if (AdditionalFields.ContainsKey("AUTHOR_J"))
            {
                str = AdditionalFields["AUTHOR_J"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);

            string dateStr = "";

            if (Date != DateTime.MinValue)
            {
                dateStr = Date.ToString("yyyy/MM/dd");
            }
            else if (tag.RecordingYear != null && tag.RecordingYear.Length == 4)
            {
                dateStr = tag.RecordingYear;
                if (tag.RecordingDayMonth != null && tag.RecordingDayMonth.Length >= 4)
                {
                    dateStr += "/" + tag.RecordingDayMonth.Substring(tag.RecordingDayMonth.Length - 2, 2) + "/" + tag.RecordingDayMonth.Substring(0, 2);
                }
            }
            w.Write(unicodeEncoder.GetBytes(dateStr));
            w.Write(endString);

            str = "";
            if (AdditionalFields.ContainsKey("DUMPER"))
            {
                str = AdditionalFields["DUMPER"];
            }
            w.Write(unicodeEncoder.GetBytes(str));
            w.Write(endString);

            w.Write(unicodeEncoder.GetBytes(tag.Comment));
            w.Write(endString);

            w.Write(endString); // Is supposed to be there, according to sample files

            int size = (int)(w.BaseStream.Position - sizePos - 4);

            w.BaseStream.Seek(sizePos, SeekOrigin.Begin);
            w.Write(size);

            return(result);
        }
Beispiel #5
0
        private TagData toTagData()
        {
            TagData result = new TagData();

            result.Title              = Title;
            result.Artist             = Artist;
            result.Composer           = Composer;
            result.Comment            = Comment;
            result.Genre              = Genre;
            result.OriginalArtist     = OriginalArtist;
            result.OriginalAlbum      = OriginalAlbum;
            result.GeneralDescription = Description;
            result.Rating             = (Popularity * 5).ToString();
            result.Copyright          = Copyright;
            result.Publisher          = Publisher;
            if (!PublishingDate.Equals(DateTime.MinValue))
            {
                result.PublishingDate = TrackUtils.FormatISOTimestamp(PublishingDate);
            }
            result.AlbumArtist = AlbumArtist;
            result.Conductor   = Conductor;
            if (!Date.Equals(DateTime.MinValue))
            {
                result.RecordingDate = TrackUtils.FormatISOTimestamp(Date);
            }
            result.RecordingYear            = Year.ToString();
            result.Album                    = Album;
            result.TrackNumber              = TrackNumber.ToString();
            result.TrackTotal               = TrackTotal.ToString();
            result.DiscNumber               = DiscNumber.ToString();
            result.DiscTotal                = DiscTotal.ToString();
            result.ChaptersTableDescription = ChaptersTableDescription.ToString();

            result.Chapters = new List <ChapterInfo>();
            foreach (ChapterInfo chapter in Chapters)
            {
                result.Chapters.Add(new ChapterInfo(chapter));
            }

            if (Lyrics != null)
            {
                result.Lyrics = new LyricsInfo(Lyrics);
            }

            foreach (string s in AdditionalFields.Keys)
            {
                result.AdditionalFields.Add(new MetaFieldInfo(MetaDataIOFactory.TAG_ANY, s, AdditionalFields[s]));
            }

            // Detect and tag deleted Additional fields (=those which were in initialAdditionalFields and do not appear in AdditionalFields anymore)
            foreach (string s in initialAdditionalFields)
            {
                if (!AdditionalFields.ContainsKey(s))
                {
                    MetaFieldInfo metaFieldToDelete = new MetaFieldInfo(MetaDataIOFactory.TAG_ANY, s, "");
                    metaFieldToDelete.MarkedForDeletion = true;
                    result.AdditionalFields.Add(metaFieldToDelete);
                }
            }

            result.Pictures = new List <PictureInfo>();
            if (currentEmbeddedPictures != null)
            {
                foreach (PictureInfo targetPic in currentEmbeddedPictures)
                {
                    targetPic.TransientFlag = 0;
                }
            }

            if (initialEmbeddedPictures != null && currentEmbeddedPictures != null)
            {
                foreach (PictureInfo picInfo in initialEmbeddedPictures)
                {
                    // Detect and tag deleted pictures (=those which were in initialEmbeddedPictures and do not appear in embeddedPictures anymore)
                    if (!currentEmbeddedPictures.Contains(picInfo))
                    {
                        PictureInfo picToDelete = new PictureInfo(picInfo);
                        picToDelete.MarkedForDeletion = true;
                        result.Pictures.Add(picToDelete);
                    }
                    else // Only add new additions (pictures identical to initial list will be kept, and do not have to make it to the list, or else a duplicate will be created)
                    {
                        foreach (PictureInfo targetPic in currentEmbeddedPictures)
                        {
                            if (targetPic.Equals(picInfo))
                            {
                                // Compare picture contents
                                targetPic.ComputePicHash();

                                if (targetPic.PictureHash != picInfo.PictureHash)
                                {
                                    // A new picture content has been defined for an existing location
                                    result.Pictures.Add(targetPic);

                                    PictureInfo picToDelete = new PictureInfo(picInfo);
                                    picToDelete.MarkedForDeletion = true;
                                    result.Pictures.Add(picToDelete);
                                }

                                targetPic.TransientFlag = 1;
                            }
                        }
                    }
                }

                if (currentEmbeddedPictures != null)
                {
                    foreach (PictureInfo targetPic in currentEmbeddedPictures)
                    {
                        if (0 == targetPic.TransientFlag) // Entirely new pictures without equivalent in initialEmbeddedPictures
                        {
                            result.Pictures.Add(targetPic);
                        }
                    }
                }
            }

            return(result);
        }