diff --git a/Cargo.lock b/Cargo.lock index 3119a2d..9882b12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,40 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "aho-corasick" -version = "0.7.15" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" dependencies = [ "memchr", ] -[[package]] -name = "async-stream" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3670df70cbc01729f901f94c887814b3c68db038aad1329a418bae178bc5295c" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3548b8efc9f8e8a5a0a2808c5bd8451a9031b9e5b879a79590304ae928b0a70" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -44,27 +25,27 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" -version = "3.6.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "bytes" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -74,20 +55,30 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "2.33.3" +version = "3.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +checksum = "7c167e37342afc5f33fd87bbc870cedd020d2a6dffa05d45ccd9241fbdd146db" dependencies = [ "bitflags", + "clap_lex", + "indexmap", "textwrap", - "unicode-width", +] + +[[package]] +name = "clap_lex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189ddd3b5d32a70b35e7686054371742a937b0d99128e76dde6340210e966669" +dependencies = [ + "os_str_bytes", ] [[package]] name = "core-foundation" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ "core-foundation-sys", "libc", @@ -95,19 +86,28 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" [[package]] name = "encoding_rs" -version = "0.8.26" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "801bbab217d7f79c0062f4f7205b5d4427c6d1a7bd7aafdd1475f7c59d62b283" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] +[[package]] +name = "fastrand" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +dependencies = [ + "instant", +] + [[package]] name = "fnv" version = "1.0.7" @@ -131,9 +131,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" dependencies = [ "matches", "percent-encoding", @@ -141,36 +141,36 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" +checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" +checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" [[package]] name = "futures-sink" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" +checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" [[package]] name = "futures-task" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" +checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" [[package]] name = "futures-util" -version = "0.3.12" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" +checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" dependencies = [ "futures-core", "futures-task", @@ -178,22 +178,11 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "getrandom" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - [[package]] name = "h2" -version = "0.3.0" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b67e66362108efccd8ac053abafc8b7a8d86a37e6e48fc4f6f7485eb5e9e6a5" +checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" dependencies = [ "bytes", "fnv", @@ -206,12 +195,11 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "tracing-futures", ] [[package]] name = "hanimers" -version = "0.1.8" +version = "0.1.9" dependencies = [ "clap", "quick-xml", @@ -224,15 +212,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "http" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" dependencies = [ "bytes", "fnv", @@ -241,31 +229,32 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2861bd27ee074e5ee891e8b539837a9430012e249d7f0ca2d795650f579c1994" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ "bytes", "http", + "pin-project-lite", ] [[package]] name = "httparse" -version = "1.3.4" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" [[package]] name = "hyper" -version = "0.14.2" +version = "0.14.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12219dc884514cb4a6a03737f4413c0e01c23a1b059b0156004b23f1e19dccbe" +checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" dependencies = [ "bytes", "futures-channel", @@ -277,7 +266,7 @@ dependencies = [ "httparse", "httpdate", "itoa", - "pin-project 1.0.4", + "pin-project-lite", "socket2", "tokio", "tower-service", @@ -300,9 +289,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" dependencies = [ "matches", "unicode-bidi", @@ -311,31 +300,40 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", "hashbrown", ] [[package]] -name = "ipnet" -version = "2.3.0" +name = "instant" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" -version = "0.4.7" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" [[package]] name = "js-sys" -version = "0.3.47" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cfb73131c35423a367daf8cbd24100af0d077668c8c2943f0e7dd775fef0f65" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -348,30 +346,30 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.84" +version = "0.2.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cca32fa0182e8c0989459524dc356b8f2b5c10f1b9eb521b7d182c03cf8c5ff" +checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" [[package]] name = "log" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ "cfg-if", ] [[package]] name = "matches" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "mime" @@ -381,32 +379,32 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "mio" -version = "0.7.7" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50ae3f04d169fcc9bde0b547d1c205219b7157e07ded9c5aff03e0637cb3ed7" +checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9" dependencies = [ "libc", "log", "miow", "ntapi", + "wasi", "winapi", ] [[package]] name = "miow" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "socket2", "winapi", ] [[package]] name = "native-tls" -version = "0.2.7" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -422,44 +420,44 @@ dependencies = [ [[package]] name = "ntapi" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" dependencies = [ "winapi", ] [[package]] name = "once_cell" -version = "1.7.2" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "openssl" -version = "0.10.32" +version = "0.10.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038d43985d1ddca7a9900630d8cd031b56e4794eecc2e9ea39dd17aa04399a70" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" dependencies = [ "bitflags", "cfg-if", "foreign-types", - "lazy_static", "libc", + "once_cell", "openssl-sys", ] [[package]] name = "openssl-probe" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.60" +version = "0.9.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921fc71883267538946025deffb622905ecad223c28efbfdef9bb59a0175f3e6" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" dependencies = [ "autocfg", "cc", @@ -468,57 +466,23 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "os_str_bytes" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" + [[package]] name = "percent-encoding" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" -[[package]] -name = "pin-project" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" -dependencies = [ - "pin-project-internal 0.4.27", -] - -[[package]] -name = "pin-project" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b70b68509f17aa2857863b6fa00bf21fc93674c7a8893de2f469f6aa7ca2f2" -dependencies = [ - "pin-project-internal 1.0.4", -] - -[[package]] -name = "pin-project-internal" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa25a6393f22ce819b0f50e0be89287292fda8d425be38ee0ca14c4931d9e71" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -528,21 +492,15 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.19" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" dependencies = [ "unicode-xid", ] @@ -558,79 +516,38 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "redox_syscall" -version = "0.2.4" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.4.3" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", "regex-syntax", - "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.22" +version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" [[package]] name = "remove_dir_all" @@ -643,15 +560,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.0" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd281b1030aa675fb90aa994d07187645bb3c8fc756ca766e7c3070b439de9de" +checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", @@ -665,6 +583,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "serde", + "serde_json", "serde_urlencoded", "tokio", "tokio-native-tls", @@ -677,9 +596,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "schannel" @@ -693,9 +612,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.0.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1759c2e3c8580017a484a7ac56d3abc5a6c1feadf88db2f3633f12ae4268c69" +checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" dependencies = [ "bitflags", "core-foundation", @@ -706,9 +625,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.0.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99b9d5e26d2a71633cc4f2ebae7cc9f874044e0c351a27e17892d76dce5678b" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" dependencies = [ "core-foundation-sys", "libc", @@ -716,18 +635,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.123" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.123" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -736,9 +655,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.61" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" dependencies = [ "itoa", "ryu", @@ -747,9 +666,9 @@ dependencies = [ [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", "itoa", @@ -759,26 +678,25 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.2" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" dependencies = [ - "cfg-if", "libc", "winapi", ] [[package]] name = "syn" -version = "1.0.60" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" dependencies = [ "proc-macro2", "quote", @@ -787,13 +705,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -801,27 +719,15 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.11.0" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -834,16 +740,18 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.4.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722" +checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b" dependencies = [ - "autocfg", "bytes", "libc", "memchr", "mio", + "once_cell", "pin-project-lite", + "socket2", + "winapi", ] [[package]] @@ -856,31 +764,18 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76066865172052eb8796c686f0b441a93df8b08d40a950b062ffb9a426f00edd" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - [[package]] name = "tokio-util" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "feb971a26599ffd28066d387f109746df178eff14d5ea1e235015c5601967a4b" +checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ - "async-stream", "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", - "tokio-stream", + "tracing", ] [[package]] @@ -891,32 +786,34 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.22" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if", "pin-project-lite", + "tracing-attributes", "tracing-core", ] [[package]] -name = "tracing-core" -version = "0.1.17" +name = "tracing-attributes" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" dependencies = [ - "lazy_static", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tracing-futures" -version = "0.2.4" +name = "tracing-core" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ - "pin-project 0.4.27", - "tracing", + "lazy_static", ] [[package]] @@ -927,39 +824,30 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" -dependencies = [ - "matches", -] +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] name = "unicode-normalization" -version = "0.1.16" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "url" -version = "2.2.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna", @@ -969,9 +857,9 @@ dependencies = [ [[package]] name = "vcpkg" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "want" @@ -985,27 +873,25 @@ dependencies = [ [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.70" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if", - "serde", - "serde_json", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.70" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -1018,9 +904,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.20" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de431a2910c86679c34283a33f66f4e4abd7e0aec27b6669060148872aadf94" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" dependencies = [ "cfg-if", "js-sys", @@ -1030,9 +916,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.70" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1040,9 +926,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.70" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -1053,15 +939,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.70" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.47" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c40dc691fc48003eba817c38da7113c15698142da971298003cac3ef175680b3" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -1091,9 +977,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winreg" -version = "0.7.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" dependencies = [ "winapi", ] diff --git a/Cargo.toml b/Cargo.toml index c785030..6dde646 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hanimers" -version = "0.1.8" +version = "0.1.9" authors = ["blank X "] edition = "2018" @@ -10,10 +10,10 @@ edition = "2018" lto = true [dependencies] -tokio = { version = "1.4", features = ["rt"] } +tokio = { version = "1.18", features = ["rt"] } reqwest = "0.11" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" quick-xml = "0.22" -clap = { version = "2.33", default-features = false } -regex = "1.4" +clap = { version = "3.1", features = ["std"], default-features = false } +regex = "1.5" diff --git a/src/commands/download.rs b/src/commands/download.rs index 42196a4..b73759d 100644 --- a/src/commands/download.rs +++ b/src/commands/download.rs @@ -1,16 +1,16 @@ use crate::utils; +use clap::ArgMatches; +use reqwest::redirect::Policy; +use reqwest::Client; +use std::collections::HashMap; use std::fs::rename; use std::path::Path; use std::process::{exit, Command}; -use std::collections::HashMap; -use clap::ArgMatches; -use reqwest::Client; -use reqwest::redirect::Policy; const MAX_DOWNLOAD_ATTEMPTS: i32 = 5; -pub async fn download(arg_m: &ArgMatches<'_>) { +pub async fn download(arg_m: &ArgMatches) { let print_only = arg_m.is_present("print"); let resolution = arg_m.value_of("resolution"); let ids = arg_m.values_of("id").unwrap().collect::>(); @@ -42,18 +42,20 @@ pub async fn download(arg_m: &ArgMatches<'_>) { for server in hentai_info.state.data.video.videos_manifest.servers { let mut to_hashmap = match server.is_permanent { true => perm_urls.clone(), - false => temp_urls.clone() + false => temp_urls.clone(), }; for stream in server.streams { if stream.url.is_empty() { continue; } - if server.is_permanent && Some(stream.height.as_str()) == resolution { + if server.is_permanent && Some(stream.height.as_str()) == resolution + { download_url = Some((stream.url, stream.filesize_mbs)); break; } if !to_hashmap.contains_key(&stream.height) { - to_hashmap.insert(stream.height, (stream.url, stream.filesize_mbs)); + to_hashmap + .insert(stream.height, (stream.url, stream.filesize_mbs)); }; } if download_url.is_some() { @@ -61,15 +63,18 @@ pub async fn download(arg_m: &ArgMatches<'_>) { } match server.is_permanent { true => perm_urls.extend(to_hashmap), - false => temp_urls.extend(to_hashmap) + false => temp_urls.extend(to_hashmap), }; } if download_url.is_none() { if resolution.is_some() { - download_url = temp_urls.get(resolution.unwrap()).map(|i| (i.0.to_string(), i.1)); + download_url = temp_urls + .get(resolution.unwrap()) + .map(|i| (i.0.to_string(), i.1)); } if download_url.is_none() { - download_url = magic_thing(perm_urls).or_else(|| { magic_thing(temp_urls) }); + download_url = + magic_thing(perm_urls).or_else(|| magic_thing(temp_urls)); if download_url.is_none() { eprintln!("Failed to get {}: cannot get download url", id); return_fail = true; @@ -84,8 +89,27 @@ pub async fn download(arg_m: &ArgMatches<'_>) { let mut fail_dl = true; let tmp_filename = format!("{}.tmp", &slug); for i in 0..MAX_DOWNLOAD_ATTEMPTS { - eprintln!("Downloading {} ({}MB, attempt {})", &filename, filesize_mbs, i); - match Command::new("ffmpeg").args(&["-v", "warning", "-stats", "-nostdin", "-y", "-i", &download_url, "-c", "copy", "-f", "matroska", &tmp_filename]).spawn() { + eprintln!( + "Downloading {} ({}MB, attempt {})", + &filename, filesize_mbs, i + ); + match Command::new("ffmpeg") + .args(&[ + "-v", + "warning", + "-stats", + "-nostdin", + "-y", + "-i", + &download_url, + "-c", + "copy", + "-f", + "matroska", + &tmp_filename, + ]) + .spawn() + { Ok(mut child) => { match child.wait() { Ok(exit_status) => { @@ -93,16 +117,27 @@ pub async fn download(arg_m: &ArgMatches<'_>) { fail_dl = false; match rename(&tmp_filename, &filename) { Ok(_) => (), - Err(err) => eprintln!("Failed to rename {} to {} due to {}", &tmp_filename, &filename, err) + Err(err) => eprintln!( + "Failed to rename {} to {} due to {}", + &tmp_filename, &filename, err + ), }; break; } - eprintln!("ffmpeg exited with {:?}", exit_status.code()); - }, - Err(err) => eprintln!("Failed to wait on ffmpeg process due to {}", err) + eprintln!( + "ffmpeg exited with {:?}", + exit_status.code() + ); + } + Err(err) => eprintln!( + "Failed to wait on ffmpeg process due to {}", + err + ), }; - }, - Err(err) => eprintln!("Failed to spawn ffmpeg process due to {}", err) + } + Err(err) => { + eprintln!("Failed to spawn ffmpeg process due to {}", err) + } }; } if fail_dl { @@ -110,13 +145,13 @@ pub async fn download(arg_m: &ArgMatches<'_>) { return_fail = true; } } - }, + } None => { eprintln!("Failed to get {}: does not exist", id); return_fail = true; } }; - }, + } Err(err) => { eprintln!("Failed to get {}: {}", id, err); return_fail = true; @@ -147,7 +182,7 @@ fn magic_thing(map: HashMap) -> Option<(String, i32)> { keys.sort(); match keys.pop() { Some(key) => map.get(key.as_str()).map(|i| i.clone()), - None => None + None => None, } } } diff --git a/src/commands/mod.rs b/src/commands/mod.rs index a336039..155d1d1 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,6 +1,6 @@ -mod view; -mod search; mod download; -pub use view::view; -pub use search::{search, AVALIABLE_TAGS}; +mod search; +mod view; pub use download::download; +pub use search::{search, AVALIABLE_TAGS}; +pub use view::view; diff --git a/src/commands/search.rs b/src/commands/search.rs index 0414ba9..d5f3ec7 100644 --- a/src/commands/search.rs +++ b/src/commands/search.rs @@ -1,17 +1,88 @@ use crate::utils; -use std::process::exit; use clap::ArgMatches; use reqwest::Client; +use std::process::exit; -pub const AVALIABLE_TAGS: &[&str] = &["3D", "Ahegao", "Anal", "BDSM", "Big Boobs", "Blow Job", "Bondage", "Boob Job", "Censored", "Comedy", "Cosplay", "Creampie", "Dark Skin", "Facial", "Fantasy", "Filmed", "Foot Job", "Futanari", "Gangbang", "Glasses", "Hand Job", "Harem", "HD", "Horror", "Incest", "Inflation", "Lactation", "Loli", "Maid", "Masturbation", "Milf", "Mind Break", "Mind Control", "Monster", "Nekomimi", "NTR", "Nurse", "Orgy", "Plot", "POV", "Pregnant", "Public Sex", "Rape", "Reverse Rape", "Rimjob", "Scat", "School Girl", "Shota", "Softcore", "Swimsuit", "Teacher", "Tentacle", "Threesome", "Toys", "Trap", "Tsundere", "Ugly Bastard", "Uncensored", "Vanilla", "Virgin", "Watersports", "X-Ray", "Yaoi", "Yuri"]; +pub const AVALIABLE_TAGS: &[&str] = &[ + "3D", + "Ahegao", + "Anal", + "BDSM", + "Big Boobs", + "Blow Job", + "Bondage", + "Boob Job", + "Censored", + "Comedy", + "Cosplay", + "Creampie", + "Dark Skin", + "Facial", + "Fantasy", + "Filmed", + "Foot Job", + "Futanari", + "Gangbang", + "Glasses", + "Hand Job", + "Harem", + "HD", + "Horror", + "Incest", + "Inflation", + "Lactation", + "Loli", + "Maid", + "Masturbation", + "Milf", + "Mind Break", + "Mind Control", + "Monster", + "Nekomimi", + "NTR", + "Nurse", + "Orgy", + "Plot", + "POV", + "Pregnant", + "Public Sex", + "Rape", + "Reverse Rape", + "Rimjob", + "Scat", + "School Girl", + "Shota", + "Softcore", + "Swimsuit", + "Teacher", + "Tentacle", + "Threesome", + "Toys", + "Trap", + "Tsundere", + "Ugly Bastard", + "Uncensored", + "Vanilla", + "Virgin", + "Watersports", + "X-Ray", + "Yaoi", + "Yuri", +]; -pub async fn search(arg_m: &ArgMatches<'_>) { +pub async fn search(arg_m: &ArgMatches) { let broad_search = arg_m.is_present("broad"); let tags = arg_m.values_of("tags").unwrap_or_default().collect(); - let query = arg_m.values_of("query").unwrap_or_default().collect::>().join(" "); + let query = arg_m + .values_of("query") + .unwrap_or_default() + .collect::>() + .join(" "); let query = query.trim(); - let results = utils::search(Client::new(), query, tags, broad_search).await.unwrap(); + let results = utils::search(Client::new(), query, tags, broad_search) + .await + .unwrap(); if results.is_empty() { eprintln!("No results found"); exit(1); diff --git a/src/commands/view.rs b/src/commands/view.rs index f5def35..964d194 100644 --- a/src/commands/view.rs +++ b/src/commands/view.rs @@ -1,12 +1,12 @@ use crate::utils; -use std::process::exit; use clap::ArgMatches; -use reqwest::Client; use reqwest::redirect::Policy; +use reqwest::Client; +use std::process::exit; extern crate tokio; -pub async fn view(arg_m: &ArgMatches<'_>) { +pub async fn view(arg_m: &ArgMatches) { let policy = Policy::custom(|attempt| { if attempt.previous().len() > 10 { attempt.error("too many redirects") @@ -17,14 +17,19 @@ pub async fn view(arg_m: &ArgMatches<'_>) { } }); let client = Client::builder().redirect(policy).build().unwrap(); - let handles = arg_m.values_of("id").unwrap().map(|id| { - let cloned_client = client.clone(); - let id = id.to_string(); - let cid = id.clone(); - (tokio::spawn(async move { - utils::get_hentai(cloned_client, &cid).await - }), id) - }).collect::>(); + let handles = arg_m + .values_of("id") + .unwrap() + .map(|id| { + let cloned_client = client.clone(); + let id = id.to_string(); + let cid = id.clone(); + ( + tokio::spawn(async move { utils::get_hentai(cloned_client, &cid).await }), + id, + ) + }) + .collect::>(); let mut fail = false; let mut one_done = false; for handle in handles { @@ -49,7 +54,7 @@ pub async fn view(arg_m: &ArgMatches<'_>) { println!(""); } println!("{}", &hentai); - }, + } None => { if one_done { eprintln!(""); @@ -58,7 +63,7 @@ pub async fn view(arg_m: &ArgMatches<'_>) { fail = true; } }; - }, + } Err(err) => { if one_done { eprintln!(""); diff --git a/src/main.rs b/src/main.rs index 62ae4b4..ab56631 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,65 +1,65 @@ mod commands; -mod unescape; mod structs; +mod unescape; mod utils; -use clap::{App, AppSettings, Arg, SubCommand}; +use clap::{Arg, Command}; extern crate tokio; fn main() { - let matches = App::new("hanimers") + let matches = Command::new("hanimers") .about("hanime.tv downloader in rust") .version(env!("CARGO_PKG_VERSION")) - .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand_required(true) .subcommand( - SubCommand::with_name("search") + Command::new("search") .arg( - Arg::with_name("tags") + Arg::new("tags") .long("tags") - .short("t") + .short('t') .takes_value(true) - .use_delimiter(true) - .case_insensitive(true) - .possible_values(&commands::AVALIABLE_TAGS) + .use_value_delimiter(true) + .ignore_case(true) + .possible_values(commands::AVALIABLE_TAGS) ).arg( - Arg::with_name("broad") + Arg::new("broad") .long("broad") - .short("b") + .short('b') .help("More results, but less accurate. Videos will match if they contain any selected tag rather than all selected tags.") ).arg( - Arg::with_name("query") + Arg::new("query") .takes_value(true) - .multiple(true) + .multiple_values(true) .help("Search query") ) ) .subcommand( - SubCommand::with_name("view") - .aliases(&["info", "show"]) + Command::new("view") + .visible_aliases(&["info", "show"]) .arg( - Arg::with_name("id") + Arg::new("id") .takes_value(true) - .multiple(true) + .multiple_values(true) .required(true) ) ) .subcommand( - SubCommand::with_name("download") - .alias("dl") + Command::new("download") + .visible_alias("dl") .arg( - Arg::with_name("print") + Arg::new("print") .long("print") - .short("p") + .short('p') .help("Print the URL to download only") ).arg( - Arg::with_name("resolution") + Arg::new("resolution") .long("resolution") - .short("r") + .short('r') .help("Set preferred resolution") .takes_value(true) ).arg( - Arg::with_name("id") + Arg::new("id") .takes_value(true) - .multiple(true) + .multiple_values(true) .required(true) ) ) @@ -70,9 +70,9 @@ fn main() { .build() .unwrap(); match matches.subcommand() { - ("search", Some(sub_m)) => runtime.block_on(commands::search(sub_m)), - ("view", Some(sub_m)) => runtime.block_on(commands::view(sub_m)), - ("download", Some(sub_m)) => runtime.block_on(commands::download(sub_m)), - _ => panic!("AppSettings::SubcommandRequiredElseHelp do your job please") + Some(("search", sub_m)) => runtime.block_on(commands::search(sub_m)), + Some(("view", sub_m)) => runtime.block_on(commands::view(sub_m)), + Some(("download", sub_m)) => runtime.block_on(commands::download(sub_m)), + _ => unreachable!("subcommand_required do your job please"), }; } diff --git a/src/structs.rs b/src/structs.rs index 10dd2e1..d0da681 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -1,20 +1,20 @@ -use std::fmt; -use std::marker::PhantomData; -use std::collections::HashMap; +use crate::unescape::unescape; +use quick_xml::events::Event; +use quick_xml::Reader; use serde::de::{self, Visitor}; use serde::{Deserialize, Deserializer}; -use quick_xml::Reader; -use quick_xml::events::Event; -use crate::unescape::unescape; -extern crate reqwest; +use std::collections::HashMap; +use std::fmt; +use std::marker::PhantomData; extern crate quick_xml; +extern crate reqwest; extern crate serde_json; // contains more info that i won't add for search results, maybe non_exhaustive? not sure #[derive(Deserialize, Debug)] pub struct SearchResult { pub id: i32, - pub name: String + pub name: String, } impl fmt::Display for SearchResult { @@ -25,28 +25,28 @@ impl fmt::Display for SearchResult { #[derive(Deserialize, Debug)] pub struct SearchResultMetadata { - pub hits: String + pub hits: String, } #[derive(Deserialize, Debug)] pub struct HentaiInfo { - pub state: HentaiState + pub state: HentaiState, } #[derive(Deserialize, Debug)] pub struct HentaiState { - pub data: HentaiData + pub data: HentaiData, } #[derive(Deserialize, Debug)] pub struct HentaiData { - pub video: HentaiDataVideo + pub video: HentaiDataVideo, } #[derive(Deserialize, Debug)] pub struct HentaiDataVideo { pub hentai_video: HentaiVideo, - pub videos_manifest: VideosManifest + pub videos_manifest: VideosManifest, } #[derive(Deserialize, Debug)] @@ -62,7 +62,7 @@ pub struct HentaiVideo { pub is_censored: bool, pub likes: usize, pub dislikes: usize, - pub hentai_tags: Vec + pub hentai_tags: Vec, } impl fmt::Display for HentaiInfo { @@ -107,17 +107,24 @@ impl fmt::Display for HentaiInfo { } }; } - text.push_str(&format!("Resolution: {}\n", + text.push_str(&format!( + "Resolution: {}\n", match int_servers.is_empty() { true => { let mut keys: Vec<&&String> = string_servers.keys().collect(); keys.sort(); - keys.iter().map(|&i| format!("{} ({}MB)", i, string_servers.get(i).unwrap())).collect::>().join(", ") - }, + keys.iter() + .map(|&i| format!("{} ({}MB)", i, string_servers.get(i).unwrap())) + .collect::>() + .join(", ") + } false => { let mut keys: Vec<&i32> = int_servers.keys().collect(); keys.sort(); - keys.iter().map(|i| format!("{} ({}MB)", i, int_servers.get(i).unwrap())).collect::>().join(", ") + keys.iter() + .map(|i| format!("{} ({}MB)", i, int_servers.get(i).unwrap())) + .collect::>() + .join(", ") } } )); @@ -143,7 +150,15 @@ impl fmt::Display for HentaiInfo { } text.push_str(&format!("Duration: {}{:02}\n", &duration, seconds)); } - text.push_str(&format!("Tags: {}", video.hentai_tags.iter().map(|i| i.text.as_str()).collect::>().join(", "))); + text.push_str(&format!( + "Tags: {}", + video + .hentai_tags + .iter() + .map(|i| i.text.as_str()) + .collect::>() + .join(", ") + )); if !video.description.is_empty() { text.push_str(&format!("\nDescription: {}", &video.description)); } @@ -154,35 +169,34 @@ impl fmt::Display for HentaiInfo { #[derive(Deserialize, Debug)] pub struct HentaiTag { pub id: i32, - pub text: String + pub text: String, } #[derive(Deserialize, Debug)] pub struct VideosManifest { - pub servers: Vec + pub servers: Vec, } #[derive(Deserialize, Debug)] pub struct VideoServer { pub is_permanent: bool, - pub streams: Vec + pub streams: Vec, } #[derive(Deserialize, Debug)] pub struct VideoStream { pub height: String, pub url: String, - pub filesize_mbs: i32 + pub filesize_mbs: i32, } fn remove_html<'de, D>(deserializer: D) -> Result where - D: Deserializer<'de> + D: Deserializer<'de>, { struct RemoveHTML(PhantomData T>); - impl<'de> Visitor<'de> for RemoveHTML - { + impl<'de> Visitor<'de> for RemoveHTML { type Value = String; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { @@ -191,19 +205,23 @@ where fn visit_str(self, value: &str) -> Result where - E: de::Error + E: de::Error, { -// https://brokenco.de/2020/08/03/serde-deserialize-with-string.html + // https://brokenco.de/2020/08/03/serde-deserialize-with-string.html let mut text = String::with_capacity(value.len()); let mut reader = Reader::from_str(value); reader.check_end_names(false); let mut buf = Vec::new(); loop { match reader.read_event(&mut buf) { - Ok(Event::Text(e)) => text.push_str(&unescape(reader.decode(e.escaped()).map_err(serde::de::Error::custom)?)), + Ok(Event::Text(e)) => text.push_str(&unescape( + reader + .decode(e.escaped()) + .map_err(serde::de::Error::custom)?, + )), Ok(Event::Eof) => break, Err(err) => panic!("Error at position {}: {:?}", reader.buffer_position(), err), - _ => () + _ => (), }; buf.clear(); } @@ -244,12 +262,10 @@ impl From for Error { impl fmt::Display for Error { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - formatter.write_str( - &match self { - Error::Reqwest(err) => format!("reqwest error: {}", err), - Error::QuickXML(err) => format!("quick-xml error: {}", err), - Error::SerdeJSON(err) => format!("serde_json error: {}", err), - } - ) + formatter.write_str(&match self { + Error::Reqwest(err) => format!("reqwest error: {}", err), + Error::QuickXML(err) => format!("quick-xml error: {}", err), + Error::SerdeJSON(err) => format!("serde_json error: {}", err), + }) } } diff --git a/src/unescape.rs b/src/unescape.rs index 24ee15c..402ab43 100644 --- a/src/unescape.rs +++ b/src/unescape.rs @@ -1,12 +1,12 @@ +use regex::{Captures, RegexBuilder}; use std::borrow::Cow; -use regex::{RegexBuilder, Captures}; fn hex_char_decode(c: u8) -> u8 { match c { b'a'..=b'f' => c - b'a' + 10, b'A'..=b'F' => c - b'A' + 10, b'0'..=b'9' => c - b'0', - _ => panic!("Invalid hex character passed: {}", c) + _ => panic!("Invalid hex character passed: {}", c), } } @@ -470,7 +470,11 @@ pub fn unescape<'t>(text: &'t str) -> Cow<'t, str> { "puncsp" => " ", "thinsp" | "ThinSpace" => " ", "hairsp" | "VeryThinSpace" => " ", - "ZeroWidthSpace" | "NegativeVeryThinSpace" | "NegativeThinSpace" | "NegativeMediumSpace" | "NegativeThickSpace" => "​", + "ZeroWidthSpace" + | "NegativeVeryThinSpace" + | "NegativeThinSpace" + | "NegativeMediumSpace" + | "NegativeThickSpace" => "​", "zwnj" => "‌", "zwj" => "‍", "lrm" => "‎", @@ -1497,8 +1501,9 @@ pub fn unescape<'t>(text: &'t str) -> Cow<'t, str> { "xopf" => "𝕩", "yopf" => "𝕪", "zopf" => "𝕫", - _ => &caps[0] - }.to_string() + _ => &caps[0], + } + .to_string() } }) } diff --git a/src/utils.rs b/src/utils.rs index 03d8071..ea2df7a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,14 +1,19 @@ use crate::structs; -use quick_xml::Reader; use quick_xml::events::Event; +use quick_xml::Reader; extern crate reqwest; extern crate serde_json; -pub async fn search(client: reqwest::Client, query: &str, tags: Vec<&str>, broad_search: bool) -> Result, structs::Error> { +pub async fn search( + client: reqwest::Client, + query: &str, + tags: Vec<&str>, + broad_search: bool, +) -> Result, structs::Error> { let tags_mode = match broad_search { true => "OR", - false => "AND" + false => "AND", }; Ok(serde_json::from_str( &serde_json::from_str::( @@ -25,8 +30,12 @@ pub async fn search(client: reqwest::Client, query: &str, tags: Vec<&str>, broad )?) } -pub async fn get_hentai(client: reqwest::Client, id: &str) -> Result, structs::Error> { - let resp = client.get(&format!("https://hanime.tv/videos/hentai/{}", id)) +pub async fn get_hentai( + client: reqwest::Client, + id: &str, +) -> Result, structs::Error> { + let resp = client + .get(&format!("https://hanime.tv/videos/hentai/{}", id)) .send() .await?; if resp.status() != 200 { @@ -45,23 +54,25 @@ pub async fn get_hentai(client: reqwest::Client, id: &str) -> Result { let text = match reader.decode(e.escaped()) { Ok(text) => text, - Err(_) => continue + Err(_) => continue, }; if !script.is_empty() || text.starts_with("window.__NUXT__={") { script.push_str(&text); } - }, + } Ok(Event::End(ref e)) if e.name() == b"script" && is_inside_script => { if script.is_empty() { is_inside_script = false; } else { - to_return = Some(serde_json::from_str(script.splitn(2, "=").nth(1).unwrap().trim_end_matches(';'))?); + to_return = Some(serde_json::from_str( + script.splitn(2, "=").nth(1).unwrap().trim_end_matches(';'), + )?); break; } - }, + } Err(err) => panic!("Error at position {}: {:?}", reader.buffer_position(), err), Ok(Event::Eof) => break, - _ => () + _ => (), }; buf.clear(); }