diff --git a/Cargo.lock b/Cargo.lock index 34ae8ea..a8c1230 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -160,9 +160,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" [[package]] name = "argon2" @@ -599,9 +599,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "c103cbbedac994e292597ab79342dbd5b306a362045095db54917d92a9fdfd92" [[package]] name = "bb8" @@ -902,9 +902,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.14" +version = "1.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" +checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" dependencies = [ "jobserver", "libc", @@ -935,9 +935,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", @@ -945,7 +945,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -982,9 +982,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" dependencies = [ "clap_builder", "clap_derive", @@ -992,9 +992,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" dependencies = [ "anstream", "anstyle", @@ -1789,9 +1789,9 @@ checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" dependencies = [ "serde", ] @@ -2006,12 +2006,12 @@ checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", - "miniz_oxide 0.8.4", + "miniz_oxide 0.8.5", ] [[package]] @@ -2330,9 +2330,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", @@ -2462,9 +2462,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hickory-proto" -version = "0.24.3" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" +checksum = "92652067c9ce6f66ce53cc38d1169daa36e6e7eb7dd3b63b5103bd9d97117248" dependencies = [ "async-trait", "cfg-if", @@ -2486,9 +2486,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.3" +version = "0.24.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf287bde7b776e85d7188e6e5db7cf410a2f9531fe82817eb87feed034c8d14" +checksum = "cbb117a1ca520e111743ab2f6688eddee69db4e0ea242545a604dce8a66fd22e" dependencies = [ "cfg-if", "futures-util", @@ -3377,9 +3377,9 @@ dependencies = [ [[package]] name = "lettre" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504273f23d9f3d2fd09c6e5fa94fafd5177ae6b83ed0df1f3b0e180052c076a9" +checksum = "5d476fe7a4a798f392ce34947aa7d53d981127e37523c5251da3c927f7fa901f" dependencies = [ "async-trait", "base64 0.22.1", @@ -3393,12 +3393,10 @@ dependencies = [ "httpdate", "idna", "mime", - "nom 7.1.3", + "nom 8.0.0", "percent-encoding", "quoted_printable", "rustls", - "rustls-pemfile", - "rustls-pki-types", "socket2", "tokio", "tokio-rustls", @@ -3408,9 +3406,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libm" @@ -3426,7 +3424,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.8.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", ] [[package]] @@ -3669,9 +3667,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.25" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "loom" @@ -3849,9 +3847,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] @@ -3944,9 +3942,9 @@ checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" [[package]] name = "native-tls" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -4428,7 +4426,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", "smallvec", "windows-targets 0.52.6", ] @@ -4515,9 +4513,9 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", "serde", @@ -4583,6 +4581,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "pgvector" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0e8871b6d7ca78348c6cd29b911b94851f3429f0cd403130ca17f26c1fb91a6" +dependencies = [ + "serde", +] + [[package]] name = "phf" version = "0.11.3" @@ -4696,9 +4703,9 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "portable-atomic" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" [[package]] name = "powerfmt" @@ -4988,8 +4995,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.1", - "zerocopy 0.8.18", + "rand_core 0.9.2", + "zerocopy 0.8.20", ] [[package]] @@ -5009,7 +5016,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.1", + "rand_core 0.9.2", ] [[package]] @@ -5023,12 +5030,12 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.18", + "zerocopy 0.8.20", ] [[package]] @@ -5058,6 +5065,7 @@ dependencies = [ "anyhow", "async-graphql", "async-graphql-axum", + "async-stream", "async-trait", "axum", "axum-extra", @@ -5166,9 +5174,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ "bitflags 2.8.0", ] @@ -5186,14 +5194,14 @@ dependencies = [ [[package]] name = "reflink-copy" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd3533fd4222b8337470456ea84d80436b4c91c53db51c372461d5f7e6eb0b4" +checksum = "9efd944f26afa2406cbbabff39fac533c9bc24b13d7f1f12e14ae3e7bdc66cdb" dependencies = [ "cfg-if", "libc", "rustix", - "windows 0.59.0", + "windows 0.60.0", ] [[package]] @@ -5313,9 +5321,9 @@ dependencies = [ [[package]] name = "reqwest-middleware" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ccd3b55e711f91a9885a2fa6fbbb2e39db1776420b062efc058c6410f7e5e3" +checksum = "64e8975513bd9a7a43aad01030e79b3498e05db14e9d945df6483e8cf9b8c4c4" dependencies = [ "anyhow", "async-trait", @@ -5350,9 +5358,9 @@ dependencies = [ [[package]] name = "reqwest-tracing" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e6153390585f6961341b50e5a1931d6be6dee4292283635903c26ef9d980d2" +checksum = "d9c88a8d9cfe3319b5adc10f3ffc3db75c7346837a1f857f8269f6361f3b2744" dependencies = [ "anyhow", "async-trait", @@ -5405,9 +5413,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" dependencies = [ "cc", "cfg-if", @@ -5781,17 +5789,18 @@ dependencies = [ [[package]] name = "sea-orm" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00733e5418e8ae3758cdb988c3654174e716230cc53ee2cb884207cf86a23029" +checksum = "13fba7b2c749b2d0a00303d5cb13e6761e39a4172554bdf930852cac4e7aeabd" dependencies = [ "async-stream", "async-trait", "bigdecimal", "chrono", - "futures", + "futures-util", "log", "ouroboros", + "pgvector", "rust_decimal", "sea-orm-macros", "sea-query", @@ -5809,9 +5818,9 @@ dependencies = [ [[package]] name = "sea-orm-cli" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0646647444d3a0366e30f26ff39f1656cc062b3dbf1f2e3d70cd9dc244b62cf7" +checksum = "75ee4e47ca95a6100c875a6066f367a5f9713f04a714f589493b46b6fd7ae4d9" dependencies = [ "chrono", "clap", @@ -5826,9 +5835,9 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98408f82fb4875d41ef469a79944a7da29767c7b3e4028e22188a3dd613b10f" +checksum = "2568cff8d35d5150b4276cc0dd766192a587f64b6ece60ae3706e0872c4eb209" dependencies = [ "heck 0.4.1", "proc-macro-crate", @@ -5841,14 +5850,13 @@ dependencies = [ [[package]] name = "sea-orm-migration" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed0bea0d92241722718e239d899c051066a5fb259ced9986b9f60e488e076" +checksum = "a5a341919106dee5aae393293d922b23a33e99eda7bfe6871d822f3e157d9b09" dependencies = [ "async-trait", "clap", "dotenvy", - "futures", "sea-orm", "sea-orm-cli", "sea-schema", @@ -6035,9 +6043,9 @@ checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -6065,9 +6073,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", @@ -6076,9 +6084,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -6681,9 +6689,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stacker" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d08feb8f695b465baed819b03c128dc23f57a694510ab1f06c77f763975685e" +checksum = "d9156ebd5870ef293bfb43f91c7a74528d363ec0d424afe24160ed5a4343d08a" dependencies = [ "cc", "cfg-if", @@ -6719,9 +6727,9 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ "phf_generator", "phf_shared", @@ -7537,9 +7545,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-normalization" @@ -7624,9 +7632,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f41ffb7cf259f1ecc2876861a17e7142e63ead296f671f81f6ae85903e0d6" +checksum = "bd8dcafa1ca14750d8d7a05aa05988c17aab20886e1f3ae33a40223c58d92ef7" dependencies = [ "getrandom 0.3.1", "rand 0.9.0", @@ -7861,7 +7869,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.8", + "redox_syscall 0.5.9", "wasite", ] @@ -7924,12 +7932,24 @@ dependencies = [ [[package]] name = "windows" -version = "0.59.0" +version = "0.60.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" +checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" dependencies = [ - "windows-core 0.59.0", - "windows-targets 0.53.0", + "windows-collections", + "windows-core 0.60.1", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5467f79cc1ba3f52ebb2ed41dbb459b8e7db636cc3429458d9a852e15bc24dec" +dependencies = [ + "windows-core 0.60.1", ] [[package]] @@ -7956,15 +7976,25 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.59.0" +version = "0.60.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" +checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" dependencies = [ "windows-implement 0.59.0", "windows-interface 0.59.0", - "windows-result 0.3.0", - "windows-strings 0.3.0", - "windows-targets 0.53.0", + "windows-link", + "windows-result 0.3.1", + "windows-strings 0.3.1", +] + +[[package]] +name = "windows-future" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a787db4595e7eb80239b74ce8babfb1363d8e343ab072f2ffe901400c03349f0" +dependencies = [ + "windows-core 0.60.1", + "windows-link", ] [[package]] @@ -8011,6 +8041,22 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-numerics" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "005dea54e2f6499f2cee279b8f703b3cf3b5734a2d8d21867c8f44003182eeed" +dependencies = [ + "windows-core 0.60.1", + "windows-link", +] + [[package]] name = "windows-registry" version = "0.2.0" @@ -8033,11 +8079,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d08106ce80268c4067c0571ca55a9b4e9516518eaa1a1fe9b37ca403ae1d1a34" +checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" dependencies = [ - "windows-targets 0.53.0", + "windows-link", ] [[package]] @@ -8052,11 +8098,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b888f919960b42ea4e11c2f408fadb55f78a9f236d5eef084103c8ce52893491" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-targets 0.53.0", + "windows-link", ] [[package]] @@ -8110,29 +8156,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -8145,12 +8175,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -8163,12 +8187,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -8181,24 +8199,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -8211,12 +8217,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -8229,12 +8229,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -8247,12 +8241,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -8265,17 +8253,11 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" dependencies = [ "memchr", ] @@ -8379,11 +8361,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79386d31a42a4996e3336b0919ddb90f81112af416270cff95b5f5af22b839c2" +checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" dependencies = [ - "zerocopy-derive 0.8.18", + "zerocopy-derive 0.8.20", ] [[package]] @@ -8399,9 +8381,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76331675d372f91bf8d17e13afbd5fe639200b73d01f0fc748bb059f9cca2db7" +checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" dependencies = [ "proc-macro2", "quote", @@ -8459,27 +8441,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", "pkg-config", diff --git a/apps/recorder/Cargo.toml b/apps/recorder/Cargo.toml index 794c7fa..ce1579e 100644 --- a/apps/recorder/Cargo.toml +++ b/apps/recorder/Cargo.toml @@ -42,7 +42,7 @@ axum = "0.8" uuid = { version = "1.6.0", features = ["v4"] } tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } sea-orm-migration = { version = "1.1", features = ["runtime-tokio-rustls"] } -reqwest = { version = "0.12", features = [ +reqwest = { version = "0.12", default-features = false, features = [ "charset", "http2", "json", @@ -100,7 +100,7 @@ axum-extra = "0.10.0" tower-http = "0.6.2" serde_yaml = "0.9.34" tera = "1.20.0" -openidconnect = "4" +openidconnect = { version = "4", features = ["rustls-tls"] } http-cache-reqwest = { version = "0.15", features = [ "manager-cacache", "manager-moka", @@ -117,6 +117,7 @@ nom = "8.0.0" secrecy = { version = "0.10.3", features = ["serde"] } http = "1.2.0" cookie = "0.18.1" +async-stream = "0.3.6" [dev-dependencies] serial_test = "3" diff --git a/apps/recorder/src/app/mod.rs b/apps/recorder/src/app/mod.rs index 90bd6ae..4c4b144 100644 --- a/apps/recorder/src/app/mod.rs +++ b/apps/recorder/src/app/mod.rs @@ -10,16 +10,16 @@ use async_trait::async_trait; pub use ext::AppContextExt; use itertools::Itertools; use loco_rs::{ + Result, app::{AppContext, Hooks}, - boot::{create_app, BootResult, StartMode}, + boot::{BootResult, StartMode, create_app}, cache, config::Config, - controller::{middleware, middleware::MiddlewareLayer, AppRoutes}, + controller::{AppRoutes, middleware, middleware::MiddlewareLayer}, db::truncate_table, environment::Environment, prelude::*, task::Tasks, - Result, }; use once_cell::sync::OnceCell; diff --git a/apps/recorder/src/extract/mikan/web_extract.rs b/apps/recorder/src/extract/mikan/web_extract.rs index 8ef0eb9..bd95a3c 100644 --- a/apps/recorder/src/extract/mikan/web_extract.rs +++ b/apps/recorder/src/extract/mikan/web_extract.rs @@ -1,6 +1,8 @@ use std::borrow::Cow; +use async_stream::try_stream; use bytes::Bytes; +use futures::Stream; use itertools::Itertools; use loco_rs::app::AppContext; use scraper::{Html, Selector}; @@ -357,134 +359,140 @@ pub async fn extract_mikan_bangumi_meta_from_bangumi_homepage( * @logined-required */ #[instrument(skip_all, fields(my_bangumi_page_url = my_bangumi_page_url.as_str()))] -pub async fn extract_mikan_bangumis_meta_from_my_bangumi_page( +pub fn extract_mikan_bangumis_meta_from_my_bangumi_page( http_client: &AppMikanClient, my_bangumi_page_url: Url, -) -> Result, RecorderError> { - let mikan_base_url = Url::parse(&my_bangumi_page_url.origin().unicode_serialization())?; +) -> impl Stream> { + try_stream! { + let mikan_base_url = Url::parse(&my_bangumi_page_url.origin().unicode_serialization())?; - let content = fetch_html(http_client, my_bangumi_page_url.clone()).await?; + let content = fetch_html(http_client, my_bangumi_page_url.clone()).await?; - let fansub_container_selector = - &Selector::parse(".js-expand_bangumi-subgroup.js-subscribed").unwrap(); - let fansub_title_selector = &Selector::parse(".tag-res-name[title]").unwrap(); - let fansub_id_selector = - &Selector::parse(".active[data-subtitlegroupid][data-bangumiid]").unwrap(); - - let bangumi_iters = { let bangumi_container_selector = &Selector::parse(".sk-bangumi .an-ul>li").unwrap(); - let bangumi_info_selector = &Selector::parse(".an-info a.an-text").unwrap(); let bangumi_poster_selector = &Selector::parse("span[data-src][data-bangumiid], span[data-bangumiid][style]") .unwrap(); - let html = Html::parse_document(&content); + let fansub_container_selector = + &Selector::parse(".js-expand_bangumi-subgroup.js-subscribed").unwrap(); + let fansub_title_selector = &Selector::parse(".tag-res-name[title]").unwrap(); + let fansub_id_selector = + &Selector::parse(".active[data-subtitlegroupid][data-bangumiid]").unwrap(); - html.select(bangumi_container_selector) - .filter_map(|bangumi_elem| { - let title_and_href_elem = bangumi_elem.select(bangumi_info_selector).next(); - let poster_elem = bangumi_elem.select(bangumi_poster_selector).next(); - if let (Some(bangumi_home_page_url), Some(bangumi_title)) = ( - title_and_href_elem.and_then(|elem| elem.attr("href")), - title_and_href_elem.and_then(|elem| elem.attr("title")), - ) { - let origin_poster_src = poster_elem.and_then(|ele| { - ele.attr("data-src") - .and_then(|data_src| { - extract_image_src_from_str(data_src, &mikan_base_url) - }) - .or_else(|| { - ele.attr("style").and_then(|style| { - extract_background_image_src_from_style_attr( - style, - &mikan_base_url, - ) + let bangumi_iters = { + let html = Html::parse_document(&content); + + html.select(bangumi_container_selector) + .filter_map(|bangumi_elem| { + let title_and_href_elem = bangumi_elem.select(bangumi_info_selector).next(); + let poster_elem = bangumi_elem.select(bangumi_poster_selector).next(); + if let (Some(bangumi_home_page_url), Some(bangumi_title)) = ( + title_and_href_elem.and_then(|elem| elem.attr("href")), + title_and_href_elem.and_then(|elem| elem.attr("title")), + ) { + let origin_poster_src = poster_elem.and_then(|ele| { + ele.attr("data-src") + .and_then(|data_src| { + extract_image_src_from_str(data_src, &mikan_base_url) }) - }) - }); - let bangumi_title = bangumi_title.to_string(); - let bangumi_home_page_url = - my_bangumi_page_url.join(bangumi_home_page_url).ok()?; - let MikanBangumiHomepage { - mikan_bangumi_id, .. - } = extract_mikan_bangumi_id_from_homepage(&bangumi_home_page_url)?; - if let Some(origin_poster_src) = origin_poster_src.as_ref() { - tracing::trace!( - origin_poster_src = origin_poster_src.as_str(), + .or_else(|| { + ele.attr("style").and_then(|style| { + extract_background_image_src_from_style_attr( + style, + &mikan_base_url, + ) + }) + }) + }); + let bangumi_title = bangumi_title.to_string(); + let bangumi_home_page_url = + my_bangumi_page_url.join(bangumi_home_page_url).ok()?; + let MikanBangumiHomepage { + mikan_bangumi_id, .. + } = extract_mikan_bangumi_id_from_homepage(&bangumi_home_page_url)?; + if let Some(origin_poster_src) = origin_poster_src.as_ref() { + tracing::trace!( + origin_poster_src = origin_poster_src.as_str(), + bangumi_title, + mikan_bangumi_id, + "bangumi info extracted" + ); + } else { + tracing::warn!( + bangumi_title, + mikan_bangumi_id, + "bangumi info extracted, but failed to extract poster_src" + ); + } + let bangumi_expand_info_url = build_mikan_bangumi_expand_info_url( + mikan_base_url.clone(), + &mikan_bangumi_id, + ); + Some(( bangumi_title, mikan_bangumi_id, - "bangumi info extracted" - ); + bangumi_expand_info_url, + origin_poster_src, + )) } else { - tracing::warn!( - bangumi_title, - mikan_bangumi_id, - "bangumi info extracted, but failed to extract poster_src" - ); + None } - let bangumi_expand_info_url = build_mikan_bangumi_expand_info_url( - mikan_base_url.clone(), - &mikan_bangumi_id, - ); - Some(( - bangumi_title, - mikan_bangumi_id, - bangumi_expand_info_url, - origin_poster_src, - )) - } else { - None - } - }) - .collect_vec() - }; + }) + .collect_vec() + }; - let mut bangumi_list = vec![]; - - for (bangumi_title, mikan_bangumi_id, bangumi_expand_info_url, origin_poster_src) in + for (bangumi_title, mikan_bangumi_id, bangumi_expand_info_url, origin_poster_src) in bangumi_iters - { - let bangumi_expand_info_content = fetch_html(http_client, bangumi_expand_info_url).await?; - let bangumi_expand_info_fragment = Html::parse_fragment(&bangumi_expand_info_content); - for fansub_info in bangumi_expand_info_fragment.select(fansub_container_selector) { - if let (Some(fansub_name), Some(mikan_fansub_id)) = ( - fansub_info - .select(fansub_title_selector) - .next() - .and_then(|ele| ele.attr("title")), - fansub_info - .select(fansub_id_selector) - .next() - .and_then(|ele| ele.attr("data-subtitlegroupid")), - ) { + { + if let Some((fansub_name, mikan_fansub_id)) = { + let bangumi_expand_info_content = fetch_html(http_client, bangumi_expand_info_url).await?; + let bangumi_expand_info_fragment = Html::parse_fragment(&bangumi_expand_info_content); + bangumi_expand_info_fragment.select(fansub_container_selector).next().and_then(|fansub_info| { + if let (Some(fansub_name), Some(mikan_fansub_id)) = ( + fansub_info + .select(fansub_title_selector) + .next() + .and_then(|ele| ele.attr("title")) + .map(String::from), + fansub_info + .select(fansub_id_selector) + .next() + .and_then(|ele| ele.attr("data-subtitlegroupid")) + .map(String::from) + ) { + Some((fansub_name, mikan_fansub_id)) + } else { + None + } + }) + } { tracing::trace!( - fansub_name = &fansub_name, + fansub_name, mikan_fansub_id, "subscribed fansub extracted" ); - bangumi_list.push(MikanBangumiMeta { + yield MikanBangumiMeta { homepage: build_mikan_bangumi_homepage( mikan_base_url.clone(), - mikan_bangumi_id.as_str(), - Some(mikan_fansub_id), + &mikan_bangumi_id, + Some(&mikan_fansub_id), ), bangumi_title: bangumi_title.to_string(), mikan_bangumi_id: mikan_bangumi_id.to_string(), - mikan_fansub_id: Some(mikan_fansub_id.to_string()), - fansub: Some(fansub_name.to_string()), + mikan_fansub_id: Some(mikan_fansub_id), + fansub: Some(fansub_name), origin_poster_src: origin_poster_src.clone(), - }) + }; } } } - - Ok(bangumi_list) } #[cfg(test)] mod test { #![allow(unused_variables)] use color_eyre::eyre; + use futures::{TryStreamExt, pin_mut}; use http::header; use rstest::{fixture, rstest}; use secrecy::SecretString; @@ -639,8 +647,11 @@ mod test { let bangumi_metas = extract_mikan_bangumis_meta_from_my_bangumi_page( &mikan_client, my_bangumi_page_url.clone(), - ) - .await?; + ); + + pin_mut!(bangumi_metas); + + let bangumi_metas = bangumi_metas.try_collect::>().await?; assert!(bangumi_metas.is_empty()); @@ -679,11 +690,13 @@ mod test { Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0", )), })?; + let bangumi_metas = extract_mikan_bangumis_meta_from_my_bangumi_page( &mikan_client_with_cookie, my_bangumi_page_url, - ) - .await?; + ); + pin_mut!(bangumi_metas); + let bangumi_metas = bangumi_metas.try_collect::>().await?; assert!(!bangumi_metas.is_empty()); diff --git a/apps/recorder/src/tasks/create_mikan_bangumi_subscriptions_from_my_bangumi_page.rs b/apps/recorder/src/tasks/create_mikan_bangumi_subscriptions_from_my_bangumi_page.rs index 77fde95..5e11047 100644 --- a/apps/recorder/src/tasks/create_mikan_bangumi_subscriptions_from_my_bangumi_page.rs +++ b/apps/recorder/src/tasks/create_mikan_bangumi_subscriptions_from_my_bangumi_page.rs @@ -1,9 +1,9 @@ +use futures::{TryStreamExt, pin_mut}; use loco_rs::prelude::*; use crate::{ - app::AppContextExt, extract::mikan::{ - MikanAuthSecrecy, web_extract::extract_mikan_bangumis_meta_from_my_bangumi_page, + MikanAuthSecrecy }, }; @@ -31,15 +31,21 @@ impl Task for CreateMikanRSSFromMyBangumiTask { .get_mikan_client() .fork_with_auth(self.auth_secrecy.clone())?; - // TODO - let _bangumi_metas = extract_mikan_bangumis_meta_from_my_bangumi_page( - &mikan_client, - mikan_client - .base_url() - .join("/Home/MyBangumi") - .map_err(loco_rs::Error::wrap)?, - ) - .await?; + { + let bangumi_metas = extract_mikan_bangumis_meta_from_my_bangumi_page( + &mikan_client, + mikan_client + .base_url() + .join("/Home/MyBangumi") + .map_err(loco_rs::Error::wrap)?, + ); + + pin_mut!(bangumi_metas); + + let bangumi_metas = bangumi_metas.try_collect::>().await?; + + tokio::sync::broadcast:: + } Ok(()) }