├── .github └── workflows │ └── publish.yaml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── build.nu ├── nupm.nuon └── src ├── audio_meta.rs ├── audio_player.rs ├── constants.rs ├── lib.rs ├── main.rs ├── sound.rs └── sound_make.rs /.github/workflows/publish.yaml: -------------------------------------------------------------------------------- 1 | name: Publish Crate 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | paths: 8 | - Cargo.toml 9 | release: 10 | workflow_dispatch: 11 | 12 | 13 | jobs: 14 | publish: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Install alsa system packages 18 | run: sudo apt-get update && sudo apt-get install -y libasound2-dev libudev-dev 19 | - uses: actions/checkout@v3 20 | - name: Set up Rust toolchain 21 | uses: actions-rs/toolchain@v1 22 | with: 23 | toolchain: stable 24 | override: true 25 | 26 | - name: Publish to crates.io 27 | uses: katyo/publish-crates@v2 28 | with: 29 | registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }} 30 | env: 31 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .vscode 3 | -------------------------------------------------------------------------------- /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 = "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 = "aho-corasick" 13 | version = "1.1.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "alloc-no-stdlib" 22 | version = "2.0.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" 25 | 26 | [[package]] 27 | name = "alloc-stdlib" 28 | version = "0.2.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" 31 | dependencies = [ 32 | "alloc-no-stdlib", 33 | ] 34 | 35 | [[package]] 36 | name = "allocator-api2" 37 | version = "0.2.21" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 40 | 41 | [[package]] 42 | name = "alsa" 43 | version = "0.9.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" 46 | dependencies = [ 47 | "alsa-sys", 48 | "bitflags 2.9.0", 49 | "cfg-if", 50 | "libc", 51 | ] 52 | 53 | [[package]] 54 | name = "alsa-sys" 55 | version = "0.3.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 58 | dependencies = [ 59 | "libc", 60 | "pkg-config", 61 | ] 62 | 63 | [[package]] 64 | name = "android-tzdata" 65 | version = "0.1.1" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 68 | 69 | [[package]] 70 | name = "android_system_properties" 71 | version = "0.1.5" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 74 | dependencies = [ 75 | "libc", 76 | ] 77 | 78 | [[package]] 79 | name = "arrayvec" 80 | version = "0.7.6" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 83 | 84 | [[package]] 85 | name = "autocfg" 86 | version = "1.4.0" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 89 | 90 | [[package]] 91 | name = "bindgen" 92 | version = "0.70.1" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 95 | dependencies = [ 96 | "bitflags 2.9.0", 97 | "cexpr", 98 | "clang-sys", 99 | "itertools", 100 | "proc-macro2", 101 | "quote", 102 | "regex", 103 | "rustc-hash", 104 | "shlex", 105 | "syn", 106 | ] 107 | 108 | [[package]] 109 | name = "bit-set" 110 | version = "0.8.0" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 113 | dependencies = [ 114 | "bit-vec", 115 | ] 116 | 117 | [[package]] 118 | name = "bit-vec" 119 | version = "0.8.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 122 | 123 | [[package]] 124 | name = "bitflags" 125 | version = "1.3.2" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 128 | 129 | [[package]] 130 | name = "bitflags" 131 | version = "2.9.0" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 134 | 135 | [[package]] 136 | name = "brotli" 137 | version = "7.0.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" 140 | dependencies = [ 141 | "alloc-no-stdlib", 142 | "alloc-stdlib", 143 | "brotli-decompressor", 144 | ] 145 | 146 | [[package]] 147 | name = "brotli-decompressor" 148 | version = "4.0.3" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" 151 | dependencies = [ 152 | "alloc-no-stdlib", 153 | "alloc-stdlib", 154 | ] 155 | 156 | [[package]] 157 | name = "bumpalo" 158 | version = "3.17.0" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 161 | 162 | [[package]] 163 | name = "bytemuck" 164 | version = "1.23.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" 167 | 168 | [[package]] 169 | name = "byteorder" 170 | version = "1.5.0" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 173 | 174 | [[package]] 175 | name = "bytes" 176 | version = "1.10.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 179 | 180 | [[package]] 181 | name = "cc" 182 | version = "1.2.21" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" 185 | dependencies = [ 186 | "jobserver", 187 | "libc", 188 | "shlex", 189 | ] 190 | 191 | [[package]] 192 | name = "cesu8" 193 | version = "1.1.0" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 196 | 197 | [[package]] 198 | name = "cexpr" 199 | version = "0.6.0" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 202 | dependencies = [ 203 | "nom", 204 | ] 205 | 206 | [[package]] 207 | name = "cfg-if" 208 | version = "1.0.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 211 | 212 | [[package]] 213 | name = "cfg_aliases" 214 | version = "0.2.1" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 217 | 218 | [[package]] 219 | name = "chrono" 220 | version = "0.4.41" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 223 | dependencies = [ 224 | "android-tzdata", 225 | "iana-time-zone", 226 | "js-sys", 227 | "num-traits", 228 | "pure-rust-locales", 229 | "serde", 230 | "wasm-bindgen", 231 | "windows-link", 232 | ] 233 | 234 | [[package]] 235 | name = "chrono-humanize" 236 | version = "0.2.3" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" 239 | dependencies = [ 240 | "chrono", 241 | ] 242 | 243 | [[package]] 244 | name = "clang-sys" 245 | version = "1.8.1" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 248 | dependencies = [ 249 | "glob", 250 | "libc", 251 | "libloading", 252 | ] 253 | 254 | [[package]] 255 | name = "claxon" 256 | version = "0.4.3" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" 259 | 260 | [[package]] 261 | name = "combine" 262 | version = "4.6.7" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 265 | dependencies = [ 266 | "bytes", 267 | "memchr", 268 | ] 269 | 270 | [[package]] 271 | name = "core-foundation-sys" 272 | version = "0.8.7" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 275 | 276 | [[package]] 277 | name = "coreaudio-rs" 278 | version = "0.11.3" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 281 | dependencies = [ 282 | "bitflags 1.3.2", 283 | "core-foundation-sys", 284 | "coreaudio-sys", 285 | ] 286 | 287 | [[package]] 288 | name = "coreaudio-sys" 289 | version = "0.2.16" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" 292 | dependencies = [ 293 | "bindgen", 294 | ] 295 | 296 | [[package]] 297 | name = "cpal" 298 | version = "0.15.3" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 301 | dependencies = [ 302 | "alsa", 303 | "core-foundation-sys", 304 | "coreaudio-rs", 305 | "dasp_sample", 306 | "jni", 307 | "js-sys", 308 | "libc", 309 | "mach2", 310 | "ndk", 311 | "ndk-context", 312 | "oboe", 313 | "wasm-bindgen", 314 | "wasm-bindgen-futures", 315 | "web-sys", 316 | "windows 0.54.0", 317 | ] 318 | 319 | [[package]] 320 | name = "crc32fast" 321 | version = "1.4.2" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 324 | dependencies = [ 325 | "cfg-if", 326 | ] 327 | 328 | [[package]] 329 | name = "crossbeam-deque" 330 | version = "0.8.6" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 333 | dependencies = [ 334 | "crossbeam-epoch", 335 | "crossbeam-utils", 336 | ] 337 | 338 | [[package]] 339 | name = "crossbeam-epoch" 340 | version = "0.9.18" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 343 | dependencies = [ 344 | "crossbeam-utils", 345 | ] 346 | 347 | [[package]] 348 | name = "crossbeam-utils" 349 | version = "0.8.21" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 352 | 353 | [[package]] 354 | name = "crossterm" 355 | version = "0.28.1" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 358 | dependencies = [ 359 | "bitflags 2.9.0", 360 | "crossterm_winapi", 361 | "mio", 362 | "parking_lot", 363 | "rustix 0.38.44", 364 | "signal-hook", 365 | "signal-hook-mio", 366 | "winapi", 367 | ] 368 | 369 | [[package]] 370 | name = "crossterm_winapi" 371 | version = "0.9.1" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 374 | dependencies = [ 375 | "winapi", 376 | ] 377 | 378 | [[package]] 379 | name = "dasp_sample" 380 | version = "0.11.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 383 | 384 | [[package]] 385 | name = "dirs" 386 | version = "5.0.1" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" 389 | dependencies = [ 390 | "dirs-sys", 391 | ] 392 | 393 | [[package]] 394 | name = "dirs-sys" 395 | version = "0.4.1" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 398 | dependencies = [ 399 | "libc", 400 | "option-ext", 401 | "redox_users", 402 | "windows-sys 0.48.0", 403 | ] 404 | 405 | [[package]] 406 | name = "doctest-file" 407 | version = "1.0.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" 410 | 411 | [[package]] 412 | name = "either" 413 | version = "1.15.0" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 416 | 417 | [[package]] 418 | name = "encoding_rs" 419 | version = "0.8.35" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 422 | dependencies = [ 423 | "cfg-if", 424 | ] 425 | 426 | [[package]] 427 | name = "equivalent" 428 | version = "1.0.2" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 431 | 432 | [[package]] 433 | name = "erased-serde" 434 | version = "0.4.6" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 437 | dependencies = [ 438 | "serde", 439 | "typeid", 440 | ] 441 | 442 | [[package]] 443 | name = "errno" 444 | version = "0.3.11" 445 | source = "registry+https://github.com/rust-lang/crates.io-index" 446 | checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 447 | dependencies = [ 448 | "libc", 449 | "windows-sys 0.59.0", 450 | ] 451 | 452 | [[package]] 453 | name = "extended" 454 | version = "0.1.0" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" 457 | 458 | [[package]] 459 | name = "fancy-regex" 460 | version = "0.14.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "6e24cb5a94bcae1e5408b0effca5cd7172ea3c5755049c5f3af4cd283a165298" 463 | dependencies = [ 464 | "bit-set", 465 | "regex-automata", 466 | "regex-syntax", 467 | ] 468 | 469 | [[package]] 470 | name = "flate2" 471 | version = "1.1.1" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 474 | dependencies = [ 475 | "crc32fast", 476 | "miniz_oxide", 477 | ] 478 | 479 | [[package]] 480 | name = "foldhash" 481 | version = "0.1.5" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 484 | 485 | [[package]] 486 | name = "getrandom" 487 | version = "0.2.16" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 490 | dependencies = [ 491 | "cfg-if", 492 | "libc", 493 | "wasi 0.11.0+wasi-snapshot-preview1", 494 | ] 495 | 496 | [[package]] 497 | name = "getrandom" 498 | version = "0.3.2" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 501 | dependencies = [ 502 | "cfg-if", 503 | "libc", 504 | "r-efi", 505 | "wasi 0.14.2+wasi-0.2.4", 506 | ] 507 | 508 | [[package]] 509 | name = "glob" 510 | version = "0.3.2" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 513 | 514 | [[package]] 515 | name = "hashbrown" 516 | version = "0.15.3" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 519 | dependencies = [ 520 | "allocator-api2", 521 | "equivalent", 522 | "foldhash", 523 | ] 524 | 525 | [[package]] 526 | name = "heck" 527 | version = "0.5.0" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 530 | 531 | [[package]] 532 | name = "hex" 533 | version = "0.4.3" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 536 | 537 | [[package]] 538 | name = "hound" 539 | version = "3.5.1" 540 | source = "registry+https://github.com/rust-lang/crates.io-index" 541 | checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" 542 | 543 | [[package]] 544 | name = "iana-time-zone" 545 | version = "0.1.63" 546 | source = "registry+https://github.com/rust-lang/crates.io-index" 547 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 548 | dependencies = [ 549 | "android_system_properties", 550 | "core-foundation-sys", 551 | "iana-time-zone-haiku", 552 | "js-sys", 553 | "log", 554 | "wasm-bindgen", 555 | "windows-core 0.61.0", 556 | ] 557 | 558 | [[package]] 559 | name = "iana-time-zone-haiku" 560 | version = "0.1.2" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 563 | dependencies = [ 564 | "cc", 565 | ] 566 | 567 | [[package]] 568 | name = "id3" 569 | version = "1.16.2" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "472295f55960dd48e38c89442fa5d5423f5cf0ed2c665485be78e129231a39e9" 572 | dependencies = [ 573 | "bitflags 2.9.0", 574 | "byteorder", 575 | "flate2", 576 | ] 577 | 578 | [[package]] 579 | name = "indexmap" 580 | version = "2.9.0" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 583 | dependencies = [ 584 | "equivalent", 585 | "hashbrown", 586 | ] 587 | 588 | [[package]] 589 | name = "interprocess" 590 | version = "2.2.3" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" 593 | dependencies = [ 594 | "doctest-file", 595 | "libc", 596 | "recvmsg", 597 | "widestring", 598 | "windows-sys 0.52.0", 599 | ] 600 | 601 | [[package]] 602 | name = "inventory" 603 | version = "0.3.20" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" 606 | dependencies = [ 607 | "rustversion", 608 | ] 609 | 610 | [[package]] 611 | name = "is_ci" 612 | version = "1.2.0" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" 615 | 616 | [[package]] 617 | name = "itertools" 618 | version = "0.13.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 621 | dependencies = [ 622 | "either", 623 | ] 624 | 625 | [[package]] 626 | name = "itoa" 627 | version = "1.0.15" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 630 | 631 | [[package]] 632 | name = "jni" 633 | version = "0.21.1" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 636 | dependencies = [ 637 | "cesu8", 638 | "cfg-if", 639 | "combine", 640 | "jni-sys", 641 | "log", 642 | "thiserror 1.0.69", 643 | "walkdir", 644 | "windows-sys 0.45.0", 645 | ] 646 | 647 | [[package]] 648 | name = "jni-sys" 649 | version = "0.3.0" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 652 | 653 | [[package]] 654 | name = "jobserver" 655 | version = "0.1.33" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 658 | dependencies = [ 659 | "getrandom 0.3.2", 660 | "libc", 661 | ] 662 | 663 | [[package]] 664 | name = "js-sys" 665 | version = "0.3.77" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 668 | dependencies = [ 669 | "once_cell", 670 | "wasm-bindgen", 671 | ] 672 | 673 | [[package]] 674 | name = "lazy_static" 675 | version = "1.5.0" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 678 | 679 | [[package]] 680 | name = "lewton" 681 | version = "0.10.2" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 684 | dependencies = [ 685 | "byteorder", 686 | "ogg", 687 | "tinyvec", 688 | ] 689 | 690 | [[package]] 691 | name = "libc" 692 | version = "0.2.172" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 695 | 696 | [[package]] 697 | name = "libloading" 698 | version = "0.8.6" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 701 | dependencies = [ 702 | "cfg-if", 703 | "windows-targets 0.52.6", 704 | ] 705 | 706 | [[package]] 707 | name = "libproc" 708 | version = "0.14.10" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" 711 | dependencies = [ 712 | "bindgen", 713 | "errno", 714 | "libc", 715 | ] 716 | 717 | [[package]] 718 | name = "libredox" 719 | version = "0.1.3" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 722 | dependencies = [ 723 | "bitflags 2.9.0", 724 | "libc", 725 | ] 726 | 727 | [[package]] 728 | name = "linux-raw-sys" 729 | version = "0.4.15" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 732 | 733 | [[package]] 734 | name = "linux-raw-sys" 735 | version = "0.9.4" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 738 | 739 | [[package]] 740 | name = "lock_api" 741 | version = "0.4.12" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 744 | dependencies = [ 745 | "autocfg", 746 | "scopeguard", 747 | ] 748 | 749 | [[package]] 750 | name = "log" 751 | version = "0.4.27" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 754 | 755 | [[package]] 756 | name = "lru" 757 | version = "0.12.5" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 760 | dependencies = [ 761 | "hashbrown", 762 | ] 763 | 764 | [[package]] 765 | name = "lscolors" 766 | version = "0.17.0" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "53304fff6ab1e597661eee37e42ea8c47a146fca280af902bb76bff8a896e523" 769 | dependencies = [ 770 | "nu-ansi-term", 771 | ] 772 | 773 | [[package]] 774 | name = "mach2" 775 | version = "0.4.2" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 778 | dependencies = [ 779 | "libc", 780 | ] 781 | 782 | [[package]] 783 | name = "memchr" 784 | version = "2.7.4" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 787 | 788 | [[package]] 789 | name = "miette" 790 | version = "7.6.0" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" 793 | dependencies = [ 794 | "cfg-if", 795 | "miette-derive", 796 | "owo-colors", 797 | "supports-color", 798 | "supports-hyperlinks", 799 | "supports-unicode", 800 | "terminal_size", 801 | "textwrap", 802 | "unicode-width 0.1.14", 803 | ] 804 | 805 | [[package]] 806 | name = "miette-derive" 807 | version = "7.6.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" 810 | dependencies = [ 811 | "proc-macro2", 812 | "quote", 813 | "syn", 814 | ] 815 | 816 | [[package]] 817 | name = "minimal-lexical" 818 | version = "0.2.1" 819 | source = "registry+https://github.com/rust-lang/crates.io-index" 820 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 821 | 822 | [[package]] 823 | name = "minimp3-sys" 824 | version = "0.3.2" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "e21c73734c69dc95696c9ed8926a2b393171d98b3f5f5935686a26a487ab9b90" 827 | dependencies = [ 828 | "cc", 829 | ] 830 | 831 | [[package]] 832 | name = "minimp3_fixed" 833 | version = "0.5.4" 834 | source = "registry+https://github.com/rust-lang/crates.io-index" 835 | checksum = "42b0f14e7e75da97ae396c2656b10262a3d4afa2ec98f35795630eff0c8b951b" 836 | dependencies = [ 837 | "minimp3-sys", 838 | "slice-ring-buffer", 839 | "thiserror 1.0.69", 840 | ] 841 | 842 | [[package]] 843 | name = "miniz_oxide" 844 | version = "0.8.8" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 847 | dependencies = [ 848 | "adler2", 849 | ] 850 | 851 | [[package]] 852 | name = "mio" 853 | version = "1.0.3" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 856 | dependencies = [ 857 | "libc", 858 | "log", 859 | "wasi 0.11.0+wasi-snapshot-preview1", 860 | "windows-sys 0.52.0", 861 | ] 862 | 863 | [[package]] 864 | name = "mp3-duration" 865 | version = "0.1.10" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "348bdc7300502f0801e5b57c448815713cd843b744ef9bda252a2698fdf90a0f" 868 | dependencies = [ 869 | "thiserror 1.0.69", 870 | ] 871 | 872 | [[package]] 873 | name = "ndk" 874 | version = "0.8.0" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 877 | dependencies = [ 878 | "bitflags 2.9.0", 879 | "jni-sys", 880 | "log", 881 | "ndk-sys", 882 | "num_enum", 883 | "thiserror 1.0.69", 884 | ] 885 | 886 | [[package]] 887 | name = "ndk-context" 888 | version = "0.1.1" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 891 | 892 | [[package]] 893 | name = "ndk-sys" 894 | version = "0.5.0+25.2.9519653" 895 | source = "registry+https://github.com/rust-lang/crates.io-index" 896 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 897 | dependencies = [ 898 | "jni-sys", 899 | ] 900 | 901 | [[package]] 902 | name = "nix" 903 | version = "0.29.0" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 906 | dependencies = [ 907 | "bitflags 2.9.0", 908 | "cfg-if", 909 | "cfg_aliases", 910 | "libc", 911 | ] 912 | 913 | [[package]] 914 | name = "nom" 915 | version = "7.1.3" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 918 | dependencies = [ 919 | "memchr", 920 | "minimal-lexical", 921 | ] 922 | 923 | [[package]] 924 | name = "ntapi" 925 | version = "0.4.1" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 928 | dependencies = [ 929 | "winapi", 930 | ] 931 | 932 | [[package]] 933 | name = "nu-ansi-term" 934 | version = "0.50.1" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" 937 | dependencies = [ 938 | "windows-sys 0.52.0", 939 | ] 940 | 941 | [[package]] 942 | name = "nu-derive-value" 943 | version = "0.104.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "5fd0d8e358b6440d01fe4e617f180aea826bade72efb54f5dc1c22e0e8038b6f" 946 | dependencies = [ 947 | "heck", 948 | "proc-macro-error2", 949 | "proc-macro2", 950 | "quote", 951 | "syn", 952 | ] 953 | 954 | [[package]] 955 | name = "nu-engine" 956 | version = "0.104.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "0c2b01483e3d09460375f0c0da7a83b6dc26fb319ca09c55d0665087b2d587c7" 959 | dependencies = [ 960 | "log", 961 | "nu-glob", 962 | "nu-path", 963 | "nu-protocol", 964 | "nu-utils", 965 | ] 966 | 967 | [[package]] 968 | name = "nu-glob" 969 | version = "0.104.0" 970 | source = "registry+https://github.com/rust-lang/crates.io-index" 971 | checksum = "202ce25889336061efea24e69d4e0de7147c15fd9892cdd70533500d47db8364" 972 | 973 | [[package]] 974 | name = "nu-path" 975 | version = "0.104.0" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "41c68c7c06898a5c4c9f10038da63759661cb8ac8f301ce7d159173a595c8258" 978 | dependencies = [ 979 | "dirs", 980 | "omnipath", 981 | "pwd", 982 | "ref-cast", 983 | ] 984 | 985 | [[package]] 986 | name = "nu-plugin" 987 | version = "0.104.0" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "e00d2ccb35a1206c51740bea63b0deb72dc4c34ca6ceae6feac95f84d68370d2" 990 | dependencies = [ 991 | "log", 992 | "nix", 993 | "nu-engine", 994 | "nu-plugin-core", 995 | "nu-plugin-protocol", 996 | "nu-protocol", 997 | "nu-utils", 998 | "thiserror 2.0.12", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "nu-plugin-core" 1003 | version = "0.104.0" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | checksum = "30e416e6de2b62925ffc1924740a0e5340316a1630af3d2490d513bcb1f94e94" 1006 | dependencies = [ 1007 | "interprocess", 1008 | "log", 1009 | "nu-plugin-protocol", 1010 | "nu-protocol", 1011 | "rmp-serde", 1012 | "serde", 1013 | "serde_json", 1014 | "windows 0.56.0", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "nu-plugin-protocol" 1019 | version = "0.104.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "be7edbdee451bb29150b5e8184660d79d0c0801a6748b9f712b758cb78110305" 1022 | dependencies = [ 1023 | "nu-protocol", 1024 | "nu-utils", 1025 | "rmp-serde", 1026 | "semver", 1027 | "serde", 1028 | "typetag", 1029 | ] 1030 | 1031 | [[package]] 1032 | name = "nu-protocol" 1033 | version = "0.104.0" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "ab657b1947f1fad3c5052cb210fa311744736a4800a966ae21c4bc63de7c60ab" 1036 | dependencies = [ 1037 | "brotli", 1038 | "bytes", 1039 | "chrono", 1040 | "chrono-humanize", 1041 | "dirs", 1042 | "dirs-sys", 1043 | "fancy-regex", 1044 | "heck", 1045 | "indexmap", 1046 | "log", 1047 | "lru", 1048 | "memchr", 1049 | "miette", 1050 | "nix", 1051 | "nu-derive-value", 1052 | "nu-glob", 1053 | "nu-path", 1054 | "nu-system", 1055 | "nu-utils", 1056 | "num-format", 1057 | "os_pipe", 1058 | "rmp-serde", 1059 | "serde", 1060 | "serde_json", 1061 | "strum", 1062 | "strum_macros", 1063 | "thiserror 2.0.12", 1064 | "typetag", 1065 | "web-time", 1066 | "windows-sys 0.48.0", 1067 | ] 1068 | 1069 | [[package]] 1070 | name = "nu-system" 1071 | version = "0.104.0" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "f47094aaab4f1e3a86c3960400d82a50fcabde907f964ae095963ec95669577a" 1074 | dependencies = [ 1075 | "chrono", 1076 | "itertools", 1077 | "libc", 1078 | "libproc", 1079 | "log", 1080 | "mach2", 1081 | "nix", 1082 | "ntapi", 1083 | "procfs", 1084 | "sysinfo", 1085 | "web-time", 1086 | "windows 0.56.0", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "nu-utils" 1091 | version = "0.104.0" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "327999b774d78b301a6b68c33d312a1a8047c59fb8971b6552ebf823251f1481" 1094 | dependencies = [ 1095 | "crossterm", 1096 | "crossterm_winapi", 1097 | "fancy-regex", 1098 | "log", 1099 | "lscolors", 1100 | "nix", 1101 | "num-format", 1102 | "serde", 1103 | "serde_json", 1104 | "strip-ansi-escapes", 1105 | "sys-locale", 1106 | "unicase", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "nu_plugin_audio_hook" 1111 | version = "0.104.0" 1112 | dependencies = [ 1113 | "chrono", 1114 | "id3", 1115 | "lazy_static", 1116 | "mp3-duration", 1117 | "nu-plugin", 1118 | "nu-protocol", 1119 | "rodio", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "num-derive" 1124 | version = "0.4.2" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 1127 | dependencies = [ 1128 | "proc-macro2", 1129 | "quote", 1130 | "syn", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "num-format" 1135 | version = "0.4.4" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "a652d9771a63711fd3c3deb670acfbe5c30a4072e664d7a3bf5a9e1056ac72c3" 1138 | dependencies = [ 1139 | "arrayvec", 1140 | "itoa", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "num-traits" 1145 | version = "0.2.19" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1148 | dependencies = [ 1149 | "autocfg", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "num_enum" 1154 | version = "0.7.3" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 1157 | dependencies = [ 1158 | "num_enum_derive", 1159 | ] 1160 | 1161 | [[package]] 1162 | name = "num_enum_derive" 1163 | version = "0.7.3" 1164 | source = "registry+https://github.com/rust-lang/crates.io-index" 1165 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 1166 | dependencies = [ 1167 | "proc-macro-crate", 1168 | "proc-macro2", 1169 | "quote", 1170 | "syn", 1171 | ] 1172 | 1173 | [[package]] 1174 | name = "oboe" 1175 | version = "0.6.1" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 1178 | dependencies = [ 1179 | "jni", 1180 | "ndk", 1181 | "ndk-context", 1182 | "num-derive", 1183 | "num-traits", 1184 | "oboe-sys", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "oboe-sys" 1189 | version = "0.6.1" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 1192 | dependencies = [ 1193 | "cc", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "ogg" 1198 | version = "0.8.0" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 1201 | dependencies = [ 1202 | "byteorder", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "omnipath" 1207 | version = "0.1.6" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "80adb31078122c880307e9cdfd4e3361e6545c319f9b9dcafcb03acd3b51a575" 1210 | 1211 | [[package]] 1212 | name = "once_cell" 1213 | version = "1.21.3" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1216 | 1217 | [[package]] 1218 | name = "option-ext" 1219 | version = "0.2.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1222 | 1223 | [[package]] 1224 | name = "os_pipe" 1225 | version = "1.2.1" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" 1228 | dependencies = [ 1229 | "libc", 1230 | "windows-sys 0.59.0", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "owo-colors" 1235 | version = "4.2.0" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" 1238 | 1239 | [[package]] 1240 | name = "parking_lot" 1241 | version = "0.12.3" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1244 | dependencies = [ 1245 | "lock_api", 1246 | "parking_lot_core", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "parking_lot_core" 1251 | version = "0.9.10" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1254 | dependencies = [ 1255 | "cfg-if", 1256 | "libc", 1257 | "redox_syscall", 1258 | "smallvec", 1259 | "windows-targets 0.52.6", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "paste" 1264 | version = "1.0.15" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1267 | 1268 | [[package]] 1269 | name = "pkg-config" 1270 | version = "0.3.32" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1273 | 1274 | [[package]] 1275 | name = "proc-macro-crate" 1276 | version = "3.3.0" 1277 | source = "registry+https://github.com/rust-lang/crates.io-index" 1278 | checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 1279 | dependencies = [ 1280 | "toml_edit", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "proc-macro-error-attr2" 1285 | version = "2.0.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" 1288 | dependencies = [ 1289 | "proc-macro2", 1290 | "quote", 1291 | ] 1292 | 1293 | [[package]] 1294 | name = "proc-macro-error2" 1295 | version = "2.0.1" 1296 | source = "registry+https://github.com/rust-lang/crates.io-index" 1297 | checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" 1298 | dependencies = [ 1299 | "proc-macro-error-attr2", 1300 | "proc-macro2", 1301 | "quote", 1302 | "syn", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "proc-macro2" 1307 | version = "1.0.95" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1310 | dependencies = [ 1311 | "unicode-ident", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "procfs" 1316 | version = "0.17.0" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" 1319 | dependencies = [ 1320 | "bitflags 2.9.0", 1321 | "chrono", 1322 | "flate2", 1323 | "hex", 1324 | "procfs-core", 1325 | "rustix 0.38.44", 1326 | ] 1327 | 1328 | [[package]] 1329 | name = "procfs-core" 1330 | version = "0.17.0" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" 1333 | dependencies = [ 1334 | "bitflags 2.9.0", 1335 | "chrono", 1336 | "hex", 1337 | ] 1338 | 1339 | [[package]] 1340 | name = "pure-rust-locales" 1341 | version = "0.8.1" 1342 | source = "registry+https://github.com/rust-lang/crates.io-index" 1343 | checksum = "1190fd18ae6ce9e137184f207593877e70f39b015040156b1e05081cdfe3733a" 1344 | 1345 | [[package]] 1346 | name = "pwd" 1347 | version = "1.4.0" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "72c71c0c79b9701efe4e1e4b563b2016dd4ee789eb99badcb09d61ac4b92e4a2" 1350 | dependencies = [ 1351 | "libc", 1352 | "thiserror 1.0.69", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "quote" 1357 | version = "1.0.40" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1360 | dependencies = [ 1361 | "proc-macro2", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "r-efi" 1366 | version = "5.2.0" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1369 | 1370 | [[package]] 1371 | name = "rayon" 1372 | version = "1.10.0" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1375 | dependencies = [ 1376 | "either", 1377 | "rayon-core", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "rayon-core" 1382 | version = "1.12.1" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1385 | dependencies = [ 1386 | "crossbeam-deque", 1387 | "crossbeam-utils", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "recvmsg" 1392 | version = "1.0.0" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" 1395 | 1396 | [[package]] 1397 | name = "redox_syscall" 1398 | version = "0.5.12" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 1401 | dependencies = [ 1402 | "bitflags 2.9.0", 1403 | ] 1404 | 1405 | [[package]] 1406 | name = "redox_users" 1407 | version = "0.4.6" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" 1410 | dependencies = [ 1411 | "getrandom 0.2.16", 1412 | "libredox", 1413 | "thiserror 1.0.69", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "ref-cast" 1418 | version = "1.0.24" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 1421 | dependencies = [ 1422 | "ref-cast-impl", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "ref-cast-impl" 1427 | version = "1.0.24" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 1430 | dependencies = [ 1431 | "proc-macro2", 1432 | "quote", 1433 | "syn", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "regex" 1438 | version = "1.11.1" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1441 | dependencies = [ 1442 | "aho-corasick", 1443 | "memchr", 1444 | "regex-automata", 1445 | "regex-syntax", 1446 | ] 1447 | 1448 | [[package]] 1449 | name = "regex-automata" 1450 | version = "0.4.9" 1451 | source = "registry+https://github.com/rust-lang/crates.io-index" 1452 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1453 | dependencies = [ 1454 | "aho-corasick", 1455 | "memchr", 1456 | "regex-syntax", 1457 | ] 1458 | 1459 | [[package]] 1460 | name = "regex-syntax" 1461 | version = "0.8.5" 1462 | source = "registry+https://github.com/rust-lang/crates.io-index" 1463 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1464 | 1465 | [[package]] 1466 | name = "rmp" 1467 | version = "0.8.14" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 1470 | dependencies = [ 1471 | "byteorder", 1472 | "num-traits", 1473 | "paste", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "rmp-serde" 1478 | version = "1.3.0" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" 1481 | dependencies = [ 1482 | "byteorder", 1483 | "rmp", 1484 | "serde", 1485 | ] 1486 | 1487 | [[package]] 1488 | name = "rodio" 1489 | version = "0.20.1" 1490 | source = "registry+https://github.com/rust-lang/crates.io-index" 1491 | checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" 1492 | dependencies = [ 1493 | "claxon", 1494 | "cpal", 1495 | "hound", 1496 | "lewton", 1497 | "minimp3_fixed", 1498 | "symphonia", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "rustc-hash" 1503 | version = "1.1.0" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1506 | 1507 | [[package]] 1508 | name = "rustix" 1509 | version = "0.38.44" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1512 | dependencies = [ 1513 | "bitflags 2.9.0", 1514 | "errno", 1515 | "libc", 1516 | "linux-raw-sys 0.4.15", 1517 | "windows-sys 0.59.0", 1518 | ] 1519 | 1520 | [[package]] 1521 | name = "rustix" 1522 | version = "1.0.7" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 1525 | dependencies = [ 1526 | "bitflags 2.9.0", 1527 | "errno", 1528 | "libc", 1529 | "linux-raw-sys 0.9.4", 1530 | "windows-sys 0.59.0", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "rustversion" 1535 | version = "1.0.20" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1538 | 1539 | [[package]] 1540 | name = "ryu" 1541 | version = "1.0.20" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1544 | 1545 | [[package]] 1546 | name = "same-file" 1547 | version = "1.0.6" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1550 | dependencies = [ 1551 | "winapi-util", 1552 | ] 1553 | 1554 | [[package]] 1555 | name = "scopeguard" 1556 | version = "1.2.0" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1559 | 1560 | [[package]] 1561 | name = "semver" 1562 | version = "1.0.26" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 1565 | 1566 | [[package]] 1567 | name = "serde" 1568 | version = "1.0.219" 1569 | source = "registry+https://github.com/rust-lang/crates.io-index" 1570 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1571 | dependencies = [ 1572 | "serde_derive", 1573 | ] 1574 | 1575 | [[package]] 1576 | name = "serde_derive" 1577 | version = "1.0.219" 1578 | source = "registry+https://github.com/rust-lang/crates.io-index" 1579 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1580 | dependencies = [ 1581 | "proc-macro2", 1582 | "quote", 1583 | "syn", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "serde_json" 1588 | version = "1.0.140" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1591 | dependencies = [ 1592 | "itoa", 1593 | "memchr", 1594 | "ryu", 1595 | "serde", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "shlex" 1600 | version = "1.3.0" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1603 | 1604 | [[package]] 1605 | name = "signal-hook" 1606 | version = "0.3.17" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1609 | dependencies = [ 1610 | "libc", 1611 | "signal-hook-registry", 1612 | ] 1613 | 1614 | [[package]] 1615 | name = "signal-hook-mio" 1616 | version = "0.2.4" 1617 | source = "registry+https://github.com/rust-lang/crates.io-index" 1618 | checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 1619 | dependencies = [ 1620 | "libc", 1621 | "mio", 1622 | "signal-hook", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "signal-hook-registry" 1627 | version = "1.4.5" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1630 | dependencies = [ 1631 | "libc", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "slice-ring-buffer" 1636 | version = "0.3.4" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "84ae312bda09b2368f79f985fdb4df4a0b5cbc75546b511303972d195f8c27d6" 1639 | dependencies = [ 1640 | "libc", 1641 | "mach2", 1642 | "winapi", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "smallvec" 1647 | version = "1.15.0" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1650 | 1651 | [[package]] 1652 | name = "strip-ansi-escapes" 1653 | version = "0.2.1" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | checksum = "2a8f8038e7e7969abb3f1b7c2a811225e9296da208539e0f79c5251d6cac0025" 1656 | dependencies = [ 1657 | "vte", 1658 | ] 1659 | 1660 | [[package]] 1661 | name = "strum" 1662 | version = "0.26.3" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1665 | 1666 | [[package]] 1667 | name = "strum_macros" 1668 | version = "0.26.4" 1669 | source = "registry+https://github.com/rust-lang/crates.io-index" 1670 | checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1671 | dependencies = [ 1672 | "heck", 1673 | "proc-macro2", 1674 | "quote", 1675 | "rustversion", 1676 | "syn", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "supports-color" 1681 | version = "3.0.2" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" 1684 | dependencies = [ 1685 | "is_ci", 1686 | ] 1687 | 1688 | [[package]] 1689 | name = "supports-hyperlinks" 1690 | version = "3.1.0" 1691 | source = "registry+https://github.com/rust-lang/crates.io-index" 1692 | checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" 1693 | 1694 | [[package]] 1695 | name = "supports-unicode" 1696 | version = "3.0.0" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" 1699 | 1700 | [[package]] 1701 | name = "symphonia" 1702 | version = "0.5.4" 1703 | source = "registry+https://github.com/rust-lang/crates.io-index" 1704 | checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" 1705 | dependencies = [ 1706 | "lazy_static", 1707 | "symphonia-bundle-flac", 1708 | "symphonia-bundle-mp3", 1709 | "symphonia-codec-aac", 1710 | "symphonia-codec-adpcm", 1711 | "symphonia-codec-pcm", 1712 | "symphonia-codec-vorbis", 1713 | "symphonia-core", 1714 | "symphonia-format-isomp4", 1715 | "symphonia-format-riff", 1716 | "symphonia-metadata", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "symphonia-bundle-flac" 1721 | version = "0.5.4" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "72e34f34298a7308d4397a6c7fbf5b84c5d491231ce3dd379707ba673ab3bd97" 1724 | dependencies = [ 1725 | "log", 1726 | "symphonia-core", 1727 | "symphonia-metadata", 1728 | "symphonia-utils-xiph", 1729 | ] 1730 | 1731 | [[package]] 1732 | name = "symphonia-bundle-mp3" 1733 | version = "0.5.4" 1734 | source = "registry+https://github.com/rust-lang/crates.io-index" 1735 | checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" 1736 | dependencies = [ 1737 | "lazy_static", 1738 | "log", 1739 | "symphonia-core", 1740 | "symphonia-metadata", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "symphonia-codec-aac" 1745 | version = "0.5.4" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "cdbf25b545ad0d3ee3e891ea643ad115aff4ca92f6aec472086b957a58522f70" 1748 | dependencies = [ 1749 | "lazy_static", 1750 | "log", 1751 | "symphonia-core", 1752 | ] 1753 | 1754 | [[package]] 1755 | name = "symphonia-codec-adpcm" 1756 | version = "0.5.4" 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" 1758 | checksum = "c94e1feac3327cd616e973d5be69ad36b3945f16b06f19c6773fc3ac0b426a0f" 1759 | dependencies = [ 1760 | "log", 1761 | "symphonia-core", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "symphonia-codec-pcm" 1766 | version = "0.5.4" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" 1769 | dependencies = [ 1770 | "log", 1771 | "symphonia-core", 1772 | ] 1773 | 1774 | [[package]] 1775 | name = "symphonia-codec-vorbis" 1776 | version = "0.5.4" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "5a98765fb46a0a6732b007f7e2870c2129b6f78d87db7987e6533c8f164a9f30" 1779 | dependencies = [ 1780 | "log", 1781 | "symphonia-core", 1782 | "symphonia-utils-xiph", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "symphonia-core" 1787 | version = "0.5.4" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" 1790 | dependencies = [ 1791 | "arrayvec", 1792 | "bitflags 1.3.2", 1793 | "bytemuck", 1794 | "lazy_static", 1795 | "log", 1796 | ] 1797 | 1798 | [[package]] 1799 | name = "symphonia-format-isomp4" 1800 | version = "0.5.4" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "abfdf178d697e50ce1e5d9b982ba1b94c47218e03ec35022d9f0e071a16dc844" 1803 | dependencies = [ 1804 | "encoding_rs", 1805 | "log", 1806 | "symphonia-core", 1807 | "symphonia-metadata", 1808 | "symphonia-utils-xiph", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "symphonia-format-riff" 1813 | version = "0.5.4" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" 1816 | dependencies = [ 1817 | "extended", 1818 | "log", 1819 | "symphonia-core", 1820 | "symphonia-metadata", 1821 | ] 1822 | 1823 | [[package]] 1824 | name = "symphonia-metadata" 1825 | version = "0.5.4" 1826 | source = "registry+https://github.com/rust-lang/crates.io-index" 1827 | checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" 1828 | dependencies = [ 1829 | "encoding_rs", 1830 | "lazy_static", 1831 | "log", 1832 | "symphonia-core", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "symphonia-utils-xiph" 1837 | version = "0.5.4" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "484472580fa49991afda5f6550ece662237b00c6f562c7d9638d1b086ed010fe" 1840 | dependencies = [ 1841 | "symphonia-core", 1842 | "symphonia-metadata", 1843 | ] 1844 | 1845 | [[package]] 1846 | name = "syn" 1847 | version = "2.0.101" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 1850 | dependencies = [ 1851 | "proc-macro2", 1852 | "quote", 1853 | "unicode-ident", 1854 | ] 1855 | 1856 | [[package]] 1857 | name = "sys-locale" 1858 | version = "0.3.2" 1859 | source = "registry+https://github.com/rust-lang/crates.io-index" 1860 | checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 1861 | dependencies = [ 1862 | "libc", 1863 | ] 1864 | 1865 | [[package]] 1866 | name = "sysinfo" 1867 | version = "0.33.1" 1868 | source = "registry+https://github.com/rust-lang/crates.io-index" 1869 | checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" 1870 | dependencies = [ 1871 | "core-foundation-sys", 1872 | "libc", 1873 | "memchr", 1874 | "ntapi", 1875 | "rayon", 1876 | "windows 0.57.0", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "terminal_size" 1881 | version = "0.4.2" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" 1884 | dependencies = [ 1885 | "rustix 1.0.7", 1886 | "windows-sys 0.59.0", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "textwrap" 1891 | version = "0.16.2" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" 1894 | dependencies = [ 1895 | "unicode-linebreak", 1896 | "unicode-width 0.2.0", 1897 | ] 1898 | 1899 | [[package]] 1900 | name = "thiserror" 1901 | version = "1.0.69" 1902 | source = "registry+https://github.com/rust-lang/crates.io-index" 1903 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 1904 | dependencies = [ 1905 | "thiserror-impl 1.0.69", 1906 | ] 1907 | 1908 | [[package]] 1909 | name = "thiserror" 1910 | version = "2.0.12" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1913 | dependencies = [ 1914 | "thiserror-impl 2.0.12", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "thiserror-impl" 1919 | version = "1.0.69" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 1922 | dependencies = [ 1923 | "proc-macro2", 1924 | "quote", 1925 | "syn", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "thiserror-impl" 1930 | version = "2.0.12" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1933 | dependencies = [ 1934 | "proc-macro2", 1935 | "quote", 1936 | "syn", 1937 | ] 1938 | 1939 | [[package]] 1940 | name = "tinyvec" 1941 | version = "1.9.0" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 1944 | dependencies = [ 1945 | "tinyvec_macros", 1946 | ] 1947 | 1948 | [[package]] 1949 | name = "tinyvec_macros" 1950 | version = "0.1.1" 1951 | source = "registry+https://github.com/rust-lang/crates.io-index" 1952 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1953 | 1954 | [[package]] 1955 | name = "toml_datetime" 1956 | version = "0.6.9" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" 1959 | 1960 | [[package]] 1961 | name = "toml_edit" 1962 | version = "0.22.26" 1963 | source = "registry+https://github.com/rust-lang/crates.io-index" 1964 | checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" 1965 | dependencies = [ 1966 | "indexmap", 1967 | "toml_datetime", 1968 | "winnow", 1969 | ] 1970 | 1971 | [[package]] 1972 | name = "typeid" 1973 | version = "1.0.3" 1974 | source = "registry+https://github.com/rust-lang/crates.io-index" 1975 | checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 1976 | 1977 | [[package]] 1978 | name = "typetag" 1979 | version = "0.2.20" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "73f22b40dd7bfe8c14230cf9702081366421890435b2d625fa92b4acc4c3de6f" 1982 | dependencies = [ 1983 | "erased-serde", 1984 | "inventory", 1985 | "once_cell", 1986 | "serde", 1987 | "typetag-impl", 1988 | ] 1989 | 1990 | [[package]] 1991 | name = "typetag-impl" 1992 | version = "0.2.20" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" 1995 | dependencies = [ 1996 | "proc-macro2", 1997 | "quote", 1998 | "syn", 1999 | ] 2000 | 2001 | [[package]] 2002 | name = "unicase" 2003 | version = "2.8.1" 2004 | source = "registry+https://github.com/rust-lang/crates.io-index" 2005 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 2006 | 2007 | [[package]] 2008 | name = "unicode-ident" 2009 | version = "1.0.18" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2012 | 2013 | [[package]] 2014 | name = "unicode-linebreak" 2015 | version = "0.1.5" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 2018 | 2019 | [[package]] 2020 | name = "unicode-width" 2021 | version = "0.1.14" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 2024 | 2025 | [[package]] 2026 | name = "unicode-width" 2027 | version = "0.2.0" 2028 | source = "registry+https://github.com/rust-lang/crates.io-index" 2029 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 2030 | 2031 | [[package]] 2032 | name = "vte" 2033 | version = "0.14.1" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "231fdcd7ef3037e8330d8e17e61011a2c244126acc0a982f4040ac3f9f0bc077" 2036 | dependencies = [ 2037 | "memchr", 2038 | ] 2039 | 2040 | [[package]] 2041 | name = "walkdir" 2042 | version = "2.5.0" 2043 | source = "registry+https://github.com/rust-lang/crates.io-index" 2044 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2045 | dependencies = [ 2046 | "same-file", 2047 | "winapi-util", 2048 | ] 2049 | 2050 | [[package]] 2051 | name = "wasi" 2052 | version = "0.11.0+wasi-snapshot-preview1" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2055 | 2056 | [[package]] 2057 | name = "wasi" 2058 | version = "0.14.2+wasi-0.2.4" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 2061 | dependencies = [ 2062 | "wit-bindgen-rt", 2063 | ] 2064 | 2065 | [[package]] 2066 | name = "wasm-bindgen" 2067 | version = "0.2.100" 2068 | source = "registry+https://github.com/rust-lang/crates.io-index" 2069 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 2070 | dependencies = [ 2071 | "cfg-if", 2072 | "once_cell", 2073 | "rustversion", 2074 | "wasm-bindgen-macro", 2075 | ] 2076 | 2077 | [[package]] 2078 | name = "wasm-bindgen-backend" 2079 | version = "0.2.100" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 2082 | dependencies = [ 2083 | "bumpalo", 2084 | "log", 2085 | "proc-macro2", 2086 | "quote", 2087 | "syn", 2088 | "wasm-bindgen-shared", 2089 | ] 2090 | 2091 | [[package]] 2092 | name = "wasm-bindgen-futures" 2093 | version = "0.4.50" 2094 | source = "registry+https://github.com/rust-lang/crates.io-index" 2095 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 2096 | dependencies = [ 2097 | "cfg-if", 2098 | "js-sys", 2099 | "once_cell", 2100 | "wasm-bindgen", 2101 | "web-sys", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "wasm-bindgen-macro" 2106 | version = "0.2.100" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 2109 | dependencies = [ 2110 | "quote", 2111 | "wasm-bindgen-macro-support", 2112 | ] 2113 | 2114 | [[package]] 2115 | name = "wasm-bindgen-macro-support" 2116 | version = "0.2.100" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 2119 | dependencies = [ 2120 | "proc-macro2", 2121 | "quote", 2122 | "syn", 2123 | "wasm-bindgen-backend", 2124 | "wasm-bindgen-shared", 2125 | ] 2126 | 2127 | [[package]] 2128 | name = "wasm-bindgen-shared" 2129 | version = "0.2.100" 2130 | source = "registry+https://github.com/rust-lang/crates.io-index" 2131 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 2132 | dependencies = [ 2133 | "unicode-ident", 2134 | ] 2135 | 2136 | [[package]] 2137 | name = "web-sys" 2138 | version = "0.3.77" 2139 | source = "registry+https://github.com/rust-lang/crates.io-index" 2140 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 2141 | dependencies = [ 2142 | "js-sys", 2143 | "wasm-bindgen", 2144 | ] 2145 | 2146 | [[package]] 2147 | name = "web-time" 2148 | version = "1.1.0" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2151 | dependencies = [ 2152 | "js-sys", 2153 | "wasm-bindgen", 2154 | ] 2155 | 2156 | [[package]] 2157 | name = "widestring" 2158 | version = "1.2.0" 2159 | source = "registry+https://github.com/rust-lang/crates.io-index" 2160 | checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" 2161 | 2162 | [[package]] 2163 | name = "winapi" 2164 | version = "0.3.9" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2167 | dependencies = [ 2168 | "winapi-i686-pc-windows-gnu", 2169 | "winapi-x86_64-pc-windows-gnu", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "winapi-i686-pc-windows-gnu" 2174 | version = "0.4.0" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2177 | 2178 | [[package]] 2179 | name = "winapi-util" 2180 | version = "0.1.9" 2181 | source = "registry+https://github.com/rust-lang/crates.io-index" 2182 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2183 | dependencies = [ 2184 | "windows-sys 0.59.0", 2185 | ] 2186 | 2187 | [[package]] 2188 | name = "winapi-x86_64-pc-windows-gnu" 2189 | version = "0.4.0" 2190 | source = "registry+https://github.com/rust-lang/crates.io-index" 2191 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2192 | 2193 | [[package]] 2194 | name = "windows" 2195 | version = "0.54.0" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 2198 | dependencies = [ 2199 | "windows-core 0.54.0", 2200 | "windows-targets 0.52.6", 2201 | ] 2202 | 2203 | [[package]] 2204 | name = "windows" 2205 | version = "0.56.0" 2206 | source = "registry+https://github.com/rust-lang/crates.io-index" 2207 | checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" 2208 | dependencies = [ 2209 | "windows-core 0.56.0", 2210 | "windows-targets 0.52.6", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "windows" 2215 | version = "0.57.0" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 2218 | dependencies = [ 2219 | "windows-core 0.57.0", 2220 | "windows-targets 0.52.6", 2221 | ] 2222 | 2223 | [[package]] 2224 | name = "windows-core" 2225 | version = "0.54.0" 2226 | source = "registry+https://github.com/rust-lang/crates.io-index" 2227 | checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 2228 | dependencies = [ 2229 | "windows-result 0.1.2", 2230 | "windows-targets 0.52.6", 2231 | ] 2232 | 2233 | [[package]] 2234 | name = "windows-core" 2235 | version = "0.56.0" 2236 | source = "registry+https://github.com/rust-lang/crates.io-index" 2237 | checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" 2238 | dependencies = [ 2239 | "windows-implement 0.56.0", 2240 | "windows-interface 0.56.0", 2241 | "windows-result 0.1.2", 2242 | "windows-targets 0.52.6", 2243 | ] 2244 | 2245 | [[package]] 2246 | name = "windows-core" 2247 | version = "0.57.0" 2248 | source = "registry+https://github.com/rust-lang/crates.io-index" 2249 | checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 2250 | dependencies = [ 2251 | "windows-implement 0.57.0", 2252 | "windows-interface 0.57.0", 2253 | "windows-result 0.1.2", 2254 | "windows-targets 0.52.6", 2255 | ] 2256 | 2257 | [[package]] 2258 | name = "windows-core" 2259 | version = "0.61.0" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 2262 | dependencies = [ 2263 | "windows-implement 0.60.0", 2264 | "windows-interface 0.59.1", 2265 | "windows-link", 2266 | "windows-result 0.3.2", 2267 | "windows-strings", 2268 | ] 2269 | 2270 | [[package]] 2271 | name = "windows-implement" 2272 | version = "0.56.0" 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" 2274 | checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" 2275 | dependencies = [ 2276 | "proc-macro2", 2277 | "quote", 2278 | "syn", 2279 | ] 2280 | 2281 | [[package]] 2282 | name = "windows-implement" 2283 | version = "0.57.0" 2284 | source = "registry+https://github.com/rust-lang/crates.io-index" 2285 | checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 2286 | dependencies = [ 2287 | "proc-macro2", 2288 | "quote", 2289 | "syn", 2290 | ] 2291 | 2292 | [[package]] 2293 | name = "windows-implement" 2294 | version = "0.60.0" 2295 | source = "registry+https://github.com/rust-lang/crates.io-index" 2296 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 2297 | dependencies = [ 2298 | "proc-macro2", 2299 | "quote", 2300 | "syn", 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "windows-interface" 2305 | version = "0.56.0" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" 2308 | dependencies = [ 2309 | "proc-macro2", 2310 | "quote", 2311 | "syn", 2312 | ] 2313 | 2314 | [[package]] 2315 | name = "windows-interface" 2316 | version = "0.57.0" 2317 | source = "registry+https://github.com/rust-lang/crates.io-index" 2318 | checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 2319 | dependencies = [ 2320 | "proc-macro2", 2321 | "quote", 2322 | "syn", 2323 | ] 2324 | 2325 | [[package]] 2326 | name = "windows-interface" 2327 | version = "0.59.1" 2328 | source = "registry+https://github.com/rust-lang/crates.io-index" 2329 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 2330 | dependencies = [ 2331 | "proc-macro2", 2332 | "quote", 2333 | "syn", 2334 | ] 2335 | 2336 | [[package]] 2337 | name = "windows-link" 2338 | version = "0.1.1" 2339 | source = "registry+https://github.com/rust-lang/crates.io-index" 2340 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 2341 | 2342 | [[package]] 2343 | name = "windows-result" 2344 | version = "0.1.2" 2345 | source = "registry+https://github.com/rust-lang/crates.io-index" 2346 | checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 2347 | dependencies = [ 2348 | "windows-targets 0.52.6", 2349 | ] 2350 | 2351 | [[package]] 2352 | name = "windows-result" 2353 | version = "0.3.2" 2354 | source = "registry+https://github.com/rust-lang/crates.io-index" 2355 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 2356 | dependencies = [ 2357 | "windows-link", 2358 | ] 2359 | 2360 | [[package]] 2361 | name = "windows-strings" 2362 | version = "0.4.0" 2363 | source = "registry+https://github.com/rust-lang/crates.io-index" 2364 | checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 2365 | dependencies = [ 2366 | "windows-link", 2367 | ] 2368 | 2369 | [[package]] 2370 | name = "windows-sys" 2371 | version = "0.45.0" 2372 | source = "registry+https://github.com/rust-lang/crates.io-index" 2373 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2374 | dependencies = [ 2375 | "windows-targets 0.42.2", 2376 | ] 2377 | 2378 | [[package]] 2379 | name = "windows-sys" 2380 | version = "0.48.0" 2381 | source = "registry+https://github.com/rust-lang/crates.io-index" 2382 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2383 | dependencies = [ 2384 | "windows-targets 0.48.5", 2385 | ] 2386 | 2387 | [[package]] 2388 | name = "windows-sys" 2389 | version = "0.52.0" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2392 | dependencies = [ 2393 | "windows-targets 0.52.6", 2394 | ] 2395 | 2396 | [[package]] 2397 | name = "windows-sys" 2398 | version = "0.59.0" 2399 | source = "registry+https://github.com/rust-lang/crates.io-index" 2400 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2401 | dependencies = [ 2402 | "windows-targets 0.52.6", 2403 | ] 2404 | 2405 | [[package]] 2406 | name = "windows-targets" 2407 | version = "0.42.2" 2408 | source = "registry+https://github.com/rust-lang/crates.io-index" 2409 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 2410 | dependencies = [ 2411 | "windows_aarch64_gnullvm 0.42.2", 2412 | "windows_aarch64_msvc 0.42.2", 2413 | "windows_i686_gnu 0.42.2", 2414 | "windows_i686_msvc 0.42.2", 2415 | "windows_x86_64_gnu 0.42.2", 2416 | "windows_x86_64_gnullvm 0.42.2", 2417 | "windows_x86_64_msvc 0.42.2", 2418 | ] 2419 | 2420 | [[package]] 2421 | name = "windows-targets" 2422 | version = "0.48.5" 2423 | source = "registry+https://github.com/rust-lang/crates.io-index" 2424 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2425 | dependencies = [ 2426 | "windows_aarch64_gnullvm 0.48.5", 2427 | "windows_aarch64_msvc 0.48.5", 2428 | "windows_i686_gnu 0.48.5", 2429 | "windows_i686_msvc 0.48.5", 2430 | "windows_x86_64_gnu 0.48.5", 2431 | "windows_x86_64_gnullvm 0.48.5", 2432 | "windows_x86_64_msvc 0.48.5", 2433 | ] 2434 | 2435 | [[package]] 2436 | name = "windows-targets" 2437 | version = "0.52.6" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2440 | dependencies = [ 2441 | "windows_aarch64_gnullvm 0.52.6", 2442 | "windows_aarch64_msvc 0.52.6", 2443 | "windows_i686_gnu 0.52.6", 2444 | "windows_i686_gnullvm", 2445 | "windows_i686_msvc 0.52.6", 2446 | "windows_x86_64_gnu 0.52.6", 2447 | "windows_x86_64_gnullvm 0.52.6", 2448 | "windows_x86_64_msvc 0.52.6", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "windows_aarch64_gnullvm" 2453 | version = "0.42.2" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2456 | 2457 | [[package]] 2458 | name = "windows_aarch64_gnullvm" 2459 | version = "0.48.5" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2462 | 2463 | [[package]] 2464 | name = "windows_aarch64_gnullvm" 2465 | version = "0.52.6" 2466 | source = "registry+https://github.com/rust-lang/crates.io-index" 2467 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2468 | 2469 | [[package]] 2470 | name = "windows_aarch64_msvc" 2471 | version = "0.42.2" 2472 | source = "registry+https://github.com/rust-lang/crates.io-index" 2473 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2474 | 2475 | [[package]] 2476 | name = "windows_aarch64_msvc" 2477 | version = "0.48.5" 2478 | source = "registry+https://github.com/rust-lang/crates.io-index" 2479 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2480 | 2481 | [[package]] 2482 | name = "windows_aarch64_msvc" 2483 | version = "0.52.6" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2486 | 2487 | [[package]] 2488 | name = "windows_i686_gnu" 2489 | version = "0.42.2" 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" 2491 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 2492 | 2493 | [[package]] 2494 | name = "windows_i686_gnu" 2495 | version = "0.48.5" 2496 | source = "registry+https://github.com/rust-lang/crates.io-index" 2497 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2498 | 2499 | [[package]] 2500 | name = "windows_i686_gnu" 2501 | version = "0.52.6" 2502 | source = "registry+https://github.com/rust-lang/crates.io-index" 2503 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2504 | 2505 | [[package]] 2506 | name = "windows_i686_gnullvm" 2507 | version = "0.52.6" 2508 | source = "registry+https://github.com/rust-lang/crates.io-index" 2509 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2510 | 2511 | [[package]] 2512 | name = "windows_i686_msvc" 2513 | version = "0.42.2" 2514 | source = "registry+https://github.com/rust-lang/crates.io-index" 2515 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 2516 | 2517 | [[package]] 2518 | name = "windows_i686_msvc" 2519 | version = "0.48.5" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2522 | 2523 | [[package]] 2524 | name = "windows_i686_msvc" 2525 | version = "0.52.6" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2528 | 2529 | [[package]] 2530 | name = "windows_x86_64_gnu" 2531 | version = "0.42.2" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 2534 | 2535 | [[package]] 2536 | name = "windows_x86_64_gnu" 2537 | version = "0.48.5" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2540 | 2541 | [[package]] 2542 | name = "windows_x86_64_gnu" 2543 | version = "0.52.6" 2544 | source = "registry+https://github.com/rust-lang/crates.io-index" 2545 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2546 | 2547 | [[package]] 2548 | name = "windows_x86_64_gnullvm" 2549 | version = "0.42.2" 2550 | source = "registry+https://github.com/rust-lang/crates.io-index" 2551 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 2552 | 2553 | [[package]] 2554 | name = "windows_x86_64_gnullvm" 2555 | version = "0.48.5" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2558 | 2559 | [[package]] 2560 | name = "windows_x86_64_gnullvm" 2561 | version = "0.52.6" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2564 | 2565 | [[package]] 2566 | name = "windows_x86_64_msvc" 2567 | version = "0.42.2" 2568 | source = "registry+https://github.com/rust-lang/crates.io-index" 2569 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 2570 | 2571 | [[package]] 2572 | name = "windows_x86_64_msvc" 2573 | version = "0.48.5" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2576 | 2577 | [[package]] 2578 | name = "windows_x86_64_msvc" 2579 | version = "0.52.6" 2580 | source = "registry+https://github.com/rust-lang/crates.io-index" 2581 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2582 | 2583 | [[package]] 2584 | name = "winnow" 2585 | version = "0.7.9" 2586 | source = "registry+https://github.com/rust-lang/crates.io-index" 2587 | checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" 2588 | dependencies = [ 2589 | "memchr", 2590 | ] 2591 | 2592 | [[package]] 2593 | name = "wit-bindgen-rt" 2594 | version = "0.39.0" 2595 | source = "registry+https://github.com/rust-lang/crates.io-index" 2596 | checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2597 | dependencies = [ 2598 | "bitflags 2.9.0", 2599 | ] 2600 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [dependencies] 2 | nu-plugin = "0.104.0" 3 | chrono = "0.4.41" 4 | 5 | [dependencies.id3] 6 | version = "1.16.2" 7 | 8 | [dependencies.lazy_static] 9 | version = "1.4.0" 10 | 11 | [dependencies.mp3-duration] 12 | version = "0.1.10" 13 | 14 | [dependencies.nu-protocol] 15 | features = ["plugin"] 16 | version = "0.104.0" 17 | 18 | [dependencies.rodio] 19 | version = "0.20.1" 20 | 21 | [features] 22 | all-decoders = ["default", "symphonia-all"] 23 | default = ["flac", "vorbis", "wav", "symphonia-mp3"] 24 | flac = ["rodio/flac"] 25 | minimp3 = ["rodio/minimp3"] 26 | symphonia-aac = ["rodio/symphonia-aac"] 27 | symphonia-all = ["rodio/symphonia-all"] 28 | symphonia-flac = ["rodio/symphonia-flac"] 29 | symphonia-isomp4 = ["rodio/symphonia-isomp4"] 30 | symphonia-mp3 = ["rodio/symphonia-mp3"] 31 | symphonia-vorbis = ["rodio/symphonia-vorbis"] 32 | symphonia-wav = ["rodio/symphonia-wav"] 33 | vorbis = ["rodio/vorbis"] 34 | wav = ["rodio/wav"] 35 | 36 | [package] 37 | authors = ["Motalleb Fallahnezhad "] 38 | description = "A nushell plugin to make and play sounds" 39 | edition = "2021" 40 | homepage = "https://github.com/FMotalleb/nu_plugin_audio_hook" 41 | keywords = ["nushell", "audio", "mp3", "player", "plugin"] 42 | license = "MIT" 43 | name = "nu_plugin_audio_hook" 44 | readme = "README.md" 45 | repository = "https://github.com/FMotalleb/nu_plugin_audio_hook" 46 | version = "0.104.0" 47 | 48 | [profile.release] 49 | codegen-units = 1 50 | lto = true 51 | opt-level = "z" 52 | strip = true 53 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2023 "Motalleb Fallahnezhad" 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🎵 nu_plugin_audio_hook 2 | 3 | A [Nushell](https://www.nushell.sh/) plugin for generating and playing sounds. Supports beeping, tone generation, metadata manipulation, and playback for multiple audio formats. 4 | 5 | --- 6 | 7 | ## ✨ Features 8 | 9 | - **`sound beep`** → Play a simple beep sound. 10 | - **`sound make`** → Generate a noise with a given frequency and duration. 11 | - **`sound meta`** → Retrieve metadata (duration, artist, album, etc.) from an audio file. 12 | - **`sound meta set`** → Modify ID3 metadata frames in an audio file. [More about ID3](https://docs.puddletag.net/source/id3.html). 13 | - **`sound play`** → Play an audio file. By default, supports FLAC, WAV, MP3, and OGG. Use the `all-decoders` feature to enable AAC and MP4 playback. 14 | 15 | --- 16 | 17 | ## 📌 Usage 18 | 19 | ### **Generate a simple noise** 20 | 21 | ```bash 22 | sound make 1000 200ms 23 | ``` 24 | 25 | ### **Generate a noise sequence** 26 | 27 | ```bash 28 | [ 300.0, 500.0, 1000.0, 400.0, 600.0 ] | each { |it| sound make $it 150ms } 29 | ``` 30 | 31 | ### **Play an audio file (first 3 seconds only)** 32 | 33 | ```bash 34 | sound play audio.mp3 -d 3sec 35 | ``` 36 | 37 | ### **Retrieve metadata from an audio file** 38 | 39 | ```bash 40 | sound meta audio.mp4 41 | ``` 42 | 43 | Example Output: 44 | 45 | ``` 46 | ╭──────────────┬────────────────────────────╮ 47 | │ duration │ 4min 5sec 551ms 20µs 408ns │ 48 | │ artist │ SINGER │ 49 | │ title │ TITLE │ 50 | │ album │ ALBUM │ 51 | │ album_artist │ SINGER │ 52 | │ track_no │ 1 │ 53 | │ total_tracks │ 1 │ 54 | ╰──────────────┴────────────────────────────╯ 55 | ``` 56 | 57 | ### **Modify ID3 metadata (change the artist tag)** 58 | 59 | ```bash 60 | sound meta set audio.mp3 -k TPE1 -v new-artist 61 | ``` 62 | 63 | ### **Play an MP3 file using its metadata duration** 64 | 65 | ```bash 66 | sound meta audio.mp4 | sound play audio.mp3 -d $in.duration 67 | ``` 68 | 69 | ### **List all available ID3 frame names** 70 | 71 | ```bash 72 | sound meta list 73 | ``` 74 | 75 | --- 76 | 77 | ## 🔧 Installation 78 | 79 | ### 🚀 Recommended: Using [nupm](https://github.com/nushell/nupm) 80 | 81 | ```bash 82 | git clone https://github.com/FMotalleb/nu_plugin_audio_hook.git 83 | nupm install --path nu_plugin_audio_hook -f 84 | ``` 85 | 86 | ### 🛠️ Manual Compilation 87 | 88 | ```bash 89 | git clone https://github.com/FMotalleb/nu_plugin_audio_hook.git 90 | cd nu_plugin_audio_hook 91 | cargo build -r --features=all-decoders 92 | plugin add target/release/nu_plugin_audio_hook 93 | ``` 94 | 95 | ### 📦 Install via Cargo (using git) 96 | 97 | ```bash 98 | cargo install --git https://github.com/FMotalleb/nu_plugin_audio_hook.git --features=all-decoders 99 | plugin add ~/.cargo/bin/nu_plugin_audio_hook 100 | ``` 101 | 102 | ### 📦 Install via Cargo (crates.io) _Not Recommended_ 103 | > 104 | > _Since I live in Iran and crates.io often restricts package updates, the version there might be outdated._ 105 | 106 | ```bash 107 | cargo install nu_plugin_audio_hook --features=all-decoders 108 | plugin add ~/.cargo/bin/nu_plugin_audio_hook 109 | ``` 110 | 111 | --- 112 | 113 | ## 🔍 Supported Features 114 | 115 | You can enable specific features when compiling or installing: 116 | 117 | - **`full`** → Enables all features below. 118 | - **`flac`** (default) → FLAC format support. 119 | - **`vorbis`** (default) → OGG Vorbis support. 120 | - **`wav`** (default) → WAV format support. 121 | - **`minimp3`** → MP3 decoding. 122 | - **`symphonia-all`** → Enables all Symphonia-based decoders: 123 | - `symphonia-aac` → AAC decoding. 124 | - `symphonia-flac` → FLAC decoding. 125 | - `symphonia-isomp4` → MP4 (audio) decoding. 126 | - `symphonia-mp3` (default) → MP3 decoding. 127 | - `symphonia-vorbis` → OGG Vorbis decoding. 128 | - `symphonia-wav` → WAV decoding. 129 | -------------------------------------------------------------------------------- /build.nu: -------------------------------------------------------------------------------- 1 | use std log 2 | let features = [ 3 | flac 4 | minimp3 5 | symphonia-aac 6 | symphonia-flac 7 | symphonia-isomp4 8 | symphonia-mp3 9 | symphonia-vorbis 10 | symphonia-wav 11 | vorbis 12 | wav 13 | ] 14 | def main [package_file: path = nupm.nuon] { 15 | let repo_root = (ls -f $package_file | first | get name | path dirname) 16 | let install_root = $env.NUPM_HOME | path join "plugins" 17 | 18 | let name = open ($repo_root | path join "Cargo.toml") | get package.name 19 | let features = $features | input list --multi "select cargo features" 20 | 21 | 22 | let cmd = $"cargo install --path ($repo_root) --root ($install_root) --features=($features | str join ",")" 23 | log info $"building plugin using: (ansi blue)($cmd)(ansi reset)" 24 | nu -c $cmd 25 | let ext: string = if ($nu.os-info.name == 'windows') { '.exe' } else { '' } 26 | plugin add $"($install_root | path join "bin" $name)($ext)" 27 | log info "do not forget to restart Nushell for the plugin to be fully available!" 28 | } 29 | -------------------------------------------------------------------------------- /nupm.nuon: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nu_plugin_audio_hook", 3 | "version": "0.104.0", 4 | "description": "A nushell plugin to make and play sounds", 5 | "license": "LICENSE", 6 | "type": "custom" 7 | } -------------------------------------------------------------------------------- /src/audio_meta.rs: -------------------------------------------------------------------------------- 1 | use id3::{Tag, TagLike}; 2 | use nu_plugin::{self, EvaluatedCall, SimplePluginCommand}; 3 | use nu_protocol::{record, Category, LabeledError, Record, Signature, Span, SyntaxShape, Value}; 4 | use std::{fs::File, path::PathBuf}; 5 | 6 | use crate::{ 7 | constants::{get_meta_records, ID3_HASHMAP}, 8 | Sound, 9 | }; 10 | pub struct SoundMetaSetCmd; 11 | impl SimplePluginCommand for SoundMetaSetCmd { 12 | type Plugin = Sound; 13 | 14 | fn name(&self) -> &str { 15 | "sound meta set" 16 | } 17 | 18 | fn signature(&self) -> nu_protocol::Signature { 19 | Signature::new("sound meta set") 20 | .required("File Path", SyntaxShape::Filepath, "file to update") 21 | .required_named("key", SyntaxShape::String, "id3 key", Some('k')) 22 | .required_named("value", SyntaxShape::String, "id3 value", Some('v')) 23 | .category(Category::Experimental) 24 | } 25 | 26 | fn description(&self) -> &str { 27 | "set a id3 frame on an audio file" 28 | } 29 | 30 | fn run( 31 | &self, 32 | _plugin: &Self::Plugin, 33 | _engine: &nu_plugin::EngineInterface, 34 | call: &EvaluatedCall, 35 | _input: &Value, 36 | ) -> Result { 37 | audio_meta_set(call) 38 | } 39 | } 40 | 41 | pub struct SoundMetaGetCmd; 42 | impl SimplePluginCommand for SoundMetaGetCmd { 43 | type Plugin = Sound; 44 | 45 | fn name(&self) -> &str { 46 | "sound meta" 47 | } 48 | 49 | fn signature(&self) -> Signature { 50 | Signature::new("sound meta") 51 | .switch("all", "List all possible frame names", Some('a')) 52 | .optional("File Path", SyntaxShape::Filepath, "file to play") 53 | .category(Category::Experimental) 54 | } 55 | 56 | fn description(&self) -> &str { 57 | "get duration and meta data of an audio file" 58 | } 59 | 60 | fn run( 61 | &self, 62 | _plugin: &Self::Plugin, 63 | _engine: &nu_plugin::EngineInterface, 64 | call: &EvaluatedCall, 65 | _input: &Value, 66 | ) -> Result { 67 | if let Ok(true) = call.has_flag("all") { 68 | return Ok(get_meta_records(call.head)); 69 | } 70 | parse_meta(call) 71 | } 72 | } 73 | 74 | fn parse_meta(call: &EvaluatedCall) -> Result { 75 | let (_, file_value) = match load_file(call) { 76 | Ok(value) => value, 77 | Err(value) => return value, 78 | }; 79 | let tags = match Tag::read_from2(file_value) { 80 | Ok(tags) => Some(tags), 81 | Err(_) => None, 82 | }; 83 | let mut other = record! {}; 84 | let (_, file_value) = match load_file(call) { 85 | Ok(value) => value, 86 | Err(value) => return value, 87 | }; 88 | 89 | let duration = match mp3_duration::from_file(&file_value) { 90 | Ok(duration) => duration, 91 | Err(err) => err.at_duration, 92 | }; 93 | other.push( 94 | "duration", 95 | Value::duration(duration.as_nanos().try_into().unwrap(), call.head), 96 | ); 97 | // let info; 98 | match tags { 99 | Some(tags) => { 100 | for (key, val) in ID3_HASHMAP.iter() { 101 | if let Some(result) = tags.get(val) { 102 | insert_into_str( 103 | &mut other, 104 | key, 105 | Some(result.content().to_string()), 106 | call.head, 107 | ) 108 | } 109 | } 110 | // insert_into_str(&mut other, "artist", tags.artist(), call.head); 111 | // insert_into_str(&mut other, "title", tags.title(), call.head); 112 | // insert_into_str(&mut other, "genre", tags.genre(), call.head); 113 | // insert_into_str(&mut other, "album", tags.album(), call.head); 114 | // insert_into_str(&mut other, "album_artist", tags.album_artist(), call.head); 115 | 116 | insert_into_integer(&mut other, "track_no", tags.track(), call.head); 117 | insert_into_integer(&mut other, "total_tracks", tags.total_tracks(), call.head); 118 | insert_into_integer(&mut other, "disc_no", tags.disc(), call.head); 119 | insert_into_integer(&mut other, "total_discs", tags.total_discs(), call.head); 120 | 121 | // //TODO - need conversion 122 | // insert_into_date(&mut other, "date_recorded", tags.date_recorded(), call.head); 123 | // insert_into_date(&mut other, "date_released", tags.date_released(), call.head); 124 | } 125 | None => {} 126 | } 127 | 128 | Ok(Value::record(other, call.head)) 129 | // Ok(Value::nothing(call.head)) 130 | } 131 | 132 | fn audio_meta_set(call: &EvaluatedCall) -> Result { 133 | let (_, file_value) = match load_file(call) { 134 | Ok(value) => value, 135 | Err(value) => return value, 136 | }; 137 | let key = match call.get_flag_value("key") { 138 | Some(Value::String { val, .. }) => val, 139 | _ => { 140 | return Err(LabeledError::new("set key using `-k` flag".to_string()) 141 | .with_label("cannot get value of key", call.head)); 142 | } 143 | }; 144 | let value = match call.get_flag_value("value") { 145 | Some(Value::String { val, .. }) => val, 146 | _ => { 147 | return Err(LabeledError::new("set value using `-v` flag".to_string()) 148 | .with_label("cannot get value of value", call.head)); 149 | } 150 | }; 151 | let tags = match Tag::read_from2(file_value) { 152 | Ok(tags) => Some(tags), 153 | Err(_) => None, 154 | }; 155 | 156 | if let Some(mut tags) = tags { 157 | tags.set_text(key, value); 158 | 159 | let (_, path) = match load_file_path(call) { 160 | Ok(value) => value, 161 | Err(value) => return value, 162 | }; 163 | let tt = tags.write_to_path(path, tags.version()); 164 | if tt.is_err() { 165 | return Err(LabeledError::new(tt.err().unwrap().to_string()) 166 | .with_label("error during writing", call.head)); 167 | } 168 | } 169 | parse_meta(call) 170 | } 171 | fn insert_into_str( 172 | record: &mut Record, 173 | name: impl AsRef, 174 | val: Option>, 175 | span: Span, 176 | ) { 177 | match val { 178 | Some(val) => record.push(name.as_ref(), Value::string(val.as_ref(), span)), 179 | None => {} 180 | } 181 | } 182 | 183 | // fn insert_into_date(record: &mut Record, name: &str, val: Option, span: Span) { 184 | // match val { 185 | // Some(val) => record.push(name, Value::string(val.to_string(), span)), 186 | // None => {} 187 | // } 188 | // } 189 | fn insert_into_integer(record: &mut Record, name: &str, val: Option, span: Span) { 190 | match val { 191 | Some(val) => record.push(name, Value::int(val.into(), span)), 192 | None => {} 193 | } 194 | } 195 | 196 | fn load_file( 197 | call: &EvaluatedCall, 198 | ) -> Result<(nu_protocol::Span, File), Result> { 199 | let (span, path) = match load_file_path(call) { 200 | Ok(value) => value, 201 | Err(value) => return Err(value), 202 | }; 203 | let file_value: File = match File::open(path) { 204 | Ok(file) => file, 205 | Err(err) => { 206 | return Err(Err( 207 | LabeledError::new(err.to_string()).with_label("file value error", span) 208 | )) 209 | } 210 | }; 211 | Ok((span, file_value)) 212 | } 213 | fn load_file_path( 214 | call: &EvaluatedCall, 215 | ) -> Result<(nu_protocol::Span, PathBuf), Result> { 216 | let file: Value = match call.req(0) { 217 | Ok(value) => value, 218 | Err(err) => { 219 | return Err(Err(LabeledError::new(err.to_string()) 220 | .with_label("Frequency value not found", call.head))) 221 | } 222 | }; 223 | let file_span = file.span(); 224 | let mut loader = File::options(); 225 | loader.write(true); 226 | let path_value: PathBuf = match file { 227 | Value::String { val, .. } => PathBuf::from(val), 228 | _ => return Err(Err(LabeledError::new("cannot get file path".to_string()))), 229 | }; 230 | Ok((file_span, path_value)) 231 | } 232 | -------------------------------------------------------------------------------- /src/audio_player.rs: -------------------------------------------------------------------------------- 1 | use nu_plugin::{self, EvaluatedCall, SimplePluginCommand}; 2 | use nu_protocol::{Category, Example, LabeledError, Signature, SyntaxShape, Value}; 3 | use rodio::{source::Source, Decoder, OutputStream}; 4 | 5 | use std::{fs::File, io::BufReader, time::Duration}; 6 | 7 | use crate::Sound; 8 | 9 | pub struct SoundPlayCmd; 10 | impl SimplePluginCommand for SoundPlayCmd { 11 | type Plugin = Sound; 12 | 13 | fn name(&self) -> &str { 14 | "sound play" 15 | } 16 | 17 | fn signature(&self) -> nu_protocol::Signature { 18 | Signature::new("sound play") 19 | .required("File Path", SyntaxShape::Filepath, "file to play") 20 | .named( 21 | "duration", 22 | SyntaxShape::Duration, 23 | "duration of file (mandatory for non-wave formats like mp3) (default 1 hour)", 24 | Some('d'), 25 | ) 26 | .category(Category::Experimental) 27 | } 28 | fn examples(&self) -> Vec { 29 | vec![ 30 | Example { 31 | description: "play a sound and exits after 5min", 32 | example: "sound play audio.mp4 -d 5min", 33 | result: None, 34 | }, 35 | Example { 36 | description: "play a sound for its duration", 37 | example: "sound meta audio.mp4 | sound play audio.mp3 -d $in.duration", 38 | result: None, 39 | }, 40 | ] 41 | } 42 | fn description(&self) -> &str { 43 | "play an audio file, by default supports flac,Wav,mp3 and ogg files, install plugin with `all-decoders` feature to include aac and mp4(audio)" 44 | } 45 | 46 | fn run( 47 | &self, 48 | _plugin: &Self::Plugin, 49 | _engine: &nu_plugin::EngineInterface, 50 | call: &EvaluatedCall, 51 | _input: &Value, 52 | ) -> Result { 53 | play_audio(call) 54 | } 55 | } 56 | 57 | fn play_audio(call: &EvaluatedCall) -> Result { 58 | let (file_span, file_value) = match load_file(call) { 59 | Ok(value) => value, 60 | Err(value) => return value, 61 | }; 62 | 63 | let (_stream, stream_handle) = match OutputStream::try_default() { 64 | Ok(value) => value, 65 | Err(err) => { 66 | return Err( 67 | LabeledError::new(err.to_string()).with_label("audio stream exception", call.head) 68 | ) 69 | } 70 | }; 71 | let file = BufReader::new(file_value); 72 | 73 | let source = match Decoder::new(file) { 74 | Ok(value) => value, 75 | Err(err) => { 76 | return Err( 77 | LabeledError::new(err.to_string()).with_label("audio decoder exception", file_span) 78 | ) 79 | } 80 | }; 81 | 82 | let duration = source.total_duration(); 83 | 84 | match stream_handle.play_raw(source.convert_samples()) { 85 | Ok(_) => {} 86 | Err(err) => { 87 | return Err( 88 | LabeledError::new(err.to_string()).with_label("audio player exception", file_span) 89 | ) 90 | } 91 | } 92 | 93 | let sleep_duration: Duration = match load_duration_from(call, "duration") { 94 | Some(duration) => duration, 95 | None => match duration { 96 | Some(duration) => duration, 97 | None => Duration::from_secs(3600), 98 | }, 99 | }; 100 | 101 | std::thread::sleep(sleep_duration); 102 | Ok(Value::nothing(call.head)) 103 | } 104 | fn load_duration_from(call: &EvaluatedCall, name: &str) -> Option { 105 | match call.get_flag_value(name) { 106 | Some(Value::Duration { val, .. }) => { 107 | Some(Duration::from_nanos(u64::from_ne_bytes(val.to_ne_bytes()))) 108 | } 109 | _ => None, 110 | } 111 | } 112 | fn load_file( 113 | call: &EvaluatedCall, 114 | ) -> Result<(nu_protocol::Span, File), Result> { 115 | let file: Value = match call.req(0) { 116 | Ok(value) => value, 117 | Err(err) => { 118 | return Err(Err(LabeledError::new(err.to_string()) 119 | .with_label("Frequency value not found", call.head))) 120 | } 121 | }; 122 | let file_span = file.span(); 123 | let file_value: File = match file { 124 | Value::String { val, .. } => match File::open(val) { 125 | Ok(file) => file, 126 | Err(err) => { 127 | return Err(Err(LabeledError::new(err.to_string()) 128 | .with_label("error trying to open the file", file_span))) 129 | } 130 | }, 131 | _ => return Err(Err(LabeledError::new("cannot access file path"))), 132 | }; 133 | Ok((file_span, file_value)) 134 | } 135 | -------------------------------------------------------------------------------- /src/constants.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use lazy_static::lazy_static; 4 | use nu_protocol::{record, Span, Value}; 5 | 6 | lazy_static! { 7 | pub static ref ID3_HASHMAP: HashMap<&'static str, &'static str> = HashMap::from([ 8 | ("album", "TALB"), 9 | ("albumartist", "TPE2"), 10 | ("albumsortorder", "TSOA"), 11 | ("arranger", "TPE4"), 12 | ("artist", "TPE1"), 13 | ("audiodelay", "TDLY"), 14 | ("audiolength", "TLEN"), 15 | ("audiosize", "TSIZ"), 16 | ("author", "TOLY"), 17 | ("bpm", "TBPM"), 18 | ("composer", "TCOM"), 19 | ("conductor", "TPE3"), 20 | ("copyright", "TCOP"), 21 | ("date", "TDAT"), 22 | ("discnumber", "TPOS"), 23 | ("encodedby", "TENC"), 24 | ("encodingsettings", "TSSE"), 25 | ("filename", "TOFN"), 26 | ("fileowner", "TOWN"), 27 | ("filetype", "TFLT"), 28 | ("genre", "TCON"), 29 | ("grouping", "TIT1"), 30 | ("initialkey", "TKEY"), 31 | ("isrc", "TSRC"), 32 | ("itunesalbumsortorder", "TSO2"), 33 | ("itunescompilationflag", "TCMP"), 34 | ("itunescomposersortorder", "TSOC"), 35 | ("language", "TLAN"), 36 | ("lyricist", "TEXT"), 37 | ("mediatype", "TMED"), 38 | ("mood", "TMOO"), 39 | ("organization", "TPUB"), 40 | ("originalalbum", "TOAL"), 41 | ("originalartist", "TOPE"), 42 | ("originalyear", "TORY"), 43 | ("performersortorder", "TSOP"), 44 | ("producednotice", "TPRO"), 45 | ("radioowner", "TRSO"), 46 | ("radiostationname", "TRSN"), 47 | ("recordingdates", "TRDA"), 48 | ("setsubtitle", "TSST"), 49 | ("time", "TIME"), 50 | ("title", "TIT2"), 51 | ("titlesortorder", "TSOT"), 52 | ("track", "TRCK"), 53 | ("version", "TIT3"), 54 | ("year", "TYER"), 55 | ("wwwartist", "WOAR"), 56 | ("wwwcommercialinfo", "WCOM"), 57 | ("wwwcopyright", "WCOP"), 58 | ("wwwfileinfo", "WOAF"), 59 | ("wwwpayment", "WPAY"), 60 | ("wwwpublisher", "WPUB"), 61 | ("wwwradio", "WORS"), 62 | ("wwwsource", "WOAS"), 63 | ("encodingtime", "TDEN"), 64 | ("originalreleasetime", "TDOR"), 65 | ("releasetime", "TDRL"), 66 | ("taggingtime", "TDTG"), 67 | ("year", "TDRC") 68 | ]); 69 | } 70 | pub fn get_meta_records(span: Span) -> Value { 71 | let mut result: Vec = vec![]; 72 | for (key, val) in ID3_HASHMAP.iter() { 73 | result.push(Value::record( 74 | record! { 75 | "normalized"=>Value::string(key.to_string(), span), 76 | "frame_name"=>Value::string(val.to_string(), span), 77 | }, 78 | span, 79 | )); 80 | } 81 | return Value::list(result, span); 82 | } 83 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod audio_meta; 2 | mod audio_player; 3 | mod constants; 4 | mod sound; 5 | mod sound_make; 6 | pub use sound::Sound; 7 | // pub use sound_make::make_sound; 8 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use nu_plugin_audio_hook::Sound; 2 | 3 | fn main() { 4 | nu_plugin::serve_plugin(&mut Sound {}, nu_plugin::MsgPackSerializer {}) 5 | } 6 | -------------------------------------------------------------------------------- /src/sound.rs: -------------------------------------------------------------------------------- 1 | use nu_plugin::Plugin; 2 | 3 | use crate::{ 4 | audio_meta::{SoundMetaGetCmd, SoundMetaSetCmd}, 5 | audio_player::SoundPlayCmd, 6 | sound_make::{SoundBeepCmd, SoundMakeCmd}, 7 | }; 8 | 9 | // use crate::make_sound; 10 | 11 | #[derive(Default)] 12 | pub struct Sound; 13 | 14 | impl Plugin for Sound { 15 | fn commands(&self) -> Vec>> { 16 | vec![ 17 | Box::new(SoundPlayCmd {}), 18 | Box::new(SoundMakeCmd {}), 19 | Box::new(SoundBeepCmd {}), 20 | Box::new(SoundMetaGetCmd {}), 21 | Box::new(SoundMetaSetCmd {}), 22 | ] 23 | } 24 | 25 | fn version(&self) -> String { 26 | env!("CARGO_PKG_VERSION").into() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/sound_make.rs: -------------------------------------------------------------------------------- 1 | use nu_plugin::{self, EvaluatedCall, SimplePluginCommand}; 2 | use nu_protocol::{Category, Example, LabeledError, Signature, Span, SyntaxShape, Value}; 3 | use rodio::source::{SineWave, Source}; 4 | use rodio::{OutputStream, Sink}; 5 | 6 | use std::time::Duration; 7 | 8 | use crate::Sound; 9 | 10 | pub struct SoundMakeCmd; 11 | 12 | impl SimplePluginCommand for SoundMakeCmd { 13 | type Plugin = Sound; 14 | 15 | fn name(&self) -> &str { 16 | "sound make" 17 | } 18 | 19 | fn signature(&self) -> nu_protocol::Signature { 20 | Signature::new("sound make") 21 | .required("Frequency", SyntaxShape::Float, "Frequency of the noise") 22 | .required("duration", SyntaxShape::Duration, "duration of the noise") 23 | .named( 24 | "amplify", 25 | SyntaxShape::Float, 26 | "amplify the sound by given value", 27 | Some('a'), 28 | ) 29 | .category(Category::Experimental) 30 | } 31 | fn examples(&self) -> Vec { 32 | vec![ 33 | Example { 34 | description: "create a simple noise frequency", 35 | example: "sound make 1000 200ms", 36 | result: None, 37 | }, 38 | Example { 39 | description: "create a simple noise sequence", 40 | example: 41 | "[ 300.0, 500.0, 1000.0, 400.0, 600.0 ] | each { |it| sound make $it 150ms }", 42 | result: None, 43 | }, 44 | ] 45 | } 46 | fn description(&self) -> &str { 47 | "creates a noise with given frequency and duration" 48 | } 49 | 50 | fn run( 51 | &self, 52 | _plugin: &Self::Plugin, 53 | _engine: &nu_plugin::EngineInterface, 54 | call: &EvaluatedCall, 55 | _input: &Value, 56 | ) -> Result { 57 | make_sound(call) 58 | } 59 | } 60 | 61 | pub struct SoundBeepCmd; 62 | 63 | impl SimplePluginCommand for SoundBeepCmd { 64 | type Plugin = Sound; 65 | 66 | fn name(&self) -> &str { 67 | "sound beep" 68 | } 69 | 70 | fn signature(&self) -> nu_protocol::Signature { 71 | Signature::new("sound beep").category(Category::Experimental) 72 | } 73 | fn examples(&self) -> Vec { 74 | vec![Example { 75 | description: "create a simple beep sound", 76 | example: "sound beep", 77 | result: None, 78 | }] 79 | } 80 | fn description(&self) -> &str { 81 | "creates a beep noise" 82 | } 83 | 84 | fn run( 85 | &self, 86 | _plugin: &Self::Plugin, 87 | _engine: &nu_plugin::EngineInterface, 88 | call: &EvaluatedCall, 89 | _input: &Value, 90 | ) -> Result { 91 | sine_wave(1000.0, Duration::from_millis(300), 1.0); 92 | return Ok(Value::nothing(call.head)); 93 | } 94 | } 95 | 96 | fn make_sound(call: &EvaluatedCall) -> Result { 97 | let (frequency_value, duration_value, amplify_value) = match load_values(call) { 98 | Ok(value) => value, 99 | Err(value) => return value, 100 | }; 101 | 102 | sine_wave(frequency_value, duration_value, amplify_value); 103 | Ok(Value::nothing(call.head)) 104 | } 105 | 106 | fn sine_wave(frequency_value: f32, duration_value: Duration, amplify_value: f32) { 107 | let (_stream, stream_handle) = OutputStream::try_default().unwrap(); 108 | let sink = Sink::try_new(&stream_handle).unwrap(); 109 | let source = SineWave::new(frequency_value) 110 | .take_duration(duration_value) 111 | .amplify(amplify_value); 112 | sink.append(source); 113 | sink.sleep_until_end(); 114 | } 115 | 116 | fn load_values(call: &EvaluatedCall) -> Result<(f32, Duration, f32), Result> { 117 | let frequency: Value = match call.req(0) { 118 | Ok(value) => value, 119 | Err(err) => { 120 | return Err(Err(LabeledError::new(err.to_string()) 121 | .with_label("Frequency value not found", call.head))) 122 | } 123 | }; 124 | let frequency_value: f32 = match frequency.as_float() { 125 | Ok(value) => value as f32, 126 | Err(err) => { 127 | return Err(Err(LabeledError::new(err.to_string()).with_label( 128 | "Frequency value must be of type Float (f32)", 129 | frequency.span(), 130 | ))) 131 | } 132 | }; 133 | let duration: Value = match call.req(1) { 134 | Ok(value) => value, 135 | Err(err) => { 136 | return Err(Err(LabeledError::new(err.to_string()) 137 | .with_label("Duration value not found", call.head))) 138 | } 139 | }; 140 | let duration_value = match duration { 141 | Value::Duration { val, .. } => Duration::from_nanos(val.try_into().unwrap_or(0)), 142 | _ => { 143 | return Err(Err(LabeledError::new( 144 | "cannot parse duration value as Duration", 145 | ))) 146 | } 147 | }; 148 | 149 | let amplify: Value = match call.get_flag("amplify") { 150 | Ok(value) => match value { 151 | Some(value) => value, 152 | None => Value::float(1.0, Span::unknown()), 153 | }, 154 | Err(err) => { 155 | return Err(Err(LabeledError::new(err.to_string()) 156 | .with_label("Duration value not found", call.head))) 157 | } 158 | }; 159 | let amplify_value: f32 = match amplify.as_float() { 160 | Ok(value) => value as f32, 161 | Err(err) => { 162 | return Err(Err(LabeledError::new(err.to_string()).with_label( 163 | "Amplify value must be of type Float (f32)", 164 | amplify.span(), 165 | ))) 166 | } 167 | }; 168 | Ok((frequency_value, duration_value, amplify_value)) 169 | } 170 | --------------------------------------------------------------------------------