From 58354679c55a6c987d5d7dd25ff8ac1c86803450 Mon Sep 17 00:00:00 2001 From: Serial <69764315+Serial-ATA@users.noreply.github.com> Date: Mon, 13 Sep 2021 17:08:16 -0400 Subject: [PATCH] Move TagItem structs out of types::tag --- src/lib.rs | 7 +- src/logic/ape/tag/read.rs | 4 +- src/logic/ape/tag/write.rs | 3 +- src/logic/id3/v1.rs | 4 +- src/logic/id3/v2/frame/header.rs | 2 +- src/logic/id3/v2/frame/mod.rs | 2 +- src/logic/iff/aiff/read.rs | 4 +- src/logic/iff/aiff/write.rs | 4 +- src/logic/iff/wav/read.rs | 4 +- src/logic/iff/wav/write.rs | 3 +- src/logic/mp4/ilst/read.rs | 4 +- src/logic/mp4/ilst/write.rs | 7 +- src/logic/ogg/flac/write.rs | 4 +- src/logic/ogg/read.rs | 4 +- src/logic/ogg/write.rs | 4 +- src/types/file.rs | 4 +- src/types/item.rs | 158 ++++++++++++++++++++++++++++++ src/types/tag.rs | 160 +------------------------------ 18 files changed, 195 insertions(+), 187 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b92e3acc..df105240 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -133,11 +133,14 @@ pub use crate::probe::Probe; pub use crate::types::{ file::{FileType, TaggedFile}, - item::ItemKey, + item::{ItemKey, ItemValue, TagItem}, properties::FileProperties, - tag::{ItemValue, Tag, TagItem, TagItemFlags, TagType}, + tag::{Tag, TagType}, }; +#[cfg(any(feature = "id3v2", feature = "ape"))] +pub use crate::types::item::TagItemFlags; + mod types; /// Various concrete file types, used when inference is unnecessary diff --git a/src/logic/ape/tag/read.rs b/src/logic/ape/tag/read.rs index 740e4ba3..dad9f8d9 100644 --- a/src/logic/ape/tag/read.rs +++ b/src/logic/ape/tag/read.rs @@ -1,7 +1,7 @@ use crate::error::{LoftyError, Result}; use crate::logic::ape::constants::INVALID_KEYS; -use crate::types::item::ItemKey; -use crate::types::tag::{ItemValue, Tag, TagItem, TagItemFlags, TagType}; +use crate::types::item::{ItemKey, ItemValue, TagItem, TagItemFlags}; +use crate::types::tag::{Tag, TagType}; use std::io::{Read, Seek, SeekFrom}; use std::ops::Neg; diff --git a/src/logic/ape/tag/write.rs b/src/logic/ape/tag/write.rs index 83332042..0f6ccdbc 100644 --- a/src/logic/ape/tag/write.rs +++ b/src/logic/ape/tag/write.rs @@ -4,8 +4,9 @@ use crate::logic::ape::constants::APE_PREAMBLE; use crate::logic::id3::find_lyrics3v2; use crate::logic::id3::v1::find_id3v1; use crate::logic::id3::v2::find_id3v2; +use crate::types::item::{ItemValue, TagItem}; use crate::types::picture::Picture; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::tag::{Tag, TagType}; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; diff --git a/src/logic/id3/v1.rs b/src/logic/id3/v1.rs index c29cb227..3244d372 100644 --- a/src/logic/id3/v1.rs +++ b/src/logic/id3/v1.rs @@ -1,7 +1,7 @@ use super::constants::GENRES; use crate::error::Result; -use crate::types::item::ItemKey; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::item::{ItemKey, ItemValue, TagItem}; +use crate::types::tag::{Tag, TagType}; use byteorder::WriteBytesExt; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; diff --git a/src/logic/id3/v2/frame/header.rs b/src/logic/id3/v2/frame/header.rs index d678da1b..1789d91e 100644 --- a/src/logic/id3/v2/frame/header.rs +++ b/src/logic/id3/v2/frame/header.rs @@ -1,6 +1,6 @@ use crate::error::{LoftyError, Result}; use crate::logic::id3::v2::util::upgrade::{upgrade_v2, upgrade_v3}; -use crate::types::tag::TagItemFlags; +use crate::types::item::TagItemFlags; use std::io::Read; diff --git a/src/logic/id3/v2/frame/mod.rs b/src/logic/id3/v2/frame/mod.rs index 016bf490..eb56e023 100644 --- a/src/logic/id3/v2/frame/mod.rs +++ b/src/logic/id3/v2/frame/mod.rs @@ -4,7 +4,7 @@ mod header; use crate::error::{LoftyError, Result}; use crate::logic::id3::v2::frame::content::{parse_content, FrameContent}; use crate::logic::id3::v2::Id3v2Version; -use crate::types::tag::TagItemFlags; +use crate::types::item::TagItemFlags; use header::{parse_header, parse_v2_header}; use std::io::Read; diff --git a/src/logic/iff/aiff/read.rs b/src/logic/iff/aiff/read.rs index e6fc0a7c..6e308df4 100644 --- a/src/logic/iff/aiff/read.rs +++ b/src/logic/iff/aiff/read.rs @@ -1,9 +1,9 @@ use super::AiffFile; use crate::error::{LoftyError, Result}; use crate::logic::id3::v2::read::parse_id3v2; -use crate::types::item::ItemKey; +use crate::types::item::{ItemKey, ItemValue, TagItem}; use crate::types::properties::FileProperties; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::tag::{Tag, TagType}; use std::io::{Read, Seek, SeekFrom}; use std::time::Duration; diff --git a/src/logic/iff/aiff/write.rs b/src/logic/iff/aiff/write.rs index a6df28c3..bd69c6dc 100644 --- a/src/logic/iff/aiff/write.rs +++ b/src/logic/iff/aiff/write.rs @@ -1,7 +1,7 @@ use super::read::verify_aiff; use crate::error::{LoftyError, Result}; -use crate::types::item::ItemKey; -use crate::types::tag::{ItemValue, Tag, TagType}; +use crate::types::item::{ItemKey, ItemValue}; +use crate::types::tag::{Tag, TagType}; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; diff --git a/src/logic/iff/wav/read.rs b/src/logic/iff/wav/read.rs index b42a12a3..b3a494f4 100644 --- a/src/logic/iff/wav/read.rs +++ b/src/logic/iff/wav/read.rs @@ -1,9 +1,9 @@ use super::WavFile; use crate::error::{LoftyError, Result}; use crate::logic::id3::v2::read::parse_id3v2; -use crate::types::item::ItemKey; +use crate::types::item::{ItemKey, ItemValue, TagItem}; use crate::types::properties::FileProperties; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::tag::{Tag, TagType}; use std::io::{Read, Seek, SeekFrom}; use std::time::Duration; diff --git a/src/logic/iff/wav/write.rs b/src/logic/iff/wav/write.rs index 055c771b..521f5ab3 100644 --- a/src/logic/iff/wav/write.rs +++ b/src/logic/iff/wav/write.rs @@ -1,6 +1,7 @@ use super::read::verify_wav; use crate::error::{LoftyError, Result}; -use crate::types::tag::{ItemValue, Tag, TagType}; +use crate::types::item::ItemValue; +use crate::types::tag::{Tag, TagType}; use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; diff --git a/src/logic/mp4/ilst/read.rs b/src/logic/mp4/ilst/read.rs index fc470a89..3c82edca 100644 --- a/src/logic/mp4/ilst/read.rs +++ b/src/logic/mp4/ilst/read.rs @@ -3,9 +3,9 @@ use crate::logic::id3::v2::util::text_utils::utf16_decode; use crate::logic::id3::v2::TextEncoding; use crate::logic::mp4::atom::Atom; use crate::logic::mp4::read::skip_unneeded; -use crate::types::item::ItemKey; +use crate::types::item::{ItemKey, ItemValue, TagItem}; use crate::types::picture::{MimeType, Picture, PictureInformation, PictureType}; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::tag::{Tag, TagType}; use std::borrow::Cow; use std::io::{Cursor, Read, Seek, SeekFrom}; diff --git a/src/logic/mp4/ilst/write.rs b/src/logic/mp4/ilst/write.rs index 1ba894d4..fb56fcfe 100644 --- a/src/logic/mp4/ilst/write.rs +++ b/src/logic/mp4/ilst/write.rs @@ -2,14 +2,15 @@ use crate::error::{LoftyError, Result}; use crate::logic::mp4::moov::Moov; use crate::logic::mp4::read::nested_atom; use crate::logic::mp4::read::verify_mp4; -use crate::types::tag::{ItemValue, Tag, TagType}; +use crate::picture::MimeType; +use crate::types::item::ItemValue; +use crate::types::picture::Picture; +use crate::types::tag::{Tag, TagType}; use std::convert::TryInto; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; -use crate::picture::MimeType; -use crate::types::picture::Picture; use byteorder::{BigEndian, WriteBytesExt}; pub(in crate::logic) fn write_to(data: &mut File, tag: &Tag) -> Result<()> { diff --git a/src/logic/ogg/flac/write.rs b/src/logic/ogg/flac/write.rs index d0b5ba9e..f0551dbf 100644 --- a/src/logic/ogg/flac/write.rs +++ b/src/logic/ogg/flac/write.rs @@ -3,8 +3,8 @@ use super::read::verify_flac; use crate::error::{LoftyError, Result}; use crate::logic::ogg::write::create_comments; use crate::picture::Picture; -use crate::types::item::ItemKey; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::item::{ItemKey, ItemValue, TagItem}; +use crate::types::tag::{Tag, TagType}; use std::fs::File; use std::io::{Cursor, Read, Seek, SeekFrom, Write}; diff --git a/src/logic/ogg/read.rs b/src/logic/ogg/read.rs index 78bc4d07..25c8e495 100644 --- a/src/logic/ogg/read.rs +++ b/src/logic/ogg/read.rs @@ -2,9 +2,9 @@ use super::verify_signature; use crate::error::{LoftyError, Result}; use crate::logic::ogg::constants::OPUSHEAD; use crate::picture::Picture; -use crate::types::item::ItemKey; +use crate::types::item::{ItemKey, ItemValue, TagItem}; use crate::types::properties::FileProperties; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::tag::{Tag, TagType}; use std::io::{Read, Seek, SeekFrom}; diff --git a/src/logic/ogg/write.rs b/src/logic/ogg/write.rs index c7c34f48..c6d2e0fa 100644 --- a/src/logic/ogg/write.rs +++ b/src/logic/ogg/write.rs @@ -2,8 +2,8 @@ use super::{page_from_packet, verify_signature}; use crate::error::{LoftyError, Result}; use crate::logic::ogg::constants::OPUSTAGS; use crate::logic::ogg::constants::VORBIS_COMMENT_HEAD; -use crate::types::item::ItemKey; -use crate::types::tag::{ItemValue, Tag, TagItem, TagType}; +use crate::types::item::{ItemKey, ItemValue, TagItem}; +use crate::types::tag::{Tag, TagType}; use std::convert::TryFrom; use std::fs::File; diff --git a/src/types/file.rs b/src/types/file.rs index 5f69ac62..e30bfb18 100644 --- a/src/types/file.rs +++ b/src/types/file.rs @@ -1,6 +1,6 @@ -use super::item::ItemKey; +use super::item::{ItemKey, ItemValue, TagItem}; use super::properties::FileProperties; -use super::tag::{ItemValue, Tag, TagItem, TagType}; +use super::tag::{Tag, TagType}; use crate::error::{LoftyError, Result}; use crate::logic::ape::ApeFile; use crate::logic::iff::aiff::AiffFile; diff --git a/src/types/item.rs b/src/types/item.rs index d2ed5d53..65b4732a 100644 --- a/src/types/item.rs +++ b/src/types/item.rs @@ -423,3 +423,161 @@ item_keys!( TagType::VorbisComments => "LYRICS", TagType::Ape => "Lyrics" ] ); + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +/// Represents a tag item's value +/// +/// NOTES: +/// +/// * The [Locator][ItemValue::Locator] variant is only applicable to APE and ID3v2 tags. +/// * The [Binary][ItemValue::Binary] variant is only applicable to APE tags. +/// * Attempting to write either to another file/tag type will **not** error, they will just be ignored. +pub enum ItemValue { + /// Any UTF-8 encoded text + Text(String), + /// **(APE/ID3v2 ONLY)** Any UTF-8 encoded locator of external information + Locator(String), + /// **(APE/ID3v2/MP4 ONLY)** Binary information + /// + /// In the case of ID3v2, this is the type of a [`Id3v2Frame::EncapsulatedObject`](crate::id3::Id3v2Frame::EncapsulatedObject) **and** any unknown frame. + /// + /// For APEv2, no uses of this item type are documented, there's no telling what it could be. + Binary(Vec), + /// Any 32 bit unsigned integer + /// + /// This is most commonly used for items such as track and disc numbers + UInt(u32), + /// **(MP4 ONLY)** Any 64 bit unsigned integer + /// + /// There are no common [`ItemKey`]s that use this + UInt64(u64), + /// Any 32 bit signed integer + /// + /// There are no common [`ItemKey`]s that use this + Int(i32), + /// **(MP4 ONLY)** Any 64 bit signed integer + /// + /// There are no common [`ItemKey`]s that use this + Int64(i64), + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** The content of a synchronized text frame, see [`SynchronizedText`](crate::id3::SynchronizedText) + SynchronizedText(Vec<(u32, String)>), +} + +#[cfg(any(feature = "id3v2", feature = "ape"))] +#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)] +#[allow(clippy::struct_excessive_bools)] +/// **(ID3v2/APEv2 ONLY)** Various flags to describe the content of an item +/// +/// It is not an error to attempt to write flags to a format that doesn't support them. +/// They will just be ignored. +pub struct TagItemFlags { + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Preserve frame on tag edit + pub tag_alter_preservation: bool, + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Preserve frame on file edit + pub file_alter_preservation: bool, + #[cfg(any(feature = "id3v2", feature = "ape"))] + /// **(ID3v2/APEv2 ONLY)** Item cannot be written to + pub read_only: bool, + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Frame belongs in a group + /// + /// In addition to setting this flag, a group identifier byte must be added. + /// All frames with the same group identifier byte belong to the same group. + pub grouping_identity: (bool, u8), + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Frame is zlib compressed + /// + /// It is **required** `data_length_indicator` be set if this is set. + pub compression: bool, + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Frame is encrypted + /// + /// NOTE: Since the encryption method is unknown, lofty cannot do anything with these frames + /// + /// In addition to setting this flag, an encryption method symbol must be added. + /// The method symbol **must** be > 0x80. + pub encryption: (bool, u8), + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Frame is unsynchronised + /// + /// In short, this makes all "0xFF 0x00" combinations into "0xFF 0x00 0x00" to avoid confusion + /// with the MPEG frame header, which is often identified by its "frame sync" (11 set bits). + /// It is preferred an ID3v2 tag is either *completely* unsynchronised or not unsynchronised at all. + pub unsynchronisation: bool, + #[cfg(feature = "id3v2")] + /// **(ID3v2 ONLY)** Frame has a data length indicator + /// + /// The data length indicator is the size of the frame if the flags were all zeroed out. + /// This is usually used in combination with `compression` and `encryption` (depending on encryption method). + /// + /// In addition to setting this flag, the final size must be added. + pub data_length_indicator: (bool, u32), +} + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +/// Represents a tag item (key/value) +pub struct TagItem { + pub(crate) item_key: ItemKey, + pub(crate) item_value: ItemValue, + #[cfg(any(feature = "id3v2", feature = "ape"))] + pub(crate) flags: TagItemFlags, +} + +impl TagItem { + /// Create a new [`TagItem`] + /// + /// NOTES: + /// + /// * This will check for validity based on the [`TagType`]. + /// * If the [`ItemKey`] does not map to a key in the target format, `None` will be returned. + /// * It is pointless to do this if you plan on using [`Tag::insert_item`], as it does validity checks itself. + pub fn new_checked( + tag_type: &TagType, + item_key: ItemKey, + item_value: ItemValue, + ) -> Option { + item_key.map_key(tag_type).is_some().then(|| Self { + item_key, + item_value, + flags: TagItemFlags::default(), + }) + } + + /// Create a new [`TagItem`] + pub fn new(item_key: ItemKey, item_value: ItemValue) -> Self { + Self { + item_key, + item_value, + flags: TagItemFlags::default(), + } + } + + #[cfg(any(feature = "id3v2", feature = "ape"))] + /// Returns a reference to the [`TagItemFlags`] + pub fn flags(&self) -> &TagItemFlags { + &self.flags + } + + #[cfg(any(feature = "id3v2", feature = "ape"))] + /// Set the item's flags + pub fn set_flags(&mut self, flags: TagItemFlags) { + self.flags = flags + } + + /// Returns a reference to the [`ItemKey`] + pub fn key(&self) -> &ItemKey { + &self.item_key + } + + /// Returns a reference to the [`ItemValue`] + pub fn value(&self) -> &ItemValue { + &self.item_value + } + + pub(crate) fn re_map(&self, tag_type: &TagType) -> Option<()> { + self.item_key.map_key(tag_type).is_some().then(|| ()) + } +} diff --git a/src/types/tag.rs b/src/types/tag.rs index 1d1258ae..3c9a919e 100644 --- a/src/types/tag.rs +++ b/src/types/tag.rs @@ -1,13 +1,12 @@ -use super::item::ItemKey; +use super::item::{ItemKey, ItemValue, TagItem}; use super::picture::{Picture, PictureType}; -use crate::error::Result; +use crate::error::{LoftyError, Result}; #[cfg(feature = "id3v2_restrictions")] use crate::logic::id3::v2::restrictions::TagRestrictions; use crate::probe::Probe; use std::fs::File; -use crate::LoftyError; #[cfg(feature = "quick_tag_accessors")] use paste::paste; @@ -41,161 +40,6 @@ macro_rules! common_items { } } -#[cfg(any(feature = "id3v2", feature = "ape"))] -#[derive(Clone, Debug, PartialEq, Eq, Hash, Default)] -#[allow(clippy::struct_excessive_bools)] -/// **(ID3v2/APEv2 ONLY)** Various flags to describe the content of an item -/// -/// It is not an error to attempt to write flags to a format that doesn't support them. -/// They will just be ignored. -pub struct TagItemFlags { - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Preserve frame on tag edit - pub tag_alter_preservation: bool, - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Preserve frame on file edit - pub file_alter_preservation: bool, - #[cfg(any(feature = "id3v2", feature = "ape"))] - /// **(ID3v2/APEv2 ONLY)** Item cannot be written to - pub read_only: bool, - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Frame belongs in a group - /// - /// In addition to setting this flag, a group identifier byte must be added. - /// All frames with the same group identifier byte belong to the same group. - pub grouping_identity: (bool, u8), - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Frame is zlib compressed - /// - /// It is **required** `data_length_indicator` be set if this is set. - pub compression: bool, - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Frame is encrypted - /// - /// NOTE: Since the encryption method is unknown, lofty cannot do anything with these frames - /// - /// In addition to setting this flag, an encryption method symbol must be added. - /// The method symbol **must** be > 0x80. - pub encryption: (bool, u8), - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Frame is unsynchronised - /// - /// In short, this makes all "0xFF 0x00" combinations into "0xFF 0x00 0x00" to avoid confusion - /// with the MPEG frame header, which is often identified by its "frame sync" (11 set bits). - /// It is preferred an ID3v2 tag is either *completely* unsynchronised or not unsynchronised at all. - pub unsynchronisation: bool, - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** Frame has a data length indicator - /// - /// The data length indicator is the size of the frame if the flags were all zeroed out. - /// This is usually used in combination with `compression` and `encryption` (depending on encryption method). - /// - /// In addition to setting this flag, the final size must be added. - pub data_length_indicator: (bool, u32), -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -/// Represents a tag item (key/value) -pub struct TagItem { - item_key: ItemKey, - item_value: ItemValue, - flags: TagItemFlags, -} - -impl TagItem { - /// Create a new [`TagItem`] - /// - /// NOTES: - /// - /// * This will check for validity based on the [`TagType`]. - /// * If the [`ItemKey`] does not map to a key in the target format, `None` will be returned. - /// * It is pointless to do this if you plan on using [`Tag::insert_item`], as it does validity checks itself. - pub fn new_checked( - tag_type: &TagType, - item_key: ItemKey, - item_value: ItemValue, - ) -> Option { - item_key.map_key(tag_type).is_some().then(|| Self { - item_key, - item_value, - flags: TagItemFlags::default(), - }) - } - - /// Create a new [`TagItem`] - pub fn new(item_key: ItemKey, item_value: ItemValue) -> Self { - Self { - item_key, - item_value, - flags: TagItemFlags::default(), - } - } - - /// Set the item's flags - pub fn set_flags(&mut self, flags: TagItemFlags) { - self.flags = flags - } - - /// Returns a reference to the [`ItemKey`] - pub fn key(&self) -> &ItemKey { - &self.item_key - } - - /// Returns a reference to the [`ItemValue`] - pub fn value(&self) -> &ItemValue { - &self.item_value - } - - /// Returns a reference to the [`TagItemFlags`] - pub fn flags(&self) -> &TagItemFlags { - &self.flags - } - - pub(crate) fn re_map(&self, tag_type: &TagType) -> Option<()> { - self.item_key.map_key(tag_type).is_some().then(|| ()) - } -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -/// Represents a tag item's value -/// -/// NOTES: -/// -/// * The [Locator][ItemValue::Locator] variant is only applicable to APE and ID3v2 tags. -/// * The [Binary][ItemValue::Binary] variant is only applicable to APE tags. -/// * Attempting to write either to another file/tag type will **not** error, they will just be ignored. -pub enum ItemValue { - /// Any UTF-8 encoded text - Text(String), - /// **(APE/ID3v2 ONLY)** Any UTF-8 encoded locator of external information - Locator(String), - /// **(APE/ID3v2/MP4 ONLY)** Binary information - /// - /// In the case of ID3v2, this is the type of a [`Id3v2Frame::EncapsulatedObject`](crate::id3::Id3v2Frame::EncapsulatedObject) **and** any unknown frame. - /// - /// For APEv2, no uses of this item type are documented, there's no telling what it could be. - Binary(Vec), - /// Any 32 bit unsigned integer - /// - /// This is most commonly used for items such as track and disc numbers - UInt(u32), - /// **(MP4 ONLY)** Any 64 bit unsigned integer - /// - /// There are no common [`ItemKey`]s that use this - UInt64(u64), - /// Any 32 bit signed integer - /// - /// There are no common [`ItemKey`]s that use this - Int(i32), - /// **(MP4 ONLY)** Any 64 bit signed integer - /// - /// There are no common [`ItemKey`]s that use this - Int64(i64), - #[cfg(feature = "id3v2")] - /// **(ID3v2 ONLY)** The content of a synchronized text frame, see [`SynchronizedText`](crate::id3::SynchronizedText) - SynchronizedText(Vec<(u32, String)>), -} - #[cfg(feature = "id3v2")] #[derive(Default, Copy, Clone)] #[allow(clippy::struct_excessive_bools)]