diff --git a/Cargo.lock b/Cargo.lock index 67933fe..df59752 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.6.4" @@ -88,22 +97,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -147,6 +156,15 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "async-channel" version = "2.5.0" @@ -161,9 +179,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.32" +version = "0.4.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a89bce6054c720275ac2432fbba080a66a2106a44a1b804553930ca6909f4e0" +checksum = "98ec5f6c2f8bc326c994cb9e241cc257ddaba9afa8555a43cffbb5dd86efaa37" dependencies = [ "compression-codecs", "compression-core", @@ -204,6 +222,26 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.17", + "v_frame", + "y4m", +] + [[package]] name = "av1-grain" version = "0.2.5" @@ -229,9 +267,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" dependencies = [ "axum-core", "axum-macros", @@ -321,9 +359,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" [[package]] name = "biliup" @@ -404,7 +442,6 @@ dependencies = [ "time", "tokio", "tokio-util", - "toml", "tower", "tower-http", "tower-sessions", @@ -435,12 +472,6 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.10.0" @@ -452,9 +483,12 @@ dependencies = [ [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "blake2" @@ -532,9 +566,9 @@ dependencies = [ [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" @@ -562,15 +596,15 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cc" -version = "1.2.44" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "jobserver", @@ -578,16 +612,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon 0.12.16", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -611,14 +635,14 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link 0.2.1", + "windows-link", ] [[package]] name = "clap" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -626,9 +650,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -668,9 +692,9 @@ checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compression-codecs" -version = "0.4.31" +version = "0.4.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8a506ec4b81c460798f572caead636d57d3d7e940f998160f52bd254bf2d23" +checksum = "b0f7ac3e5b97fdce45e8922fb05cae2c37f7bbd63d30dd94821dacfd8f3f2bf2" dependencies = [ "brotli", "compression-core", @@ -680,9 +704,9 @@ dependencies = [ [[package]] name = "compression-core" -version = "0.4.29" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" [[package]] name = "concurrent-queue" @@ -695,15 +719,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.11" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" dependencies = [ "encode_unicode", "libc", "once_cell", "unicode-width", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -755,6 +779,24 @@ dependencies = [ "url", ] +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -771,6 +813,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[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.17" @@ -782,9 +833,9 @@ dependencies = [ [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] @@ -855,9 +906,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -927,14 +978,13 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" dependencies = [ "console", "shell-words", "tempfile", - "thiserror 1.0.69", "zeroize", ] @@ -968,7 +1018,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1054,7 +1104,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1101,9 +1151,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -1116,9 +1166,9 @@ dependencies = [ [[package]] name = "fancy-regex" -version = "0.16.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "998b056554fbe42e03ae0e152895cd1a7e1002aec800fdc6635d20270260c46f" +checksum = "72cf461f865c862bb7dc573f643dd6a2b6842f7c30b07882b56bd148cc2761b8" dependencies = [ "bit-set", "regex-automata", @@ -1162,9 +1212,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "flate2" @@ -1258,7 +1308,7 @@ checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.12.5", + "parking_lot", ] [[package]] @@ -1310,9 +1360,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -1347,9 +1397,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.3" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" dependencies = [ "color_quant", "weezl", @@ -1417,9 +1467,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] name = "hashlink" @@ -1471,12 +1521,11 @@ dependencies = [ [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -1529,9 +1578,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -1569,9 +1618,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64", "bytes", @@ -1665,9 +1714,9 @@ checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ "icu_collections", "icu_locale_core", @@ -1679,9 +1728,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" @@ -1743,9 +1792,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.8" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", @@ -1761,8 +1810,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.0", + "zune-jpeg 0.5.6", ] [[package]] @@ -1783,26 +1832,26 @@ checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" [[package]] name = "indexmap" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.16.1", "serde", "serde_core", ] [[package]] name = "indicatif" -version = "0.17.11" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88" dependencies = [ "console", - "number_prefix", "portable-atomic", "unicode-width", + "unit-prefix", "web-time", ] @@ -1815,18 +1864,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "interpolate_name" version = "0.2.4" @@ -1846,9 +1883,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -1860,15 +1897,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" -[[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.14.0" @@ -1896,14 +1924,25 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "kurtbuilds_sql" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a78c2a374623634ed2c4113f4d1a995d7f163ac65236a1653f6eb83623cf3b82" +dependencies = [ + "anyhow", + "serde", + "topo_sort", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1921,9 +1960,9 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libfuzzer-sys" @@ -1947,9 +1986,9 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.10.0", + "bitflags", "libc", - "redox_syscall 0.5.18", + "redox_syscall", ] [[package]] @@ -1993,9 +2032,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loop9" @@ -2106,9 +2145,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "wasi", @@ -2117,9 +2156,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" +checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" dependencies = [ "num-traits", "pxfm", @@ -2162,7 +2201,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2177,9 +2216,9 @@ dependencies = [ [[package]] name = "num-bigint-dig" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c79c15c05d4bf82b6f5ef163104cc81a760d8e874d38ac50ab67c8877b647b" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" dependencies = [ "lazy_static", "libm", @@ -2258,12 +2297,6 @@ dependencies = [ "libc", ] -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - [[package]] name = "once_cell" version = "1.21.3" @@ -2284,30 +2317,30 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ormlite" -version = "0.24.1" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f293c7d8d6ba6e898ca701fde0db80510301193a0944a7631e8003f8734ce8" +checksum = "f64d8b6196d1e522ebd3824985fe251aa9e9ecb96772fb959f2e38269b1d169e" dependencies = [ + "kurtbuilds_sql", "ormlite-core", "ormlite-macro", - "sqlmo", "sqlx", "sqlx-core", ] [[package]] name = "ormlite-attr" -version = "0.24.1" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecdecc7ebe8ce5f39e522d399c48eb693eda022d6f9b9d03a651eea1ab33b5e3" +checksum = "f3a255e62a42b493e057b09ad76c78fcc079eb8fc40761e78f8c4f840125ae95" dependencies = [ "anyhow", "convert_case", "ignore", + "kurtbuilds_sql", "proc-macro2", "quote", "sqlformat", - "sqlmo", "structmeta", "syn", "tracing", @@ -2315,17 +2348,17 @@ dependencies = [ [[package]] name = "ormlite-core" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f304e891bffe5e502f1ba23fbe8671f72df86ba583a46533d8f0e7814c01d0" +checksum = "038fddf1a5c7904df7c29d9dd59b24c2f8fca78b71815b9a62b79ab65d5a11ea" dependencies = [ "anyhow", "futures", "indexmap", + "kurtbuilds_sql", "ormlite-attr", "proc-macro2", "serde", - "sqlmo", "sqlparser", "sqlx", "syn", @@ -2334,12 +2367,12 @@ dependencies = [ [[package]] name = "ormlite-macro" -version = "0.24.1" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df5cacbb2760fd7702a6b0cb2c90054529ddb0d492e3bea0b67a3b3ea76d1eea" +checksum = "a2606578412fa10fb982abe4cc52c35b5fce79f051b4dc9275ed2f5c59c2e8ab" dependencies = [ "convert_case", - "itertools 0.14.0", + "itertools", "ormlite-attr", "ormlite-core", "proc-macro2", @@ -2354,17 +2387,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -2372,21 +2394,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi", + "parking_lot_core", ] [[package]] @@ -2397,9 +2405,9 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -2431,6 +2439,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -2491,7 +2505,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 2.10.0", + "bitflags", "crc32fast", "fdeflate", "flate2", @@ -2584,18 +2598,18 @@ dependencies = [ [[package]] name = "pxfm" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" dependencies = [ "num-traits", ] [[package]] name = "pyo3" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a6df7eab65fc7bee654a421404947e10a0f7085b6951bf2ea395f4659fb0cf" +checksum = "ab53c047fcd1a1d2a8820fe84f05d6be69e9526be40cb03b73f86b6b03e6d87d" dependencies = [ "anyhow", "indoc", @@ -2611,18 +2625,18 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb" +checksum = "b455933107de8642b4487ed26d912c2d899dec6114884214a0b3bb3be9261ea6" dependencies = [ - "target-lexicon 0.13.3", + "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd13844a4242793e02df3e2ec093f540d948299a6a77ea9ce7afd8623f542be" +checksum = "1c85c9cbfaddf651b1221594209aed57e9e5cff63c4d11d1feead529b872a089" dependencies = [ "libc", "pyo3-build-config", @@ -2630,9 +2644,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf8f9f1108270b90d3676b8679586385430e5c0bb78bb5f043f95499c821a71" +checksum = "0a5b10c9bf9888125d917fb4d2ca2d25c8df94c7ab5a52e13313a07e050a3b02" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -2642,9 +2656,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a3b2274450ba5288bc9b8c1b69ff569d1d61189d4bff38f8d22e03d17f932b" +checksum = "03b51720d314836e53327f5871d4c0cfb4fb37cc2c4a11cc71907a86342c40f9" dependencies = [ "heck", "proc-macro2", @@ -2744,9 +2758,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.41" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -2818,19 +2832,21 @@ dependencies = [ [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", "cfg-if", "interpolate_name", - "itertools 0.12.1", + "itertools", "libc", "libfuzzer-sys", "log", @@ -2839,23 +2855,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.2", + "rand_chacha 0.9.0", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.17", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.20" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", @@ -2886,22 +2900,13 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags", ] [[package]] @@ -2946,15 +2951,14 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.24" +version = "0.12.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a" dependencies = [ - "async-compression", "base64", "bytes", "cookie", - "cookie_store", + "cookie_store 0.21.1", "encoding_rs", "futures-core", "futures-util", @@ -3008,9 +3012,9 @@ dependencies = [ [[package]] name = "reqwest-retry" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c73e4195a6bfbcb174b790d9b3407ab90646976c55de58a6515da25d851178" +checksum = "105747e3a037fe5bf17458d794de91149e575b6183fc72c85623a44abb9683f5" dependencies = [ "anyhow", "async-trait", @@ -3018,35 +3022,34 @@ dependencies = [ "getrandom 0.2.16", "http", "hyper", - "parking_lot 0.11.2", "reqwest", "reqwest-middleware", "retry-policies", - "thiserror 1.0.69", + "thiserror 2.0.17", "tokio", "tracing", - "wasm-timer", + "wasmtimer", ] [[package]] name = "reqwest_cookie_store" -version = "0.8.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2314c325724fea278d44c13a525ebf60074e33c05f13b4345c076eb65b2446b3" +checksum = "5e75bc88d954b228850d19e3685cedb38c030a17da34aa01c307f95d6e33de34" dependencies = [ "bytes", - "cookie_store", + "cookie_store 0.22.0", "reqwest", "url", ] [[package]] name = "retry-policies" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5875471e6cab2871bc150ecb8c727db5113c9338cc3354dc5ee3425b6aa40a1c" +checksum = "46a4bd6027df676bcb752d3724db0ea3c0c5fc1dd0376fec51ac7dcaf9cc69be" dependencies = [ - "rand 0.8.5", + "rand 0.9.2", ] [[package]] @@ -3093,9 +3096,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" dependencies = [ "const-oid", "digest", @@ -3166,18 +3169,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.10.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.34" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", "ring", @@ -3189,9 +3192,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "web-time", "zeroize", @@ -3295,15 +3298,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3362,9 +3356,9 @@ dependencies = [ [[package]] name = "shell-words" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shellexpand" @@ -3383,9 +3377,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] @@ -3402,9 +3396,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simd_helpers" @@ -3469,16 +3463,6 @@ dependencies = [ "unicode_categories", ] -[[package]] -name = "sqlmo" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38054a2fedf5eb6692f46922673f1d33e2845ddb9d3d5e16385fbcb80d4082e8" -dependencies = [ - "anyhow", - "topo_sort", -] - [[package]] name = "sqlparser" version = "0.51.0" @@ -3585,7 +3569,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", - "bitflags 2.10.0", + "bitflags", "byteorder", "bytes", "chrono", @@ -3629,7 +3613,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", - "bitflags 2.10.0", + "bitflags", "byteorder", "chrono", "crc", @@ -3699,7 +3683,6 @@ dependencies = [ "async-channel", "async-trait", "axum", - "axum-login", "biliup", "biliup-cli", "bon", @@ -3712,7 +3695,6 @@ dependencies = [ "mime_guess", "nom 8.0.0", "ormlite", - "password-auth", "pyo3", "pythonize", "rust-embed", @@ -3722,10 +3704,7 @@ dependencies = [ "thiserror 2.0.17", "time", "tokio", - "tower", "tower-http", - "tower-sessions", - "tower-sessions-sqlx-store", "tracing", "tracing-appender", "tracing-subscriber", @@ -3800,9 +3779,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.108" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -3835,7 +3814,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.10.0", + "bitflags", "core-foundation", "system-configuration-sys", ] @@ -3850,25 +3829,6 @@ 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 = "target-lexicon" version = "0.13.3" @@ -3885,7 +3845,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3948,7 +3908,7 @@ dependencies = [ "half", "quick-error", "weezl", - "zune-jpeg", + "zune-jpeg 0.4.21", ] [[package]] @@ -4082,47 +4042,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "topo_sort" version = "0.4.0" @@ -4155,7 +4074,7 @@ dependencies = [ "cookie", "futures-util", "http", - "parking_lot 0.12.5", + "parking_lot", "pin-project-lite", "tower-layer", "tower-service", @@ -4163,11 +4082,12 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.10.0", + "async-compression", + "bitflags", "bytes", "futures-core", "futures-util", @@ -4228,7 +4148,7 @@ dependencies = [ "base64", "futures", "http", - "parking_lot 0.12.5", + "parking_lot", "rand 0.8.5", "serde", "serde_json", @@ -4254,9 +4174,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", "pin-project-lite", @@ -4266,21 +4186,21 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" dependencies = [ "crossbeam-channel", - "thiserror 1.0.69", + "thiserror 2.0.17", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -4289,9 +4209,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", @@ -4310,9 +4230,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", @@ -4413,6 +4333,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" +[[package]] +name = "unit-prefix" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3" + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -4484,12 +4410,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "version-compare" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" - [[package]] name = "version_check" version = "0.9.5" @@ -4538,9 +4458,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", @@ -4551,9 +4471,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -4564,9 +4484,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4574,9 +4494,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ "bumpalo", "proc-macro2", @@ -4587,9 +4507,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] @@ -4608,25 +4528,24 @@ dependencies = [ ] [[package]] -name = "wasm-timer" -version = "0.2.5" +name = "wasmtimer" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" +checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" dependencies = [ "futures", "js-sys", - "parking_lot 0.11.2", + "parking_lot", "pin-utils", + "slab", "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", ] [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -4662,9 +4581,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "whoami" @@ -4676,37 +4595,15 @@ dependencies = [ "wasite", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" version = "0.62.2" @@ -4715,9 +4612,9 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -4742,12 +4639,6 @@ dependencies = [ "syn", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" @@ -4756,22 +4647,13 @@ checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -4780,16 +4662,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -4798,7 +4671,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4819,15 +4692,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" @@ -4843,7 +4707,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -4883,7 +4747,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -5032,15 +4896,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winnow" -version = "0.7.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" -dependencies = [ - "memchr", -] - [[package]] name = "wit-bindgen" version = "0.46.0" @@ -5053,6 +4908,12 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "yoke" version = "0.8.1" @@ -5078,18 +4939,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", @@ -5162,6 +5023,12 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" + [[package]] name = "zune-inflate" version = "0.2.54" @@ -5177,5 +5044,14 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "zune-core", + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f520eebad972262a1dde0ec455bce4f8b298b1e5154513de58c114c4c54303e8" +dependencies = [ + "zune-core 0.5.0", ] diff --git a/README.md b/README.md index 8c83164..edbcf60 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,9 @@ ## 📜 使用文档 B 站命令行投稿工具,支持**短信登录**、**账号密码登录**、**扫码登录**、**浏览器登录**以及**网页Cookie登录**,并将登录后返回的 cookie 和 token 保存在 `cookie.json` 中,可用于其他项目。 -获取命令帮助 `biliup --help` \ +- 下载 Release: [biliupR](https://github.com/biliup/biliup/releases/latest) +- 获取命令帮助 `biliup --help` + **文档地址**: ```shell Upload video to bilibili. diff --git a/crates/biliup-cli/Cargo.toml b/crates/biliup-cli/Cargo.toml index 44bd04c..8fd972e 100644 --- a/crates/biliup-cli/Cargo.toml +++ b/crates/biliup-cli/Cargo.toml @@ -27,9 +27,9 @@ time = { workspace = true } glob = "0.3.2" qrcode = "0.14" -indicatif = "0.17.11" +indicatif = "0.18.0" image = "0.25" -dialoguer = "0.11.0" +dialoguer = "0.12.0" chrono = { workspace = true, features = ["serde"] } indexmap = { version = "2.8.0" } async-trait = { workspace = true } @@ -40,7 +40,6 @@ reqwest = { workspace = true } sqlx = { version = "0.8", features = [ "runtime-tokio-rustls", "sqlite" ] } regex = { workspace = true } serde_yaml = { workspace = true } -toml = "0.8" tempfile = "3.14" rust-embed = "8.7.2" mime_guess = "2.0.5" diff --git a/crates/biliup-cli/src/lib.rs b/crates/biliup-cli/src/lib.rs index 5f1f386..2343b25 100644 --- a/crates/biliup-cli/src/lib.rs +++ b/crates/biliup-cli/src/lib.rs @@ -1,8 +1,8 @@ pub mod cli; pub mod downloader; pub mod server; -pub mod uploader; pub mod upload_lock; +pub mod uploader; // use crate::server::api::router::ApplicationController; use crate::server::app::ApplicationController; diff --git a/crates/biliup-cli/src/server/common/download.rs b/crates/biliup-cli/src/server/common/download.rs index 5081f1f..84d788d 100644 --- a/crates/biliup-cli/src/server/common/download.rs +++ b/crates/biliup-cli/src/server/common/download.rs @@ -1,5 +1,7 @@ use crate::server::common::upload::UploaderMessage; +use crate::server::common::util::FileValidator; use crate::server::config::default_segment_time; +use crate::server::core::downloader::cover_downloader; use crate::server::core::downloader::{ DanmakuClient, DownloadConfig, DownloadStatus, DownloaderRuntime, DownloaderType, SegmentEvent, SegmentInfo, @@ -11,6 +13,7 @@ use crate::server::infrastructure::context::{Context, Stage, WorkerStatus}; use crate::server::infrastructure::models::hook_step::process; use async_channel::{Receiver, Sender}; use error_stack::{ResultExt, bail}; +use reqwest::header::{HeaderMap, HeaderValue, USER_AGENT}; use std::fs; use std::path::{Path, PathBuf}; use std::sync::Arc; @@ -37,68 +40,6 @@ impl RetryPolicy { } } -/// 文件验证配置 -#[derive(Clone)] -pub struct FileValidator { - min_size: u64, - check_format: bool, -} - -impl FileValidator { - pub fn new(min_size: u64, check_format: bool) -> Self { - Self { - min_size, - check_format, - } - } -} - -impl Default for FileValidator { - fn default() -> Self { - Self { - min_size: 1024 * 1024 * 100, // 100MB minimum - check_format: true, - } - } -} - -impl FileValidator { - /// 验证文件有效性 - pub fn validate(&self, path: &Path) -> AppResult<()> { - let metadata = fs::metadata(path).change_context(AppError::Unknown)?; - - let size = metadata.len(); - - if size < self.min_size { - bail!(AppError::Custom(format!( - "File {} too small: {size} bytes, minimum: {} bytes", - path.display(), - self.min_size - ))); - } - - // 可选:检查文件格式 - if self.check_format { - self.validate_format(path)?; - } - - Ok(()) - } - - fn validate_format(&self, path: &Path) -> AppResult<()> { - // 简单的格式验证 - 检查扩展名 - if let Some(extension) = path.extension() { - let ext = extension.to_string_lossy().to_lowercase(); - match ext.as_str() { - "mp4" | "flv" | "ts" | "m3u8" | "mkv" => Ok(()), - _ => bail!(AppError::Custom(format!("Unsupported format: {}", ext))), - } - } else { - bail!(AppError::Custom("No file extension found".to_string())) - } - } -} - /// 分段事件处理器 pub struct SegmentEventProcessor { channel: Option>, @@ -181,7 +122,7 @@ impl DownloadTask { pub(self) async fn execute( &self, ctx: &Context, - mut processor: SegmentEventProcessor, + sender: Sender, mut plugin: Box, rooms_handle: Arc, ) -> AppResult<()> { @@ -201,12 +142,15 @@ impl DownloadTask { info!("Starting danmaku client for stream: {}", url); client.download().await?; } + + // 初始化组件 + let mut processor = SegmentEventProcessor::new(sender, ctx.clone()); let result = loop { // 创建守卫确保清理 // 创建事件处理器 // 执行下载 let components = self - .initialize_components( + .download( &mut processor, ctx.clone(), danmaku_client.clone(), @@ -286,7 +230,7 @@ impl DownloadTask { Ok(()) } - async fn initialize_components( + async fn download( &self, processor: &mut SegmentEventProcessor, ctx: Context, @@ -395,22 +339,47 @@ impl DActor { match msg { DownloaderMessage::Start(downloader, ctx) => { // 创建下载任务 - let runtime = downloader.downloader( - ctx.config() - .downloader - .unwrap_or(DownloaderType::StreamGears), - ); - let task = Arc::new(DownloadTask::new(runtime)); - // 初始化组件 - let processor = SegmentEventProcessor::new(self.sender.clone(), ctx.clone()); + let task = Arc::new(DownloadTask::new( + downloader.downloader( + ctx.config() + .downloader + .unwrap_or(DownloaderType::StreamGears), + ), + )); // 更新工作器状态为工作中 ctx.change_status(Stage::Download, WorkerStatus::Working(task.clone())) .await; + tokio::spawn({ + let streamer_info = &ctx.stream_info_ext().streamer_info; + let live_cover_url = streamer_info.live_cover_path.clone(); + let format_filename = ctx.recorder(streamer_info.clone()).format_filename(); + let client = ctx.stateless_client().client.clone(); + let enabled = ctx + .config() + .use_live_cover + .map(|u| u && !live_cover_url.is_empty()) + .unwrap_or(false); + async move { + cover_downloader::download_cover_with( + &live_cover_url, + enabled, + &format_filename, + client, + ) + .await + } + }); + process(&[], &ctx.live_streamer().preprocessor).await; let _ = task - .execute(&ctx, processor, downloader, self.rooms_handle.clone()) + .execute( + &ctx, + self.sender.clone(), + downloader, + self.rooms_handle.clone(), + ) .await; process(&[], &ctx.live_streamer().downloaded_processor).await; diff --git a/crates/biliup-cli/src/server/common/util.rs b/crates/biliup-cli/src/server/common/util.rs index b30402b..f8565e6 100644 --- a/crates/biliup-cli/src/server/common/util.rs +++ b/crates/biliup-cli/src/server/common/util.rs @@ -1,7 +1,12 @@ +use crate::server::errors::{AppError, AppResult}; use crate::server::infrastructure::models::StreamerInfo; +use crate::server::infrastructure::models::hook_step::HookStep; use chrono::{Duration, Local}; +use error_stack::{ResultExt, bail}; use serde::{Deserialize, Serialize}; +use std::fs; use std::path::{Path, PathBuf}; +use tracing::{error, info}; use url::Url; /// 录制器配置结构体 @@ -172,3 +177,75 @@ mod tests { ); } } + +/// 文件验证配置 +#[derive(Clone)] +pub struct FileValidator { + min_size: u64, + check_format: bool, +} + +impl FileValidator { + pub fn new(min_size: u64, check_format: bool) -> Self { + Self { + min_size, + check_format, + } + } +} + +impl Default for FileValidator { + fn default() -> Self { + Self { + min_size: 1024 * 1024 * 100, // 100MB minimum + check_format: true, + } + } +} + +impl FileValidator { + /// 验证文件有效性 + pub fn validate(&self, path: &Path) -> AppResult<()> { + let metadata = fs::metadata(path).change_context(AppError::Unknown)?; + + let size = metadata.len(); + + if size < self.min_size { + let display = path.display(); + let path = path.to_owned(); + tokio::spawn(async move { + let Ok(()) = HookStep::remove_file(&[&path]) + .await + .inspect_err(|e| error!(e=?e)) + else { + return; + }; + info!("过滤删除 - {}", path.display()); + }); + bail!(AppError::Custom(format!( + "File {display} too small: {size} bytes, minimum: {} bytes", + self.min_size + ))); + } + + // 可选:检查文件格式 + if self.check_format { + self.validate_format(path)?; + } + + Ok(()) + } + + fn validate_format(&self, path: &Path) -> AppResult<()> { + // 简单的格式验证 - 检查扩展名 + if let Some(extension) = path.extension() { + let ext = extension.to_string_lossy().to_lowercase(); + match ext.as_str() { + "mp4" | "flv" | "ts" | "m3u8" | "mkv" => Ok(()), + _ => bail!(AppError::Custom(format!("Unsupported format: {}", ext))), + } + } else { + bail!(AppError::Custom("No file extension found".to_string())) + } + } +} diff --git a/crates/biliup-cli/src/server/core/downloader.rs b/crates/biliup-cli/src/server/core/downloader.rs index a72cacd..04e63c4 100644 --- a/crates/biliup-cli/src/server/core/downloader.rs +++ b/crates/biliup-cli/src/server/core/downloader.rs @@ -1,3 +1,4 @@ +pub mod cover_downloader; /// FFmpeg下载器实现 pub mod ffmpeg_downloader; /// Stream-gears下载器实现 diff --git a/crates/biliup-cli/src/server/core/downloader/cover_downloader.rs b/crates/biliup-cli/src/server/core/downloader/cover_downloader.rs new file mode 100644 index 0000000..66bf6cb --- /dev/null +++ b/crates/biliup-cli/src/server/core/downloader/cover_downloader.rs @@ -0,0 +1,151 @@ +use crate::server::core::downloader::cover_downloader; +use crate::server::errors::{AppError, AppResult}; +use axum::http::HeaderValue; +use axum::http::header::USER_AGENT; +use error_stack::ResultExt; +use reqwest::header::HeaderMap; +use std::fs; +use std::path::{Path, PathBuf}; +use std::time::Duration; +use tracing::{error, info, instrument, warn}; +use url::Url; + +/// 支持的图片格式 +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ImageFormat { + Jpg, + Png, + Webp, +} + +impl ImageFormat { + /// 从 URL 路径中检测图片格式 + fn detect(url_path: &str) -> Option { + // 转小写后匹配,更健壮 + let path = url_path.to_ascii_lowercase(); + + [ + (".jpg", Self::Jpg), + (".jpeg", Self::Jpg), + (".png", Self::Png), + (".webp", Self::Webp), + ] + .into_iter() + .find(|(ext, _)| path.contains(ext)) + .map(|(_, fmt)| fmt) + } + + const fn as_ext(self) -> &'static str { + match self { + Self::Jpg => "jpg", + Self::Png => "png", + Self::Webp => "webp", + } + } + + const fn needs_conversion(self) -> bool { + matches!(self, Self::Webp) + } +} + +/// 封面下载器 +/// 下载封面图片 +#[instrument(fields(url = %url))] +async fn download( + url: &str, + filename: &str, + base_dir: PathBuf, + client: reqwest::Client, +) -> AppResult { + // 解析并验证 URL + let parsed = + Url::parse(url).change_context_lazy(|| AppError::Custom(String::from("无效的 URL")))?; + + let format = ImageFormat::detect(parsed.path()) + .ok_or_else(|| AppError::Custom(format!("不支持的图片格式: {url}")))?; + + // 构建保存目录 + let save_dir = base_dir; + fs::create_dir_all(&save_dir) + .change_context_lazy(|| AppError::Custom(String::from("创建目录失败")))?; + + let file_path = save_dir.join(format!("{filename}.{}", format.as_ext())); + + // 下载或使用缓存 + if !file_path.exists() { + fetch_and_save(url, &file_path, client).await?; + } + + // webp 需要转换为 jpg + if format.needs_conversion() { + return convert_to_jpg(&file_path, &save_dir, filename); + } + + Ok(file_path) +} + +/// 下载并保存文件 +async fn fetch_and_save(url: &str, path: &Path, client: reqwest::Client) -> AppResult<()> { + let bytes = client + .get(url) + .send() + .await + .change_context_lazy(|| AppError::Custom(String::from("网络请求失败")))? + .error_for_status() + .change_context_lazy(|| AppError::Custom(String::from("服务器返回错误状态")))? + .bytes() + .await + .change_context_lazy(|| AppError::Custom(String::from("读取响应数据失败")))?; + + fs::write(path, &bytes) + .change_context_lazy(|| AppError::Custom(String::from("写入文件失败")))?; + Ok(()) +} + +/// 将图片转换为 JPG 格式 +fn convert_to_jpg(src: &Path, dir: &Path, filename: &str) -> AppResult { + let jpg_path = dir.join(format!("{filename}.jpg")); + + image::open(src) + .change_context_lazy(|| AppError::Custom(String::from("打开图片失败")))? + .to_rgb8() + .save(&jpg_path) + .change_context_lazy(|| AppError::Custom(String::from("保存 JPG 失败")))?; + + // 删除原文件,忽略错误 + let _ = fs::remove_file(src); + + Ok(jpg_path) +} + +pub async fn download_cover_with( + url: &str, + enabled: bool, + fmtname: &str, + client: reqwest::Client, +) -> Option { + // 使用 guard clause 提前返回 + if !enabled { + return None; + } + + // 构建请求头 + let mut headers = HeaderMap::new(); + headers.insert( + USER_AGENT, + HeaderValue::from_static("Mozilla/5.0 (Windows NT 10.0; Win64; x64)"), + ); + + // 创建下载器 + match cover_downloader::download(url, fmtname, PathBuf::from("data/cover"), client).await { + Ok(path) => { + let display_path = fs::canonicalize(&path).unwrap_or_else(|_| path.clone()); + info!("封面下载成功,路径:{}", display_path.display()); + Some(path) + } + Err(e) => { + error!("封面下载失败: {e:#}"); + None + } + } +} diff --git a/crates/biliup-cli/src/server/core/plugin.rs b/crates/biliup-cli/src/server/core/plugin.rs index 7351732..80b86c9 100644 --- a/crates/biliup-cli/src/server/core/plugin.rs +++ b/crates/biliup-cli/src/server/core/plugin.rs @@ -1,15 +1,22 @@ mod twitch; pub mod yy; -use crate::server::core::downloader::{DanmakuClient, DownloaderRuntime, DownloaderType}; +use crate::server::core::downloader::{ + DanmakuClient, DownloaderRuntime, DownloaderType, cover_downloader, +}; use crate::server::errors::AppError; use crate::server::infrastructure::context::{Context, PluginContext}; use crate::server::infrastructure::models::StreamerInfo; use async_trait::async_trait; +use axum::http::header::USER_AGENT; +use axum::http::{HeaderMap, HeaderValue}; use error_stack::Report; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::fs; +use std::path::PathBuf; use std::sync::Arc; +use tracing::{error, info}; /// 流信息结构 /// 包含直播流的详细信息 diff --git a/crates/biliup-cli/src/server/infrastructure/models/hook_step.rs b/crates/biliup-cli/src/server/infrastructure/models/hook_step.rs index fa13c84..ba78533 100644 --- a/crates/biliup-cli/src/server/infrastructure/models/hook_step.rs +++ b/crates/biliup-cli/src/server/infrastructure/models/hook_step.rs @@ -41,7 +41,7 @@ impl HookStep { } HookStep::Remove(cmd) if cmd == "rm" => { // 删除文件 - self.remove_file(video_paths).await?; + HookStep::remove_file(video_paths).await?; } HookStep::Remove(cmd) => { // 未知命令,返回错误 @@ -254,7 +254,7 @@ impl HookStep { /// /// # 参数 /// * `video_paths` - 要删除的视频文件路径列表 - async fn remove_file(&self, video_paths: &[&Path]) -> AppResult<()> { + pub(crate) async fn remove_file(video_paths: &[&Path]) -> AppResult<()> { // 逐个删除视频文件 for video_path in video_paths { info!("删除 - Removing: {}", video_path.display()); diff --git a/crates/biliup-cli/src/upload_lock.rs b/crates/biliup-cli/src/upload_lock.rs index a23e666..6970d7e 100644 --- a/crates/biliup-cli/src/upload_lock.rs +++ b/crates/biliup-cli/src/upload_lock.rs @@ -59,7 +59,10 @@ impl UploadLock { warn!("检测到过期锁文件,自动清理: {:?}", self.lock_path); let _ = fs::remove_file(&self.lock_path); } else { - info!("检测到其他进程正在使用该账号上传(锁文件: {:?})", self.lock_path); + info!( + "检测到其他进程正在使用该账号上传(锁文件: {:?})", + self.lock_path + ); return Ok(false); } } @@ -78,9 +81,7 @@ impl UploadLock { self.acquired = true; Ok(true) } - Err(e) if e.kind() == io::ErrorKind::AlreadyExists => { - Ok(false) - } + Err(e) if e.kind() == io::ErrorKind::AlreadyExists => Ok(false), Err(e) => Err(e), } } diff --git a/crates/biliup-cli/src/uploader.rs b/crates/biliup-cli/src/uploader.rs index 3e5f3b2..47904c1 100644 --- a/crates/biliup-cli/src/uploader.rs +++ b/crates/biliup-cli/src/uploader.rs @@ -20,6 +20,7 @@ use indicatif::{ProgressBar, ProgressStyle}; use qrcode::QrCode; use qrcode::render::unicode; use reqwest::Body; +use serde::{Deserialize, Serialize}; use std::ffi::OsStr; use std::io::Seek; use std::path::{Path, PathBuf}; @@ -28,7 +29,6 @@ use std::sync::{Arc, Mutex}; use std::task::Poll; use std::time::Instant; use tracing::{info, warn}; -use serde::{Serialize, Deserialize}; // 断点续传的数据结构 #[derive(Serialize, Deserialize, Debug)] @@ -67,7 +67,8 @@ impl UploadCheckpoint { fn add_video(&mut self, file_path: &Path, video: Video) { self.videos.push(video); - self.uploaded_files.push(file_path.to_string_lossy().to_string()); + self.uploaded_files + .push(file_path.to_string_lossy().to_string()); } } @@ -292,13 +293,15 @@ async fn login_by_cookies(user_cookie: PathBuf, proxy: Option<&str>) -> AppResul })?, _ => { let bili = result.change_context_lazy(|| AppError::Unknown)?; + let info = bili + .my_info() + .await + .change_context_lazy(|| AppError::Unknown)?; info!( "user: {}", - bili.my_info() - .await - .change_context_lazy(|| AppError::Unknown)?["data"]["name"] + info["data"]["name"] .as_str() - .unwrap_or_default() + .ok_or_else(|| AppError::Custom(format!("{info}no name")))? ); bili } @@ -334,7 +337,8 @@ pub async fn upload( // 生成断点续传文件路径(基于视频列表的哈希) let checkpoint_filename = format!( "biliup_checkpoint_{}.json", - video_path.iter() + video_path + .iter() .map(|p| p.to_string_lossy().to_string()) .collect::>() .join("_") @@ -357,7 +361,10 @@ pub async fn upload( }); if !checkpoint.uploaded_files.is_empty() { - info!("Found checkpoint with {} uploaded files, resuming...", checkpoint.uploaded_files.len()); + info!( + "Found checkpoint with {} uploaded files, resuming...", + checkpoint.uploaded_files.len() + ); } let mut videos = checkpoint.videos.clone(); @@ -398,8 +405,10 @@ pub async fn upload( // 使用通用的 retry 函数处理限流错误(code: 601) // 配合账号级互斥锁防止多进程同时重试 let credential_id = format!("{}", bili.login_info.token_info.mid); - let upload_lock = Arc::new(Mutex::new(UploadLock::new(&credential_id) - .map_err(|e| AppError::Custom(format!("Failed to create upload lock: {}", e)))?)); + let upload_lock = Arc::new(Mutex::new( + UploadLock::new(&credential_id) + .map_err(|e| AppError::Custom(format!("Failed to create upload lock: {}", e)))?, + )); // 在开始上传前检查是否有其他进程正在等待限流恢复 { @@ -408,7 +417,8 @@ pub async fn upload( return Err(AppError::Custom(format!( "另一个使用该账号 ({}) 的上传进程正在等待限流恢复,请稍后重试", credential_id - )).into()); + )) + .into()); } } @@ -459,13 +469,7 @@ pub async fn upload( }), ) .await - .map_err(|e| match e { - Kind::RateLimit { code, message } => AppError::Custom(format!( - "Upload rate limit exceeded after retries (code: {}): {}", - code, message - )), - _ => AppError::Unknown, - })? + .change_context_lazy(|| AppError::Custom("after retries".to_owned()))? }; // 上传成功后释放锁 @@ -506,7 +510,10 @@ pub async fn upload( if let Err(e) = checkpoint.save(&checkpoint_path) { warn!("Failed to save checkpoint: {}", e); } else { - info!("Checkpoint saved: {} files uploaded", checkpoint.uploaded_files.len()); + info!( + "Checkpoint saved: {} files uploaded", + checkpoint.uploaded_files.len() + ); } videos.push(video); diff --git a/crates/biliup/Cargo.toml b/crates/biliup/Cargo.toml index f83b92a..4b21999 100644 --- a/crates/biliup/Cargo.toml +++ b/crates/biliup/Cargo.toml @@ -12,7 +12,7 @@ serde = { workspace = true } serde_json = { workspace = true } serde_yaml = { workspace = true } serde_urlencoded = { workspace = true } -reqwest_cookie_store = "0.8.0" +reqwest_cookie_store = "0.9.0" tokio = { workspace = true } tracing = { workspace = true } rsa = "0.9.8" @@ -29,7 +29,7 @@ bytes = { workspace = true } futures = { workspace = true } bon = { workspace = true } reqwest-middleware = { version = "0.4", features = ["json"] } -reqwest-retry = "0.7.0" +reqwest-retry = "0.8.0" clap = { version = "4", features = ["derive"], optional = true } time = "0.3" m3u8-rs = "6" diff --git a/crates/biliup/src/uploader/line.rs b/crates/biliup/src/uploader/line.rs index c641cb5..ec18697 100644 --- a/crates/biliup/src/uploader/line.rs +++ b/crates/biliup/src/uploader/line.rs @@ -57,12 +57,7 @@ impl Parcel { }; if video.title.is_none() { - if let Some(filename) = self - .video_file - .filepath - .file_stem() - .and_then(OsStr::to_str) - { + if let Some(filename) = self.video_file.filepath.file_stem().and_then(OsStr::to_str) { // B站限制分P视频标题不能超过80字符,需要截断 video.title = Some(if filename.chars().count() >= 80 { Video::truncate_title(filename, 80) diff --git a/crates/stream-gears/Cargo.toml b/crates/stream-gears/Cargo.toml index 7aa4bda..b6063a0 100644 --- a/crates/stream-gears/Cargo.toml +++ b/crates/stream-gears/Cargo.toml @@ -34,22 +34,8 @@ biliup-cli = { path = "../biliup-cli"} url = { workspace = true } time = { workspace = true } chrono = { workspace = true } -fancy-regex = { version = "0.16.1"} +fancy-regex = { version = "0.17.0"} bon = { workspace = true } clap = { version = "4", features = ["derive"] } async-trait = { workspace = true } error-stack = { workspace = true } -axum-login = "0.18.0" -password-auth = "1.0.0" -tower = "0.5.2" -tower-sessions = { version = "0.14.0", default-features = false, features = [ - "signed", -] } -tower-sessions-sqlx-store = { version = "0.15.0", features = ["sqlite"] } - -# [target.'cfg(all(target_arch="aarch64", target_os="linux"))'.dependencies] -# downloader = { path = "../downloader", default-features = false , features = ["rustls-tls"] } - - -# [target.'cfg(not(all(target_arch="aarch64", target_os="linux")))'.dependencies] -# downloader = { path = "../downloader" } diff --git a/crates/stream-gears/src/server.rs b/crates/stream-gears/src/server.rs index 1d206f8..fae1f83 100644 --- a/crates/stream-gears/src/server.rs +++ b/crates/stream-gears/src/server.rs @@ -31,6 +31,7 @@ use pythonize::pythonize; use std::collections::HashMap; use std::net::ToSocketAddrs; use std::ops::Deref; +use std::path::PathBuf; use std::sync::{Arc, LazyLock, RwLock}; use time::macros::format_description; use tracing::{debug, info, warn}; @@ -68,6 +69,7 @@ pub struct PyDownloader { url: String, remark: String, danmaku: Option>>, + cfg: OnceConfig, } @@ -123,7 +125,7 @@ impl PyDownloader { self_obj.getattr("raw_stream_url")?.extract()?; let title: String = self_obj.getattr("room_title")?.extract()?; let live_cover_path: Option = - self_obj.getattr("live_cover_path")?.extract()?; + self_obj.getattr("live_cover_url")?.extract()?; let _is_download: bool = self_obj.getattr("is_download")?.extract()?; let platform: String = self_obj.getattr("platform")?.extract()?;