From ed0474090876bc5efd410a9e48fd298e54b1e2d4 Mon Sep 17 00:00:00 2001 From: chaos Date: Sun, 12 Nov 2023 13:02:56 +0000 Subject: [PATCH] support setting of album name with tags command --- modules/ffprobe/src/ffprobe_output.rs | 23 ++++++----------------- modules/ffprobe/src/types.rs | 4 +++- modules/taglib/build.rs | 1 - modules/taglib/src/impls/tag.rs | 10 ++++++++++ modules/taglib/src/traits.rs | 3 +++ modules/taglib/src/wrapper.cxx | 10 ++++++++++ modules/taglib/src/wrapper.h | 2 ++ 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/modules/ffprobe/src/ffprobe_output.rs b/modules/ffprobe/src/ffprobe_output.rs index 3482ce0..ef2ef60 100644 --- a/modules/ffprobe/src/ffprobe_output.rs +++ b/modules/ffprobe/src/ffprobe_output.rs @@ -22,30 +22,19 @@ pub struct FFProbeOutputFormat { pub tags: FFProbeOutputTags, } -#[derive(Debug, Clone, Deserialize)] +#[derive(Default, Debug, Clone, Deserialize)] pub struct FFProbeOutputTags { - #[serde(alias = "TRACK", alias = "track")] - pub track_number: Option, - #[serde(alias = "TITLE")] pub title: String, #[serde(default, alias = "ARTIST")] pub artist: String, + #[serde(default, alias = "ALBUM")] + pub album: Option, + #[serde(alias = "TRACK", alias = "track")] + pub track_number: Option, #[serde(default, alias = "REPLAYGAIN_TRACK_PEAK")] pub replaygain_track_peak: Option, #[serde(default, alias = "REPLAYGAIN_TRACK_GAIN")] pub replaygain_track_gain: Option, -} - -impl Default for FFProbeOutputTags { - fn default() -> Self { - FFProbeOutputTags { - title: "".to_string(), - artist: "".to_string(), - replaygain_track_peak: None, - replaygain_track_gain: None, - track_number: None, - } - } -} +} \ No newline at end of file diff --git a/modules/ffprobe/src/types.rs b/modules/ffprobe/src/types.rs index 597a0d6..01f8fa6 100644 --- a/modules/ffprobe/src/types.rs +++ b/modules/ffprobe/src/types.rs @@ -2,10 +2,11 @@ use serde::Serialize; use super::ffprobe_output; -#[derive(Debug, Clone, Serialize)] +#[derive(Default, Debug, Clone, Serialize)] pub struct FFProbeTags { pub title: String, pub artist: String, + pub album: Option, pub replaygain_track_peak: Option, pub replaygain_track_gain: Option, pub track_number: Option, @@ -30,6 +31,7 @@ impl From for FFProbeTags { FFProbeTags { title: val.title, artist: val.artist, + album: val.album, replaygain_track_peak: val.replaygain_track_peak, replaygain_track_gain: val.replaygain_track_gain, track_number, diff --git a/modules/taglib/build.rs b/modules/taglib/build.rs index 3637b30..6da3bfb 100644 --- a/modules/taglib/build.rs +++ b/modules/taglib/build.rs @@ -24,7 +24,6 @@ fn main() { let bindings = bindgen::Builder::default() .header("src/wrapper.h") - .parse_callbacks(Box::new(bindgen::CargoCallbacks)) .generate() .expect("Unable to generate bindings"); diff --git a/modules/taglib/src/impls/tag.rs b/modules/taglib/src/impls/tag.rs index 4330711..e2b2670 100644 --- a/modules/taglib/src/impls/tag.rs +++ b/modules/taglib/src/impls/tag.rs @@ -27,6 +27,16 @@ impl Tag for TagLibTag { unsafe { bindings::wrap_taglib_tag_set_artist(self.ctx, artist.as_ptr()) }; } + fn album(&self) -> Option { + let album_ref = unsafe { bindings::wrap_taglib_tag_album(self.ctx) }; + + c_str_to_str(album_ref) + } + fn set_album(&mut self, album: String) { + let album = CString::new(album).unwrap(); + + unsafe { bindings::wrap_taglib_tag_set_album(self.ctx, album.as_ptr()) }; + } fn track(&self) -> Option { let track = unsafe { bindings::wrap_taglib_tag_track(self.ctx) }; diff --git a/modules/taglib/src/traits.rs b/modules/taglib/src/traits.rs index 251f90b..58b5993 100644 --- a/modules/taglib/src/traits.rs +++ b/modules/taglib/src/traits.rs @@ -7,7 +7,10 @@ pub trait File { pub trait Tag { fn title(&self) -> Option; fn artist(&self) -> Option; + fn album(&self) -> Option; fn track(&self) -> Option; fn set_title(&mut self, title: String); fn set_artist(&mut self, artist: String); + fn set_album(&mut self, album: String); + } diff --git a/modules/taglib/src/wrapper.cxx b/modules/taglib/src/wrapper.cxx index 5a19390..88ca8ac 100644 --- a/modules/taglib/src/wrapper.cxx +++ b/modules/taglib/src/wrapper.cxx @@ -70,6 +70,11 @@ char* wrap_taglib_tag_artist(TagLib_Tag *tag) { return stringToCharArray(t->artist()); } +char* wrap_taglib_tag_album(TagLib_Tag *tag) { + const TagLib::Tag *t = reinterpret_cast(tag); + return stringToCharArray(t->album()); +} + unsigned int wrap_taglib_tag_track(TagLib_Tag *tag) { const TagLib::Tag *t = reinterpret_cast(tag); return t->track(); @@ -85,6 +90,11 @@ void wrap_taglib_tag_set_artist(TagLib_Tag *tag, const char *artist) { t->setArtist(charArrayToString(artist)); } +void wrap_taglib_tag_set_album(TagLib_Tag *tag, const char *album) { + TagLib::Tag *t = reinterpret_cast(tag); + t->setAlbum(charArrayToString(album)); +} + void wrap_taglib_opustag_add_field(TagLib_Tag *tag, const char *key, const char *value) { TagLib::Ogg::XiphComment *t = reinterpret_cast(tag); t->addField(charArrayToString(key), charArrayToString(value)); diff --git a/modules/taglib/src/wrapper.h b/modules/taglib/src/wrapper.h index 993fccb..7349144 100644 --- a/modules/taglib/src/wrapper.h +++ b/modules/taglib/src/wrapper.h @@ -17,9 +17,11 @@ bool wrap_taglib_file_save(TagLib_File *file); char* wrap_taglib_tag_title(TagLib_Tag *tag); char* wrap_taglib_tag_artist(TagLib_Tag *tag); +char* wrap_taglib_tag_album(TagLib_Tag *tag); unsigned int wrap_taglib_tag_track(TagLib_Tag *tag); void wrap_taglib_tag_set_title(TagLib_Tag *tag, const char *title); void wrap_taglib_tag_set_artist(TagLib_Tag *tag, const char *artist); +void wrap_taglib_tag_set_album(TagLib_Tag *tag, const char *album); void wrap_taglib_opustag_add_field(TagLib_Tag *tag, const char *key, const char *value); void wrap_taglib_opustag_remove_fields(TagLib_Tag *tag, const char *key);