Merge branch 'master' into quiet-mode
* master: Read partially broken files Version bump Update id3 crate to 0.6.x
This commit is contained in:
commit
ccae539eec
182
Cargo.lock
generated
182
Cargo.lock
generated
@ -12,6 +12,12 @@ version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.0.1"
|
||||
@ -26,21 +32,15 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.4.1"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41aa2ec95ca3b5c54cf73c91acf06d24f4495d5f1b1c12506ae3483d646177ac"
|
||||
checksum = "5a4bad0c5981acc24bc09e532f35160f952e35422603f0563cd7a73c2c2e65a0"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.3.4"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||
checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
@ -67,9 +67,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||
|
||||
[[package]]
|
||||
name = "const_fn"
|
||||
version = "0.4.4"
|
||||
version = "0.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
|
||||
checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6"
|
||||
|
||||
[[package]]
|
||||
name = "crc32fast"
|
||||
@ -77,7 +77,7 @@ version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -86,7 +86,7 @@ version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
@ -96,7 +96,7 @@ version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
]
|
||||
@ -107,7 +107,7 @@ version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"const_fn",
|
||||
"crossbeam-utils",
|
||||
"lazy_static",
|
||||
@ -122,7 +122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
@ -142,77 +142,13 @@ version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "encoding"
|
||||
version = "0.2.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
|
||||
dependencies = [
|
||||
"encoding-index-japanese",
|
||||
"encoding-index-korean",
|
||||
"encoding-index-simpchinese",
|
||||
"encoding-index-singlebyte",
|
||||
"encoding-index-tradchinese",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding-index-japanese"
|
||||
version = "1.20141219.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
|
||||
dependencies = [
|
||||
"encoding_index_tests",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding-index-korean"
|
||||
version = "1.20141219.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"
|
||||
dependencies = [
|
||||
"encoding_index_tests",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding-index-simpchinese"
|
||||
version = "1.20141219.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7"
|
||||
dependencies = [
|
||||
"encoding_index_tests",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding-index-singlebyte"
|
||||
version = "1.20141219.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a"
|
||||
dependencies = [
|
||||
"encoding_index_tests",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding-index-tradchinese"
|
||||
version = "1.20141219.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
|
||||
dependencies = [
|
||||
"encoding_index_tests",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding_index_tests"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
version = "1.0.19"
|
||||
version = "1.0.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7411863d55df97a419aa64cb4d2f167103ea9d767e2c54a1868b7ac3f6b47129"
|
||||
checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"crc32fast",
|
||||
"libc",
|
||||
"miniz_oxide 0.4.3",
|
||||
@ -220,11 +156,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.1.16"
|
||||
version = "0.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
|
||||
checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi",
|
||||
]
|
||||
@ -250,30 +186,29 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.17"
|
||||
version = "0.1.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
|
||||
checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id3"
|
||||
version = "0.5.1"
|
||||
version = "0.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02c11bb50ce1568516aefbe4b6564c3feaf15a8e5ccbea90fa652012446ae9bf"
|
||||
checksum = "7757528cac50df8681481dc91fd0b0e4a9886f78db9b6579d3c181d1184c7d94"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"byteorder",
|
||||
"encoding",
|
||||
"flate2",
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id3-image"
|
||||
version = "0.1.5"
|
||||
version = "0.2.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id3",
|
||||
"image",
|
||||
"structopt",
|
||||
@ -282,9 +217,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "image"
|
||||
version = "0.23.12"
|
||||
version = "0.23.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ce04077ead78e39ae8610ad26216aed811996b043d47beed5090db674f9e9b5"
|
||||
checksum = "293f07a1875fa7e9c5897b51aa68b2d8ed8271b87e1a44cb64b9c3d98aabbc0d"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"byteorder",
|
||||
@ -301,11 +236,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "jpeg-decoder"
|
||||
version = "0.1.20"
|
||||
version = "0.1.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc797adac5f083b8ff0ca6f6294a999393d76e197c36488e2ef732c4715f6fa3"
|
||||
checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"rayon",
|
||||
]
|
||||
|
||||
@ -317,9 +251,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.81"
|
||||
version = "0.2.86"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
|
||||
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
|
||||
|
||||
[[package]]
|
||||
name = "memoffset"
|
||||
@ -453,20 +387,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.8"
|
||||
version = "1.0.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||
checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.7.3"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
|
||||
checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"libc",
|
||||
"rand_chacha",
|
||||
"rand_core",
|
||||
@ -475,9 +408,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand_chacha"
|
||||
version = "0.2.2"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
|
||||
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
|
||||
dependencies = [
|
||||
"ppv-lite86",
|
||||
"rand_core",
|
||||
@ -485,18 +418,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand_core"
|
||||
version = "0.5.1"
|
||||
version = "0.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
|
||||
checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rand_hc"
|
||||
version = "0.2.0"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
|
||||
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
|
||||
dependencies = [
|
||||
"rand_core",
|
||||
]
|
||||
@ -528,9 +461,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.57"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
|
||||
checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "remove_dir_all"
|
||||
@ -579,9 +515,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.57"
|
||||
version = "1.0.60"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6"
|
||||
checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -590,11 +526,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tempfile"
|
||||
version = "3.1.0"
|
||||
version = "3.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9"
|
||||
checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
|
||||
dependencies = [
|
||||
"cfg-if 0.1.10",
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"rand",
|
||||
"redox_syscall",
|
||||
@ -648,15 +584,15 @@ checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.9.0+wasi-snapshot-preview1"
|
||||
version = "0.10.2+wasi-snapshot-preview1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
|
||||
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
|
||||
|
||||
[[package]]
|
||||
name = "weezl"
|
||||
version = "0.1.3"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3e2bb9fc8309084dd7cd651336673844c1d47f8ef6d2091ec160b27f5c4aa277"
|
||||
checksum = "4a32b378380f4e9869b22f0b5177c68a5519f03b3454fde0b291455ddbae266c"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "id3-image"
|
||||
version = "0.1.5"
|
||||
version = "0.2.0"
|
||||
authors = ["Andrew Radev <andrey.radev@gmail.com>"]
|
||||
edition = "2018"
|
||||
description = "A tool to embed images into mp3 files"
|
||||
@ -15,9 +15,10 @@ categories = [ "command-line-utilities", "filesystem", "multimedia" ]
|
||||
travis-ci = { repository = "AndrewRadev/id3-image" }
|
||||
|
||||
[dependencies]
|
||||
id3 = "0.5.1"
|
||||
image = "0.23.12"
|
||||
anyhow = "1.0.38"
|
||||
id3 = "0.6.2"
|
||||
image = "0.23.13"
|
||||
structopt = { version = "0.3.21", default-features = false }
|
||||
|
||||
[dev-dependencies]
|
||||
tempfile = "3.1.0"
|
||||
tempfile = "3.2.0"
|
||||
|
40
src/lib.rs
40
src/lib.rs
@ -1,5 +1,6 @@
|
||||
use std::path::Path;
|
||||
use std::error::Error;
|
||||
|
||||
use anyhow::anyhow;
|
||||
|
||||
/// Embed the image from `image_filename` into `music_filename`, in-place. Any errors reading ID3
|
||||
/// tags from the music file or parsing the image get propagated upwards.
|
||||
@ -7,12 +8,10 @@ use std::error::Error;
|
||||
/// The image is encoded as a JPEG with a 90% quality setting, and embedded as a "Front cover".
|
||||
/// Tags get written as ID3v2.3.
|
||||
///
|
||||
pub fn embed_image(music_filename: &Path, image_filename: &Path) -> Result<(), Box<dyn Error>> {
|
||||
let mut tag = id3::Tag::read_from_path(&music_filename).
|
||||
map_err(|e| format!("Error reading music file {:?}: {}", music_filename, e))?;
|
||||
|
||||
pub fn embed_image(music_filename: &Path, image_filename: &Path) -> anyhow::Result<()> {
|
||||
let mut tag = read_tag(music_filename)?;
|
||||
let image = image::open(&image_filename).
|
||||
map_err(|e| format!("Error reading image {:?}: {}", image_filename, e))?;
|
||||
map_err(|e| anyhow!("Error reading image {:?}: {}", image_filename, e))?;
|
||||
|
||||
let mut encoded_image_bytes = Vec::new();
|
||||
// Unwrap: Writing to a Vec should always succeed;
|
||||
@ -26,7 +25,7 @@ pub fn embed_image(music_filename: &Path, image_filename: &Path) -> Result<(), B
|
||||
});
|
||||
|
||||
tag.write_to_path(music_filename, id3::Version::Id3v23).
|
||||
map_err(|e| format!("Error writing image to music file {:?}: {}", music_filename, e))?;
|
||||
map_err(|e| anyhow!("Error writing image to music file {:?}: {}", music_filename, e))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@ -37,24 +36,22 @@ pub fn embed_image(music_filename: &Path, image_filename: &Path) -> Result<(), B
|
||||
/// Any errors from parsing id3 tags will be propagated. The function will also return an error if
|
||||
/// there's no embedded images in the mp3 file.
|
||||
///
|
||||
pub fn extract_first_image(music_filename: &Path, image_filename: &Path) -> Result<(), Box<dyn Error>> {
|
||||
let tag = id3::Tag::read_from_path(&music_filename).
|
||||
map_err(|e| format!("Error reading music file {:?}: {}", music_filename, e))?;
|
||||
|
||||
pub fn extract_first_image(music_filename: &Path, image_filename: &Path) -> anyhow::Result<()> {
|
||||
let tag = read_tag(music_filename)?;
|
||||
let first_picture = tag.pictures().next();
|
||||
|
||||
if let Some(p) = first_picture {
|
||||
match image::load_from_memory(&p.data) {
|
||||
Ok(image) => {
|
||||
image.save(&image_filename).
|
||||
map_err(|e| format!("Couldn't write image file {:?}: {}", image_filename, e))?;
|
||||
map_err(|e| anyhow!("Couldn't write image file {:?}: {}", image_filename, e))?;
|
||||
},
|
||||
Err(e) => return Err(format!("Couldn't load image: {}", e).into()),
|
||||
Err(e) => return Err(anyhow!("Couldn't load image: {}", e)),
|
||||
};
|
||||
|
||||
Ok(())
|
||||
} else {
|
||||
Err("No image found in music file".into())
|
||||
Err(anyhow!("No image found in music file"))
|
||||
}
|
||||
}
|
||||
|
||||
@ -63,14 +60,19 @@ pub fn extract_first_image(music_filename: &Path, image_filename: &Path) -> Resu
|
||||
///
|
||||
/// If the mp3 file's ID3 tags can't be parsed, the error will be propagated upwards.
|
||||
///
|
||||
pub fn remove_images(music_filename: &Path) -> Result<(), Box<dyn Error>> {
|
||||
let mut tag = id3::Tag::read_from_path(&music_filename).
|
||||
map_err(|e| format!("Error reading music file {:?}: {}", music_filename, e))?;
|
||||
|
||||
pub fn remove_images(music_filename: &Path) -> anyhow::Result<()> {
|
||||
let mut tag = read_tag(music_filename)?;
|
||||
tag.remove("APIC");
|
||||
|
||||
tag.write_to_path(music_filename, id3::Version::Id3v23).
|
||||
map_err(|e| format!("Error updating music file {:?}: {}", music_filename, e))?;
|
||||
map_err(|e| anyhow!("Error updating music file {:?}: {}", music_filename, e))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn read_tag(path: &Path) -> anyhow::Result<id3::Tag> {
|
||||
id3::Tag::read_from_path(&path).or_else(|e| {
|
||||
eprintln!("Warning: file metadata is corrupted, trying to read partial tag: {}", path.display());
|
||||
e.partial_tag.clone().ok_or_else(|| anyhow!("Error reading music file {:?}: {}", path, e))
|
||||
})
|
||||
}
|
||||
|
BIN
tests/fixtures/attempt_1_broken.mp3
vendored
Normal file
BIN
tests/fixtures/attempt_1_broken.mp3
vendored
Normal file
Binary file not shown.
BIN
tests/fixtures/attempt_1_no_image.mp3
vendored
BIN
tests/fixtures/attempt_1_no_image.mp3
vendored
Binary file not shown.
@ -75,6 +75,17 @@ fn test_successful_jpeg_image_embedding() {
|
||||
assert!(tag.pictures().count() > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_successful_jpeg_image_embedding_with_a_broken_file() {
|
||||
let song = Fixture::copy("attempt_1_broken.mp3");
|
||||
let image = Fixture::copy("attempt_1.jpg");
|
||||
|
||||
embed_image(&song, &image).unwrap();
|
||||
|
||||
let tag = read_tag(&song);
|
||||
assert!(tag.pictures().count() > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_successful_png_image_embedding() {
|
||||
let song = Fixture::copy("attempt_1_no_image.mp3");
|
||||
@ -122,6 +133,22 @@ fn test_removing_and_adding_an_image() {
|
||||
assert!(tag.pictures().count() > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_removing_and_adding_an_image_to_a_broken_file() {
|
||||
let song = Fixture::copy("attempt_1_broken.mp3");
|
||||
let image = Fixture::copy("attempt_1.jpg");
|
||||
|
||||
remove_images(&song).unwrap();
|
||||
|
||||
let tag = read_tag(&song);
|
||||
assert!(tag.pictures().count() == 0);
|
||||
|
||||
embed_image(&song, &image).unwrap();
|
||||
|
||||
let tag = read_tag(&song);
|
||||
assert!(tag.pictures().count() > 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extracting_a_jpg_image() {
|
||||
let song = Fixture::copy("attempt_1.mp3");
|
||||
@ -136,6 +163,16 @@ fn test_extracting_a_jpg_image() {
|
||||
assert!(image.exists());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extracting_a_jpg_image_from_a_broken_file() {
|
||||
let song = Fixture::copy("attempt_1_broken.mp3");
|
||||
let image = Fixture::blank("attempt_1.jpg");
|
||||
|
||||
extract_first_image(&song, &image).unwrap();
|
||||
|
||||
assert!(image.exists());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_extracting_a_png_image() {
|
||||
let song = Fixture::copy("attempt_1.mp3");
|
||||
|
Loading…
Reference in New Issue
Block a user