retrieve extensions from mime_guess, minor code changes, added a readme and such
This commit is contained in:
parent
b95c8ec85c
commit
aedfd6d57f
5 changed files with 41 additions and 33 deletions
|
@ -6,6 +6,10 @@ authors = ["Lynnesbian <lynne@bune.city>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
license = "GPL-3.0-or-later"
|
license = "GPL-3.0-or-later"
|
||||||
rust-version = "1.43.0" # cached requires 1.42.0
|
rust-version = "1.43.0" # cached requires 1.42.0
|
||||||
|
repository = "https://git.bune.city/lynnesbian/fif"
|
||||||
|
readme = "README.md"
|
||||||
|
keywords = ["mime", "mimetype", "utilities", "tools"]
|
||||||
|
categories = ["command-line-utilities"]
|
||||||
#resolver = "2"
|
#resolver = "2"
|
||||||
#license-file = "LICENSE"
|
#license-file = "LICENSE"
|
||||||
|
|
||||||
|
|
14
README.md
Normal file
14
README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
fif
|
||||||
|
===
|
||||||
|
A command-line tool for detecting and optionally correcting files with incorrect extensions.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
```bash
|
||||||
|
cargo install --locked fif
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
<!-- TODO: documentation 0uo -->
|
||||||
|
```bash
|
||||||
|
fif --help
|
||||||
|
```
|
|
@ -13,21 +13,16 @@ pub enum ExtensionSet {
|
||||||
impl ExtensionSet {
|
impl ExtensionSet {
|
||||||
pub fn extensions(&self) -> Vec<&str> {
|
pub fn extensions(&self) -> Vec<&str> {
|
||||||
match self {
|
match self {
|
||||||
Self::Images => vec![
|
Self::Images => mime_guess::get_mime_extensions_str("image/*"),
|
||||||
"png", "jpg", "jpeg", "webp", "raw", "gif", "apng", "tga", "bmp", "tif", "tiff", "heif", "avif", "jp2", "mng",
|
Self::Videos => mime_guess::get_mime_extensions_str("video/*"),
|
||||||
"svg",
|
Self::Audio => mime_guess::get_mime_extensions_str("audio/*"),
|
||||||
],
|
Self::Documents => Some(&[
|
||||||
Self::Videos => vec![
|
|
||||||
"webm", "mp4", "mkv", "mov", "avi", "m4v", "wmv", "bik", "ogv", "qt", "3gp", "3g2", "divx",
|
|
||||||
],
|
|
||||||
Self::Audio => vec![
|
|
||||||
"ogg", "oga", "opus", "mp3", "m4a", "aac", "flac", "ape", "midi", "mid", "alac", "wav", "aiff", "aa3", "at3",
|
|
||||||
],
|
|
||||||
Self::Documents => vec![
|
|
||||||
"doc", "docx", "ppt", "pptx", "xls", "xlsx", "csv", "tsv", "pdf", "odt", "ods", "odp",
|
"doc", "docx", "ppt", "pptx", "xls", "xlsx", "csv", "tsv", "pdf", "odt", "ods", "odp",
|
||||||
],
|
][..]),
|
||||||
Self::Archives => vec!["zip", "tar", "gz", "zst", "xz", "rar", "7z", "bz", "bz2"],
|
// many compressed file types follow the name scheme "application/x.+compressed.*" - maybe this can be used
|
||||||
|
// somehow to extract extensions for compressed files from mime_guess?
|
||||||
|
Self::Archives => Some(&["zip", "tar", "gz", "zst", "xz", "rar", "7z", "bz", "bz2"][..]),
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
}
|
}.unwrap().to_vec()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ enum Writable<'a> {
|
||||||
String(&'a str),
|
String(&'a str),
|
||||||
Path(&'a PathBuf),
|
Path(&'a PathBuf),
|
||||||
Space,
|
Space,
|
||||||
Newline
|
Newline,
|
||||||
}
|
}
|
||||||
|
|
||||||
// the lifetime of a lifetime
|
// the lifetime of a lifetime
|
||||||
|
@ -40,11 +40,9 @@ fn smart_write<W: Write>(f: &mut W, writeables: &[Writable]) -> io::Result<()> {
|
||||||
Writable::Newline => writeln!(f, )?,
|
Writable::Newline => writeln!(f, )?,
|
||||||
Writable::String(s) => write!(f, "{}", s)?,
|
Writable::String(s) => write!(f, "{}", s)?,
|
||||||
Writable::Path(path) => {
|
Writable::Path(path) => {
|
||||||
match path.to_str() {
|
if let Some(string) = path.to_str() {
|
||||||
Some(string) => {
|
|
||||||
write!(f, "{}", escape(string))?
|
write!(f, "{}", escape(string))?
|
||||||
}
|
} else {
|
||||||
None => {
|
|
||||||
write!(f, "'''")?;
|
write!(f, "'''")?;
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
f.write_all(&*path.as_os_str().as_bytes())?;
|
f.write_all(&*path.as_os_str().as_bytes())?;
|
||||||
|
@ -56,7 +54,6 @@ fn smart_write<W: Write>(f: &mut W, writeables: &[Writable]) -> io::Result<()> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
src/main.rs
10
src/main.rs
|
@ -117,10 +117,8 @@ fn scan_file(entry: &DirEntry) -> Result<Findings, (ScanError, PathBuf)> {
|
||||||
let valid = match known_exts {
|
let valid = match known_exts {
|
||||||
// there is a known set of extensions for this mimetype, and the file has an extension
|
// there is a known set of extensions for this mimetype, and the file has an extension
|
||||||
Some(e) if entry_ext.is_some() => e.contains(&entry_ext.unwrap().to_lowercase().into()),
|
Some(e) if entry_ext.is_some() => e.contains(&entry_ext.unwrap().to_lowercase().into()),
|
||||||
// there is a known set of extensions for this mimetype, but the file has no extension
|
// either this file has no extension, or there is no known set of extensions for this mimetype :(
|
||||||
Some(_) => false,
|
Some(_) | None => false,
|
||||||
// there is no known set of extensions for this mimetype :(
|
|
||||||
None => false,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(Findings {
|
Ok(Findings {
|
||||||
|
@ -130,7 +128,7 @@ fn scan_file(entry: &DirEntry) -> Result<Findings, (ScanError, PathBuf)> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn scan_from_walkdir(entries: Vec<DirEntry>) -> Vec<Result<Findings, (ScanError, PathBuf)>> {
|
fn scan_from_walkdir(entries: &[DirEntry]) -> Vec<Result<Findings, (ScanError, PathBuf)>> {
|
||||||
#[cfg(feature = "multi-threaded")]
|
#[cfg(feature = "multi-threaded")]
|
||||||
{
|
{
|
||||||
// rather than using a standard par_iter, split the entries into chunks of 32 first.
|
// rather than using a standard par_iter, split the entries into chunks of 32 first.
|
||||||
|
@ -232,7 +230,7 @@ fn main() {
|
||||||
|
|
||||||
trace!("Found {} items to check", entries.len());
|
trace!("Found {} items to check", entries.len());
|
||||||
|
|
||||||
let results: Vec<_> = scan_from_walkdir(entries)
|
let results: Vec<_> = scan_from_walkdir(&entries)
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(
|
.filter(
|
||||||
|result| result.is_err() || !result.as_ref().unwrap().valid,
|
|result| result.is_err() || !result.as_ref().unwrap().valid,
|
||||||
|
|
Loading…
Reference in a new issue