diff --git a/.github/workflows/linux_gui.yml b/.github/workflows/linux_gui.yml index c5d6f72..e51fe7a 100644 --- a/.github/workflows/linux_gui.yml +++ b/.github/workflows/linux_gui.yml @@ -31,6 +31,13 @@ jobs: RUSTFLAGS: "-C debuginfo=0" if: ${{ (matrix.type == 'release') && (matrix.toolchain == '1.67.1') }} + - name: Store Linux GUI Heif + uses: actions/upload-artifact@v3 + with: + name: czkawka_gui-${{ runner.os }}-${{ matrix.toolchain }}-heif + path: target/release/czkawka_gui + if: ${{ matrix.type == 'release' }} + - name: Build Release run: cargo build --release env: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e016e8c..94bfa5f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -10,9 +10,12 @@ env: jobs: container: + strategy: + matrix: + use_heif: [ non_heif ] #, heif ] - heif problems with mingw runs-on: ubuntu-22.04 container: - image: ghcr.io/piegamesde/gtk4-cross:gtk-4.8 + image: ghcr.io/mglolenstine/gtk4-cross:gtk-4.10 steps: - uses: actions/checkout@v1 - name: Install additional dependencies @@ -33,6 +36,18 @@ jobs: with: path: target key: windows-build-target + + - name: Cross compile for Windows Heif + run: | + #!/bin/bash + set -euo pipefail + export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/ + cargo build --target=x86_64-pc-windows-gnu --release --locked --features heif + mkdir -p package + cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/ + cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/ + if: ${{ matrix.use_heif == 'heif' }} + - name: Cross compile for Windows run: | #!/bin/bash @@ -42,6 +57,8 @@ jobs: mkdir -p package cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/ cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/ + if: ${{ matrix.use_heif == 'non_heif' }} + - name: Package run: | #!/bin/bash @@ -67,7 +84,7 @@ jobs: - name: Upload artifacts uses: actions/upload-artifact@v3 with: - name: czkawka-windows-${{ github.sha }} + name: czkawka-windows-${{ github.sha }}-${{ matrix.use_heif }} path: | ./package if-no-files-found: error @@ -76,7 +93,7 @@ jobs: container_console_window: runs-on: ubuntu-22.04 container: - image: ghcr.io/piegamesde/gtk4-cross:gtk-4.8 + image: ghcr.io/mglolenstine/gtk4-cross:gtk-4.10 steps: - uses: actions/checkout@v1 - name: Install additional dependencies diff --git a/Cargo.lock b/Cargo.lock index 78bfeec..4c16c6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,7 +207,7 @@ dependencies = [ "arrayvec", "cc", "cfg-if", - "constant_time_eq 0.2.5", + "constant_time_eq 0.2.6", "digest", ] @@ -428,9 +428,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "constant_time_eq" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" [[package]] name = "core-foundation-sys" @@ -517,7 +517,7 @@ dependencies = [ [[package]] name = "czkawka_cli" -version = "5.1.0" +version = "6.0.0" dependencies = [ "clap", "czkawka_core", @@ -526,7 +526,7 @@ dependencies = [ [[package]] name = "czkawka_core" -version = "5.1.0" +version = "6.0.0" dependencies = [ "anyhow", "audio_checker", @@ -570,7 +570,7 @@ dependencies = [ [[package]] name = "czkawka_gui" -version = "5.1.0" +version = "6.0.0" dependencies = [ "chrono", "crossbeam-channel", @@ -1799,9 +1799,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.18" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "loom" @@ -2206,9 +2206,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" -version = "0.17.8" +version = "0.17.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaeebc51f9e7d2c150d3f3bfeb667f2aa985db5ef1e3d212847bdedb488beeaa" +checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" dependencies = [ "bitflags 1.3.2", "crc32fast", diff --git a/Changelog.md b/Changelog.md index 5ae6295..1d6c500 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,7 @@ -## Version 5.2.0 - ? +## Version 6.0.0 - 11.06.2023r - Add finding similar audio files by content - [#970](https://github.com/qarmin/czkawka/pull/970) - Allow to find duplicates by name/size at once - [#956](https://github.com/qarmin/czkawka/pull/956) +- Fix, simplify and speed up finding similar images - [#983](https://github.com/qarmin/czkawka/pull/956) - Fixed bug when cache for music tags not worked - [#970](https://github.com/qarmin/czkawka/pull/970) - Allow to set number of threads from CLI - [#972](https://github.com/qarmin/czkawka/pull/972) - Fix problem with invalid item sorting in bad extensions mode - [#972](https://github.com/qarmin/czkawka/pull/972) diff --git a/czkawka_cli/Cargo.toml b/czkawka_cli/Cargo.toml index 608bc49..84adbc1 100644 --- a/czkawka_cli/Cargo.toml +++ b/czkawka_cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "czkawka_cli" -version = "5.1.0" +version = "6.0.0" authors = ["Rafał Mikrut "] edition = "2021" rust-version = "1.67.1" @@ -17,7 +17,7 @@ image_hasher = "1.2" [dependencies.czkawka_core] path = "../czkawka_core" -version = "5.1.0" +version = "6.0.0" features = [] [features] diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index 140ceb2..f13d59c 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "czkawka_core" -version = "5.1.0" +version = "6.0.0" authors = ["Rafał Mikrut "] edition = "2021" rust-version = "1.67.1" diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index f5d7801..4e73e4a 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -379,9 +379,8 @@ impl BrokenFiles { let err = validate_pdf_error(&mut file_entry, e); if let PdfError::InvalidPassword = err { return None; - } else { - break; } + break; } } } diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index fc71867..f2f1602 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -682,6 +682,7 @@ impl SimilarImages { let mut hashes_similarity: HashMap = Default::default(); // Hashes used as child, (parent_hash, similarity) // Check them in chunks, to decrease number of used memory + // println!(); let base_hashes_chunks = base_hashes.chunks(1000); for chunk in base_hashes_chunks { let partial_results = chunk @@ -718,6 +719,10 @@ impl SimilarImages { .filter(|(original_hash, vec_similar_hashes)| !vec_similar_hashes.is_empty() || hashes_with_multiple_images.contains(*original_hash)) .collect::>(); + // for (hash, vec) in &partial_results { + // println!("{hash:?} --- {:?}", vec.iter().map(|e| e.1).collect::>()); + // } + if check_was_stopped.load(Ordering::Relaxed) { send_info_and_wait_for_ending_all_threads(&progress_thread_run, progress_thread_handle); return false; @@ -1304,155 +1309,193 @@ fn debug_check_for_duplicated_things( #[cfg(test)] mod tests { use bk_tree::BKTree; + use std::collections::HashMap; use std::path::PathBuf; use crate::common_directory::Directories; - use crate::similar_images::{FileEntry, Hamming, SimilarImages}; + use crate::similar_images::{FileEntry, Hamming, ImHash, SimilarImages}; #[test] fn test_compare_no_images() { - let mut similar_images = SimilarImages::default(); - similar_images.find_similar_images(None, None); - assert_eq!(similar_images.get_similar_images().len(), 0); + for _ in 0..100 { + let mut similar_images = SimilarImages::default(); + similar_images.find_similar_images(None, None); + assert_eq!(similar_images.get_similar_images().len(), 0); + } } #[test] fn test_compare_tolerance_0_normal_mode() { - let mut similar_images = SimilarImages { - similarity: 0, - ..Default::default() - }; + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 0, + ..Default::default() + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); - let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "cde.txt"); - let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "rrt.txt"); - let fe5 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "bld.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1.clone(), fe2.clone()]); - similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3.clone(), fe4.clone(), fe5.clone()]); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); + let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "cde.txt"); + let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "rrt.txt"); + let fe5 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "bld.txt"); - similar_images.find_similar_hashes(None, None); - assert_eq!(similar_images.get_similar_images().len(), 2); - let first_group = similar_images.get_similar_images()[0].iter().map(|e| &e.path).collect::>(); - let second_group = similar_images.get_similar_images()[1].iter().map(|e| &e.path).collect::>(); - // Initial order is not guaranteed, so we need to check both options - if similar_images.get_similar_images()[0][0].hash == fe1.hash { - assert_eq!(first_group, vec![&fe1.path, &fe2.path]); - assert_eq!(second_group, vec![&fe3.path, &fe4.path, &fe5.path]); - } else { - assert_eq!(first_group, vec![&fe3.path, &fe4.path, &fe5.path]); - assert_eq!(second_group, vec![&fe1.path, &fe2.path]); + add_hashes(&mut similar_images.image_hashes, vec![fe1.clone(), fe2.clone(), fe3.clone(), fe4.clone(), fe5.clone()]); + + similar_images.find_similar_hashes(None, None); + assert_eq!(similar_images.get_similar_images().len(), 2); + let first_group = similar_images.get_similar_images()[0].iter().map(|e| &e.path).collect::>(); + let second_group = similar_images.get_similar_images()[1].iter().map(|e| &e.path).collect::>(); + // Initial order is not guaranteed, so we need to check both options + if similar_images.get_similar_images()[0][0].hash == fe1.hash { + assert_eq!(first_group, vec![&fe1.path, &fe2.path]); + assert_eq!(second_group, vec![&fe3.path, &fe4.path, &fe5.path]); + } else { + assert_eq!(first_group, vec![&fe3.path, &fe4.path, &fe5.path]); + assert_eq!(second_group, vec![&fe1.path, &fe2.path]); + } } } #[test] fn test_simple_normal_one_group() { - let mut similar_images = SimilarImages { - similarity: 1, - ..Default::default() - }; + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 1, + ..Default::default() + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2]); - similar_images.find_similar_hashes(None, None); - assert_eq!(similar_images.get_similar_images().len(), 1); + similar_images.find_similar_hashes(None, None); + assert_eq!(similar_images.get_similar_images().len(), 1); + } } #[test] fn test_simple_normal_one_group_extended() { - let mut similar_images = SimilarImages { - similarity: 2, - use_reference_folders: false, - ..Default::default() - }; + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 2, + use_reference_folders: false, + ..Default::default() + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); - let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "rrd.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "bcd.txt"); + let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 2], "rrd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2]); - similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3]); - similar_images.find_similar_hashes(None, None); - assert_eq!(similar_images.get_similar_images().len(), 1); - assert_eq!(similar_images.get_similar_images()[0].len(), 3); + similar_images.find_similar_hashes(None, None); + assert_eq!(similar_images.get_similar_images().len(), 1); + assert_eq!(similar_images.get_similar_images()[0].len(), 3); + } } + // TODO this not works yet, + // Need to find a way to + // #[test] + // fn test_similar_similarity() { + // for _ in 0..100 { + // let mut similar_images = SimilarImages { + // similarity: 10, + // use_reference_folders: false, + // ..Default::default() + // }; + // + // let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_0001], "abc.txt"); + // let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_0010], "bcd.txt"); + // let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_0100], "rrd.txt"); + // let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0111_1111], "rdd.txt"); + // + // add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3, fe4]); + // + // similar_images.find_similar_hashes(None, None); + // assert_eq!(similar_images.get_similar_images().len(), 1); + // assert_eq!(similar_images.get_similar_images()[0].len(), 4); + // } + // } + #[test] fn test_simple_referenced_same_group() { - let mut similar_images = SimilarImages { - similarity: 0, - use_reference_folders: true, - directories: Directories { - reference_directories: vec![PathBuf::from("/home/rr/")], + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 0, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, ..Default::default() - }, - ..Default::default() - }; + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/bcd.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/bcd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2]); - similar_images.find_similar_hashes(None, None); - assert_eq!(similar_images.get_similar_images().len(), 0); + similar_images.find_similar_hashes(None, None); + assert_eq!(similar_images.get_similar_images().len(), 0); + } } #[test] fn test_simple_referenced_group_extended() { - let mut similar_images = SimilarImages { - similarity: 0, - use_reference_folders: true, - directories: Directories { - reference_directories: vec![PathBuf::from("/home/rr/")], + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 0, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, ..Default::default() - }, - ..Default::default() - }; + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2]); - similar_images.find_similar_hashes(None, None); - assert_eq!(similar_images.get_similar_images_referenced().len(), 1); - assert_eq!(similar_images.get_similar_images_referenced()[0].1.len(), 1); + similar_images.find_similar_hashes(None, None); + assert_eq!(similar_images.get_similar_images_referenced().len(), 1); + assert_eq!(similar_images.get_similar_images_referenced()[0].1.len(), 1); + } } #[test] fn test_simple_referenced_group_extended2() { - let mut similar_images = SimilarImages { - similarity: 0, - use_reference_folders: true, - directories: Directories { - reference_directories: vec![PathBuf::from("/home/rr/")], + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 0, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, ..Default::default() - }, - ..Default::default() - }; + }; - let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); - let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc2.txt"); - let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd.txt"); - let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd2.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/rr/abc2.txt"); + let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd.txt"); + let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 1], "/home/kk/bcd2.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1, fe2, fe3, fe4]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3, fe4]); - similar_images.find_similar_hashes(None, None); - let res = similar_images.get_similar_images_referenced(); - assert_eq!(res.len(), 1); - assert_eq!(res[0].1.len(), 2); - assert!(res[0].1.iter().all(|e| e.path.starts_with("/home/kk/"))); + similar_images.find_similar_hashes(None, None); + let res = similar_images.get_similar_images_referenced(); + assert_eq!(res.len(), 1); + assert_eq!(res[0].1.len(), 2); + assert!(res[0].1.iter().all(|e| e.path.starts_with("/home/kk/"))); + } } #[test] fn test_simple_normal_too_small_similarity() { - for _ in 0..50 { + for _ in 0..100 { let mut similar_images = SimilarImages { similarity: 1, use_reference_folders: false, @@ -1463,9 +1506,7 @@ mod tests { let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b00100], "bcd.txt"); let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b10000], "rrd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1]); - similar_images.image_hashes.insert(fe2.hash.clone(), vec![fe2]); - similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3]); similar_images.find_similar_hashes(None, None); let res = similar_images.get_similar_images(); @@ -1487,9 +1528,7 @@ mod tests { let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0000_1111], "bcd.txt"); let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0111_1111], "rrd.txt"); - similar_images.image_hashes.insert(fe1.hash.clone(), vec![fe1]); - similar_images.image_hashes.insert(fe2.hash.clone(), vec![fe2]); - similar_images.image_hashes.insert(fe3.hash.clone(), vec![fe3]); + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3]); similar_images.find_similar_hashes(None, None); let res = similar_images.get_similar_images(); @@ -1505,6 +1544,119 @@ mod tests { } } } + #[test] + fn test_reference_similarity_only_one() { + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 1, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, + ..Default::default() + }; + + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0001], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0011], "/home/kk/bcd.txt"); + + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2]); + + similar_images.find_similar_hashes(None, None); + let res = similar_images.get_similar_images_referenced(); + assert_eq!(res.len(), 1); + assert_eq!(res[0].1.len(), 1); + assert_eq!(res[0].0.path, PathBuf::from("/home/rr/abc.txt")); + assert_eq!(res[0].1[0].path, PathBuf::from("/home/kk/bcd.txt")); + } + } + #[test] + fn test_reference_too_small_similarity() { + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 1, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, + ..Default::default() + }; + + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0001], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0010], "/home/kk/bcd.txt"); + + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2]); + + similar_images.find_similar_hashes(None, None); + let res = similar_images.get_similar_images_referenced(); + assert_eq!(res.len(), 0); + } + } + + #[test] + fn test_reference_minimal() { + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 1, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, + ..Default::default() + }; + + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0001], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0011], "/home/kk/bcd.txt"); + let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0100], "/home/kk/bcd2.txt"); + let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b1100], "/home/rr/krkr.txt"); + + add_hashes(&mut similar_images.image_hashes, vec![fe1, fe2, fe3, fe4]); + + similar_images.find_similar_hashes(None, None); + let res = similar_images.get_similar_images_referenced(); + assert_eq!(res.len(), 2); + assert_eq!(res[0].1.len(), 1); + assert_eq!(res[1].1.len(), 1); + if res[0].1[0].path == PathBuf::from("/home/kk/bcd.txt") { + assert_eq!(res[0].0.path, PathBuf::from("/home/rr/abc.txt")); + assert_eq!(res[1].0.path, PathBuf::from("/home/rr/krkr.txt")); + } else if res[0].1[0].path == PathBuf::from("/home/kk/bcd2.txt") { + assert_eq!(res[0].0.path, PathBuf::from("/home/rr/krkr.txt")); + assert_eq!(res[1].0.path, PathBuf::from("/home/rr/abc.txt")); + } + } + } + + #[test] + fn test_reference_union() { + for _ in 0..100 { + let mut similar_images = SimilarImages { + similarity: 10, + use_reference_folders: true, + directories: Directories { + reference_directories: vec![PathBuf::from("/home/rr/")], + ..Default::default() + }, + ..Default::default() + }; + + let fe0 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b1000], "/home/rr/abc2.txt"); + let fe1 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0001], "/home/rr/abc.txt"); + let fe2 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b1110], "/home/kk/bcd.txt"); + let fe3 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b0100], "/home/kk/bcd2.txt"); + let fe4 = create_random_file_entry(vec![1, 1, 1, 1, 1, 1, 1, 0b1100], "/home/rr/krkr.txt"); + + add_hashes(&mut similar_images.image_hashes, vec![fe0, fe1, fe2, fe3, fe4]); + + similar_images.find_similar_hashes(None, None); + let res = similar_images.get_similar_images_referenced(); + assert_eq!(res.len(), 1); + assert_eq!(res[0].1.len(), 2); + assert_eq!(res[0].0.path, PathBuf::from("/home/rr/krkr.txt")); + } + } #[test] fn test_tolerance() { @@ -1525,6 +1677,19 @@ mod tests { bktree.add(fe1); let (similarity, _hash) = bktree.find(&fe2, 100).next().unwrap(); assert_eq!(similarity, 1); + + let fe1 = vec![1, 1, 1, 1, 1, 1, 1, 0b0000_0000]; + let fe2 = vec![1, 1, 1, 1, 1, 1, 1, 0b0000_1000]; + let mut bktree = BKTree::new(Hamming); + bktree.add(fe1); + let (similarity, _hash) = bktree.find(&fe2, 100).next().unwrap(); + assert_eq!(similarity, 1); + } + + fn add_hashes(hashmap: &mut HashMap>, file_entries: Vec) { + for fe in file_entries { + hashmap.entry(fe.hash.clone()).or_insert_with(Vec::new).push(fe); + } } fn create_random_file_entry(hash: Vec, name: &str) -> FileEntry { diff --git a/czkawka_gui/Cargo.toml b/czkawka_gui/Cargo.toml index ae6e8e1..8781792 100644 --- a/czkawka_gui/Cargo.toml +++ b/czkawka_gui/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "czkawka_gui" -version = "5.1.0" +version = "6.0.0" authors = ["Rafał Mikrut "] edition = "2021" rust-version = "1.67.1" @@ -59,7 +59,7 @@ features = ["v4_6"] [dependencies.czkawka_core] path = "../czkawka_core" -version = "5.1.0" +version = "6.0.0" features = [] [features] diff --git a/czkawka_gui/i18n/cs/czkawka_gui.ftl b/czkawka_gui/i18n/cs/czkawka_gui.ftl index b125eab..82fe348 100644 --- a/czkawka_gui/i18n/cs/czkawka_gui.ftl +++ b/czkawka_gui/i18n/cs/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Přenosová rychlost music_genre_checkbox = Žánr music_length_checkbox = Délka music_comparison_checkbox = Přibližné srovnání +music_checking_by_tags = Štítky +music_checking_by_content = Obsah +same_music_seconds_label = Minimální délka trvání druhého fragmentu +same_music_similarity_label = Maximální rozdíl +same_music_tooltip = + Vyhledávání podobných hudebních souborů podle jejich obsahu může být nakonfigurováno nastavením: + + - Minimální doba fragmentu, po které mohou být hudební soubory identifikovány jako podobné + - Maximální rozdíl mezi dvěma testovanými fragmenty + + Klíč k dobrým výsledkům je najít rozumné kombinace těchto parametrů, pro stanovení. + + Nastavení minimální doby na 5 s a maximální rozdíl na 1,0 bude hledat téměř stejné fragmenty v souborech. + Čas 20 s a maximální rozdíl 6,0 na druhé straně funguje dobře pro nalezení remixů/živých verzí atd. + + Ve výchozím nastavení je každý hudební soubor porovnáván mezi sebou a to může trvat dlouho při testování mnoha souborů, takže je obvykle lepší používat referenční složky a specifikovat, které soubory mají být vzájemně porovnány (se stejným množstvím souborů, porovnávání otisků prstů bude rychlejší alespoň 4x než bez referenčních složek). music_comparison_checkbox_tooltip = Vyhledá podobné hudební soubory pomocí AI, která používá strojové učení k odstranění závorek z fráze. Například, pokud je tato možnost povolena, příslušné soubory budou považovány za duplicitní soubory: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Pokud je povoleno, skupiny pouze záznamy, pokud mají přesně stejný název, např.Żołd <-> Żołd Zakázání takové volby bude názvy skupin bez kontroly, zda je každé písmeno stejné velikosti, např. żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Velikost a název duplicate_mode_name_combo_box = Název duplicate_mode_size_combo_box = Velikost duplicate_mode_hash_combo_box = Hash @@ -388,8 +405,11 @@ progress_scanning_image = Hashování { $file_checked }/{ $all_files } obrázku progress_comparing_image_hashes = Porovnávám { $file_checked }/{ $all_files } hash obrázků progress_scanning_music_tags_end = Porovnávání značek s { $file_checked }/{ $all_files } hudebním souborem progress_scanning_music_tags = Čtení tagů z { $file_checked }/{ $all_files } hudebního souboru +progress_scanning_music_content_end = Porovnání otisku prstu v { $file_checked }/{ $all_files } hudebního souboru +progress_scanning_music_content = Výpočet otisku prstu { $file_checked }/{ $all_files } hudebního souboru progress_scanning_empty_folders = Skenování { $folder_number } složky progress_scanning_size = Skenování velikosti { $file_number } souboru +progress_scanning_size_name = Skenování jména a velikosti souboru { $file_number } progress_scanning_name = Skenování názvu souboru { $file_number } progress_analyzed_partial_hash = Analyzován částečný hash souborů { $file_checked }/{ $all_files } progress_analyzed_full_hash = Analyzováno úplné hash souborů { $file_checked }/{ $all_files } diff --git a/czkawka_gui/i18n/de/czkawka_gui.ftl b/czkawka_gui/i18n/de/czkawka_gui.ftl index 52550bc..e335776 100644 --- a/czkawka_gui/i18n/de/czkawka_gui.ftl +++ b/czkawka_gui/i18n/de/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bitrate music_genre_checkbox = Genre music_length_checkbox = Dauer music_comparison_checkbox = Ungefährer Vergleich +music_checking_by_tags = Tags +music_checking_by_content = Inhalt +same_music_seconds_label = Minimale Dauer des Fragment Sekunde +same_music_similarity_label = Maximaler Unterschied +same_music_tooltip = + Die Suche nach ähnlichen Musikdateien nach dem Inhalt kann über die Einstellung konfiguriert werden: + + - Die minimale Fragmentzeit, nach der Musikdateien als ähnlich identifiziert werden können + - Der maximale Unterschied zwischen zwei getesteten Fragmenten + + Der Schlüssel zu guten Ergebnissen ist die Suche nach sinnvollen Kombinationen dieser Parameter. für bereitgestellt. + + Wenn Sie die minimale Zeit auf 5 Sekunden und den maximalen Unterschied auf 1,0 setzen, werden fast identische Fragmente in den Dateien gesucht. + Eine Zeit von 20 Sekunden und ein maximaler Unterschied von 6.0 hingegen funktioniert gut um Remix/Live-Versionen zu finden. + + Standardmäßig wird jede Musikdatei miteinander verglichen, und dies kann viel Zeit in Anspruch nehmen, wenn viele Dateien getestet werden so ist es in der Regel besser, Referenzordner zu verwenden und festzulegen, welche Dateien miteinander verglichen werden sollen (mit gleicher Dateigröße Der Vergleich von Fingerabdrücken wird mindestens 4x schneller als ohne Referenzordner sein). music_comparison_checkbox_tooltip = Mit Hilfe von einer KI, die maschinelles Lernen nutzt, um Klammern aus Sätzen zu entfernen, wird nach ähnlichen Musikdateien gesucht. Wenn die Option aktiviert ist, werden die folgenden Dateien zum Beispiel als Duplikate betrachtet: @@ -22,6 +38,7 @@ duplicate_case_sensitive_name = Gross-/Kleinschreibung beachten duplicate_case_sensitive_name_tooltip = Wenn aktiviert, gruppieren Sie nur Datensätze, wenn sie genau denselben Namen haben, z. żoŁD <-> Żołd Deaktivieren dieser Option gruppiert Namen ohne zu überprüfen, ob jeder Buchstabe die gleiche Größe wie żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Größe und Name duplicate_mode_name_combo_box = Name duplicate_mode_size_combo_box = Größe duplicate_mode_hash_combo_box = Hash @@ -387,8 +404,11 @@ progress_scanning_image = Hashing von { $file_checked }/{ $all_files } Bild progress_comparing_image_hashes = Vergleicht { $file_checked }/{ $all_files } Bild-Hash progress_scanning_music_tags_end = Vergleicht Tags von { $file_checked }/{ $all_files } Musikdatei progress_scanning_music_tags = Lese Tags von { $file_checked }/{ $all_files } Musikdatei +progress_scanning_music_content_end = Vergleiche Fingerabdruck von { $file_checked }/{ $all_files } Musikdatei +progress_scanning_music_content = Berechne Fingerabdruck von { $file_checked }/{ $all_files } Musikdatei progress_scanning_empty_folders = Scanne { $folder_number } Ordner progress_scanning_size = Scanne Größe der { $file_number } Datei +progress_scanning_size_name = Scanne Namen und Größe der { $file_number } Datei progress_scanning_name = Scanne Name der { $file_number } Datei progress_analyzed_partial_hash = Teilhash von { $file_checked }/{ $all_files } Dateien analysiert progress_analyzed_full_hash = Analysiert voller Hash von { $file_checked }/{ $all_files } Dateien diff --git a/czkawka_gui/i18n/es/czkawka_gui.ftl b/czkawka_gui/i18n/es/czkawka_gui.ftl index d9066b4..73ec605 100644 --- a/czkawka_gui/i18n/es/czkawka_gui.ftl +++ b/czkawka_gui/i18n/es/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Tasa de bits music_genre_checkbox = Género music_length_checkbox = Duración music_comparison_checkbox = Comparación aproximada +music_checking_by_tags = Etiquetas +music_checking_by_content = Contenido +same_music_seconds_label = Duración mínima del segundo fragmento +same_music_similarity_label = Diferencia máxima +same_music_tooltip = + Buscando archivos de música similares por su contenido se puede configurar configurando: + + - El tiempo mínimo de fragmento después del cual los archivos de música pueden ser identificados como similares + - La diferencia máxima entre dos fragmentos probados + + La clave para los buenos resultados es encontrar combinaciones sensatas de estos parámetros, para proporcionar. + + Establecer el tiempo mínimo a 5 s y la diferencia máxima a 1.0, buscará fragmentos casi idénticos en los archivos. + Un tiempo de 20 años y una diferencia máxima de 6.0, por otro lado, funciona bien para encontrar remixes/versiones en vivo, etc. + + Por defecto, cada archivo de música se compara entre sí y esto puede tomar mucho tiempo al probar muchos archivos, por lo que normalmente es mejor usar carpetas de referencia y especificar qué archivos deben compararse entre sí (con la misma cantidad de archivos, comparar las huellas dactilares será más rápido al menos 4x que sin carpetas de referencia). music_comparison_checkbox_tooltip = Busca archivos de música similares usando IA, que usa el aprendizaje automático para eliminar paréntesis de una frase. Por ejemplo, con esta opción activada, los archivos en cuestión se considerarán duplicados: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Cuando está habilitado, agrupa registros sólo cuando tienen exactamente el mismo nombre p.ej. Żołd <-> Żołd Deshabilitar tal opción agrupará nombres sin comprobar si cada letra tiene el mismo tamaño, p. ej. żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Tamaño y nombre duplicate_mode_name_combo_box = Nombre duplicate_mode_size_combo_box = Tamaño duplicate_mode_hash_combo_box = Hash @@ -67,8 +84,8 @@ image_hash_alg_tooltip = big_files_mode_combobox_tooltip = Permite buscar archivos más pequeños/mayores big_files_mode_label = Archivos marcados big_files_mode_smallest_combo_box = El más pequeño -big_files_mode_biggest_combo_box = El Bigote -main_notebook_duplicates = Duplicar archivos +big_files_mode_biggest_combo_box = El más grande +main_notebook_duplicates = Archivos Duplicados main_notebook_empty_directories = Directorios vacíos main_notebook_big_files = Archivos grandes main_notebook_empty_files = Archivos vacíos @@ -103,13 +120,13 @@ main_label_hash_type = Tipo de Hash main_label_hash_size = Tamaño hash main_label_size_bytes = Tamaño (bytes) main_label_min_size = Mínimo -main_label_max_size = Máx +main_label_max_size = Máximo main_label_shown_files = Número de archivos mostrados -main_label_resize_algorithm = Redimensionar algoritmo +main_label_resize_algorithm = Algoritmo de Redimensionar main_label_similarity = Similarity{ " " } main_check_box_broken_files_audio = Sonido main_check_box_broken_files_pdf = Pdf -main_check_box_broken_files_archive = Archivar +main_check_box_broken_files_archive = Guardar main_check_box_broken_files_image = Imagen check_button_general_same_size = Ignorar el mismo tamaño check_button_general_same_size_tooltip = Ignorar de los resultados, archivos que tienen el mismo tamaño - generalmente son 1:1 duplicados @@ -162,7 +179,7 @@ popover_reverse = Invertir selección popover_select_all_except_oldest = Seleccionar todo excepto más antiguo popover_select_all_except_newest = Seleccionar todo excepto el más reciente popover_select_one_oldest = Seleccione uno más antiguo -popover_select_one_newest = Seleccione un nuevo +popover_select_one_newest = Seleccione uno más nuevo popover_select_custom = Seleccionar personalizado popover_unselect_custom = Deseleccionar personalizado popover_select_all_images_except_biggest = Seleccionar todo excepto mayor @@ -388,8 +405,11 @@ progress_scanning_image = Hash de { $file_checked }/{ $all_files } imagen progress_comparing_image_hashes = Comparando hash de imagen { $file_checked }/{ $all_files } progress_scanning_music_tags_end = Comparando etiquetas de { $file_checked }/{ $all_files } archivo de música progress_scanning_music_tags = Leyendo etiquetas del archivo de música { $file_checked }/{ $all_files } +progress_scanning_music_content_end = Comparando huella dactilar de { $file_checked }/{ $all_files } archivo de música +progress_scanning_music_content = Calculando huella dactilar de { $file_checked }/{ $all_files } archivo de música progress_scanning_empty_folders = Escaneando carpeta { $folder_number } progress_scanning_size = Escaneando tamaño del archivo { $file_number } +progress_scanning_size_name = Escaneando nombre y tamaño del archivo { $file_number } progress_scanning_name = Escaneando nombre del archivo { $file_number } progress_analyzed_partial_hash = Has analizado el hash parcial de { $file_checked }/{ $all_files } archivos progress_analyzed_full_hash = Se ha analizado el hash completo de { $file_checked }/{ $all_files } archivos diff --git a/czkawka_gui/i18n/fr/czkawka_gui.ftl b/czkawka_gui/i18n/fr/czkawka_gui.ftl index e8ec952..f7c08c9 100644 --- a/czkawka_gui/i18n/fr/czkawka_gui.ftl +++ b/czkawka_gui/i18n/fr/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Débit binaire music_genre_checkbox = Genre music_length_checkbox = Longueur music_comparison_checkbox = Comparaison approximative +music_checking_by_tags = Tags +music_checking_by_content = Contenus +same_music_seconds_label = Durée minimale de seconde de fragment +same_music_similarity_label = Différence maximale +same_music_tooltip = + La recherche de fichiers de musique similaires par son contenu peut être configurée par la configuration : + + - Le temps de fragment minimum après lequel les fichiers musicaux peuvent être identifiés comme similaires + - La différence maximale entre deux fragments testés + + La clé de bons résultats est de trouver des combinaisons sensées de ces paramètres, pour ce qui est fourni. + + En fixant le temps minimum à 5 secondes et la différence maximale à 1.0, cherchera des fragments presque identiques dans les fichiers. + Un temps de 20 secondes et une différence maximale de 6.0, d'autre part, fonctionne bien pour trouver des remixes/versions live, etc. + + Par défaut, chaque fichier de musique est comparé l'un à l'autre et cela peut prendre beaucoup de temps lors du test de plusieurs fichiers, donc il est généralement préférable d'utiliser des dossiers de référence et de spécifier quels fichiers doivent être comparés les uns avec les autres (avec la même quantité de fichiers, la comparaison des empreintes digitales sera plus rapide au moins 4x que sans dossier de référence). music_comparison_checkbox_tooltip = Il recherche des fichiers de musique similaires à l’aide d’une intelligence artificielle, qui utilise le machine learning pour supprimer les parenthèses d’une phrase, par exemple avec cette option activée, les fichiers en question seront considérés comme des doublons : @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Lorsqu'il est activé, ne grouper que les enregistrements quand ils ont exactement le même nom (p. ex. Żołd <-> Żołd Désactiver cette option va regrouper les noms sans vérifier si chaque lettre a la même taille, par exemple żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Taille et nom duplicate_mode_name_combo_box = Nom duplicate_mode_size_combo_box = Taille duplicate_mode_hash_combo_box = Hachage @@ -388,8 +405,11 @@ progress_scanning_image = Hachage de l'image { $file_checked }/{ $all_files } progress_comparing_image_hashes = Comparaison du hachage de l'image { $file_checked }/{ $all_files } progress_scanning_music_tags_end = Comparaison des tags du fichier de musique { $file_checked }/{ $all_files } progress_scanning_music_tags = Lecture des balises du fichier de musique { $file_checked }/{ $all_files } +progress_scanning_music_content_end = Comparaison de l'empreinte digitale du fichier de musique { $file_checked }/{ $all_files } +progress_scanning_music_content = Calcul de l'empreinte digitale du fichier de musique { $file_checked }/{ $all_files } progress_scanning_empty_folders = Analyse du dossier { $folder_number } progress_scanning_size = Analyse de la taille du fichier { $file_number } +progress_scanning_size_name = Analyse du nom et de la taille du fichier { $file_number } progress_scanning_name = Analyse du nom du fichier { $file_number } progress_analyzed_partial_hash = Hash partiel analysé des fichiers { $file_checked }/{ $all_files } progress_analyzed_full_hash = Hash complet analysé des fichiers { $file_checked }/{ $all_files } diff --git a/czkawka_gui/i18n/it/czkawka_gui.ftl b/czkawka_gui/i18n/it/czkawka_gui.ftl index 32389a3..ed71874 100644 --- a/czkawka_gui/i18n/it/czkawka_gui.ftl +++ b/czkawka_gui/i18n/it/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bitrate music_genre_checkbox = Genere music_length_checkbox = Durata music_comparison_checkbox = Confronto approssimativo +music_checking_by_tags = Etichette +music_checking_by_content = Contenuto +same_music_seconds_label = Durata minima del frammento +same_music_similarity_label = Differenza massima +same_music_tooltip = + La ricerca di file musicali simili dal suo contenuto può essere configurata impostando: + + - Il tempo minimo di frammento dopo il quale i file musicali possono essere identificati come simili + - La differenza massima tra due frammenti testati + + La chiave per ottenere buoni risultati è trovare combinazioni sensate di questi parametri, per fornito. + + Impostando il tempo minimo a 5s e la differenza massima a 1.0, cercherà frammenti quasi identici nei file. + Un tempo di 20 anni e una differenza massima di 6.0, d'altra parte, funziona bene per trovare remix/versioni live ecc. + + Per impostazione predefinita, ogni file musicale viene confrontato tra loro e questo può richiedere molto tempo quando si testano molti file, quindi è di solito meglio usare le cartelle di riferimento e specificare quali file devono essere confrontati tra loro (con la stessa quantità di file, il confronto delle impronte digitali sarà più veloce di almeno 4x che senza cartelle di riferimento). music_comparison_checkbox_tooltip = Cerca file musicali simili usando l'IA, che utilizza l'apprendimento automatico per rimuovere parentesi da una frase. Ad esempio, con questa opzione abilitata, i file in questione saranno considerati duplicati: @@ -22,6 +38,7 @@ duplicate_case_sensitive_name = Case Sensitive duplicate_case_sensitive_name_tooltip = Se abilitato, raggruppa solo i record quando hanno esattamente lo stesso nome, ad es. Żołd <-> Żołd La disattivazione di tale opzione raggrupperà i nomi senza controllare se ogni lettera ha le stesse dimensioni, ad esempio żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Dimensione e nome duplicate_mode_name_combo_box = Nome duplicate_mode_size_combo_box = Dimensione duplicate_mode_hash_combo_box = Hash @@ -387,8 +404,11 @@ progress_scanning_image = Hashing di { $file_checked }/{ $all_files } image progress_comparing_image_hashes = Confrontando { $file_checked }/{ $all_files } hash delle immagini progress_scanning_music_tags_end = Confrontando le etichette di { $file_checked }/{ $all_files } file musicali progress_scanning_music_tags = Leggendo le etichette di { $file_checked }/{ $all_files } file musicali +progress_scanning_music_content_end = Confronto delle impronte digitali di { $file_checked }/{ $all_files } file musicale +progress_scanning_music_content = Calcolo dell'impronta digitale di { $file_checked }/{ $all_files } file musicale progress_scanning_empty_folders = Verificando { $folder_number } cartelle progress_scanning_size = Leggendo le dimensioni di { $file_number } file +progress_scanning_size_name = Scansione nome e dimensione del file { $file_number } progress_scanning_name = Leggendo il nome di { $file_number } file progress_analyzed_partial_hash = Analizzato gli hash parziali di { $file_checked }/{ $all_files } file progress_analyzed_full_hash = Analizzato gli hash completi di { $file_checked }/{ $all_files } file diff --git a/czkawka_gui/i18n/ja/czkawka_gui.ftl b/czkawka_gui/i18n/ja/czkawka_gui.ftl index 5ae3ef9..8c4e60c 100644 --- a/czkawka_gui/i18n/ja/czkawka_gui.ftl +++ b/czkawka_gui/i18n/ja/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = ビットレート music_genre_checkbox = ジャンル music_length_checkbox = 長さ music_comparison_checkbox = おおよその比較 +music_checking_by_tags = タグ +music_checking_by_content = コンテンツ +same_music_seconds_label = フラグメント最小秒の持続時間 +same_music_similarity_label = 最大差 +same_music_tooltip = + Searching for similar music files by its content can be configured by setting: + + - The minimum fragment time after which music files can be identified as similar + - The maximum difference difference between two tested fragments + + The key to good results is to find sensible combinations of these parameters, for provided. + + Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files. + A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc. + + By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders). music_comparison_checkbox_tooltip = 機械学習によりフレーズから括弧とその中身を除外するAIを使用して、類似の音楽ファイルを検索します。このオプションが有効な場合、例えば以下のファイルは重複とみなされます: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = 有効な場合、グループのみレコードまったく同じ名前を持っている場合など。 Z ołd <-> Z ołd このようなオプションを無効にすると、各文字のサイズが同じかどうかを確認せずに名前をグループ化します。例: z o D <-> Z ołd +duplicate_mode_size_name_combo_box = サイズと名前 duplicate_mode_name_combo_box = 名前 duplicate_mode_size_combo_box = サイズ duplicate_mode_hash_combo_box = ハッシュ @@ -388,8 +405,11 @@ progress_scanning_image = { $file_checked }/{ $all_files } の画像のハッシ progress_comparing_image_hashes = { $file_checked }/{ $all_files } 画像ハッシュの比較 progress_scanning_music_tags_end = { $file_checked }/{ $all_files } 音楽ファイルのタグの比較 progress_scanning_music_tags = { $file_checked }/{ $all_files } 音楽ファイルのタグを読み込み中 +progress_scanning_music_content_end = { $file_checked }/{ $all_files } 音楽ファイルのフィンガープリントの比較 +progress_scanning_music_content = { $file_checked }/{ $all_files } 音楽ファイルのフィンガープリントを計算中 progress_scanning_empty_folders = { $folder_number } フォルダをスキャン中 progress_scanning_size = { $file_number } ファイルのサイズをスキャン中 +progress_scanning_size_name = 名前と { $file_number } ファイルのサイズをスキャンしています progress_scanning_name = { $file_number } ファイルの名前をスキャン中 progress_analyzed_partial_hash = { $file_checked }/{ $all_files } ファイルの部分ハッシュを分析中 progress_analyzed_full_hash = { $file_checked }/{ $all_files } ファイルの完全ハッシュを分析中 diff --git a/czkawka_gui/i18n/ko/czkawka_gui.ftl b/czkawka_gui/i18n/ko/czkawka_gui.ftl index 5c5a12a..3fb9cc6 100644 --- a/czkawka_gui/i18n/ko/czkawka_gui.ftl +++ b/czkawka_gui/i18n/ko/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = 비트레이트 music_genre_checkbox = 장르 music_length_checkbox = 길이 music_comparison_checkbox = 근사값 비교 +music_checking_by_tags = Tags +music_checking_by_content = Content +same_music_seconds_label = Minimal fragment second duration +same_music_similarity_label = Maximum difference +same_music_tooltip = + Searching for similar music files by its content can be configured by setting: + + - The minimum fragment time after which music files can be identified as similar + - The maximum difference difference between two tested fragments + + The key to good results is to find sensible combinations of these parameters, for provided. + + Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files. + A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc. + + By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders). music_comparison_checkbox_tooltip = 기계학습을 통해 각 항목의 괄호를 제거합니다. 예를 들어, 다음 두 파일은 같은 파일로 인식될 것입니다. @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = 대소문자 구분이 켜져 있으면, 완전히 같은 이름만이 중복 파일로 검색됩니다. 예시: Żołd <-> Żołd 대소문자 구분이 꺼져 있으면, 대문자와 소문자 구별을 하지 않고 중복 파일을 검색합니다. 예시: żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Size and Name duplicate_mode_name_combo_box = 파일명 duplicate_mode_size_combo_box = 파일 크기 duplicate_mode_hash_combo_box = 해시 @@ -230,15 +247,15 @@ bottom_hardlink_button_tooltip = 그룹 내에서 최소한 2개의 파일이 선택되어 있어야 합니다. 첫 번째 파일은 그대로 남으며, 두 번째 이후 파일은 첫 번째 파일로 향하는 하드 링크가 됩니다. bottom_hardlink_button_not_available_tooltip = - Create hardlinks. - Button is disabled, because hardlinks cannot be created. - Hardlinks only works with administrator privileges on Windows, so be sure to run app as administrator. - If app already works with such privileges check for similar issues on Github. + 하드 링크를 생성합니다. + 현재 하드 링크를 만들 수 없어 버튼이 비활성화되었습니다. + Windows에서 하드 링크는 관리자 권한으로만 만들 수 있습니다. 프로그램이 관리자 권한으로 실행되었는지 확인하세요. + 만일 프로그램이 이미 관리자 권한으로 실행되었다면, Github에서 비슷한 이슈가 있는지 확인해보세요. bottom_move_button_tooltip = 선택된 디렉터리로 파일을 이동합니다. 이 동작은 원본이 위치한 경로를 전부 무시하고, 선택한 경로로 파일을 전부 복사합니다. 만일 2개 이상의 파일이 같은 이름을 가지고 있다면, 첫 번째 이후의 파일은 복사에 실패하고 오류 메시지를 보여줄 것입니다. -bottom_sort_button_tooltip = Sorts files/folders according to selected method. +bottom_sort_button_tooltip = 파일/폴더를 선택한 방법으로 정렬합니다. bottom_show_errors_tooltip = 하단 텍스트 패널을 보이거나 숨깁니다. bottom_show_upper_notebook_tooltip = 상단 패널을 보이거나 숨깁니다. # Progress Window @@ -262,9 +279,9 @@ header_about_button_tooltip = 이 앱에 대한 정보창을 엽니다. ## General -settings_number_of_threads = Number of used threads -settings_number_of_threads_tooltip = Number of used threads, 0 means that all available threads will be used. -settings_label_restart = You need to restart app to apply settings! +settings_number_of_threads = 스레드 수 +settings_number_of_threads_tooltip = 사용할 스레드 수입니다. 0이면 가능한 최대 스레드를 사용합니다. +settings_label_restart = 이 설정을 적용하려면 프로그램을 재시작해야 합니다! settings_ignore_other_filesystems = 다른 파일시스템 무시(Linux에서만) settings_ignore_other_filesystems_tooltip = 검색할 디렉터리와 파일시스템이 다른 디렉터리를 무시합니다. @@ -280,7 +297,7 @@ settings_confirm_link_button_tooltip = 하드 링크/심볼릭 링크 버튼을 settings_confirm_group_deletion_button_tooltip = 그룹의 모든 항목을 삭제할 경우 경고창을 보여줍니다. settings_show_text_view_button_tooltip = UI 하단에 텍스트 패널을 보여줍니다. settings_use_cache_button_tooltip = 파일 캐시를 사용합니다. -settings_save_also_as_json_button_tooltip = 캐시를 사람이 읽을 수 있도록 JSON 포맥으로 저장합니다. 캐시 내용을 수정할 수 있습니다. 만일 bin 확장자를 가진 바이너리 캐시 파일이 없으면, JSON 캐시가 프로그램 시작 시에 대신 로드됩니다. +settings_save_also_as_json_button_tooltip = 캐시를 (사람이 읽을 수 있는) JSON 포맷으로 저장합니다. 캐시 내용을 수정할 수 있습니다. 만일 bin 확장자를 가진 바이너리 캐시 파일이 없으면, JSON 캐시가 프로그램 시작 시에 대신 로드됩니다. settings_use_trash_button_tooltip = 파일을 영구 삭제하는 대신 휴지통으로 이동합니다. settings_language_label_tooltip = UI에 표시될 언어를 설정합니다. settings_save_at_exit_button = 프로그램을 닫을 때 설정을 저장 @@ -386,8 +403,11 @@ progress_scanning_image = { $file_checked }/{ $all_files }개 이미지 해시 progress_comparing_image_hashes = { $file_checked }/{ $all_files }개 이미지 해시 비교 중 progress_scanning_music_tags_end = { $file_checked }/{ $all_files }개 음악 파일 태그 검색 중 progress_scanning_music_tags = { $file_checked }/{ $all_files }개 음악 파일 태그 읽는 중 +progress_scanning_music_content_end = Comparing fingerprint of { $file_checked }/{ $all_files } music file +progress_scanning_music_content = Calculating fingerprint of { $file_checked }/{ $all_files } music file progress_scanning_empty_folders = { $folder_number }개 폴더 검색 중 progress_scanning_size = { $file_number }개 파일의 크기 스캔 중 +progress_scanning_size_name = Scanning name and size of { $file_number } file progress_scanning_name = { $file_number }개 파일의 이름 스캔 중 progress_analyzed_partial_hash = { $file_checked }/{ $all_files }개 파일의 부분 해시 계산 중 progress_analyzed_full_hash = { $file_checked }/{ $all_files }개 파일의 전체 해시 계산 중 diff --git a/czkawka_gui/i18n/no/czkawka_gui.ftl b/czkawka_gui/i18n/no/czkawka_gui.ftl index ff6e15f..bc72653 100644 --- a/czkawka_gui/i18n/no/czkawka_gui.ftl +++ b/czkawka_gui/i18n/no/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bitrate music_genre_checkbox = Sjanger music_length_checkbox = Lengde music_comparison_checkbox = Omtrentlig sammenligning +music_checking_by_tags = Tagger +music_checking_by_content = Innhold +same_music_seconds_label = Minste fragment andre varighet +same_music_similarity_label = Maksimal differanse +same_music_tooltip = + Søker etter lignende musikkfiler av innholdet kan konfigureres ved å gå inn: + + - Minimumsfragmenteringstiden etter hvilken musikkfiler som kan identifiseres som lignende + - Maksimal forskjell mellom to testede fragmenter + + Nøkkelen til gode resultater er å finne fornuftige kombinasjoner av disse parametrene, for utlevert. + + Angir minimum tid til 5 s og maksimal forskjell til 1,0, vil se etter nesten identiske fragmenter i filene. + En tid på 20 s og en maksimal forskjell på 6.0, for den andre siden fungerer bra for å finne remikser/levende versjoner osv. + + Som standard kan hver musikkfil sammenlignes med hverandre, og dette kan ta mye tid når du tester mange filer, slik at det vanligvis er bedre å bruke referanselapper og spesifisere hvilke filer som skal sammenlignes med hverandre (med samme mengde filer, å sammenligne fingeravtrykk vil være raskere minst 4 x enn uten referansemapper). music_comparison_checkbox_tooltip = Den søker etter lignende musikkfiler ved hjelp av AI, som bruker maskiner til å fjerne parenteser fra et frase. For eksempel, med dette alternativet er aktivert. filene du vil bli betraktet som duplikater: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Når aktivert, vil du bare gruppere når de har nøyaktig samme navn, f.eks. Żołd <-> Żołd Deaktivering av en slik opsjon vil gi deg egne navn uten å sjekke om hver bokstav er like stort, f.eks. żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Størrelse og navn duplicate_mode_name_combo_box = Navn duplicate_mode_size_combo_box = Størrelse duplicate_mode_hash_combo_box = Hash @@ -388,8 +405,11 @@ progress_scanning_image = Hashing av { $file_checked }/{ $all_files } bilde progress_comparing_image_hashes = Sammenligner { $file_checked }/{ $all_files } bilde-hash progress_scanning_music_tags_end = Sammenligner tagger med { $file_checked }/{ $all_files } musikkfil progress_scanning_music_tags = Leser tagger på { $file_checked }/{ $all_files } musikkfil +progress_scanning_music_content_end = Sammenligner fingeravtrykk på { $file_checked }/{ $all_files } musikkfil +progress_scanning_music_content = Beregner fingeravtrykk på { $file_checked }/{ $all_files } musikkfil progress_scanning_empty_folders = Skanner { $folder_number } mappe progress_scanning_size = Skanner størrelse på { $file_number } fil +progress_scanning_size_name = Skanning av navn og størrelse på { $file_number } fil progress_scanning_name = Skanning av navn på { $file_number } fil progress_analyzed_partial_hash = Analyserte delvis hash med { $file_checked }/{ $all_files } filer progress_analyzed_full_hash = Analyserte full hash med { $file_checked }/{ $all_files } filer diff --git a/czkawka_gui/i18n/pl/czkawka_gui.ftl b/czkawka_gui/i18n/pl/czkawka_gui.ftl index 95028cb..7c8ebd6 100644 --- a/czkawka_gui/i18n/pl/czkawka_gui.ftl +++ b/czkawka_gui/i18n/pl/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bitrate music_genre_checkbox = Gatunek music_length_checkbox = Długość music_comparison_checkbox = Przybliżone Porównywanie +music_checking_by_tags = Tagi +music_checking_by_content = Zawartość +same_music_seconds_label = Minimalny fragment drugi czas trwania +same_music_similarity_label = Maksymalna różnica +same_music_tooltip = + Wyszukiwanie podobnych plików muzycznych przez jego zawartość można skonfigurować przez ustawienie: + + - Minimalny czas fragmentu, po którym pliki muzyczne mogą być zidentyfikowane jako podobne + - Maksymalna różnica między dwoma testowanymi fragmentami + + Kluczem do dobrych wyników jest znalezienie rozsądnych kombinacji tych parametrów, do dostarczania. + + Ustawianie minimalnego czasu na 5s i maksymalnej różnicy na 1.0, będzie szukać prawie identycznych fragmentów w plikach. + Czas 20s i maksymalna różnica 6.0, z drugiej strony, dobrze działa w poszukiwaniu remiksów/wersji na żywo itp. + + Domyślnie każdy plik muzyczny jest porównywany ze sobą, co może zająć dużo czasu podczas testowania wielu plików, więc zwykle lepiej jest używać folderów referencyjnych i określać, które pliki mają być porównywane ze sobą (z taką samą ilością plików, porównywanie odcisków palców będzie szybsze niż bez folderów referencyjnych). music_comparison_checkbox_tooltip = Wyszukuje podobne pliki muzyczne za pomocą AI, która używa nauki maszynowej, aby usunąć nawiasy z frazy. Na przykład, z tą opcją włączoną, rozpatrywane pliki będą traktowane jako duplikaty: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Gdy włączone, grupowe rekordy tylko wtedy, gdy mają dokładnie taką samą nazwę, np. Żołd <-> Żołd Wyłączenie tej opcji spowoduje grupowanie nazw bez sprawdzania, czy każda litera ma ten sam rozmiar, np. żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Rozmiar i nazwa duplicate_mode_name_combo_box = Nazwa duplicate_mode_size_combo_box = Rozmiar duplicate_mode_hash_combo_box = Hash @@ -388,8 +405,11 @@ progress_scanning_image = Hashowanie { $file_checked }/{ $all_files } obrazu progress_comparing_image_hashes = Porównywanie { $file_checked }/{ $all_files } hashu obrazu progress_scanning_music_tags_end = Porównywanie tagów { $file_checked }/{ $all_files } pliku audio progress_scanning_music_tags = Sczytywanie tagów { $file_checked }/{ $all_files } pliku audio +progress_scanning_music_content_end = Porównywanie odcisku palca { $file_checked }/{ $all_files } pliku muzycznego +progress_scanning_music_content = Obliczanie odcisku palca { $file_checked }/{ $all_files } pliku muzycznego progress_scanning_empty_folders = Przeszukiwanie { $folder_number } folderu progress_scanning_size = Sprawdzanie rozmiaru { $file_number } pliku +progress_scanning_size_name = Skanowanie nazwy i rozmiaru pliku { $file_number } progress_scanning_name = Sprawdzanie nazwy { $file_number } pliku progress_analyzed_partial_hash = Obliczanie częściowego hashu { $file_checked }/{ $all_files } pliku progress_analyzed_full_hash = Obliczanie pełnego hashu { $file_checked }/{ $all_files } pliku diff --git a/czkawka_gui/i18n/pt/czkawka_gui.ftl b/czkawka_gui/i18n/pt/czkawka_gui.ftl index a7f2030..d4367db 100644 --- a/czkawka_gui/i18n/pt/czkawka_gui.ftl +++ b/czkawka_gui/i18n/pt/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Taxa de bits music_genre_checkbox = Género music_length_checkbox = Comprimento music_comparison_checkbox = Comparação aproximada +music_checking_by_tags = Etiquetas +music_checking_by_content = Conteúdo +same_music_seconds_label = Duração mínima do fragmento segundo tempo +same_music_similarity_label = Diferença máxima +same_music_tooltip = + Procurar por arquivos de música semelhantes por seu conteúdo pode ser configurado pela configuração: + + - Tempo mínimo de fragmento depois do qual os arquivos de música podem ser identificados como semelhantes + - A diferença máxima entre dois fragmentos testados + + A chave para bons resultados é encontrar combinações sensíveis desses parâmetros, para fornecido. + + Definir o tempo mínimo para 5s e a diferença máxima para 1.0, irá procurar fragmentos quase idênticos nos arquivos. + Um tempo de 20s e uma diferença máxima de 6.0, por outro lado, funciona bem para encontrar versões remixes/ao vivo, etc. + + Por padrão, cada arquivo de música é comparado entre si, e isso pode levar muito tempo para testar muitos arquivos, portanto, é geralmente melhor usar pastas de referência e especificar quais arquivos devem ser comparados (com a mesma quantidade de arquivos, A comparação de impressões digitais será mais rápida pelo menos 4 vezes do que nas pastas de referência). music_comparison_checkbox_tooltip = Ele busca arquivos de música semelhantes usando IA, que usa aprendizado de máquina para remover parênteses duma frase. Por exemplo, com esta opção ativada, os arquivos em questão serão considerados duplicatas: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Quando ativado, o grupo só registra quando eles têm o mesmo nome, por exemplo, Żołd <-> Żołd Desativar esta opção agrupará os nomes sem verificar se cada letra é do mesmo tamanho, por exemplo, żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Tamanho e Nome duplicate_mode_name_combo_box = Nome duplicate_mode_size_combo_box = Tamanho duplicate_mode_hash_combo_box = Hash @@ -385,8 +402,11 @@ progress_scanning_image = Hash de { $file_checked }/{ $all_files } imagem progress_comparing_image_hashes = Comparando de { $file_checked }/{ $all_files } hash de imagem progress_scanning_music_tags_end = Comparando etiquetas de { $file_checked }/{ $all_files } arquivo de música progress_scanning_music_tags = Lendo etiquetas de { $file_checked }/{ $all_files } arquivo de música +progress_scanning_music_content_end = Comparação de impressão digital de { $file_checked }/{ $all_files } arquivo de música +progress_scanning_music_content = Calculando impressão digital de { $file_checked }/{ $all_files } arquivo de música progress_scanning_empty_folders = Verificando { $folder_number } diretório progress_scanning_size = Verificando tamanho de { $file_number } arquivo +progress_scanning_size_name = Verificando nome e tamanho de { $file_number } arquivo progress_scanning_name = Verificando nome de { $file_number } arquivo progress_analyzed_partial_hash = Hash parcial analisado de { $file_checked }/{ $all_files } arquivos progress_analyzed_full_hash = Hash completo analisado de { $file_checked }/{ $all_files } arquivos diff --git a/czkawka_gui/i18n/ru/czkawka_gui.ftl b/czkawka_gui/i18n/ru/czkawka_gui.ftl index 4bd2d55..27673b6 100644 --- a/czkawka_gui/i18n/ru/czkawka_gui.ftl +++ b/czkawka_gui/i18n/ru/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Битрейт music_genre_checkbox = Жанр music_length_checkbox = Длительность music_comparison_checkbox = Приблизительное сравнение +music_checking_by_tags = Теги +music_checking_by_content = Содержание +same_music_seconds_label = Минимальная длительность второго фрагмента +same_music_similarity_label = Максимальная разница +same_music_tooltip = + Поиск похожих музыкальных файлов по его содержимому может быть настроен с помощью настройки: + + - Минимальное время фрагмента, после которого музыкальные файлы можно определить как похожие + - Максимальная разница между двумя проверенными фрагментами + + Ключ к хорошим результатам - найти разумные комбинации этих параметров, для предоставленных. + + Установка минимального времени на 5 секунд, а максимальная разница в 1.0, будет искать практически идентичные фрагменты файлов. + Время 20 секунд и максимальная разница в 6,0, с другой стороны, хорошо подходит для поиска ремиксов/версий и т.д. + + По умолчанию, каждый музыкальный файл сравнивается друг с другом, и это может занять много времени при тестировании множества файлов, поэтому обычно лучше использовать справочные папки и указать, какие файлы следует сравнивать друг с другом (одинаковое количество файлов), сравнение отпечатков пальцев будет быстрее по крайней мере на 4х, чем без ссылочных папок). music_comparison_checkbox_tooltip = Ищет похожие музыкальные файлы с помощью ИИ, использующего машинное обучение для удаления скобок из фраз. Например, если эта опция включена, следующие файлы будут считаться дубликатами: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = При включённой опции записи группируются, только если у них полностью совпадают имена с точностью до каждого символа. Например, «ХИТ Дискотека» не совпадёт с «хит дискотека». При отключённой опции записи группируются вне зависимости от того, заглавные или строчные буквы использовались при написании. Например, «ХИТ Дискотека», «хит дискотека», «хИт ДиСкОтЕКа» будут эквивалентны. +duplicate_mode_size_name_combo_box = Размер и имя duplicate_mode_name_combo_box = Имя duplicate_mode_size_combo_box = Размер duplicate_mode_hash_combo_box = Хэш @@ -312,7 +329,7 @@ settings_notebook_videos = Похожие видео ## Multiple - settings used in multiple tabs settings_multiple_image_preview_checkbutton_tooltip = Показывать предварительный просмотр справа (при выборе файла изображения). -settings_multiple_image_preview_checkbutton = Предпросмотр изображения +settings_multiple_image_preview_checkbutton = Показывать предпросмотр изображения settings_multiple_clear_cache_button_tooltip = Очистка устаревших записей кэша вручную. Следует использовать только в том случае, если автоматическая очистка отключена. @@ -388,8 +405,11 @@ progress_scanning_image = Хэширование изображения: { $file progress_comparing_image_hashes = Сравнение хэша изображений: { $file_checked }/{ $all_files } progress_scanning_music_tags_end = Сравнение тегов { $file_checked }/{ $all_files } музыкального файла progress_scanning_music_tags = Чтение тэгов музыкальных файлов: { $file_checked }/{ $all_files } +progress_scanning_music_content_end = Сравнение отпечатка пальца из { $file_checked }/{ $all_files } музыкального файла +progress_scanning_music_content = Вычисление отпечатка пальца из { $file_checked }/{ $all_files } музыкального файла progress_scanning_empty_folders = Сканирование папки { $folder_number } progress_scanning_size = Сканирование размера файла { $file_number } +progress_scanning_size_name = Сканирование имени и размера файла { $file_number } progress_scanning_name = Сканирование имени файла { $file_number } progress_analyzed_partial_hash = Анализ частичного хэша файла { $file_checked }/{ $all_files } progress_analyzed_full_hash = Анализ полного хэша файла { $file_checked }/{ $all_files } diff --git a/czkawka_gui/i18n/sv/czkawka_gui.ftl b/czkawka_gui/i18n/sv/czkawka_gui.ftl index 3765532..a56f6a9 100644 --- a/czkawka_gui/i18n/sv/czkawka_gui.ftl +++ b/czkawka_gui/i18n/sv/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bitrate music_genre_checkbox = Genre music_length_checkbox = Längd music_comparison_checkbox = Ungefärlig jämförelse +music_checking_by_tags = Taggar +music_checking_by_content = Innehåll +same_music_seconds_label = Minsta fragment sekund varaktighet +same_music_similarity_label = Maximal skillnad +same_music_tooltip = + Sökning efter liknande musikfiler genom dess innehåll kan konfigureras genom att ställa in: + + - Minsta fragmenttid efter vilken musikfiler kan identifieras som liknande + - Maximal skillnad mellan två testade fragment + + Nyckeln till bra resultat är att hitta förnuftiga kombinationer av dessa parametrar, för tillhandahållen. + + Att ställa in den minsta tiden till 5s och den maximala skillnaden till 1.0, kommer att leta efter nästan identiska fragment i filerna. + En tid på 20-talet och en maximal skillnad på 6,0, å andra sidan, fungerar bra för att hitta remixer/live-versioner etc. + + Som standard jämförs varje musikfil med varandra och detta kan ta mycket tid vid testning av många filer, så är det oftast bättre att använda referensmappar och ange vilka filer som ska jämföras med varandra(med samma mängd filer, Att jämföra fingeravtryck kommer att vara snabbare minst 4x än utan referensmappar). music_comparison_checkbox_tooltip = Den söker efter liknande musikfiler med AI, som använder maskininlärning för att ta bort parenteser från en fras. Till exempel, med detta alternativ aktiverat, filerna i fråga kommer att betraktas som dubbletter: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = När detta är aktiverat spelar gruppen bara in när de har exakt samma namn t.ex. Żołd <-> Żołd Inaktivera sådana alternativ kommer gruppnamn utan att kontrollera om varje bokstav är samma storlek t.ex. żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = Storlek och namn duplicate_mode_name_combo_box = Namn duplicate_mode_size_combo_box = Storlek duplicate_mode_hash_combo_box = Hash @@ -388,8 +405,11 @@ progress_scanning_image = Hashning av { $file_checked }/{ $all_files } bild progress_comparing_image_hashes = Jämföra { $file_checked }/{ $all_files } bildhash progress_scanning_music_tags_end = Jämföra taggar för { $file_checked }/{ $all_files } musikfil progress_scanning_music_tags = Lästaggar för { $file_checked }/{ $all_files } musikfil +progress_scanning_music_content_end = Jämföra fingeravtryck av { $file_checked }/{ $all_files } musikfil +progress_scanning_music_content = Beräknar fingeravtryck av { $file_checked }/{ $all_files } musikfil progress_scanning_empty_folders = Skannar { $folder_number } mappen progress_scanning_size = Skannar storleken på { $file_number } fil +progress_scanning_size_name = Skannar namn och storlek på { $file_number } fil progress_scanning_name = Skannar namn på { $file_number } fil progress_analyzed_partial_hash = Analyserade partiella hash av { $file_checked }/{ $all_files } filer progress_analyzed_full_hash = Analyserad full hash av { $file_checked }/{ $all_files } filer diff --git a/czkawka_gui/i18n/tr/czkawka_gui.ftl b/czkawka_gui/i18n/tr/czkawka_gui.ftl index e1ccbab..e7e4860 100644 --- a/czkawka_gui/i18n/tr/czkawka_gui.ftl +++ b/czkawka_gui/i18n/tr/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Bit-hızı music_genre_checkbox = Müzik Türü music_length_checkbox = Uzunluk music_comparison_checkbox = Yaklaşık Karşılaştırma +music_checking_by_tags = Tags +music_checking_by_content = Content +same_music_seconds_label = Minimal fragment second duration +same_music_similarity_label = Maximum difference +same_music_tooltip = + Searching for similar music files by its content can be configured by setting: + + - The minimum fragment time after which music files can be identified as similar + - The maximum difference difference between two tested fragments + + The key to good results is to find sensible combinations of these parameters, for provided. + + Setting the minimum time to 5s and the maximum difference to 1.0, will look for almost identical fragments in the files. + A time of 20s and a maximum difference of 6.0, on the other hand, works well for finding remixes/live versions etc. + + By default, each music file is compared to each other and this can take a lot of time when testing many files, so it is usually better to use reference folders and specifying which files are to be compared with each other(with same amount of files, comparing fingerprints will be faster at least 4x than without reference folders). music_comparison_checkbox_tooltip = Yapay zeka kullanarak benzer müzik dosyalarını arar. Örneğin, bir tümcenin parantezlerini kaldırmak için makine öğrenimini kullanır. @@ -31,9 +47,10 @@ duplicate_case_sensitive_name_tooltip = denetlemeden aynı adları eşleyip grup oluşturur. fatih.kavalci <--> FatiH.KaVaLCi +duplicate_mode_size_name_combo_box = Size and Name duplicate_mode_name_combo_box = Ad Karşılaştırma duplicate_mode_size_combo_box = Boyut Karşılaştırma -duplicate_mode_hash_combo_box = SUÇ (hash) Karşılaştırma +duplicate_mode_hash_combo_box = Özet Değeri duplicate_hash_type_tooltip = Czkawka, 3 tür Sabit Uzunlukta Çıktı (SUÇ) üretimi sunar: @@ -82,7 +99,7 @@ image_resize_filter_tooltip = 8x8 boyutluk SURÇ üretimi ile daha iyi eşleştirilmiş resim gruplarına sahip olmak için Nearest'ten farklı bir algoritma kullanmanız önerilir. image_hash_alg_tooltip = - Kullanıcılar, SURÇ oluşturmanın birçok algoritmasından birini seçebilir. + Kullanıcılar, SUÇ oluşturmanın birçok algoritmasından birini seçebilir. Her birinin hem güçlü hem de zayıf noktaları vardır ve farklı görüntüler için bazen daha iyi, bazen daha kötü sonuçlar verir. Bu nedenle, size göre en iyisini belirlemek için elle test gereklidir. @@ -268,7 +285,7 @@ bottom_move_button_tooltip = Dosyaları seçilen dizine taşır. Dizin ağacını korumadan tüm dosyaları dizine taşır. Aynı ada sahip iki dosyayı klasöre taşımaya çalışırken, ikincisi başarısız olur ve hata gösterir. -bottom_sort_button_tooltip = Sorts files/folders according to selected method. +bottom_sort_button_tooltip = Dosyaları/Dizinleri seçilen metoda göre sırala. bottom_show_errors_tooltip = Alt çıktı panelini göster/gizle. bottom_show_upper_notebook_tooltip = Üst denetim panelini göster/gizle. # Progress Window @@ -430,8 +447,11 @@ progress_scanning_image = { $file_checked }/{ $all_files } resmin SURÇ kaydı o progress_comparing_image_hashes = { $file_checked }/{ $all_files } resim SURÇ kaydı karşılaştırıldı. progress_scanning_music_tags_end = { $file_checked }/{ $all_files } müzik dosyasının etiketleri karşılaştırıldı. progress_scanning_music_tags = { $file_checked }/{ $all_files } müzik dosyasının etiketleri okundu. +progress_scanning_music_content_end = Comparing fingerprint of { $file_checked }/{ $all_files } music file +progress_scanning_music_content = Calculating fingerprint of { $file_checked }/{ $all_files } music file progress_scanning_empty_folders = { $folder_number } klasör tarandı. progress_scanning_size = { $file_number } dosyanın boyutu tarandı. +progress_scanning_size_name = Scanning name and size of { $file_number } file progress_scanning_name = { $file_number } dosyanın adı tarandı. progress_analyzed_partial_hash = { $file_checked }/{ $all_files } dosyanın kısmi-SUÇ kaydı analiz edildi. ;-) progress_analyzed_full_hash = { $file_checked }/{ $all_files } dosyanın tam SUÇ kaydı analiz edildi. ;-) diff --git a/czkawka_gui/i18n/uk/czkawka_gui.ftl b/czkawka_gui/i18n/uk/czkawka_gui.ftl index 6c7f909..26d3710 100644 --- a/czkawka_gui/i18n/uk/czkawka_gui.ftl +++ b/czkawka_gui/i18n/uk/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = Бітрейт music_genre_checkbox = Жанр music_length_checkbox = Тривалість music_comparison_checkbox = Приблизне порівняння +music_checking_by_tags = Мітки +music_checking_by_content = Зміст +same_music_seconds_label = Мінімальна тривалість фрагменту +same_music_similarity_label = Максимальна різниця +same_music_tooltip = + Пошук подібних музичних файлів за його вмістом може бути налаштований за налаштуванням: + + - Мінімальний час фрагменту, після якого музичні файли можна визначити як схожий + - Максимальна різниця між двома тестовими фрагментами + + —Що ключові з хороших результатів - знайти розумні комбінації цих параметрів, за умов. + + Встановлення мінімального часу на 5 сек і максимальна різниця складає 1.0, буде шукати майже однакові фрагменти у файлах. + Час 20 і максимальна різниця в 6.0, з іншого боку, добре працює для пошуку реміксиксів/живу версії і т. д. + + За замовчуванням, кожен музичний файл порівнюється один з одним, і це може зайняти багато часу при тестуванні багатьох файлів, так що використовувати референтні папки і вказати, які файли слід порівнювати один з одним (з тією ж кількістю файлів, порівняння відбитків пальців буде швидше 4x, ніж без стандартних папок). music_comparison_checkbox_tooltip = Шукає схожі музичні файли за допомогою ШІ, що використовує машинне навчання для видалення дужок із фраз. Наприклад, якщо ця опція увімкнена, наступні файли будуть вважатися дублікатами: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = Коли увімкнено, записи групуються, тільки якщо вони повністю збігаються імена з точністю до кожного символу. Наприклад, «ХІТ Дискотека» не збігається з "хіт дискотека". Коли вимкнено, записи групуються незалежно від того, великі або малі літери використовувалися при написанні. Наприклад, «ХІТ Дискотека», «хіт дискотека», «хІт ДиСкОтЕКа» будуть еквівалентні. +duplicate_mode_size_name_combo_box = Розмір і ім'я duplicate_mode_name_combo_box = Ім'я duplicate_mode_size_combo_box = Розмір duplicate_mode_hash_combo_box = Хеш @@ -388,8 +405,11 @@ progress_scanning_image = Хешування зображення: { $file_check progress_comparing_image_hashes = Порівняння хешу зображення: { $file_checked }/{ $all_files } progress_scanning_music_tags_end = Порівняння тегів музичного файлу: { $file_checked }/{ $all_files } progress_scanning_music_tags = Читання тегів музичного файлу: { $file_checked }/{ $all_files } +progress_scanning_music_content_end = Порівняння відбитку пальця { $file_checked }/{ $all_files } музичного файлу +progress_scanning_music_content = Розрахунок відбитку пальця { $file_checked }/{ $all_files } музичного файлу progress_scanning_empty_folders = Сканування теки { $folder_number } progress_scanning_size = Сканування розміру файлу { $file_number } +progress_scanning_size_name = Сканування назви і розміру файлу { $file_number } progress_scanning_name = Сканування імені файлу { $file_number } progress_analyzed_partial_hash = Аналіз часткового хешу файлу { $file_checked }/{ $all_files } progress_analyzed_full_hash = Аналіз повного хешу файлу { $file_checked }/{ $all_files } diff --git a/czkawka_gui/i18n/zh/czkawka_gui.ftl b/czkawka_gui/i18n/zh/czkawka_gui.ftl index 6e709c2..77bee4a 100644 --- a/czkawka_gui/i18n/zh/czkawka_gui.ftl +++ b/czkawka_gui/i18n/zh/czkawka_gui.ftl @@ -14,6 +14,22 @@ music_bitrate_checkbox = 码率 music_genre_checkbox = 流派 music_length_checkbox = 长度 music_comparison_checkbox = 近似比较 +music_checking_by_tags = 标签 +music_checking_by_content = 内容 +same_music_seconds_label = 最小碎片第二持续时间 +same_music_similarity_label = 最大差异 +same_music_tooltip = + 通过设置搜索类似的音乐文件。 + + - 可以在最小的片段时间之后将音乐文件识别为相似 + - 两个测试片段之间的最大差异 + + 良好结果的关键是找到这些参数的合理组合, 提供的资料。 + + 将最小时间设置为5秒,最大差设置为1.0,将寻找文件中几乎相同的片段。 + 另一方面,20秒和最大差6.0之间的时间对寻找混编/实时版本等非常有用。 + + 默认情况下,每个音乐文件彼此比较,这可能需要很多时间来测试许多文件, 通常最好使用参考文件夹并指定哪些文件可以相互比较(文件数量相同) 比较指纹至少要比没有参考文件夹快4x)。 music_comparison_checkbox_tooltip = 它使用 AI搜索类似的音乐文件,它使用机器学习从短语中删除括号。 例如,启用此选项, 所涉文件将被视为重复: @@ -23,6 +39,7 @@ duplicate_case_sensitive_name_tooltip = 启用时,仅当记录具有完全相同的名称时分组,例如 Żołd <-> Żołd 禁用这种选项将不会检查每封字母是否相同的大小,例如 żoŁD <-> Żołd +duplicate_mode_size_name_combo_box = 大小和名称 duplicate_mode_name_combo_box = 名称 duplicate_mode_size_combo_box = 大小 duplicate_mode_hash_combo_box = 哈希 @@ -388,8 +405,11 @@ progress_scanning_image = 散列 { $file_checked }/{ $all_files } 图像 progress_comparing_image_hashes = 比较 { $file_checked }/{ $all_files } 图像哈希 progress_scanning_music_tags_end = 对比标签 { $file_checked }/{ $all_files } 音乐文件 progress_scanning_music_tags = 正在读取标签 { $file_checked }/{ $all_files } 音乐文件 +progress_scanning_music_content_end = 比较指纹 { $file_checked }/{ $all_files } 音乐文件 +progress_scanning_music_content = 正在计算指纹 { $file_checked }/{ $all_files } 音乐文件 progress_scanning_empty_folders = 正在扫描 { $folder_number } 文件夹 progress_scanning_size = 正在扫描文件大小 { $file_number } +progress_scanning_size_name = 扫描文件名和大小 { $file_number } progress_scanning_name = 正在扫描 { $file_number } 文件的名称 progress_analyzed_partial_hash = 分析了 { $file_checked }/{ $all_files } 文件的部分哈希 progress_analyzed_full_hash = 分析了 { $file_checked }/{ $all_files } 文件的完整哈希值 diff --git a/czkawka_gui/ui/about_dialog.ui b/czkawka_gui/ui/about_dialog.ui index a270721..bd6bdbf 100644 --- a/czkawka_gui/ui/about_dialog.ui +++ b/czkawka_gui/ui/about_dialog.ui @@ -11,6 +11,6 @@ This program is free to use and will always be. mit-x11 help-about-symbolic Czkawka - 5.1.0 + 6.0.0 diff --git a/czkawka_gui/ui/czkawka.cmb b/czkawka_gui/ui/czkawka.cmb index 24ea299..6723a26 100755 --- a/czkawka_gui/ui/czkawka.cmb +++ b/czkawka_gui/ui/czkawka.cmb @@ -343,7 +343,7 @@ (3,1,"GtkAboutDialog","license-type","mit-x11",None,None,None,None,None), (3,1,"GtkAboutDialog","logo-icon-name","help-about-symbolic",None,None,None,None,None), (3,1,"GtkAboutDialog","program-name","Czkawka",None,None,None,None,None), - (3,1,"GtkAboutDialog","version","5.1.0",None,None,None,None,None), + (3,1,"GtkAboutDialog","version","6.0.0",None,None,None,None,None), (4,2,"GtkOrientable","orientation","vertical",None,None,None,None,None), (4,2,"GtkWidget","vexpand","1",None,None,None,None,None), (4,4,"GtkLabel","label","Group XD/PER XD (99 images in current group)",1,None,None,None,None), @@ -682,7 +682,7 @@ (5,177,"GtkWidget","focusable","1",None,None,None,None,None), (5,177,"GtkWidget","hexpand","1",None,None,None,None,None), (5,178,"GtkEditable","editable","0",None,None,None,None,None), - (5,178,"GtkEditable","text","Czkawka 5.1.0",1,None,None,None,None), + (5,178,"GtkEditable","text","Czkawka 6.0.0",1,None,None,None,None), (5,178,"GtkEditable","xalign","1",None,None,None,None,None), (5,178,"GtkEntry","has-frame","0",None,None,None,None,None), (5,178,"GtkWidget","focusable","1",None,None,None,None,None), diff --git a/czkawka_gui/ui/main_window.ui b/czkawka_gui/ui/main_window.ui index 50a780c..e4aaf3f 100644 --- a/czkawka_gui/ui/main_window.ui +++ b/czkawka_gui/ui/main_window.ui @@ -1149,7 +1149,7 @@ 0 1 0 - Czkawka 5.1.0 + Czkawka 6.0.0 1 diff --git a/data/com.github.qarmin.czkawka.metainfo.xml b/data/com.github.qarmin.czkawka.metainfo.xml index 4456b0a..876aa40 100644 --- a/data/com.github.qarmin.czkawka.metainfo.xml +++ b/data/com.github.qarmin.czkawka.metainfo.xml @@ -19,7 +19,7 @@ - + Rafał Mikrut diff --git a/instructions/Installation.md b/instructions/Installation.md index 4472179..8f6760a 100644 --- a/instructions/Installation.md +++ b/instructions/Installation.md @@ -85,7 +85,7 @@ Install the GUI version on Linux: ```shell # download -curl --location https://github.com/qarmin/czkawka/releases/download/5.1.0/linux_czkawka_gui --output ~/.local/bin/linux_czkawka_gui +curl --location https://github.com/qarmin/czkawka/releases/download/6.0.0/linux_czkawka_gui --output ~/.local/bin/linux_czkawka_gui # mark as executable chmod +x ~/.local/bin/linux_czkawka_gui # run diff --git a/misc/cargo/PublishCore.sh b/misc/cargo/PublishCore.sh index 6a5c744..6093d49 100755 --- a/misc/cargo/PublishCore.sh +++ b/misc/cargo/PublishCore.sh @@ -1,5 +1,5 @@ #!/bin/bash -NUMBER="5.1.0" +NUMBER="6.0.0" CZKAWKA_PATH="/home/rafal" cd "$CZKAWKA_PATH" diff --git a/misc/cargo/PublishOther.sh b/misc/cargo/PublishOther.sh index be08aa5..f151e4e 100755 --- a/misc/cargo/PublishOther.sh +++ b/misc/cargo/PublishOther.sh @@ -1,5 +1,5 @@ #!/bin/bash -NUMBER="5.1.0" +NUMBER="6.0.0" CZKAWKA_PATH="/home/rafal" cd "$CZKAWKA_PATH" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 218c1ea..aa79a28 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: czkawka # you probably want to 'snapcraft register ' base: core22 # the base snap is the execution environment for this snap -version: '5.1.0' # just for humans, typically '1.2+git' or '1.3.2' +version: '6.0.0' # just for humans, typically '1.2+git' or '1.3.2' summary: Czkawka - fast data cleaner written in Rust # 79 char long summary description: | Czkawka is very fast and feature rich cleaner which finds file duplicates, empty folders and files, duplicated music, similar images or the biggest files in selected directories.