- 当未指定输入文件时使用-a参数仍然可以打开输出目录
- 更换终端彩色库以支持Windows默认不启用ANSI转义序列的终端
This commit is contained in:
13
CHANGELOG.md
13
CHANGELOG.md
@ -81,11 +81,12 @@
|
|||||||
- :hammer: 将代码分离为单个文件
|
- :hammer: 将代码分离为单个文件
|
||||||
- :hammer: 优化解密算法,提高解密效率
|
- :hammer: 优化解密算法,提高解密效率
|
||||||
|
|
||||||
## [2.8.20] - 2025.8.26
|
## [2.8.20] - 2025.8.26
|
||||||
### Features :sparkles:
|
### Features :sparkles:
|
||||||
- 自动构建增加upx压缩
|
- 自动构建增加upx压缩
|
||||||
|
|
||||||
|
|
||||||
## [2.9.20] - 2025.9.4
|
## [2.9.21] - 2025.9.7
|
||||||
### Features :sparkles:
|
### Fixed :bug:
|
||||||
- 可以手动开关是否输出彩色
|
- 当未指定输入文件时使用`-a`参数仍然可以打开输出目录
|
||||||
|
- 更换终端彩色库以支持Windows默认不启用ANSI转义序列的终端
|
||||||
293
Cargo.lock
generated
293
Cargo.lock
generated
@ -227,9 +227,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.2.35"
|
version = "1.2.36"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3"
|
checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"find-msvc-tools",
|
"find-msvc-tools",
|
||||||
"jobserver",
|
"jobserver",
|
||||||
@ -327,15 +327,6 @@ version = "1.0.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "colored"
|
|
||||||
version = "3.0.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e"
|
|
||||||
dependencies = [
|
|
||||||
"windows-sys 0.59.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "console"
|
name = "console"
|
||||||
version = "0.16.0"
|
version = "0.16.0"
|
||||||
@ -349,6 +340,15 @@ dependencies = [
|
|||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "convert_case"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-segmentation",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "core-foundation-sys"
|
name = "core-foundation-sys"
|
||||||
version = "0.8.7"
|
version = "0.8.7"
|
||||||
@ -407,6 +407,33 @@ version = "0.8.21"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossterm"
|
||||||
|
version = "0.29.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"crossterm_winapi",
|
||||||
|
"derive_more",
|
||||||
|
"document-features",
|
||||||
|
"mio",
|
||||||
|
"parking_lot",
|
||||||
|
"rustix",
|
||||||
|
"signal-hook",
|
||||||
|
"signal-hook-mio",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossterm_winapi"
|
||||||
|
version = "0.9.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
|
||||||
|
dependencies = [
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crunchy"
|
name = "crunchy"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
@ -423,6 +450,36 @@ dependencies = [
|
|||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "derive_more"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
|
||||||
|
dependencies = [
|
||||||
|
"derive_more-impl",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "derive_more-impl"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
|
||||||
|
dependencies = [
|
||||||
|
"convert_case",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "document-features"
|
||||||
|
version = "0.2.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d"
|
||||||
|
dependencies = [
|
||||||
|
"litrs",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "either"
|
name = "either"
|
||||||
version = "1.15.0"
|
version = "1.15.0"
|
||||||
@ -480,6 +537,16 @@ version = "1.0.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "errno"
|
||||||
|
version = "0.3.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"windows-sys 0.60.2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "exr"
|
name = "exr"
|
||||||
version = "1.73.0"
|
version = "1.73.0"
|
||||||
@ -526,9 +593,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "find-msvc-tools"
|
name = "find-msvc-tools"
|
||||||
version = "0.1.0"
|
version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650"
|
checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
@ -570,7 +637,7 @@ dependencies = [
|
|||||||
"cfg-if",
|
"cfg-if",
|
||||||
"libc",
|
"libc",
|
||||||
"r-efi",
|
"r-efi",
|
||||||
"wasi 0.14.3+wasi-0.2.4",
|
"wasi 0.14.4+wasi-0.2.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -768,9 +835,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.77"
|
version = "0.3.78"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
|
checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
@ -784,9 +851,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lebe"
|
name = "lebe"
|
||||||
version = "0.5.2"
|
version = "0.5.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
|
checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
@ -804,6 +871,28 @@ dependencies = [
|
|||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linux-raw-sys"
|
||||||
|
version = "0.9.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "litrs"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lock_api"
|
||||||
|
version = "0.4.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"scopeguard",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.28"
|
version = "0.4.28"
|
||||||
@ -861,6 +950,18 @@ dependencies = [
|
|||||||
"simd-adler32",
|
"simd-adler32",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio"
|
||||||
|
version = "1.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||||
|
"windows-sys 0.59.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "moxcms"
|
name = "moxcms"
|
||||||
version = "0.7.5"
|
version = "0.7.5"
|
||||||
@ -896,8 +997,8 @@ dependencies = [
|
|||||||
"base64",
|
"base64",
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
"colored",
|
|
||||||
"crossbeam-channel",
|
"crossbeam-channel",
|
||||||
|
"crossterm",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"image",
|
"image",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
@ -1004,6 +1105,29 @@ version = "1.70.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
|
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking_lot"
|
||||||
|
version = "0.12.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
|
||||||
|
dependencies = [
|
||||||
|
"lock_api",
|
||||||
|
"parking_lot_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "parking_lot_core"
|
||||||
|
version = "0.9.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"redox_syscall",
|
||||||
|
"smallvec",
|
||||||
|
"windows-targets 0.52.6",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "paste"
|
name = "paste"
|
||||||
version = "1.0.15"
|
version = "1.0.15"
|
||||||
@ -1074,9 +1198,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pxfm"
|
name = "pxfm"
|
||||||
version = "0.1.20"
|
version = "0.1.23"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6e790881194f6f6e86945f0a42a6981977323669aeb6c40e9c7ec253133b96f8"
|
checksum = "f55f4fedc84ed39cb7a489322318976425e42a147e2be79d8f878e2884f94e84"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-traits",
|
"num-traits",
|
||||||
]
|
]
|
||||||
@ -1217,12 +1341,34 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08ad765b21a08b1a8e5cdce052719188a23772bcbefb3c439f0baaf62c56ceac"
|
checksum = "08ad765b21a08b1a8e5cdce052719188a23772bcbefb3c439f0baaf62c56ceac"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.5.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rgb"
|
name = "rgb"
|
||||||
version = "0.8.52"
|
version = "0.8.52"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
|
checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustix"
|
||||||
|
version = "1.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"errno",
|
||||||
|
"libc",
|
||||||
|
"linux-raw-sys",
|
||||||
|
"windows-sys 0.60.2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.22"
|
version = "1.0.22"
|
||||||
@ -1244,6 +1390,12 @@ dependencies = [
|
|||||||
"winapi-util",
|
"winapi-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "scopeguard"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.219"
|
version = "1.0.219"
|
||||||
@ -1291,6 +1443,36 @@ version = "1.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook"
|
||||||
|
version = "0.3.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"signal-hook-registry",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook-mio"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
"signal-hook",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "signal-hook-registry"
|
||||||
|
version = "1.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd-adler32"
|
name = "simd-adler32"
|
||||||
version = "0.3.7"
|
version = "0.3.7"
|
||||||
@ -1428,6 +1610,12 @@ version = "1.0.18"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-segmentation"
|
||||||
|
version = "1.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-width"
|
name = "unicode-width"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
@ -1487,30 +1675,31 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.14.3+wasi-0.2.4"
|
version = "0.14.4+wasi-0.2.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95"
|
checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wit-bindgen",
|
"wit-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "wasm-bindgen"
|
||||||
version = "0.2.100"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
|
checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"wasm-bindgen-macro",
|
"wasm-bindgen-macro",
|
||||||
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-backend"
|
name = "wasm-bindgen-backend"
|
||||||
version = "0.2.100"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
|
checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"log",
|
"log",
|
||||||
@ -1522,9 +1711,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro"
|
name = "wasm-bindgen-macro"
|
||||||
version = "0.2.100"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
|
checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"wasm-bindgen-macro-support",
|
"wasm-bindgen-macro-support",
|
||||||
@ -1532,9 +1721,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro-support"
|
name = "wasm-bindgen-macro-support"
|
||||||
version = "0.2.100"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
|
checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -1545,9 +1734,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-shared"
|
name = "wasm-bindgen-shared"
|
||||||
version = "0.2.100"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
|
checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -1568,6 +1757,22 @@ version = "0.1.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
|
checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi"
|
||||||
|
version = "0.3.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu",
|
||||||
|
"winapi-x86_64-pc-windows-gnu",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-util"
|
name = "winapi-util"
|
||||||
version = "0.1.10"
|
version = "0.1.10"
|
||||||
@ -1577,6 +1782,12 @@ dependencies = [
|
|||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "windows-core"
|
name = "windows-core"
|
||||||
version = "0.61.2"
|
version = "0.61.2"
|
||||||
@ -1794,24 +2005,24 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.45.0"
|
version = "0.45.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814"
|
checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy"
|
name = "zerocopy"
|
||||||
version = "0.8.26"
|
version = "0.8.27"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
|
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zerocopy-derive",
|
"zerocopy-derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zerocopy-derive"
|
name = "zerocopy-derive"
|
||||||
version = "0.8.26"
|
version = "0.8.27"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
|
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -1835,9 +2046,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "zune-jpeg"
|
name = "zune-jpeg"
|
||||||
version = "0.4.20"
|
version = "0.4.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089"
|
checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"zune-core",
|
"zune-core",
|
||||||
]
|
]
|
||||||
|
|||||||
@ -17,8 +17,8 @@ audiotags = { version = "0.5.0", default-features = false }
|
|||||||
base64 = { version = "0.22.*" }
|
base64 = { version = "0.22.*" }
|
||||||
chrono = { version = "0.4.*", features = ["clock"], default-features = false }
|
chrono = { version = "0.4.*", features = ["clock"], default-features = false }
|
||||||
clap = { version = "4.5.*", features = ["derive", "std"] }
|
clap = { version = "4.5.*", features = ["derive", "std"] }
|
||||||
colored = { version = "3.0.0", default-features = false }
|
|
||||||
crossbeam-channel = "0.5.15"
|
crossbeam-channel = "0.5.15"
|
||||||
|
crossterm = "0.29.0"
|
||||||
env_logger = { version = "0.11.7", default-features = false }
|
env_logger = { version = "0.11.7", default-features = false }
|
||||||
image = "0.25.*"
|
image = "0.25.*"
|
||||||
indicatif = "0.18.*"
|
indicatif = "0.18.*"
|
||||||
|
|||||||
@ -14,6 +14,7 @@ pub enum AppError {
|
|||||||
FileDataError,
|
FileDataError,
|
||||||
SaveError,
|
SaveError,
|
||||||
SystemTimeError,
|
SystemTimeError,
|
||||||
|
CannotCreateDir,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::error::Error for AppError {}
|
impl std::error::Error for AppError {}
|
||||||
@ -34,7 +35,7 @@ impl std::fmt::Display for AppError {
|
|||||||
Self::FileDataError => "处理文件数据时出错",
|
Self::FileDataError => "处理文件数据时出错",
|
||||||
Self::SaveError => "保存文件出错",
|
Self::SaveError => "保存文件出错",
|
||||||
Self::SystemTimeError => "获取时间戳失败",
|
Self::SystemTimeError => "获取时间戳失败",
|
||||||
// _ => "未知错误",
|
Self::CannotCreateDir => "无法创建父级目录", // _ => "未知错误",
|
||||||
};
|
};
|
||||||
write!(f, "{}", result)
|
write!(f, "{}", result)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
use colored::Color::{Cyan, Green, Red, Yellow,Magenta};
|
use crossterm::style::{Color, Stylize}; //防止windows终端乱码
|
||||||
use colored::Colorize;
|
|
||||||
use indicatif::MultiProgress;
|
use indicatif::MultiProgress;
|
||||||
use log::{Log, Metadata, Record, SetLoggerError};
|
use log::{Log, Metadata, Record, SetLoggerError};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -16,6 +15,15 @@ impl Log for MultiProgressLogger {
|
|||||||
|
|
||||||
fn log(&self, record: &Record) {
|
fn log(&self, record: &Record) {
|
||||||
if self.enabled(record.metadata()) {
|
if self.enabled(record.metadata()) {
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
let level = match record.level() {
|
||||||
|
log::Level::Error => ("Error").with(Color::Red),
|
||||||
|
log::Level::Warn => ("Warn").with(Color::Yellow),
|
||||||
|
log::Level::Info => ("Info").with(Color::Green),
|
||||||
|
log::Level::Debug => ("Debug").with(Color::Magenta),
|
||||||
|
log::Level::Trace => ("Trace").with(Color::Cyan),
|
||||||
|
};
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
let level = match record.level() {
|
let level = match record.level() {
|
||||||
log::Level::Error => ("Error").color(Red),
|
log::Level::Error => ("Error").color(Red),
|
||||||
log::Level::Warn => ("Warn").color(Yellow),
|
log::Level::Warn => ("Warn").color(Yellow),
|
||||||
@ -23,6 +31,7 @@ impl Log for MultiProgressLogger {
|
|||||||
log::Level::Debug => ("Debug").color(Magenta),
|
log::Level::Debug => ("Debug").color(Magenta),
|
||||||
log::Level::Trace => ("Trace").color(Cyan),
|
log::Level::Trace => ("Trace").color(Cyan),
|
||||||
};
|
};
|
||||||
|
|
||||||
let message = format!(
|
let message = format!(
|
||||||
"[{}][{}] {}",
|
"[{}][{}] {}",
|
||||||
chrono::Local::now().format("%H:%M:%S"),
|
chrono::Local::now().format("%H:%M:%S"),
|
||||||
|
|||||||
63
src/main.rs
63
src/main.rs
@ -1,6 +1,6 @@
|
|||||||
use ::clap::Parser;
|
use ::clap::Parser;
|
||||||
use colored::{Color, Colorize};
|
|
||||||
use crossbeam_channel::{bounded, Sender};
|
use crossbeam_channel::{bounded, Sender};
|
||||||
|
use crossterm::style::{Color, Stylize}; //防止windows终端乱码
|
||||||
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
|
use indicatif::{MultiProgress, ProgressBar, ProgressStyle};
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use log::{error, info, warn, LevelFilter};
|
use log::{error, info, warn, LevelFilter};
|
||||||
@ -23,16 +23,7 @@ use apperror::AppError;
|
|||||||
use ncmdump::Ncmfile;
|
use ncmdump::Ncmfile;
|
||||||
use time::TimeCompare;
|
use time::TimeCompare;
|
||||||
|
|
||||||
|
|
||||||
fn main() -> Result<(), AppError> {
|
fn main() -> Result<(), AppError> {
|
||||||
let timer = match TimeCompare::new() {
|
|
||||||
Ok(t) => t,
|
|
||||||
Err(e) => {
|
|
||||||
error!("无法初始化时间戳系统。{}", e);
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 初始化日志系统
|
// 初始化日志系统
|
||||||
match logger::init_logger() {
|
match logger::init_logger() {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
@ -41,11 +32,22 @@ fn main() -> Result<(), AppError> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let timer = match TimeCompare::new() {
|
||||||
|
Ok(t) => t,
|
||||||
|
Err(e) => {
|
||||||
|
error!("无法初始化时间戳系统。{}", e);
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let cli = clap::Cli::parse();
|
let cli = clap::Cli::parse();
|
||||||
|
|
||||||
//设置彩色输出
|
//设置彩色输出
|
||||||
let if_colorful = !cli.nocolor;
|
// let if_colorful = !cli.nocolor;
|
||||||
colored::control::set_override(if_colorful);
|
// colored::control::set_override(if_colorful);
|
||||||
|
// crossterm::terminal::enable_raw_mode()
|
||||||
|
//FIXME 更改颜色库
|
||||||
|
//TODO控制颜色输出,更改为使用环境变量
|
||||||
|
|
||||||
//获取cpu核心数
|
//获取cpu核心数
|
||||||
let cpus = num_cpus::get();
|
let cpus = num_cpus::get();
|
||||||
@ -58,7 +60,7 @@ fn main() -> Result<(), AppError> {
|
|||||||
1
|
1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None => cpus,//默认使用cpu核心数作为线程数
|
None => cpus, //默认使用cpu核心数作为线程数
|
||||||
};
|
};
|
||||||
//输入目录
|
//输入目录
|
||||||
let input = cli.input;
|
let input = cli.input;
|
||||||
@ -67,7 +69,7 @@ fn main() -> Result<(), AppError> {
|
|||||||
// 强制覆盖
|
// 强制覆盖
|
||||||
let forcesave = cli.forcesave;
|
let forcesave = cli.forcesave;
|
||||||
if forcesave {
|
if forcesave {
|
||||||
warn!("文件{}已开启!", "强制覆盖".bright_red())
|
warn!("文件{}已开启!", "强制覆盖".with(Color::Red))
|
||||||
}
|
}
|
||||||
let level = match cli.debug {
|
let level = match cli.debug {
|
||||||
0 | 3 => LevelFilter::Info,
|
0 | 3 => LevelFilter::Info,
|
||||||
@ -77,7 +79,7 @@ fn main() -> Result<(), AppError> {
|
|||||||
5 => LevelFilter::Trace,
|
5 => LevelFilter::Trace,
|
||||||
_ => LevelFilter::Off,
|
_ => LevelFilter::Off,
|
||||||
};
|
};
|
||||||
info!("日志等级:{}", level.to_string());
|
info!("日志等级:{}", level);
|
||||||
log::set_max_level(level);
|
log::set_max_level(level);
|
||||||
|
|
||||||
let undumpfile = pathparse::pathparse(input); // 该列表将存入文件的路径
|
let undumpfile = pathparse::pathparse(input); // 该列表将存入文件的路径
|
||||||
@ -88,16 +90,22 @@ fn main() -> Result<(), AppError> {
|
|||||||
let mut failure_count = 0; //发生错误的
|
let mut failure_count = 0; //发生错误的
|
||||||
|
|
||||||
if taskcount == 0 {
|
if taskcount == 0 {
|
||||||
error!("没有找到有效文件。使用-i参数输入需要解密的文件或文件夹。");
|
if cli.autoopen {
|
||||||
|
opendir::autoopen(cli.autoopen, outputdir);
|
||||||
|
} else {
|
||||||
|
error!("没有找到有效文件。使用-i参数输入需要解密的文件或文件夹。使用-a参数自动打开输出文件夹。");
|
||||||
|
}
|
||||||
|
|
||||||
exit(2);
|
exit(2);
|
||||||
};
|
};
|
||||||
|
// 创建完整的父目录
|
||||||
|
if std::fs::create_dir_all(&outputdir).is_err() {
|
||||||
|
return Err(AppError::CannotCreateDir);
|
||||||
|
}
|
||||||
// 初始化线程池
|
// 初始化线程池
|
||||||
let pool = threadpool::Pool::new(max_workers);
|
let pool = threadpool::Pool::new(max_workers);
|
||||||
|
|
||||||
info!(
|
info!("将启用{}线程", max_workers.to_string().with(Color::Green));
|
||||||
"将启用{}线程",
|
|
||||||
max_workers.to_string().color(Color::BrightGreen)
|
|
||||||
);
|
|
||||||
// 初始化通讯
|
// 初始化通讯
|
||||||
// let (tx, rx) = mpsc::channel();
|
// let (tx, rx) = mpsc::channel();
|
||||||
let (tx, rx) = bounded(taskcount * 6);
|
let (tx, rx) = bounded(taskcount * 6);
|
||||||
@ -145,7 +153,7 @@ fn main() -> Result<(), AppError> {
|
|||||||
Signals::Err(_) => failure_count += 1,
|
Signals::Err(_) => failure_count += 1,
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
if (success_count+ignore_count+failure_count) < taskcount {
|
if (success_count + ignore_count + failure_count) < taskcount {
|
||||||
progressbar.inc(1);
|
progressbar.inc(1);
|
||||||
// messages.log(); //发送log
|
// messages.log(); //发送log
|
||||||
} else {
|
} else {
|
||||||
@ -164,19 +172,14 @@ fn main() -> Result<(), AppError> {
|
|||||||
};
|
};
|
||||||
info!(
|
info!(
|
||||||
"成功解密{}个文件,跳过{}个文件,{}个文件解密失败,{}",
|
"成功解密{}个文件,跳过{}个文件,{}个文件解密失败,{}",
|
||||||
success_count.to_string().bright_green(),
|
success_count.to_string().with(Color::Green),
|
||||||
ignore_count.to_string().purple(),
|
ignore_count.to_string().with(Color::Magenta),
|
||||||
failure_count.to_string().bright_red(),
|
failure_count.to_string().with(Color::Red),
|
||||||
showtime()
|
showtime()
|
||||||
);
|
);
|
||||||
|
|
||||||
// 自动打开输出文件夹
|
// 自动打开输出文件夹
|
||||||
if cli.autoopen {
|
opendir::autoopen(cli.autoopen, outputdir);
|
||||||
info!("自动打开文件夹:[{}]", outputdir.cyan());
|
|
||||||
opendir::opendir(outputdir.into());
|
|
||||||
} else {
|
|
||||||
info!("输出文件夹:[{}]", outputdir.cyan());
|
|
||||||
};
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
use crate::{messager, AppError};
|
use crate::{messager, AppError};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
// use
|
// use
|
||||||
|
|||||||
@ -5,13 +5,13 @@ use aes::cipher::{generic_array::GenericArray, BlockDecrypt, KeyInit};
|
|||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use audiotags::{MimeType, Picture, Tag};
|
use audiotags::{MimeType, Picture, Tag};
|
||||||
use base64::{self, Engine};
|
use base64::{self, Engine};
|
||||||
use colored::*;
|
use crossterm::style::{Color, Stylize}; //防止windows终端乱码
|
||||||
use log::{debug, info, trace};
|
use log::{debug, info, trace};
|
||||||
use messager::Signals;
|
use messager::Signals;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use serde_json::{self, Value};
|
use serde_json::{self, Value};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::fs::{self, File};
|
use std::fs::File;
|
||||||
use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write};
|
use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom, Write};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
@ -132,7 +132,7 @@ impl Ncmfile {
|
|||||||
let mut buf: Vec<u8> = vec![0; (self.size - self.position) as usize];
|
let mut buf: Vec<u8> = vec![0; (self.size - self.position) as usize];
|
||||||
let _ = reader.read_exact(&mut buf);
|
let _ = reader.read_exact(&mut buf);
|
||||||
self.position += length;
|
self.position += length;
|
||||||
buf[..].to_vec()
|
buf[..].to_vec()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let mut reader = BufReader::new(&self.file);
|
let mut reader = BufReader::new(&self.file);
|
||||||
@ -154,7 +154,7 @@ impl Ncmfile {
|
|||||||
}
|
}
|
||||||
///按字节进行0x64异或。
|
///按字节进行0x64异或。
|
||||||
fn parse_key(key: &mut [u8]) -> &[u8] {
|
fn parse_key(key: &mut [u8]) -> &[u8] {
|
||||||
for item in &mut *key {
|
for item in &mut *key {
|
||||||
*item ^= 0x64;
|
*item ^= 0x64;
|
||||||
}
|
}
|
||||||
key
|
key
|
||||||
@ -186,6 +186,15 @@ impl Ncmfile {
|
|||||||
fn unpad(data: &[u8]) -> Vec<u8> {
|
fn unpad(data: &[u8]) -> Vec<u8> {
|
||||||
data[..data.len() - data[data.len() - 1] as usize].to_vec()
|
data[..data.len() - data[data.len() - 1] as usize].to_vec()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_filename(&self) -> &str {
|
||||||
|
&self.filename
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn get_fullfilename(&self) -> &str {
|
||||||
|
&self.fullfilename
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Ncmfile {
|
impl Ncmfile {
|
||||||
@ -273,23 +282,25 @@ impl Ncmfile {
|
|||||||
//处理文件路径
|
//处理文件路径
|
||||||
trace!("拼接文件路径");
|
trace!("拼接文件路径");
|
||||||
let path = {
|
let path = {
|
||||||
let filename = format!(
|
let output_filename = &format!(
|
||||||
"{}.{}",
|
"{}.{}",
|
||||||
self.filename,
|
self.get_filename(),
|
||||||
meta_data
|
meta_data
|
||||||
.get("format")
|
.get("format")
|
||||||
.ok_or(AppError::CannotReadMetaInfo)?
|
.ok_or(AppError::CannotReadMetaInfo)?
|
||||||
.as_str()
|
.as_str()
|
||||||
.ok_or(AppError::CannotReadMetaInfo)?
|
.ok_or(AppError::CannotReadMetaInfo)?
|
||||||
);
|
)[..];
|
||||||
|
|
||||||
// let filename = standardize_filename(filename);
|
// let output_filename = standardize_filename(output_filename);
|
||||||
debug!("文件名:{}", filename.yellow());
|
debug!("文件名:{}", output_filename.with(Color::Yellow));
|
||||||
|
|
||||||
|
//已在程序开头创建,无需浪费性能
|
||||||
//链级创建输出目录
|
//链级创建输出目录
|
||||||
if fs::create_dir_all(outputdir).is_err() {
|
// if fs::create_dir_all(outputdir).is_err() {
|
||||||
return Err(AppError::FileWriteError);
|
// return Err(AppError::FileWriteError);
|
||||||
}
|
// }
|
||||||
outputdir.join(filename)
|
outputdir.join(output_filename)
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("文件路径: {:?}", path);
|
debug!("文件路径: {:?}", path);
|
||||||
@ -392,13 +403,13 @@ impl Ncmfile {
|
|||||||
|
|
||||||
info!(
|
info!(
|
||||||
"[{}] 文件已保存到: {}",
|
"[{}] 文件已保存到: {}",
|
||||||
self.filename.yellow(),
|
self.get_filename().with(Color::Yellow),
|
||||||
path.to_str().ok_or(AppError::SaveError)?.bright_cyan()
|
path.to_str().ok_or(AppError::SaveError)?.with(Color::Cyan)
|
||||||
);
|
);
|
||||||
info!(
|
info!(
|
||||||
"[{}]{}",
|
"[{}]{}",
|
||||||
self.fullfilename.yellow(),
|
self.get_filename().with(Color::Yellow),
|
||||||
"解密成功".bright_green()
|
"解密成功".with(Color::Green)
|
||||||
);
|
);
|
||||||
let _ = messager.send(Signals::End);
|
let _ = messager.send(Signals::End);
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
use log::error;
|
use crossterm::style::{Color, Stylize};
|
||||||
use std::{path::PathBuf, process::Command};
|
use log::{error, info};
|
||||||
|
use std::{path::PathBuf, process::Command}; //防止windows终端乱码
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
pub fn opendir(dir: PathBuf) {
|
pub fn opendir(dir: PathBuf) {
|
||||||
if Command::new("explorer")
|
if Command::new("explorer")
|
||||||
.arg(&dir) // <- Specify the directory you'd like to open.
|
.arg(&dir) // <- Specify the directory you'd like to open.
|
||||||
.spawn().is_err()
|
.spawn()
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
error!("无法打开输出文件夹:[{}]", dir.display())
|
error!("无法打开输出文件夹:[{}]", dir.display())
|
||||||
}
|
}
|
||||||
@ -15,7 +17,8 @@ pub fn opendir(dir: PathBuf) {
|
|||||||
pub fn opendir(dir: PathBuf) {
|
pub fn opendir(dir: PathBuf) {
|
||||||
if Command::new("open")
|
if Command::new("open")
|
||||||
.arg(&dir) // <- Specify the directory you'd like to open.
|
.arg(&dir) // <- Specify the directory you'd like to open.
|
||||||
.spawn().is_err()
|
.spawn()
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
error!("无法打开输出文件夹:[{}]", dir.display())
|
error!("无法打开输出文件夹:[{}]", dir.display())
|
||||||
}
|
}
|
||||||
@ -24,8 +27,20 @@ pub fn opendir(dir: PathBuf) {
|
|||||||
pub fn opendir(dir: PathBuf) {
|
pub fn opendir(dir: PathBuf) {
|
||||||
if Command::new("open")
|
if Command::new("open")
|
||||||
.arg(&dir) // <- Specify the directory you'd like to open.
|
.arg(&dir) // <- Specify the directory you'd like to open.
|
||||||
.spawn().is_err()
|
.spawn()
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
error!("无法打开输出文件夹:[{}]", dir.display())
|
error!("无法打开输出文件夹:[{}]", dir.display())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 自动打开输出文件夹的跨平台函数
|
||||||
|
pub fn autoopen(if_auto_open: bool, path: String) {
|
||||||
|
let styled_path = (&path[..]).with(Color::Cyan);
|
||||||
|
if if_auto_open {
|
||||||
|
info!("自动打开文件夹:[{}]", styled_path);
|
||||||
|
opendir(path.into());
|
||||||
|
} else {
|
||||||
|
info!("输出文件夹:[{}]", styled_path);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user