Skip to content

Commit 62852cb

Browse files
AyaseFileSerial-ATA
authored andcommitted
fix: incorrect disc number handling in ape tag writer
1 parent a5b0906 commit 62852cb

File tree

2 files changed

+60
-6
lines changed

2 files changed

+60
-6
lines changed

lofty/src/ape/tag/mod.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,11 @@ impl Accessor for ApeTag {
285285
}
286286

287287
fn remove_disk_total(&mut self) {
288-
let existing_track_number = self.track();
288+
let existing_disk_number = self.disk();
289289
self.remove("Disc");
290290

291-
if let Some(track) = existing_track_number {
292-
self.insert(ApeItem::text("Disc", track.to_string()));
291+
if let Some(disk) = existing_disk_number {
292+
self.insert(ApeItem::text("Disc", disk.to_string()));
293293
}
294294
}
295295

@@ -564,7 +564,7 @@ pub(crate) fn tagitems_into_ape(tag: &Tag) -> impl Iterator<Item = ApeItemRef<'_
564564
.chain(create_apeitemref_for_number_pair(
565565
tag.get_string(ItemKey::DiscNumber),
566566
tag.get_string(ItemKey::DiscTotal),
567-
"Disk",
567+
"Disc",
568568
))
569569
}
570570

@@ -947,4 +947,18 @@ mod tests {
947947

948948
assert_eq!(ape.len(), 1);
949949
}
950+
951+
#[test_log::test]
952+
fn remove_disk_total_preserves_disk_number() {
953+
let mut ape = ApeTag::new();
954+
ape.set_track(2);
955+
ape.set_disk(3);
956+
ape.set_disk_total(5);
957+
958+
ape.remove_disk_total();
959+
960+
assert_eq!(ape.disk(), Some(3));
961+
assert!(ape.disk_total().is_none());
962+
assert_eq!(ape.track(), Some(2));
963+
}
950964
}

lofty/tests/files/wavpack.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::{set_artist, temp_file, verify_artist};
2-
use lofty::config::ParseOptions;
2+
use lofty::ape::ApeTag;
3+
use lofty::config::{ParseOptions, WriteOptions};
34
use lofty::file::FileType;
45
use lofty::prelude::*;
56
use lofty::probe::Probe;
6-
use lofty::tag::TagType;
7+
use lofty::tag::{Tag, TagType};
78

89
use std::io::Seek;
910

@@ -77,3 +78,42 @@ fn read_no_properties() {
7778
fn read_no_tags() {
7879
crate::no_tag_test!("tests/files/assets/minimal/full_test.wv");
7980
}
81+
82+
#[test_log::test]
83+
fn write_ape_disc_key() {
84+
let mut file = crate::temp_file!("tests/files/assets/minimal/full_test.wv");
85+
let mut tagged_file = Probe::new(&mut file)
86+
.options(ParseOptions::new())
87+
.guess_file_type()
88+
.unwrap()
89+
.read()
90+
.unwrap();
91+
92+
// Create and insert a new Tag and set disk information
93+
let mut tag = Tag::new(TagType::Ape);
94+
tag.set_disk(3);
95+
tag.set_disk_total(5);
96+
tagged_file.insert_tag(tag);
97+
file.rewind().unwrap();
98+
tagged_file
99+
.save_to(&mut file, WriteOptions::default())
100+
.unwrap();
101+
102+
// Reread the file to get the actual APE tag
103+
file.rewind().unwrap();
104+
let reread_tagged_file = Probe::new(&mut file)
105+
.options(ParseOptions::new())
106+
.guess_file_type()
107+
.unwrap()
108+
.read()
109+
.unwrap();
110+
let tag_ref = reread_tagged_file.tag(TagType::Ape).unwrap();
111+
let ape_tag: ApeTag = tag_ref.clone().into();
112+
113+
assert!(
114+
ape_tag.get("Disc").is_some(),
115+
"APE tag should contain `Disc` key with disk information"
116+
);
117+
assert_eq!(ape_tag.disk(), Some(3));
118+
assert_eq!(ape_tag.disk_total(), Some(5));
119+
}

0 commit comments

Comments
 (0)