diff --git a/Cargo.lock b/Cargo.lock index 30383e58e..413670df6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,18 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "0.7.20" @@ -1005,6 +1017,15 @@ dependencies = [ "libc", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "cpufeatures" version = "0.2.5" @@ -1247,6 +1268,12 @@ dependencies = [ "syn 1.0.107", ] +[[package]] +name = "dary_heap" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" + [[package]] name = "data-encoding" version = "2.4.0" @@ -2234,7 +2261,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] @@ -2243,7 +2270,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.6", ] [[package]] @@ -2588,15 +2624,6 @@ dependencies = [ "cfb", ] -[[package]] -name = "inflate" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" -dependencies = [ - "adler32", -] - [[package]] name = "inotify" version = "0.9.6" @@ -2898,6 +2925,30 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "libflate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7d5654ae1795afc7ff76f4365c2c8791b0feb18e8996a96adad8ffd7c3b2bf" +dependencies = [ + "adler32", + "core2", + "crc32fast", + "dary_heap", + "libflate_lz77", +] + +[[package]] +name = "libflate_lz77" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5f52fb8c451576ec6b79d3f4deb327398bc05bbdbd99021a6e77a4c855d524" +dependencies = [ + "core2", + "hashbrown 0.13.2", + "rle-decode-fast", +] + [[package]] name = "libloading" version = "0.7.4" @@ -3152,7 +3203,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e52eb6380b6d2a10eb3434aec0885374490f5b82c8aaf5cd487a183c98be834" dependencies = [ - "ahash", + "ahash 0.7.6", "metrics-macros", ] @@ -3162,7 +3213,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "142c53885123b68d94108295a09d4afe1a1388ed95b54d5dacd9a454753030f2" dependencies = [ - "ahash", + "ahash 0.7.6", "metrics-macros", ] @@ -3909,8 +3960,7 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" [[package]] name = "pdf" version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e375ec076445f61d4dbc4636e9e788f841d279c65d6fea8a3875caddd4f2dd82" +source = "git+https://github.com/pdf-rs/pdf?rev=3bc9e636d31b1846e51b58c7429914e640866f53#3bc9e636d31b1846e51b58c7429914e640866f53" dependencies = [ "aes", "bitflags 1.3.2", @@ -3919,10 +3969,11 @@ dependencies = [ "deflate", "fax", "globalcache", - "inflate", + "indexmap 1.9.2", "istring", "itertools 0.10.5", "jpeg-decoder", + "libflate", "log", "md5", "once_cell", @@ -3936,8 +3987,7 @@ dependencies = [ [[package]] name = "pdf_derive" version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4007262775d0798de87b15cbc64cf1aed5f7ee87eec847e297b69d8ed4b4f8" +source = "git+https://github.com/pdf-rs/pdf?rev=3bc9e636d31b1846e51b58c7429914e640866f53#3bc9e636d31b1846e51b58c7429914e640866f53" dependencies = [ "proc-macro2", "quote", @@ -4919,6 +4969,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "rle-decode-fast" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3582f63211428f83597b51b2ddb88e2a91a9d52d12831f9d08f5e624e8977422" + [[package]] name = "rusqlite" version = "0.25.4" @@ -7604,6 +7660,26 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" +[[package]] +name = "zerocopy" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.31", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/core/Cargo.toml b/core/Cargo.toml index 2f873cc4f..2359e4448 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -38,7 +38,8 @@ zip = "0.5.13" epub = "1.2.4" unrar = { git = "https://github.com/stumpapp/unrar.rs", branch = "feature/typestate" } # unrar = { version = "0.5.1" } -pdf = "0.8.1" +# pdf = "0.8.1" +pdf = { git = "https://github.com/pdf-rs/pdf", rev = "3bc9e636d31b1846e51b58c7429914e640866f53" } # TODO: revert back to crates.io once fix(es) release pdfium-render = "0.8.9" data-encoding = "2.4.0" ring = "0.16.20" diff --git a/core/src/db/entity/metadata.rs b/core/src/db/entity/metadata.rs index 369d83fdc..3c274b3a7 100644 --- a/core/src/db/entity/metadata.rs +++ b/core/src/db/entity/metadata.rs @@ -1,6 +1,9 @@ use std::collections::HashMap; -use pdf::primitive::Dictionary; +use pdf::{ + object::InfoDict, + primitive::{Dictionary, PdfString}, +}; use regex::Regex; use serde::{Deserialize, Deserializer, Serialize}; use specta::Type; @@ -442,6 +445,38 @@ impl From for MediaMetadata { } } +fn pdf_string_to_string(pdf_string: PdfString) -> Option { + pdf_string.to_string().map_or_else( + |error| { + tracing::error!(error = ?error, "Failed to convert PdfString to String"); + None + }, + |str| Some(str.trim().to_owned()), + ) +} + +impl From for MediaMetadata { + fn from(dict: InfoDict) -> Self { + MediaMetadata { + title: dict.title.map(pdf_string_to_string).flatten(), + genre: dict + .subject + .map(pdf_string_to_string) + .flatten() + .map(|v| vec![v]), + year: dict.creation_date.as_ref().map(|date| date.year as i32), + month: dict.creation_date.as_ref().map(|date| date.month as i32), + day: dict.creation_date.as_ref().map(|date| date.day as i32), + writers: dict + .author + .map(pdf_string_to_string) + .flatten() + .map(|v| vec![v]), + ..Default::default() + } + } +} + impl From for SeriesMetadata { fn from(metadata: series_metadata::Data) -> Self { SeriesMetadata {