move ascii_reduce to its own module crate
This commit is contained in:
parent
66a83fbbbb
commit
e9cf51e291
69
Cargo.lock
generated
69
Cargo.lock
generated
|
@ -80,6 +80,15 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ascii_reduce"
|
||||||
|
version = "1.0.0"
|
||||||
|
dependencies = [
|
||||||
|
"phf",
|
||||||
|
"phf_codegen",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
|
@ -656,6 +665,7 @@ dependencies = [
|
||||||
name = "musicutil"
|
name = "musicutil"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"ascii_reduce",
|
||||||
"bytes",
|
"bytes",
|
||||||
"clap",
|
"clap",
|
||||||
"html-escape",
|
"html-escape",
|
||||||
|
@ -726,6 +736,44 @@ version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
|
checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
|
||||||
|
dependencies = [
|
||||||
|
"phf_shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_codegen"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a"
|
||||||
|
dependencies = [
|
||||||
|
"phf_generator",
|
||||||
|
"phf_shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_generator"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
|
||||||
|
dependencies = [
|
||||||
|
"phf_shared",
|
||||||
|
"rand",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "phf_shared"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
|
||||||
|
dependencies = [
|
||||||
|
"siphasher",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pkg-config"
|
name = "pkg-config"
|
||||||
version = "0.3.27"
|
version = "0.3.27"
|
||||||
|
@ -766,6 +814,21 @@ dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
|
@ -917,6 +980,12 @@ version = "1.2.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
|
checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "siphasher"
|
||||||
|
version = "0.3.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "string-error"
|
name = "string-error"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|
|
@ -21,7 +21,13 @@ serde_with = "3"
|
||||||
# argument parsing
|
# argument parsing
|
||||||
clap = { version = "4", features = ["derive"] }
|
clap = { version = "4", features = ["derive"] }
|
||||||
|
|
||||||
# ascii_reduce constants & transcode presets
|
# for reducing filenames to ascii
|
||||||
|
# useful for when storing music files on mp3 players with broken unicode support
|
||||||
|
ascii_reduce = { path = "./modules/ascii_reduce" }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# transcode presets & format handlers
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
|
|
||||||
# for scan_for_music
|
# for scan_for_music
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1697456312,
|
"lastModified": 1698318101,
|
||||||
"narHash": "sha256-roiSnrqb5r+ehnKCauPLugoU8S36KgmWraHgRqVYndo=",
|
"narHash": "sha256-gUihHt3yPD7bVqg+k/UVHgngyaJ3DMEBchbymBMvK1E=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "ca012a02bf8327be9e488546faecae5e05d7d749",
|
"rev": "63678e9f3d3afecfeafa0acead6239cdb447574c",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
14
modules/ascii_reduce/Cargo.toml
Normal file
14
modules/ascii_reduce/Cargo.toml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "ascii_reduce"
|
||||||
|
version = "1.0.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
phf = { version = "0.11", default-features = false }
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
serde_json = "1.0"
|
||||||
|
phf_codegen = "0.11"
|
||||||
|
|
48
modules/ascii_reduce/build.rs
Normal file
48
modules/ascii_reduce/build.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::{BufWriter, Write};
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
const MAPPINGS_DATA: &str = include_str!("src/mappings.json");
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let data: HashMap<String, String> =
|
||||||
|
serde_json::from_str(MAPPINGS_DATA).expect("mapping data invalid");
|
||||||
|
|
||||||
|
let mut replacement_map: HashMap<char, String> = HashMap::new();
|
||||||
|
for (chr, repl) in &data {
|
||||||
|
match chr.parse::<u32>() {
|
||||||
|
Ok(n) => {
|
||||||
|
let b = char::from_u32(n).expect("invalid char in string");
|
||||||
|
|
||||||
|
replacement_map.insert(b, repl.to_string());
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
panic!(
|
||||||
|
"mapping data broken, could not parse char {} with error {}",
|
||||||
|
chr, e
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut map: &mut phf_codegen::Map<char> = &mut phf_codegen::Map::new();
|
||||||
|
for replacement in replacement_map.into_iter() {
|
||||||
|
let r_char = replacement.1;
|
||||||
|
map = map.entry(
|
||||||
|
replacement.0,
|
||||||
|
format!("\"{}\"", r_char.escape_debug()).as_str(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
let path = Path::new(&env::var("OUT_DIR").unwrap()).join("codegen.rs");
|
||||||
|
let mut file = BufWriter::new(File::create(&path).unwrap());
|
||||||
|
write!(
|
||||||
|
&mut file,
|
||||||
|
"static MAPPINGS: phf::Map<char, &'static str> = {}",
|
||||||
|
map.build()
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
write!(&mut file, ";\n").unwrap();
|
||||||
|
}
|
21
modules/ascii_reduce/src/lib.rs
Normal file
21
modules/ascii_reduce/src/lib.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
include!(concat!(env!("OUT_DIR"), "/codegen.rs"));
|
||||||
|
|
||||||
|
pub fn reduce(input: String) -> String {
|
||||||
|
if input.is_ascii() {
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut output = String::with_capacity(input.len());
|
||||||
|
for c in input.chars() {
|
||||||
|
if c.is_ascii() {
|
||||||
|
output.push(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(replacement) = MAPPINGS.get(&c) {
|
||||||
|
output.push_str(replacement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output
|
||||||
|
}
|
|
@ -5,12 +5,13 @@ use std::thread::scope;
|
||||||
use crate::args::CLIArgs;
|
use crate::args::CLIArgs;
|
||||||
use crate::types::AudioFileInfo;
|
use crate::types::AudioFileInfo;
|
||||||
use crate::types::File;
|
use crate::types::File;
|
||||||
use crate::utils::ascii_reduce::reduce_to_ascii;
|
|
||||||
use crate::utils::formats::get_format_handler;
|
use crate::utils::formats::get_format_handler;
|
||||||
#[cfg(feature = "replaygain")]
|
#[cfg(feature = "replaygain")]
|
||||||
use crate::utils::replaygain::analyze_replaygain;
|
use crate::utils::replaygain::analyze_replaygain;
|
||||||
use crate::utils::scan_for_music;
|
use crate::utils::scan_for_music;
|
||||||
|
|
||||||
|
use ascii_reduce::reduce;
|
||||||
|
|
||||||
#[derive(Debug, Clone, clap::Args)]
|
#[derive(Debug, Clone, clap::Args)]
|
||||||
pub struct ProcessCommandArgs {
|
pub struct ProcessCommandArgs {
|
||||||
pub source: String,
|
pub source: String,
|
||||||
|
@ -40,8 +41,8 @@ fn rename_file(process_args: &ProcessCommandArgs, file: &mut File) {
|
||||||
let artist = artist.replace('\n', "");
|
let artist = artist.replace('\n', "");
|
||||||
|
|
||||||
// Step 2: Strip ASCII
|
// Step 2: Strip ASCII
|
||||||
let title = reduce_to_ascii(title);
|
let title = reduce(title);
|
||||||
let artist = reduce_to_ascii(artist);
|
let artist = reduce(artist);
|
||||||
|
|
||||||
// Step 3: Remove File Seperators
|
// Step 3: Remove File Seperators
|
||||||
let title = title.replace('\\', &replace_char);
|
let title = title.replace('\\', &replace_char);
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
use lazy_static::lazy_static;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
const MAPPINGS_DATA: &str = include_str!("mappings.json");
|
|
||||||
|
|
||||||
lazy_static! {
|
|
||||||
static ref MAPPINGS: HashMap<char, String> = {
|
|
||||||
let data: HashMap<String, String> =
|
|
||||||
serde_json::from_str(MAPPINGS_DATA).expect("mapping data invalid");
|
|
||||||
|
|
||||||
let mut replacement_map: HashMap<char, String> = HashMap::new();
|
|
||||||
for (chr, repl) in &data {
|
|
||||||
match chr.parse::<u32>() {
|
|
||||||
Ok(n) => {
|
|
||||||
let b = char::from_u32(n).expect("invalid char in string");
|
|
||||||
|
|
||||||
replacement_map.insert(b, repl.to_string());
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
panic!(
|
|
||||||
"mapping data broken, could not parse char {} with error {}",
|
|
||||||
chr, e
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
replacement_map
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn reduce_to_ascii(input: String) -> String {
|
|
||||||
if input.is_ascii() {
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut output = String::with_capacity(input.len());
|
|
||||||
for c in input.chars() {
|
|
||||||
if c.is_ascii() {
|
|
||||||
output.push(c);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(replacement) = MAPPINGS.get(&c) {
|
|
||||||
output.push_str(replacement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
output
|
|
||||||
}
|
|
|
@ -1,4 +1,3 @@
|
||||||
pub mod ascii_reduce;
|
|
||||||
pub mod ffprobe;
|
pub mod ffprobe;
|
||||||
pub mod format_detection;
|
pub mod format_detection;
|
||||||
#[cfg(feature = "replaygain")]
|
#[cfg(feature = "replaygain")]
|
||||||
|
|
Loading…
Reference in a new issue