The official website for the open-source compatibility layer fpPS4
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Finished the new rust backend ๐ŸŽ‰

+2206 -86
+1632
backend/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 3 4 + 5 + [[package]] 6 + name = "adler2" 7 + version = "2.0.0" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 + 11 + [[package]] 12 + name = "ahash" 13 + version = "0.8.11" 14 + source = "registry+https://github.com/rust-lang/crates.io-index" 15 + checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 16 + dependencies = [ 17 + "cfg-if", 18 + "once_cell", 19 + "version_check", 20 + "zerocopy", 21 + ] 22 + 23 + [[package]] 24 + name = "aho-corasick" 25 + version = "1.1.3" 26 + source = "registry+https://github.com/rust-lang/crates.io-index" 27 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 28 + dependencies = [ 29 + "memchr", 30 + ] 31 + 32 + [[package]] 33 + name = "aligned-vec" 34 + version = "0.5.0" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" 37 + 38 + [[package]] 39 + name = "android-tzdata" 40 + version = "0.1.1" 41 + source = "registry+https://github.com/rust-lang/crates.io-index" 42 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 43 + 44 + [[package]] 45 + name = "android_system_properties" 46 + version = "0.1.5" 47 + source = "registry+https://github.com/rust-lang/crates.io-index" 48 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 49 + dependencies = [ 50 + "libc", 51 + ] 52 + 53 + [[package]] 54 + name = "anyhow" 55 + version = "1.0.91" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" 58 + 59 + [[package]] 60 + name = "arbitrary" 61 + version = "1.3.2" 62 + source = "registry+https://github.com/rust-lang/crates.io-index" 63 + checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" 64 + 65 + [[package]] 66 + name = "arg_enum_proc_macro" 67 + version = "0.3.4" 68 + source = "registry+https://github.com/rust-lang/crates.io-index" 69 + checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 70 + dependencies = [ 71 + "proc-macro2", 72 + "quote", 73 + "syn", 74 + ] 75 + 76 + [[package]] 77 + name = "arrayvec" 78 + version = "0.7.6" 79 + source = "registry+https://github.com/rust-lang/crates.io-index" 80 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 81 + 82 + [[package]] 83 + name = "autocfg" 84 + version = "1.4.0" 85 + source = "registry+https://github.com/rust-lang/crates.io-index" 86 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 87 + 88 + [[package]] 89 + name = "av1-grain" 90 + version = "0.2.3" 91 + source = "registry+https://github.com/rust-lang/crates.io-index" 92 + checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" 93 + dependencies = [ 94 + "anyhow", 95 + "arrayvec", 96 + "log", 97 + "nom", 98 + "num-rational", 99 + "v_frame", 100 + ] 101 + 102 + [[package]] 103 + name = "avif-serialize" 104 + version = "0.8.2" 105 + source = "registry+https://github.com/rust-lang/crates.io-index" 106 + checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" 107 + dependencies = [ 108 + "arrayvec", 109 + ] 110 + 111 + [[package]] 112 + name = "base64" 113 + version = "0.22.1" 114 + source = "registry+https://github.com/rust-lang/crates.io-index" 115 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 116 + 117 + [[package]] 118 + name = "bitflags" 119 + version = "2.6.0" 120 + source = "registry+https://github.com/rust-lang/crates.io-index" 121 + checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 122 + 123 + [[package]] 124 + name = "bitstream-io" 125 + version = "2.5.3" 126 + source = "registry+https://github.com/rust-lang/crates.io-index" 127 + checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" 128 + 129 + [[package]] 130 + name = "block-buffer" 131 + version = "0.10.4" 132 + source = "registry+https://github.com/rust-lang/crates.io-index" 133 + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 134 + dependencies = [ 135 + "generic-array", 136 + ] 137 + 138 + [[package]] 139 + name = "block-buffer" 140 + version = "0.11.0-rc.3" 141 + source = "registry+https://github.com/rust-lang/crates.io-index" 142 + checksum = "3fd016a0ddc7cb13661bf5576073ce07330a693f8608a1320b4e20561cc12cdc" 143 + dependencies = [ 144 + "hybrid-array", 145 + ] 146 + 147 + [[package]] 148 + name = "built" 149 + version = "0.7.5" 150 + source = "registry+https://github.com/rust-lang/crates.io-index" 151 + checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" 152 + 153 + [[package]] 154 + name = "bumpalo" 155 + version = "3.16.0" 156 + source = "registry+https://github.com/rust-lang/crates.io-index" 157 + checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 158 + 159 + [[package]] 160 + name = "bytemuck" 161 + version = "1.19.0" 162 + source = "registry+https://github.com/rust-lang/crates.io-index" 163 + checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" 164 + 165 + [[package]] 166 + name = "byteorder" 167 + version = "1.5.0" 168 + source = "registry+https://github.com/rust-lang/crates.io-index" 169 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 170 + 171 + [[package]] 172 + name = "byteorder-lite" 173 + version = "0.1.0" 174 + source = "registry+https://github.com/rust-lang/crates.io-index" 175 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 176 + 177 + [[package]] 178 + name = "cc" 179 + version = "1.1.31" 180 + source = "registry+https://github.com/rust-lang/crates.io-index" 181 + checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" 182 + dependencies = [ 183 + "jobserver", 184 + "libc", 185 + "shlex", 186 + ] 187 + 188 + [[package]] 189 + name = "cfg-expr" 190 + version = "0.15.8" 191 + source = "registry+https://github.com/rust-lang/crates.io-index" 192 + checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 193 + dependencies = [ 194 + "smallvec", 195 + "target-lexicon", 196 + ] 197 + 198 + [[package]] 199 + name = "cfg-if" 200 + version = "1.0.0" 201 + source = "registry+https://github.com/rust-lang/crates.io-index" 202 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 203 + 204 + [[package]] 205 + name = "chrono" 206 + version = "0.4.38" 207 + source = "registry+https://github.com/rust-lang/crates.io-index" 208 + checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 209 + dependencies = [ 210 + "android-tzdata", 211 + "iana-time-zone", 212 + "js-sys", 213 + "num-traits", 214 + "wasm-bindgen", 215 + "windows-targets", 216 + ] 217 + 218 + [[package]] 219 + name = "const-oid" 220 + version = "0.10.0-rc.3" 221 + source = "registry+https://github.com/rust-lang/crates.io-index" 222 + checksum = "68ff6be19477a1bd5441f382916a89bc2a0b2c35db6d41e0f6e8538bf6d6463f" 223 + 224 + [[package]] 225 + name = "core-foundation-sys" 226 + version = "0.8.7" 227 + source = "registry+https://github.com/rust-lang/crates.io-index" 228 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 229 + 230 + [[package]] 231 + name = "cpufeatures" 232 + version = "0.2.14" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" 235 + dependencies = [ 236 + "libc", 237 + ] 238 + 239 + [[package]] 240 + name = "crc32fast" 241 + version = "1.4.2" 242 + source = "registry+https://github.com/rust-lang/crates.io-index" 243 + checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 244 + dependencies = [ 245 + "cfg-if", 246 + ] 247 + 248 + [[package]] 249 + name = "crossbeam-deque" 250 + version = "0.8.5" 251 + source = "registry+https://github.com/rust-lang/crates.io-index" 252 + checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 253 + dependencies = [ 254 + "crossbeam-epoch", 255 + "crossbeam-utils", 256 + ] 257 + 258 + [[package]] 259 + name = "crossbeam-epoch" 260 + version = "0.9.18" 261 + source = "registry+https://github.com/rust-lang/crates.io-index" 262 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 263 + dependencies = [ 264 + "crossbeam-utils", 265 + ] 266 + 267 + [[package]] 268 + name = "crossbeam-queue" 269 + version = "0.3.11" 270 + source = "registry+https://github.com/rust-lang/crates.io-index" 271 + checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" 272 + dependencies = [ 273 + "crossbeam-utils", 274 + ] 275 + 276 + [[package]] 277 + name = "crossbeam-utils" 278 + version = "0.8.20" 279 + source = "registry+https://github.com/rust-lang/crates.io-index" 280 + checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 281 + 282 + [[package]] 283 + name = "crypto-common" 284 + version = "0.1.6" 285 + source = "registry+https://github.com/rust-lang/crates.io-index" 286 + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 287 + dependencies = [ 288 + "generic-array", 289 + "typenum", 290 + ] 291 + 292 + [[package]] 293 + name = "crypto-common" 294 + version = "0.2.0-rc.1" 295 + source = "registry+https://github.com/rust-lang/crates.io-index" 296 + checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" 297 + dependencies = [ 298 + "getrandom", 299 + "hybrid-array", 300 + "rand_core", 301 + ] 302 + 303 + [[package]] 304 + name = "digest" 305 + version = "0.10.7" 306 + source = "registry+https://github.com/rust-lang/crates.io-index" 307 + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 308 + dependencies = [ 309 + "block-buffer 0.10.4", 310 + "crypto-common 0.1.6", 311 + ] 312 + 313 + [[package]] 314 + name = "digest" 315 + version = "0.11.0-pre.9" 316 + source = "registry+https://github.com/rust-lang/crates.io-index" 317 + checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" 318 + dependencies = [ 319 + "block-buffer 0.11.0-rc.3", 320 + "const-oid", 321 + "crypto-common 0.2.0-rc.1", 322 + "subtle", 323 + ] 324 + 325 + [[package]] 326 + name = "document-features" 327 + version = "0.2.10" 328 + source = "registry+https://github.com/rust-lang/crates.io-index" 329 + checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 330 + dependencies = [ 331 + "litrs", 332 + ] 333 + 334 + [[package]] 335 + name = "dunce" 336 + version = "1.0.5" 337 + source = "registry+https://github.com/rust-lang/crates.io-index" 338 + checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 339 + 340 + [[package]] 341 + name = "either" 342 + version = "1.13.0" 343 + source = "registry+https://github.com/rust-lang/crates.io-index" 344 + checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 345 + 346 + [[package]] 347 + name = "equivalent" 348 + version = "1.0.1" 349 + source = "registry+https://github.com/rust-lang/crates.io-index" 350 + checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 351 + 352 + [[package]] 353 + name = "fallible-iterator" 354 + version = "0.3.0" 355 + source = "registry+https://github.com/rust-lang/crates.io-index" 356 + checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" 357 + 358 + [[package]] 359 + name = "fallible-streaming-iterator" 360 + version = "0.1.9" 361 + source = "registry+https://github.com/rust-lang/crates.io-index" 362 + checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" 363 + 364 + [[package]] 365 + name = "fast_image_resize" 366 + version = "5.0.0" 367 + source = "registry+https://github.com/rust-lang/crates.io-index" 368 + checksum = "a66a61fbfc84ef99a839499cf9e5a7c2951d2da874ea00f29ee938bc50d1b396" 369 + dependencies = [ 370 + "bytemuck", 371 + "cfg-if", 372 + "document-features", 373 + "image", 374 + "num-traits", 375 + "rayon", 376 + "thiserror", 377 + ] 378 + 379 + [[package]] 380 + name = "flate2" 381 + version = "1.0.34" 382 + source = "registry+https://github.com/rust-lang/crates.io-index" 383 + checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" 384 + dependencies = [ 385 + "crc32fast", 386 + "miniz_oxide", 387 + ] 388 + 389 + [[package]] 390 + name = "foreign-types" 391 + version = "0.5.0" 392 + source = "registry+https://github.com/rust-lang/crates.io-index" 393 + checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 394 + dependencies = [ 395 + "foreign-types-macros", 396 + "foreign-types-shared", 397 + ] 398 + 399 + [[package]] 400 + name = "foreign-types-macros" 401 + version = "0.2.3" 402 + source = "registry+https://github.com/rust-lang/crates.io-index" 403 + checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 404 + dependencies = [ 405 + "proc-macro2", 406 + "quote", 407 + "syn", 408 + ] 409 + 410 + [[package]] 411 + name = "foreign-types-shared" 412 + version = "0.3.1" 413 + source = "registry+https://github.com/rust-lang/crates.io-index" 414 + checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 415 + 416 + [[package]] 417 + name = "form_urlencoded" 418 + version = "1.2.1" 419 + source = "registry+https://github.com/rust-lang/crates.io-index" 420 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 421 + dependencies = [ 422 + "percent-encoding", 423 + ] 424 + 425 + [[package]] 426 + name = "fpps4_backend" 427 + version = "0.1.0" 428 + dependencies = [ 429 + "anyhow", 430 + "chrono", 431 + "crossbeam-queue", 432 + "fast_image_resize", 433 + "hex", 434 + "hmac", 435 + "load_image", 436 + "md-5", 437 + "ravif", 438 + "regex", 439 + "rgb", 440 + "rusqlite", 441 + "serde", 442 + "serde_json", 443 + "sha1", 444 + "ureq", 445 + ] 446 + 447 + [[package]] 448 + name = "generic-array" 449 + version = "0.14.7" 450 + source = "registry+https://github.com/rust-lang/crates.io-index" 451 + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 452 + dependencies = [ 453 + "typenum", 454 + "version_check", 455 + ] 456 + 457 + [[package]] 458 + name = "getrandom" 459 + version = "0.2.15" 460 + source = "registry+https://github.com/rust-lang/crates.io-index" 461 + checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 462 + dependencies = [ 463 + "cfg-if", 464 + "libc", 465 + "wasi", 466 + ] 467 + 468 + [[package]] 469 + name = "hashbrown" 470 + version = "0.14.5" 471 + source = "registry+https://github.com/rust-lang/crates.io-index" 472 + checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 473 + dependencies = [ 474 + "ahash", 475 + ] 476 + 477 + [[package]] 478 + name = "hashbrown" 479 + version = "0.15.0" 480 + source = "registry+https://github.com/rust-lang/crates.io-index" 481 + checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" 482 + 483 + [[package]] 484 + name = "hashlink" 485 + version = "0.9.1" 486 + source = "registry+https://github.com/rust-lang/crates.io-index" 487 + checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" 488 + dependencies = [ 489 + "hashbrown 0.14.5", 490 + ] 491 + 492 + [[package]] 493 + name = "heck" 494 + version = "0.5.0" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 497 + 498 + [[package]] 499 + name = "hex" 500 + version = "0.4.3" 501 + source = "registry+https://github.com/rust-lang/crates.io-index" 502 + checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 503 + 504 + [[package]] 505 + name = "hmac" 506 + version = "0.13.0-pre.4" 507 + source = "registry+https://github.com/rust-lang/crates.io-index" 508 + checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" 509 + dependencies = [ 510 + "digest 0.11.0-pre.9", 511 + ] 512 + 513 + [[package]] 514 + name = "hybrid-array" 515 + version = "0.2.1" 516 + source = "registry+https://github.com/rust-lang/crates.io-index" 517 + checksum = "45a9a965bb102c1c891fb017c09a05c965186b1265a207640f323ddd009f9deb" 518 + dependencies = [ 519 + "typenum", 520 + ] 521 + 522 + [[package]] 523 + name = "iana-time-zone" 524 + version = "0.1.61" 525 + source = "registry+https://github.com/rust-lang/crates.io-index" 526 + checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" 527 + dependencies = [ 528 + "android_system_properties", 529 + "core-foundation-sys", 530 + "iana-time-zone-haiku", 531 + "js-sys", 532 + "wasm-bindgen", 533 + "windows-core", 534 + ] 535 + 536 + [[package]] 537 + name = "iana-time-zone-haiku" 538 + version = "0.1.2" 539 + source = "registry+https://github.com/rust-lang/crates.io-index" 540 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 541 + dependencies = [ 542 + "cc", 543 + ] 544 + 545 + [[package]] 546 + name = "idna" 547 + version = "0.5.0" 548 + source = "registry+https://github.com/rust-lang/crates.io-index" 549 + checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 550 + dependencies = [ 551 + "unicode-bidi", 552 + "unicode-normalization", 553 + ] 554 + 555 + [[package]] 556 + name = "image" 557 + version = "0.25.4" 558 + source = "registry+https://github.com/rust-lang/crates.io-index" 559 + checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" 560 + dependencies = [ 561 + "bytemuck", 562 + "byteorder-lite", 563 + "num-traits", 564 + "rayon", 565 + ] 566 + 567 + [[package]] 568 + name = "imgref" 569 + version = "1.11.0" 570 + source = "registry+https://github.com/rust-lang/crates.io-index" 571 + checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 572 + 573 + [[package]] 574 + name = "indexmap" 575 + version = "2.6.0" 576 + source = "registry+https://github.com/rust-lang/crates.io-index" 577 + checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" 578 + dependencies = [ 579 + "equivalent", 580 + "hashbrown 0.15.0", 581 + ] 582 + 583 + [[package]] 584 + name = "interpolate_name" 585 + version = "0.2.4" 586 + source = "registry+https://github.com/rust-lang/crates.io-index" 587 + checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 588 + dependencies = [ 589 + "proc-macro2", 590 + "quote", 591 + "syn", 592 + ] 593 + 594 + [[package]] 595 + name = "itertools" 596 + version = "0.12.1" 597 + source = "registry+https://github.com/rust-lang/crates.io-index" 598 + checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 599 + dependencies = [ 600 + "either", 601 + ] 602 + 603 + [[package]] 604 + name = "itoa" 605 + version = "1.0.11" 606 + source = "registry+https://github.com/rust-lang/crates.io-index" 607 + checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 608 + 609 + [[package]] 610 + name = "jobserver" 611 + version = "0.1.32" 612 + source = "registry+https://github.com/rust-lang/crates.io-index" 613 + checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 614 + dependencies = [ 615 + "libc", 616 + ] 617 + 618 + [[package]] 619 + name = "jpeg-decoder" 620 + version = "0.3.1" 621 + source = "registry+https://github.com/rust-lang/crates.io-index" 622 + checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 623 + dependencies = [ 624 + "rayon", 625 + ] 626 + 627 + [[package]] 628 + name = "js-sys" 629 + version = "0.3.72" 630 + source = "registry+https://github.com/rust-lang/crates.io-index" 631 + checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" 632 + dependencies = [ 633 + "wasm-bindgen", 634 + ] 635 + 636 + [[package]] 637 + name = "lcms2" 638 + version = "6.1.0" 639 + source = "registry+https://github.com/rust-lang/crates.io-index" 640 + checksum = "680ec3fa42c36e0af9ca02f20a3742a82229c7f1ee0e6754294de46a80be6f74" 641 + dependencies = [ 642 + "bytemuck", 643 + "foreign-types", 644 + "lcms2-sys", 645 + ] 646 + 647 + [[package]] 648 + name = "lcms2-sys" 649 + version = "4.0.5" 650 + source = "registry+https://github.com/rust-lang/crates.io-index" 651 + checksum = "593265f9a3172180024fb62580ee31348f31be924b19416da174ebb7fb623d2e" 652 + dependencies = [ 653 + "cc", 654 + "dunce", 655 + "libc", 656 + "pkg-config", 657 + ] 658 + 659 + [[package]] 660 + name = "libc" 661 + version = "0.2.161" 662 + source = "registry+https://github.com/rust-lang/crates.io-index" 663 + checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" 664 + 665 + [[package]] 666 + name = "libfuzzer-sys" 667 + version = "0.4.7" 668 + source = "registry+https://github.com/rust-lang/crates.io-index" 669 + checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" 670 + dependencies = [ 671 + "arbitrary", 672 + "cc", 673 + "once_cell", 674 + ] 675 + 676 + [[package]] 677 + name = "libsqlite3-sys" 678 + version = "0.30.1" 679 + source = "registry+https://github.com/rust-lang/crates.io-index" 680 + checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" 681 + dependencies = [ 682 + "cc", 683 + "pkg-config", 684 + "vcpkg", 685 + ] 686 + 687 + [[package]] 688 + name = "litrs" 689 + version = "0.4.1" 690 + source = "registry+https://github.com/rust-lang/crates.io-index" 691 + checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 692 + 693 + [[package]] 694 + name = "load_image" 695 + version = "3.2.1" 696 + source = "registry+https://github.com/rust-lang/crates.io-index" 697 + checksum = "27320f641fceb716f24fe9f20b717e5a9514607387ea923a79d8a09818ad805a" 698 + dependencies = [ 699 + "bytemuck", 700 + "imgref", 701 + "jpeg-decoder", 702 + "lcms2", 703 + "lodepng", 704 + "quick-error", 705 + "rexif", 706 + "rgb", 707 + ] 708 + 709 + [[package]] 710 + name = "lodepng" 711 + version = "3.10.7" 712 + source = "registry+https://github.com/rust-lang/crates.io-index" 713 + checksum = "7b2dea7cda68e381418c985fd8f32a9c279a21ae8c715f2376adb20c27a0fad3" 714 + dependencies = [ 715 + "crc32fast", 716 + "flate2", 717 + "libc", 718 + "rgb", 719 + ] 720 + 721 + [[package]] 722 + name = "log" 723 + version = "0.4.22" 724 + source = "registry+https://github.com/rust-lang/crates.io-index" 725 + checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 726 + 727 + [[package]] 728 + name = "loop9" 729 + version = "0.1.5" 730 + source = "registry+https://github.com/rust-lang/crates.io-index" 731 + checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 732 + dependencies = [ 733 + "imgref", 734 + ] 735 + 736 + [[package]] 737 + name = "maybe-rayon" 738 + version = "0.1.1" 739 + source = "registry+https://github.com/rust-lang/crates.io-index" 740 + checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 741 + dependencies = [ 742 + "cfg-if", 743 + ] 744 + 745 + [[package]] 746 + name = "md-5" 747 + version = "0.10.6" 748 + source = "registry+https://github.com/rust-lang/crates.io-index" 749 + checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 750 + dependencies = [ 751 + "cfg-if", 752 + "digest 0.10.7", 753 + ] 754 + 755 + [[package]] 756 + name = "memchr" 757 + version = "2.7.4" 758 + source = "registry+https://github.com/rust-lang/crates.io-index" 759 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 760 + 761 + [[package]] 762 + name = "minimal-lexical" 763 + version = "0.2.1" 764 + source = "registry+https://github.com/rust-lang/crates.io-index" 765 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 766 + 767 + [[package]] 768 + name = "miniz_oxide" 769 + version = "0.8.0" 770 + source = "registry+https://github.com/rust-lang/crates.io-index" 771 + checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" 772 + dependencies = [ 773 + "adler2", 774 + ] 775 + 776 + [[package]] 777 + name = "new_debug_unreachable" 778 + version = "1.0.6" 779 + source = "registry+https://github.com/rust-lang/crates.io-index" 780 + checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 781 + 782 + [[package]] 783 + name = "nom" 784 + version = "7.1.3" 785 + source = "registry+https://github.com/rust-lang/crates.io-index" 786 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 787 + dependencies = [ 788 + "memchr", 789 + "minimal-lexical", 790 + ] 791 + 792 + [[package]] 793 + name = "noop_proc_macro" 794 + version = "0.3.0" 795 + source = "registry+https://github.com/rust-lang/crates.io-index" 796 + checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 797 + 798 + [[package]] 799 + name = "num" 800 + version = "0.4.3" 801 + source = "registry+https://github.com/rust-lang/crates.io-index" 802 + checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" 803 + dependencies = [ 804 + "num-bigint", 805 + "num-complex", 806 + "num-integer", 807 + "num-iter", 808 + "num-rational", 809 + "num-traits", 810 + ] 811 + 812 + [[package]] 813 + name = "num-bigint" 814 + version = "0.4.6" 815 + source = "registry+https://github.com/rust-lang/crates.io-index" 816 + checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 817 + dependencies = [ 818 + "num-integer", 819 + "num-traits", 820 + ] 821 + 822 + [[package]] 823 + name = "num-complex" 824 + version = "0.4.6" 825 + source = "registry+https://github.com/rust-lang/crates.io-index" 826 + checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 827 + dependencies = [ 828 + "num-traits", 829 + ] 830 + 831 + [[package]] 832 + name = "num-derive" 833 + version = "0.4.2" 834 + source = "registry+https://github.com/rust-lang/crates.io-index" 835 + checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 836 + dependencies = [ 837 + "proc-macro2", 838 + "quote", 839 + "syn", 840 + ] 841 + 842 + [[package]] 843 + name = "num-integer" 844 + version = "0.1.46" 845 + source = "registry+https://github.com/rust-lang/crates.io-index" 846 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 847 + dependencies = [ 848 + "num-traits", 849 + ] 850 + 851 + [[package]] 852 + name = "num-iter" 853 + version = "0.1.45" 854 + source = "registry+https://github.com/rust-lang/crates.io-index" 855 + checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 856 + dependencies = [ 857 + "autocfg", 858 + "num-integer", 859 + "num-traits", 860 + ] 861 + 862 + [[package]] 863 + name = "num-rational" 864 + version = "0.4.2" 865 + source = "registry+https://github.com/rust-lang/crates.io-index" 866 + checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 867 + dependencies = [ 868 + "num-bigint", 869 + "num-integer", 870 + "num-traits", 871 + ] 872 + 873 + [[package]] 874 + name = "num-traits" 875 + version = "0.2.19" 876 + source = "registry+https://github.com/rust-lang/crates.io-index" 877 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 878 + dependencies = [ 879 + "autocfg", 880 + ] 881 + 882 + [[package]] 883 + name = "once_cell" 884 + version = "1.20.2" 885 + source = "registry+https://github.com/rust-lang/crates.io-index" 886 + checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 887 + 888 + [[package]] 889 + name = "paste" 890 + version = "1.0.15" 891 + source = "registry+https://github.com/rust-lang/crates.io-index" 892 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 893 + 894 + [[package]] 895 + name = "percent-encoding" 896 + version = "2.3.1" 897 + source = "registry+https://github.com/rust-lang/crates.io-index" 898 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 899 + 900 + [[package]] 901 + name = "pkg-config" 902 + version = "0.3.31" 903 + source = "registry+https://github.com/rust-lang/crates.io-index" 904 + checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 905 + 906 + [[package]] 907 + name = "ppv-lite86" 908 + version = "0.2.20" 909 + source = "registry+https://github.com/rust-lang/crates.io-index" 910 + checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 911 + dependencies = [ 912 + "zerocopy", 913 + ] 914 + 915 + [[package]] 916 + name = "proc-macro2" 917 + version = "1.0.89" 918 + source = "registry+https://github.com/rust-lang/crates.io-index" 919 + checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" 920 + dependencies = [ 921 + "unicode-ident", 922 + ] 923 + 924 + [[package]] 925 + name = "profiling" 926 + version = "1.0.16" 927 + source = "registry+https://github.com/rust-lang/crates.io-index" 928 + checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 929 + dependencies = [ 930 + "profiling-procmacros", 931 + ] 932 + 933 + [[package]] 934 + name = "profiling-procmacros" 935 + version = "1.0.16" 936 + source = "registry+https://github.com/rust-lang/crates.io-index" 937 + checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" 938 + dependencies = [ 939 + "quote", 940 + "syn", 941 + ] 942 + 943 + [[package]] 944 + name = "quick-error" 945 + version = "2.0.1" 946 + source = "registry+https://github.com/rust-lang/crates.io-index" 947 + checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 948 + 949 + [[package]] 950 + name = "quote" 951 + version = "1.0.37" 952 + source = "registry+https://github.com/rust-lang/crates.io-index" 953 + checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 954 + dependencies = [ 955 + "proc-macro2", 956 + ] 957 + 958 + [[package]] 959 + name = "rand" 960 + version = "0.8.5" 961 + source = "registry+https://github.com/rust-lang/crates.io-index" 962 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 963 + dependencies = [ 964 + "libc", 965 + "rand_chacha", 966 + "rand_core", 967 + ] 968 + 969 + [[package]] 970 + name = "rand_chacha" 971 + version = "0.3.1" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 974 + dependencies = [ 975 + "ppv-lite86", 976 + "rand_core", 977 + ] 978 + 979 + [[package]] 980 + name = "rand_core" 981 + version = "0.6.4" 982 + source = "registry+https://github.com/rust-lang/crates.io-index" 983 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 984 + dependencies = [ 985 + "getrandom", 986 + ] 987 + 988 + [[package]] 989 + name = "rav1e" 990 + version = "0.7.1" 991 + source = "registry+https://github.com/rust-lang/crates.io-index" 992 + checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" 993 + dependencies = [ 994 + "arbitrary", 995 + "arg_enum_proc_macro", 996 + "arrayvec", 997 + "av1-grain", 998 + "bitstream-io", 999 + "built", 1000 + "cfg-if", 1001 + "interpolate_name", 1002 + "itertools", 1003 + "libc", 1004 + "libfuzzer-sys", 1005 + "log", 1006 + "maybe-rayon", 1007 + "new_debug_unreachable", 1008 + "noop_proc_macro", 1009 + "num-derive", 1010 + "num-traits", 1011 + "once_cell", 1012 + "paste", 1013 + "profiling", 1014 + "rand", 1015 + "rand_chacha", 1016 + "simd_helpers", 1017 + "system-deps", 1018 + "thiserror", 1019 + "v_frame", 1020 + "wasm-bindgen", 1021 + ] 1022 + 1023 + [[package]] 1024 + name = "ravif" 1025 + version = "0.11.11" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" 1028 + dependencies = [ 1029 + "avif-serialize", 1030 + "imgref", 1031 + "loop9", 1032 + "quick-error", 1033 + "rav1e", 1034 + "rgb", 1035 + ] 1036 + 1037 + [[package]] 1038 + name = "rayon" 1039 + version = "1.10.0" 1040 + source = "registry+https://github.com/rust-lang/crates.io-index" 1041 + checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1042 + dependencies = [ 1043 + "either", 1044 + "rayon-core", 1045 + ] 1046 + 1047 + [[package]] 1048 + name = "rayon-core" 1049 + version = "1.12.1" 1050 + source = "registry+https://github.com/rust-lang/crates.io-index" 1051 + checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1052 + dependencies = [ 1053 + "crossbeam-deque", 1054 + "crossbeam-utils", 1055 + ] 1056 + 1057 + [[package]] 1058 + name = "regex" 1059 + version = "1.11.1" 1060 + source = "registry+https://github.com/rust-lang/crates.io-index" 1061 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1062 + dependencies = [ 1063 + "aho-corasick", 1064 + "memchr", 1065 + "regex-automata", 1066 + "regex-syntax", 1067 + ] 1068 + 1069 + [[package]] 1070 + name = "regex-automata" 1071 + version = "0.4.8" 1072 + source = "registry+https://github.com/rust-lang/crates.io-index" 1073 + checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" 1074 + dependencies = [ 1075 + "aho-corasick", 1076 + "memchr", 1077 + "regex-syntax", 1078 + ] 1079 + 1080 + [[package]] 1081 + name = "regex-syntax" 1082 + version = "0.8.5" 1083 + source = "registry+https://github.com/rust-lang/crates.io-index" 1084 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1085 + 1086 + [[package]] 1087 + name = "rexif" 1088 + version = "0.7.4" 1089 + source = "registry+https://github.com/rust-lang/crates.io-index" 1090 + checksum = "4027574305c7c8849720de913baad1c6f1d4f524a61a82a69c6670a8f0533f33" 1091 + dependencies = [ 1092 + "num", 1093 + ] 1094 + 1095 + [[package]] 1096 + name = "rgb" 1097 + version = "0.8.50" 1098 + source = "registry+https://github.com/rust-lang/crates.io-index" 1099 + checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" 1100 + dependencies = [ 1101 + "bytemuck", 1102 + ] 1103 + 1104 + [[package]] 1105 + name = "ring" 1106 + version = "0.17.8" 1107 + source = "registry+https://github.com/rust-lang/crates.io-index" 1108 + checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 1109 + dependencies = [ 1110 + "cc", 1111 + "cfg-if", 1112 + "getrandom", 1113 + "libc", 1114 + "spin", 1115 + "untrusted", 1116 + "windows-sys", 1117 + ] 1118 + 1119 + [[package]] 1120 + name = "rusqlite" 1121 + version = "0.32.1" 1122 + source = "registry+https://github.com/rust-lang/crates.io-index" 1123 + checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" 1124 + dependencies = [ 1125 + "bitflags", 1126 + "fallible-iterator", 1127 + "fallible-streaming-iterator", 1128 + "hashlink", 1129 + "libsqlite3-sys", 1130 + "smallvec", 1131 + ] 1132 + 1133 + [[package]] 1134 + name = "rustls" 1135 + version = "0.23.15" 1136 + source = "registry+https://github.com/rust-lang/crates.io-index" 1137 + checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" 1138 + dependencies = [ 1139 + "log", 1140 + "once_cell", 1141 + "ring", 1142 + "rustls-pki-types", 1143 + "rustls-webpki", 1144 + "subtle", 1145 + "zeroize", 1146 + ] 1147 + 1148 + [[package]] 1149 + name = "rustls-pki-types" 1150 + version = "1.10.0" 1151 + source = "registry+https://github.com/rust-lang/crates.io-index" 1152 + checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" 1153 + 1154 + [[package]] 1155 + name = "rustls-webpki" 1156 + version = "0.102.8" 1157 + source = "registry+https://github.com/rust-lang/crates.io-index" 1158 + checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 1159 + dependencies = [ 1160 + "ring", 1161 + "rustls-pki-types", 1162 + "untrusted", 1163 + ] 1164 + 1165 + [[package]] 1166 + name = "ryu" 1167 + version = "1.0.18" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1170 + 1171 + [[package]] 1172 + name = "serde" 1173 + version = "1.0.213" 1174 + source = "registry+https://github.com/rust-lang/crates.io-index" 1175 + checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" 1176 + dependencies = [ 1177 + "serde_derive", 1178 + ] 1179 + 1180 + [[package]] 1181 + name = "serde_derive" 1182 + version = "1.0.213" 1183 + source = "registry+https://github.com/rust-lang/crates.io-index" 1184 + checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" 1185 + dependencies = [ 1186 + "proc-macro2", 1187 + "quote", 1188 + "syn", 1189 + ] 1190 + 1191 + [[package]] 1192 + name = "serde_json" 1193 + version = "1.0.132" 1194 + source = "registry+https://github.com/rust-lang/crates.io-index" 1195 + checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" 1196 + dependencies = [ 1197 + "itoa", 1198 + "memchr", 1199 + "ryu", 1200 + "serde", 1201 + ] 1202 + 1203 + [[package]] 1204 + name = "serde_spanned" 1205 + version = "0.6.8" 1206 + source = "registry+https://github.com/rust-lang/crates.io-index" 1207 + checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1208 + dependencies = [ 1209 + "serde", 1210 + ] 1211 + 1212 + [[package]] 1213 + name = "sha1" 1214 + version = "0.11.0-pre.4" 1215 + source = "registry+https://github.com/rust-lang/crates.io-index" 1216 + checksum = "9540978cef7a8498211c1b1c14e5ce920fe5bd524ea84f4a3d72d4602515ae93" 1217 + dependencies = [ 1218 + "cfg-if", 1219 + "cpufeatures", 1220 + "digest 0.11.0-pre.9", 1221 + ] 1222 + 1223 + [[package]] 1224 + name = "shlex" 1225 + version = "1.3.0" 1226 + source = "registry+https://github.com/rust-lang/crates.io-index" 1227 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1228 + 1229 + [[package]] 1230 + name = "simd_helpers" 1231 + version = "0.1.0" 1232 + source = "registry+https://github.com/rust-lang/crates.io-index" 1233 + checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 1234 + dependencies = [ 1235 + "quote", 1236 + ] 1237 + 1238 + [[package]] 1239 + name = "smallvec" 1240 + version = "1.13.2" 1241 + source = "registry+https://github.com/rust-lang/crates.io-index" 1242 + checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1243 + 1244 + [[package]] 1245 + name = "spin" 1246 + version = "0.9.8" 1247 + source = "registry+https://github.com/rust-lang/crates.io-index" 1248 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 1249 + 1250 + [[package]] 1251 + name = "subtle" 1252 + version = "2.6.1" 1253 + source = "registry+https://github.com/rust-lang/crates.io-index" 1254 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1255 + 1256 + [[package]] 1257 + name = "syn" 1258 + version = "2.0.85" 1259 + source = "registry+https://github.com/rust-lang/crates.io-index" 1260 + checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" 1261 + dependencies = [ 1262 + "proc-macro2", 1263 + "quote", 1264 + "unicode-ident", 1265 + ] 1266 + 1267 + [[package]] 1268 + name = "system-deps" 1269 + version = "6.2.2" 1270 + source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 1272 + dependencies = [ 1273 + "cfg-expr", 1274 + "heck", 1275 + "pkg-config", 1276 + "toml", 1277 + "version-compare", 1278 + ] 1279 + 1280 + [[package]] 1281 + name = "target-lexicon" 1282 + version = "0.12.16" 1283 + source = "registry+https://github.com/rust-lang/crates.io-index" 1284 + checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 1285 + 1286 + [[package]] 1287 + name = "thiserror" 1288 + version = "1.0.65" 1289 + source = "registry+https://github.com/rust-lang/crates.io-index" 1290 + checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" 1291 + dependencies = [ 1292 + "thiserror-impl", 1293 + ] 1294 + 1295 + [[package]] 1296 + name = "thiserror-impl" 1297 + version = "1.0.65" 1298 + source = "registry+https://github.com/rust-lang/crates.io-index" 1299 + checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" 1300 + dependencies = [ 1301 + "proc-macro2", 1302 + "quote", 1303 + "syn", 1304 + ] 1305 + 1306 + [[package]] 1307 + name = "tinyvec" 1308 + version = "1.8.0" 1309 + source = "registry+https://github.com/rust-lang/crates.io-index" 1310 + checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 1311 + dependencies = [ 1312 + "tinyvec_macros", 1313 + ] 1314 + 1315 + [[package]] 1316 + name = "tinyvec_macros" 1317 + version = "0.1.1" 1318 + source = "registry+https://github.com/rust-lang/crates.io-index" 1319 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1320 + 1321 + [[package]] 1322 + name = "toml" 1323 + version = "0.8.19" 1324 + source = "registry+https://github.com/rust-lang/crates.io-index" 1325 + checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 1326 + dependencies = [ 1327 + "serde", 1328 + "serde_spanned", 1329 + "toml_datetime", 1330 + "toml_edit", 1331 + ] 1332 + 1333 + [[package]] 1334 + name = "toml_datetime" 1335 + version = "0.6.8" 1336 + source = "registry+https://github.com/rust-lang/crates.io-index" 1337 + checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1338 + dependencies = [ 1339 + "serde", 1340 + ] 1341 + 1342 + [[package]] 1343 + name = "toml_edit" 1344 + version = "0.22.22" 1345 + source = "registry+https://github.com/rust-lang/crates.io-index" 1346 + checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 1347 + dependencies = [ 1348 + "indexmap", 1349 + "serde", 1350 + "serde_spanned", 1351 + "toml_datetime", 1352 + "winnow", 1353 + ] 1354 + 1355 + [[package]] 1356 + name = "typenum" 1357 + version = "1.17.0" 1358 + source = "registry+https://github.com/rust-lang/crates.io-index" 1359 + checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1360 + 1361 + [[package]] 1362 + name = "unicode-bidi" 1363 + version = "0.3.17" 1364 + source = "registry+https://github.com/rust-lang/crates.io-index" 1365 + checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" 1366 + 1367 + [[package]] 1368 + name = "unicode-ident" 1369 + version = "1.0.13" 1370 + source = "registry+https://github.com/rust-lang/crates.io-index" 1371 + checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" 1372 + 1373 + [[package]] 1374 + name = "unicode-normalization" 1375 + version = "0.1.24" 1376 + source = "registry+https://github.com/rust-lang/crates.io-index" 1377 + checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 1378 + dependencies = [ 1379 + "tinyvec", 1380 + ] 1381 + 1382 + [[package]] 1383 + name = "untrusted" 1384 + version = "0.9.0" 1385 + source = "registry+https://github.com/rust-lang/crates.io-index" 1386 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1387 + 1388 + [[package]] 1389 + name = "ureq" 1390 + version = "2.10.1" 1391 + source = "registry+https://github.com/rust-lang/crates.io-index" 1392 + checksum = "b74fc6b57825be3373f7054754755f03ac3a8f5d70015ccad699ba2029956f4a" 1393 + dependencies = [ 1394 + "base64", 1395 + "flate2", 1396 + "log", 1397 + "once_cell", 1398 + "rustls", 1399 + "rustls-pki-types", 1400 + "serde", 1401 + "serde_json", 1402 + "url", 1403 + "webpki-roots", 1404 + ] 1405 + 1406 + [[package]] 1407 + name = "url" 1408 + version = "2.5.2" 1409 + source = "registry+https://github.com/rust-lang/crates.io-index" 1410 + checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" 1411 + dependencies = [ 1412 + "form_urlencoded", 1413 + "idna", 1414 + "percent-encoding", 1415 + ] 1416 + 1417 + [[package]] 1418 + name = "v_frame" 1419 + version = "0.3.8" 1420 + source = "registry+https://github.com/rust-lang/crates.io-index" 1421 + checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" 1422 + dependencies = [ 1423 + "aligned-vec", 1424 + "num-traits", 1425 + "wasm-bindgen", 1426 + ] 1427 + 1428 + [[package]] 1429 + name = "vcpkg" 1430 + version = "0.2.15" 1431 + source = "registry+https://github.com/rust-lang/crates.io-index" 1432 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1433 + 1434 + [[package]] 1435 + name = "version-compare" 1436 + version = "0.2.0" 1437 + source = "registry+https://github.com/rust-lang/crates.io-index" 1438 + checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 1439 + 1440 + [[package]] 1441 + name = "version_check" 1442 + version = "0.9.5" 1443 + source = "registry+https://github.com/rust-lang/crates.io-index" 1444 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1445 + 1446 + [[package]] 1447 + name = "wasi" 1448 + version = "0.11.0+wasi-snapshot-preview1" 1449 + source = "registry+https://github.com/rust-lang/crates.io-index" 1450 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1451 + 1452 + [[package]] 1453 + name = "wasm-bindgen" 1454 + version = "0.2.95" 1455 + source = "registry+https://github.com/rust-lang/crates.io-index" 1456 + checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" 1457 + dependencies = [ 1458 + "cfg-if", 1459 + "once_cell", 1460 + "wasm-bindgen-macro", 1461 + ] 1462 + 1463 + [[package]] 1464 + name = "wasm-bindgen-backend" 1465 + version = "0.2.95" 1466 + source = "registry+https://github.com/rust-lang/crates.io-index" 1467 + checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" 1468 + dependencies = [ 1469 + "bumpalo", 1470 + "log", 1471 + "once_cell", 1472 + "proc-macro2", 1473 + "quote", 1474 + "syn", 1475 + "wasm-bindgen-shared", 1476 + ] 1477 + 1478 + [[package]] 1479 + name = "wasm-bindgen-macro" 1480 + version = "0.2.95" 1481 + source = "registry+https://github.com/rust-lang/crates.io-index" 1482 + checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" 1483 + dependencies = [ 1484 + "quote", 1485 + "wasm-bindgen-macro-support", 1486 + ] 1487 + 1488 + [[package]] 1489 + name = "wasm-bindgen-macro-support" 1490 + version = "0.2.95" 1491 + source = "registry+https://github.com/rust-lang/crates.io-index" 1492 + checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" 1493 + dependencies = [ 1494 + "proc-macro2", 1495 + "quote", 1496 + "syn", 1497 + "wasm-bindgen-backend", 1498 + "wasm-bindgen-shared", 1499 + ] 1500 + 1501 + [[package]] 1502 + name = "wasm-bindgen-shared" 1503 + version = "0.2.95" 1504 + source = "registry+https://github.com/rust-lang/crates.io-index" 1505 + checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" 1506 + 1507 + [[package]] 1508 + name = "webpki-roots" 1509 + version = "0.26.6" 1510 + source = "registry+https://github.com/rust-lang/crates.io-index" 1511 + checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958" 1512 + dependencies = [ 1513 + "rustls-pki-types", 1514 + ] 1515 + 1516 + [[package]] 1517 + name = "windows-core" 1518 + version = "0.52.0" 1519 + source = "registry+https://github.com/rust-lang/crates.io-index" 1520 + checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 1521 + dependencies = [ 1522 + "windows-targets", 1523 + ] 1524 + 1525 + [[package]] 1526 + name = "windows-sys" 1527 + version = "0.52.0" 1528 + source = "registry+https://github.com/rust-lang/crates.io-index" 1529 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1530 + dependencies = [ 1531 + "windows-targets", 1532 + ] 1533 + 1534 + [[package]] 1535 + name = "windows-targets" 1536 + version = "0.52.6" 1537 + source = "registry+https://github.com/rust-lang/crates.io-index" 1538 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1539 + dependencies = [ 1540 + "windows_aarch64_gnullvm", 1541 + "windows_aarch64_msvc", 1542 + "windows_i686_gnu", 1543 + "windows_i686_gnullvm", 1544 + "windows_i686_msvc", 1545 + "windows_x86_64_gnu", 1546 + "windows_x86_64_gnullvm", 1547 + "windows_x86_64_msvc", 1548 + ] 1549 + 1550 + [[package]] 1551 + name = "windows_aarch64_gnullvm" 1552 + version = "0.52.6" 1553 + source = "registry+https://github.com/rust-lang/crates.io-index" 1554 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1555 + 1556 + [[package]] 1557 + name = "windows_aarch64_msvc" 1558 + version = "0.52.6" 1559 + source = "registry+https://github.com/rust-lang/crates.io-index" 1560 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1561 + 1562 + [[package]] 1563 + name = "windows_i686_gnu" 1564 + version = "0.52.6" 1565 + source = "registry+https://github.com/rust-lang/crates.io-index" 1566 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1567 + 1568 + [[package]] 1569 + name = "windows_i686_gnullvm" 1570 + version = "0.52.6" 1571 + source = "registry+https://github.com/rust-lang/crates.io-index" 1572 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1573 + 1574 + [[package]] 1575 + name = "windows_i686_msvc" 1576 + version = "0.52.6" 1577 + source = "registry+https://github.com/rust-lang/crates.io-index" 1578 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1579 + 1580 + [[package]] 1581 + name = "windows_x86_64_gnu" 1582 + version = "0.52.6" 1583 + source = "registry+https://github.com/rust-lang/crates.io-index" 1584 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1585 + 1586 + [[package]] 1587 + name = "windows_x86_64_gnullvm" 1588 + version = "0.52.6" 1589 + source = "registry+https://github.com/rust-lang/crates.io-index" 1590 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1591 + 1592 + [[package]] 1593 + name = "windows_x86_64_msvc" 1594 + version = "0.52.6" 1595 + source = "registry+https://github.com/rust-lang/crates.io-index" 1596 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1597 + 1598 + [[package]] 1599 + name = "winnow" 1600 + version = "0.6.20" 1601 + source = "registry+https://github.com/rust-lang/crates.io-index" 1602 + checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" 1603 + dependencies = [ 1604 + "memchr", 1605 + ] 1606 + 1607 + [[package]] 1608 + name = "zerocopy" 1609 + version = "0.7.35" 1610 + source = "registry+https://github.com/rust-lang/crates.io-index" 1611 + checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1612 + dependencies = [ 1613 + "byteorder", 1614 + "zerocopy-derive", 1615 + ] 1616 + 1617 + [[package]] 1618 + name = "zerocopy-derive" 1619 + version = "0.7.35" 1620 + source = "registry+https://github.com/rust-lang/crates.io-index" 1621 + checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1622 + dependencies = [ 1623 + "proc-macro2", 1624 + "quote", 1625 + "syn", 1626 + ] 1627 + 1628 + [[package]] 1629 + name = "zeroize" 1630 + version = "1.8.1" 1631 + source = "registry+https://github.com/rust-lang/crates.io-index" 1632 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+24
backend/Cargo.toml
··· 1 + [package] 2 + name = "fpps4_backend" 3 + version = "0.1.0" 4 + edition = "2021" 5 + 6 + [dependencies] 7 + serde = { version = "1.0", features = ["derive"] } 8 + serde_json = "1.0" 9 + anyhow = "1.0" 10 + regex = "1.11" 11 + ureq = { version = "2.10", default-features = false, features = ["json", "tls", "gzip"] } 12 + crossbeam-queue = "0.3" 13 + rusqlite = { version = "0.32", features = ["bundled"] } 14 + 15 + # images 16 + rgb = { version = "0.8", default-features = false } 17 + load_image = "3.2" 18 + ravif = { version = "0.11", default-features = false } 19 + fast_image_resize = { version = "5.0", features = ["only_u8x4", "rayon"] } 20 + hmac = "0.13.0-pre.4" 21 + sha1 = "0.11.0-pre.4" 22 + hex = "0.4.3" 23 + chrono = "0.4.38" 24 + md-5 = "0.10"
backend/image.png

This is a binary file and will not be displayed.

+106
backend/src/config.rs
··· 1 + use std::{env, fs}; 2 + use std::path::Path; 3 + use crate::macros::PolarResultUnwrap; 4 + use crate::panic_red; 5 + 6 + pub fn get_cli_variables() -> (String, String, String, String) { 7 + let args : Vec<String>= env::args().collect(); 8 + 9 + let mut github_token: &str = ""; 10 + let mut homebrew_token: &str = ""; 11 + let mut database_path: &str = ""; 12 + let mut images_path: &str = ""; 13 + 14 + for (n, string) in args.iter().enumerate() { 15 + 16 + // dbg!(string.to_lowercase().as_str()); 17 + 18 + match string.to_lowercase().as_str() { 19 + "--github_token" => { 20 + github_token = match args.get(n+1) { 21 + None => "", 22 + Some(string) => { 23 + if !string.starts_with("--") { 24 + string 25 + } else { 26 + "" 27 + } 28 + }, 29 + }; 30 + } 31 + "--homebrew_token" => { 32 + homebrew_token = match args.get(n+1) { 33 + None => "", 34 + Some(string) => { 35 + if !string.starts_with("--") { 36 + string 37 + } else { 38 + "" 39 + } 40 + }, 41 + }; 42 + } 43 + "--database_path" => { 44 + database_path = match args.get(n+1) { 45 + None => "", 46 + Some(string) => { 47 + if !string.starts_with("--") { 48 + string 49 + } else { 50 + "" 51 + } 52 + }, 53 + }; 54 + } 55 + "--images_path" => { 56 + images_path = match args.get(n+1) { 57 + None => "", 58 + Some(string) => { 59 + if !string.starts_with("--") { 60 + string 61 + } else { 62 + "" 63 + } 64 + }, 65 + }; 66 + } 67 + _ => {}, 68 + } 69 + 70 + } 71 + 72 + // dbg!(homebrew_token); 73 + // dbg!(github_token); 74 + // dbg!(database_path); 75 + // dbg!(images_path); 76 + 77 + if github_token.is_empty() || homebrew_token.is_empty() || database_path.is_empty() || images_path.is_empty() { 78 + panic_red!("Missing CLI arguments!") 79 + } 80 + 81 + (github_token.to_string(), homebrew_token.to_string(), database_path.to_string(), images_path.to_string()) 82 + } 83 + 84 + 85 + pub fn setup_dirs(database_path: &str, images_path: &str) { 86 + 87 + if !Path::new(database_path).exists() { 88 + fs::create_dir_all(database_path).polar_unwrap("Error creating database_path!", true); 89 + } 90 + 91 + if !Path::new(images_path).exists() { 92 + fs::create_dir_all(images_path).polar_unwrap("Error creating images_path!", true); 93 + } 94 + 95 + 96 + let game_images_path = format!("{images_path}/game"); 97 + let homebrew_images_path = format!("{images_path}/homebrew"); 98 + 99 + if !Path::new(&game_images_path).exists() { 100 + fs::create_dir(game_images_path).polar_unwrap("Error creating game_images_path!", true); 101 + } 102 + 103 + if !Path::new(&homebrew_images_path).exists() { 104 + fs::create_dir(homebrew_images_path).polar_unwrap("Error creating homebrew_images_path!", true); 105 + } 106 + }
+76 -43
backend/src/images.rs
··· 1 + use std::fs; 2 + use std::path::Path; 3 + use std::sync::{Arc, Mutex}; 4 + use anyhow::bail; 1 5 use fast_image_resize::images::Image; 2 6 use fast_image_resize::{FilterType, PixelType, ResizeAlg, ResizeOptions, Resizer, SrcCropping}; 3 7 use load_image::export::imgref::ImgVec; 4 8 use ravif::{AlphaColorMode, ColorSpace, EncodedImage, Encoder, Img, RGBA8}; 5 - use load_image::ImageData; 9 + use rusqlite::Connection; 10 + use crate::{networking, println_green}; 11 + use crate::macros::PolarResultUnwrap; 12 + use crate::parsing::{GameType, Issue}; 6 13 7 14 const RESIZE_OPTIONS: ResizeOptions = ResizeOptions { 8 15 algorithm: ResizeAlg::Convolution(FilterType::Lanczos3), ··· 10 17 mul_div_alpha: true, 11 18 }; 12 19 13 - pub(crate) fn convert_image(image_data: Vec<u8>) -> anyhow::Result<Vec<u8>> { 20 + fn convert_image(image_data: Vec<u8>) -> anyhow::Result<Vec<u8>> { 14 21 15 22 let quality: f32 = 60f32; 16 23 let alpha_quality = ((quality + 100.)/2.).min(quality + quality/4. + 2.); ··· 22 29 23 30 let cropped_image = crop_image(img)?; 24 31 25 - // let img: Img<Vec<u8>> = Img::new(cropped_image, 128,128); 26 - 27 32 let rgba_pixels: Vec<RGBA8> = cropped_image 28 33 .chunks(4) 29 34 .map(|chunk| RGBA8 { ··· 34 39 }) 35 40 .collect(); 36 41 37 - let img = Img::new(rgba_pixels, 128,128); 38 - // let img = load_rgba(cropped_image)?; 39 - 40 - // let img_vec = bytemuck::cast_slice(&img.clone().into_buf()); 41 - // fs::write("./cropped.png", dst_image.buffer())?; 42 - // let resized_img = load_rgba(dst_image.buffer())?; 42 + let img = Img::new(rgba_pixels, 256,256); 43 43 44 44 45 45 let enc = Encoder::new() ··· 51 51 .with_alpha_color_mode(AlphaColorMode::UnassociatedClean) 52 52 .with_num_threads(None); 53 53 54 - let EncodedImage { avif_file, color_byte_size, alpha_byte_size , .. } = enc.encode_rgba(img.as_ref())?; 54 + let EncodedImage { avif_file, .. } = enc.encode_rgba(img.as_ref())?; 55 55 56 56 Ok(avif_file) 57 57 } 58 + 58 59 59 60 fn load_rgba(data: Vec<u8>) -> anyhow::Result<ImgVec<RGBA8>> { 60 61 use rgb::prelude::*; ··· 74 75 75 76 Ok(img) 76 77 } 77 - fn load_rgba_test() -> anyhow::Result<(Vec<RGBA8>, usize, usize)> { 78 - let image = load_image::load_path("./image.png")?; 79 - 80 - let width = image.width; 81 - let height = image.height; 82 - 83 - 84 - let img = match image.bitmap { 85 - ImageData::RGBA8(img) => img, 86 - ImageData::RGB8(img) => img.iter().map(|buf| buf.with_alpha(255)).collect(), 87 - _ => todo!() 88 - }; 89 - 90 - Ok((img,width,height)) 91 - } 92 78 93 79 94 80 fn crop_image(image_data: ImgVec<RGBA8>) -> anyhow::Result<Vec<u8>> { ··· 115 101 let mut resizer = Resizer::new(); 116 102 resizer.resize(&src_image, &mut cropped_image, &RESIZE_OPTIONS)?; 117 103 118 - // let file = File::create("./cropped.png")?; 119 - // let ref mut w = BufWriter::new(file); 120 - // let mut encoder = PngEncoder::new(w, 128u32, 128u32); 121 - // encoder.set_color(png::ColorType::Rgba); 122 - // encoder.set_depth(png::BitDepth::Eight); 123 - // 124 - // let mut writer = encoder.write_header()?; 125 - // 126 - // // Write the image data (RGBA) 127 - // writer.write_image_data(cropped_image.buffer())?; 104 + Ok(cropped_image.into_vec()) 105 + } 106 + 107 + 108 + pub fn get_converted_image_data(issue: &mut Issue, images_path: &str, homebrew_db: Arc<Mutex<Connection>>, homebrew_token: &str) -> Result<(), anyhow::Error> { 109 + 110 + // get the images based on what the game type is 111 + match issue.issue_type { 112 + GameType::Game => { 113 + let path = format!("{}/game/{}.avif", images_path, issue.code); 114 + 115 + if Path::new(&path).exists() { 116 + return Ok(()); 117 + } 118 + 119 + // DOWNLOAD IMAGE ;3 120 + let data = networking::get_game_image_data(&issue.code)?; 121 + let avif_image = convert_image(data)?; 122 + 123 + 124 + // maybe maybe maybe 125 + fs::write(path, avif_image).polar_unwrap("Error writing image!", true); 126 + 127 + issue.image = true; 128 + println_green!("Downloaded and saved image for {}", issue.code); 129 + 130 + Ok(()) 131 + } 132 + GameType::Homebrew => { 133 + let path = format!("{}/homebrew/{}.avif", images_path, issue.title); 134 + 135 + if Path::new(&path).exists() { 136 + return Ok(()); 137 + } 138 + 139 + 140 + let homebrew_db = homebrew_db.lock().polar_unwrap("Issue with mutex, aborting!", true); 141 + 142 + let mut stmt = homebrew_db 143 + .prepare("SELECT image FROM homebrews WHERE name = (?1) COLLATE NOCASE")?; 144 + 145 + // black magic 146 + let url = { 147 + let temp = stmt 148 + .query_map([&issue.title], |row| Ok(row.get::<_, String>(0)))? 149 + .next(); 150 + 151 + match temp { 152 + Some(result) => result??, 153 + None => bail!("No image url found for {}", issue.title), 154 + } 155 + }; 128 156 157 + // DOWNLOAD IMAGE ;3 158 + let data = networking::image_downloader(url, homebrew_token)?; 159 + let avif_image = convert_image(data)?; 129 160 130 - // let (image, width, height) = load_rgba_test().unwrap(); 131 - // 132 - // let raw_pixels: &[u8] = bytemuck::cast_slice(&image); 133 - // 134 - // assert_eq!(raw_pixels.len(), (width * height * 4) as usize, "Invalid buffer size!"); 135 - // 161 + // maybe maybe maybe 162 + fs::write(path, avif_image).polar_unwrap("Error writing image!", true); 136 163 137 - Ok(cropped_image.into_vec()) 164 + issue.image = true; 165 + println_green!("Downloaded and saved image for {}", issue.title); 166 + 167 + Ok(()) 168 + } 169 + _ => bail!("No image for the issue_type: {:?}", issue.issue_type), 170 + } 138 171 }
+34
backend/src/macros.rs
··· 26 26 ($($arg:tt)*) => {{ 27 27 println!("\x1b[36;1m{}\x1b[0m", format!($($arg)*)); 28 28 }}; 29 + } 30 + 31 + pub trait PolarResultUnwrap<T> { 32 + fn polar_unwrap(self, message: &str, show_error: bool) -> T; 33 + } 34 + 35 + pub trait PolarOptionUnwrap<T> { 36 + fn polar_unwrap(self, message: &str) -> T; 37 + } 38 + 39 + 40 + impl<T, E: std::fmt::Debug> PolarResultUnwrap<T> for Result<T, E> { 41 + fn polar_unwrap(self, message: &str, show_error: bool) -> T { 42 + match self { 43 + Ok(value) => value, 44 + Err(err) => { 45 + if show_error { 46 + panic_red!("[err]: {}, {:?}", message, err); 47 + 48 + } else { 49 + panic_red!("[err]: {}", message); 50 + } 51 + } 52 + } 53 + } 54 + } 55 + 56 + impl<T> PolarOptionUnwrap<T> for Option<T> { 57 + fn polar_unwrap(self, message: &str) -> T { 58 + match self { 59 + Some(value) => value, 60 + None => panic_red!("[err]: {}", message), 61 + } 62 + } 29 63 }
+136
backend/src/main.rs
··· 1 + use regex::Regex; 2 + use std::{fs, thread}; 3 + use crate::macros::PolarOptionUnwrap; 4 + use crate::parsing::Issue; 5 + use crossbeam_queue::{ArrayQueue, SegQueue}; 6 + use macros::PolarResultUnwrap; 7 + use std::sync::{Arc, Mutex}; 8 + use rusqlite::Connection; 9 + use serde_json::Value; 10 + use crate::networking::homebrew_database_updater; 11 + 12 + mod networking; 13 + mod config; 14 + mod images; 15 + mod parsing; 16 + mod macros; 17 + 18 + const HB_DATABASE: &str = "./HBstore.db"; 19 + const GAME_SKIPS_DATABASE: &str = "./game_skips.json"; 20 + 21 + fn main() { 22 + println!("Hello, world!"); 23 + 24 + // get needed variables 25 + let code_regex = Arc::new( Regex::new(r"[a-zA-Z]{4}[0-9]{5}").polar_unwrap("[ERR]: unable to create regex!", true) ); 26 + 27 + let (github_token, homebrew_token, database_path, images_path) = config::get_cli_variables(); 28 + config::setup_dirs(&database_path, &images_path); 29 + 30 + // update the homebrew database and get a connection 31 + homebrew_database_updater(HB_DATABASE, &homebrew_token).polar_unwrap("", true); 32 + let homebrew_db = Connection::open(HB_DATABASE).polar_unwrap("Failed to open SQLite connection to homebrew database!", true); 33 + let homebrew_db = Arc::new( Mutex::new(homebrew_db)); 34 + 35 + let (page_count, issues_count): (u64, u64) = networking::github_get_repo_info(&github_token); 36 + 37 + 38 + println_cyan!("Total Issues: {}", issues_count); 39 + println_cyan!("Total Pages: {}", page_count); 40 + 41 + 42 + // setup multi-threading 43 + let issues: Arc< ArrayQueue<Issue> > = Arc::new(ArrayQueue::new(issues_count as usize)); 44 + 45 + let old_game_skips: Arc< Vec<u64> > = { 46 + match fs::read_to_string(GAME_SKIPS_DATABASE) { 47 + Ok(string) => { 48 + 49 + Arc::new(serde_json::from_str(&string).unwrap_or_default()) 50 + 51 + } 52 + Err(_) => Arc::new(vec![]) 53 + } 54 + }; 55 + 56 + let game_skips: Arc< SegQueue<u64> > = { 57 + let queue = SegQueue::new(); 58 + old_game_skips.iter().for_each( |x| queue.push(x.to_owned())); 59 + Arc::new(queue) 60 + }; 61 + 62 + let mut handles = vec![]; 63 + 64 + for page in 1..=page_count { 65 + let issues = issues.clone(); 66 + let game_skips = game_skips.clone(); 67 + let old_game_skips = old_game_skips.clone(); 68 + let regex = code_regex.clone(); 69 + let homebrew_db = homebrew_db.clone(); 70 + let github_token = github_token.clone(); 71 + let homebrew_token = homebrew_token.clone(); 72 + let images_path = images_path.clone(); 73 + 74 + 75 + let handle = thread::spawn( move || { 76 + 77 + let github_issues = networking::github_get_issues(page, &github_token); 78 + 79 + for issue in github_issues.iter() { 80 + let parsed_issue = parsing::parse_github_issue(issue, &regex); 81 + 82 + match parsed_issue { 83 + Ok(mut issue) => { 84 + // check if there are any warnings 85 + if !issue.1.is_empty() { 86 + println_cyan!("{} -> {:?}", issue.0.id, issue.1); 87 + } 88 + 89 + // Do image handling here! :D 90 + if !old_game_skips.contains(&issue.0.id) { 91 + if let Err(err) = images::get_converted_image_data(&mut issue.0, &images_path, homebrew_db.clone(), &homebrew_token) { 92 + game_skips.push(issue.0.id); 93 + eprintln_red!("Error downloading image for {} : {:?}", issue.0.id, err.root_cause()); 94 + }; 95 + } 96 + 97 + 98 + issues.push(issue.0).polar_unwrap("Can't add issue to the Array!", true) 99 + } 100 + Err(err) => eprintln_red!("{} -> {} ", issue.get("number").and_then(Value::as_u64).unwrap_or_default(), err), 101 + } 102 + } 103 + }); 104 + 105 + handles.push(handle); 106 + } 107 + 108 + 109 + // Wait for all threads to finish 110 + for handle in handles { 111 + handle.join().polar_unwrap("Error waiting on threads to finish!", true); // Join each thread and handle potential errors 112 + } 113 + 114 + // get issues and games_kips 115 + let issues = Arc::into_inner(issues).polar_unwrap("Error while retrieving issues value!"); 116 + let mut issues: Vec<Issue> = issues.into_iter().collect(); 117 + 118 + let game_skips = Arc::into_inner(game_skips).polar_unwrap("Error while retrieving issues value!"); 119 + let mut game_skips: Vec<u64> = game_skips.into_iter().collect(); 120 + 121 + 122 + // sort issues and game_skips 123 + issues.sort_by_key(|issue| !issue.id); 124 + game_skips.sort(); 125 + 126 + 127 + // saves databases 128 + let temp_string = serde_json::to_string_pretty(&issues).polar_unwrap("error making issues into a json!", true); 129 + let temp_path = format!("{database_path}/database.json"); 130 + fs::write(temp_path, temp_string).polar_unwrap("Error saving the \"database\" file!", true); 131 + 132 + let temp_string = serde_json::to_string_pretty(&game_skips).polar_unwrap("error making game_skips into a json!", true); 133 + fs::write(GAME_SKIPS_DATABASE, temp_string).polar_unwrap("Error saving the \"game_skips\" file!", true); 134 + 135 + println_green!("dun! {} issues processed", issues.len()); 136 + }
+156 -13
backend/src/networking.rs
··· 1 + use std::fs; 2 + use std::fs::File; 3 + use anyhow::{bail, Context, Error}; 4 + use hmac::KeyInit; 1 5 use serde_json::Value; 2 - use crate::panic_red; 6 + use crate::{ panic_red, println_cyan}; 7 + use crate::macros::{PolarOptionUnwrap, PolarResultUnwrap}; 8 + 9 + const API_URL: &str = "https://api.github.com/repos/red-prig/fpps4-game-compatibility"; 10 + const TMDB_HEX: &str = "F5DE66D2680E255B2DF79E74F890EBF349262F618BCAE2A9ACCDEE5156CE8DF2CDF2D48C71173CDC2594465B87405D197CF1AED3B7E9671EEB56CA6753C2E6B0"; 11 + const PS4_USER_AGENT: &str = "Mozilla/5.0 (PlayStation; PlayStation 4/11.00) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15"; 12 + 3 13 4 14 fn github_request(url: &str, token: &str) -> Value { 5 15 match ureq::get(url) ··· 8 18 .set("Authorization", &format!("Bearer {}", token)) 9 19 .call() 10 20 { 11 - Ok(response) => response.into_json().expect("Failed to parse JSON"), 21 + Ok(response) => response.into_json().polar_unwrap("Failed to parse JSON", true), 12 22 Err(response) => panic_red!("Github request failed: {}", response), 13 23 } 14 24 } 15 25 16 - // fn image_downloader(url: String, user_ffagent: &str, location: String) -> Result<(), anyhow::Error> { 17 - // let response = ureq::get(&url).set("User-Agent", user_agent).call()?; 18 - // let mut reader = response.into_reader(); 19 - // let mut buffer = Vec::new(); 20 - // reader.read_to_end(&mut buffer)?; 21 - // 22 - // let img = image::load_from_memory(&buffer)?; 23 - // let resized_img = img.resize_exact(256, 256, image::imageops::Lanczos3); 24 - // resized_img.save_with_format(location, image::ImageFormat::Avif)?; 25 - // Ok(()) 26 - // } 26 + 27 + pub(crate) fn github_get_repo_info(token: &str) -> (u64, u64) { 28 + let total_issues: u64 = github_request(API_URL, &token) 29 + .get("open_issues_count") 30 + .and_then(Value::as_u64) 31 + .polar_unwrap("Failed to parse total_issues JSON!"); 32 + 33 + let total_pages: u64 = total_issues.div_ceil(100); 34 + (total_pages, total_issues) 35 + } 36 + 37 + pub(crate) fn github_get_issues(page: u64, token: &str) -> Vec<Value> { 38 + let url = format!( 39 + "{}/issues?page={}&per_page=100&state=open&direction=DESC", 40 + API_URL, page 41 + ); 42 + 43 + // need to clone otherwise it is a reference -.- 44 + github_request(url.as_str(), token) 45 + .as_array() 46 + .cloned() 47 + .polar_unwrap("Error getting issues!") 48 + } 49 + 50 + pub(crate) fn get_game_image_data(gamecode: &str) -> Result<Vec<u8>, Error> { 51 + use hmac::{Hmac, Mac}; 52 + use sha1::Sha1; 53 + use hex::FromHex; 54 + 55 + // create the url based on the TMDB hash 56 + let mut hmac = Hmac::<Sha1>::new_from_slice(&Vec::from_hex(TMDB_HEX)?)?; 57 + let image_code = format!("{}_00", gamecode); 58 + hmac.update(image_code.as_bytes()); 59 + let hmac = hmac.finalize().into_bytes(); 60 + let hash = hex::encode_upper(hmac); 61 + 62 + 63 + let hash_url = format!( 64 + "https://tmdb.np.dl.playstation.net/tmdb2/{}_{}/{}.json", 65 + image_code, hash, image_code 66 + ); 67 + 68 + // get image url from link 69 + let url = match ureq::get(hash_url.as_ref()) 70 + .set("User-Agent", PS4_USER_AGENT) 71 + .call() 72 + { 73 + Ok(response) => { 74 + let temp: Value = response.into_json().expect("Failed to parse JSON"); 75 + 76 + temp.get("icons") 77 + .context("Failed to parse JSON")? 78 + .get(0) 79 + .context("Failed to parse JSON")? 80 + .get("icon") 81 + .and_then(Value::as_str) 82 + .context("Failed to parse JSON")? 83 + .to_string() 84 + } 85 + Err(response) => bail!("Image request failed: {}", response), 86 + }; 87 + 88 + image_downloader(url, PS4_USER_AGENT) 89 + } 90 + 91 + 92 + pub(crate) fn image_downloader(url: String, user_agent: &str) -> Result<Vec<u8>, anyhow::Error> { 93 + let response = ureq::get(&url) 94 + .set("User-Agent", user_agent) 95 + .call()?; 96 + 97 + let mut reader = response.into_reader(); 98 + let mut buffer = Vec::new(); 99 + reader.read_to_end(&mut buffer)?; 100 + 101 + Ok(buffer) 102 + } 103 + 104 + fn download_database(homebrew_database: &str, homebrew_token: &str) -> Result<(), anyhow::Error> { 105 + // Downloads the new database 106 + let database_response = ureq::get("https://api.pkg-zone.com/store.db") 107 + .set("User-Agent", &homebrew_token) 108 + .call()?; 109 + 110 + let mut file = File::create(&homebrew_database).polar_unwrap("Failed to create file!", true); 111 + std::io::copy(&mut database_response.into_reader(), &mut file)?; 112 + 113 + Ok(()) 114 + } 115 + 116 + pub(crate) fn homebrew_database_updater(homebrew_database: &str, homebrew_token: &str) -> Result<(), anyhow::Error> { 117 + use md5::{Digest, Md5}; 118 + use chrono::{Timelike, Utc}; 119 + use hex::encode; 120 + use std::path::Path; 121 + 122 + let minute: u32 = Utc::now().minute(); 123 + //let minute: u32 = 58; // for debug 124 + 125 + if !Path::new(&homebrew_database).exists() { 126 + println_cyan!("Downloading database!"); 127 + 128 + match download_database(homebrew_database, homebrew_token) { 129 + Ok(_) => println_cyan!("Saved Database In: \"{}\" Successfully!", &homebrew_database), 130 + Err(err) => bail!("Error downloading database! {}", err), 131 + } 132 + 133 + return Ok(()) 134 + } 135 + 136 + 137 + if !(4..=57).contains(&minute) { 138 + 139 + let hash_response = ureq::get("https://api.pkg-zone.com/api.php?db_check_hash=true") 140 + .set("User-Agent", &homebrew_token) 141 + .call()?; 142 + 143 + let new_hash: String = { 144 + let body: Value = hash_response.into_json()?; 145 + 146 + body.get("hash") 147 + .and_then(Value::as_str) 148 + .context("Error while getting new_hash!")? 149 + .to_string() 150 + }; 151 + 152 + let local_hash: String = match fs::read(&homebrew_database) { 153 + Ok(file) => encode(Md5::digest(file)), 154 + Err(err) => bail!("Homebrew Database not found: {}", err), 155 + }; 156 + 157 + // Compares the current hash with the new hash 158 + if new_hash != local_hash { 159 + println_cyan!("MD5Hash: {local_hash} => {new_hash}"); 160 + println_cyan!("Updating database!"); 161 + 162 + match download_database(homebrew_database, homebrew_token) { 163 + Ok(_) => println_cyan!("Saved Database In: \"{}\" Successfully!", &homebrew_database), 164 + Err(err) => bail!("Error downloading database! {}", err), 165 + } 166 + } 167 + } 168 + Ok(()) 169 + }
+42 -30
backend/src/parsing.rs
··· 3 3 use serde::{Deserialize, Serialize}; 4 4 use serde_json::Value; 5 5 6 - struct Issues { 7 - issues: Vec<Issue>, 8 - } 9 - 10 - // #[derive(Serialize, Deserialize)] 11 - struct Issue { 12 - id: u64, 13 - code: String, 14 - title: String, 15 - labels: Vec<String>, 16 - status: Status, 17 - issue_type: GameType, 18 - created: String, 19 - updated: String, 20 - // image: bool, 6 + #[derive(Serialize, Deserialize)] 7 + #[derive(Debug)] 8 + pub(crate) struct Issue { 9 + pub(crate) id: u64, 10 + pub(crate) code: String, 11 + pub(crate) title: String, 12 + pub(crate) labels: Vec<String>, 13 + pub(crate) status: Status, 14 + pub(crate) issue_type: GameType, 15 + pub(crate) created: String, 16 + pub(crate) updated: String, 17 + pub(crate) image: bool, 21 18 } 22 19 23 - // #[derive(Serialize, Deserialize)] 24 - enum GameType { 20 + #[derive(Serialize, Deserialize)] 21 + #[derive(Debug)] 22 + pub(crate) enum GameType { 25 23 Game, 26 24 Homebrew, 27 25 Ps2game, ··· 29 27 SystemFwUnknown, 30 28 } 31 29 32 - // #[derive(Serialize, Deserialize)] 33 - enum Status { 30 + #[derive(Serialize, Deserialize)] 31 + #[derive(Debug)] 32 + pub(crate) enum Status { 34 33 Playable, 35 34 Ingame, 36 35 Menus, ··· 38 37 Nothing, 39 38 } 40 39 41 - fn parse_github_issue(issue: Value, code_regex: Regex) -> anyhow::Result<(Issue, Vec<String>)> { 40 + pub(crate) fn parse_github_issue(issue: &Value, code_regex: &Regex) -> anyhow::Result<(Issue, Vec<String>)> { 42 41 let mut warning: Vec<String> = vec![]; 43 42 44 43 let id: u64 = issue ··· 52 51 .and_then(Value::as_str) 53 52 .context("Failed to parse title")?; 54 53 55 - if code_regex.captures(&title).iter().len() != 1 { 54 + if code_regex.captures(title).iter().len() > 1 { 56 55 warning.push(String::from("More than one title id has been matched")); // add a warning 57 56 } 58 57 59 58 code_regex 60 - .find(&title) 59 + .find(title) 61 60 .map(|x| x.as_str().to_uppercase()) 62 - .context("Failed to get code using regex")? 61 + .unwrap_or_default() // unwrap_or_default, otherwise homebrews or others will fail! 63 62 }; 64 63 65 64 let title: String = { ··· 76 75 || title.contains("Homebrew") 77 76 || title.contains("[]") 78 77 { 79 - warning.push(String::from("Title not correctly formatted")); // add a warning 80 - 81 - title = title.replace("(Homebrew)", ""); 82 - title = title.replace("- HOMEBREW", ""); 83 - title = title.replace("Homebrew", ""); 84 - title = title.replace("[]", ""); 78 + // warning.push(String::from("Title not correctly formatted")); // add a warning 85 79 } 86 80 87 81 title 82 + .replace("- HOMEBREW", "") 83 + .replace("Homebrew", "") 84 + .replace("[]", "") 85 + .replace("(Homebrew)", "") 86 + .trim() 87 + .trim_end_matches('-') 88 + .trim() 89 + .to_string() 90 + 91 + // title 88 92 }; 89 93 90 94 let mut labels: Vec<&str> = issue ··· 97 101 .and_then(Value::as_str) 98 102 .unwrap_or_default()) 99 103 .collect::<Vec<&str>>(); 104 + 105 + // bail if any are invalid 106 + if labels.iter().any(|label| *label == "question") { 107 + bail!("Ignoring!") 108 + } else if labels.iter().any(|label| *label == "invalid") { 109 + bail!("invalid!") 110 + } 100 111 101 112 102 113 let status: Status = { ··· 133 144 if labels.contains(&"status-") 134 145 { 135 146 warning.push(String::from("More than one status label")); // add a warning 136 - labels = labels.into_iter().filter(|x| !x.starts_with("status-")).collect(); 147 + labels.retain(|x| !x.starts_with("status-")); 137 148 } 138 149 139 150 status ··· 224 235 issue_type, 225 236 created, 226 237 updated, 238 + image: false, 227 239 }; 228 240 229 241 Ok((new_issue, warning))