diff --git a/Cargo.lock b/Cargo.lock index 7cc1c68..4847113 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,9 +56,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.51" +version = "1.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b26702f315f53b6071259e15dd9d64528213b44d61de1ec926eca7715d62203" +checksum = "84450d0b4a8bd1ba4144ce8ce718fbc5d071358b1e5384bace6536b3d1f2d5b3" [[package]] name = "arrayref" @@ -66,6 +66,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.2" @@ -182,6 +188,21 @@ dependencies = [ "triple_accel", ] +[[package]] +name = "blake3" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "cc", + "cfg-if 0.1.10", + "constant_time_eq", + "crypto-mac", + "digest", +] + [[package]] name = "blake3" version = "1.2.0" @@ -189,9 +210,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "526c210b4520e416420759af363083471656e819a75e831b8d2c9d5a584f2413" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.7.2", "cc", - "cfg-if", + "cfg-if 1.0.0", "constant_time_eq", "digest", ] @@ -313,6 +334,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -451,7 +478,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -460,7 +487,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", ] @@ -470,7 +497,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-epoch", "crossbeam-utils", ] @@ -481,7 +508,7 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crossbeam-utils", "lazy_static", "memoffset", @@ -494,10 +521,20 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "lazy_static", ] +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "czkawka_cli" version = "3.3.1" @@ -515,7 +552,7 @@ dependencies = [ "bincode", "bitflags", "bk-tree", - "blake3", + "blake3 1.2.0", "crc32fast", "crossbeam-channel", "directories-next", @@ -526,8 +563,10 @@ dependencies = [ "i18n-embed", "i18n-embed-fl", "image", + "imagepipe", "img_hash", "once_cell", + "rawloader", "rayon", "rodio", "rust-embed", @@ -606,7 +645,7 @@ version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "num_cpus", ] @@ -620,17 +659,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "digest" version = "0.9.0" @@ -646,7 +674,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "dirs-sys-next", ] @@ -667,6 +695,17 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "enumn" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e58b112d5099aa0857c5d05f0eacab86406dd8c0f85fe5d320a13256d29ecf4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ffmpeg_cmdline_utils" version = "0.1.0" @@ -705,7 +744,7 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "crc32fast", "libc", "miniz_oxide 0.4.4", @@ -769,9 +808,9 @@ checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" [[package]] name = "futures" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +checksum = "28560757fe2bb34e79f907794bb6b22ae8b0e5c669b638a1132f2592b19035b4" dependencies = [ "futures-channel", "futures-core", @@ -784,9 +823,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" dependencies = [ "futures-core", "futures-sink", @@ -794,15 +833,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" [[package]] name = "futures-executor" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +checksum = "29d6d2ff5bb10fb95c85b8ce46538a2e5f5e7fdc755623a7d4529ab8a4ed9d2a" dependencies = [ "futures-core", "futures-task", @@ -811,18 +850,16 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" +checksum = "b1f9d34af5a1aac6fb380f735fe510746c38067c5bf16c7fd250280503c971b2" [[package]] name = "futures-macro" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +checksum = "6dbd947adfffb0efc70599b3ddcf7b5597bb5fa9e245eb99f62b3a5f7bb8bd3c" dependencies = [ - "autocfg", - "proc-macro-hack", "proc-macro2", "quote", "syn", @@ -830,23 +867,22 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" [[package]] name = "futures-task" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" [[package]] name = "futures-util" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" dependencies = [ - "autocfg", "futures-channel", "futures-core", "futures-io", @@ -856,8 +892,6 @@ dependencies = [ "memchr", "pin-project-lite", "pin-utils", - "proc-macro-hack", - "proc-macro-nested", "slab", ] @@ -935,7 +969,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi", ] @@ -1103,6 +1137,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65043da274378d68241eb9a8f8f8aa54e349136f7b8e12f63e3ef44043cc30e1" +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + [[package]] name = "heck" version = "0.3.3" @@ -1244,6 +1284,25 @@ dependencies = [ "tiff", ] +[[package]] +name = "imagepipe" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f85c5d23491dee7e51d21b04f4116352899174943026278a2d91db13ffc142cd" +dependencies = [ + "bincode", + "blake3 0.3.8", + "image", + "lazy_static", + "log", + "multicache", + "rawloader", + "rayon", + "serde", + "serde_derive", + "serde_yaml", +] + [[package]] name = "img_hash" version = "3.2.0" @@ -1257,13 +1316,23 @@ dependencies = [ "transpose 0.2.1", ] +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "instant" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1383,10 +1452,16 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afe203d669ec979b7128619bae5a63b7b42e9203c1b29146079ee05e2f604b52" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "winapi", ] +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + [[package]] name = "locale_config" version = "0.3.0" @@ -1415,7 +1490,7 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -1517,6 +1592,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64ae83441f6b67e3b7f009295618e90f03228b0f1a149f56ee8cd0f6bb5602c5" +[[package]] +name = "multicache" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5086074c0a0812980aa88703d1bbcb4433e8423ecf4098a9849934f3dc09ba72" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "ndk" version = "0.3.0" @@ -1597,7 +1681,7 @@ checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" dependencies = [ "bitflags", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", ] @@ -1684,9 +1768,9 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", @@ -1694,19 +1778,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +checksum = "720d3ea1055e4e4574c0c0b0f8c3fd4f24c4cdaf465948206dea090b57b526ad" dependencies = [ - "derivative", "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +checksum = "0d992b768490d7fe0d8586d9b5745f6c49f557da6d81dc982b1d167ad4edbb21" dependencies = [ "proc-macro-crate 1.1.0", "proc-macro2", @@ -1839,7 +1922,7 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall", @@ -1870,9 +1953,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" [[package]] name = "pin-utils" @@ -1900,9 +1983,9 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "primal-check" @@ -1956,32 +2039,20 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" -version = "1.0.34" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f84e92c0f7c9d58328b85a78557813e4bd845130db68d7184635344399423b1" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.10" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" dependencies = [ "proc-macro2", ] @@ -2026,6 +2097,21 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rawloader" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d23e8122c7619b7d3a1286ed328e4f5c0cf3dcdadd9adff508f7364d83a7734" +dependencies = [ + "byteorder", + "enumn", + "glob", + "lazy_static", + "rayon", + "rustc_version", + "toml", +] + [[package]] name = "rayon" version = "1.5.1" @@ -2285,6 +2371,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "sha2" version = "0.9.8" @@ -2292,7 +2390,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" dependencies = [ "block-buffer", - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", "opaque-debug", @@ -2400,10 +2498,16 @@ dependencies = [ ] [[package]] -name = "syn" -version = "1.0.82" +name = "subtle" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecb2e6da8ee5eb9a61068762a32fa9619cc591ceb055b3687f4cd4051ec2e06b" dependencies = [ "proc-macro2", "quote", @@ -2434,7 +2538,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "rand", "redox_syscall", @@ -2565,9 +2669,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "ucd-trie" @@ -2626,9 +2730,9 @@ checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vid_dup_finder_lib" @@ -2670,7 +2774,7 @@ version = "0.2.78" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -2771,6 +2875,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e575e15bedf6e57b5c2d763ffc6c3c760143466cbd09d762d539680ab5992ded" +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "zip" version = "0.5.13" diff --git a/Changelog.md b/Changelog.md index 6489430..b484420 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,6 @@ ## Version 4.0.0 - ? -- Multithread support for collecting files to check(2/3x on 4 thread processor) - [#502](https://github.com/qarmin/czkawka/pull/502), [#504](https://github.com/qarmin/czkawka/pull/504) -- Add Polish and Italian translation - [#469](https://github.com/qarmin/czkawka/pull/469), [#508](https://github.com/qarmin/czkawka/pull/508) +- Multithreading support for collecting files to check(2/3x speedup on 4 thread processor and SSD) - [#502](https://github.com/qarmin/czkawka/pull/502), [#504](https://github.com/qarmin/czkawka/pull/504) +- Add Polish, German and Italian translation - [#469](https://github.com/qarmin/czkawka/pull/469), [#508](https://github.com/qarmin/czkawka/pull/508), [5be](https://github.com/qarmin/czkawka/commit/5be801e76395855f07ab1da43cdbb8bd0b843834) - Add support for finding similar videos - [#460](https://github.com/qarmin/czkawka/pull/460) - GUI code refactoring(could fix some bugs) - [#462](https://github.com/qarmin/czkawka/pull/462) - Fixed crash when trying to hard/symlink 0 files - [#462](https://github.com/qarmin/czkawka/pull/462) @@ -10,14 +10,18 @@ - Improved performance due caching hash of broken/not supported images/videos = [#471](https://github.com/qarmin/czkawka/pull/471) - Option to not remove cache from non existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472) - Add multiple tooltips with helpful messages - [#472](https://github.com/qarmin/czkawka/pull/472) -- Allow to cache prehash - [#477](https://github.com/qarmin/czkawka/pull/477) +- Allow caching prehash - [#477](https://github.com/qarmin/czkawka/pull/477) - Improve custom selecting of records(allows to use Rust regex) - [#489](https://github.com/qarmin/czkawka/pull/478) - Remove support for finding zeroed files - [#461](https://github.com/qarmin/czkawka/pull/461) - Remove HashMB mode - [#476](https://github.com/qarmin/czkawka/pull/476) - Approximate comparison of music - [#483](https://github.com/qarmin/czkawka/pull/483) - Enable column sorting for simple treeview - [#487](https://github.com/qarmin/czkawka/pull/487) -- Allow to hide upper panel - [#491](https://github.com/qarmin/czkawka/pull/491) +- Allow hiding upper panel - [#491](https://github.com/qarmin/czkawka/pull/491) - Make UI take less space - [#500](https://github.com/qarmin/czkawka/pull/500) +- Add support for raw images(NEF, CR2, KDC...) - [#532](https://github.com/qarmin/czkawka/pull/532) +- Image compare performance and usability improvements - [#529](https://github.com/qarmin/czkawka/pull/529), [#528](https://github.com/qarmin/czkawka/pull/528), [#530](https://github.com/qarmin/czkawka/pull/530), [#525](https://github.com/qarmin/czkawka/pull/525) +- Reorganize(unify) saving/loading data from file - [#524](https://github.com/qarmin/czkawka/pull/524) +- Add "reference folders" - [#516](https://github.com/qarmin/czkawka/pull/516) ## Version 3.3.1 - 22.11.2021r - Fix crash when moving buttons [#457](https://github.com/qarmin/czkawka/pull/457) diff --git a/czkawka_core/Cargo.toml b/czkawka_core/Cargo.toml index c6b40a0..7dab9bc 100644 --- a/czkawka_core/Cargo.toml +++ b/czkawka_core/Cargo.toml @@ -56,6 +56,10 @@ i18n-embed-fl = "0.6" rust-embed = "6.2.0" once_cell = "1.8.0" +# Raw image files +rawloader = "0.37.0" +imagepipe = "0.4.0" + [features] default = [] diff --git a/czkawka_core/src/broken_files.rs b/czkawka_core/src/broken_files.rs index b1f33cf..d026641 100644 --- a/czkawka_core/src/broken_files.rs +++ b/czkawka_core/src/broken_files.rs @@ -21,6 +21,7 @@ use crate::common_messages::Messages; use crate::common_traits::*; use crate::fl; use crate::localizer::generate_translation_hashmap; +use crate::similar_images::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_BROKEN_FILES_EXTENSIONS, ZIP_FILES_EXTENSIONS}; const CACHE_FILE_NAME: &str = "cache_broken_files.txt"; @@ -751,19 +752,11 @@ fn load_cache_from_file(text_messages: &mut Messages) -> Option TypeOfFile { - // Checking allowed image extensions - let allowed_image_extensions = [ - ".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif", ".tga", ".ff", ".gif", ".jif", ".jfi", ".ico", - // Ico and bmp crashes are not fixed yet - /*".webp",*/ ".avif", // Webp is not really supported in image crate - ]; - let allowed_archive_zip_extensions = [".zip"]; // Probably also should work [".xz", ".bz2"], but from my tests they not working - let allowed_audio_extensions = [".mp3", ".flac", ".wav", ".ogg"]; // Probably also should work [".xz", ".bz2"], but from my tests they not working - if allowed_image_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) { + if IMAGE_RS_BROKEN_FILES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)) { TypeOfFile::Image - } else if allowed_archive_zip_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) { + } else if ZIP_FILES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)) { TypeOfFile::ArchiveZip - } else if allowed_audio_extensions.iter().any(|e| file_name_lowercase.ends_with(e)) { + } else if AUDIO_FILES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)) { #[cfg(feature = "broken_audio")] { TypeOfFile::Audio diff --git a/czkawka_core/src/common.rs b/czkawka_core/src/common.rs index c2bf898..3b0bb7a 100644 --- a/czkawka_core/src/common.rs +++ b/czkawka_core/src/common.rs @@ -1,5 +1,9 @@ +use image::{DynamicImage, ImageBuffer, Rgb}; +use imagepipe::{ImageSource, Pipeline}; use std::ffi::OsString; use std::fs; +use std::fs::OpenOptions; +use std::io::BufReader; use std::path::{Path, PathBuf}; use std::time::SystemTime; @@ -7,6 +11,57 @@ use std::time::SystemTime; pub struct Common(); +pub fn get_dynamic_image_from_raw_image(path: impl AsRef + std::fmt::Debug) -> Option { + let file_handler = match OpenOptions::new().read(true).open(&path) { + Ok(t) => t, + Err(_e) => { + // println!("Failed to open image {:?}, reason {}", path, e); + return None; + } + }; + + let mut reader = BufReader::new(file_handler); + let raw = match rawloader::decode(&mut reader) { + Ok(raw) => raw, + Err(_e) => { + // println!("Failed to decode raw image {:?}, reason {}", path, e); + return None; + } + }; + + let width = raw.width; + let height = raw.height; + let source = ImageSource::Raw(raw); + + let mut pipeline = match Pipeline::new_from_source(source, width, height, true) { + Ok(pipeline) => pipeline, + Err(_e) => { + // println!("Failed to create pipeline {:?}, reason {}", path, e); + return None; + } + }; + + pipeline.run(None); + let image = match pipeline.output_8bit(None) { + Ok(image) => image, + Err(_e) => { + // println!("Failed to process image {:?}, reason {}", path, e); + return None; + } + }; + + let image = match ImageBuffer::, Vec>::from_raw(image.width as u32, image.height as u32, image.data) { + Some(image) => image, + None => { + // println!("Failed to get image {:?}", path); + return None; + } + }; + + // println!("Properly hashed {:?}", path); + Some(image::DynamicImage::ImageRgb8(image)) +} + impl Common { /// Printing time which took between start and stop point and prints also function name #[allow(unused_variables)] diff --git a/czkawka_core/src/common_extensions.rs b/czkawka_core/src/common_extensions.rs index 5dbb2dc..dc65dd0 100644 --- a/czkawka_core/src/common_extensions.rs +++ b/czkawka_core/src/common_extensions.rs @@ -67,6 +67,10 @@ impl Extensions { true } + pub fn using_custom_extensions(&self) -> bool { + !self.file_extensions.is_empty() + } + pub fn extend_allowed_extensions(&mut self, file_extensions: &[&str]) { for extension in file_extensions { assert!(extension.starts_with('.')); diff --git a/czkawka_core/src/same_music.rs b/czkawka_core/src/same_music.rs index 9454e38..715674d 100644 --- a/czkawka_core/src/same_music.rs +++ b/czkawka_core/src/same_music.rs @@ -21,6 +21,7 @@ use crate::common_messages::Messages; use crate::common_traits::*; use crate::fl; use crate::localizer::generate_translation_hashmap; +use crate::similar_images::AUDIO_FILES_EXTENSIONS; #[derive(Debug)] pub struct ProgressData { @@ -223,12 +224,13 @@ impl SameMusic { self.use_reference_folders } - /// Check files for any with size == 0 fn check_files(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender>) -> bool { let start_time: SystemTime = SystemTime::now(); let mut folders_to_check: Vec = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector - self.allowed_extensions.extend_allowed_extensions(&[".mp3", ".flac", ".m4a"]); + if !self.allowed_extensions.using_custom_extensions() { + self.allowed_extensions.extend_allowed_extensions(&AUDIO_FILES_EXTENSIONS); + } // Add root folders for finding for id in &self.directories.included_directories { diff --git a/czkawka_core/src/similar_images.rs b/czkawka_core/src/similar_images.rs index 1f6790e..c585d35 100644 --- a/czkawka_core/src/similar_images.rs +++ b/czkawka_core/src/similar_images.rs @@ -20,7 +20,7 @@ use img_hash::{FilterType, HashAlg, HasherConfig}; use rayon::prelude::*; use serde::{Deserialize, Serialize}; -use crate::common::Common; +use crate::common::{get_dynamic_image_from_raw_image, Common}; use crate::common_directory::Directories; use crate::common_extensions::Extensions; use crate::common_items::ExcludedItems; @@ -29,7 +29,26 @@ use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use crate::fl; use crate::localizer::generate_translation_hashmap; -// TODO check for better values +pub const RAW_IMAGE_EXTENSIONS: [&str; 24] = [ + ".mrw", ".arw", ".srf", ".sr2", ".mef", ".orf", ".srw", ".erf", ".kdc", ".kdc", ".dcs", ".rw2", ".raf", ".dcr", ".dng", ".pef", ".crw", ".iiq", ".3fr", ".nrw", ".nef", ".mos", + ".cr2", ".ari", +]; +pub const IMAGE_RS_EXTENSIONS: [&str; 13] = [".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif", ".tga", ".ff", ".jif", ".jfi", ".webp", ".gif", ".ico"]; + +pub const IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS: [&str; 9] = [ + ".jpg", ".jpeg", ".png", ".tiff", ".tif", ".tga", ".ff", ".jif", ".jfi", //,".bmp", +]; +pub const IMAGE_RS_BROKEN_FILES_EXTENSIONS: [&str; 10] = [ + ".jpg", ".jpeg", ".png", ".tiff", ".tif", ".tga", ".ff", ".jif", ".jfi", ".gif", //,".bmp", ".ico" +]; +pub const ZIP_FILES_EXTENSIONS: [&str; 1] = [".zip"]; + +pub const AUDIO_FILES_EXTENSIONS: [&str; 4] = [".mp3", ".flac", ".wav", ".ogg"]; + +pub const VIDEO_FILES_EXTENSIONS: [&str; 16] = [ + ".mp4", ".mpv", ".flv", ".mp4a", ".webm", ".mpg", ".mp2", ".mpeg", ".m4p", ".m4v", ".avi", ".wmv", ".qt", ".mov", ".swf", ".mkv", +]; + pub const SIMILAR_VALUES: [[u32; 6]; 4] = [ [0, 2, 5, 7, 14, 20], // 8 [2, 5, 15, 30, 40, 40], // 16 @@ -269,9 +288,10 @@ impl SimilarImages { let start_time: SystemTime = SystemTime::now(); let mut folders_to_check: Vec = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector - self.allowed_extensions.extend_allowed_extensions(&[ - ".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif", ".tga", ".ff", ".jif", ".jfi", /*, ".webp", ".gif", ".ico"*/ - ]); // webp cannot be seen in preview, gif is not too good to checking preview because is animated, ico is just ico and is not too usable + if !self.allowed_extensions.using_custom_extensions() { + self.allowed_extensions.extend_allowed_extensions(&IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS); + self.allowed_extensions.extend_allowed_extensions(&RAW_IMAGE_EXTENSIONS); + } // Add root folders for finding for id in &self.directories.included_directories { @@ -524,56 +544,73 @@ impl SimilarImages { } else { thread::spawn(|| {}) }; + //// PROGRESS THREAD END let mut vec_file_entry: Vec<(FileEntry, Vec)> = non_cached_files_to_check .into_par_iter() .map(|(_s, mut file_entry)| { atomic_file_counter.fetch_add(1, Ordering::Relaxed); if stop_receiver.is_some() && stop_receiver.unwrap().try_recv().is_ok() { - // This will not break return None; } + let file_name_lowercase = file_entry.path.to_string_lossy().to_lowercase(); let image; - let result = panic::catch_unwind(|| { - match image::open(file_entry.path.clone()) { - Ok(t) => Ok(t), - // Err(_inspected) => return Some(None), // Something is wrong with image, - // For broken images empty hash is used, because without it will try to resecan files each time when it is called(missing cache file is responsible for it) - // This may cause problems(very rarely), when e.g. file was not available due lack of permissions, but it is available now - Err(_inspected) => Err(()), - } - }); + if !IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS.iter().any(|e| file_name_lowercase.ends_with(e)){ + println!("Hashing {:?}", file_entry.path); - // If image crashed during opening, we just skip checking its hash and go on - if let Ok(image_result) = result { - if let Ok(image2) = image_result { - image = image2; + image = match get_dynamic_image_from_raw_image(&file_entry.path){ + Some(t) => t, + None => + return Some(Some((file_entry, Vec::new()))) + }; + } + else { + + let result = panic::catch_unwind(|| { + match image::open(file_entry.path.clone()) { + Ok(t) => Ok(t), + // Err(_inspected) => return Some(None), // Something is wrong with image, + // For broken images empty hash is used, because without it will try to resecan files each time when it is called(missing cache file is responsible for it) + // This may cause problems(very rarely), when e.g. file was not available due lack of permissions, but it is available now + Err(_inspected) => Err(()), + } + }); + + // If image crashed during opening, we just skip checking its hash and go on + if let Ok(image_result) = result { + if let Ok(image2) = image_result { + image = image2; + } else { + return Some(Some((file_entry, Vec::new()))); + } } else { + println!("Image-rs library crashed when opening \"{:?}\" image, please check if problem happens with latest image-rs version(this can be checked via https://github.com/qarmin/ImageOpening tool) and if it is not reported, please report bug here - https://github.com/image-rs/image/issues", file_entry.path); return Some(Some((file_entry, Vec::new()))); } - } else { - println!("Image-rs library crashed when opening \"{:?}\" image, please check if problem happens with latest image-rs version(this can be checked via https://github.com/qarmin/ImageOpening tool) and if it is not reported, please report bug here - https://github.com/image-rs/image/issues", file_entry.path); - return Some(Some((file_entry, Vec::new()))); } - let dimensions = image.dimensions(); - file_entry.dimensions = format!("{}x{}", dimensions.0, dimensions.1); + let dimensions = image.dimensions(); - let hasher_config = HasherConfig::new() - .hash_size(self.hash_size as u32, self.hash_size as u32) - .hash_alg(self.hash_alg) - .resize_filter(self.image_filter); - let hasher = hasher_config.to_hasher(); + file_entry.dimensions = format!("{}x{}", dimensions.0, dimensions.1); - let hash = hasher.hash_image(&image); - let buf: Vec = hash.as_bytes().to_vec(); + let hasher_config = HasherConfig::new() + .hash_size(self.hash_size as u32, self.hash_size as u32) + .hash_alg(self.hash_alg) + .resize_filter(self.image_filter); + let hasher = hasher_config.to_hasher(); + + let hash = hasher.hash_image(&image); + let buf: Vec = hash.as_bytes().to_vec(); + + file_entry.hash = buf.clone(); + println!("{:?}, hash {:?}",file_entry.path,file_entry.hash); + + Some(Some((file_entry, buf))) - file_entry.hash = buf.clone(); - Some(Some((file_entry, buf))) }) .while_some() .filter(|file_entry| file_entry.is_some()) diff --git a/czkawka_core/src/similar_videos.rs b/czkawka_core/src/similar_videos.rs index c6da81d..43d9ed7 100644 --- a/czkawka_core/src/similar_videos.rs +++ b/czkawka_core/src/similar_videos.rs @@ -27,6 +27,7 @@ use crate::common_messages::Messages; use crate::common_traits::{DebugPrint, PrintResults, SaveResults}; use crate::fl; use crate::localizer::generate_translation_hashmap; +use crate::similar_images::VIDEO_FILES_EXTENSIONS; pub const MAX_TOLERANCE: i32 = 20; @@ -222,9 +223,9 @@ impl SimilarVideos { let start_time: SystemTime = SystemTime::now(); let mut folders_to_check: Vec = Vec::with_capacity(1024 * 2); // This should be small enough too not see to big difference and big enough to store most of paths without needing to resize vector - self.allowed_extensions.extend_allowed_extensions(&[ - ".mp4", ".mpv", ".flv", ".mp4a", ".webm", ".mpg", ".mp2", ".mpeg", ".m4p", ".m4v", ".avi", ".wmv", ".qt", ".mov", ".swf", ".mkv", - ]); + if !self.allowed_extensions.using_custom_extensions() { + self.allowed_extensions.extend_allowed_extensions(&VIDEO_FILES_EXTENSIONS); + } // Add root folders for finding for id in &self.directories.included_directories { diff --git a/czkawka_gui/src/initialize_gui.rs b/czkawka_gui/src/initialize_gui.rs index 1566d15..21a9efa 100644 --- a/czkawka_gui/src/initialize_gui.rs +++ b/czkawka_gui/src/initialize_gui.rs @@ -5,6 +5,7 @@ use std::ops::Deref; use std::path::Path; use std::rc::Rc; +use czkawka_core::common::get_dynamic_image_from_raw_image; use directories_next::ProjectDirs; use gtk::prelude::*; use gtk::{CheckButton, Image, SelectionMode, TextView, TreeView}; @@ -12,7 +13,7 @@ use image::imageops::FilterType; use image::GenericImageView; use czkawka_core::fl; -use czkawka_core::similar_images::SIMILAR_VALUES; +use czkawka_core::similar_images::{IMAGE_RS_EXTENSIONS, RAW_IMAGE_EXTENSIONS, SIMILAR_VALUES}; use czkawka_core::similar_videos::MAX_TOLERANCE; use crate::create_tree_view::*; @@ -719,9 +720,10 @@ fn show_preview( let file_name = file_name.as_str(); if let Some(extension) = Path::new(file_name).extension() { - if !["jpg", "jpeg", "png", "bmp", /*"tiff", "tif",*/ "tga", "ff", "gif", "jif", "jfi"] - .contains(&extension.to_string_lossy().to_string().to_lowercase().as_str()) - { + let extension_lowercase = format!(".{}", extension.to_string_lossy().to_lowercase()); + + let is_raw_image = RAW_IMAGE_EXTENSIONS.contains(&extension_lowercase.as_str()); + if !IMAGE_RS_EXTENSIONS.contains(&extension_lowercase.as_str()) && !is_raw_image { break 'dir; } @@ -732,21 +734,38 @@ fn show_preview( return; // Preview is already created, no need to recreate it } } - - let img = match image::open(&file_name) { - Ok(t) => t, - Err(e) => { - add_text_to_text_view( - text_view_errors, - fl!( - "preview_temporary_file", - generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", e.to_string())]) - ) - .as_str(), - ); - break 'dir; + let img; + if !is_raw_image { + img = match image::open(&file_name) { + Ok(t) => t, + Err(e) => { + add_text_to_text_view( + text_view_errors, + fl!( + "preview_temporary_file", + generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", e.to_string())]) + ) + .as_str(), + ); + break 'dir; + } + }; + } else { + img = match get_dynamic_image_from_raw_image(file_name) { + Some(t) => t, + None => { + add_text_to_text_view( + text_view_errors, + fl!( + "preview_temporary_file", + generate_translation_hashmap(vec![("name", file_name.to_string()), ("reason", "None".to_string())]) + ) + .as_str(), + ); + break 'dir; + } } - }; + } if img.width() == 0 || img.height() == 0 { add_text_to_text_view( text_view_errors, @@ -772,7 +791,10 @@ fn show_preview( } } let img = img.resize(new_size.0, new_size.1, FilterType::Triangle); - let file_dir = cache_dir.join(format!("cached_file.{}", extension.to_string_lossy().to_lowercase())); + let file_dir = match is_raw_image { + true => cache_dir.join("cached_file.jpg"), + false => cache_dir.join(format!("cached_file.{}", extension.to_string_lossy().to_lowercase())), + }; if let Err(e) = img.save(&file_dir) { add_text_to_text_view( text_view_errors, diff --git a/instructions/Compilation.md b/instructions/Compilation.md index bfaf652..33b01bc 100644 --- a/instructions/Compilation.md +++ b/instructions/Compilation.md @@ -8,26 +8,28 @@ If you only want the terminal version without a GUI, just skip all the packages with `gtk` in their names. +FFmpeg is not included here, because is not needed to build because it is dynamically loaded. + #### Debian / Ubuntu ```shell sudo apt install -y curl # Needed by Rust update tool curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Download the latest stable Rust -sudo apt install -y libgtk-3-dev libasound2-dev # Latest is optional +sudo apt install -y libgtk-3-dev ``` #### Fedora / CentOS / Rocky Linux ```shell curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Download the latest stable Rust -sudo yum install gtk3-devel glib2-devel alsa-lib-devel # Latest is optional +sudo yum install gtk3-devel glib2-devel ``` #### macOS -You need to install Rust via Homebrew and GTK Libraries(ffmpeg is optional dependency) +You need to install Rust via Homebrew and GTK Libraries ```shell /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install rustup rustup-init -brew install rust gtk+3 adwaita-icon-theme librsvg ffmpeg +brew install rust gtk+3 adwaita-icon-theme librsvg ``` ### Windows diff --git a/instructions/Installation.md b/instructions/Installation.md index 0c59076..9f0b34a 100644 --- a/instructions/Installation.md +++ b/instructions/Installation.md @@ -3,9 +3,10 @@ ### Linux If you use Snap, Flatpak or Appimage, you need to only install ffmpeg if you want to use Similar Videos tool. -For Czkawka GUI you are required to have at least `GTK 3.24` and also `Alsa` installed (for finding broken music files, but it is disabled by default). -`FFmpeg` in Similar Videos is non required dependency - app will work, but this tool will throw errors, so I recommend to install it. -It should be installed by default on all the most popular distros. +For Czkawka GUI the lowest supported version of GTK is `3.24` which is the only required dependency(of course on Ubuntu, different distributions will probably require a little different set of dependences). +In app exists Similar Video tool which require `FFmpeg` to work, but is completelly optional and without it, only warning would be printed when trying to use this tool without installed ffmpeg. +Broken files finder by default don't check for music files, and it is possible to enable this feature but it require to have alsa lib installed(on Ubuntu this is `libasound2-dev` package) + #### Ubuntu/Debian/Linux Mint ``` sudo apt install libgtk-3-dev ffmpeg @@ -19,7 +20,7 @@ sudo dnf -y install ffmpeg ``` #### Void Linux (CLI only) ``` -sudo xbps-install gcc pkg-config alsa-lib-devel ffpmeg +sudo xbps-install gcc pkg-config ffpmeg ``` ### macOS @@ -62,8 +63,9 @@ Artifacts from each commit can be downloaded [**here**](https://github.com/qarmi ### Appimage Appimage files are available in release page - [**GitHub releases**](https://github.com/qarmin/czkawka/releases/) -This version is bundled with its own theme. -There is also minimal appimage which use system theme. +Available are 2 versions of Appimage: +- default - which bundle gtk theme +- alternative - which don't include any gtk specific libraries ### Cargo The easiest method to install Czkawka is using the `cargo` command. To compile it, you need to get all the @@ -86,8 +88,7 @@ sudo snap connect czkawka:removable-media The Snap store entry can be found [**here**](https://snapcraft.io/czkawka). -Fresh builds are available in edge branch, but they may be a little unstable, although that happens very rarely -because I don't push untested code. +Fresh builds are available in edge branch, but they may be a little unstable. ### Flatpak ``` @@ -121,7 +122,7 @@ yay -Syu czkawka-gui-bin yay -Syu czkawka-cli-bin ``` -Package info's - https://aur.archlinux.org/packages/?O=0&SeB=nd&K=czkawka&outdated=&SB=n&SO=a&PP=50&do_Search=Go +[**Packages info**](https://aur.archlinux.org/packages/?O=0&SeB=nd&K=czkawka&outdated=&SB=n&SO=a&PP=50&do_Search=Go) ### Docker image (unofficial) Czkawka docker image is available [**here**](https://github.com/jlesage/docker-czkawka) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 821834e..c2fe960 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -14,7 +14,6 @@ parts: plugin: rust source: https://github.com/qarmin/czkawka.git build-packages: - - libasound2-dev - curl - gcc - git