1
0
Fork 0
mirror of synced 2024-05-17 19:03:08 +12:00
This commit is contained in:
Rafał Mikrut 2023-05-07 14:01:58 +02:00
parent 32f7a172f7
commit 755e5e6a74
13 changed files with 237 additions and 8 deletions

View file

@ -259,10 +259,25 @@ impl SameMusic {
self.directories.set_included_directory(included_directory, &mut self.text_messages);
}
pub fn set_maximum_difference(&mut self, maximum_difference: f64) {
self.maximum_difference = maximum_difference;
}
pub fn set_minimum_segment_duration(&mut self, minimum_segment_duration: f32) {
self.minimum_segment_duration = minimum_segment_duration;
}
pub fn set_reference_directory(&mut self, reference_directory: Vec<PathBuf>) {
self.directories.set_reference_directory(reference_directory);
}
pub fn set_check_type(&mut self, check_type: CheckingMethod) {
assert!([CheckingMethod::AudioTags, CheckingMethod::AudioContent].contains(&check_type));
self.check_type = check_type
}
pub fn get_check_type(&self) -> CheckingMethod {
self.check_type
}
pub fn set_excluded_directory(&mut self, excluded_directory: Vec<PathBuf>) {
self.directories.set_excluded_directory(excluded_directory, &mut self.text_messages);
}

View file

@ -16,6 +16,8 @@ music_bitrate_checkbox = Bitrate
music_genre_checkbox = Genre
music_length_checkbox = Length
music_comparison_checkbox = Approximate Comparison
music_checking_by_tags = Tags
music_checking_by_content = Content
music_comparison_checkbox_tooltip =
It searches for similar music files using AI, which uses machine learning to remove parentheses from a phrase. For example, with this option enabled, the files in question will be considered duplicates:

View file

@ -550,7 +550,7 @@ fn computer_same_music(
} else {
let vector = mf.get_duplicated_music_entries();
let text: &str = "-----";
let text: &str = if mf.get_check_type() == CheckingMethod::AudioTags { "-----" } else { "" };
for vec_file_entry in vector {
// Sort

View file

@ -12,7 +12,7 @@ use gtk4::Grid;
use czkawka_core::bad_extensions::BadExtensions;
use czkawka_core::big_file::BigFile;
use czkawka_core::broken_files::{BrokenFiles, CheckedTypes};
use czkawka_core::common_dir_traversal::ProgressData;
use czkawka_core::common_dir_traversal::{CheckingMethod, ProgressData};
use czkawka_core::duplicate::DuplicateFinder;
use czkawka_core::empty_files::EmptyFiles;
use czkawka_core::empty_folder::EmptyFolder;
@ -24,8 +24,8 @@ use czkawka_core::temporary::Temporary;
use crate::gui_structs::gui_data::GuiData;
use crate::help_combo_box::{
BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, DUPLICATES_HASH_TYPE_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX, IMAGES_HASH_TYPE_COMBO_BOX,
IMAGES_RESIZE_ALGORITHM_COMBO_BOX,
AUDIO_TYPE_CHECK_METHOD_COMBO_BOX, BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, DUPLICATES_HASH_TYPE_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX,
IMAGES_HASH_TYPE_COMBO_BOX, IMAGES_RESIZE_ALGORITHM_COMBO_BOX,
};
use crate::help_functions::*;
use crate::notebook_enums::*;
@ -479,7 +479,10 @@ fn same_music_search(
let check_button_music_length: gtk4::CheckButton = gui_data.main_notebook.check_button_music_length.clone();
let check_button_music_bitrate: gtk4::CheckButton = gui_data.main_notebook.check_button_music_bitrate.clone();
let tree_view_same_music_finder = gui_data.main_notebook.tree_view_same_music_finder.clone();
let combo_box_audio_check_type = gui_data.main_notebook.combo_box_audio_check_type.clone();
let check_button_music_approximate_comparison = gui_data.main_notebook.check_button_music_approximate_comparison.clone();
let scale_seconds_same_music = gui_data.main_notebook.scale_seconds_same_music.clone();
let scale_similarity_same_music = gui_data.main_notebook.scale_similarity_same_music.clone();
get_list_store(&tree_view_same_music_finder).clear();
@ -506,7 +509,13 @@ fn same_music_search(
music_similarity |= MusicSimilarity::LENGTH;
}
if music_similarity != MusicSimilarity::NONE {
let check_method_index = combo_box_audio_check_type.active().unwrap() as usize;
let check_method = AUDIO_TYPE_CHECK_METHOD_COMBO_BOX[check_method_index].check_method;
let maximum_difference = scale_similarity_same_music.value();
let minimum_segment_duration = scale_seconds_same_music.value() as f32;
if music_similarity != MusicSimilarity::NONE || check_method == CheckingMethod::AudioContent {
thread::spawn(move || {
let mut mf = SameMusic::new();
@ -520,6 +529,9 @@ fn same_music_search(
mf.set_allowed_extensions(loaded_common_items.allowed_extensions);
mf.set_recursive_search(loaded_common_items.recursive_search);
mf.set_music_similarity(music_similarity);
mf.set_maximum_difference(maximum_difference);
mf.set_minimum_segment_duration(minimum_segment_duration);
mf.set_check_type(check_method);
mf.set_approximate_comparison(approximate_comparison);
mf.set_save_also_as_json(loaded_common_items.save_also_as_json);
mf.set_exclude_other_filesystems(loaded_common_items.ignore_other_filesystems);

View file

@ -0,0 +1,77 @@
use gtk4::prelude::*;
use gtk4::{CheckButton, Widget};
use czkawka_core::common_dir_traversal::CheckingMethod;
use crate::gui_structs::gui_data::GuiData;
use crate::help_combo_box::AUDIO_TYPE_CHECK_METHOD_COMBO_BOX;
use crate::help_functions::scale_set_min_max_values;
const MINIMUM_SECONDS: f64 = 0.5;
const MAXIMUM_SECONDS: f64 = 180.0;
const DEFAULT_SECONDS: f64 = 15.0;
const MINIMUM_SIMILARITY: f64 = 0.0;
const MAXIMUM_SIMILARITY: f64 = 10.0;
const DEFAULT_SIMILARITY: f64 = 5.0;
pub fn connect_same_music_change_mode(gui_data: &GuiData) {
let check_button_music_title = gui_data.main_notebook.check_button_music_title.clone();
let check_button_music_approximate_comparison = gui_data.main_notebook.check_button_music_approximate_comparison.clone();
let check_button_music_bitrate = gui_data.main_notebook.check_button_music_bitrate.clone();
let check_button_music_artist = gui_data.main_notebook.check_button_music_artist.clone();
let check_button_music_genre = gui_data.main_notebook.check_button_music_genre.clone();
let check_button_music_length = gui_data.main_notebook.check_button_music_length.clone();
let check_button_music_year = gui_data.main_notebook.check_button_music_year.clone();
let buttons = [
check_button_music_title,
check_button_music_approximate_comparison,
check_button_music_bitrate,
check_button_music_artist,
check_button_music_genre,
check_button_music_year,
check_button_music_length,
];
let scale_seconds_same_music = gui_data.main_notebook.scale_seconds_same_music.clone();
let scale_similarity_same_music = gui_data.main_notebook.scale_similarity_same_music.clone();
let label_same_music_similarity = gui_data.main_notebook.label_same_music_similarity.clone();
let label_same_music_seconds = gui_data.main_notebook.label_same_music_seconds.clone();
scale_set_min_max_values(&scale_seconds_same_music, MINIMUM_SECONDS, MAXIMUM_SECONDS, DEFAULT_SECONDS, None);
scale_set_min_max_values(&scale_similarity_same_music, MINIMUM_SIMILARITY, MAXIMUM_SIMILARITY, DEFAULT_SIMILARITY, None);
let scales_and_labels = [
scale_seconds_same_music.into(),
scale_similarity_same_music.into(),
label_same_music_similarity.into(),
label_same_music_seconds.into(),
];
let combo_box_audio_check_type = gui_data.main_notebook.combo_box_audio_check_type.clone();
let check_method_index = combo_box_audio_check_type.active().unwrap() as usize;
let check_method = AUDIO_TYPE_CHECK_METHOD_COMBO_BOX[check_method_index].check_method;
disable_enable_buttons(&buttons, &scales_and_labels, check_method);
combo_box_audio_check_type.connect_changed(move |combo_box_text| {
if let Some(active) = combo_box_text.active() {
let check_method = AUDIO_TYPE_CHECK_METHOD_COMBO_BOX[active as usize].check_method;
disable_enable_buttons(&buttons, &scales_and_labels, check_method);
}
});
}
fn disable_enable_buttons(buttons: &[CheckButton; 7], scales: &[Widget; 4], current_mode: CheckingMethod) {
match current_mode {
CheckingMethod::AudioTags => {
buttons.iter().for_each(|e| e.show());
scales.iter().for_each(|e| e.hide());
}
CheckingMethod::AudioContent => {
buttons.iter().for_each(|e| e.hide());
scales.iter().for_each(|e| e.show());
}
_ => panic!(),
}
}

View file

@ -15,6 +15,7 @@ pub mod connect_notebook_tabs;
pub mod connect_popovers_select;
pub mod connect_popovers_sort;
pub mod connect_progress_window;
pub mod connect_same_music_mode_changed;
pub mod connect_selection_of_directories;
pub mod connect_settings;
pub mod connect_show_hide_ui;

View file

@ -7,7 +7,7 @@ use czkawka_core::localizer_core::{fnc_get_similarity_minimal, fnc_get_similarit
use czkawka_core::similar_images::{get_string_from_similarity, SIMILAR_VALUES};
use crate::flg;
use crate::help_combo_box::{BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX};
use crate::help_combo_box::{AUDIO_TYPE_CHECK_METHOD_COMBO_BOX, BIG_FILES_CHECK_METHOD_COMBO_BOX, DUPLICATES_CHECK_METHOD_COMBO_BOX, IMAGES_HASH_SIZE_COMBO_BOX};
use crate::help_functions::get_all_direct_children;
use crate::notebook_enums::{NotebookMainEnum, NUMBER_OF_NOTEBOOK_MAIN_TABS};
@ -121,6 +121,12 @@ pub struct GuiMainNotebook {
pub check_button_music_genre: CheckButton,
pub check_button_music_length: CheckButton,
pub check_button_music_approximate_comparison: CheckButton,
pub label_audio_check_type: Label,
pub combo_box_audio_check_type: ComboBoxText,
pub label_same_music_seconds: Label,
pub label_same_music_similarity: Label,
pub scale_seconds_same_music: Scale,
pub scale_similarity_same_music: Scale,
}
impl GuiMainNotebook {
@ -247,6 +253,13 @@ impl GuiMainNotebook {
let image_preview_similar_images: Image = builder.object("image_preview_similar_images").unwrap();
let image_preview_duplicates: Image = builder.object("image_preview_duplicates").unwrap();
let label_audio_check_type: Label = builder.object("label_audio_check_type").unwrap();
let combo_box_audio_check_type: ComboBoxText = builder.object("combo_box_audio_check_type").unwrap();
let label_same_music_seconds: Label = builder.object("label_same_music_seconds").unwrap();
let label_same_music_similarity: Label = builder.object("label_same_music_similarity").unwrap();
let scale_seconds_same_music: Scale = builder.object("scale_seconds_same_music").unwrap();
let scale_similarity_same_music: Scale = builder.object("scale_similarity_same_music").unwrap();
Self {
notebook_main,
scrolled_window_duplicate_finder,
@ -289,6 +302,7 @@ impl GuiMainNotebook {
check_button_music_genre,
check_button_music_length,
check_button_music_approximate_comparison,
label_audio_check_type,
scale_similarity_similar_images,
scale_similarity_similar_videos,
check_button_broken_files_audio,
@ -331,6 +345,11 @@ impl GuiMainNotebook {
combo_box_big_files_mode,
label_big_files_mode,
check_button_broken_files_image,
combo_box_audio_check_type,
label_same_music_seconds,
label_same_music_similarity,
scale_seconds_same_music,
scale_similarity_same_music,
}
}
@ -541,6 +560,19 @@ impl GuiMainNotebook {
}
}
{
let active = self.combo_box_audio_check_type.active().unwrap_or(0);
self.combo_box_audio_check_type.remove_all();
for i in &AUDIO_TYPE_CHECK_METHOD_COMBO_BOX {
let text = match i.check_method {
CheckingMethod::AudioTags => flg!("music_checking_by_tags"),
CheckingMethod::AudioContent => flg!("music_checking_by_content"),
_ => panic!(),
};
self.combo_box_audio_check_type.append_text(&text);
}
self.combo_box_audio_check_type.set_active(Some(active));
}
{
let active = self.combo_box_duplicate_check_method.active().unwrap_or(0);
self.combo_box_duplicate_check_method.remove_all();

View file

@ -48,6 +48,23 @@ pub const DUPLICATES_CHECK_METHOD_COMBO_BOX: [CheckMethodStruct; 4] = [
},
];
#[derive(Copy, Clone)]
pub struct AudioTypeStruct {
pub eng_name: &'static str,
pub check_method: CheckingMethod,
}
pub const AUDIO_TYPE_CHECK_METHOD_COMBO_BOX: [AudioTypeStruct; 2] = [
AudioTypeStruct {
eng_name: "Tags",
check_method: CheckingMethod::AudioTags,
},
AudioTypeStruct {
eng_name: "Content",
check_method: CheckingMethod::AudioContent,
},
];
#[derive(Copy, Clone)]
pub struct SearchModeStruct {
pub eng_name: &'static str,

View file

@ -7,7 +7,7 @@ use gdk4::gdk_pixbuf::{InterpType, Pixbuf};
use glib::signal::Inhibit;
use glib::Error;
use gtk4::prelude::*;
use gtk4::{ListStore, ScrollType, TextView, TreeView, Widget};
use gtk4::{ListStore, Scale, ScrollType, TextView, TreeView, Widget};
use image::codecs::jpeg::JpegEncoder;
use image::{DynamicImage, EncodableLayout};
use once_cell::sync::OnceCell;
@ -770,7 +770,16 @@ pub fn check_if_list_store_column_have_all_same_values(list_store: &ListStore, c
false
}
pub fn scale_step_function(scale: &gtk4::Scale, _scroll_type: ScrollType, value: f64) -> Inhibit {
pub fn scale_set_min_max_values(scale: &Scale, minimum: f64, maximum: f64, current_value: f64, step: Option<f64>) {
scale.set_range(minimum, maximum);
scale.set_fill_level(maximum);
scale.set_value(current_value);
if let Some(step) = step {
scale.adjustment().set_step_increment(step)
}
}
pub fn scale_step_function(scale: &Scale, _scroll_type: ScrollType, value: f64) -> Inhibit {
scale.set_increments(1_f64, 1_f64);
scale.set_round_digits(0);
scale.set_fill_level(value.round());

View file

@ -42,6 +42,7 @@ use crate::compute_results::*;
use crate::connect_things::connect_button_sort::connect_button_sort;
use crate::connect_things::connect_popovers_select::connect_popover_select;
use crate::connect_things::connect_popovers_sort::connect_popover_sort;
use crate::connect_things::connect_same_music_mode_changed::connect_same_music_change_mode;
use crate::initialize_gui::*;
use crate::language_functions::LANGUAGES_ALL;
use crate::saving_loading::*;
@ -163,6 +164,7 @@ fn build_ui(application: &Application, arguments: &[OsString]) {
connect_button_about(&gui_data);
connect_about_buttons(&gui_data);
connect_similar_image_size_change(&gui_data);
connect_same_music_change_mode(&gui_data);
let window_main = gui_data.window_main.clone();
let taskbar_state = gui_data.taskbar_state.clone();

View file

@ -237,6 +237,10 @@
(5,232,"GtkLabel","label_buttons_sort",230,None,None,None,1),
(5,234,"GtkLabel","label_audio_check_type",124,None,None,None,None),
(5,235,"GtkComboBoxText","combo_box_audio_check_type",124,None,None,None,1),
(5,236,"GtkScale","scale_seconds_same_music",117,None,None,None,7),
(5,237,"GtkScale","scale_similarity_same_music",117,None,None,None,9),
(5,238,"GtkLabel","label_same_music_seconds",117,None,None,None,6),
(5,239,"GtkLabel","label_same_music_similarity",117,None,None,None,8),
(6,1,"GtkPopover","popover_right_click",None,None,None,None,None),
(6,2,"GtkBox",None,1,None,None,None,None),
(6,3,"GtkButton","buttons_popover_right_click_open_file",2,None,None,None,None),
@ -769,6 +773,26 @@
(5,232,"GtkLabel","label","SortMenu",None,None,None,None,None),
(5,234,"GtkLabel","label","Audio check type",None,None,None,None,None),
(5,234,"GtkWidget","margin-end","2",None,None,None,None,None),
(5,236,"GtkRange","fill-level","100",None,None,None,None,None),
(5,236,"GtkRange","round-digits","1",None,None,None,None,None),
(5,236,"GtkScale","digits","0",None,None,None,None,None),
(5,236,"GtkScale","draw-value","1",None,None,None,None,None),
(5,236,"GtkScale","value-pos","right",None,None,None,None,None),
(5,236,"GtkWidget","focusable","1",None,None,None,None,None),
(5,236,"GtkWidget","hexpand","1",None,None,None,None,None),
(5,237,"GtkRange","fill-level","100",None,None,None,None,None),
(5,237,"GtkRange","round-digits","1",None,None,None,None,None),
(5,237,"GtkScale","digits","0",None,None,None,None,None),
(5,237,"GtkScale","draw-value","1",None,None,None,None,None),
(5,237,"GtkScale","value-pos","right",None,None,None,None,None),
(5,237,"GtkWidget","focusable","1",None,None,None,None,None),
(5,237,"GtkWidget","hexpand","1",None,None,None,None,None),
(5,238,"GtkLabel","label","Minimal fragment second duration",None,None,None,None,None),
(5,238,"GtkWidget","margin-end","5",None,None,None,None,None),
(5,238,"GtkWidget","margin-start","5",None,None,None,None,None),
(5,239,"GtkLabel","label","Max difference",None,None,None,None,None),
(5,239,"GtkWidget","margin-end","5",None,None,None,None,None),
(5,239,"GtkWidget","margin-start","5",None,None,None,None,None),
(6,1,"GtkPopover","child",None,None,None,None,None,2),
(6,1,"GtkPopover","position","left",None,None,None,None,None),
(6,2,"GtkOrientable","orientation","vertical",None,None,None,None,None),
@ -991,6 +1015,7 @@
(9,58,"GtkWidget","focusable","1",None,None,None,None,None),
(9,58,"GtkWidget","hexpand","1",None,None,None,None,None),
(9,59,"GtkAccessible","accessible-role","menu-item-checkbox",None,None,None,None,None),
(9,59,"GtkLabel","label","Restart Required",None,None,None,None,None),
(9,59,"GtkWidget","margin-bottom","4",None,None,None,None,None),
(9,59,"GtkWidget","margin-top","5",None,None,None,None,None),
(10,1,"GtkPopover","child",None,None,None,None,None,2),

View file

@ -721,6 +721,42 @@
<property name="label">Length</property>
</object>
</child>
<child>
<object class="GtkLabel" id="label_same_music_seconds">
<property name="label">Minimal fragment second duration</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
</object>
</child>
<child>
<object class="GtkScale" id="scale_seconds_same_music">
<property name="digits">0</property>
<property name="draw-value">1</property>
<property name="fill-level">100</property>
<property name="focusable">1</property>
<property name="hexpand">1</property>
<property name="round-digits">1</property>
<property name="value-pos">right</property>
</object>
</child>
<child>
<object class="GtkLabel" id="label_same_music_similarity">
<property name="label">Max difference</property>
<property name="margin-end">5</property>
<property name="margin-start">5</property>
</object>
</child>
<child>
<object class="GtkScale" id="scale_similarity_same_music">
<property name="digits">0</property>
<property name="draw-value">1</property>
<property name="fill-level">100</property>
<property name="focusable">1</property>
<property name="hexpand">1</property>
<property name="round-digits">1</property>
<property name="value-pos">right</property>
</object>
</child>
</object>
</child>
<child>

View file

@ -142,6 +142,7 @@
<child>
<object class="GtkLabel" id="label_restart_needed">
<property name="accessible-role">menu-item-checkbox</property>
<property name="label">Restart Required</property>
<property name="margin-bottom">4</property>
<property name="margin-top">5</property>
</object>