3way merge works!

This commit is contained in:
🪞👃🪞 2025-04-09 02:06:17 +03:00
parent e8a7c0682c
commit 8e6b74cec2
2 changed files with 94 additions and 73 deletions

View file

@ -37,6 +37,7 @@ impl Perch {
{ {
setter(self, self.cursor, Some(value.as_ref())); setter(self, self.cursor, Some(value.as_ref()));
self.mode = None; self.mode = None;
self.cursor_select(1);
} }
} }
pub fn edit_clear (&mut self) { pub fn edit_clear (&mut self) {

View file

@ -174,10 +174,8 @@ impl Metadata {
}) })
} }
// JPG // JPG
if bytes.starts_with(MAGIC_JPG_1) if bytes.starts_with(MAGIC_JPG_1) || bytes.starts_with(MAGIC_JPG_2)
|| bytes.starts_with(MAGIC_JPG_2) || bytes.starts_with(MAGIC_JPG_3) || (bytes.starts_with(MAGIC_JPG_4A) &&
|| bytes.starts_with(MAGIC_JPG_3)
|| (bytes.starts_with(MAGIC_JPG_4A) &&
bytes.get(6) == Some(&0x45) && bytes.get(7) == Some(&0x78) && bytes.get(6) == Some(&0x45) && bytes.get(7) == Some(&0x78) &&
bytes.get(8) == Some(&0x69) && bytes.get(9) == Some(&0x66) && bytes.get(8) == Some(&0x69) && bytes.get(9) == Some(&0x66) &&
bytes.get(10) == Some(&0x00) && bytes.get(11) == Some(&0x00)) bytes.get(10) == Some(&0x00) && bytes.get(11) == Some(&0x00))
@ -230,10 +228,11 @@ macro_rules! music_tag_field {
( (
key = $key:expr, key = $key:expr,
get = $get:ident, get = $get:ident,
format = $format:expr,
parse = $parse:expr,
read = $read:expr,
set = $set:ident, set = $set:ident,
del = $del:ident, del = $del:ident,
write = $write:expr,
parse = $parse:expr,
) => { ) => {
impl Entry { impl Entry {
pub fn $get (&self) -> Option<Arc<str>> { pub fn $get (&self) -> Option<Arc<str>> {
@ -246,40 +245,44 @@ macro_rules! music_tag_field {
impl Metadata { impl Metadata {
/// Get the metadata value if present. /// Get the metadata value if present.
pub fn $get (&self) -> Option<Arc<str>> { pub fn $get (&self) -> Option<Arc<str>> {
let write = $write; let format = $format;
if let Metadata::Music { original_tag, modified_tag, .. } = self { if let Metadata::Music { original_tag, modified_tag, .. } = self {
return modified_tag return modified_tag
.as_ref() .as_ref()
.map(|tag|tag.read().unwrap().$get().map(|x|write(x))) .map(|tag|tag.read().unwrap().$get().map(|x|format(x)))
.flatten() .flatten()
.or_else(||original_tag //.or_else(||original_tag
.as_ref() //.as_ref()
.map(|tag|tag.$get().map(|x|write(x))) //.map(|tag|tag.$get().map(|x|format(x)))
.flatten()) //.flatten())
} }
None None
} }
/// Set or delete the metadata value. /// Set or delete the metadata value.
/// Return whether the changes should be recounted. /// Return whether the changes should be recounted.
pub fn $set (&mut self, value: Option<&str>) -> bool { pub fn $set (&mut self, input_value: Option<&str>) -> bool {
let parse = $parse; let parse = $parse;
let read = $read;
match self { match self {
&mut Metadata::Music { &mut Metadata::Music {
original_tag: Some(ref original), modified_tag: Some(ref modified), .. original_tag: Some(ref original), modified_tag: Some(ref modified), ..
} => if let Some(value) = value { } => if let Some(input_value) = input_value {
if let Ok(input_value) = parse(input_value) {
// set new value // set new value
let value = parse(value).unwrap(); let changed = original.$get().map(read) != Some(input_value.clone());
let changed = original.$get() != Some(value); modified.write().unwrap().$set(input_value);
modified.write().unwrap().$set(value);
changed changed
} else { } else {
let modified = modified.write().unwrap(); false
}
} else {
let mut modified = modified.write().unwrap();
if let Some(value) = modified.$get() { if let Some(value) = modified.$get() {
// delete modified value // delete modified value
modified.$del(); modified.$del();
true true
} else if let Some(value) = original.$get() { } else if let Some(value) = original.$get().map(read) {
// set to original value // set to original value
modified.$set(value); modified.$set(value);
true true
@ -290,13 +293,18 @@ macro_rules! music_tag_field {
&mut Metadata::Music { &mut Metadata::Music {
original_tag: Some(ref original), ref mut modified_tag, .. original_tag: Some(ref original), ref mut modified_tag, ..
} => if let Some(input_value) = value { } => if let Some(input_value) = input_value {
if let Ok(input_value) = parse(input_value) {
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
new_tag.$set(input_value); new_tag.$set(input_value);
*modified_tag = Some(Arc::new(RwLock::new(new_tag))); *modified_tag = Some(Arc::new(RwLock::new(new_tag)));
true true
} else {
false
}
} else if let Some(original_value) = original.$get() { } else if let Some(original_value) = original.$get() {
// set to original value // set to original value
let original_value = read(original_value);
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
new_tag.$set(original_value); new_tag.$set(original_value);
*modified_tag = Some(Arc::new(RwLock::new(new_tag))); *modified_tag = Some(Arc::new(RwLock::new(new_tag)));
@ -307,19 +315,22 @@ macro_rules! music_tag_field {
&mut Metadata::Music { &mut Metadata::Music {
original_tag: None, modified_tag: Some(ref modified), .. original_tag: None, modified_tag: Some(ref modified), ..
} => if let Some(value) = value { } => if let Some(input_value) = input_value {
// set new value // set new value
let value = parse(value).unwrap(); if let Ok(input_value) = parse(input_value) {
let modified = modified.write().unwrap(); let mut modified = modified.write().unwrap();
if modified.$get() != Some(value) { if modified.$get().map(read) != Some(input_value.clone()) {
// set modified value // set modified value
modified.$set(value); modified.$set(input_value);
true true
} else { } else {
false false
} }
} else { } else {
let modified = modified.write().unwrap(); false
}
} else {
let mut modified = modified.write().unwrap();
if modified.$get().is_some() { if modified.$get().is_some() {
// remove modified value // remove modified value
modified.$del(); modified.$del();
@ -331,13 +342,17 @@ macro_rules! music_tag_field {
&mut Metadata::Music { &mut Metadata::Music {
original_tag: None, ref mut modified_tag, .. original_tag: None, ref mut modified_tag, ..
} => if let Some(value) = value { } => if let Some(input_value) = input_value {
if let Ok(input_value) = parse(input_value) {
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
new_tag.$set(value); new_tag.$set(input_value);
*modified_tag = Some(Arc::new(RwLock::new(new_tag))); *modified_tag = Some(Arc::new(RwLock::new(new_tag)));
true true
} else { } else {
false false
}
} else {
false
}, },
_ => { _ => {
@ -352,44 +367,49 @@ macro_rules! music_tag_field {
music_tag_field! { music_tag_field! {
key = ItemKey::TrackArtist, key = ItemKey::TrackArtist,
get = artist, get = artist,
format = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
read = |value: Cow<str>|value.to_string(),
set = set_artist, set = set_artist,
del = remove_artist, del = remove_artist,
write = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim()),
} }
music_tag_field! { music_tag_field! {
key = ItemKey::Year, key = ItemKey::Year,
get = year, get = year,
format = |value: u32|format!("{value}").into(),
parse = |value: &str|value.trim().parse::<u32>(),
read = |value: u32|value,
set = set_year, set = set_year,
del = remove_year, del = remove_year,
write = |value: u32|format!("{value}").into(),
parse = |value: &str|value.trim().parse::<u32>(),
} }
music_tag_field! { music_tag_field! {
key = ItemKey::AlbumTitle, key = ItemKey::AlbumTitle,
get = album, get = album,
format = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
read = |value: Cow<str>|value.to_string(),
set = set_album, set = set_album,
del = remove_album, del = remove_album,
write = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim().into()),
} }
music_tag_field! { music_tag_field! {
key = ItemKey::TrackNumber, key = ItemKey::TrackNumber,
get = track, get = track,
format = |value: u32|format!("{value}").into(),
parse = |value: &str|value.trim().parse::<u32>(),
read = |value: u32|value,
set = set_track, set = set_track,
del = remove_track, del = remove_track,
write = |value: u32|format!("{value}").into(),
parse = |value: &str|value.trim().parse::<u32>(),
} }
music_tag_field! { music_tag_field! {
key = ItemKey::TrackTitle, key = ItemKey::TrackTitle,
get = title, get = title,
format = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
read = |value: Cow<str>|value.to_string(),
set = set_title, set = set_title,
del = remove_title, del = remove_title,
write = |value: Cow<str>|value.into(),
parse = |value: &str|Ok::<String, ()>(value.trim().into()),
} }