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