From ccda1022ff5631fed78e1f441e1de764aaaa4a9c Mon Sep 17 00:00:00 2001 From: ping Date: Sat, 25 Sep 2021 19:29:22 +0800 Subject: [PATCH 1/3] Write out CHAP frames in start_time order, ref #506 --- mutagen/id3/_tags.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/mutagen/id3/_tags.py b/mutagen/id3/_tags.py index c49dba29..701011a9 100644 --- a/mutagen/id3/_tags.py +++ b/mutagen/id3/_tags.py @@ -186,7 +186,9 @@ def _write(self, config): order = ["TIT2", "TPE1", "TRCK", "TALB", "TPOS", "TDRC", "TCON"] framedata = [ - (f, save_frame(f, config=config)) for f in self.values()] + (f, save_frame(f, config=config)) for f in self.values() + if f.FrameID != "CHAP" # sort CHAP separately, see below + ] def get_prio(frame): try: @@ -200,6 +202,13 @@ def sort_key(items): framedata = [d for (f, d) in sorted(framedata, key=sort_key)] + # Sort CHAP frames by start_time, ref #506 + chapter_frames = sorted( + [f for f in self.values() if f.FrameID == "CHAP"], + key=lambda c: c.start_time + ) + framedata.extend([save_frame(f, config=config) for f in chapter_frames]) + # only write unknown frames if they were loaded from the version # we are saving with. Theoretically we could upgrade frames # but some frames can be nested like CHAP, so there is a chance From 7a7f9fa684983672fa77e9d7eba9154a2965d8b0 Mon Sep 17 00:00:00 2001 From: ping Date: Tue, 18 Apr 2023 15:19:54 +0800 Subject: [PATCH 2/3] Implement changes requested in #506 --- mutagen/id3/_tags.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mutagen/id3/_tags.py b/mutagen/id3/_tags.py index 701011a9..b747e072 100644 --- a/mutagen/id3/_tags.py +++ b/mutagen/id3/_tags.py @@ -186,9 +186,7 @@ def _write(self, config): order = ["TIT2", "TPE1", "TRCK", "TALB", "TPOS", "TDRC", "TCON"] framedata = [ - (f, save_frame(f, config=config)) for f in self.values() - if f.FrameID != "CHAP" # sort CHAP separately, see below - ] + (f, save_frame(f, config=config)) for f in self.values()] def get_prio(frame): try: @@ -198,16 +196,18 @@ def get_prio(frame): def sort_key(items): frame, data = items - return (get_prio(frame), len(data), frame.HashKey) + frame_key = frame.HashKey + frame_size = len(data) - framedata = [d for (f, d) in sorted(framedata, key=sort_key)] + # Let's ensure chapters are always sorted by their 'start_time' + # and not by size/element_id pair. + if frame.FrameID == "CHAP": + frame_key = frame.FrameID + frame_size = frame.start_time - # Sort CHAP frames by start_time, ref #506 - chapter_frames = sorted( - [f for f in self.values() if f.FrameID == "CHAP"], - key=lambda c: c.start_time - ) - framedata.extend([save_frame(f, config=config) for f in chapter_frames]) + return (get_prio(frame), frame_key, frame_size) + + framedata = [d for (f, d) in sorted(framedata, key=sort_key)] # only write unknown frames if they were loaded from the version # we are saving with. Theoretically we could upgrade frames From 8bb846c10493e2f3222b987b7780266840aed1f9 Mon Sep 17 00:00:00 2001 From: ping Date: Tue, 18 Apr 2023 15:27:14 +0800 Subject: [PATCH 3/3] Fix typo in suggestion --- mutagen/id3/_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mutagen/id3/_tags.py b/mutagen/id3/_tags.py index b747e072..5325440e 100644 --- a/mutagen/id3/_tags.py +++ b/mutagen/id3/_tags.py @@ -205,7 +205,7 @@ def sort_key(items): frame_key = frame.FrameID frame_size = frame.start_time - return (get_prio(frame), frame_key, frame_size) + return (get_prio(frame), frame_size, frame_key) framedata = [d for (f, d) in sorted(framedata, key=sort_key)]