mirror of
https://codeberg.org/unspeaker/perch.git
synced 2025-12-06 09:36:42 +01:00
3way merge works!
This commit is contained in:
parent
e8a7c0682c
commit
8e6b74cec2
2 changed files with 94 additions and 73 deletions
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
@ -228,12 +226,13 @@ generated_field!(size = |self|match self {
|
||||||
|
|
||||||
macro_rules! music_tag_field {
|
macro_rules! music_tag_field {
|
||||||
(
|
(
|
||||||
key = $key:expr,
|
key = $key:expr,
|
||||||
get = $get:ident,
|
get = $get:ident,
|
||||||
set = $set:ident,
|
format = $format:expr,
|
||||||
del = $del:ident,
|
parse = $parse:expr,
|
||||||
write = $write:expr,
|
read = $read:expr,
|
||||||
parse = $parse:expr,
|
set = $set:ident,
|
||||||
|
del = $del:ident,
|
||||||
) => {
|
) => {
|
||||||
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 {
|
||||||
// set new value
|
if let Ok(input_value) = parse(input_value) {
|
||||||
let value = parse(value).unwrap();
|
// set new value
|
||||||
let changed = original.$get() != Some(value);
|
let changed = original.$get().map(read) != Some(input_value.clone());
|
||||||
modified.write().unwrap().$set(value);
|
modified.write().unwrap().$set(input_value);
|
||||||
changed
|
changed
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
let modified = modified.write().unwrap();
|
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 {
|
||||||
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
|
if let Ok(input_value) = parse(input_value) {
|
||||||
new_tag.$set(input_value);
|
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
|
||||||
*modified_tag = Some(Arc::new(RwLock::new(new_tag)));
|
new_tag.$set(input_value);
|
||||||
true
|
*modified_tag = Some(Arc::new(RwLock::new(new_tag)));
|
||||||
|
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 {
|
||||||
|
false
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let modified = modified.write().unwrap();
|
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,11 +342,15 @@ 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 {
|
||||||
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
|
if let Ok(input_value) = parse(input_value) {
|
||||||
new_tag.$set(value);
|
let mut new_tag = Tag::new(TagType::Id3v2); // FIXME other types
|
||||||
*modified_tag = Some(Arc::new(RwLock::new(new_tag)));
|
new_tag.$set(input_value);
|
||||||
true
|
*modified_tag = Some(Arc::new(RwLock::new(new_tag)));
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
},
|
},
|
||||||
|
|
@ -350,46 +365,51 @@ macro_rules! music_tag_field {
|
||||||
}
|
}
|
||||||
|
|
||||||
music_tag_field! {
|
music_tag_field! {
|
||||||
key = ItemKey::TrackArtist,
|
key = ItemKey::TrackArtist,
|
||||||
get = artist,
|
get = artist,
|
||||||
set = set_artist,
|
format = |value: Cow<str>|value.into(),
|
||||||
del = remove_artist,
|
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
|
||||||
write = |value: Cow<str>|value.into(),
|
read = |value: Cow<str>|value.to_string(),
|
||||||
parse = |value: &str|Ok::<String, ()>(value.trim()),
|
set = set_artist,
|
||||||
|
del = remove_artist,
|
||||||
}
|
}
|
||||||
|
|
||||||
music_tag_field! {
|
music_tag_field! {
|
||||||
key = ItemKey::Year,
|
key = ItemKey::Year,
|
||||||
get = year,
|
get = year,
|
||||||
set = set_year,
|
format = |value: u32|format!("{value}").into(),
|
||||||
del = remove_year,
|
parse = |value: &str|value.trim().parse::<u32>(),
|
||||||
write = |value: u32|format!("{value}").into(),
|
read = |value: u32|value,
|
||||||
parse = |value: &str|value.trim().parse::<u32>(),
|
set = set_year,
|
||||||
|
del = remove_year,
|
||||||
}
|
}
|
||||||
|
|
||||||
music_tag_field! {
|
music_tag_field! {
|
||||||
key = ItemKey::AlbumTitle,
|
key = ItemKey::AlbumTitle,
|
||||||
get = album,
|
get = album,
|
||||||
set = set_album,
|
format = |value: Cow<str>|value.into(),
|
||||||
del = remove_album,
|
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
|
||||||
write = |value: Cow<str>|value.into(),
|
read = |value: Cow<str>|value.to_string(),
|
||||||
parse = |value: &str|Ok::<String, ()>(value.trim().into()),
|
set = set_album,
|
||||||
|
del = remove_album,
|
||||||
}
|
}
|
||||||
|
|
||||||
music_tag_field! {
|
music_tag_field! {
|
||||||
key = ItemKey::TrackNumber,
|
key = ItemKey::TrackNumber,
|
||||||
get = track,
|
get = track,
|
||||||
set = set_track,
|
format = |value: u32|format!("{value}").into(),
|
||||||
del = remove_track,
|
parse = |value: &str|value.trim().parse::<u32>(),
|
||||||
write = |value: u32|format!("{value}").into(),
|
read = |value: u32|value,
|
||||||
parse = |value: &str|value.trim().parse::<u32>(),
|
set = set_track,
|
||||||
|
del = remove_track,
|
||||||
}
|
}
|
||||||
|
|
||||||
music_tag_field! {
|
music_tag_field! {
|
||||||
key = ItemKey::TrackTitle,
|
key = ItemKey::TrackTitle,
|
||||||
get = title,
|
get = title,
|
||||||
set = set_title,
|
format = |value: Cow<str>|value.into(),
|
||||||
del = remove_title,
|
parse = |value: &str|Ok::<String, ()>(value.trim().to_string()),
|
||||||
write = |value: Cow<str>|value.into(),
|
read = |value: Cow<str>|value.to_string(),
|
||||||
parse = |value: &str|Ok::<String, ()>(value.trim().into()),
|
set = set_title,
|
||||||
|
del = remove_title,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue