* Update ImagePipe, fixes music finder
* Change rodio library, enable by default checking for broken audio files
* Don't crash when checking for broken files
* Fix stopping of scan in broken files
* No more
* PDF Support
* Infer and crash handler for music
- Feature proposals - proposal to change/add/delete some features
- Pull Requests - implementing a new feature yourself or fixing bugs.
If the change is bigger, then it's a good idea to open a new issue to discuss changes.
If the change is bigger, then it's a good idea to open a new issue to discuss changes, but issues with label `PR welcome` are already checked and accepted.
- Documentation - There is an [instruction](instructions/Instruction.md) which you can improve.
- Translations - Instruction how to translate files is available [here](instructions/Translations.md)
@ -178,5 +178,7 @@ Big thanks to Pádraig Brady, creator of fantastic FSlint, because without his w
Thanks also to all the people who create patches for this program, make it available on other systems, create videos, articles about it etc.
Also I really appreciate work of people that create crates on which Czkawka is based and for that I try to report bugs to make it even better.
## Donations
If you are using the app, I would appreciate a donation for its further development, which can be done [here](https://github.com/sponsors/qarmin).
// This error is a problem with image library, remove check when https://github.com/image-rs/jpeg-decoder/issues/130 will be fixed
if!error_string.contains("spectral selection is not allowed in non-progressive scan"){
file_entry.error_string=error_string;
Some(Some(file_entry))
}else{
Some(None)
}
ifletErr(e)=image::open(&file_entry.path){
leterror_string=e.to_string();
// This error is a problem with image library, remove check when https://github.com/image-rs/jpeg-decoder/issues/130 will be fixed
iferror_string.contains("spectral selection is not allowed in non-progressive scan"){
returnSome(None);
}
file_entry.error_string=error_string;
}
Some(Some(file_entry))
});
// If image crashed during opening, we just skip checking its hash and go on
// If image crashed during opening, needs to be printed info about crashes thing
ifletOk(image_result)=result{
image_result
image_result
}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_clone.path);
Some(Some(file_entry_clone))
file_entry_clone.error_string="Image crashes due parsing, please check if problem happens with updated https://github.com/qarmin/ImageOpening and later report here https://github.com/image-rs/image/issues".to_string();
println!("External parsing audio library crashed when opening \"{:?}\" audio file, please report bug here - https://github.com/qarmin/audio_checker/issues",file_entry_clone.path);
file_entry_clone.error_string="Audio crashes due parsing, please report bug here - https://github.com/qarmin/audio_checker/issues".to_string();
Some(Some(file_entry_clone))
}
},
Err(_inspected)=>Some(None),// TODO maybe throw error or something
},
TypeOfFile::PDF=>{
matchfs::read(&file_entry.path){
Ok(content)=>{
// Will be available in pdf > 0.7.2
// let parser_options = ParseOptions {
// allow_error_in_option: true,
// allow_xref_error: true,
// allow_invalid_ops: true,
// allow_missing_endobj: true,
// };
// if let Err(e) = pdf::file::File::from_data_with_options(content, parser_options) {
letmutfile_entry_clone=file_entry.clone();
letresult=panic::catch_unwind(||{
ifletErr(e)=pdf::file::File::from_data(content){
file_entry.error_string=e.to_string();
leterror=unpack_pdf_error(e);
ifletpdf::PdfError::InvalidPassword=error{
returnSome(None);
}
}
Some(Some(file_entry))
});
ifletOk(pdf_result)=result{
pdf_result
}else{
println!("PDF-rs library crashed when opening \"{:?}\" pdf, and if it is not reported, please report bug here - https://github.com/pdf-rs/pdf",file_entry_clone.path);
file_entry_clone.error_string="PDF-rs library crashed when opening pdf, and if it is not reported, please report bug here - https://github.com/pdf-rs/pdf".to_string();
Some(Some(file_entry_clone))
}
},
Err(_inspected)=>Some(None)
}
}
// This means that cache read invalid value because maybe cache comes from different czkawka version
TypeOfFile::Unknown=>Some(None),
}
@ -500,7 +540,7 @@ impl BrokenFiles {
ifself.use_cache{
// Must save all results to file, old loaded from file with all currently counted results
letmutfolders_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
letmutfolders_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
@ -102,7 +102,8 @@ Windows - `C:\Users\Username\AppData\Local\Qarmin\Czkawka\cache`
By default for all files grouped by same size are computed partial hash(hash from only of 2KB each file). Such hash is computed usually very fast, especially on SSD and fast multicore processors. But when scanning a hundred of thousands or millions of files with HDD or slow processor, usually this step can take much time. In settings exists option `Use prehash cache` which enables caching such things. It is disabled by default because can increase time of loading/saving cache, with big number of entries.
- **Permanent store of cache entries**
After each scan, entries in cache are validated and outdated ones(which points at non-existent files) are removed. This may be problematic when scanning external drivers(like pendrives, disks etc.) and later unplugging and plugging them again. In settings exists option `Delete outdated cache entries automatically` which automatically clear this, but this can be disabled. Disabling such option may create big cache files, so button `Remove outdated results` will do it manually.
- **Partial scanning**
If you know that you can't scan all files at once, you can still try to scan all files and during scan just stop it, so already calculated hashes/data will be saved to cache and will speedup later scans.
# Tools
@ -272,3 +273,7 @@ It works in this way:
- Returns all file extensions that are connected to this mime type e.g. `rar,7z,zip,p7`
- Basing on file extension, adds more elements to list from above(needed because some files e.g. `exe` and `dll` begins with similar/same bytes)
- If current file extensions is inside list then probably have proper extension, if is not inside, then is shown as file with invalid extension
In `Proper Extension` column, inside parentheses is visible extension guessed by Infer library, and outside there are extensions which have same mime type as guessed one.