├── .github └── workflows │ └── rust.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── assets ├── ducksong-test.mp3 ├── ducksong.mp3 └── ducksong.mp4 └── src ├── main.rs └── parser └── mod.rs /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Install ffmpeg 20 | run: sudo apt install ffmpeg 21 | - name: Build 22 | run: cargo build --verbose 23 | - name: Run tests 24 | run: cargo test --verbose 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.19.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.0.2" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anstream" 31 | version = "0.3.0" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "9e579a7752471abc2a8268df8b20005e3eadd975f585398f17efcfd8d4927371" 34 | dependencies = [ 35 | "anstyle", 36 | "anstyle-parse", 37 | "anstyle-query", 38 | "anstyle-wincon", 39 | "colorchoice", 40 | "is-terminal", 41 | "utf8parse", 42 | ] 43 | 44 | [[package]] 45 | name = "anstyle" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" 49 | 50 | [[package]] 51 | name = "anstyle-parse" 52 | version = "0.2.0" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" 55 | dependencies = [ 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-query" 61 | version = "1.0.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" 64 | dependencies = [ 65 | "windows-sys 0.48.0", 66 | ] 67 | 68 | [[package]] 69 | name = "anstyle-wincon" 70 | version = "1.0.0" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "4bcd8291a340dd8ac70e18878bc4501dd7b4ff970cfa21c207d36ece51ea88fd" 73 | dependencies = [ 74 | "anstyle", 75 | "windows-sys 0.48.0", 76 | ] 77 | 78 | [[package]] 79 | name = "autocfg" 80 | version = "1.1.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 83 | 84 | [[package]] 85 | name = "backtrace" 86 | version = "0.3.67" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" 89 | dependencies = [ 90 | "addr2line", 91 | "cc", 92 | "cfg-if", 93 | "libc", 94 | "miniz_oxide", 95 | "object", 96 | "rustc-demangle", 97 | ] 98 | 99 | [[package]] 100 | name = "base64" 101 | version = "0.21.0" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 104 | 105 | [[package]] 106 | name = "bitflags" 107 | version = "1.3.2" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 110 | 111 | [[package]] 112 | name = "bumpalo" 113 | version = "3.12.0" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 116 | 117 | [[package]] 118 | name = "bytes" 119 | version = "1.4.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 122 | 123 | [[package]] 124 | name = "cc" 125 | version = "1.0.79" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 128 | 129 | [[package]] 130 | name = "cfg-if" 131 | version = "1.0.0" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 134 | 135 | [[package]] 136 | name = "clap" 137 | version = "4.3.17" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "5b0827b011f6f8ab38590295339817b0d26f344aa4932c3ced71b45b0c54b4a9" 140 | dependencies = [ 141 | "clap_builder", 142 | "clap_derive", 143 | "once_cell", 144 | ] 145 | 146 | [[package]] 147 | name = "clap_builder" 148 | version = "4.3.17" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "9441b403be87be858db6a23edb493e7f694761acdc3343d5a0fcaafd304cbc9e" 151 | dependencies = [ 152 | "anstream", 153 | "anstyle", 154 | "clap_lex", 155 | "strsim", 156 | ] 157 | 158 | [[package]] 159 | name = "clap_derive" 160 | version = "4.3.12" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" 163 | dependencies = [ 164 | "heck", 165 | "proc-macro2", 166 | "quote", 167 | "syn 2.0.15", 168 | ] 169 | 170 | [[package]] 171 | name = "clap_lex" 172 | version = "0.5.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" 175 | 176 | [[package]] 177 | name = "colorchoice" 178 | version = "1.0.0" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" 181 | 182 | [[package]] 183 | name = "core-foundation" 184 | version = "0.9.3" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 187 | dependencies = [ 188 | "core-foundation-sys", 189 | "libc", 190 | ] 191 | 192 | [[package]] 193 | name = "core-foundation-sys" 194 | version = "0.8.4" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 197 | 198 | [[package]] 199 | name = "encoding_rs" 200 | version = "0.8.32" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 203 | dependencies = [ 204 | "cfg-if", 205 | ] 206 | 207 | [[package]] 208 | name = "env_logger" 209 | version = "0.10.0" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" 212 | dependencies = [ 213 | "humantime", 214 | "is-terminal", 215 | "log", 216 | "regex", 217 | "termcolor", 218 | ] 219 | 220 | [[package]] 221 | name = "errno" 222 | version = "0.3.1" 223 | source = "registry+https://github.com/rust-lang/crates.io-index" 224 | checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" 225 | dependencies = [ 226 | "errno-dragonfly", 227 | "libc", 228 | "windows-sys 0.48.0", 229 | ] 230 | 231 | [[package]] 232 | name = "errno-dragonfly" 233 | version = "0.1.2" 234 | source = "registry+https://github.com/rust-lang/crates.io-index" 235 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 236 | dependencies = [ 237 | "cc", 238 | "libc", 239 | ] 240 | 241 | [[package]] 242 | name = "error-chain" 243 | version = "0.12.4" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" 246 | dependencies = [ 247 | "backtrace", 248 | "version_check", 249 | ] 250 | 251 | [[package]] 252 | name = "fastrand" 253 | version = "1.9.0" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" 256 | dependencies = [ 257 | "instant", 258 | ] 259 | 260 | [[package]] 261 | name = "fnv" 262 | version = "1.0.7" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 265 | 266 | [[package]] 267 | name = "foreign-types" 268 | version = "0.3.2" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 271 | dependencies = [ 272 | "foreign-types-shared", 273 | ] 274 | 275 | [[package]] 276 | name = "foreign-types-shared" 277 | version = "0.1.1" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 280 | 281 | [[package]] 282 | name = "form_urlencoded" 283 | version = "1.1.0" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 286 | dependencies = [ 287 | "percent-encoding", 288 | ] 289 | 290 | [[package]] 291 | name = "futures-channel" 292 | version = "0.3.28" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" 295 | dependencies = [ 296 | "futures-core", 297 | ] 298 | 299 | [[package]] 300 | name = "futures-core" 301 | version = "0.3.28" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" 304 | 305 | [[package]] 306 | name = "futures-io" 307 | version = "0.3.28" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" 310 | 311 | [[package]] 312 | name = "futures-sink" 313 | version = "0.3.28" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" 316 | 317 | [[package]] 318 | name = "futures-task" 319 | version = "0.3.28" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" 322 | 323 | [[package]] 324 | name = "futures-util" 325 | version = "0.3.28" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" 328 | dependencies = [ 329 | "futures-core", 330 | "futures-io", 331 | "futures-task", 332 | "memchr", 333 | "pin-project-lite", 334 | "pin-utils", 335 | "slab", 336 | ] 337 | 338 | [[package]] 339 | name = "gimli" 340 | version = "0.27.2" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" 343 | 344 | [[package]] 345 | name = "h2" 346 | version = "0.3.17" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" 349 | dependencies = [ 350 | "bytes", 351 | "fnv", 352 | "futures-core", 353 | "futures-sink", 354 | "futures-util", 355 | "http", 356 | "indexmap", 357 | "slab", 358 | "tokio", 359 | "tokio-util", 360 | "tracing", 361 | ] 362 | 363 | [[package]] 364 | name = "hashbrown" 365 | version = "0.12.3" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 368 | 369 | [[package]] 370 | name = "heck" 371 | version = "0.4.1" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 374 | 375 | [[package]] 376 | name = "hermit-abi" 377 | version = "0.2.6" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 380 | dependencies = [ 381 | "libc", 382 | ] 383 | 384 | [[package]] 385 | name = "hermit-abi" 386 | version = "0.3.1" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" 389 | 390 | [[package]] 391 | name = "http" 392 | version = "0.2.9" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" 395 | dependencies = [ 396 | "bytes", 397 | "fnv", 398 | "itoa", 399 | ] 400 | 401 | [[package]] 402 | name = "http-body" 403 | version = "0.4.5" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 406 | dependencies = [ 407 | "bytes", 408 | "http", 409 | "pin-project-lite", 410 | ] 411 | 412 | [[package]] 413 | name = "httparse" 414 | version = "1.8.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 417 | 418 | [[package]] 419 | name = "httpdate" 420 | version = "1.0.2" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 423 | 424 | [[package]] 425 | name = "humantime" 426 | version = "2.1.0" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 429 | 430 | [[package]] 431 | name = "hyper" 432 | version = "0.14.26" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" 435 | dependencies = [ 436 | "bytes", 437 | "futures-channel", 438 | "futures-core", 439 | "futures-util", 440 | "h2", 441 | "http", 442 | "http-body", 443 | "httparse", 444 | "httpdate", 445 | "itoa", 446 | "pin-project-lite", 447 | "socket2", 448 | "tokio", 449 | "tower-service", 450 | "tracing", 451 | "want", 452 | ] 453 | 454 | [[package]] 455 | name = "hyper-tls" 456 | version = "0.5.0" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 459 | dependencies = [ 460 | "bytes", 461 | "hyper", 462 | "native-tls", 463 | "tokio", 464 | "tokio-native-tls", 465 | ] 466 | 467 | [[package]] 468 | name = "idna" 469 | version = "0.3.0" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 472 | dependencies = [ 473 | "unicode-bidi", 474 | "unicode-normalization", 475 | ] 476 | 477 | [[package]] 478 | name = "indexmap" 479 | version = "1.9.3" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 482 | dependencies = [ 483 | "autocfg", 484 | "hashbrown", 485 | ] 486 | 487 | [[package]] 488 | name = "instant" 489 | version = "0.1.12" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 492 | dependencies = [ 493 | "cfg-if", 494 | ] 495 | 496 | [[package]] 497 | name = "io-lifetimes" 498 | version = "1.0.10" 499 | source = "registry+https://github.com/rust-lang/crates.io-index" 500 | checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" 501 | dependencies = [ 502 | "hermit-abi 0.3.1", 503 | "libc", 504 | "windows-sys 0.48.0", 505 | ] 506 | 507 | [[package]] 508 | name = "ipnet" 509 | version = "2.7.2" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" 512 | 513 | [[package]] 514 | name = "is-terminal" 515 | version = "0.4.7" 516 | source = "registry+https://github.com/rust-lang/crates.io-index" 517 | checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" 518 | dependencies = [ 519 | "hermit-abi 0.3.1", 520 | "io-lifetimes", 521 | "rustix", 522 | "windows-sys 0.48.0", 523 | ] 524 | 525 | [[package]] 526 | name = "itoa" 527 | version = "1.0.6" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" 530 | 531 | [[package]] 532 | name = "js-sys" 533 | version = "0.3.61" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 536 | dependencies = [ 537 | "wasm-bindgen", 538 | ] 539 | 540 | [[package]] 541 | name = "json" 542 | version = "0.12.4" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" 545 | 546 | [[package]] 547 | name = "lazy_static" 548 | version = "1.4.0" 549 | source = "registry+https://github.com/rust-lang/crates.io-index" 550 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 551 | 552 | [[package]] 553 | name = "libc" 554 | version = "0.2.147" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" 557 | 558 | [[package]] 559 | name = "linux-raw-sys" 560 | version = "0.3.1" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" 563 | 564 | [[package]] 565 | name = "log" 566 | version = "0.4.19" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" 569 | 570 | [[package]] 571 | name = "memchr" 572 | version = "2.5.0" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 575 | 576 | [[package]] 577 | name = "mime" 578 | version = "0.3.17" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 581 | 582 | [[package]] 583 | name = "miniz_oxide" 584 | version = "0.6.2" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" 587 | dependencies = [ 588 | "adler", 589 | ] 590 | 591 | [[package]] 592 | name = "mio" 593 | version = "0.8.6" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" 596 | dependencies = [ 597 | "libc", 598 | "log", 599 | "wasi", 600 | "windows-sys 0.45.0", 601 | ] 602 | 603 | [[package]] 604 | name = "native-tls" 605 | version = "0.2.11" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 608 | dependencies = [ 609 | "lazy_static", 610 | "libc", 611 | "log", 612 | "openssl", 613 | "openssl-probe", 614 | "openssl-sys", 615 | "schannel", 616 | "security-framework", 617 | "security-framework-sys", 618 | "tempfile", 619 | ] 620 | 621 | [[package]] 622 | name = "num_cpus" 623 | version = "1.15.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 626 | dependencies = [ 627 | "hermit-abi 0.2.6", 628 | "libc", 629 | ] 630 | 631 | [[package]] 632 | name = "object" 633 | version = "0.30.3" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" 636 | dependencies = [ 637 | "memchr", 638 | ] 639 | 640 | [[package]] 641 | name = "once_cell" 642 | version = "1.17.1" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" 645 | 646 | [[package]] 647 | name = "openssl" 648 | version = "0.10.55" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" 651 | dependencies = [ 652 | "bitflags", 653 | "cfg-if", 654 | "foreign-types", 655 | "libc", 656 | "once_cell", 657 | "openssl-macros", 658 | "openssl-sys", 659 | ] 660 | 661 | [[package]] 662 | name = "openssl-macros" 663 | version = "0.1.1" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 666 | dependencies = [ 667 | "proc-macro2", 668 | "quote", 669 | "syn 2.0.15", 670 | ] 671 | 672 | [[package]] 673 | name = "openssl-probe" 674 | version = "0.1.5" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 677 | 678 | [[package]] 679 | name = "openssl-sys" 680 | version = "0.9.90" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" 683 | dependencies = [ 684 | "cc", 685 | "libc", 686 | "pkg-config", 687 | "vcpkg", 688 | ] 689 | 690 | [[package]] 691 | name = "percent-encoding" 692 | version = "2.2.0" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 695 | 696 | [[package]] 697 | name = "pin-project-lite" 698 | version = "0.2.9" 699 | source = "registry+https://github.com/rust-lang/crates.io-index" 700 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 701 | 702 | [[package]] 703 | name = "pin-utils" 704 | version = "0.1.0" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 707 | 708 | [[package]] 709 | name = "pkg-config" 710 | version = "0.3.26" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 713 | 714 | [[package]] 715 | name = "proc-macro2" 716 | version = "1.0.56" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" 719 | dependencies = [ 720 | "unicode-ident", 721 | ] 722 | 723 | [[package]] 724 | name = "quote" 725 | version = "1.0.26" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" 728 | dependencies = [ 729 | "proc-macro2", 730 | ] 731 | 732 | [[package]] 733 | name = "redox_syscall" 734 | version = "0.3.5" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 737 | dependencies = [ 738 | "bitflags", 739 | ] 740 | 741 | [[package]] 742 | name = "regex" 743 | version = "1.9.1" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" 746 | dependencies = [ 747 | "aho-corasick", 748 | "memchr", 749 | "regex-automata", 750 | "regex-syntax", 751 | ] 752 | 753 | [[package]] 754 | name = "regex-automata" 755 | version = "0.3.3" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" 758 | dependencies = [ 759 | "aho-corasick", 760 | "memchr", 761 | "regex-syntax", 762 | ] 763 | 764 | [[package]] 765 | name = "regex-syntax" 766 | version = "0.7.4" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" 769 | 770 | [[package]] 771 | name = "reqwest" 772 | version = "0.11.18" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" 775 | dependencies = [ 776 | "base64", 777 | "bytes", 778 | "encoding_rs", 779 | "futures-core", 780 | "futures-util", 781 | "h2", 782 | "http", 783 | "http-body", 784 | "hyper", 785 | "hyper-tls", 786 | "ipnet", 787 | "js-sys", 788 | "log", 789 | "mime", 790 | "native-tls", 791 | "once_cell", 792 | "percent-encoding", 793 | "pin-project-lite", 794 | "serde", 795 | "serde_json", 796 | "serde_urlencoded", 797 | "tokio", 798 | "tokio-native-tls", 799 | "tower-service", 800 | "url", 801 | "wasm-bindgen", 802 | "wasm-bindgen-futures", 803 | "web-sys", 804 | "winreg", 805 | ] 806 | 807 | [[package]] 808 | name = "rustc-demangle" 809 | version = "0.1.22" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "d4a36c42d1873f9a77c53bde094f9664d9891bc604a45b4798fd2c389ed12e5b" 812 | 813 | [[package]] 814 | name = "rustix" 815 | version = "0.37.11" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" 818 | dependencies = [ 819 | "bitflags", 820 | "errno", 821 | "io-lifetimes", 822 | "libc", 823 | "linux-raw-sys", 824 | "windows-sys 0.48.0", 825 | ] 826 | 827 | [[package]] 828 | name = "ryu" 829 | version = "1.0.13" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" 832 | 833 | [[package]] 834 | name = "schannel" 835 | version = "0.1.21" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 838 | dependencies = [ 839 | "windows-sys 0.42.0", 840 | ] 841 | 842 | [[package]] 843 | name = "security-framework" 844 | version = "2.8.2" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" 847 | dependencies = [ 848 | "bitflags", 849 | "core-foundation", 850 | "core-foundation-sys", 851 | "libc", 852 | "security-framework-sys", 853 | ] 854 | 855 | [[package]] 856 | name = "security-framework-sys" 857 | version = "2.8.0" 858 | source = "registry+https://github.com/rust-lang/crates.io-index" 859 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 860 | dependencies = [ 861 | "core-foundation-sys", 862 | "libc", 863 | ] 864 | 865 | [[package]] 866 | name = "serde" 867 | version = "1.0.160" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" 870 | 871 | [[package]] 872 | name = "serde_json" 873 | version = "1.0.96" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" 876 | dependencies = [ 877 | "itoa", 878 | "ryu", 879 | "serde", 880 | ] 881 | 882 | [[package]] 883 | name = "serde_urlencoded" 884 | version = "0.7.1" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 887 | dependencies = [ 888 | "form_urlencoded", 889 | "itoa", 890 | "ryu", 891 | "serde", 892 | ] 893 | 894 | [[package]] 895 | name = "slab" 896 | version = "0.4.8" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" 899 | dependencies = [ 900 | "autocfg", 901 | ] 902 | 903 | [[package]] 904 | name = "socket2" 905 | version = "0.4.9" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" 908 | dependencies = [ 909 | "libc", 910 | "winapi", 911 | ] 912 | 913 | [[package]] 914 | name = "strsim" 915 | version = "0.10.0" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 918 | 919 | [[package]] 920 | name = "syn" 921 | version = "1.0.109" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 924 | dependencies = [ 925 | "proc-macro2", 926 | "quote", 927 | "unicode-ident", 928 | ] 929 | 930 | [[package]] 931 | name = "syn" 932 | version = "2.0.15" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" 935 | dependencies = [ 936 | "proc-macro2", 937 | "quote", 938 | "unicode-ident", 939 | ] 940 | 941 | [[package]] 942 | name = "tempfile" 943 | version = "3.5.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" 946 | dependencies = [ 947 | "cfg-if", 948 | "fastrand", 949 | "redox_syscall", 950 | "rustix", 951 | "windows-sys 0.45.0", 952 | ] 953 | 954 | [[package]] 955 | name = "termcolor" 956 | version = "1.2.0" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 959 | dependencies = [ 960 | "winapi-util", 961 | ] 962 | 963 | [[package]] 964 | name = "tinyvec" 965 | version = "1.6.0" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 968 | dependencies = [ 969 | "tinyvec_macros", 970 | ] 971 | 972 | [[package]] 973 | name = "tinyvec_macros" 974 | version = "0.1.1" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 977 | 978 | [[package]] 979 | name = "tokio" 980 | version = "1.29.1" 981 | source = "registry+https://github.com/rust-lang/crates.io-index" 982 | checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" 983 | dependencies = [ 984 | "autocfg", 985 | "backtrace", 986 | "bytes", 987 | "libc", 988 | "mio", 989 | "num_cpus", 990 | "pin-project-lite", 991 | "socket2", 992 | "tokio-macros", 993 | "windows-sys 0.48.0", 994 | ] 995 | 996 | [[package]] 997 | name = "tokio-macros" 998 | version = "2.1.0" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" 1001 | dependencies = [ 1002 | "proc-macro2", 1003 | "quote", 1004 | "syn 2.0.15", 1005 | ] 1006 | 1007 | [[package]] 1008 | name = "tokio-native-tls" 1009 | version = "0.3.1" 1010 | source = "registry+https://github.com/rust-lang/crates.io-index" 1011 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1012 | dependencies = [ 1013 | "native-tls", 1014 | "tokio", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "tokio-util" 1019 | version = "0.7.7" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" 1022 | dependencies = [ 1023 | "bytes", 1024 | "futures-core", 1025 | "futures-sink", 1026 | "pin-project-lite", 1027 | "tokio", 1028 | "tracing", 1029 | ] 1030 | 1031 | [[package]] 1032 | name = "tower-service" 1033 | version = "0.3.2" 1034 | source = "registry+https://github.com/rust-lang/crates.io-index" 1035 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1036 | 1037 | [[package]] 1038 | name = "tracing" 1039 | version = "0.1.37" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1042 | dependencies = [ 1043 | "cfg-if", 1044 | "pin-project-lite", 1045 | "tracing-core", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "tracing-core" 1050 | version = "0.1.30" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1053 | dependencies = [ 1054 | "once_cell", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "try-lock" 1059 | version = "0.2.4" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 1062 | 1063 | [[package]] 1064 | name = "unicode-bidi" 1065 | version = "0.3.13" 1066 | source = "registry+https://github.com/rust-lang/crates.io-index" 1067 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 1068 | 1069 | [[package]] 1070 | name = "unicode-ident" 1071 | version = "1.0.8" 1072 | source = "registry+https://github.com/rust-lang/crates.io-index" 1073 | checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" 1074 | 1075 | [[package]] 1076 | name = "unicode-normalization" 1077 | version = "0.1.22" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1080 | dependencies = [ 1081 | "tinyvec", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "url" 1086 | version = "2.3.1" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1089 | dependencies = [ 1090 | "form_urlencoded", 1091 | "idna", 1092 | "percent-encoding", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "utf8parse" 1097 | version = "0.2.1" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 1100 | 1101 | [[package]] 1102 | name = "vcpkg" 1103 | version = "0.2.15" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1106 | 1107 | [[package]] 1108 | name = "version_check" 1109 | version = "0.9.4" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1112 | 1113 | [[package]] 1114 | name = "vivace" 1115 | version = "0.1.1" 1116 | dependencies = [ 1117 | "clap", 1118 | "env_logger", 1119 | "error-chain", 1120 | "json", 1121 | "log", 1122 | "regex", 1123 | "reqwest", 1124 | "tokio", 1125 | "ytb-downloader", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "want" 1130 | version = "0.3.0" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1133 | dependencies = [ 1134 | "log", 1135 | "try-lock", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "wasi" 1140 | version = "0.11.0+wasi-snapshot-preview1" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1143 | 1144 | [[package]] 1145 | name = "wasm-bindgen" 1146 | version = "0.2.84" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 1149 | dependencies = [ 1150 | "cfg-if", 1151 | "wasm-bindgen-macro", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "wasm-bindgen-backend" 1156 | version = "0.2.84" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 1159 | dependencies = [ 1160 | "bumpalo", 1161 | "log", 1162 | "once_cell", 1163 | "proc-macro2", 1164 | "quote", 1165 | "syn 1.0.109", 1166 | "wasm-bindgen-shared", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "wasm-bindgen-futures" 1171 | version = "0.4.34" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 1174 | dependencies = [ 1175 | "cfg-if", 1176 | "js-sys", 1177 | "wasm-bindgen", 1178 | "web-sys", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "wasm-bindgen-macro" 1183 | version = "0.2.84" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 1186 | dependencies = [ 1187 | "quote", 1188 | "wasm-bindgen-macro-support", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "wasm-bindgen-macro-support" 1193 | version = "0.2.84" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 1196 | dependencies = [ 1197 | "proc-macro2", 1198 | "quote", 1199 | "syn 1.0.109", 1200 | "wasm-bindgen-backend", 1201 | "wasm-bindgen-shared", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "wasm-bindgen-shared" 1206 | version = "0.2.84" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 1209 | 1210 | [[package]] 1211 | name = "web-sys" 1212 | version = "0.3.61" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 1215 | dependencies = [ 1216 | "js-sys", 1217 | "wasm-bindgen", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "winapi" 1222 | version = "0.3.9" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1225 | dependencies = [ 1226 | "winapi-i686-pc-windows-gnu", 1227 | "winapi-x86_64-pc-windows-gnu", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "winapi-i686-pc-windows-gnu" 1232 | version = "0.4.0" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1235 | 1236 | [[package]] 1237 | name = "winapi-util" 1238 | version = "0.1.5" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1241 | dependencies = [ 1242 | "winapi", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "winapi-x86_64-pc-windows-gnu" 1247 | version = "0.4.0" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1250 | 1251 | [[package]] 1252 | name = "windows-sys" 1253 | version = "0.42.0" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1256 | dependencies = [ 1257 | "windows_aarch64_gnullvm 0.42.2", 1258 | "windows_aarch64_msvc 0.42.2", 1259 | "windows_i686_gnu 0.42.2", 1260 | "windows_i686_msvc 0.42.2", 1261 | "windows_x86_64_gnu 0.42.2", 1262 | "windows_x86_64_gnullvm 0.42.2", 1263 | "windows_x86_64_msvc 0.42.2", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "windows-sys" 1268 | version = "0.45.0" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1271 | dependencies = [ 1272 | "windows-targets 0.42.2", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "windows-sys" 1277 | version = "0.48.0" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 1280 | dependencies = [ 1281 | "windows-targets 0.48.0", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "windows-targets" 1286 | version = "0.42.2" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 1289 | dependencies = [ 1290 | "windows_aarch64_gnullvm 0.42.2", 1291 | "windows_aarch64_msvc 0.42.2", 1292 | "windows_i686_gnu 0.42.2", 1293 | "windows_i686_msvc 0.42.2", 1294 | "windows_x86_64_gnu 0.42.2", 1295 | "windows_x86_64_gnullvm 0.42.2", 1296 | "windows_x86_64_msvc 0.42.2", 1297 | ] 1298 | 1299 | [[package]] 1300 | name = "windows-targets" 1301 | version = "0.48.0" 1302 | source = "registry+https://github.com/rust-lang/crates.io-index" 1303 | checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" 1304 | dependencies = [ 1305 | "windows_aarch64_gnullvm 0.48.0", 1306 | "windows_aarch64_msvc 0.48.0", 1307 | "windows_i686_gnu 0.48.0", 1308 | "windows_i686_msvc 0.48.0", 1309 | "windows_x86_64_gnu 0.48.0", 1310 | "windows_x86_64_gnullvm 0.48.0", 1311 | "windows_x86_64_msvc 0.48.0", 1312 | ] 1313 | 1314 | [[package]] 1315 | name = "windows_aarch64_gnullvm" 1316 | version = "0.42.2" 1317 | source = "registry+https://github.com/rust-lang/crates.io-index" 1318 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 1319 | 1320 | [[package]] 1321 | name = "windows_aarch64_gnullvm" 1322 | version = "0.48.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" 1325 | 1326 | [[package]] 1327 | name = "windows_aarch64_msvc" 1328 | version = "0.42.2" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 1331 | 1332 | [[package]] 1333 | name = "windows_aarch64_msvc" 1334 | version = "0.48.0" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" 1337 | 1338 | [[package]] 1339 | name = "windows_i686_gnu" 1340 | version = "0.42.2" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 1343 | 1344 | [[package]] 1345 | name = "windows_i686_gnu" 1346 | version = "0.48.0" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" 1349 | 1350 | [[package]] 1351 | name = "windows_i686_msvc" 1352 | version = "0.42.2" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 1355 | 1356 | [[package]] 1357 | name = "windows_i686_msvc" 1358 | version = "0.48.0" 1359 | source = "registry+https://github.com/rust-lang/crates.io-index" 1360 | checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" 1361 | 1362 | [[package]] 1363 | name = "windows_x86_64_gnu" 1364 | version = "0.42.2" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 1367 | 1368 | [[package]] 1369 | name = "windows_x86_64_gnu" 1370 | version = "0.48.0" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" 1373 | 1374 | [[package]] 1375 | name = "windows_x86_64_gnullvm" 1376 | version = "0.42.2" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 1379 | 1380 | [[package]] 1381 | name = "windows_x86_64_gnullvm" 1382 | version = "0.48.0" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" 1385 | 1386 | [[package]] 1387 | name = "windows_x86_64_msvc" 1388 | version = "0.42.2" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 1391 | 1392 | [[package]] 1393 | name = "windows_x86_64_msvc" 1394 | version = "0.48.0" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" 1397 | 1398 | [[package]] 1399 | name = "winreg" 1400 | version = "0.10.1" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1403 | dependencies = [ 1404 | "winapi", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "ytb-downloader" 1409 | version = "0.1.0" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "e2abd41d278e71b11703daf1af9d4a6dbca3bdee4840e06578b4eb15ecfdc939" 1412 | dependencies = [ 1413 | "env_logger", 1414 | "error-chain", 1415 | "json", 1416 | "log", 1417 | "regex", 1418 | "reqwest", 1419 | "tokio", 1420 | ] 1421 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "vivace" 3 | version = "0.1.1" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | reqwest = { version = "0.11.18", features = ["blocking"] } 10 | regex = "1.8.4" 11 | tokio = { version = "1.29.1", features = ["macros", "rt-multi-thread"] } 12 | json = "0.12.4" 13 | error-chain = "0.12.4" 14 | ytb-downloader = "0.1.0" 15 | env_logger = "0.10.0" 16 | log = "0.4.19" 17 | clap = { version = "4.3.10", features = ["derive"] } 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Pavlos Smith 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Vivace 3 | 4 | 5 |
6 | Table of Contents 7 |
    8 |
  1. 9 | About The Project 10 |
  2. 11 |
  3. Build From Source
  4. 12 |
  5. Usage
  6. 13 |
  7. Examples
  8. 14 |
  9. Contributing
  10. 15 |
  11. License
  12. 16 |
  13. Contact
  14. 17 |
18 |
19 | 20 | 21 | 22 | 23 | ## About The Project 24 | 25 | Command line tool in Rust to download songs from Youtube to whatever encoding you want 26 | 27 | Note: [ffmpeg](https://ffmpeg.org/) needs to be present on your system 28 | 29 |

(back to top)

30 | 31 | 32 | 33 | ## Build from source 34 | 35 | To build the project from source, run `cargo build --release` within the project directory 36 | 37 |

(back to top)

38 | 39 | 40 | ## Usage 41 | 42 | ``` 43 | vivace [OPTIONS] --url --output-file 44 | 45 | Options: 46 | -u, --url Video URL 47 | -o, --output-file Output file name 48 | -c, --chunk-size Chunk size for partial requests 49 | -h, --help Print help 50 | -V, --version Print version 51 | ``` 52 | 53 |

(back to top)

54 | 55 | 56 | ## Examples 57 | 58 | Download a song to given output file with .mp3 extension 59 | 60 | `vivace --url https://www.youtube.com/watch?v=dQw4w9WgXcQ --output-file my-favourite-song.mp3` 61 | 62 | Download a song to given output file with .wav extension 63 | 64 | `vivace --url https://www.youtube.com/watch?v=dQw4w9WgXcQ --output-file my-favourite-song.wav` 65 | 66 | Download a song to given output file and specify chunk size (in bytes) for the partial requests to the server 67 | 68 | `vivace --url https://www.youtube.com/watch?v=dQw4w9WgXcQ --output-file my-favourite-song.mp3 -c 10240` 69 | 70 |

(back to top)

71 | 72 | 73 | 74 | ## Contributing 75 | 76 | Any contributions you make are **greatly appreciated**. 77 | 78 | If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". 79 | 80 | 1. Fork the Project 81 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 82 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 83 | 4. Push to the Branch (`git push origin feature/AmazingFeature`) 84 | 5. Open a Pull Request 85 | 86 |

(back to top)

87 | 88 | 89 | 90 | 91 | ## License 92 | 93 | Distributed under the MIT License. See `LICENSE.txt` for more information. 94 | 95 |

(back to top)

96 | 97 | 98 | 99 | 100 | ## Contact 101 | 102 | Pavlos Smith - paulsmith4561+at+gmail.com 103 | 104 |

(back to top)

105 | 106 | -------------------------------------------------------------------------------- /assets/ducksong-test.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iByteABit256/Vivace/3699900440333225464c29362088a77eba09be7c/assets/ducksong-test.mp3 -------------------------------------------------------------------------------- /assets/ducksong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iByteABit256/Vivace/3699900440333225464c29362088a77eba09be7c/assets/ducksong.mp3 -------------------------------------------------------------------------------- /assets/ducksong.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iByteABit256/Vivace/3699900440333225464c29362088a77eba09be7c/assets/ducksong.mp4 -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | //! Vivace 2 | //! 3 | //! A command line tool for downloading songs from Youtube 4 | use clap::Parser; 5 | use errors::*; 6 | use log::{info, warn}; 7 | use parser::Args; 8 | use std::fs::remove_file; 9 | use std::process::Command; 10 | use std::{env, process::Output, str::FromStr}; 11 | use ytb_downloader::*; 12 | 13 | mod parser; 14 | 15 | #[macro_use] 16 | extern crate error_chain; 17 | 18 | /// Error types of Vivace 19 | pub mod errors { 20 | use std::io; 21 | 22 | error_chain! { 23 | foreign_links { 24 | Io(io::Error) #[doc = "Error during IO"]; 25 | } 26 | 27 | errors { 28 | UnsupportedOperatingSystemError { 29 | description("I'm sorry, your operating system is unsupported at the moment :("), 30 | display("I'm sorry, your operating system is unsupported at the moment :("), 31 | } 32 | } 33 | } 34 | } 35 | 36 | #[derive(Debug, PartialEq, Eq)] 37 | /// Types of operating systems 38 | pub enum OS { 39 | /// Linux operating systems 40 | LINUX, 41 | /// Windows operating systems 42 | WINDOWS, 43 | } 44 | 45 | impl FromStr for OS { 46 | type Err = ErrorKind; 47 | 48 | fn from_str(s: &str) -> std::result::Result { 49 | match s { 50 | "linux" => Ok(OS::LINUX), 51 | "windows" => Ok(OS::WINDOWS), 52 | _ => Err(ErrorKind::UnsupportedOperatingSystemError), 53 | } 54 | } 55 | } 56 | 57 | #[tokio::main] 58 | async fn main() -> Result<()> { 59 | let args = Args::parse(); 60 | 61 | if env::var("RUST_LOG").is_err() { 62 | env::set_var("RUST_LOG", "info") 63 | } 64 | env_logger::init(); 65 | 66 | if let Err(ref e) = run(args).await { 67 | println!("error: {}", e); 68 | 69 | for e in e.iter().skip(1) { 70 | println!("caused by: {}", e); 71 | } 72 | 73 | // The backtrace is not always generated. Try to run this example 74 | // with `RUST_BACKTRACE=1`. 75 | if let Some(backtrace) = e.backtrace() { 76 | println!("backtrace: {:?}", backtrace); 77 | } 78 | 79 | ::std::process::exit(1); 80 | } 81 | 82 | Ok(()) 83 | } 84 | 85 | async fn run(args: Args) -> Result<()> { 86 | // Url of video 87 | let url = args.url; 88 | 89 | // File to write to 90 | let outfile = args.output_file; 91 | 92 | let outfile_parts = outfile.split_once('.').unwrap(); 93 | let outfile_name = outfile_parts.0; 94 | let outfile_extension = outfile_parts.1; 95 | 96 | // Chunk size for partial download 97 | let chunk_size = args.chunk_size; 98 | 99 | // Gets the first available audio format 100 | let source = get_available_sources(&url) 101 | .await 102 | .chain_err(|| "Could not get any available video formats from Youtube")? 103 | .into_iter() 104 | .find(|s| s.mime_type.contains("audio")) 105 | .chain_err(|| "No audio formats found")?; 106 | info!("Found audio source."); 107 | 108 | // Encoding of audio format 109 | let file_extension = source 110 | .mime_type 111 | .rsplit_once(';') 112 | .chain_err(|| "Error while parsing file extension")? 113 | .0 114 | .split_once('/') 115 | .chain_err(|| "Error while parsing file extension")? 116 | .1; 117 | 118 | // Temp file to write video with original encoding to 119 | let temp_file = format!("{}.{}", outfile_name, file_extension); 120 | download_video(&source, &temp_file, chunk_size) 121 | .await 122 | .chain_err(|| "Could not download video")?; 123 | 124 | // Convert to encoding of output file 125 | info!("Converting audio from {file_extension} type to {outfile_extension}..."); 126 | convert(&temp_file, &outfile).chain_err(|| "Error while converting file")?; 127 | info!("Done."); 128 | 129 | // Remove temp file 130 | match remove_file(&temp_file) { 131 | Ok(()) => info!("Temp file deleted."), 132 | Err(_e) => warn!("Could not delete temp file."), 133 | }; 134 | 135 | Ok(()) 136 | } 137 | 138 | // Converts a file to another file with different encoding 139 | fn convert(file: &str, outfile: &str) -> Result { 140 | match OS::from_str(env::consts::OS)? { 141 | OS::LINUX => Command::new("ffmpeg") 142 | .arg("-i") 143 | .arg(file) 144 | .arg(outfile) 145 | .output() 146 | .chain_err(|| "Error while converting file"), 147 | OS::WINDOWS => Command::new("ffmpeg") 148 | .arg("-i") 149 | .arg(file) 150 | .arg(outfile) 151 | .output() 152 | .chain_err(|| "Error while converting file"), 153 | } 154 | } 155 | 156 | #[cfg(test)] 157 | mod tests { 158 | use super::*; 159 | use std::fs::File; 160 | 161 | #[test] 162 | fn file_is_converted() { 163 | const INPUT_FILE: &str = "assets/ducksong.mp4"; 164 | const OUTPUT_FILE: &str = "assets/ducksong.mp3"; 165 | const TEST_OUTPUT_FILE: &str = "assets/ducksong-test.mp3"; 166 | 167 | let output = convert(INPUT_FILE, OUTPUT_FILE); 168 | 169 | let output_file = File::open(OUTPUT_FILE).unwrap(); 170 | let test_output_file = File::open(TEST_OUTPUT_FILE).unwrap(); 171 | 172 | assert!(output.is_ok()); 173 | assert_eq!(file_length(&test_output_file), file_length(&output_file)); 174 | } 175 | 176 | fn file_length(file: &File) -> u64 { 177 | file.metadata().unwrap().len() 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /src/parser/mod.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | 3 | /// Command line tool to download Youtube videos 4 | #[derive(Parser, Debug)] 5 | #[command(author, version, about, long_about = None)] 6 | pub struct Args { 7 | /// Video URL 8 | #[arg(short, long)] 9 | pub url: String, 10 | 11 | /// Output file name 12 | #[arg(short, long)] 13 | pub output_file: String, 14 | 15 | /// Chunk size for partial requests 16 | #[arg(short, long)] 17 | pub chunk_size: Option, 18 | } 19 | --------------------------------------------------------------------------------