From 563d0836489cb314601b3e6084413c655b5733b7 Mon Sep 17 00:00:00 2001 From: Emre Yolcu Date: Fri, 14 Aug 2026 21:21:38 -0400 Subject: [PATCH] Fix deletion of empty MP4 tuple fields --- docs/changelog.rst | 2 ++ mediafile/storage/mp4.py | 2 +- test/test_mediafile.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index c7af254..c39e119 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,8 @@ Upcoming - Fixed parsing of compact ``YYYYMMDD`` date strings (no separators) being misread as a year value. +- Fixed a bug where deleting MP4 track and disc metadata left ``trkn`` and + ``disk`` atoms containing ``(0, 0)``. v0.17.0 ------- diff --git a/mediafile/storage/mp4.py b/mediafile/storage/mp4.py index 3098f18..e792314 100644 --- a/mediafile/storage/mp4.py +++ b/mediafile/storage/mp4.py @@ -48,7 +48,7 @@ def set(self, mutagen_file, value): self.store(mutagen_file, items) def delete(self, mutagen_file): - if self.index == 0: + if self.index == 0 or self.deserialize(self.fetch(mutagen_file))[0] == 0: super().delete(mutagen_file) else: self.set(mutagen_file, None) diff --git a/test/test_mediafile.py b/test/test_mediafile.py index a6be425..d7a82f3 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -823,6 +823,39 @@ class MP4Test( "channels": 2, } + def test_delete_packed_fields_removes_atoms(self): + mediafile = self._mediafile_fixture("full") + + delattr(mediafile, "track") + delattr(mediafile, "tracktotal") + delattr(mediafile, "disc") + delattr(mediafile, "disctotal") + + mediafile.save() + mediafile = MediaFile(mediafile.filename) + + self.assertNotIn("trkn", mediafile.mgfile.tags) + self.assertNotIn("disk", mediafile.mgfile.tags) + + def test_delete_packed_total_without_number_removes_atoms(self): + mediafile = self._mediafile_fixture("empty") + + mediafile.tracktotal = 3 + mediafile.disctotal = 5 + mediafile.save() + + mediafile = MediaFile(mediafile.filename) + self.assertIn("trkn", mediafile.mgfile.tags) + self.assertIn("disk", mediafile.mgfile.tags) + + delattr(mediafile, "tracktotal") + delattr(mediafile, "disctotal") + mediafile.save() + + mediafile = MediaFile(mediafile.filename) + self.assertNotIn("trkn", mediafile.mgfile.tags) + self.assertNotIn("disk", mediafile.mgfile.tags) + def test_add_tiff_image_fails(self): mediafile = self._mediafile_fixture("empty") with self.assertRaises(ValueError):