[WIP] Add raw images support (#532)
* Add raw images support * Potato * Update
This commit is contained in:
parent
de964ce40d
commit
0f0e7a338f
293
Cargo.lock
generated
293
Cargo.lock
generated
|
@ -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"
|
||||
|
|
12
Changelog.md
12
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)
|
||||
|
|
|
@ -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 = []
|
||||
|
||||
|
|
|
@ -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<BTreeMap<String,
|
|||
}
|
||||
|
||||
fn check_extension_avaibility(file_name_lowercase: &str) -> 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
|
||||
|
|
|
@ -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<Path> + std::fmt::Debug) -> Option<DynamicImage> {
|
||||
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::<Rgb<u8>, Vec<u8>>::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)]
|
||||
|
|
|
@ -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('.'));
|
||||
|
|
|
@ -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<ProgressData>>) -> bool {
|
||||
let start_time: SystemTime = SystemTime::now();
|
||||
let mut folders_to_check: Vec<PathBuf> = 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 {
|
||||
|
|
|
@ -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<PathBuf> = 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<u8>)> = 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<u8> = 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<u8> = 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())
|
||||
|
|
|
@ -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<PathBuf> = 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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -14,7 +14,6 @@ parts:
|
|||
plugin: rust
|
||||
source: https://github.com/qarmin/czkawka.git
|
||||
build-packages:
|
||||
- libasound2-dev
|
||||
- curl
|
||||
- gcc
|
||||
- git
|
||||
|
|
Loading…
Reference in a new issue