diff --git a/Cargo.lock b/Cargo.lock index 5a636c5..7f74539 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -47,6 +53,12 @@ version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arc-swap" version = "1.7.1" @@ -56,6 +68,23 @@ dependencies = [ "serde", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "async-stream" version = "0.3.6" @@ -101,6 +130,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + [[package]] name = "axum" version = "0.7.9" @@ -210,6 +262,12 @@ dependencies = [ "which", ] +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -222,6 +280,12 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block-buffer" version = "0.10.4" @@ -240,6 +304,12 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -258,6 +328,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.0" @@ -273,6 +349,8 @@ version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ + "jobserver", + "libc", "shlex", ] @@ -285,6 +363,16 @@ dependencies = [ "nom", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -317,6 +405,12 @@ dependencies = [ "libloading", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "console-api" version = "0.8.1" @@ -411,12 +505,37 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -584,6 +703,21 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "extended" version = "0.1.0" @@ -596,6 +730,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "ff" version = "0.13.0" @@ -784,6 +927,16 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.31.1" @@ -826,6 +979,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1205,6 +1368,45 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "indexmap" version = "1.9.3" @@ -1225,6 +1427,17 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "inventory" version = "0.3.19" @@ -1240,6 +1453,15 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -1255,6 +1477,21 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.77" @@ -1277,12 +1514,28 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.6" @@ -1321,6 +1574,15 @@ version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "mania" version = "0.0.1" @@ -1339,11 +1601,13 @@ dependencies = [ "generic-array 1.2.0", "glob", "hex", + "image", "inventory", "log", "mania-codec", "mania-macros", "md-5", + "noise", "num_enum", "once_cell", "p256", @@ -1419,6 +1683,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "md-5" version = "0.11.0-pre.4" @@ -1454,6 +1728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1490,12 +1765,29 @@ dependencies = [ "tempfile", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "no-std-net" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" +[[package]] +name = "noise" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da45c8333f2e152fc665d78a380be060eb84fad8ca4c9f7ac8ca29216cff0cc" +dependencies = [ + "num-traits", + "rand", + "rand_xorshift", +] + [[package]] name = "nom" version = "7.1.3" @@ -1506,6 +1798,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1516,6 +1814,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -1531,6 +1839,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -1540,6 +1859,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1670,6 +2000,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -1833,6 +2169,19 @@ dependencies = [ "pnet_macros_support", ] +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1894,6 +2243,25 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "prost" version = "0.13.5" @@ -1911,7 +2279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" dependencies = [ "heck", - "itertools", + "itertools 0.13.0", "log", "multimap", "once_cell", @@ -1931,7 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools", + "itertools 0.13.0", "proc-macro2", "quote", "syn", @@ -1946,6 +2314,21 @@ dependencies = [ "prost", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.37.2" @@ -1995,6 +2378,85 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "realfft" version = "3.4.0" @@ -2117,6 +2579,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "ring" version = "0.17.8" @@ -2319,6 +2787,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2400,6 +2877,21 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -2710,6 +3202,25 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.15.0" @@ -2774,6 +3285,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.37" @@ -2888,11 +3410,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -2901,6 +3438,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap 2.7.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3122,6 +3661,17 @@ dependencies = [ "serde", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -3134,6 +3684,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -3245,6 +3801,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "which" version = "4.4.2" @@ -3523,3 +4085,27 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] diff --git a/mania/Cargo.toml b/mania/Cargo.toml index cb6a2dc..58a7e99 100644 --- a/mania/Cargo.toml +++ b/mania/Cargo.toml @@ -42,6 +42,8 @@ regex = "1.11.1" tokio-util = "0.7.13" sha1 = "0.11.0-pre.4" digest = "0.11.0-pre.9" +image = "0.25.5" +noise = "0.9.0" [build-dependencies] prost-build = "0.13.4" diff --git a/mania/src/core/operation/highway_op.rs b/mania/src/core/operation/highway_op.rs index e694a51..efdfb21 100644 --- a/mania/src/core/operation/highway_op.rs +++ b/mania/src/core/operation/highway_op.rs @@ -322,7 +322,9 @@ impl BusinessHandle { video: &mut VideoEntity, ) -> ManiaResult<()> { self.prepare_highway().await?; - let (vs, is) = video.resolve_stream().await; + let (vs, is) = video.resolve_stream().await.map_err(|e| { + ManiaError::GenericError(Cow::from(format!("Resolve stream error: {:?}", e))) + })?; let vs = vs.ok_or(ManiaError::GenericError(Cow::from("No video stream found")))?; let is = is.ok_or(ManiaError::GenericError(Cow::from("No image stream found")))?; let (file_md5, file_sha1, file_stream_sha1, thumb_md5, thumb_sha1) = @@ -466,7 +468,9 @@ impl BusinessHandle { video: &mut VideoEntity, ) -> ManiaResult<()> { self.prepare_highway().await?; - let (vs, is) = video.resolve_stream().await; + let (vs, is) = video.resolve_stream().await.map_err(|e| { + ManiaError::GenericError(Cow::from(format!("Resolve stream error: {:?}", e))) + })?; let vs = vs.ok_or(ManiaError::GenericError(Cow::from("No video stream found")))?; let is = is.ok_or(ManiaError::GenericError(Cow::from("No image stream found")))?; let (file_md5, file_sha1, file_stream_sha1, thumb_md5, thumb_sha1) = diff --git a/mania/src/message/entity/video.rs b/mania/src/message/entity/video.rs index c3ef8d3..0992fc3 100644 --- a/mania/src/message/entity/video.rs +++ b/mania/src/message/entity/video.rs @@ -1,178 +1,11 @@ use super::prelude::*; use crate::core::highway::AsyncPureStream; use crate::core::protos::service::oidb::{IndexNode, MsgInfo}; +use crate::utility::image_gen::gen_thumbnail; +use image::ImageResult; use std::io::Cursor; use std::sync::Arc; -const DEFAULT_THUMB: [u8; 2643] = [ - 0x1F, 0x8B, 0x08, 0x08, 0x0B, 0x68, 0xA6, 0x67, 0x02, 0xFF, 0x6F, 0x75, 0x74, 0x2E, 0x62, 0x69, - 0x6E, 0x00, 0x9D, 0x56, 0x5D, 0x70, 0x13, 0xD7, 0x15, 0x3E, 0x77, 0x77, 0xB5, 0x5E, 0xAF, 0x24, - 0xB3, 0xB6, 0x17, 0x23, 0x04, 0x01, 0xCB, 0x60, 0x77, 0xDD, 0xC4, 0x54, 0xC2, 0x0B, 0x38, 0x40, - 0xE9, 0x5A, 0xC2, 0x60, 0x3C, 0xF2, 0x54, 0xE0, 0x94, 0x06, 0x0D, 0x0F, 0xB6, 0x08, 0x8E, 0xE4, - 0xB6, 0x0C, 0x7F, 0x49, 0x48, 0xA6, 0x9D, 0xEC, 0x1A, 0xDB, 0x31, 0x6E, 0xF2, 0x40, 0x71, 0x5B, - 0xA1, 0xBE, 0x2C, 0x2E, 0x55, 0xD3, 0x4E, 0x5E, 0x28, 0xA6, 0x09, 0x7D, 0x72, 0xC0, 0x26, 0x4D, - 0x67, 0x3C, 0xA3, 0x60, 0x27, 0x05, 0x5A, 0x66, 0x80, 0xB6, 0xB4, 0xA5, 0x7D, 0x80, 0xA6, 0xFF, - 0x0F, 0x75, 0xCF, 0xB9, 0x2B, 0xD3, 0xCE, 0xF4, 0xA5, 0xAD, 0x76, 0x46, 0x24, 0x2B, 0xDF, 0xEF, - 0x9E, 0xF3, 0x9D, 0xEF, 0x7C, 0xE7, 0x2C, 0xDC, 0x58, 0xB8, 0x03, 0x5A, 0xD7, 0x8E, 0x5D, 0x3B, - 0x80, 0x31, 0x00, 0x86, 0x0F, 0x2C, 0xFC, 0x03, 0x96, 0xED, 0x3C, 0x78, 0xE8, 0xE0, 0xD1, 0xBE, - 0xE3, 0x07, 0x9F, 0xAB, 0xCF, 0xBC, 0x5C, 0xDF, 0x73, 0x28, 0x77, 0xB8, 0xEF, 0xD8, 0xF1, 0x83, - 0x0B, 0x3F, 0x83, 0x21, 0x50, 0x2B, 0x2A, 0x94, 0x0A, 0x59, 0x55, 0x14, 0xC5, 0xAF, 0xAA, 0xFE, - 0xAA, 0x90, 0x56, 0x15, 0x0C, 0x56, 0x3D, 0xB1, 0xB4, 0xAE, 0x3A, 0xB4, 0x66, 0x75, 0xE3, 0xDA, - 0x86, 0xD5, 0x0D, 0x91, 0xA6, 0x27, 0x37, 0x7D, 0xAA, 0xA9, 0xD9, 0x6C, 0x8E, 0x34, 0x44, 0xDB, - 0x63, 0xE6, 0xD3, 0x5B, 0xB6, 0x6D, 0xDB, 0xD6, 0xB8, 0x6E, 0xFB, 0xAE, 0xC4, 0xD6, 0xCE, 0x4D, - 0x9F, 0xDE, 0xB6, 0x85, 0xA9, 0x7E, 0x7F, 0x55, 0xB0, 0x6A, 0xA5, 0xA6, 0xAD, 0xDC, 0x62, 0x34, - 0x18, 0x5B, 0xFE, 0xE7, 0xCF, 0xC2, 0x14, 0x54, 0x2B, 0xEC, 0x55, 0x78, 0x28, 0xB2, 0x6A, 0x10, - 0xAA, 0x99, 0x58, 0xCD, 0x16, 0xA6, 0xD9, 0x04, 0x06, 0xEF, 0x63, 0xFC, 0x03, 0xE5, 0x0F, 0x13, - 0x44, 0xC9, 0x27, 0x57, 0x28, 0x95, 0xAA, 0x5F, 0x03, 0x81, 0x89, 0xA2, 0x20, 0x89, 0x3E, 0x9F, - 0x24, 0xE1, 0x2F, 0x5F, 0xC1, 0xDF, 0x40, 0xAA, 0xF6, 0xD5, 0x44, 0x62, 0xED, 0x72, 0xED, 0xEE, - 0xBE, 0x8A, 0x86, 0x23, 0xFA, 0x7A, 0xE7, 0xF4, 0x39, 0x65, 0x4D, 0xFC, 0xC2, 0xBB, 0x4B, 0xF7, - 0x7C, 0xF0, 0x70, 0x6D, 0x6B, 0xE6, 0xE8, 0x60, 0xA5, 0x5A, 0xB7, 0x2C, 0xB4, 0x3C, 0xDC, 0xD8, - 0xF4, 0x09, 0xA3, 0xF9, 0x93, 0xE6, 0x86, 0x8D, 0x9B, 0xDA, 0x9E, 0xDE, 0x9C, 0xD8, 0xDE, 0xB1, - 0x63, 0x67, 0xE7, 0xAE, 0xAE, 0x9E, 0x67, 0x3E, 0xB7, 0xF7, 0xF3, 0xCF, 0xEE, 0x4B, 0x1F, 0x78, - 0xEE, 0x60, 0xFF, 0xF3, 0xD9, 0xDC, 0xC0, 0xB1, 0xE3, 0x2F, 0xBC, 0xF8, 0xD2, 0x89, 0x97, 0x5F, - 0x39, 0x39, 0x34, 0x3C, 0xF2, 0xDA, 0xE8, 0xA9, 0xB1, 0xAF, 0x9D, 0x19, 0xFF, 0xFA, 0x37, 0xBE, - 0x99, 0x3F, 0x5B, 0x98, 0xF8, 0xF6, 0xF9, 0xEF, 0x14, 0xBF, 0xFB, 0xE6, 0xF7, 0xBE, 0xFF, 0x83, - 0x8B, 0x93, 0x97, 0x7E, 0xF8, 0xF6, 0x3B, 0x97, 0x7F, 0x74, 0xE5, 0xEA, 0xF4, 0xCC, 0xB5, 0xF7, - 0x7E, 0xFC, 0xFE, 0x4F, 0xAE, 0xCF, 0xCD, 0x7F, 0xF8, 0xD1, 0x4F, 0x6F, 0xDC, 0xBC, 0x75, 0xF7, - 0xDE, 0x2F, 0x7E, 0xF9, 0xAB, 0xFB, 0xBF, 0xFE, 0xCD, 0x6F, 0x1F, 0x3C, 0xFA, 0xC3, 0xC7, 0x7F, - 0xFC, 0xD3, 0x9F, 0xFF, 0xF2, 0xD7, 0xBF, 0xFD, 0x9D, 0x81, 0xC8, 0x16, 0x3F, 0xFF, 0x91, 0x0F, - 0x26, 0xCE, 0x04, 0x49, 0x12, 0xA5, 0x0A, 0xCA, 0x87, 0x09, 0x2F, 0xD1, 0x8F, 0xD5, 0x92, 0x2F, - 0x12, 0x93, 0x6B, 0xDA, 0x77, 0x57, 0xF4, 0x1D, 0xA9, 0x6D, 0x58, 0xEF, 0x28, 0x7A, 0xFC, 0xF4, - 0xB9, 0x0B, 0xEF, 0x56, 0xAE, 0x69, 0xDD, 0xF3, 0x70, 0x69, 0xE6, 0xE8, 0x07, 0x6A, 0xDD, 0x5A, - 0xF3, 0x6E, 0xE3, 0x23, 0x4A, 0x89, 0x67, 0xF4, 0xDF, 0x25, 0x34, 0xF8, 0x7F, 0x65, 0xF4, 0x38, - 0xA1, 0xC7, 0xF9, 0x2C, 0xDC, 0x82, 0x80, 0xC8, 0xB0, 0x60, 0x62, 0x35, 0x7C, 0x06, 0xEE, 0xB1, - 0xB7, 0xDE, 0x78, 0x4F, 0x76, 0x2B, 0x44, 0xCB, 0x5F, 0x80, 0xD6, 0x64, 0x7B, 0x01, 0x92, 0x25, - 0x71, 0x97, 0xAB, 0xDC, 0x28, 0x49, 0x4F, 0x65, 0x97, 0xD7, 0x86, 0xE1, 0xF5, 0x52, 0xAC, 0x19, - 0x52, 0x42, 0x89, 0x25, 0x7D, 0xAE, 0x60, 0xAB, 0x52, 0x63, 0xB4, 0xC6, 0xA9, 0xB4, 0x2A, 0x93, - 0x82, 0x53, 0xA5, 0xC3, 0x5D, 0x6B, 0xF1, 0xEB, 0x91, 0x75, 0x8A, 0xBD, 0x69, 0xEA, 0x61, 0x38, - 0x3C, 0x00, 0xA9, 0xAC, 0x76, 0xB9, 0xC8, 0x0A, 0x10, 0x9F, 0x87, 0x2B, 0xF3, 0x6C, 0xC5, 0x06, - 0xD8, 0x7E, 0xCD, 0x0E, 0x75, 0x8B, 0xA1, 0x2C, 0xE3, 0x48, 0xF5, 0xC5, 0x58, 0x56, 0x4B, 0xB1, - 0xA4, 0xE4, 0x4A, 0xA6, 0xD2, 0x05, 0x5D, 0xBD, 0x3A, 0x3C, 0x90, 0x0C, 0xB7, 0x42, 0x85, 0xC3, - 0x6E, 0xC5, 0x18, 0x9C, 0x70, 0x13, 0x17, 0xF7, 0x15, 0x46, 0x72, 0xF6, 0x65, 0xD7, 0x77, 0xDB, - 0x1A, 0xBE, 0x6D, 0xC9, 0x0F, 0x7A, 0xCD, 0x4B, 0x10, 0xBD, 0x04, 0xB1, 0x37, 0x20, 0x5A, 0x80, - 0x3E, 0x3C, 0x06, 0xE3, 0x8A, 0x01, 0x2E, 0x05, 0x54, 0x67, 0xD7, 0xE4, 0x31, 0x1C, 0x6B, 0xC8, - 0x15, 0xF2, 0x7E, 0x4B, 0x35, 0xB4, 0xBB, 0xF8, 0xC5, 0xEE, 0xD9, 0xAB, 0x0C, 0xED, 0x91, 0xE5, - 0xEB, 0x1F, 0x68, 0xCA, 0xD9, 0xFD, 0xF6, 0x32, 0x13, 0x0E, 0xB9, 0xD2, 0x6D, 0x4B, 0x49, 0xE7, - 0x83, 0x4D, 0x18, 0x8A, 0x10, 0xCE, 0x32, 0x83, 0x05, 0x85, 0x1A, 0xBB, 0x06, 0x01, 0x54, 0x48, - 0x43, 0xB3, 0x9D, 0x12, 0xF0, 0xA9, 0x5F, 0x44, 0x99, 0xB0, 0x57, 0xF9, 0xA0, 0x4D, 0x95, 0xB6, - 0xAA, 0x18, 0x8F, 0x7C, 0xFF, 0xE2, 0x86, 0x5A, 0x33, 0x90, 0x9C, 0x83, 0x59, 0x68, 0xCA, 0xE2, - 0x57, 0xC4, 0x54, 0x72, 0x26, 0x8C, 0xE4, 0x83, 0x6E, 0x1C, 0x0F, 0x45, 0x30, 0x14, 0x0A, 0xA4, - 0x2E, 0xEF, 0x83, 0x46, 0x7C, 0x74, 0x85, 0xD0, 0x4A, 0x91, 0xA9, 0x94, 0x68, 0xBB, 0x15, 0x8E, - 0x55, 0x55, 0xA6, 0x2A, 0x30, 0xDB, 0x3F, 0xB0, 0xC9, 0xBC, 0xD6, 0x08, 0xCB, 0x5D, 0x69, 0x96, - 0xBE, 0xF0, 0x89, 0x87, 0x7B, 0x1B, 0x29, 0x0C, 0xA4, 0xD4, 0x07, 0x2D, 0xA0, 0xC3, 0xE4, 0x54, - 0x17, 0x20, 0x5E, 0xBB, 0x25, 0x37, 0xDB, 0x19, 0x47, 0xA5, 0x20, 0xE0, 0x84, 0x0E, 0x0F, 0x0D, - 0xED, 0x8E, 0xC1, 0x3A, 0xA0, 0x2D, 0x25, 0x35, 0x5D, 0xDC, 0x88, 0x07, 0xF8, 0x5D, 0x3A, 0x8C, - 0x43, 0x2A, 0x12, 0x8C, 0xAE, 0xA0, 0xF4, 0xCB, 0x10, 0x2D, 0x51, 0x15, 0x01, 0x66, 0x20, 0xE4, - 0xB6, 0x8F, 0x41, 0xCC, 0xF2, 0x8F, 0x65, 0x74, 0x24, 0x56, 0x57, 0x10, 0x04, 0x11, 0xE6, 0x61, - 0x12, 0x26, 0x59, 0xB0, 0xFF, 0x8B, 0x18, 0x68, 0xB4, 0x06, 0x53, 0xE7, 0xB7, 0xC5, 0x7B, 0x58, - 0x91, 0x8E, 0x0B, 0x2A, 0xEC, 0x4F, 0x31, 0xCB, 0x17, 0x5D, 0xA6, 0xC3, 0x3B, 0xAE, 0xA8, 0x43, - 0xC6, 0x91, 0x11, 0x4B, 0x50, 0x7B, 0x0D, 0x37, 0x31, 0x83, 0x97, 0x8B, 0xC3, 0x74, 0x03, 0x3E, - 0x89, 0x7D, 0x85, 0x53, 0xD6, 0xB4, 0x2B, 0x15, 0x99, 0x45, 0xE7, 0x28, 0x20, 0x25, 0xAB, 0x8D, - 0xC3, 0xA4, 0x62, 0xB0, 0x23, 0x18, 0x87, 0x3E, 0x95, 0x6A, 0x86, 0xDF, 0xF7, 0xF0, 0x38, 0xE2, - 0x08, 0x39, 0x98, 0xE7, 0xA5, 0x59, 0x42, 0x3C, 0xF8, 0xFE, 0x85, 0x40, 0x42, 0xEA, 0xB3, 0xBC, - 0x9B, 0x51, 0x09, 0x99, 0x1A, 0x7B, 0x99, 0x8E, 0x08, 0x59, 0xAC, 0xED, 0x0C, 0x18, 0x18, 0x44, - 0x11, 0x79, 0xC4, 0x4A, 0x01, 0x92, 0x44, 0x08, 0x8F, 0x3C, 0xBD, 0xF9, 0xF9, 0xA3, 0x7D, 0xD4, - 0x3F, 0x91, 0x62, 0x1C, 0x43, 0xB0, 0xBD, 0x5C, 0x62, 0x49, 0x9E, 0xF4, 0x30, 0x29, 0x15, 0x52, - 0x08, 0xC4, 0x72, 0x36, 0x12, 0x04, 0x66, 0x09, 0x6B, 0x5B, 0x8C, 0x10, 0x7F, 0x22, 0xE5, 0x21, - 0x94, 0x50, 0xD0, 0x56, 0xF5, 0xDE, 0xFE, 0x73, 0x74, 0x39, 0x34, 0xF1, 0xF2, 0x7B, 0xA9, 0x04, - 0x7A, 0x34, 0xA2, 0x00, 0x23, 0x34, 0xB8, 0xC0, 0xD4, 0x5E, 0xB3, 0x14, 0x29, 0x62, 0x7E, 0x83, - 0x5E, 0x15, 0x5F, 0x1B, 0x93, 0xF9, 0xF9, 0xEB, 0x50, 0x94, 0x5E, 0x38, 0xEB, 0x62, 0x01, 0x98, - 0x75, 0x15, 0x0B, 0x81, 0x75, 0x2B, 0x57, 0x6E, 0x10, 0x6B, 0xA3, 0x13, 0xCF, 0xF8, 0x8C, 0x93, - 0x4A, 0x9A, 0x1C, 0x54, 0x5D, 0xAD, 0x39, 0x2D, 0x38, 0x4B, 0xB0, 0x0E, 0xA4, 0xF1, 0xB4, 0x4C, - 0xB5, 0x4E, 0x89, 0x4F, 0xB6, 0x5A, 0x3C, 0xD4, 0x18, 0xE6, 0x90, 0x79, 0xAC, 0xC0, 0x41, 0x7C, - 0x63, 0x84, 0xE8, 0x38, 0x15, 0x57, 0x43, 0xC9, 0x73, 0xBD, 0x9D, 0x2D, 0x46, 0xDA, 0xA9, 0x0C, - 0x9D, 0x93, 0x04, 0x42, 0x41, 0x8A, 0x35, 0xF6, 0x8A, 0x7D, 0x05, 0xEF, 0xB6, 0x1E, 0x46, 0x69, - 0xC6, 0x88, 0x2A, 0xEA, 0x09, 0xC4, 0x90, 0xE9, 0x75, 0x8A, 0xFA, 0x30, 0x37, 0x8A, 0xC7, 0xAF, - 0x64, 0xB5, 0xEB, 0x59, 0xAD, 0xDF, 0x86, 0xDC, 0xE8, 0xE9, 0x6E, 0xE8, 0x2C, 0xDA, 0xAB, 0x82, - 0xB0, 0x99, 0x5A, 0x63, 0x1C, 0x86, 0x4A, 0xC2, 0xDE, 0x7E, 0x07, 0x29, 0xC5, 0xB4, 0xA3, 0xDA, - 0x18, 0xE4, 0x5C, 0xB9, 0x44, 0x7C, 0x20, 0xC8, 0x01, 0x52, 0x93, 0x2B, 0x9A, 0xD0, 0x6F, 0x87, - 0xBB, 0x63, 0x98, 0x47, 0xB8, 0x5B, 0xC0, 0x06, 0x0A, 0x94, 0x84, 0x93, 0xD6, 0x12, 0xD9, 0x5E, - 0x55, 0xB4, 0xD7, 0xCA, 0x4E, 0x95, 0x9C, 0xF7, 0x93, 0x71, 0x08, 0xFD, 0x76, 0xDD, 0x45, 0x13, - 0x4F, 0xB0, 0xAC, 0xF6, 0xA0, 0x37, 0xE2, 0xCA, 0xD4, 0xAD, 0x19, 0xCC, 0x89, 0x74, 0x72, 0x85, - 0xB2, 0x7A, 0xDC, 0x3C, 0xD7, 0x73, 0x36, 0x46, 0xF3, 0x73, 0xAA, 0xEE, 0x15, 0x7B, 0x65, 0x10, - 0xB6, 0x86, 0xE1, 0x84, 0x09, 0x77, 0x72, 0xA3, 0xFB, 0x4B, 0x8C, 0x7B, 0xD0, 0xEF, 0x38, 0x35, - 0x75, 0x4E, 0x55, 0x11, 0xB2, 0xAC, 0x68, 0x87, 0x72, 0xF6, 0x55, 0xAB, 0x12, 0x2D, 0xCA, 0xBA, - 0x4A, 0xB1, 0x04, 0xBC, 0xBF, 0x12, 0x6A, 0xAD, 0x91, 0x33, 0x96, 0xD2, 0x1D, 0x0B, 0x70, 0x4B, - 0xE0, 0x0D, 0x22, 0x3A, 0xE4, 0x66, 0x55, 0xB3, 0x31, 0x32, 0x34, 0xEB, 0xA4, 0xC9, 0x5A, 0xFA, - 0x07, 0xB8, 0xA8, 0xD8, 0xFC, 0x94, 0xC1, 0x8A, 0xF9, 0x6A, 0xF4, 0x92, 0x92, 0x78, 0xCC, 0x92, - 0xA9, 0x93, 0x97, 0x7B, 0xA9, 0x91, 0x11, 0x68, 0x25, 0xB1, 0x3B, 0xC6, 0x45, 0x3C, 0x3E, 0x95, - 0xB6, 0xDA, 0xC2, 0x68, 0x63, 0x6C, 0x6A, 0x8E, 0xDD, 0x74, 0xE3, 0xF7, 0xF1, 0xBA, 0xFA, 0x59, - 0xF8, 0xEC, 0xBE, 0xC2, 0xB0, 0x40, 0x66, 0x91, 0xEE, 0x6D, 0x11, 0xC2, 0x39, 0x67, 0x45, 0x6A, - 0x7D, 0xAB, 0xC5, 0x2B, 0x0B, 0x67, 0x5D, 0x5F, 0x19, 0x8B, 0x8A, 0x18, 0x86, 0x44, 0x32, 0xD1, - 0x2D, 0x50, 0x8F, 0x62, 0x99, 0xED, 0xC3, 0x26, 0xB8, 0x1E, 0x8E, 0x43, 0x2F, 0x9E, 0x7D, 0x6B, - 0x56, 0xE0, 0x9E, 0xB3, 0x1B, 0x3D, 0x54, 0xE1, 0x30, 0x1B, 0x5D, 0x39, 0x4C, 0xFA, 0xC7, 0x78, - 0x31, 0x68, 0x6E, 0x27, 0xDA, 0x9C, 0x36, 0x87, 0xA2, 0x68, 0xA7, 0xCE, 0xC6, 0xBF, 0xDE, 0x4F, - 0x7C, 0x57, 0xC9, 0xC8, 0x07, 0x29, 0xBF, 0xEE, 0x0B, 0x65, 0xDD, 0xA4, 0x7B, 0x75, 0x25, 0x61, - 0x05, 0xCC, 0x6B, 0x98, 0x91, 0x42, 0x45, 0xEB, 0x01, 0xFE, 0xBE, 0xB5, 0x53, 0xC8, 0x0F, 0x71, - 0x9F, 0x9C, 0xD6, 0xC9, 0x29, 0x25, 0x6E, 0x50, 0x2B, 0xA9, 0x05, 0xA9, 0xC8, 0x69, 0x2F, 0x04, - 0x03, 0xB0, 0x2C, 0x98, 0xF1, 0x5C, 0xF2, 0x40, 0x37, 0x44, 0xC7, 0x20, 0x6E, 0x30, 0x6C, 0x38, - 0xDE, 0x09, 0x5E, 0x43, 0x1A, 0xAC, 0x79, 0xD4, 0xA0, 0x76, 0x18, 0xE2, 0xE7, 0x75, 0xAF, 0xFF, - 0x75, 0xE5, 0x6D, 0x64, 0x82, 0xF4, 0x4B, 0xD7, 0x91, 0x8B, 0xC3, 0x5C, 0x12, 0xBF, 0xF2, 0xAE, - 0x34, 0x13, 0x0D, 0x77, 0x80, 0x39, 0x06, 0x5D, 0x12, 0x99, 0x13, 0x75, 0x54, 0x32, 0x5E, 0xC2, - 0xF2, 0x63, 0x57, 0x50, 0x9F, 0x71, 0x93, 0x4F, 0x4B, 0x3A, 0x3B, 0x74, 0x71, 0x03, 0xD7, 0x95, - 0x50, 0xB6, 0xCC, 0x8D, 0xFC, 0x5F, 0x6C, 0xC3, 0xA1, 0x94, 0xD8, 0xE9, 0xCA, 0xA7, 0xAD, 0x91, - 0x12, 0xE3, 0x2E, 0xC2, 0x6F, 0x1F, 0xA4, 0xFA, 0x38, 0x8B, 0x2D, 0xD9, 0x6E, 0xD5, 0x7D, 0xBC, - 0xEF, 0x5B, 0x7E, 0x12, 0x67, 0x2F, 0x19, 0xE0, 0x08, 0x9F, 0x00, 0x3E, 0x1E, 0x4F, 0x75, 0x12, - 0xCF, 0x06, 0x1B, 0xEC, 0x70, 0x87, 0x50, 0x8B, 0xEE, 0x65, 0x07, 0x52, 0x6C, 0x6C, 0xD1, 0x14, - 0x86, 0x66, 0xEA, 0xF1, 0x1D, 0xDA, 0x00, 0x23, 0x0E, 0x84, 0x96, 0xFB, 0xEE, 0x0D, 0xA2, 0x5B, - 0x6A, 0xA9, 0x57, 0x51, 0xAA, 0x18, 0xFF, 0x2D, 0x9C, 0x02, 0xE3, 0xBC, 0x6B, 0x7B, 0xD8, 0xF9, - 0x72, 0x1C, 0x95, 0x63, 0x52, 0x88, 0x1B, 0x21, 0x87, 0xC2, 0xFF, 0x96, 0x66, 0xA0, 0xC9, 0xD0, - 0x78, 0xAA, 0xAA, 0x84, 0x5C, 0xB0, 0xE7, 0x37, 0xC8, 0x13, 0x27, 0x2D, 0x35, 0x08, 0x2D, 0x9C, - 0xB2, 0x04, 0xA6, 0x4C, 0x6C, 0x33, 0x72, 0xAA, 0xC9, 0x29, 0xA4, 0xF4, 0x3C, 0x86, 0x85, 0x38, - 0x18, 0x81, 0x4C, 0x07, 0x11, 0x2C, 0x4F, 0xEE, 0x86, 0xBE, 0x98, 0xB1, 0x6B, 0xE9, 0x7F, 0xE2, - 0x99, 0x3C, 0xFE, 0x6C, 0x08, 0x5F, 0x9E, 0x0F, 0xCB, 0x28, 0xB9, 0x92, 0x70, 0x1F, 0x8B, 0x5C, - 0x89, 0x85, 0x61, 0x14, 0x0F, 0x7A, 0x0D, 0xB1, 0x8E, 0xAE, 0x9E, 0xFC, 0x37, 0x20, 0x46, 0xF9, - 0xF0, 0x94, 0xEF, 0x79, 0x49, 0xE6, 0xD2, 0x58, 0x3E, 0x2D, 0x5F, 0x14, 0x32, 0xF6, 0xEA, 0xC2, - 0x49, 0x6B, 0x16, 0xDA, 0xC2, 0x12, 0x6A, 0x78, 0x7F, 0x29, 0xD2, 0x5A, 0x76, 0x48, 0x15, 0x76, - 0x5B, 0x6A, 0xB3, 0xFD, 0x00, 0x95, 0x57, 0xB6, 0x2A, 0x72, 0xCD, 0x30, 0x09, 0x7E, 0x82, 0xA6, - 0x97, 0x33, 0xC2, 0x51, 0x1B, 0x6C, 0x34, 0x00, 0xBC, 0x6A, 0xCF, 0x53, 0x06, 0x43, 0xBB, 0x71, - 0xCE, 0x0B, 0x24, 0xDB, 0xC6, 0x28, 0x25, 0xD7, 0x6C, 0x4F, 0x7A, 0xD3, 0x7E, 0x12, 0x16, 0xFD, - 0x12, 0xCB, 0x16, 0x71, 0x13, 0x59, 0xEC, 0xAE, 0x0E, 0xAC, 0x4E, 0x06, 0xCB, 0x26, 0x97, 0x53, - 0x1E, 0xD9, 0x63, 0x74, 0xC9, 0x38, 0x37, 0x50, 0x29, 0x24, 0x41, 0xC1, 0xA1, 0x7A, 0xA6, 0x65, - 0x4F, 0x03, 0x50, 0x16, 0x25, 0xB6, 0x5D, 0x01, 0xD5, 0xD2, 0x44, 0x8E, 0x2F, 0xDB, 0xB8, 0x3E, - 0xBC, 0x98, 0x0D, 0x71, 0xFB, 0xDD, 0x68, 0xAF, 0x39, 0x1F, 0xA3, 0xA6, 0xC5, 0x47, 0xA3, 0xA6, - 0x2A, 0x31, 0x6E, 0xAC, 0x6D, 0xA9, 0x58, 0x07, 0x9F, 0x1F, 0xDE, 0xF4, 0x3B, 0xEB, 0x26, 0x76, - 0xD1, 0x34, 0xE5, 0x63, 0x9E, 0xB6, 0x0F, 0xD3, 0xDE, 0x4F, 0x04, 0x8E, 0x50, 0x73, 0x37, 0xC2, - 0xCE, 0xCE, 0x3E, 0x3E, 0x2A, 0xC8, 0x51, 0xBB, 0x24, 0x6E, 0x93, 0x78, 0x91, 0x1E, 0xD8, 0xCD, - 0xDF, 0x96, 0x83, 0xEF, 0x46, 0x4B, 0x42, 0xF7, 0x4E, 0x92, 0xA5, 0xD0, 0x61, 0xF4, 0x44, 0x9B, - 0x37, 0x22, 0x7F, 0xD3, 0xD5, 0x51, 0x49, 0x1B, 0xC5, 0x3C, 0x3A, 0x88, 0x81, 0x54, 0xF5, 0x60, - 0x40, 0x7C, 0xF5, 0xC8, 0xD0, 0x08, 0x21, 0x87, 0xF1, 0x71, 0x8C, 0xA8, 0x56, 0xF2, 0x3A, 0x67, - 0x78, 0x56, 0x0C, 0x10, 0x48, 0xC0, 0xFB, 0x55, 0xCE, 0xC1, 0xE4, 0x18, 0x51, 0xEF, 0xC7, 0xA9, - 0x44, 0xFB, 0x4E, 0xAF, 0xEE, 0x71, 0xE7, 0x83, 0x75, 0xD9, 0xD0, 0x65, 0x6E, 0x3F, 0x8E, 0x4C, - 0xEB, 0x48, 0xB3, 0x3D, 0x62, 0xAF, 0xE0, 0x23, 0xA8, 0x0E, 0x0F, 0x47, 0x67, 0xF1, 0x77, 0xD6, - 0xEA, 0xB9, 0xD4, 0xAE, 0x3D, 0xA9, 0x94, 0x80, 0x53, 0x03, 0x05, 0x17, 0x29, 0xE2, 0x30, 0x22, - 0x87, 0x35, 0x78, 0x18, 0xB3, 0xA2, 0x8A, 0x69, 0x71, 0x3F, 0xE4, 0xFB, 0x14, 0x52, 0x82, 0x92, - 0xC1, 0x21, 0xE2, 0x0C, 0x97, 0x1B, 0xD0, 0xAA, 0x7D, 0x66, 0x9C, 0x12, 0x1E, 0x76, 0xE3, 0x73, - 0xB8, 0xF2, 0x78, 0x61, 0x46, 0x8C, 0xD0, 0x38, 0x1F, 0x0D, 0xFB, 0xCB, 0x39, 0x44, 0xCB, 0x90, - 0x3C, 0xC7, 0xF2, 0xFC, 0xE3, 0xDB, 0x85, 0xF4, 0x61, 0x93, 0x83, 0x21, 0xA1, 0x75, 0xE0, 0x66, - 0x82, 0x5D, 0x4D, 0xDB, 0x0A, 0x39, 0xA5, 0x88, 0xAE, 0x47, 0xD1, 0x4F, 0x2D, 0x22, 0xF0, 0x3F, - 0xA7, 0x75, 0xC4, 0xF0, 0x2C, 0x28, 0xED, 0x01, 0x0A, 0xAF, 0x9C, 0x69, 0x47, 0x5F, 0xE6, 0x00, - 0xD3, 0xDE, 0x71, 0x0E, 0x10, 0xC4, 0x92, 0xBD, 0xCE, 0x59, 0x6E, 0xE5, 0x95, 0xE0, 0xC1, 0x0E, - 0xB9, 0xDE, 0x20, 0xE7, 0x1B, 0x40, 0x1C, 0x23, 0x8D, 0x19, 0xC2, 0x00, 0x9D, 0xCF, 0x6A, 0x13, - 0x8E, 0x1F, 0xCD, 0x90, 0x16, 0x2E, 0x28, 0x1B, 0x96, 0x49, 0x1C, 0x2D, 0x27, 0xE3, 0xE5, 0x7B, - 0x93, 0x92, 0xE6, 0x86, 0xC5, 0x69, 0x11, 0xB8, 0x4F, 0x12, 0xE8, 0x9C, 0xF5, 0xFE, 0x40, 0x37, - 0xAD, 0xAD, 0x46, 0x31, 0x82, 0x3A, 0x8A, 0x90, 0xA3, 0x25, 0xAC, 0x20, 0x3A, 0x96, 0x75, 0x0D, - 0x6B, 0x2B, 0xAF, 0x23, 0x7A, 0x5B, 0x50, 0x55, 0x91, 0x2C, 0xBF, 0x13, 0x6D, 0x58, 0x26, 0x43, - 0x6A, 0xC1, 0x22, 0xD4, 0xD9, 0x5E, 0x43, 0x23, 0x02, 0xCD, 0xAF, 0xD7, 0xB0, 0xDF, 0x05, 0x5C, - 0xD4, 0x92, 0xB4, 0x69, 0x21, 0xC2, 0x55, 0x6B, 0x1A, 0x3D, 0x03, 0x87, 0xEC, 0x65, 0x92, 0xEE, - 0xCA, 0xA0, 0xA0, 0x73, 0x10, 0x1C, 0xC3, 0x38, 0xF8, 0x4A, 0x51, 0x0C, 0x62, 0x99, 0xA9, 0x70, - 0x76, 0x70, 0x81, 0x11, 0xD7, 0x9E, 0xCF, 0x12, 0xAA, 0x9E, 0xC2, 0xE9, 0x8D, 0x6D, 0xAD, 0x18, - 0x7C, 0x5C, 0x8B, 0x41, 0x31, 0x9C, 0x0D, 0xDD, 0x22, 0x9D, 0x64, 0xB1, 0xDB, 0x70, 0x6E, 0xE1, - 0x2D, 0x9B, 0xF1, 0xDE, 0x04, 0xB5, 0x7F, 0x50, 0x24, 0x32, 0xB8, 0x49, 0x2D, 0x77, 0xFB, 0x10, - 0x47, 0xE8, 0xDA, 0xE1, 0x58, 0x83, 0x0E, 0x2E, 0x42, 0x08, 0x32, 0xEA, 0xA5, 0x5B, 0xC4, 0x16, - 0x0E, 0xF1, 0x58, 0xC6, 0x03, 0xAD, 0xD6, 0x30, 0x5F, 0x51, 0x68, 0x93, 0x26, 0xFA, 0x84, 0xB0, - 0x6C, 0x96, 0x3C, 0xB1, 0x71, 0xA2, 0x90, 0x64, 0x69, 0xF2, 0xAB, 0x35, 0x44, 0x87, 0xA9, 0xA4, - 0x33, 0x24, 0x9D, 0x71, 0x08, 0xD3, 0xB8, 0x2F, 0xC8, 0x51, 0xDC, 0x1D, 0xC4, 0x15, 0xDC, 0xA4, - 0xB1, 0x65, 0x91, 0x90, 0x2B, 0xB4, 0x5B, 0x63, 0xA9, 0x10, 0x84, 0x9B, 0x39, 0xF5, 0x60, 0x3D, - 0xCA, 0xBE, 0x21, 0xD1, 0x79, 0xC1, 0x40, 0x65, 0x0E, 0xCF, 0x0A, 0x4F, 0x14, 0x3C, 0x0C, 0xC5, - 0x08, 0xCD, 0x61, 0xC0, 0x21, 0x4E, 0x6A, 0x92, 0xEC, 0x28, 0xC5, 0xC7, 0x3A, 0xAF, 0xA3, 0xC0, - 0x69, 0xEC, 0x2A, 0x57, 0x27, 0x0B, 0xB4, 0xED, 0xB7, 0x5D, 0x37, 0x72, 0x34, 0x77, 0xF5, 0x70, - 0x46, 0x0F, 0x23, 0xAD, 0x81, 0x12, 0xC9, 0x46, 0x32, 0x03, 0x39, 0x5C, 0x17, 0x62, 0xB4, 0x70, - 0x50, 0xAF, 0x4E, 0xE0, 0xC4, 0x11, 0x4A, 0x31, 0x8E, 0xC1, 0xED, 0x1C, 0x9D, 0xE9, 0x4B, 0x02, - 0xAD, 0xEC, 0x7A, 0x0F, 0xDA, 0xCD, 0xAB, 0x0B, 0x37, 0xFF, 0x09, 0xD9, 0x2F, 0x90, 0x2B, 0x36, - 0x0F, 0x00, 0x00, -]; - #[pack_content(false)] #[derive(Default)] pub struct VideoEntity { @@ -197,7 +30,9 @@ pub struct VideoEntity { } impl VideoEntity { - pub(crate) async fn resolve_stream(&mut self) -> (Option, Option) { + pub(crate) async fn resolve_stream( + &mut self, + ) -> Result<(Option, Option), String> { let load_stream = |path: String| async move { let file = tokio::fs::File::open(path).await.ok()?; let metadata = file.metadata().await.ok()?; @@ -228,16 +63,27 @@ impl VideoEntity { match self.video_thumb_stream.as_ref() { Some(stream) => Some(stream.clone()), None => { - let cursor = Cursor::new(DEFAULT_THUMB.to_vec()); - let stream = - Arc::new(tokio::sync::Mutex::new(Box::new(cursor) as AsyncPureStream)); - self.video_thumb_size = DEFAULT_THUMB.len() as i32; - Some(stream) + let res = + tokio::task::spawn_blocking(move || -> ImageResult>> { + let mut thumb = Cursor::new(Vec::new()); + gen_thumbnail(&mut thumb)?; + Ok(thumb) + }) + .await + .map_err(|e| e.to_string()); + if let Ok(Ok(thumb)) = res { + let size = thumb.get_ref().len() as i32; + let stream = + Arc::new(tokio::sync::Mutex::new(Box::new(thumb) as AsyncPureStream)); + self.video_thumb_size = size; + Some(stream) + } else { + return Err(res.unwrap_err()); + } } } }; - - (video_stream, video_thumb_stream) + Ok((video_stream, video_thumb_stream)) } } diff --git a/mania/src/utility/image_gen.rs b/mania/src/utility/image_gen.rs new file mode 100644 index 0000000..76682e0 --- /dev/null +++ b/mania/src/utility/image_gen.rs @@ -0,0 +1,28 @@ +use image::{ImageBuffer, ImageFormat, ImageResult, Rgb}; +use noise::{NoiseFn, Perlin}; +use std::io::{Seek, Write}; + +pub trait ImageOpWriteSeek: Write + Seek {} +impl ImageOpWriteSeek for T {} + +// TODO: make it more configurable +pub fn gen_thumbnail(output: &mut W) -> ImageResult<()> { + let (width, height, scale) = (1024, 768, 500.0); + let (min_color, max_color) = ((40, 20, 20), (60, 40, 40)); + let perlin = Perlin::new(114514); + let lerp = + |min: u8, max: u8, t: f64| -> u8 { (min as f64 + t * (max as f64 - min as f64)) as u8 }; + let mut img = ImageBuffer::new(width, height); + for (x, y, pixel) in img.enumerate_pixels_mut() { + let nx = x as f64 / scale; + let ny = y as f64 / scale; + let t = (perlin.get([nx, ny]) + 1.0) / 2.0; + *pixel = Rgb([ + lerp(min_color.0, max_color.0, t), + lerp(min_color.1, max_color.1, t), + lerp(min_color.2, max_color.2, t), + ]); + } + img.write_to(output, ImageFormat::Jpeg)?; + Ok(()) +} diff --git a/mania/src/utility/mod.rs b/mania/src/utility/mod.rs index 942b496..10d4ff6 100644 --- a/mania/src/utility/mod.rs +++ b/mania/src/utility/mod.rs @@ -1,6 +1,7 @@ pub mod compress; pub mod def_default; pub mod extensions; +pub mod image_gen; pub mod image_resolver; pub mod random_gen; pub mod stream_helper;