diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index a39dedf..569fbc4 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -95,6 +95,7 @@ pub struct SameMusic { delete_method: DeleteMethod, music_similarity: MusicSimilarity, stopped_search: bool, + approximate_comparison: bool, } impl SameMusic { @@ -113,6 +114,7 @@ impl SameMusic { maximal_file_size: u64::MAX, duplicated_music_entries: vec![], music_to_check: Vec::with_capacity(2048), + approximate_comparison: true, } } @@ -157,6 +159,10 @@ impl SameMusic { self.delete_method = delete_method; } + pub fn set_approximate_comparison(&mut self, approximate_comparison: bool) { + self.approximate_comparison = approximate_comparison; + } + pub fn set_recursive_search(&mut self, recursive_search: bool) { self.recursive_search = recursive_search; } @@ -470,8 +476,13 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let title = file_entry.title.to_lowercase().trim().to_string(); + let mut title = file_entry.title.to_lowercase().trim().to_string(); if !title.is_empty() { + if self.approximate_comparison { + if let Some(index) = title.find('(') { + title = title[0..index].trim().to_string(); + } + } hash_map.entry(title.clone()).or_insert_with(Vec::new); hash_map.get_mut(title.as_str()).unwrap().push(file_entry); } @@ -497,7 +508,12 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let artist = file_entry.artist.to_lowercase().trim().to_string(); + let mut artist = file_entry.artist.to_lowercase().trim().to_string(); + if self.approximate_comparison { + if let Some(index) = artist.find('(') { + artist = artist[0..index].trim().to_string(); + } + } if !artist.is_empty() { hash_map.entry(artist.clone()).or_insert_with(Vec::new); hash_map.get_mut(artist.as_str()).unwrap().push(file_entry); @@ -524,7 +540,12 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let album_title = file_entry.album_title.to_lowercase().trim().to_string(); + let mut album_title = file_entry.album_title.to_lowercase().trim().to_string(); + if self.approximate_comparison { + if let Some(index) = album_title.find('(') { + album_title = album_title[0..index].trim().to_string(); + } + } if !album_title.is_empty() { hash_map.entry(album_title.clone()).or_insert_with(Vec::new); hash_map.get_mut(album_title.as_str()).unwrap().push(file_entry); @@ -551,7 +572,12 @@ impl SameMusic { } let mut hash_map: BTreeMap> = Default::default(); for file_entry in vec_file_entry { - let album_artist = file_entry.album_artist.to_lowercase().trim().to_string(); + let mut album_artist = file_entry.album_artist.to_lowercase().trim().to_string(); + if self.approximate_comparison { + if let Some(index) = album_artist.find('(') { + album_artist = album_artist[0..index].trim().to_string(); + } + } if !album_artist.is_empty() { hash_map.entry(album_artist.clone()).or_insert_with(Vec::new); hash_map.get_mut(album_artist.as_str()).unwrap().push(file_entry); diff --git a/czkawka_gui/src/connect_button_search.rs b/czkawka_gui/src/connect_button_search.rs index 4e73244..e28f9ce 100644 --- a/czkawka_gui/src/connect_button_search.rs +++ b/czkawka_gui/src/connect_button_search.rs @@ -115,6 +115,7 @@ pub fn connect_button_search( let entry_info = gui_data.entry_info.clone(); let button_settings = gui_data.header.button_settings.clone(); let button_app_info = gui_data.header.button_app_info.clone(); + let check_button_music_approximate_comparison = gui_data.main_notebook.check_button_music_approximate_comparison.clone(); buttons_search_clone.connect_clicked(move |_| { let included_directories = get_path_buf_from_vector_of_strings(get_string_from_list_store(&tree_view_included_directories)); @@ -409,6 +410,7 @@ pub fn connect_button_search( let minimal_file_size = entry_same_music_minimal_size.text().as_str().parse::().unwrap_or(1024 * 8); let maximal_file_size = entry_same_music_maximal_size.text().as_str().parse::().unwrap_or(1024 * 1024 * 1024 * 1024); + let approximate_comparison = check_button_music_approximate_comparison.is_active(); let mut music_similarity: MusicSimilarity = MusicSimilarity::NONE; @@ -441,6 +443,7 @@ pub fn connect_button_search( mf.set_maximal_file_size(maximal_file_size); mf.set_recursive_search(recursive_search); mf.set_music_similarity(music_similarity); + mf.set_approximate_comparison(approximate_comparison); mf.find_same_music(Some(&stop_receiver), Some(&futures_sender_same_music)); let _ = glib_stop_sender.send(Message::SameMusic(mf)); }); diff --git a/czkawka_gui/src/gui_main_notebook.rs b/czkawka_gui/src/gui_main_notebook.rs index 64e2fc1..f04521c 100644 --- a/czkawka_gui/src/gui_main_notebook.rs +++ b/czkawka_gui/src/gui_main_notebook.rs @@ -57,6 +57,7 @@ pub struct GuiMainNotebook { pub check_button_music_album_title: gtk::CheckButton, pub check_button_music_album_artist: gtk::CheckButton, pub check_button_music_year: gtk::CheckButton, + pub check_button_music_approximate_comparison: gtk::CheckButton, //// Radio Buttons // Duplicates @@ -171,6 +172,7 @@ impl GuiMainNotebook { let check_button_music_album_title: gtk::CheckButton = builder.object("check_button_music_album_title").unwrap(); let check_button_music_album_artist: gtk::CheckButton = builder.object("check_button_music_album_artist").unwrap(); let check_button_music_year: gtk::CheckButton = builder.object("check_button_music_year").unwrap(); + let check_button_music_approximate_comparison: gtk::CheckButton = builder.object("check_button_music_approximate_comparison").unwrap(); //// Radio Buttons let radio_button_duplicates_name: gtk::RadioButton = builder.object("radio_button_duplicates_name").unwrap(); @@ -265,6 +267,7 @@ impl GuiMainNotebook { check_button_music_album_title, check_button_music_album_artist, check_button_music_year, + check_button_music_approximate_comparison, radio_button_duplicates_name, radio_button_duplicates_size, radio_button_duplicates_hash, diff --git a/czkawka_gui/ui/main_window.glade b/czkawka_gui/ui/main_window.glade index 8180280..0f57e34 100644 --- a/czkawka_gui/ui/main_window.glade +++ b/czkawka_gui/ui/main_window.glade @@ -1936,6 +1936,31 @@ Author: Rafał Mikrut 1 + + + True + False + + + Approximate Comparison + True + True + False + True + + + False + True + 0 + + + + + False + True + 2 + + True @@ -1949,7 +1974,7 @@ Author: Rafał Mikrut True True - 2 + 3