A decentralized music tracking and discovery platform built on AT Protocol 🎵 rocksky.app
spotify atproto lastfm musicbrainz scrobbling listenbrainz

Initialize spotify scrobbler

+3265
+1
.gitignore
··· 1 + target/
+2645
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 + 20 + [[package]] 21 + name = "aes" 22 + version = "0.8.4" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 25 + dependencies = [ 26 + "cfg-if", 27 + "cipher", 28 + "cpufeatures", 29 + ] 30 + 31 + [[package]] 32 + name = "allocator-api2" 33 + version = "0.2.21" 34 + source = "registry+https://github.com/rust-lang/crates.io-index" 35 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 36 + 37 + [[package]] 38 + name = "android-tzdata" 39 + version = "0.1.1" 40 + source = "registry+https://github.com/rust-lang/crates.io-index" 41 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 42 + 43 + [[package]] 44 + name = "android_system_properties" 45 + version = "0.1.5" 46 + source = "registry+https://github.com/rust-lang/crates.io-index" 47 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 48 + dependencies = [ 49 + "libc", 50 + ] 51 + 52 + [[package]] 53 + name = "anyhow" 54 + version = "1.0.96" 55 + source = "registry+https://github.com/rust-lang/crates.io-index" 56 + checksum = "6b964d184e89d9b6b67dd2715bc8e74cf3107fb2b529990c90cf517326150bf4" 57 + 58 + [[package]] 59 + name = "arc-swap" 60 + version = "1.7.1" 61 + source = "registry+https://github.com/rust-lang/crates.io-index" 62 + checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 63 + 64 + [[package]] 65 + name = "atoi" 66 + version = "2.0.0" 67 + source = "registry+https://github.com/rust-lang/crates.io-index" 68 + checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 69 + dependencies = [ 70 + "num-traits", 71 + ] 72 + 73 + [[package]] 74 + name = "autocfg" 75 + version = "1.4.0" 76 + source = "registry+https://github.com/rust-lang/crates.io-index" 77 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 78 + 79 + [[package]] 80 + name = "backtrace" 81 + version = "0.3.74" 82 + source = "registry+https://github.com/rust-lang/crates.io-index" 83 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 84 + dependencies = [ 85 + "addr2line", 86 + "cfg-if", 87 + "libc", 88 + "miniz_oxide", 89 + "object", 90 + "rustc-demangle", 91 + "windows-targets 0.52.6", 92 + ] 93 + 94 + [[package]] 95 + name = "base64" 96 + version = "0.22.1" 97 + source = "registry+https://github.com/rust-lang/crates.io-index" 98 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 99 + 100 + [[package]] 101 + name = "base64ct" 102 + version = "1.6.0" 103 + source = "registry+https://github.com/rust-lang/crates.io-index" 104 + checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 105 + 106 + [[package]] 107 + name = "bitflags" 108 + version = "2.8.0" 109 + source = "registry+https://github.com/rust-lang/crates.io-index" 110 + checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" 111 + dependencies = [ 112 + "serde", 113 + ] 114 + 115 + [[package]] 116 + name = "block-buffer" 117 + version = "0.10.4" 118 + source = "registry+https://github.com/rust-lang/crates.io-index" 119 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 120 + dependencies = [ 121 + "generic-array", 122 + ] 123 + 124 + [[package]] 125 + name = "bumpalo" 126 + version = "3.17.0" 127 + source = "registry+https://github.com/rust-lang/crates.io-index" 128 + checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 129 + 130 + [[package]] 131 + name = "byteorder" 132 + version = "1.5.0" 133 + source = "registry+https://github.com/rust-lang/crates.io-index" 134 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 135 + 136 + [[package]] 137 + name = "bytes" 138 + version = "1.10.0" 139 + source = "registry+https://github.com/rust-lang/crates.io-index" 140 + checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" 141 + 142 + [[package]] 143 + name = "cc" 144 + version = "1.2.14" 145 + source = "registry+https://github.com/rust-lang/crates.io-index" 146 + checksum = "0c3d1b2e905a3a7b00a6141adb0e4c0bb941d11caf55349d863942a1cc44e3c9" 147 + dependencies = [ 148 + "shlex", 149 + ] 150 + 151 + [[package]] 152 + name = "cfg-if" 153 + version = "1.0.0" 154 + source = "registry+https://github.com/rust-lang/crates.io-index" 155 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 156 + 157 + [[package]] 158 + name = "cfg_aliases" 159 + version = "0.2.1" 160 + source = "registry+https://github.com/rust-lang/crates.io-index" 161 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 162 + 163 + [[package]] 164 + name = "chrono" 165 + version = "0.4.39" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" 168 + dependencies = [ 169 + "android-tzdata", 170 + "iana-time-zone", 171 + "js-sys", 172 + "num-traits", 173 + "serde", 174 + "wasm-bindgen", 175 + "windows-targets 0.52.6", 176 + ] 177 + 178 + [[package]] 179 + name = "cipher" 180 + version = "0.4.4" 181 + source = "registry+https://github.com/rust-lang/crates.io-index" 182 + checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 183 + dependencies = [ 184 + "crypto-common", 185 + "inout", 186 + ] 187 + 188 + [[package]] 189 + name = "combine" 190 + version = "4.6.7" 191 + source = "registry+https://github.com/rust-lang/crates.io-index" 192 + checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 193 + dependencies = [ 194 + "bytes", 195 + "memchr", 196 + ] 197 + 198 + [[package]] 199 + name = "concurrent-queue" 200 + version = "2.5.0" 201 + source = "registry+https://github.com/rust-lang/crates.io-index" 202 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 203 + dependencies = [ 204 + "crossbeam-utils", 205 + ] 206 + 207 + [[package]] 208 + name = "const-oid" 209 + version = "0.9.6" 210 + source = "registry+https://github.com/rust-lang/crates.io-index" 211 + checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 212 + 213 + [[package]] 214 + name = "core-foundation-sys" 215 + version = "0.8.7" 216 + source = "registry+https://github.com/rust-lang/crates.io-index" 217 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 218 + 219 + [[package]] 220 + name = "cpufeatures" 221 + version = "0.2.17" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 224 + dependencies = [ 225 + "libc", 226 + ] 227 + 228 + [[package]] 229 + name = "crc" 230 + version = "3.2.1" 231 + source = "registry+https://github.com/rust-lang/crates.io-index" 232 + checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" 233 + dependencies = [ 234 + "crc-catalog", 235 + ] 236 + 237 + [[package]] 238 + name = "crc-catalog" 239 + version = "2.4.0" 240 + source = "registry+https://github.com/rust-lang/crates.io-index" 241 + checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 242 + 243 + [[package]] 244 + name = "crossbeam-queue" 245 + version = "0.3.12" 246 + source = "registry+https://github.com/rust-lang/crates.io-index" 247 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 248 + dependencies = [ 249 + "crossbeam-utils", 250 + ] 251 + 252 + [[package]] 253 + name = "crossbeam-utils" 254 + version = "0.8.21" 255 + source = "registry+https://github.com/rust-lang/crates.io-index" 256 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 257 + 258 + [[package]] 259 + name = "crypto-common" 260 + version = "0.1.6" 261 + source = "registry+https://github.com/rust-lang/crates.io-index" 262 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 263 + dependencies = [ 264 + "generic-array", 265 + "typenum", 266 + ] 267 + 268 + [[package]] 269 + name = "ctr" 270 + version = "0.9.2" 271 + source = "registry+https://github.com/rust-lang/crates.io-index" 272 + checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" 273 + dependencies = [ 274 + "cipher", 275 + ] 276 + 277 + [[package]] 278 + name = "der" 279 + version = "0.7.9" 280 + source = "registry+https://github.com/rust-lang/crates.io-index" 281 + checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" 282 + dependencies = [ 283 + "const-oid", 284 + "pem-rfc7468", 285 + "zeroize", 286 + ] 287 + 288 + [[package]] 289 + name = "deranged" 290 + version = "0.3.11" 291 + source = "registry+https://github.com/rust-lang/crates.io-index" 292 + checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 293 + dependencies = [ 294 + "powerfmt", 295 + ] 296 + 297 + [[package]] 298 + name = "digest" 299 + version = "0.10.7" 300 + source = "registry+https://github.com/rust-lang/crates.io-index" 301 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 302 + dependencies = [ 303 + "block-buffer", 304 + "const-oid", 305 + "crypto-common", 306 + "subtle", 307 + ] 308 + 309 + [[package]] 310 + name = "displaydoc" 311 + version = "0.2.5" 312 + source = "registry+https://github.com/rust-lang/crates.io-index" 313 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 314 + dependencies = [ 315 + "proc-macro2", 316 + "quote", 317 + "syn", 318 + ] 319 + 320 + [[package]] 321 + name = "dotenv" 322 + version = "0.15.0" 323 + source = "registry+https://github.com/rust-lang/crates.io-index" 324 + checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 325 + 326 + [[package]] 327 + name = "dotenvy" 328 + version = "0.15.7" 329 + source = "registry+https://github.com/rust-lang/crates.io-index" 330 + checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" 331 + 332 + [[package]] 333 + name = "either" 334 + version = "1.13.0" 335 + source = "registry+https://github.com/rust-lang/crates.io-index" 336 + checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 337 + dependencies = [ 338 + "serde", 339 + ] 340 + 341 + [[package]] 342 + name = "equivalent" 343 + version = "1.0.2" 344 + source = "registry+https://github.com/rust-lang/crates.io-index" 345 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 346 + 347 + [[package]] 348 + name = "errno" 349 + version = "0.3.10" 350 + source = "registry+https://github.com/rust-lang/crates.io-index" 351 + checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 352 + dependencies = [ 353 + "libc", 354 + "windows-sys 0.59.0", 355 + ] 356 + 357 + [[package]] 358 + name = "etcetera" 359 + version = "0.8.0" 360 + source = "registry+https://github.com/rust-lang/crates.io-index" 361 + checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" 362 + dependencies = [ 363 + "cfg-if", 364 + "home", 365 + "windows-sys 0.48.0", 366 + ] 367 + 368 + [[package]] 369 + name = "event-listener" 370 + version = "5.4.0" 371 + source = "registry+https://github.com/rust-lang/crates.io-index" 372 + checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 373 + dependencies = [ 374 + "concurrent-queue", 375 + "parking", 376 + "pin-project-lite", 377 + ] 378 + 379 + [[package]] 380 + name = "fastrand" 381 + version = "2.3.0" 382 + source = "registry+https://github.com/rust-lang/crates.io-index" 383 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 384 + 385 + [[package]] 386 + name = "flume" 387 + version = "0.11.1" 388 + source = "registry+https://github.com/rust-lang/crates.io-index" 389 + checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" 390 + dependencies = [ 391 + "futures-core", 392 + "futures-sink", 393 + "spin", 394 + ] 395 + 396 + [[package]] 397 + name = "fnv" 398 + version = "1.0.7" 399 + source = "registry+https://github.com/rust-lang/crates.io-index" 400 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 401 + 402 + [[package]] 403 + name = "foldhash" 404 + version = "0.1.4" 405 + source = "registry+https://github.com/rust-lang/crates.io-index" 406 + checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 407 + 408 + [[package]] 409 + name = "form_urlencoded" 410 + version = "1.2.1" 411 + source = "registry+https://github.com/rust-lang/crates.io-index" 412 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 413 + dependencies = [ 414 + "percent-encoding", 415 + ] 416 + 417 + [[package]] 418 + name = "futures-channel" 419 + version = "0.3.31" 420 + source = "registry+https://github.com/rust-lang/crates.io-index" 421 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 422 + dependencies = [ 423 + "futures-core", 424 + "futures-sink", 425 + ] 426 + 427 + [[package]] 428 + name = "futures-core" 429 + version = "0.3.31" 430 + source = "registry+https://github.com/rust-lang/crates.io-index" 431 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 432 + 433 + [[package]] 434 + name = "futures-executor" 435 + version = "0.3.31" 436 + source = "registry+https://github.com/rust-lang/crates.io-index" 437 + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 438 + dependencies = [ 439 + "futures-core", 440 + "futures-task", 441 + "futures-util", 442 + ] 443 + 444 + [[package]] 445 + name = "futures-intrusive" 446 + version = "0.5.0" 447 + source = "registry+https://github.com/rust-lang/crates.io-index" 448 + checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" 449 + dependencies = [ 450 + "futures-core", 451 + "lock_api", 452 + "parking_lot", 453 + ] 454 + 455 + [[package]] 456 + name = "futures-io" 457 + version = "0.3.31" 458 + source = "registry+https://github.com/rust-lang/crates.io-index" 459 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 460 + 461 + [[package]] 462 + name = "futures-sink" 463 + version = "0.3.31" 464 + source = "registry+https://github.com/rust-lang/crates.io-index" 465 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 466 + 467 + [[package]] 468 + name = "futures-task" 469 + version = "0.3.31" 470 + source = "registry+https://github.com/rust-lang/crates.io-index" 471 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 472 + 473 + [[package]] 474 + name = "futures-util" 475 + version = "0.3.31" 476 + source = "registry+https://github.com/rust-lang/crates.io-index" 477 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 478 + dependencies = [ 479 + "futures-core", 480 + "futures-io", 481 + "futures-sink", 482 + "futures-task", 483 + "memchr", 484 + "pin-project-lite", 485 + "pin-utils", 486 + "slab", 487 + ] 488 + 489 + [[package]] 490 + name = "generic-array" 491 + version = "0.14.7" 492 + source = "registry+https://github.com/rust-lang/crates.io-index" 493 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 494 + dependencies = [ 495 + "typenum", 496 + "version_check", 497 + ] 498 + 499 + [[package]] 500 + name = "getrandom" 501 + version = "0.2.15" 502 + source = "registry+https://github.com/rust-lang/crates.io-index" 503 + checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 504 + dependencies = [ 505 + "cfg-if", 506 + "js-sys", 507 + "libc", 508 + "wasi 0.11.0+wasi-snapshot-preview1", 509 + "wasm-bindgen", 510 + ] 511 + 512 + [[package]] 513 + name = "getrandom" 514 + version = "0.3.1" 515 + source = "registry+https://github.com/rust-lang/crates.io-index" 516 + checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" 517 + dependencies = [ 518 + "cfg-if", 519 + "libc", 520 + "wasi 0.13.3+wasi-0.2.2", 521 + "windows-targets 0.52.6", 522 + ] 523 + 524 + [[package]] 525 + name = "gimli" 526 + version = "0.31.1" 527 + source = "registry+https://github.com/rust-lang/crates.io-index" 528 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 529 + 530 + [[package]] 531 + name = "hashbrown" 532 + version = "0.15.2" 533 + source = "registry+https://github.com/rust-lang/crates.io-index" 534 + checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 535 + dependencies = [ 536 + "allocator-api2", 537 + "equivalent", 538 + "foldhash", 539 + ] 540 + 541 + [[package]] 542 + name = "hashlink" 543 + version = "0.10.0" 544 + source = "registry+https://github.com/rust-lang/crates.io-index" 545 + checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 546 + dependencies = [ 547 + "hashbrown", 548 + ] 549 + 550 + [[package]] 551 + name = "heck" 552 + version = "0.5.0" 553 + source = "registry+https://github.com/rust-lang/crates.io-index" 554 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 555 + 556 + [[package]] 557 + name = "hex" 558 + version = "0.4.3" 559 + source = "registry+https://github.com/rust-lang/crates.io-index" 560 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 561 + 562 + [[package]] 563 + name = "hkdf" 564 + version = "0.12.4" 565 + source = "registry+https://github.com/rust-lang/crates.io-index" 566 + checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" 567 + dependencies = [ 568 + "hmac", 569 + ] 570 + 571 + [[package]] 572 + name = "hmac" 573 + version = "0.12.1" 574 + source = "registry+https://github.com/rust-lang/crates.io-index" 575 + checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 576 + dependencies = [ 577 + "digest", 578 + ] 579 + 580 + [[package]] 581 + name = "home" 582 + version = "0.5.11" 583 + source = "registry+https://github.com/rust-lang/crates.io-index" 584 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 585 + dependencies = [ 586 + "windows-sys 0.59.0", 587 + ] 588 + 589 + [[package]] 590 + name = "http" 591 + version = "1.2.0" 592 + source = "registry+https://github.com/rust-lang/crates.io-index" 593 + checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" 594 + dependencies = [ 595 + "bytes", 596 + "fnv", 597 + "itoa", 598 + ] 599 + 600 + [[package]] 601 + name = "http-body" 602 + version = "1.0.1" 603 + source = "registry+https://github.com/rust-lang/crates.io-index" 604 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 605 + dependencies = [ 606 + "bytes", 607 + "http", 608 + ] 609 + 610 + [[package]] 611 + name = "http-body-util" 612 + version = "0.1.2" 613 + source = "registry+https://github.com/rust-lang/crates.io-index" 614 + checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" 615 + dependencies = [ 616 + "bytes", 617 + "futures-util", 618 + "http", 619 + "http-body", 620 + "pin-project-lite", 621 + ] 622 + 623 + [[package]] 624 + name = "httparse" 625 + version = "1.10.0" 626 + source = "registry+https://github.com/rust-lang/crates.io-index" 627 + checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" 628 + 629 + [[package]] 630 + name = "hyper" 631 + version = "1.6.0" 632 + source = "registry+https://github.com/rust-lang/crates.io-index" 633 + checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 634 + dependencies = [ 635 + "bytes", 636 + "futures-channel", 637 + "futures-util", 638 + "http", 639 + "http-body", 640 + "httparse", 641 + "itoa", 642 + "pin-project-lite", 643 + "smallvec", 644 + "tokio", 645 + "want", 646 + ] 647 + 648 + [[package]] 649 + name = "hyper-rustls" 650 + version = "0.27.5" 651 + source = "registry+https://github.com/rust-lang/crates.io-index" 652 + checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 653 + dependencies = [ 654 + "futures-util", 655 + "http", 656 + "hyper", 657 + "hyper-util", 658 + "rustls", 659 + "rustls-pki-types", 660 + "tokio", 661 + "tokio-rustls", 662 + "tower-service", 663 + "webpki-roots", 664 + ] 665 + 666 + [[package]] 667 + name = "hyper-util" 668 + version = "0.1.10" 669 + source = "registry+https://github.com/rust-lang/crates.io-index" 670 + checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" 671 + dependencies = [ 672 + "bytes", 673 + "futures-channel", 674 + "futures-util", 675 + "http", 676 + "http-body", 677 + "hyper", 678 + "pin-project-lite", 679 + "socket2", 680 + "tokio", 681 + "tower-service", 682 + "tracing", 683 + ] 684 + 685 + [[package]] 686 + name = "iana-time-zone" 687 + version = "0.1.61" 688 + source = "registry+https://github.com/rust-lang/crates.io-index" 689 + checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 690 + dependencies = [ 691 + "android_system_properties", 692 + "core-foundation-sys", 693 + "iana-time-zone-haiku", 694 + "js-sys", 695 + "wasm-bindgen", 696 + "windows-core", 697 + ] 698 + 699 + [[package]] 700 + name = "iana-time-zone-haiku" 701 + version = "0.1.2" 702 + source = "registry+https://github.com/rust-lang/crates.io-index" 703 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 704 + dependencies = [ 705 + "cc", 706 + ] 707 + 708 + [[package]] 709 + name = "icu_collections" 710 + version = "1.5.0" 711 + source = "registry+https://github.com/rust-lang/crates.io-index" 712 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 713 + dependencies = [ 714 + "displaydoc", 715 + "yoke", 716 + "zerofrom", 717 + "zerovec", 718 + ] 719 + 720 + [[package]] 721 + name = "icu_locid" 722 + version = "1.5.0" 723 + source = "registry+https://github.com/rust-lang/crates.io-index" 724 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 725 + dependencies = [ 726 + "displaydoc", 727 + "litemap", 728 + "tinystr", 729 + "writeable", 730 + "zerovec", 731 + ] 732 + 733 + [[package]] 734 + name = "icu_locid_transform" 735 + version = "1.5.0" 736 + source = "registry+https://github.com/rust-lang/crates.io-index" 737 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 738 + dependencies = [ 739 + "displaydoc", 740 + "icu_locid", 741 + "icu_locid_transform_data", 742 + "icu_provider", 743 + "tinystr", 744 + "zerovec", 745 + ] 746 + 747 + [[package]] 748 + name = "icu_locid_transform_data" 749 + version = "1.5.0" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 752 + 753 + [[package]] 754 + name = "icu_normalizer" 755 + version = "1.5.0" 756 + source = "registry+https://github.com/rust-lang/crates.io-index" 757 + checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 758 + dependencies = [ 759 + "displaydoc", 760 + "icu_collections", 761 + "icu_normalizer_data", 762 + "icu_properties", 763 + "icu_provider", 764 + "smallvec", 765 + "utf16_iter", 766 + "utf8_iter", 767 + "write16", 768 + "zerovec", 769 + ] 770 + 771 + [[package]] 772 + name = "icu_normalizer_data" 773 + version = "1.5.0" 774 + source = "registry+https://github.com/rust-lang/crates.io-index" 775 + checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 776 + 777 + [[package]] 778 + name = "icu_properties" 779 + version = "1.5.1" 780 + source = "registry+https://github.com/rust-lang/crates.io-index" 781 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 782 + dependencies = [ 783 + "displaydoc", 784 + "icu_collections", 785 + "icu_locid_transform", 786 + "icu_properties_data", 787 + "icu_provider", 788 + "tinystr", 789 + "zerovec", 790 + ] 791 + 792 + [[package]] 793 + name = "icu_properties_data" 794 + version = "1.5.0" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 797 + 798 + [[package]] 799 + name = "icu_provider" 800 + version = "1.5.0" 801 + source = "registry+https://github.com/rust-lang/crates.io-index" 802 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 803 + dependencies = [ 804 + "displaydoc", 805 + "icu_locid", 806 + "icu_provider_macros", 807 + "stable_deref_trait", 808 + "tinystr", 809 + "writeable", 810 + "yoke", 811 + "zerofrom", 812 + "zerovec", 813 + ] 814 + 815 + [[package]] 816 + name = "icu_provider_macros" 817 + version = "1.5.0" 818 + source = "registry+https://github.com/rust-lang/crates.io-index" 819 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 820 + dependencies = [ 821 + "proc-macro2", 822 + "quote", 823 + "syn", 824 + ] 825 + 826 + [[package]] 827 + name = "idna" 828 + version = "1.0.3" 829 + source = "registry+https://github.com/rust-lang/crates.io-index" 830 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 831 + dependencies = [ 832 + "idna_adapter", 833 + "smallvec", 834 + "utf8_iter", 835 + ] 836 + 837 + [[package]] 838 + name = "idna_adapter" 839 + version = "1.2.0" 840 + source = "registry+https://github.com/rust-lang/crates.io-index" 841 + checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 842 + dependencies = [ 843 + "icu_normalizer", 844 + "icu_properties", 845 + ] 846 + 847 + [[package]] 848 + name = "indexmap" 849 + version = "2.7.1" 850 + source = "registry+https://github.com/rust-lang/crates.io-index" 851 + checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" 852 + dependencies = [ 853 + "equivalent", 854 + "hashbrown", 855 + ] 856 + 857 + [[package]] 858 + name = "inout" 859 + version = "0.1.3" 860 + source = "registry+https://github.com/rust-lang/crates.io-index" 861 + checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 862 + dependencies = [ 863 + "generic-array", 864 + ] 865 + 866 + [[package]] 867 + name = "ipnet" 868 + version = "2.11.0" 869 + source = "registry+https://github.com/rust-lang/crates.io-index" 870 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 871 + 872 + [[package]] 873 + name = "itoa" 874 + version = "1.0.14" 875 + source = "registry+https://github.com/rust-lang/crates.io-index" 876 + checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 877 + 878 + [[package]] 879 + name = "js-sys" 880 + version = "0.3.77" 881 + source = "registry+https://github.com/rust-lang/crates.io-index" 882 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 883 + dependencies = [ 884 + "once_cell", 885 + "wasm-bindgen", 886 + ] 887 + 888 + [[package]] 889 + name = "jsonwebtoken" 890 + version = "9.3.1" 891 + source = "registry+https://github.com/rust-lang/crates.io-index" 892 + checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" 893 + dependencies = [ 894 + "base64", 895 + "js-sys", 896 + "pem", 897 + "ring", 898 + "serde", 899 + "serde_json", 900 + "simple_asn1", 901 + ] 902 + 903 + [[package]] 904 + name = "lazy_static" 905 + version = "1.5.0" 906 + source = "registry+https://github.com/rust-lang/crates.io-index" 907 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 908 + dependencies = [ 909 + "spin", 910 + ] 911 + 912 + [[package]] 913 + name = "libc" 914 + version = "0.2.169" 915 + source = "registry+https://github.com/rust-lang/crates.io-index" 916 + checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 917 + 918 + [[package]] 919 + name = "libm" 920 + version = "0.2.11" 921 + source = "registry+https://github.com/rust-lang/crates.io-index" 922 + checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" 923 + 924 + [[package]] 925 + name = "libsqlite3-sys" 926 + version = "0.30.1" 927 + source = "registry+https://github.com/rust-lang/crates.io-index" 928 + checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 929 + dependencies = [ 930 + "pkg-config", 931 + "vcpkg", 932 + ] 933 + 934 + [[package]] 935 + name = "linux-raw-sys" 936 + version = "0.4.15" 937 + source = "registry+https://github.com/rust-lang/crates.io-index" 938 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 939 + 940 + [[package]] 941 + name = "litemap" 942 + version = "0.7.4" 943 + source = "registry+https://github.com/rust-lang/crates.io-index" 944 + checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 945 + 946 + [[package]] 947 + name = "lock_api" 948 + version = "0.4.12" 949 + source = "registry+https://github.com/rust-lang/crates.io-index" 950 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 951 + dependencies = [ 952 + "autocfg", 953 + "scopeguard", 954 + ] 955 + 956 + [[package]] 957 + name = "log" 958 + version = "0.4.25" 959 + source = "registry+https://github.com/rust-lang/crates.io-index" 960 + checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" 961 + 962 + [[package]] 963 + name = "md-5" 964 + version = "0.10.6" 965 + source = "registry+https://github.com/rust-lang/crates.io-index" 966 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 967 + dependencies = [ 968 + "cfg-if", 969 + "digest", 970 + ] 971 + 972 + [[package]] 973 + name = "memchr" 974 + version = "2.7.4" 975 + source = "registry+https://github.com/rust-lang/crates.io-index" 976 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 977 + 978 + [[package]] 979 + name = "mime" 980 + version = "0.3.17" 981 + source = "registry+https://github.com/rust-lang/crates.io-index" 982 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 983 + 984 + [[package]] 985 + name = "mime_guess" 986 + version = "2.0.5" 987 + source = "registry+https://github.com/rust-lang/crates.io-index" 988 + checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" 989 + dependencies = [ 990 + "mime", 991 + "unicase", 992 + ] 993 + 994 + [[package]] 995 + name = "miniz_oxide" 996 + version = "0.8.4" 997 + source = "registry+https://github.com/rust-lang/crates.io-index" 998 + checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" 999 + dependencies = [ 1000 + "adler2", 1001 + ] 1002 + 1003 + [[package]] 1004 + name = "mio" 1005 + version = "1.0.3" 1006 + source = "registry+https://github.com/rust-lang/crates.io-index" 1007 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 1008 + dependencies = [ 1009 + "libc", 1010 + "wasi 0.11.0+wasi-snapshot-preview1", 1011 + "windows-sys 0.52.0", 1012 + ] 1013 + 1014 + [[package]] 1015 + name = "num-bigint" 1016 + version = "0.4.6" 1017 + source = "registry+https://github.com/rust-lang/crates.io-index" 1018 + checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1019 + dependencies = [ 1020 + "num-integer", 1021 + "num-traits", 1022 + ] 1023 + 1024 + [[package]] 1025 + name = "num-bigint-dig" 1026 + version = "0.8.4" 1027 + source = "registry+https://github.com/rust-lang/crates.io-index" 1028 + checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" 1029 + dependencies = [ 1030 + "byteorder", 1031 + "lazy_static", 1032 + "libm", 1033 + "num-integer", 1034 + "num-iter", 1035 + "num-traits", 1036 + "rand", 1037 + "smallvec", 1038 + "zeroize", 1039 + ] 1040 + 1041 + [[package]] 1042 + name = "num-conv" 1043 + version = "0.1.0" 1044 + source = "registry+https://github.com/rust-lang/crates.io-index" 1045 + checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1046 + 1047 + [[package]] 1048 + name = "num-integer" 1049 + version = "0.1.46" 1050 + source = "registry+https://github.com/rust-lang/crates.io-index" 1051 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1052 + dependencies = [ 1053 + "num-traits", 1054 + ] 1055 + 1056 + [[package]] 1057 + name = "num-iter" 1058 + version = "0.1.45" 1059 + source = "registry+https://github.com/rust-lang/crates.io-index" 1060 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1061 + dependencies = [ 1062 + "autocfg", 1063 + "num-integer", 1064 + "num-traits", 1065 + ] 1066 + 1067 + [[package]] 1068 + name = "num-traits" 1069 + version = "0.2.19" 1070 + source = "registry+https://github.com/rust-lang/crates.io-index" 1071 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1072 + dependencies = [ 1073 + "autocfg", 1074 + "libm", 1075 + ] 1076 + 1077 + [[package]] 1078 + name = "object" 1079 + version = "0.36.7" 1080 + source = "registry+https://github.com/rust-lang/crates.io-index" 1081 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1082 + dependencies = [ 1083 + "memchr", 1084 + ] 1085 + 1086 + [[package]] 1087 + name = "once_cell" 1088 + version = "1.20.3" 1089 + source = "registry+https://github.com/rust-lang/crates.io-index" 1090 + checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" 1091 + 1092 + [[package]] 1093 + name = "owo-colors" 1094 + version = "4.1.0" 1095 + source = "registry+https://github.com/rust-lang/crates.io-index" 1096 + checksum = "fb37767f6569cd834a413442455e0f066d0d522de8630436e2a1761d9726ba56" 1097 + 1098 + [[package]] 1099 + name = "parking" 1100 + version = "2.2.1" 1101 + source = "registry+https://github.com/rust-lang/crates.io-index" 1102 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1103 + 1104 + [[package]] 1105 + name = "parking_lot" 1106 + version = "0.12.3" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1109 + dependencies = [ 1110 + "lock_api", 1111 + "parking_lot_core", 1112 + ] 1113 + 1114 + [[package]] 1115 + name = "parking_lot_core" 1116 + version = "0.9.10" 1117 + source = "registry+https://github.com/rust-lang/crates.io-index" 1118 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1119 + dependencies = [ 1120 + "cfg-if", 1121 + "libc", 1122 + "redox_syscall", 1123 + "smallvec", 1124 + "windows-targets 0.52.6", 1125 + ] 1126 + 1127 + [[package]] 1128 + name = "pem" 1129 + version = "3.0.4" 1130 + source = "registry+https://github.com/rust-lang/crates.io-index" 1131 + checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" 1132 + dependencies = [ 1133 + "base64", 1134 + "serde", 1135 + ] 1136 + 1137 + [[package]] 1138 + name = "pem-rfc7468" 1139 + version = "0.7.0" 1140 + source = "registry+https://github.com/rust-lang/crates.io-index" 1141 + checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" 1142 + dependencies = [ 1143 + "base64ct", 1144 + ] 1145 + 1146 + [[package]] 1147 + name = "percent-encoding" 1148 + version = "2.3.1" 1149 + source = "registry+https://github.com/rust-lang/crates.io-index" 1150 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1151 + 1152 + [[package]] 1153 + name = "pin-project-lite" 1154 + version = "0.2.16" 1155 + source = "registry+https://github.com/rust-lang/crates.io-index" 1156 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1157 + 1158 + [[package]] 1159 + name = "pin-utils" 1160 + version = "0.1.0" 1161 + source = "registry+https://github.com/rust-lang/crates.io-index" 1162 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1163 + 1164 + [[package]] 1165 + name = "pkcs1" 1166 + version = "0.7.5" 1167 + source = "registry+https://github.com/rust-lang/crates.io-index" 1168 + checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" 1169 + dependencies = [ 1170 + "der", 1171 + "pkcs8", 1172 + "spki", 1173 + ] 1174 + 1175 + [[package]] 1176 + name = "pkcs8" 1177 + version = "0.10.2" 1178 + source = "registry+https://github.com/rust-lang/crates.io-index" 1179 + checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" 1180 + dependencies = [ 1181 + "der", 1182 + "spki", 1183 + ] 1184 + 1185 + [[package]] 1186 + name = "pkg-config" 1187 + version = "0.3.31" 1188 + source = "registry+https://github.com/rust-lang/crates.io-index" 1189 + checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 1190 + 1191 + [[package]] 1192 + name = "powerfmt" 1193 + version = "0.2.0" 1194 + source = "registry+https://github.com/rust-lang/crates.io-index" 1195 + checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1196 + 1197 + [[package]] 1198 + name = "ppv-lite86" 1199 + version = "0.2.20" 1200 + source = "registry+https://github.com/rust-lang/crates.io-index" 1201 + checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1202 + dependencies = [ 1203 + "zerocopy", 1204 + ] 1205 + 1206 + [[package]] 1207 + name = "proc-macro2" 1208 + version = "1.0.93" 1209 + source = "registry+https://github.com/rust-lang/crates.io-index" 1210 + checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 1211 + dependencies = [ 1212 + "unicode-ident", 1213 + ] 1214 + 1215 + [[package]] 1216 + name = "quinn" 1217 + version = "0.11.6" 1218 + source = "registry+https://github.com/rust-lang/crates.io-index" 1219 + checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" 1220 + dependencies = [ 1221 + "bytes", 1222 + "pin-project-lite", 1223 + "quinn-proto", 1224 + "quinn-udp", 1225 + "rustc-hash", 1226 + "rustls", 1227 + "socket2", 1228 + "thiserror", 1229 + "tokio", 1230 + "tracing", 1231 + ] 1232 + 1233 + [[package]] 1234 + name = "quinn-proto" 1235 + version = "0.11.9" 1236 + source = "registry+https://github.com/rust-lang/crates.io-index" 1237 + checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" 1238 + dependencies = [ 1239 + "bytes", 1240 + "getrandom 0.2.15", 1241 + "rand", 1242 + "ring", 1243 + "rustc-hash", 1244 + "rustls", 1245 + "rustls-pki-types", 1246 + "slab", 1247 + "thiserror", 1248 + "tinyvec", 1249 + "tracing", 1250 + "web-time", 1251 + ] 1252 + 1253 + [[package]] 1254 + name = "quinn-udp" 1255 + version = "0.5.9" 1256 + source = "registry+https://github.com/rust-lang/crates.io-index" 1257 + checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" 1258 + dependencies = [ 1259 + "cfg_aliases", 1260 + "libc", 1261 + "once_cell", 1262 + "socket2", 1263 + "tracing", 1264 + "windows-sys 0.59.0", 1265 + ] 1266 + 1267 + [[package]] 1268 + name = "quote" 1269 + version = "1.0.38" 1270 + source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 1272 + dependencies = [ 1273 + "proc-macro2", 1274 + ] 1275 + 1276 + [[package]] 1277 + name = "rand" 1278 + version = "0.8.5" 1279 + source = "registry+https://github.com/rust-lang/crates.io-index" 1280 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1281 + dependencies = [ 1282 + "libc", 1283 + "rand_chacha", 1284 + "rand_core", 1285 + ] 1286 + 1287 + [[package]] 1288 + name = "rand_chacha" 1289 + version = "0.3.1" 1290 + source = "registry+https://github.com/rust-lang/crates.io-index" 1291 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1292 + dependencies = [ 1293 + "ppv-lite86", 1294 + "rand_core", 1295 + ] 1296 + 1297 + [[package]] 1298 + name = "rand_core" 1299 + version = "0.6.4" 1300 + source = "registry+https://github.com/rust-lang/crates.io-index" 1301 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1302 + dependencies = [ 1303 + "getrandom 0.2.15", 1304 + ] 1305 + 1306 + [[package]] 1307 + name = "redis" 1308 + version = "0.29.0" 1309 + source = "registry+https://github.com/rust-lang/crates.io-index" 1310 + checksum = "9568894e8bdefd16512bca9e286a9d2abc27773609aa4eb7f428497d64df4373" 1311 + dependencies = [ 1312 + "arc-swap", 1313 + "combine", 1314 + "itoa", 1315 + "num-bigint", 1316 + "percent-encoding", 1317 + "ryu", 1318 + "sha1_smol", 1319 + "socket2", 1320 + "url", 1321 + ] 1322 + 1323 + [[package]] 1324 + name = "redox_syscall" 1325 + version = "0.5.8" 1326 + source = "registry+https://github.com/rust-lang/crates.io-index" 1327 + checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 1328 + dependencies = [ 1329 + "bitflags", 1330 + ] 1331 + 1332 + [[package]] 1333 + name = "reqwest" 1334 + version = "0.12.12" 1335 + source = "registry+https://github.com/rust-lang/crates.io-index" 1336 + checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" 1337 + dependencies = [ 1338 + "base64", 1339 + "bytes", 1340 + "futures-core", 1341 + "futures-util", 1342 + "http", 1343 + "http-body", 1344 + "http-body-util", 1345 + "hyper", 1346 + "hyper-rustls", 1347 + "hyper-util", 1348 + "ipnet", 1349 + "js-sys", 1350 + "log", 1351 + "mime", 1352 + "mime_guess", 1353 + "once_cell", 1354 + "percent-encoding", 1355 + "pin-project-lite", 1356 + "quinn", 1357 + "rustls", 1358 + "rustls-pemfile", 1359 + "rustls-pki-types", 1360 + "serde", 1361 + "serde_json", 1362 + "serde_urlencoded", 1363 + "sync_wrapper", 1364 + "tokio", 1365 + "tokio-rustls", 1366 + "tower", 1367 + "tower-service", 1368 + "url", 1369 + "wasm-bindgen", 1370 + "wasm-bindgen-futures", 1371 + "web-sys", 1372 + "webpki-roots", 1373 + "windows-registry", 1374 + ] 1375 + 1376 + [[package]] 1377 + name = "ring" 1378 + version = "0.17.9" 1379 + source = "registry+https://github.com/rust-lang/crates.io-index" 1380 + checksum = "e75ec5e92c4d8aede845126adc388046234541629e76029599ed35a003c7ed24" 1381 + dependencies = [ 1382 + "cc", 1383 + "cfg-if", 1384 + "getrandom 0.2.15", 1385 + "libc", 1386 + "untrusted", 1387 + "windows-sys 0.52.0", 1388 + ] 1389 + 1390 + [[package]] 1391 + name = "rsa" 1392 + version = "0.9.7" 1393 + source = "registry+https://github.com/rust-lang/crates.io-index" 1394 + checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" 1395 + dependencies = [ 1396 + "const-oid", 1397 + "digest", 1398 + "num-bigint-dig", 1399 + "num-integer", 1400 + "num-traits", 1401 + "pkcs1", 1402 + "pkcs8", 1403 + "rand_core", 1404 + "signature", 1405 + "spki", 1406 + "subtle", 1407 + "zeroize", 1408 + ] 1409 + 1410 + [[package]] 1411 + name = "rustc-demangle" 1412 + version = "0.1.24" 1413 + source = "registry+https://github.com/rust-lang/crates.io-index" 1414 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1415 + 1416 + [[package]] 1417 + name = "rustc-hash" 1418 + version = "2.1.1" 1419 + source = "registry+https://github.com/rust-lang/crates.io-index" 1420 + checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1421 + 1422 + [[package]] 1423 + name = "rustix" 1424 + version = "0.38.44" 1425 + source = "registry+https://github.com/rust-lang/crates.io-index" 1426 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1427 + dependencies = [ 1428 + "bitflags", 1429 + "errno", 1430 + "libc", 1431 + "linux-raw-sys", 1432 + "windows-sys 0.59.0", 1433 + ] 1434 + 1435 + [[package]] 1436 + name = "rustls" 1437 + version = "0.23.23" 1438 + source = "registry+https://github.com/rust-lang/crates.io-index" 1439 + checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" 1440 + dependencies = [ 1441 + "once_cell", 1442 + "ring", 1443 + "rustls-pki-types", 1444 + "rustls-webpki", 1445 + "subtle", 1446 + "zeroize", 1447 + ] 1448 + 1449 + [[package]] 1450 + name = "rustls-pemfile" 1451 + version = "2.2.0" 1452 + source = "registry+https://github.com/rust-lang/crates.io-index" 1453 + checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1454 + dependencies = [ 1455 + "rustls-pki-types", 1456 + ] 1457 + 1458 + [[package]] 1459 + name = "rustls-pki-types" 1460 + version = "1.11.0" 1461 + source = "registry+https://github.com/rust-lang/crates.io-index" 1462 + checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1463 + dependencies = [ 1464 + "web-time", 1465 + ] 1466 + 1467 + [[package]] 1468 + name = "rustls-webpki" 1469 + version = "0.102.8" 1470 + source = "registry+https://github.com/rust-lang/crates.io-index" 1471 + checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1472 + dependencies = [ 1473 + "ring", 1474 + "rustls-pki-types", 1475 + "untrusted", 1476 + ] 1477 + 1478 + [[package]] 1479 + name = "rustversion" 1480 + version = "1.0.19" 1481 + source = "registry+https://github.com/rust-lang/crates.io-index" 1482 + checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" 1483 + 1484 + [[package]] 1485 + name = "ryu" 1486 + version = "1.0.19" 1487 + source = "registry+https://github.com/rust-lang/crates.io-index" 1488 + checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" 1489 + 1490 + [[package]] 1491 + name = "scopeguard" 1492 + version = "1.2.0" 1493 + source = "registry+https://github.com/rust-lang/crates.io-index" 1494 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1495 + 1496 + [[package]] 1497 + name = "serde" 1498 + version = "1.0.217" 1499 + source = "registry+https://github.com/rust-lang/crates.io-index" 1500 + checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 1501 + dependencies = [ 1502 + "serde_derive", 1503 + ] 1504 + 1505 + [[package]] 1506 + name = "serde_derive" 1507 + version = "1.0.217" 1508 + source = "registry+https://github.com/rust-lang/crates.io-index" 1509 + checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 1510 + dependencies = [ 1511 + "proc-macro2", 1512 + "quote", 1513 + "syn", 1514 + ] 1515 + 1516 + [[package]] 1517 + name = "serde_json" 1518 + version = "1.0.139" 1519 + source = "registry+https://github.com/rust-lang/crates.io-index" 1520 + checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" 1521 + dependencies = [ 1522 + "itoa", 1523 + "memchr", 1524 + "ryu", 1525 + "serde", 1526 + ] 1527 + 1528 + [[package]] 1529 + name = "serde_urlencoded" 1530 + version = "0.7.1" 1531 + source = "registry+https://github.com/rust-lang/crates.io-index" 1532 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1533 + dependencies = [ 1534 + "form_urlencoded", 1535 + "itoa", 1536 + "ryu", 1537 + "serde", 1538 + ] 1539 + 1540 + [[package]] 1541 + name = "sha1" 1542 + version = "0.10.6" 1543 + source = "registry+https://github.com/rust-lang/crates.io-index" 1544 + checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1545 + dependencies = [ 1546 + "cfg-if", 1547 + "cpufeatures", 1548 + "digest", 1549 + ] 1550 + 1551 + [[package]] 1552 + name = "sha1_smol" 1553 + version = "1.0.1" 1554 + source = "registry+https://github.com/rust-lang/crates.io-index" 1555 + checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" 1556 + 1557 + [[package]] 1558 + name = "sha2" 1559 + version = "0.10.8" 1560 + source = "registry+https://github.com/rust-lang/crates.io-index" 1561 + checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1562 + dependencies = [ 1563 + "cfg-if", 1564 + "cpufeatures", 1565 + "digest", 1566 + ] 1567 + 1568 + [[package]] 1569 + name = "shlex" 1570 + version = "1.3.0" 1571 + source = "registry+https://github.com/rust-lang/crates.io-index" 1572 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1573 + 1574 + [[package]] 1575 + name = "signal-hook-registry" 1576 + version = "1.4.2" 1577 + source = "registry+https://github.com/rust-lang/crates.io-index" 1578 + checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 1579 + dependencies = [ 1580 + "libc", 1581 + ] 1582 + 1583 + [[package]] 1584 + name = "signature" 1585 + version = "2.2.0" 1586 + source = "registry+https://github.com/rust-lang/crates.io-index" 1587 + checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" 1588 + dependencies = [ 1589 + "digest", 1590 + "rand_core", 1591 + ] 1592 + 1593 + [[package]] 1594 + name = "simple_asn1" 1595 + version = "0.6.3" 1596 + source = "registry+https://github.com/rust-lang/crates.io-index" 1597 + checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" 1598 + dependencies = [ 1599 + "num-bigint", 1600 + "num-traits", 1601 + "thiserror", 1602 + "time", 1603 + ] 1604 + 1605 + [[package]] 1606 + name = "slab" 1607 + version = "0.4.9" 1608 + source = "registry+https://github.com/rust-lang/crates.io-index" 1609 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1610 + dependencies = [ 1611 + "autocfg", 1612 + ] 1613 + 1614 + [[package]] 1615 + name = "smallvec" 1616 + version = "1.14.0" 1617 + source = "registry+https://github.com/rust-lang/crates.io-index" 1618 + checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" 1619 + dependencies = [ 1620 + "serde", 1621 + ] 1622 + 1623 + [[package]] 1624 + name = "socket2" 1625 + version = "0.5.8" 1626 + source = "registry+https://github.com/rust-lang/crates.io-index" 1627 + checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" 1628 + dependencies = [ 1629 + "libc", 1630 + "windows-sys 0.52.0", 1631 + ] 1632 + 1633 + [[package]] 1634 + name = "spin" 1635 + version = "0.9.8" 1636 + source = "registry+https://github.com/rust-lang/crates.io-index" 1637 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1638 + dependencies = [ 1639 + "lock_api", 1640 + ] 1641 + 1642 + [[package]] 1643 + name = "spki" 1644 + version = "0.7.3" 1645 + source = "registry+https://github.com/rust-lang/crates.io-index" 1646 + checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" 1647 + dependencies = [ 1648 + "base64ct", 1649 + "der", 1650 + ] 1651 + 1652 + [[package]] 1653 + name = "spotify" 1654 + version = "0.1.0" 1655 + dependencies = [ 1656 + "aes", 1657 + "anyhow", 1658 + "chrono", 1659 + "ctr", 1660 + "dotenv", 1661 + "hex", 1662 + "jsonwebtoken", 1663 + "owo-colors", 1664 + "redis", 1665 + "reqwest", 1666 + "serde", 1667 + "serde_json", 1668 + "sqlx", 1669 + "tokio", 1670 + ] 1671 + 1672 + [[package]] 1673 + name = "sqlx" 1674 + version = "0.8.3" 1675 + source = "registry+https://github.com/rust-lang/crates.io-index" 1676 + checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" 1677 + dependencies = [ 1678 + "sqlx-core", 1679 + "sqlx-macros", 1680 + "sqlx-mysql", 1681 + "sqlx-postgres", 1682 + "sqlx-sqlite", 1683 + ] 1684 + 1685 + [[package]] 1686 + name = "sqlx-core" 1687 + version = "0.8.3" 1688 + source = "registry+https://github.com/rust-lang/crates.io-index" 1689 + checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" 1690 + dependencies = [ 1691 + "bytes", 1692 + "chrono", 1693 + "crc", 1694 + "crossbeam-queue", 1695 + "either", 1696 + "event-listener", 1697 + "futures-core", 1698 + "futures-intrusive", 1699 + "futures-io", 1700 + "futures-util", 1701 + "hashbrown", 1702 + "hashlink", 1703 + "indexmap", 1704 + "log", 1705 + "memchr", 1706 + "once_cell", 1707 + "percent-encoding", 1708 + "rustls", 1709 + "rustls-pemfile", 1710 + "serde", 1711 + "serde_json", 1712 + "sha2", 1713 + "smallvec", 1714 + "thiserror", 1715 + "tokio", 1716 + "tokio-stream", 1717 + "tracing", 1718 + "url", 1719 + "webpki-roots", 1720 + ] 1721 + 1722 + [[package]] 1723 + name = "sqlx-macros" 1724 + version = "0.8.3" 1725 + source = "registry+https://github.com/rust-lang/crates.io-index" 1726 + checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" 1727 + dependencies = [ 1728 + "proc-macro2", 1729 + "quote", 1730 + "sqlx-core", 1731 + "sqlx-macros-core", 1732 + "syn", 1733 + ] 1734 + 1735 + [[package]] 1736 + name = "sqlx-macros-core" 1737 + version = "0.8.3" 1738 + source = "registry+https://github.com/rust-lang/crates.io-index" 1739 + checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" 1740 + dependencies = [ 1741 + "dotenvy", 1742 + "either", 1743 + "heck", 1744 + "hex", 1745 + "once_cell", 1746 + "proc-macro2", 1747 + "quote", 1748 + "serde", 1749 + "serde_json", 1750 + "sha2", 1751 + "sqlx-core", 1752 + "sqlx-mysql", 1753 + "sqlx-postgres", 1754 + "sqlx-sqlite", 1755 + "syn", 1756 + "tempfile", 1757 + "tokio", 1758 + "url", 1759 + ] 1760 + 1761 + [[package]] 1762 + name = "sqlx-mysql" 1763 + version = "0.8.3" 1764 + source = "registry+https://github.com/rust-lang/crates.io-index" 1765 + checksum = "4560278f0e00ce64938540546f59f590d60beee33fffbd3b9cd47851e5fff233" 1766 + dependencies = [ 1767 + "atoi", 1768 + "base64", 1769 + "bitflags", 1770 + "byteorder", 1771 + "bytes", 1772 + "chrono", 1773 + "crc", 1774 + "digest", 1775 + "dotenvy", 1776 + "either", 1777 + "futures-channel", 1778 + "futures-core", 1779 + "futures-io", 1780 + "futures-util", 1781 + "generic-array", 1782 + "hex", 1783 + "hkdf", 1784 + "hmac", 1785 + "itoa", 1786 + "log", 1787 + "md-5", 1788 + "memchr", 1789 + "once_cell", 1790 + "percent-encoding", 1791 + "rand", 1792 + "rsa", 1793 + "serde", 1794 + "sha1", 1795 + "sha2", 1796 + "smallvec", 1797 + "sqlx-core", 1798 + "stringprep", 1799 + "thiserror", 1800 + "tracing", 1801 + "whoami", 1802 + ] 1803 + 1804 + [[package]] 1805 + name = "sqlx-postgres" 1806 + version = "0.8.3" 1807 + source = "registry+https://github.com/rust-lang/crates.io-index" 1808 + checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" 1809 + dependencies = [ 1810 + "atoi", 1811 + "base64", 1812 + "bitflags", 1813 + "byteorder", 1814 + "chrono", 1815 + "crc", 1816 + "dotenvy", 1817 + "etcetera", 1818 + "futures-channel", 1819 + "futures-core", 1820 + "futures-util", 1821 + "hex", 1822 + "hkdf", 1823 + "hmac", 1824 + "home", 1825 + "itoa", 1826 + "log", 1827 + "md-5", 1828 + "memchr", 1829 + "once_cell", 1830 + "rand", 1831 + "serde", 1832 + "serde_json", 1833 + "sha2", 1834 + "smallvec", 1835 + "sqlx-core", 1836 + "stringprep", 1837 + "thiserror", 1838 + "tracing", 1839 + "whoami", 1840 + ] 1841 + 1842 + [[package]] 1843 + name = "sqlx-sqlite" 1844 + version = "0.8.3" 1845 + source = "registry+https://github.com/rust-lang/crates.io-index" 1846 + checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" 1847 + dependencies = [ 1848 + "atoi", 1849 + "chrono", 1850 + "flume", 1851 + "futures-channel", 1852 + "futures-core", 1853 + "futures-executor", 1854 + "futures-intrusive", 1855 + "futures-util", 1856 + "libsqlite3-sys", 1857 + "log", 1858 + "percent-encoding", 1859 + "serde", 1860 + "serde_urlencoded", 1861 + "sqlx-core", 1862 + "tracing", 1863 + "url", 1864 + ] 1865 + 1866 + [[package]] 1867 + name = "stable_deref_trait" 1868 + version = "1.2.0" 1869 + source = "registry+https://github.com/rust-lang/crates.io-index" 1870 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1871 + 1872 + [[package]] 1873 + name = "stringprep" 1874 + version = "0.1.5" 1875 + source = "registry+https://github.com/rust-lang/crates.io-index" 1876 + checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 1877 + dependencies = [ 1878 + "unicode-bidi", 1879 + "unicode-normalization", 1880 + "unicode-properties", 1881 + ] 1882 + 1883 + [[package]] 1884 + name = "subtle" 1885 + version = "2.6.1" 1886 + source = "registry+https://github.com/rust-lang/crates.io-index" 1887 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1888 + 1889 + [[package]] 1890 + name = "syn" 1891 + version = "2.0.98" 1892 + source = "registry+https://github.com/rust-lang/crates.io-index" 1893 + checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" 1894 + dependencies = [ 1895 + "proc-macro2", 1896 + "quote", 1897 + "unicode-ident", 1898 + ] 1899 + 1900 + [[package]] 1901 + name = "sync_wrapper" 1902 + version = "1.0.2" 1903 + source = "registry+https://github.com/rust-lang/crates.io-index" 1904 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1905 + dependencies = [ 1906 + "futures-core", 1907 + ] 1908 + 1909 + [[package]] 1910 + name = "synstructure" 1911 + version = "0.13.1" 1912 + source = "registry+https://github.com/rust-lang/crates.io-index" 1913 + checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1914 + dependencies = [ 1915 + "proc-macro2", 1916 + "quote", 1917 + "syn", 1918 + ] 1919 + 1920 + [[package]] 1921 + name = "tempfile" 1922 + version = "3.17.1" 1923 + source = "registry+https://github.com/rust-lang/crates.io-index" 1924 + checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" 1925 + dependencies = [ 1926 + "cfg-if", 1927 + "fastrand", 1928 + "getrandom 0.3.1", 1929 + "once_cell", 1930 + "rustix", 1931 + "windows-sys 0.59.0", 1932 + ] 1933 + 1934 + [[package]] 1935 + name = "thiserror" 1936 + version = "2.0.11" 1937 + source = "registry+https://github.com/rust-lang/crates.io-index" 1938 + checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" 1939 + dependencies = [ 1940 + "thiserror-impl", 1941 + ] 1942 + 1943 + [[package]] 1944 + name = "thiserror-impl" 1945 + version = "2.0.11" 1946 + source = "registry+https://github.com/rust-lang/crates.io-index" 1947 + checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" 1948 + dependencies = [ 1949 + "proc-macro2", 1950 + "quote", 1951 + "syn", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "time" 1956 + version = "0.3.37" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" 1959 + dependencies = [ 1960 + "deranged", 1961 + "itoa", 1962 + "num-conv", 1963 + "powerfmt", 1964 + "serde", 1965 + "time-core", 1966 + "time-macros", 1967 + ] 1968 + 1969 + [[package]] 1970 + name = "time-core" 1971 + version = "0.1.2" 1972 + source = "registry+https://github.com/rust-lang/crates.io-index" 1973 + checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1974 + 1975 + [[package]] 1976 + name = "time-macros" 1977 + version = "0.2.19" 1978 + source = "registry+https://github.com/rust-lang/crates.io-index" 1979 + checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" 1980 + dependencies = [ 1981 + "num-conv", 1982 + "time-core", 1983 + ] 1984 + 1985 + [[package]] 1986 + name = "tinystr" 1987 + version = "0.7.6" 1988 + source = "registry+https://github.com/rust-lang/crates.io-index" 1989 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1990 + dependencies = [ 1991 + "displaydoc", 1992 + "zerovec", 1993 + ] 1994 + 1995 + [[package]] 1996 + name = "tinyvec" 1997 + version = "1.8.1" 1998 + source = "registry+https://github.com/rust-lang/crates.io-index" 1999 + checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" 2000 + dependencies = [ 2001 + "tinyvec_macros", 2002 + ] 2003 + 2004 + [[package]] 2005 + name = "tinyvec_macros" 2006 + version = "0.1.1" 2007 + source = "registry+https://github.com/rust-lang/crates.io-index" 2008 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2009 + 2010 + [[package]] 2011 + name = "tokio" 2012 + version = "1.43.0" 2013 + source = "registry+https://github.com/rust-lang/crates.io-index" 2014 + checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" 2015 + dependencies = [ 2016 + "backtrace", 2017 + "bytes", 2018 + "libc", 2019 + "mio", 2020 + "parking_lot", 2021 + "pin-project-lite", 2022 + "signal-hook-registry", 2023 + "socket2", 2024 + "tokio-macros", 2025 + "windows-sys 0.52.0", 2026 + ] 2027 + 2028 + [[package]] 2029 + name = "tokio-macros" 2030 + version = "2.5.0" 2031 + source = "registry+https://github.com/rust-lang/crates.io-index" 2032 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2033 + dependencies = [ 2034 + "proc-macro2", 2035 + "quote", 2036 + "syn", 2037 + ] 2038 + 2039 + [[package]] 2040 + name = "tokio-rustls" 2041 + version = "0.26.1" 2042 + source = "registry+https://github.com/rust-lang/crates.io-index" 2043 + checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" 2044 + dependencies = [ 2045 + "rustls", 2046 + "tokio", 2047 + ] 2048 + 2049 + [[package]] 2050 + name = "tokio-stream" 2051 + version = "0.1.17" 2052 + source = "registry+https://github.com/rust-lang/crates.io-index" 2053 + checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 2054 + dependencies = [ 2055 + "futures-core", 2056 + "pin-project-lite", 2057 + "tokio", 2058 + ] 2059 + 2060 + [[package]] 2061 + name = "tower" 2062 + version = "0.5.2" 2063 + source = "registry+https://github.com/rust-lang/crates.io-index" 2064 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2065 + dependencies = [ 2066 + "futures-core", 2067 + "futures-util", 2068 + "pin-project-lite", 2069 + "sync_wrapper", 2070 + "tokio", 2071 + "tower-layer", 2072 + "tower-service", 2073 + ] 2074 + 2075 + [[package]] 2076 + name = "tower-layer" 2077 + version = "0.3.3" 2078 + source = "registry+https://github.com/rust-lang/crates.io-index" 2079 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2080 + 2081 + [[package]] 2082 + name = "tower-service" 2083 + version = "0.3.3" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2086 + 2087 + [[package]] 2088 + name = "tracing" 2089 + version = "0.1.41" 2090 + source = "registry+https://github.com/rust-lang/crates.io-index" 2091 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2092 + dependencies = [ 2093 + "log", 2094 + "pin-project-lite", 2095 + "tracing-attributes", 2096 + "tracing-core", 2097 + ] 2098 + 2099 + [[package]] 2100 + name = "tracing-attributes" 2101 + version = "0.1.28" 2102 + source = "registry+https://github.com/rust-lang/crates.io-index" 2103 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 2104 + dependencies = [ 2105 + "proc-macro2", 2106 + "quote", 2107 + "syn", 2108 + ] 2109 + 2110 + [[package]] 2111 + name = "tracing-core" 2112 + version = "0.1.33" 2113 + source = "registry+https://github.com/rust-lang/crates.io-index" 2114 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 2115 + dependencies = [ 2116 + "once_cell", 2117 + ] 2118 + 2119 + [[package]] 2120 + name = "try-lock" 2121 + version = "0.2.5" 2122 + source = "registry+https://github.com/rust-lang/crates.io-index" 2123 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2124 + 2125 + [[package]] 2126 + name = "typenum" 2127 + version = "1.18.0" 2128 + source = "registry+https://github.com/rust-lang/crates.io-index" 2129 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2130 + 2131 + [[package]] 2132 + name = "unicase" 2133 + version = "2.8.1" 2134 + source = "registry+https://github.com/rust-lang/crates.io-index" 2135 + checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2136 + 2137 + [[package]] 2138 + name = "unicode-bidi" 2139 + version = "0.3.18" 2140 + source = "registry+https://github.com/rust-lang/crates.io-index" 2141 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 2142 + 2143 + [[package]] 2144 + name = "unicode-ident" 2145 + version = "1.0.17" 2146 + source = "registry+https://github.com/rust-lang/crates.io-index" 2147 + checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" 2148 + 2149 + [[package]] 2150 + name = "unicode-normalization" 2151 + version = "0.1.24" 2152 + source = "registry+https://github.com/rust-lang/crates.io-index" 2153 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 2154 + dependencies = [ 2155 + "tinyvec", 2156 + ] 2157 + 2158 + [[package]] 2159 + name = "unicode-properties" 2160 + version = "0.1.3" 2161 + source = "registry+https://github.com/rust-lang/crates.io-index" 2162 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 2163 + 2164 + [[package]] 2165 + name = "untrusted" 2166 + version = "0.9.0" 2167 + source = "registry+https://github.com/rust-lang/crates.io-index" 2168 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2169 + 2170 + [[package]] 2171 + name = "url" 2172 + version = "2.5.4" 2173 + source = "registry+https://github.com/rust-lang/crates.io-index" 2174 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2175 + dependencies = [ 2176 + "form_urlencoded", 2177 + "idna", 2178 + "percent-encoding", 2179 + ] 2180 + 2181 + [[package]] 2182 + name = "utf16_iter" 2183 + version = "1.0.5" 2184 + source = "registry+https://github.com/rust-lang/crates.io-index" 2185 + checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 2186 + 2187 + [[package]] 2188 + name = "utf8_iter" 2189 + version = "1.0.4" 2190 + source = "registry+https://github.com/rust-lang/crates.io-index" 2191 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2192 + 2193 + [[package]] 2194 + name = "vcpkg" 2195 + version = "0.2.15" 2196 + source = "registry+https://github.com/rust-lang/crates.io-index" 2197 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2198 + 2199 + [[package]] 2200 + name = "version_check" 2201 + version = "0.9.5" 2202 + source = "registry+https://github.com/rust-lang/crates.io-index" 2203 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2204 + 2205 + [[package]] 2206 + name = "want" 2207 + version = "0.3.1" 2208 + source = "registry+https://github.com/rust-lang/crates.io-index" 2209 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2210 + dependencies = [ 2211 + "try-lock", 2212 + ] 2213 + 2214 + [[package]] 2215 + name = "wasi" 2216 + version = "0.11.0+wasi-snapshot-preview1" 2217 + source = "registry+https://github.com/rust-lang/crates.io-index" 2218 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2219 + 2220 + [[package]] 2221 + name = "wasi" 2222 + version = "0.13.3+wasi-0.2.2" 2223 + source = "registry+https://github.com/rust-lang/crates.io-index" 2224 + checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" 2225 + dependencies = [ 2226 + "wit-bindgen-rt", 2227 + ] 2228 + 2229 + [[package]] 2230 + name = "wasite" 2231 + version = "0.1.0" 2232 + source = "registry+https://github.com/rust-lang/crates.io-index" 2233 + checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" 2234 + 2235 + [[package]] 2236 + name = "wasm-bindgen" 2237 + version = "0.2.100" 2238 + source = "registry+https://github.com/rust-lang/crates.io-index" 2239 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2240 + dependencies = [ 2241 + "cfg-if", 2242 + "once_cell", 2243 + "rustversion", 2244 + "wasm-bindgen-macro", 2245 + ] 2246 + 2247 + [[package]] 2248 + name = "wasm-bindgen-backend" 2249 + version = "0.2.100" 2250 + source = "registry+https://github.com/rust-lang/crates.io-index" 2251 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2252 + dependencies = [ 2253 + "bumpalo", 2254 + "log", 2255 + "proc-macro2", 2256 + "quote", 2257 + "syn", 2258 + "wasm-bindgen-shared", 2259 + ] 2260 + 2261 + [[package]] 2262 + name = "wasm-bindgen-futures" 2263 + version = "0.4.50" 2264 + source = "registry+https://github.com/rust-lang/crates.io-index" 2265 + checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2266 + dependencies = [ 2267 + "cfg-if", 2268 + "js-sys", 2269 + "once_cell", 2270 + "wasm-bindgen", 2271 + "web-sys", 2272 + ] 2273 + 2274 + [[package]] 2275 + name = "wasm-bindgen-macro" 2276 + version = "0.2.100" 2277 + source = "registry+https://github.com/rust-lang/crates.io-index" 2278 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2279 + dependencies = [ 2280 + "quote", 2281 + "wasm-bindgen-macro-support", 2282 + ] 2283 + 2284 + [[package]] 2285 + name = "wasm-bindgen-macro-support" 2286 + version = "0.2.100" 2287 + source = "registry+https://github.com/rust-lang/crates.io-index" 2288 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2289 + dependencies = [ 2290 + "proc-macro2", 2291 + "quote", 2292 + "syn", 2293 + "wasm-bindgen-backend", 2294 + "wasm-bindgen-shared", 2295 + ] 2296 + 2297 + [[package]] 2298 + name = "wasm-bindgen-shared" 2299 + version = "0.2.100" 2300 + source = "registry+https://github.com/rust-lang/crates.io-index" 2301 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2302 + dependencies = [ 2303 + "unicode-ident", 2304 + ] 2305 + 2306 + [[package]] 2307 + name = "web-sys" 2308 + version = "0.3.77" 2309 + source = "registry+https://github.com/rust-lang/crates.io-index" 2310 + checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2311 + dependencies = [ 2312 + "js-sys", 2313 + "wasm-bindgen", 2314 + ] 2315 + 2316 + [[package]] 2317 + name = "web-time" 2318 + version = "1.1.0" 2319 + source = "registry+https://github.com/rust-lang/crates.io-index" 2320 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2321 + dependencies = [ 2322 + "js-sys", 2323 + "wasm-bindgen", 2324 + ] 2325 + 2326 + [[package]] 2327 + name = "webpki-roots" 2328 + version = "0.26.8" 2329 + source = "registry+https://github.com/rust-lang/crates.io-index" 2330 + checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" 2331 + dependencies = [ 2332 + "rustls-pki-types", 2333 + ] 2334 + 2335 + [[package]] 2336 + name = "whoami" 2337 + version = "1.5.2" 2338 + source = "registry+https://github.com/rust-lang/crates.io-index" 2339 + checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" 2340 + dependencies = [ 2341 + "redox_syscall", 2342 + "wasite", 2343 + ] 2344 + 2345 + [[package]] 2346 + name = "windows-core" 2347 + version = "0.52.0" 2348 + source = "registry+https://github.com/rust-lang/crates.io-index" 2349 + checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2350 + dependencies = [ 2351 + "windows-targets 0.52.6", 2352 + ] 2353 + 2354 + [[package]] 2355 + name = "windows-registry" 2356 + version = "0.2.0" 2357 + source = "registry+https://github.com/rust-lang/crates.io-index" 2358 + checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" 2359 + dependencies = [ 2360 + "windows-result", 2361 + "windows-strings", 2362 + "windows-targets 0.52.6", 2363 + ] 2364 + 2365 + [[package]] 2366 + name = "windows-result" 2367 + version = "0.2.0" 2368 + source = "registry+https://github.com/rust-lang/crates.io-index" 2369 + checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 2370 + dependencies = [ 2371 + "windows-targets 0.52.6", 2372 + ] 2373 + 2374 + [[package]] 2375 + name = "windows-strings" 2376 + version = "0.1.0" 2377 + source = "registry+https://github.com/rust-lang/crates.io-index" 2378 + checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 2379 + dependencies = [ 2380 + "windows-result", 2381 + "windows-targets 0.52.6", 2382 + ] 2383 + 2384 + [[package]] 2385 + name = "windows-sys" 2386 + version = "0.48.0" 2387 + source = "registry+https://github.com/rust-lang/crates.io-index" 2388 + checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2389 + dependencies = [ 2390 + "windows-targets 0.48.5", 2391 + ] 2392 + 2393 + [[package]] 2394 + name = "windows-sys" 2395 + version = "0.52.0" 2396 + source = "registry+https://github.com/rust-lang/crates.io-index" 2397 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2398 + dependencies = [ 2399 + "windows-targets 0.52.6", 2400 + ] 2401 + 2402 + [[package]] 2403 + name = "windows-sys" 2404 + version = "0.59.0" 2405 + source = "registry+https://github.com/rust-lang/crates.io-index" 2406 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2407 + dependencies = [ 2408 + "windows-targets 0.52.6", 2409 + ] 2410 + 2411 + [[package]] 2412 + name = "windows-targets" 2413 + version = "0.48.5" 2414 + source = "registry+https://github.com/rust-lang/crates.io-index" 2415 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2416 + dependencies = [ 2417 + "windows_aarch64_gnullvm 0.48.5", 2418 + "windows_aarch64_msvc 0.48.5", 2419 + "windows_i686_gnu 0.48.5", 2420 + "windows_i686_msvc 0.48.5", 2421 + "windows_x86_64_gnu 0.48.5", 2422 + "windows_x86_64_gnullvm 0.48.5", 2423 + "windows_x86_64_msvc 0.48.5", 2424 + ] 2425 + 2426 + [[package]] 2427 + name = "windows-targets" 2428 + version = "0.52.6" 2429 + source = "registry+https://github.com/rust-lang/crates.io-index" 2430 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2431 + dependencies = [ 2432 + "windows_aarch64_gnullvm 0.52.6", 2433 + "windows_aarch64_msvc 0.52.6", 2434 + "windows_i686_gnu 0.52.6", 2435 + "windows_i686_gnullvm", 2436 + "windows_i686_msvc 0.52.6", 2437 + "windows_x86_64_gnu 0.52.6", 2438 + "windows_x86_64_gnullvm 0.52.6", 2439 + "windows_x86_64_msvc 0.52.6", 2440 + ] 2441 + 2442 + [[package]] 2443 + name = "windows_aarch64_gnullvm" 2444 + version = "0.48.5" 2445 + source = "registry+https://github.com/rust-lang/crates.io-index" 2446 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2447 + 2448 + [[package]] 2449 + name = "windows_aarch64_gnullvm" 2450 + version = "0.52.6" 2451 + source = "registry+https://github.com/rust-lang/crates.io-index" 2452 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2453 + 2454 + [[package]] 2455 + name = "windows_aarch64_msvc" 2456 + version = "0.48.5" 2457 + source = "registry+https://github.com/rust-lang/crates.io-index" 2458 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2459 + 2460 + [[package]] 2461 + name = "windows_aarch64_msvc" 2462 + version = "0.52.6" 2463 + source = "registry+https://github.com/rust-lang/crates.io-index" 2464 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2465 + 2466 + [[package]] 2467 + name = "windows_i686_gnu" 2468 + version = "0.48.5" 2469 + source = "registry+https://github.com/rust-lang/crates.io-index" 2470 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2471 + 2472 + [[package]] 2473 + name = "windows_i686_gnu" 2474 + version = "0.52.6" 2475 + source = "registry+https://github.com/rust-lang/crates.io-index" 2476 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2477 + 2478 + [[package]] 2479 + name = "windows_i686_gnullvm" 2480 + version = "0.52.6" 2481 + source = "registry+https://github.com/rust-lang/crates.io-index" 2482 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2483 + 2484 + [[package]] 2485 + name = "windows_i686_msvc" 2486 + version = "0.48.5" 2487 + source = "registry+https://github.com/rust-lang/crates.io-index" 2488 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2489 + 2490 + [[package]] 2491 + name = "windows_i686_msvc" 2492 + version = "0.52.6" 2493 + source = "registry+https://github.com/rust-lang/crates.io-index" 2494 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2495 + 2496 + [[package]] 2497 + name = "windows_x86_64_gnu" 2498 + version = "0.48.5" 2499 + source = "registry+https://github.com/rust-lang/crates.io-index" 2500 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2501 + 2502 + [[package]] 2503 + name = "windows_x86_64_gnu" 2504 + version = "0.52.6" 2505 + source = "registry+https://github.com/rust-lang/crates.io-index" 2506 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2507 + 2508 + [[package]] 2509 + name = "windows_x86_64_gnullvm" 2510 + version = "0.48.5" 2511 + source = "registry+https://github.com/rust-lang/crates.io-index" 2512 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2513 + 2514 + [[package]] 2515 + name = "windows_x86_64_gnullvm" 2516 + version = "0.52.6" 2517 + source = "registry+https://github.com/rust-lang/crates.io-index" 2518 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2519 + 2520 + [[package]] 2521 + name = "windows_x86_64_msvc" 2522 + version = "0.48.5" 2523 + source = "registry+https://github.com/rust-lang/crates.io-index" 2524 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2525 + 2526 + [[package]] 2527 + name = "windows_x86_64_msvc" 2528 + version = "0.52.6" 2529 + source = "registry+https://github.com/rust-lang/crates.io-index" 2530 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2531 + 2532 + [[package]] 2533 + name = "wit-bindgen-rt" 2534 + version = "0.33.0" 2535 + source = "registry+https://github.com/rust-lang/crates.io-index" 2536 + checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" 2537 + dependencies = [ 2538 + "bitflags", 2539 + ] 2540 + 2541 + [[package]] 2542 + name = "write16" 2543 + version = "1.0.0" 2544 + source = "registry+https://github.com/rust-lang/crates.io-index" 2545 + checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2546 + 2547 + [[package]] 2548 + name = "writeable" 2549 + version = "0.5.5" 2550 + source = "registry+https://github.com/rust-lang/crates.io-index" 2551 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2552 + 2553 + [[package]] 2554 + name = "yoke" 2555 + version = "0.7.5" 2556 + source = "registry+https://github.com/rust-lang/crates.io-index" 2557 + checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2558 + dependencies = [ 2559 + "serde", 2560 + "stable_deref_trait", 2561 + "yoke-derive", 2562 + "zerofrom", 2563 + ] 2564 + 2565 + [[package]] 2566 + name = "yoke-derive" 2567 + version = "0.7.5" 2568 + source = "registry+https://github.com/rust-lang/crates.io-index" 2569 + checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2570 + dependencies = [ 2571 + "proc-macro2", 2572 + "quote", 2573 + "syn", 2574 + "synstructure", 2575 + ] 2576 + 2577 + [[package]] 2578 + name = "zerocopy" 2579 + version = "0.7.35" 2580 + source = "registry+https://github.com/rust-lang/crates.io-index" 2581 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2582 + dependencies = [ 2583 + "byteorder", 2584 + "zerocopy-derive", 2585 + ] 2586 + 2587 + [[package]] 2588 + name = "zerocopy-derive" 2589 + version = "0.7.35" 2590 + source = "registry+https://github.com/rust-lang/crates.io-index" 2591 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2592 + dependencies = [ 2593 + "proc-macro2", 2594 + "quote", 2595 + "syn", 2596 + ] 2597 + 2598 + [[package]] 2599 + name = "zerofrom" 2600 + version = "0.1.5" 2601 + source = "registry+https://github.com/rust-lang/crates.io-index" 2602 + checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 2603 + dependencies = [ 2604 + "zerofrom-derive", 2605 + ] 2606 + 2607 + [[package]] 2608 + name = "zerofrom-derive" 2609 + version = "0.1.5" 2610 + source = "registry+https://github.com/rust-lang/crates.io-index" 2611 + checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 2612 + dependencies = [ 2613 + "proc-macro2", 2614 + "quote", 2615 + "syn", 2616 + "synstructure", 2617 + ] 2618 + 2619 + [[package]] 2620 + name = "zeroize" 2621 + version = "1.8.1" 2622 + source = "registry+https://github.com/rust-lang/crates.io-index" 2623 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2624 + 2625 + [[package]] 2626 + name = "zerovec" 2627 + version = "0.10.4" 2628 + source = "registry+https://github.com/rust-lang/crates.io-index" 2629 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2630 + dependencies = [ 2631 + "yoke", 2632 + "zerofrom", 2633 + "zerovec-derive", 2634 + ] 2635 + 2636 + [[package]] 2637 + name = "zerovec-derive" 2638 + version = "0.10.3" 2639 + source = "registry+https://github.com/rust-lang/crates.io-index" 2640 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2641 + dependencies = [ 2642 + "proc-macro2", 2643 + "quote", 2644 + "syn", 2645 + ]
+15
Cargo.toml
··· 1 + [workspace] 2 + default-members = ["crates/*"] 3 + members = [ 4 + "crates/*" 5 + ] 6 + resolver = "2" 7 + 8 + [workspace.package] 9 + authors = ["Tsiry Sandratraina <tsiry.sndr@fluentci.io"] 10 + edition = "2021" 11 + license = "LGPL-2.1" 12 + repository = "https://github.com/tsirysndr/rocksky" 13 + 14 + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 15 +
+1
crates/spotify/.gitignore
··· 1 + .env
+38
crates/spotify/Cargo.toml
··· 1 + [package] 2 + name = "spotify" 3 + version = "0.1.0" 4 + authors.workspace = true 5 + edition.workspace = true 6 + license.workspace = true 7 + repository.workspace = true 8 + 9 + [[bin]] 10 + name = "spotify" 11 + path = "src/main.rs" 12 + 13 + [dependencies] 14 + aes = "0.8.4" 15 + anyhow = "1.0.96" 16 + chrono = { version = "0.4.39", features = ["serde"] } 17 + ctr = "0.9.2" 18 + dotenv = "0.15.0" 19 + hex = "0.4.3" 20 + jsonwebtoken = "9.3.1" 21 + owo-colors = "4.1.0" 22 + redis = "0.29.0" 23 + reqwest = { version = "0.12.12", features = [ 24 + "rustls-tls", 25 + "json", 26 + "multipart", 27 + ], default-features = false } 28 + serde = { version = "1.0.217", features = ["derive"] } 29 + serde_json = "1.0.139" 30 + sqlx = { version = "0.8.3", features = [ 31 + "runtime-tokio", 32 + "tls-rustls", 33 + "postgres", 34 + "chrono", 35 + "derive", 36 + "macros", 37 + ] } 38 + tokio = { version = "1.43.0", features = ["full"] }
+40
crates/spotify/src/cache.rs
··· 1 + use anyhow::Error; 2 + use redis::Client; 3 + use std::env; 4 + 5 + pub struct Cache { 6 + pub client: Client, 7 + } 8 + 9 + impl Cache { 10 + pub fn new() -> Result<Self, Error> { 11 + let client = 12 + redis::Client::open(env::var("REDIS_URL").unwrap_or("redis://127.0.0.1".into()))?; 13 + Ok(Cache { client }) 14 + } 15 + 16 + pub fn get(&self, key: &str) -> Result<Option<String>, Error> { 17 + let mut con = self.client.get_connection()?; 18 + let result: Option<String> = redis::cmd("GET").arg(key).query(&mut con)?; 19 + Ok(result) 20 + } 21 + 22 + pub fn set(&self, key: &str, value: &str) -> Result<(), Error> { 23 + let mut con = self.client.get_connection()?; 24 + redis::cmd("SET") 25 + .arg(key) 26 + .arg(value) 27 + .query::<()>(&mut con)?; 28 + Ok(()) 29 + } 30 + 31 + pub fn setex(&self, key: &str, value: &str, seconds: usize) -> Result<(), Error> { 32 + let mut con = self.client.get_connection()?; 33 + redis::cmd("SETEX") 34 + .arg(key) 35 + .arg(seconds) 36 + .arg(value) 37 + .query::<()>(&mut con)?; 38 + Ok(()) 39 + } 40 + }
+22
crates/spotify/src/crypto.rs
··· 1 + use std::env; 2 + 3 + use aes::{ 4 + cipher::{KeyIvInit, StreamCipher}, 5 + Aes256, 6 + }; 7 + use anyhow::Error; 8 + use hex::decode; 9 + 10 + type Aes256Ctr = ctr::Ctr64BE<Aes256>; 11 + 12 + pub fn decrypt_aes_256_ctr(encrypted_text: &str, key: &[u8]) -> Result<String, Error> { 13 + let iv = decode(env::var("SPOTIFY_ENCRYPTION_IV")?)?; 14 + let ciphertext = decode(encrypted_text)?; 15 + 16 + let mut cipher = 17 + Aes256Ctr::new_from_slices(key, &iv).map_err(|_| Error::msg("Invalid key or IV"))?; 18 + let mut decrypted_data = ciphertext.clone(); 19 + cipher.apply_keystream(&mut decrypted_data); 20 + 21 + Ok(String::from_utf8(decrypted_data)?) 22 + }
+233
crates/spotify/src/main.rs
··· 1 + use std::{env, thread}; 2 + 3 + use cache::Cache; 4 + use crypto::decrypt_aes_256_ctr; 5 + use dotenv::dotenv; 6 + use reqwest::Client; 7 + use anyhow::Error; 8 + use rocksky::scrobble; 9 + use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; 10 + use types::{album_tracks::AlbumTracks, currently_playing::{Album, Artist, CurrentlyPlaying}, spotify_token::SpotifyTokenWithEmail, token::AccessToken}; 11 + use owo_colors::OwoColorize; 12 + 13 + pub mod types; 14 + pub mod cache; 15 + pub mod crypto; 16 + pub mod rocksky; 17 + pub mod token; 18 + 19 + const BASE_URL: &str = "https://api.spotify.com/v1"; 20 + 21 + #[tokio::main] 22 + async fn main() -> Result<(), Box<dyn std::error::Error>> { 23 + dotenv().ok(); 24 + let pool= PgPoolOptions::new().max_connections(5).connect(&env::var("XATA_POSTGRES_URL")?).await?; 25 + 26 + let users = find_spotify_users(&pool, 0, 100).await?; 27 + 28 + for user in users { 29 + let email = user.0.clone(); 30 + let token = user.1.clone(); 31 + thread::spawn(move || { 32 + let rt = tokio::runtime::Runtime::new().unwrap(); 33 + rt.block_on(async { 34 + watch_currently_playing(email, token).await; 35 + Ok::<(), Error>(()) 36 + }).unwrap(); 37 + }); 38 + } 39 + 40 + // wait for all threads to finish 41 + loop { 42 + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; 43 + } 44 + } 45 + 46 + pub async fn refresh_token(token: &str) -> Result<AccessToken, Error> { 47 + if env::var("SPOTIFY_CLIENT_ID").is_err() || env::var("SPOTIFY_CLIENT_SECRET").is_err() { 48 + panic!("Please set SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET environment variables"); 49 + } 50 + 51 + let client_id = env::var("SPOTIFY_CLIENT_ID")?; 52 + let client_secret = env::var("SPOTIFY_CLIENT_SECRET")?; 53 + 54 + let client = Client::new(); 55 + 56 + let response = client.post("https://accounts.spotify.com/api/token") 57 + .basic_auth(&client_id, Some(client_secret)) 58 + .form(&[ 59 + ("grant_type", "refresh_token"), 60 + ("refresh_token", token), 61 + ("client_id", &client_id) 62 + ]) 63 + .send() 64 + .await?; 65 + let token = response.json::<AccessToken>().await?; 66 + Ok(token) 67 + } 68 + 69 + pub async fn get_currently_playing(cache: Cache, user_id: &str, token: &str) -> Result<Option<(CurrentlyPlaying, bool)>, Error> { 70 + if let Ok(Some(data)) = cache.get(user_id) { 71 + let data: CurrentlyPlaying = serde_json::from_str(&data)?; 72 + // detect if the song has changed 73 + let previous = cache.get(&format!("{}:previous", user_id))?; 74 + let changed = match previous { 75 + Some(previous) => { 76 + let previous: CurrentlyPlaying = serde_json::from_str(&previous)?; 77 + previous.item.id != data.item.id && previous.progress_ms.unwrap_or(0) != data.progress_ms.unwrap_or(0) 78 + }, 79 + _ => true 80 + }; 81 + return Ok(Some((data, changed))); 82 + } 83 + 84 + 85 + let token = refresh_token(token).await?; 86 + let client = Client::new(); 87 + let response = client.get(format!("{}/me/player/currently-playing", BASE_URL)) 88 + .bearer_auth(token.access_token) 89 + .send() 90 + .await?; 91 + 92 + // check if status code is 204 93 + if response.status().as_u16() == 204 { 94 + println!("No content"); 95 + return Ok(None); 96 + } 97 + 98 + let data = response.json::<CurrentlyPlaying>().await?; 99 + 100 + cache.setex(user_id, &serde_json::to_string(&data)?, 15)?; 101 + // detect if the song has changed 102 + let previous = cache.get(&format!("{}:previous", user_id))?; 103 + let changed = match previous { 104 + Some(previous) => { 105 + let previous: CurrentlyPlaying = serde_json::from_str(&previous)?; 106 + previous.item.id != data.item.id && previous.progress_ms.unwrap_or(0) != data.progress_ms.unwrap_or(0) 107 + }, 108 + _ => false 109 + }; 110 + 111 + // save as previous song 112 + cache.set(&format!("{}:previous", user_id), &serde_json::to_string(&data)?)?; 113 + 114 + Ok(Some((data, changed))) 115 + } 116 + 117 + pub async fn get_artist(cache: Cache, artist_id: &str, token: &str) -> Result<Option<Artist>, Error> { 118 + if let Ok(Some(data)) = cache.get(artist_id) { 119 + return Ok(Some(serde_json::from_str(&data)?)); 120 + } 121 + 122 + let token = refresh_token(token).await?; 123 + let client = Client::new(); 124 + let response = client.get(&format!("{}/artists/{}", BASE_URL, artist_id)) 125 + .bearer_auth(token.access_token) 126 + .send() 127 + .await?; 128 + 129 + let data = response.text().await?; 130 + cache.setex(artist_id, &data, 20)?; 131 + 132 + Ok(Some(serde_json::from_str(&data)?)) 133 + } 134 + 135 + pub async fn get_album(cache: Cache, album_id: &str, token: &str) -> Result<Option<Album>, Error> { 136 + if let Ok(Some(data)) = cache.get(album_id) { 137 + return Ok(Some(serde_json::from_str(&data)?)); 138 + } 139 + 140 + let token = refresh_token(token).await?; 141 + let client = Client::new(); 142 + let response = client.get(&format!("{}/albums/{}", BASE_URL, album_id)) 143 + .bearer_auth(token.access_token) 144 + .send() 145 + .await?; 146 + 147 + let data = response.text().await?; 148 + cache.setex(album_id, &data, 20)?; 149 + 150 + Ok(Some(serde_json::from_str(&data)?)) 151 + } 152 + 153 + pub async fn get_album_tracks(cache: Cache, album_id: &str, token: &str) -> Result<AlbumTracks, Error> { 154 + if let Ok(Some(data)) = cache.get(&format!("{}:tracks", album_id)) { 155 + return Ok(serde_json::from_str(&data)?); 156 + } 157 + 158 + let token = refresh_token(token).await?; 159 + let client = Client::new(); 160 + let response = client.get(&format!("{}/albums/{}/tracks", BASE_URL, album_id)) 161 + .bearer_auth(token.access_token) 162 + .send() 163 + .await?; 164 + 165 + let data = response.text().await?; 166 + cache.setex( 167 + &format!("{}:tracks", album_id) 168 + , &data, 20)?; 169 + 170 + Ok(serde_json::from_str(&data)?) 171 + } 172 + 173 + pub async fn find_spotify_users( 174 + pool: &Pool<Postgres>, 175 + offset: usize, 176 + limit: usize 177 + ) -> Result<Vec<(String, String)>, Error> { 178 + let results: Vec<SpotifyTokenWithEmail> = sqlx::query_as(r#" 179 + SELECT * FROM spotify_tokens 180 + LEFT JOIN spotify_accounts ON spotify_tokens.user_id = spotify_accounts.user_id 181 + LEFT JOIN users ON spotify_accounts.user_id = users.xata_id 182 + LIMIT $1 OFFSET $2 183 + "#) 184 + .bind(limit as i64) 185 + .bind(offset as i64) 186 + .fetch_all(pool) 187 + .await?; 188 + 189 + let mut user_tokens = vec![]; 190 + 191 + for result in &results { 192 + let token = decrypt_aes_256_ctr( 193 + &result.refresh_token, 194 + &hex::decode(env::var("SPOTIFY_ENCRYPTION_KEY")?)? 195 + )?; 196 + user_tokens.push((result.email.clone(), token)); 197 + } 198 + 199 + Ok(user_tokens) 200 + } 201 + 202 + pub async fn watch_currently_playing(spotify_email: String, token: String) { 203 + loop { 204 + let spotify_email = spotify_email.clone(); 205 + let token = token.clone(); 206 + thread::spawn(move || { 207 + let rt = tokio::runtime::Runtime::new().unwrap(); 208 + rt.block_on(async { 209 + let currently_playing = get_currently_playing( 210 + Cache::new()?, 211 + &spotify_email, 212 + &token 213 + ).await?; 214 + 215 + if let Some((data, changed)) = currently_playing { 216 + get_artist(Cache::new()?, &data.item.artists[0].id, &token).await?; 217 + get_album(Cache::new()?, &data.item.album.id, &token).await?; 218 + get_album_tracks(Cache::new()?, &data.item.album.id, &token).await?; 219 + println!("{} {}, is_playing: {} changed: {}", format!("[{}]", spotify_email).bright_green(), format!("{} - {}", data.item.name, data.item.artists[0].name).cyan(), data.is_playing, changed); 220 + 221 + if changed { 222 + scrobble().await?; 223 + } 224 + } 225 + 226 + Ok::<(), Error>(()) 227 + })?; 228 + 229 + Ok::<(), Error>(()) 230 + }); 231 + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; 232 + } 233 + }
+5
crates/spotify/src/rocksky.rs
··· 1 + use anyhow::Error; 2 + 3 + pub async fn scrobble() -> Result<(), Error> { 4 + Ok(()) 5 + }
+64
crates/spotify/src/token.rs
··· 1 + use std::env; 2 + 3 + use anyhow::Error; 4 + use jsonwebtoken::DecodingKey; 5 + use jsonwebtoken::EncodingKey; 6 + use jsonwebtoken::Header; 7 + use jsonwebtoken::Validation; 8 + use serde::{Deserialize, Serialize}; 9 + 10 + #[derive(Debug, Serialize, Deserialize)] 11 + pub struct Claims { 12 + exp: usize, 13 + iat: usize, 14 + did: String, 15 + } 16 + 17 + pub fn generate_token(did: &str) -> Result<String, Error> { 18 + if env::var("JWT_SECRET").is_err() { 19 + return Err(Error::msg("JWT_SECRET is not set")); 20 + } 21 + 22 + let claims = Claims { 23 + exp: chrono::Utc::now().timestamp() as usize + 3600, 24 + iat: chrono::Utc::now().timestamp() as usize, 25 + did: did.to_string(), 26 + }; 27 + 28 + jsonwebtoken::encode( 29 + &Header::default(), 30 + &claims, 31 + &EncodingKey::from_secret(env::var("JWT_SECRET")?.as_ref()), 32 + ) 33 + .map_err(Into::into) 34 + } 35 + 36 + pub fn decode_token(token: &str) -> Result<Claims, Error> { 37 + if env::var("JWT_SECRET").is_err() { 38 + return Err(Error::msg("JWT_SECRET is not set")); 39 + } 40 + 41 + jsonwebtoken::decode::<Claims>( 42 + token, 43 + &DecodingKey::from_secret(env::var("JWT_SECRET")?.as_ref()), 44 + &Validation::default(), 45 + ) 46 + .map(|data| data.claims) 47 + .map_err(Into::into) 48 + } 49 + 50 + #[cfg(test)] 51 + mod tests { 52 + use dotenv::dotenv; 53 + 54 + use super::*; 55 + 56 + #[test] 57 + fn test_generate_token() { 58 + dotenv().ok(); 59 + let token = generate_token("did:plc:7vdlgi2bflelz7mmuxoqjfcr").unwrap(); 60 + let claims = decode_token(&token).unwrap(); 61 + 62 + assert_eq!(claims.did, "did:plc:7vdlgi2bflelz7mmuxoqjfcr"); 63 + } 64 + }
+32
crates/spotify/src/types/album_tracks.rs
··· 1 + use serde::Deserialize; 2 + 3 + use super::currently_playing::{Artist, ExternalUrls}; 4 + 5 + #[derive(Debug, Deserialize)] 6 + pub struct AlbumTracks { 7 + pub href: String, 8 + pub items: Vec<Track>, 9 + pub limit: u32, 10 + pub next: Option<String>, 11 + pub offset: u32, 12 + pub previous: Option<String>, 13 + pub total: u32, 14 + } 15 + 16 + #[derive(Debug, Deserialize)] 17 + pub struct Track { 18 + pub artists: Vec<Artist>, 19 + pub available_markets: Vec<String>, 20 + pub disc_number: u32, 21 + pub duration_ms: u32, 22 + pub explicit: bool, 23 + pub external_urls: ExternalUrls, 24 + pub href: String, 25 + pub id: String, 26 + pub name: String, 27 + pub preview_url: Option<String>, 28 + pub track_number: u32, 29 + pub r#type: String, // `type` is a reserved keyword, so we use `r#type` 30 + pub uri: String, 31 + pub is_local: bool, 32 + }
+110
crates/spotify/src/types/currently_playing.rs
··· 1 + use serde::{Deserialize, Serialize}; 2 + 3 + #[derive(Debug, Serialize, Deserialize)] 4 + pub struct CurrentlyPlaying { 5 + pub actions: Actions, 6 + pub context: Context, 7 + pub currently_playing_type: String, 8 + pub is_playing: bool, 9 + pub item: Item, 10 + pub progress_ms: Option<u64>, 11 + pub timestamp: u64, 12 + } 13 + 14 + #[derive(Debug, Serialize, Deserialize)] 15 + pub struct Actions { 16 + pub disallows: Disallows, 17 + } 18 + 19 + #[derive(Debug, Serialize, Deserialize)] 20 + pub struct Disallows { 21 + pub resuming: Option<bool>, 22 + pub skipping_prev: Option<bool>, 23 + } 24 + 25 + #[derive(Debug, Serialize, Deserialize)] 26 + pub struct Context { 27 + pub external_urls: ExternalUrls, 28 + pub href: String, 29 + #[serde(rename = "type")] 30 + pub context_type: String, 31 + pub uri: String, 32 + } 33 + 34 + #[derive(Debug, Serialize, Deserialize)] 35 + pub struct ExternalUrls { 36 + pub spotify: String, 37 + } 38 + 39 + #[derive(Debug, Serialize, Deserialize)] 40 + pub struct Item { 41 + pub album: Album, 42 + pub artists: Vec<Artist>, 43 + pub available_markets: Vec<String>, 44 + pub disc_number: u32, 45 + pub duration_ms: u32, 46 + pub explicit: bool, 47 + pub external_ids: ExternalIds, 48 + pub external_urls: ExternalUrls, 49 + pub href: String, 50 + pub id: String, 51 + pub is_local: bool, 52 + pub name: String, 53 + pub popularity: u32, 54 + pub preview_url: Option<String>, 55 + pub track_number: u32, 56 + #[serde(rename = "type")] 57 + pub item_type: String, 58 + pub uri: String, 59 + } 60 + 61 + #[derive(Debug, Serialize, Deserialize)] 62 + pub struct Album { 63 + pub album_type: String, 64 + pub artists: Vec<Artist>, 65 + pub available_markets: Vec<String>, 66 + pub external_urls: ExternalUrls, 67 + pub href: String, 68 + pub id: String, 69 + pub images: Vec<Image>, 70 + pub name: String, 71 + pub release_date: String, 72 + pub release_date_precision: String, 73 + pub total_tracks: u32, 74 + #[serde(rename = "type")] 75 + pub album_type_field: String, 76 + pub uri: String, 77 + pub label: Option<String>, 78 + pub genres: Option<Vec<String>>, 79 + pub copyrights: Option<Vec<Copyright>>, 80 + } 81 + 82 + #[derive(Debug, Serialize, Deserialize)] 83 + pub struct Copyright { 84 + pub text: String, 85 + pub r#type: String, 86 + } 87 + 88 + #[derive(Debug, Serialize, Deserialize)] 89 + pub struct Artist { 90 + pub external_urls: ExternalUrls, 91 + pub href: String, 92 + pub id: String, 93 + pub name: String, 94 + #[serde(rename = "type")] 95 + pub artist_type: String, 96 + pub uri: String, 97 + pub images: Option<Vec<Image>>, 98 + } 99 + 100 + #[derive(Debug, Serialize, Deserialize)] 101 + pub struct Image { 102 + pub height: u32, 103 + pub url: String, 104 + pub width: u32, 105 + } 106 + 107 + #[derive(Debug, Serialize, Deserialize)] 108 + pub struct ExternalIds { 109 + pub isrc: String, 110 + }
+5
crates/spotify/src/types/mod.rs
··· 1 + pub mod album_tracks; 2 + pub mod currently_playing; 3 + pub mod spotify_account; 4 + pub mod spotify_token; 5 + pub mod token;
+15
crates/spotify/src/types/spotify_account.rs
··· 1 + use chrono::{DateTime, Utc}; 2 + use serde::Deserialize; 3 + 4 + #[derive(Debug, Deserialize, sqlx::FromRow, Default, Clone)] 5 + pub struct SpotifyAccount { 6 + pub xata_id: String, 7 + pub xata_version: i32, 8 + #[serde(with = "chrono::serde::ts_seconds")] 9 + pub xata_createdat: DateTime<Utc>, 10 + #[serde(with = "chrono::serde::ts_seconds")] 11 + pub xata_updatedat: DateTime<Utc>, 12 + pub email: String, 13 + pub user_id: String, 14 + pub is_beta_user: bool, 15 + }
+30
crates/spotify/src/types/spotify_token.rs
··· 1 + use chrono::{DateTime, Utc}; 2 + use serde::Deserialize; 3 + 4 + #[derive(Debug, Deserialize, sqlx::FromRow, Default, Clone)] 5 + pub struct SpotifyToken { 6 + pub xata_id: String, 7 + pub xata_version: i32, 8 + #[serde(with = "chrono::serde::ts_seconds")] 9 + pub xata_createdat: DateTime<Utc>, 10 + #[serde(with = "chrono::serde::ts_seconds")] 11 + pub xata_updatedat: DateTime<Utc>, 12 + pub user_id: String, 13 + pub access_token: String, 14 + pub refresh_token: String, 15 + } 16 + 17 + #[derive(Debug, Deserialize, sqlx::FromRow, Default, Clone)] 18 + pub struct SpotifyTokenWithEmail { 19 + pub xata_id: String, 20 + pub xata_version: i32, 21 + #[serde(with = "chrono::serde::ts_seconds")] 22 + pub xata_createdat: DateTime<Utc>, 23 + #[serde(with = "chrono::serde::ts_seconds")] 24 + pub xata_updatedat: DateTime<Utc>, 25 + pub user_id: String, 26 + pub access_token: String, 27 + pub refresh_token: String, 28 + pub email: String, 29 + pub did: String, 30 + }
+9
crates/spotify/src/types/token.rs
··· 1 + use serde::Deserialize; 2 + 3 + #[derive(Debug, Deserialize)] 4 + pub struct AccessToken { 5 + pub access_token: String, 6 + pub token_type: String, 7 + pub scope: String, 8 + pub expires_in: u32, 9 + }