Approximate comparison of music (#483)

This commit is contained in:
Rafał Mikrut 2021-12-04 09:29:29 +01:00 committed by GitHub
parent c8549b3810
commit ce3d86fd4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 5 deletions

View File

@ -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<String, Vec<FileEntry>> = 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<String, Vec<FileEntry>> = 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<String, Vec<FileEntry>> = 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<String, Vec<FileEntry>> = 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);

View File

@ -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::<u64>().unwrap_or(1024 * 8);
let maximal_file_size = entry_same_music_maximal_size.text().as_str().parse::<u64>().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));
});

View File

@ -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,

View File

@ -1936,6 +1936,31 @@ Author: Rafał Mikrut
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="check_button_music_approximate_comparison">
<property name="label" translatable="yes">Approximate Comparison</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolled_window_same_music_finder">
<property name="visible">True</property>
@ -1949,7 +1974,7 @@ Author: Rafał Mikrut
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>