예제 #1
0
        public void TestPicturesAreCopied()
        {
            string tempFile = TestPath.Samples + "tmpwrite_sample_v2_only.mp3";

            System.IO.File.Copy(sample_file, tempFile, true);

            // Put a picture on the starting file
            File file    = TagLib.File.Create(tempFile);
            var  picture = new Picture(TestPath.Samples + "sample_gimp.gif")
            {
                Type        = PictureType.BackCover,
                Description = "TEST description 1"
            };

            file.Tag.Pictures = new[] { picture };
            file.Save();

            Assert.IsTrue(file.Tag.Pictures.Count() == 1, "File should start with 1 picture");

            // Now construct a new tag with a title, APIC and GEOB frame

            var tag = new TagLib.Id3v2.Tag();

            tag.Title = "FOOBAR";

            // single red dot (1x1 px red image) APIC frame found in wild
            var redDot = new byte[] { 65, 80, 73, 67, 0, 0, 0, 155, 0, 0, 0, 105, 109, 97, 103, 101, 47, 112, 110, 103, 0, 3, 0, 137, 80, 78,
                                      71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0, 1, 0, 0, 0, 1, 8, 2, 0, 0, 0, 144, 119, 83, 222, 0, 0, 0, 4, 103, 65,
                                      77, 65, 0, 0, 177, 143, 11, 252, 97, 5, 0, 0, 0, 9, 112, 72, 89, 115, 0, 0, 11, 18, 0, 0, 11, 18, 1, 210, 221, 126, 252, 0, 0, 0,
                                      24, 116, 69, 88, 116, 83, 111, 102, 116, 119, 97, 114, 101, 0, 112, 97, 105, 110, 116, 46, 110, 101, 116, 32, 52, 46, 49, 46, 53,
                                      100, 71, 88, 82, 0, 0, 0, 12, 73, 68, 65, 84, 24, 87, 99, 248, 47, 162, 0, 0, 3, 73, 1, 52, 163, 224, 5, 179, 0, 0, 0, 0, 73, 69,
                                      78, 68, 174, 66, 96, 130 };
            var pictureFrame = new TagLib.Id3v2.AttachmentFrame(redDot, 3);

            var geobFrame = new TagLib.Id3v2.AttachmentFrame();

            geobFrame.MimeType    = "plain/text";
            geobFrame.Description = "random";
            geobFrame.Type        = PictureType.NotAPicture;
            geobFrame.Data        = "random text in geob";

            tag.AddFrame(pictureFrame);
            tag.AddFrame(geobFrame);

            tag.CopyTo(file.Tag, false);

            Assert.AreEqual("MP3 title", file.Tag.Title, "Title shouldn't be copied if overwrite=false");
            Assert.AreEqual(1, file.Tag.Pictures.Count(), "GEOB/APIC frames shouldn't be copied if overwrite=false");

            tag.CopyTo(file.Tag, true);

            Assert.AreEqual(tag.Title, file.Tag.Title, "Title wasn't copied");
            Assert.AreEqual(tag.Pictures.Count(), file.Tag.Pictures.Count(), "GEOB/APIC frames weren't copied");
        }
예제 #2
0
        /// <summary>
        /// This refreshes the file to get rid of unused bytes and saves all made changes.
        /// </summary>
        /// <param name="Item"></param>
        /// <param name="Source"></param>

        public static void Refresh(this TagLib.File Item, string Source)
        {
            Item.Save();
            Item.Dispose();

            TagLib.File tagFile = TagLib.File.Create(Source);
            TagLib.Tag  tempTag = new TagLib.Id3v2.Tag();
            tagFile.Tag.CopyTo(tempTag, true);
            tagFile.RemoveTags(TagLib.TagTypes.AllTags);
            tagFile.Save();
            tagFile.Dispose();


            TagLib.File tagFile2 = TagLib.File.Create(Source);
            tempTag.CopyTo(tagFile2.Tag, true);
            tagFile2.Save();
            tagFile2.Dispose();
        }
예제 #3
0
        private void GetTags()
        {
            using (TagLib.File file = TagLib.File.Create(MediaFile.FullName))
            {
                DateTime id3v1Start = DateTime.Now;

                try
                {
                    TagLib.Id3v1.Tag v1Tag = (TagLib.Id3v1.Tag)file.GetTag(TagLib.TagTypes.Id3v1);
                    ID3V1Tag = new TagLib.Id3v1.Tag();
                    v1Tag.CopyTo(ID3V1Tag, true);
                }
                catch
                {
                    ID3V1Tag = null;
                }

                DateTime id3v1End = DateTime.Now;

                if (Globals.VerboseLogging)
                {
                    Logger.Info($"'{MediaFile.FullName}' ID3V1 tag loaded in {(id3v1End - id3v1Start).TotalMilliseconds} milliseconds.");
                }

                DateTime id3v2Start = DateTime.Now;

                TagLib.Id3v2.Tag v2Tag = (TagLib.Id3v2.Tag)file.GetTag(TagLib.TagTypes.Id3v2);
                ID3V2Tag = new TagLib.Id3v2.Tag();
                v2Tag.CopyTo(ID3V2Tag, true);

                DateTime id3v2End = DateTime.Now;

                if (Globals.VerboseLogging)
                {
                    Logger.Info($"'{MediaFile.FullName}' ID3V2 tag loaded in {(id3v2End - id3v2Start).TotalMilliseconds} milliseconds.");
                }
            }

            ExecuteTagEdits();
        }
예제 #4
0
        private void ExecuteTagEdits()
        {
            if (!((SetDiscAndSetNumber && ID3V2Tag.DiscCount == 0 && (ID3V2Tag.Disc == 0 || ID3V2Tag.Disc == 1)) ||
                  (FramesToRemove != null && FramesToRemove.Any(f => !string.IsNullOrWhiteSpace(f)) &&
                   ID3V2Tag.Frames.Any(f => FramesToRemove.Contains(f.FrameId.ToString())))))
            {
                return;
            }

            string editFile = MediaFile.FullName;

            if (EditAlternateFile)
            {
                if (string.IsNullOrWhiteSpace(EditFilePath))
                {
                    Logger.Info($"AlternatePath not specified in App.config file.");
                }

                editFile = editFile.Replace(ScanFilePath, EditFilePath);
            }

            TagLib.Id3v2.Tag.UseNumericGenres = false;

            if (File.Exists(editFile))
            {
                if (SetDiscAndSetNumber && ID3V2Tag.DiscCount == 0 &&
                    (ID3V2Tag.Disc == 0 || ID3V2Tag.Disc == 1))
                {
                    Logger.Info($"Adding disc number and disc total.");

                    using (TagLib.File tagFile = TagLib.File.Create(editFile))
                    {
                        tagFile.Tag.Disc      = 1;
                        tagFile.Tag.DiscCount = 1;
                        tagFile.Save();
                    }

                    using (TagLib.File tagFile3 = TagLib.File.Create(editFile))
                    {
                        TagLib.Id3v2.Tag v2Tag = (TagLib.Id3v2.Tag)tagFile3.GetTag(TagLib.TagTypes.Id3v2);
                        ID3V2Tag = new TagLib.Id3v2.Tag();
                        v2Tag.CopyTo(ID3V2Tag, true);
                    }
                }

                if (FramesToRemove != null && FramesToRemove.Any(f => !string.IsNullOrWhiteSpace(f)) &&
                    ID3V2Tag.Frames.Any(f => FramesToRemove.Contains(f.FrameId.ToString())))
                {
                    Logger.Info($"Removing extra frames from '{editFile}'.");

                    DateTime editStart = DateTime.Now;

                    try
                    {
                        TagLib.Tag tempTag = null;
                        tempTag = new TagLib.Id3v2.Tag();

                        using (TagLib.File tagFile = TagLib.File.Create(editFile))
                        {
                            TagLib.Id3v2.Tag v2Tag = (TagLib.Id3v2.Tag)tagFile.GetTag(TagLib.TagTypes.Id3v2);
                            v2Tag.CopyTo(tempTag, true);
                            tagFile.RemoveTags(TagLib.TagTypes.Id3v2);
                            tagFile.Save();
                        }

                        foreach (var frame in FramesToRemove.Where(f => !string.IsNullOrWhiteSpace(f)))
                        {
                            ((TagLib.Id3v2.Tag)tempTag).RemoveFrames(TagLib.ByteVector.FromString(frame, TagLib.StringType.UTF8));
                        }

                        using (TagLib.File tagFile2 = TagLib.File.Create(editFile))
                        {
                            tempTag.CopyTo(tagFile2.Tag, true);
                            tagFile2.Save();
                        }

                        using (TagLib.File tagFile3 = TagLib.File.Create(editFile))
                        {
                            TagLib.Id3v2.Tag v2Tag = (TagLib.Id3v2.Tag)tagFile3.GetTag(TagLib.TagTypes.Id3v2);
                            ID3V2Tag = new TagLib.Id3v2.Tag();
                            v2Tag.CopyTo(ID3V2Tag, true);
                        }

                        tempTag = null;
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("", ex);
                    }

                    DateTime editEnd = DateTime.Now;

                    if (Globals.VerboseLogging)
                    {
                        Logger.Info($"'{editFile}' ID3V2 tag edited in {(editEnd - editStart).TotalMilliseconds} milliseconds.");
                    }
                }
            }
            else
            {
                Logger.Info($"Alternate file '{editFile}' does not exist.");
            }
        }