├── .dockerignore ├── .github ├── demo.gif ├── logo.png └── workflows │ ├── build-and-release.yml │ ├── build-binaries-for-release.yml │ ├── create-release.yml │ ├── lint.yml │ └── publish-image.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── Dockerfile ├── LICENSE ├── README.md ├── config.sample.toml └── src ├── lib ├── config.rs └── player.rs └── main.rs /.dockerignore: -------------------------------------------------------------------------------- 1 | /target 2 | Dockerfile 3 | -------------------------------------------------------------------------------- /.github/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codetheweb/aoede/3aec63773051c51aec73bcc833e2ab790b2a5138/.github/demo.gif -------------------------------------------------------------------------------- /.github/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codetheweb/aoede/3aec63773051c51aec73bcc833e2ab790b2a5138/.github/logo.png -------------------------------------------------------------------------------- /.github/workflows/build-and-release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | pull_request: 3 | 4 | name: Build 5 | 6 | jobs: 7 | build: 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest, windows-latest, macos-latest] 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: dtolnay/rust-toolchain@stable 15 | - uses: Swatinem/rust-cache@v1 16 | 17 | - name: Build in debug mode 18 | uses: actions-rs/cargo@v1 19 | with: 20 | command: build 21 | -------------------------------------------------------------------------------- /.github/workflows/build-binaries-for-release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | tags: 4 | - 'v*.*.*' 5 | 6 | name: Build binaries for release 7 | 8 | jobs: 9 | build: 10 | runs-on: ${{ matrix.os }} 11 | strategy: 12 | matrix: 13 | os: [ubuntu-latest, windows-latest, macos-latest] 14 | steps: 15 | - uses: actions/checkout@v2 16 | - uses: dtolnay/rust-toolchain@stable 17 | - uses: Swatinem/rust-cache@v1 18 | - name: Build in release mode 19 | uses: actions-rs/cargo@v1 20 | with: 21 | command: build 22 | args: --release 23 | 24 | - name: Prefix binary name 25 | run: cp target/release/aoede target/release/${{ matrix.os }}-aoede 26 | continue-on-error: true 27 | 28 | - name: Prefix binary name 29 | run: cp target/release/aoede.exe target/release/${{ matrix.os }}-aoede.exe 30 | continue-on-error: true 31 | 32 | - name: Add to release 33 | uses: softprops/action-gh-release@v1 34 | with: 35 | files: target/release/*-aoede!(*.d|*.pdb) 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.PAT }} 38 | -------------------------------------------------------------------------------- /.github/workflows/create-release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - main 5 | 6 | name: Create tag & GitHub release from conventional commits 7 | 8 | jobs: 9 | release: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout repository 13 | uses: actions/checkout@v2 14 | with: 15 | fetch-depth: 0 16 | token: ${{ secrets.PAT }} 17 | 18 | - name: Conventional Changelog Action 19 | id: changelog 20 | uses: TriPSs/conventional-changelog-action@v3 21 | with: 22 | output-file: "false" 23 | skip-ci: "false" 24 | github-token: ${{ secrets.PAT }} 25 | version-file: "Cargo.toml" 26 | version-path: "package.version" 27 | 28 | - name: Create Release 29 | uses: softprops/action-gh-release@v1 30 | if: ${{ steps.changelog.outputs.skipped == 'false' }} 31 | with: 32 | tag_name: ${{ steps.changelog.outputs.tag }} 33 | body: ${{ steps.changelog.outputs.clean_changelog }} 34 | token: ${{ secrets.PAT }} 35 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | on: [push] 2 | 3 | name: Lint 4 | 5 | jobs: 6 | lint: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: dtolnay/rust-toolchain@stable 11 | - uses: Swatinem/rust-cache@v1 12 | - uses: actions-rs/cargo@v1 13 | with: 14 | command: clippy 15 | - uses: actions-rs/cargo@v1 16 | with: 17 | command: fmt 18 | args: --check 19 | -------------------------------------------------------------------------------- /.github/workflows/publish-image.yml: -------------------------------------------------------------------------------- 1 | name: Publish Docker image on tag 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | publish: 10 | strategy: 11 | matrix: 12 | runner-platform: 13 | - ubuntu-latest 14 | - buildjet-4vcpu-ubuntu-2204-arm 15 | include: 16 | - runner-platform: ubuntu-latest 17 | build-arch: linux/amd64 18 | tagged-platform: amd64 19 | - runner-platform: buildjet-4vcpu-ubuntu-2204-arm 20 | build-arch: linux/arm64 21 | tagged-platform: arm64 22 | runs-on: ${{ matrix.runner-platform }} 23 | steps: 24 | - name: Set up Buildx 25 | uses: docker/setup-buildx-action@v1 26 | 27 | - name: Cache Docker layers 28 | uses: actions/cache@v2 29 | with: 30 | path: /tmp/.buildx-cache 31 | key: ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }}-${{ github.sha }} 32 | restore-keys: | 33 | ${{ runner.os }}-buildx-prs-${{ matrix.build-arch }} 34 | 35 | - name: Login to DockerHub 36 | uses: docker/login-action@v1 37 | with: 38 | username: ${{ secrets.DOCKERHUB_USERNAME }} 39 | password: ${{ secrets.DOCKERHUB_TOKEN }} 40 | 41 | - name: Build and push 42 | id: docker_build 43 | uses: docker/build-push-action@v2 44 | with: 45 | push: true 46 | tags: codetheweb/aoede:${{ github.sha }}-${{ matrix.tagged-platform }} 47 | platforms: ${{ matrix.build-arch }} 48 | cache-from: type=local,src=/tmp/.buildx-cache 49 | cache-to: type=local,dest=/tmp/.buildx-cache,mode=min 50 | 51 | combine: 52 | name: Combine platform tags 53 | runs-on: ubuntu-latest 54 | needs: publish 55 | steps: 56 | - uses: actions/checkout@v1 57 | 58 | - name: Set up Buildx 59 | uses: docker/setup-buildx-action@v1 60 | 61 | - name: Login to DockerHub 62 | uses: docker/login-action@v1 63 | with: 64 | username: ${{ secrets.DOCKERHUB_USERNAME }} 65 | password: ${{ secrets.DOCKERHUB_TOKEN }} 66 | 67 | - name: Get tags 68 | id: get-tags 69 | uses: Surgo/docker-smart-tag-action@v1 70 | with: 71 | docker_image: codetheweb/aoede 72 | 73 | - name: Combine tags 74 | run: docker buildx imagetools create $(echo '${{ steps.get-tags.outputs.tag }}' | tr "," "\0" | xargs -0 printf -- '-t %s ') 'codetheweb/aoede:${{ github.sha }}-arm64' 'codetheweb/aoede:${{ github.sha }}-amd64' 75 | 76 | - name: Update Docker Hub description 77 | uses: peter-evans/dockerhub-description@v2.4.3 78 | env: 79 | DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} 80 | DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }} 81 | DOCKERHUB_REPOSITORY: codetheweb/aoede 82 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /cache 3 | config.toml -------------------------------------------------------------------------------- /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.17.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" 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 = "aead" 22 | version = "0.4.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" 25 | dependencies = [ 26 | "generic-array", 27 | "rand_core", 28 | ] 29 | 30 | [[package]] 31 | name = "aes" 32 | version = "0.6.0" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" 35 | dependencies = [ 36 | "aes-soft", 37 | "aesni", 38 | "cipher 0.2.5", 39 | ] 40 | 41 | [[package]] 42 | name = "aes-ctr" 43 | version = "0.6.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "7729c3cde54d67063be556aeac75a81330d802f0259500ca40cb52967f975763" 46 | dependencies = [ 47 | "aes-soft", 48 | "aesni", 49 | "cipher 0.2.5", 50 | "ctr", 51 | ] 52 | 53 | [[package]] 54 | name = "aes-soft" 55 | version = "0.6.4" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" 58 | dependencies = [ 59 | "cipher 0.2.5", 60 | "opaque-debug", 61 | ] 62 | 63 | [[package]] 64 | name = "aesni" 65 | version = "0.10.0" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" 68 | dependencies = [ 69 | "cipher 0.2.5", 70 | "opaque-debug", 71 | ] 72 | 73 | [[package]] 74 | name = "aho-corasick" 75 | version = "0.7.18" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 78 | dependencies = [ 79 | "memchr", 80 | ] 81 | 82 | [[package]] 83 | name = "android_system_properties" 84 | version = "0.1.4" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" 87 | dependencies = [ 88 | "libc", 89 | ] 90 | 91 | [[package]] 92 | name = "ansi_term" 93 | version = "0.12.1" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 96 | dependencies = [ 97 | "winapi", 98 | ] 99 | 100 | [[package]] 101 | name = "aoede" 102 | version = "0.8.0" 103 | dependencies = [ 104 | "byteorder", 105 | "figment", 106 | "librespot", 107 | "rubato", 108 | "serde", 109 | "serenity", 110 | "songbird", 111 | "tokio", 112 | "tracing", 113 | "tracing-futures", 114 | "tracing-subscriber 0.2.25", 115 | ] 116 | 117 | [[package]] 118 | name = "arrayvec" 119 | version = "0.7.2" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 122 | 123 | [[package]] 124 | name = "async-trait" 125 | version = "0.1.57" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "76464446b8bc32758d7e88ee1a804d9914cd9b1cb264c029899680b0be29826f" 128 | dependencies = [ 129 | "proc-macro2", 130 | "quote", 131 | "syn", 132 | ] 133 | 134 | [[package]] 135 | name = "async-tungstenite" 136 | version = "0.17.2" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "a1b71b31561643aa8e7df3effe284fa83ab1a840e52294c5f4bd7bfd8b2becbb" 139 | dependencies = [ 140 | "futures-io", 141 | "futures-util", 142 | "log", 143 | "pin-project-lite", 144 | "tokio", 145 | "tokio-rustls", 146 | "tungstenite", 147 | "webpki-roots", 148 | ] 149 | 150 | [[package]] 151 | name = "atomic" 152 | version = "0.5.1" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "b88d82667eca772c4aa12f0f1348b3ae643424c8876448f3f7bd5787032e234c" 155 | dependencies = [ 156 | "autocfg", 157 | ] 158 | 159 | [[package]] 160 | name = "atty" 161 | version = "0.2.14" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 164 | dependencies = [ 165 | "hermit-abi", 166 | "libc", 167 | "winapi", 168 | ] 169 | 170 | [[package]] 171 | name = "audiopus" 172 | version = "0.3.0-rc.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "ab55eb0e56d7c6de3d59f544e5db122d7725ec33be6a276ee8241f3be6473955" 175 | dependencies = [ 176 | "audiopus_sys", 177 | ] 178 | 179 | [[package]] 180 | name = "audiopus_sys" 181 | version = "0.2.2" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651" 184 | dependencies = [ 185 | "cmake", 186 | "log", 187 | "pkg-config", 188 | ] 189 | 190 | [[package]] 191 | name = "autocfg" 192 | version = "1.1.0" 193 | source = "registry+https://github.com/rust-lang/crates.io-index" 194 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 195 | 196 | [[package]] 197 | name = "backtrace" 198 | version = "0.3.66" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "cab84319d616cfb654d03394f38ab7e6f0919e181b1b57e1fd15e7fb4077d9a7" 201 | dependencies = [ 202 | "addr2line", 203 | "cc", 204 | "cfg-if", 205 | "libc", 206 | "miniz_oxide", 207 | "object", 208 | "rustc-demangle", 209 | ] 210 | 211 | [[package]] 212 | name = "base64" 213 | version = "0.13.0" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 216 | 217 | [[package]] 218 | name = "bitflags" 219 | version = "1.3.2" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 222 | 223 | [[package]] 224 | name = "block-buffer" 225 | version = "0.9.0" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 228 | dependencies = [ 229 | "generic-array", 230 | ] 231 | 232 | [[package]] 233 | name = "block-buffer" 234 | version = "0.10.2" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 237 | dependencies = [ 238 | "generic-array", 239 | ] 240 | 241 | [[package]] 242 | name = "bumpalo" 243 | version = "3.10.0" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 246 | 247 | [[package]] 248 | name = "bytemuck" 249 | version = "1.11.0" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "a5377c8865e74a160d21f29c2d40669f53286db6eab59b88540cbb12ffc8b835" 252 | 253 | [[package]] 254 | name = "byteorder" 255 | version = "1.4.3" 256 | source = "registry+https://github.com/rust-lang/crates.io-index" 257 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 258 | 259 | [[package]] 260 | name = "bytes" 261 | version = "1.2.1" 262 | source = "registry+https://github.com/rust-lang/crates.io-index" 263 | checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" 264 | 265 | [[package]] 266 | name = "cc" 267 | version = "1.0.73" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 270 | 271 | [[package]] 272 | name = "cfg-if" 273 | version = "1.0.0" 274 | source = "registry+https://github.com/rust-lang/crates.io-index" 275 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 276 | 277 | [[package]] 278 | name = "chrono" 279 | version = "0.4.21" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "3f725f340c3854e3cb3ab736dc21f0cca183303acea3b3ffec30f141503ac8eb" 282 | dependencies = [ 283 | "iana-time-zone", 284 | "js-sys", 285 | "num-integer", 286 | "num-traits 0.2.15", 287 | "serde", 288 | "time 0.1.44", 289 | "wasm-bindgen", 290 | "winapi", 291 | ] 292 | 293 | [[package]] 294 | name = "cipher" 295 | version = "0.2.5" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" 298 | dependencies = [ 299 | "generic-array", 300 | ] 301 | 302 | [[package]] 303 | name = "cipher" 304 | version = "0.3.0" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" 307 | dependencies = [ 308 | "generic-array", 309 | ] 310 | 311 | [[package]] 312 | name = "cmake" 313 | version = "0.1.48" 314 | source = "registry+https://github.com/rust-lang/crates.io-index" 315 | checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" 316 | dependencies = [ 317 | "cc", 318 | ] 319 | 320 | [[package]] 321 | name = "command_attr" 322 | version = "0.4.1" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "4d999d4e7731150ee14aee8f619c7a9aa9a4385bca0606c4fa95aa2f36a05d9a" 325 | dependencies = [ 326 | "proc-macro2", 327 | "quote", 328 | "syn", 329 | ] 330 | 331 | [[package]] 332 | name = "core-foundation" 333 | version = "0.9.3" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 336 | dependencies = [ 337 | "core-foundation-sys", 338 | "libc", 339 | ] 340 | 341 | [[package]] 342 | name = "core-foundation-sys" 343 | version = "0.8.3" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 346 | 347 | [[package]] 348 | name = "cpufeatures" 349 | version = "0.2.2" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" 352 | dependencies = [ 353 | "libc", 354 | ] 355 | 356 | [[package]] 357 | name = "crc32fast" 358 | version = "1.3.2" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 361 | dependencies = [ 362 | "cfg-if", 363 | ] 364 | 365 | [[package]] 366 | name = "crossbeam-utils" 367 | version = "0.8.11" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" 370 | dependencies = [ 371 | "cfg-if", 372 | ] 373 | 374 | [[package]] 375 | name = "crypto-common" 376 | version = "0.1.6" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 379 | dependencies = [ 380 | "generic-array", 381 | "typenum", 382 | ] 383 | 384 | [[package]] 385 | name = "crypto-mac" 386 | version = "0.11.1" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" 389 | dependencies = [ 390 | "generic-array", 391 | "subtle", 392 | ] 393 | 394 | [[package]] 395 | name = "ctr" 396 | version = "0.6.0" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" 399 | dependencies = [ 400 | "cipher 0.2.5", 401 | ] 402 | 403 | [[package]] 404 | name = "dashmap" 405 | version = "5.3.4" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "3495912c9c1ccf2e18976439f4443f3fee0fd61f424ff99fde6a66b15ecb448f" 408 | dependencies = [ 409 | "cfg-if", 410 | "hashbrown", 411 | "lock_api", 412 | "parking_lot_core", 413 | "serde", 414 | ] 415 | 416 | [[package]] 417 | name = "derivative" 418 | version = "2.2.0" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 421 | dependencies = [ 422 | "proc-macro2", 423 | "quote", 424 | "syn", 425 | ] 426 | 427 | [[package]] 428 | name = "digest" 429 | version = "0.9.0" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 432 | dependencies = [ 433 | "generic-array", 434 | ] 435 | 436 | [[package]] 437 | name = "digest" 438 | version = "0.10.3" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" 441 | dependencies = [ 442 | "block-buffer 0.10.2", 443 | "crypto-common", 444 | ] 445 | 446 | [[package]] 447 | name = "discortp" 448 | version = "0.4.0" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "fb66017646a48220b5ea30d63ac18bb5952f647f1a41ed755880895125d26972" 451 | dependencies = [ 452 | "pnet_macros", 453 | "pnet_macros_support", 454 | ] 455 | 456 | [[package]] 457 | name = "encoding_rs" 458 | version = "0.8.31" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 461 | dependencies = [ 462 | "cfg-if", 463 | ] 464 | 465 | [[package]] 466 | name = "enum_primitive" 467 | version = "0.1.1" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" 470 | dependencies = [ 471 | "num-traits 0.1.43", 472 | ] 473 | 474 | [[package]] 475 | name = "env_logger" 476 | version = "0.9.0" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" 479 | dependencies = [ 480 | "atty", 481 | "humantime", 482 | "log", 483 | "termcolor", 484 | ] 485 | 486 | [[package]] 487 | name = "fastrand" 488 | version = "1.8.0" 489 | source = "registry+https://github.com/rust-lang/crates.io-index" 490 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 491 | dependencies = [ 492 | "instant", 493 | ] 494 | 495 | [[package]] 496 | name = "figment" 497 | version = "0.10.6" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df" 500 | dependencies = [ 501 | "atomic", 502 | "pear", 503 | "serde", 504 | "toml", 505 | "uncased", 506 | "version_check", 507 | ] 508 | 509 | [[package]] 510 | name = "fixedbitset" 511 | version = "0.4.2" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 514 | 515 | [[package]] 516 | name = "flate2" 517 | version = "1.0.24" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 520 | dependencies = [ 521 | "crc32fast", 522 | "miniz_oxide", 523 | ] 524 | 525 | [[package]] 526 | name = "flume" 527 | version = "0.10.14" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" 530 | dependencies = [ 531 | "futures-core", 532 | "futures-sink", 533 | "nanorand", 534 | "pin-project", 535 | "spin 0.9.4", 536 | ] 537 | 538 | [[package]] 539 | name = "fnv" 540 | version = "1.0.7" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 543 | 544 | [[package]] 545 | name = "form_urlencoded" 546 | version = "1.0.1" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 549 | dependencies = [ 550 | "matches", 551 | "percent-encoding", 552 | ] 553 | 554 | [[package]] 555 | name = "futures" 556 | version = "0.3.21" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" 559 | dependencies = [ 560 | "futures-channel", 561 | "futures-core", 562 | "futures-executor", 563 | "futures-io", 564 | "futures-sink", 565 | "futures-task", 566 | "futures-util", 567 | ] 568 | 569 | [[package]] 570 | name = "futures-channel" 571 | version = "0.3.21" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 574 | dependencies = [ 575 | "futures-core", 576 | "futures-sink", 577 | ] 578 | 579 | [[package]] 580 | name = "futures-core" 581 | version = "0.3.21" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 584 | 585 | [[package]] 586 | name = "futures-executor" 587 | version = "0.3.21" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" 590 | dependencies = [ 591 | "futures-core", 592 | "futures-task", 593 | "futures-util", 594 | ] 595 | 596 | [[package]] 597 | name = "futures-io" 598 | version = "0.3.21" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 601 | 602 | [[package]] 603 | name = "futures-macro" 604 | version = "0.3.21" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" 607 | dependencies = [ 608 | "proc-macro2", 609 | "quote", 610 | "syn", 611 | ] 612 | 613 | [[package]] 614 | name = "futures-sink" 615 | version = "0.3.21" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 618 | 619 | [[package]] 620 | name = "futures-task" 621 | version = "0.3.21" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 624 | 625 | [[package]] 626 | name = "futures-util" 627 | version = "0.3.21" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 630 | dependencies = [ 631 | "futures-channel", 632 | "futures-core", 633 | "futures-io", 634 | "futures-macro", 635 | "futures-sink", 636 | "futures-task", 637 | "memchr", 638 | "pin-project-lite", 639 | "pin-utils", 640 | "slab", 641 | ] 642 | 643 | [[package]] 644 | name = "generator" 645 | version = "0.7.1" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "cc184cace1cea8335047a471cc1da80f18acf8a76f3bab2028d499e328948ec7" 648 | dependencies = [ 649 | "cc", 650 | "libc", 651 | "log", 652 | "rustversion", 653 | "windows", 654 | ] 655 | 656 | [[package]] 657 | name = "generic-array" 658 | version = "0.14.6" 659 | source = "registry+https://github.com/rust-lang/crates.io-index" 660 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 661 | dependencies = [ 662 | "typenum", 663 | "version_check", 664 | ] 665 | 666 | [[package]] 667 | name = "getopts" 668 | version = "0.2.21" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 671 | dependencies = [ 672 | "unicode-width", 673 | ] 674 | 675 | [[package]] 676 | name = "getrandom" 677 | version = "0.2.7" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 680 | dependencies = [ 681 | "cfg-if", 682 | "js-sys", 683 | "libc", 684 | "wasi 0.11.0+wasi-snapshot-preview1", 685 | "wasm-bindgen", 686 | ] 687 | 688 | [[package]] 689 | name = "gimli" 690 | version = "0.26.2" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" 693 | 694 | [[package]] 695 | name = "glob" 696 | version = "0.3.0" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" 699 | 700 | [[package]] 701 | name = "h2" 702 | version = "0.3.13" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 705 | dependencies = [ 706 | "bytes", 707 | "fnv", 708 | "futures-core", 709 | "futures-sink", 710 | "futures-util", 711 | "http", 712 | "indexmap", 713 | "slab", 714 | "tokio", 715 | "tokio-util", 716 | "tracing", 717 | ] 718 | 719 | [[package]] 720 | name = "hashbrown" 721 | version = "0.12.3" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 724 | 725 | [[package]] 726 | name = "headers" 727 | version = "0.3.7" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | checksum = "4cff78e5788be1e0ab65b04d306b2ed5092c815ec97ec70f4ebd5aee158aa55d" 730 | dependencies = [ 731 | "base64", 732 | "bitflags", 733 | "bytes", 734 | "headers-core", 735 | "http", 736 | "httpdate", 737 | "mime", 738 | "sha-1 0.10.0", 739 | ] 740 | 741 | [[package]] 742 | name = "headers-core" 743 | version = "0.2.0" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 746 | dependencies = [ 747 | "http", 748 | ] 749 | 750 | [[package]] 751 | name = "hermit-abi" 752 | version = "0.1.19" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 755 | dependencies = [ 756 | "libc", 757 | ] 758 | 759 | [[package]] 760 | name = "hex" 761 | version = "0.4.3" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 764 | 765 | [[package]] 766 | name = "hmac" 767 | version = "0.11.0" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" 770 | dependencies = [ 771 | "crypto-mac", 772 | "digest 0.9.0", 773 | ] 774 | 775 | [[package]] 776 | name = "hostname" 777 | version = "0.3.1" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 780 | dependencies = [ 781 | "libc", 782 | "match_cfg", 783 | "winapi", 784 | ] 785 | 786 | [[package]] 787 | name = "http" 788 | version = "0.2.8" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 791 | dependencies = [ 792 | "bytes", 793 | "fnv", 794 | "itoa", 795 | ] 796 | 797 | [[package]] 798 | name = "http-body" 799 | version = "0.4.5" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 802 | dependencies = [ 803 | "bytes", 804 | "http", 805 | "pin-project-lite", 806 | ] 807 | 808 | [[package]] 809 | name = "httparse" 810 | version = "1.7.1" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 813 | 814 | [[package]] 815 | name = "httpdate" 816 | version = "1.0.2" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 819 | 820 | [[package]] 821 | name = "humantime" 822 | version = "2.1.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 825 | 826 | [[package]] 827 | name = "hyper" 828 | version = "0.14.20" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 831 | dependencies = [ 832 | "bytes", 833 | "futures-channel", 834 | "futures-core", 835 | "futures-util", 836 | "h2", 837 | "http", 838 | "http-body", 839 | "httparse", 840 | "httpdate", 841 | "itoa", 842 | "pin-project-lite", 843 | "socket2", 844 | "tokio", 845 | "tower-service", 846 | "tracing", 847 | "want", 848 | ] 849 | 850 | [[package]] 851 | name = "hyper-proxy" 852 | version = "0.9.1" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" 855 | dependencies = [ 856 | "bytes", 857 | "futures", 858 | "headers", 859 | "http", 860 | "hyper", 861 | "tokio", 862 | "tower-service", 863 | ] 864 | 865 | [[package]] 866 | name = "hyper-rustls" 867 | version = "0.23.0" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" 870 | dependencies = [ 871 | "http", 872 | "hyper", 873 | "rustls", 874 | "tokio", 875 | "tokio-rustls", 876 | ] 877 | 878 | [[package]] 879 | name = "iana-time-zone" 880 | version = "0.1.42" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "9512e544c25736b82aebbd2bf739a47c8a1c935dfcc3a6adcde10e35cd3cd468" 883 | dependencies = [ 884 | "android_system_properties", 885 | "core-foundation", 886 | "js-sys", 887 | "wasm-bindgen", 888 | "winapi", 889 | ] 890 | 891 | [[package]] 892 | name = "idna" 893 | version = "0.2.3" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 896 | dependencies = [ 897 | "matches", 898 | "unicode-bidi", 899 | "unicode-normalization", 900 | ] 901 | 902 | [[package]] 903 | name = "if-addrs" 904 | version = "0.7.0" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "cbc0fa01ffc752e9dbc72818cdb072cd028b86be5e09dd04c5a643704fe101a9" 907 | dependencies = [ 908 | "libc", 909 | "winapi", 910 | ] 911 | 912 | [[package]] 913 | name = "indexmap" 914 | version = "1.9.1" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 917 | dependencies = [ 918 | "autocfg", 919 | "hashbrown", 920 | ] 921 | 922 | [[package]] 923 | name = "inlinable_string" 924 | version = "0.1.15" 925 | source = "registry+https://github.com/rust-lang/crates.io-index" 926 | checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" 927 | 928 | [[package]] 929 | name = "instant" 930 | version = "0.1.12" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 933 | dependencies = [ 934 | "cfg-if", 935 | ] 936 | 937 | [[package]] 938 | name = "ipnet" 939 | version = "2.5.0" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 942 | 943 | [[package]] 944 | name = "itoa" 945 | version = "1.0.3" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" 948 | 949 | [[package]] 950 | name = "js-sys" 951 | version = "0.3.59" 952 | source = "registry+https://github.com/rust-lang/crates.io-index" 953 | checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" 954 | dependencies = [ 955 | "wasm-bindgen", 956 | ] 957 | 958 | [[package]] 959 | name = "lazy_static" 960 | version = "1.4.0" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 963 | 964 | [[package]] 965 | name = "levenshtein" 966 | version = "1.0.5" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" 969 | 970 | [[package]] 971 | name = "lewton" 972 | version = "0.10.2" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 975 | dependencies = [ 976 | "byteorder", 977 | "ogg", 978 | "tinyvec", 979 | ] 980 | 981 | [[package]] 982 | name = "libc" 983 | version = "0.2.129" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "64de3cc433455c14174d42e554d4027ee631c4d046d43e3ecc6efc4636cdc7a7" 986 | 987 | [[package]] 988 | name = "libm" 989 | version = "0.2.5" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "292a948cd991e376cf75541fe5b97a1081d713c618b4f1b9500f8844e49eb565" 992 | 993 | [[package]] 994 | name = "libmdns" 995 | version = "0.7.0" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "d6fb7fd715150e59e9a74049d2b50e862c3959c139b95eea132a66ddae20c3d9" 998 | dependencies = [ 999 | "byteorder", 1000 | "futures-util", 1001 | "hostname", 1002 | "if-addrs", 1003 | "log", 1004 | "multimap", 1005 | "rand", 1006 | "socket2", 1007 | "thiserror", 1008 | "tokio", 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "librespot" 1013 | version = "0.4.2" 1014 | source = "registry+https://github.com/rust-lang/crates.io-index" 1015 | checksum = "ea4c9952ef48968f8184a4a87f8576982426ebe623342d5a28f7d9c4978e4a44" 1016 | dependencies = [ 1017 | "base64", 1018 | "env_logger", 1019 | "futures-util", 1020 | "getopts", 1021 | "hex", 1022 | "hyper", 1023 | "librespot-audio", 1024 | "librespot-connect", 1025 | "librespot-core", 1026 | "librespot-discovery", 1027 | "librespot-metadata", 1028 | "librespot-playback", 1029 | "librespot-protocol", 1030 | "log", 1031 | "rpassword", 1032 | "sha-1 0.9.8", 1033 | "thiserror", 1034 | "tokio", 1035 | "url", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "librespot-audio" 1040 | version = "0.4.2" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "c176a31355e1ea8e0b9c4ced19df4947bfe4770661c25c142b6fba2365940d9d" 1043 | dependencies = [ 1044 | "aes-ctr", 1045 | "byteorder", 1046 | "bytes", 1047 | "futures-util", 1048 | "librespot-core", 1049 | "log", 1050 | "tempfile", 1051 | "tokio", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "librespot-connect" 1056 | version = "0.4.2" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "4ffafb6a443e9445ccb3d5d591573b5b1da3c89a9b8846c63ba2c3710210d3ec" 1059 | dependencies = [ 1060 | "form_urlencoded", 1061 | "futures-util", 1062 | "librespot-core", 1063 | "librespot-discovery", 1064 | "librespot-playback", 1065 | "librespot-protocol", 1066 | "log", 1067 | "protobuf", 1068 | "rand", 1069 | "serde", 1070 | "serde_json", 1071 | "tokio", 1072 | "tokio-stream", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "librespot-core" 1077 | version = "0.4.2" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "046349f25888e644bf02d9c5de0164b2a493d29aa4ce18e1ad0b756da9b55d6d" 1080 | dependencies = [ 1081 | "aes", 1082 | "base64", 1083 | "byteorder", 1084 | "bytes", 1085 | "form_urlencoded", 1086 | "futures-core", 1087 | "futures-util", 1088 | "hmac", 1089 | "http", 1090 | "httparse", 1091 | "hyper", 1092 | "hyper-proxy", 1093 | "librespot-protocol", 1094 | "log", 1095 | "num-bigint", 1096 | "num-integer", 1097 | "num-traits 0.2.15", 1098 | "once_cell", 1099 | "pbkdf2", 1100 | "priority-queue", 1101 | "protobuf", 1102 | "rand", 1103 | "serde", 1104 | "serde_json", 1105 | "sha-1 0.9.8", 1106 | "shannon", 1107 | "thiserror", 1108 | "tokio", 1109 | "tokio-stream", 1110 | "tokio-util", 1111 | "url", 1112 | "uuid 1.1.2", 1113 | "vergen", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "librespot-discovery" 1118 | version = "0.4.2" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | checksum = "2aa877d18f6150364012cb4be5682d62d7c712c88bae2d0d01720fd7c15e2f06" 1121 | dependencies = [ 1122 | "aes-ctr", 1123 | "base64", 1124 | "form_urlencoded", 1125 | "futures-core", 1126 | "hmac", 1127 | "hyper", 1128 | "libmdns", 1129 | "librespot-core", 1130 | "log", 1131 | "rand", 1132 | "serde_json", 1133 | "sha-1 0.9.8", 1134 | "thiserror", 1135 | "tokio", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "librespot-metadata" 1140 | version = "0.4.2" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "6b80361fcbcb5092056fd47c08c34d5d51b08385d8efb6941c0d3e46d032c21c" 1143 | dependencies = [ 1144 | "async-trait", 1145 | "byteorder", 1146 | "librespot-core", 1147 | "librespot-protocol", 1148 | "log", 1149 | "protobuf", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "librespot-playback" 1154 | version = "0.4.2" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "5190a0b9bcc7f70ee4196a6b4a1c731d405ca130d4a6fcd4c561cfdde8b7cfb7" 1157 | dependencies = [ 1158 | "byteorder", 1159 | "futures-executor", 1160 | "futures-util", 1161 | "lewton", 1162 | "librespot-audio", 1163 | "librespot-core", 1164 | "librespot-metadata", 1165 | "log", 1166 | "ogg", 1167 | "parking_lot", 1168 | "rand", 1169 | "rand_distr", 1170 | "shell-words", 1171 | "thiserror", 1172 | "tokio", 1173 | "zerocopy", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "librespot-protocol" 1178 | version = "0.4.2" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "5d6d3ac6196ac0ea67bbe039f56d6730a5d8b31502ef9bce0f504ed729dcb39f" 1181 | dependencies = [ 1182 | "glob", 1183 | "protobuf", 1184 | "protobuf-codegen-pure", 1185 | ] 1186 | 1187 | [[package]] 1188 | name = "lock_api" 1189 | version = "0.4.7" 1190 | source = "registry+https://github.com/rust-lang/crates.io-index" 1191 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 1192 | dependencies = [ 1193 | "autocfg", 1194 | "scopeguard", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "log" 1199 | version = "0.4.17" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 1202 | dependencies = [ 1203 | "cfg-if", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "loom" 1208 | version = "0.5.6" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" 1211 | dependencies = [ 1212 | "cfg-if", 1213 | "generator", 1214 | "scoped-tls", 1215 | "serde", 1216 | "serde_json", 1217 | "tracing", 1218 | "tracing-subscriber 0.3.15", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "match_cfg" 1223 | version = "0.1.0" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 1226 | 1227 | [[package]] 1228 | name = "matchers" 1229 | version = "0.0.1" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" 1232 | dependencies = [ 1233 | "regex-automata", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "matchers" 1238 | version = "0.1.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 1241 | dependencies = [ 1242 | "regex-automata", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "matches" 1247 | version = "0.1.9" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 1250 | 1251 | [[package]] 1252 | name = "memchr" 1253 | version = "2.5.0" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 1256 | 1257 | [[package]] 1258 | name = "mime" 1259 | version = "0.3.16" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1262 | 1263 | [[package]] 1264 | name = "mime_guess" 1265 | version = "2.0.4" 1266 | source = "registry+https://github.com/rust-lang/crates.io-index" 1267 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 1268 | dependencies = [ 1269 | "mime", 1270 | "unicase", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "miniz_oxide" 1275 | version = "0.5.3" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" 1278 | dependencies = [ 1279 | "adler", 1280 | ] 1281 | 1282 | [[package]] 1283 | name = "mio" 1284 | version = "0.8.4" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 1287 | dependencies = [ 1288 | "libc", 1289 | "log", 1290 | "wasi 0.11.0+wasi-snapshot-preview1", 1291 | "windows-sys", 1292 | ] 1293 | 1294 | [[package]] 1295 | name = "multimap" 1296 | version = "0.8.3" 1297 | source = "registry+https://github.com/rust-lang/crates.io-index" 1298 | checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" 1299 | dependencies = [ 1300 | "serde", 1301 | ] 1302 | 1303 | [[package]] 1304 | name = "nanorand" 1305 | version = "0.7.0" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" 1308 | dependencies = [ 1309 | "getrandom", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "num-bigint" 1314 | version = "0.4.3" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 1317 | dependencies = [ 1318 | "autocfg", 1319 | "num-integer", 1320 | "num-traits 0.2.15", 1321 | "rand", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "num-complex" 1326 | version = "0.4.2" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" 1329 | dependencies = [ 1330 | "num-traits 0.2.15", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "num-integer" 1335 | version = "0.1.45" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 1338 | dependencies = [ 1339 | "autocfg", 1340 | "num-traits 0.2.15", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "num-traits" 1345 | version = "0.1.43" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" 1348 | dependencies = [ 1349 | "num-traits 0.2.15", 1350 | ] 1351 | 1352 | [[package]] 1353 | name = "num-traits" 1354 | version = "0.2.15" 1355 | source = "registry+https://github.com/rust-lang/crates.io-index" 1356 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 1357 | dependencies = [ 1358 | "autocfg", 1359 | "libm", 1360 | ] 1361 | 1362 | [[package]] 1363 | name = "num_cpus" 1364 | version = "1.13.1" 1365 | source = "registry+https://github.com/rust-lang/crates.io-index" 1366 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 1367 | dependencies = [ 1368 | "hermit-abi", 1369 | "libc", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "num_threads" 1374 | version = "0.1.6" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 1377 | dependencies = [ 1378 | "libc", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "object" 1383 | version = "0.29.0" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "21158b2c33aa6d4561f1c0a6ea283ca92bc54802a93b263e910746d679a7eb53" 1386 | dependencies = [ 1387 | "memchr", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "ogg" 1392 | version = "0.8.0" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 1395 | dependencies = [ 1396 | "byteorder", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "once_cell" 1401 | version = "1.13.0" 1402 | source = "registry+https://github.com/rust-lang/crates.io-index" 1403 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 1404 | 1405 | [[package]] 1406 | name = "opaque-debug" 1407 | version = "0.3.0" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1410 | 1411 | [[package]] 1412 | name = "ordered-float" 1413 | version = "2.10.0" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" 1416 | dependencies = [ 1417 | "num-traits 0.2.15", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "parking_lot" 1422 | version = "0.12.1" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 1425 | dependencies = [ 1426 | "lock_api", 1427 | "parking_lot_core", 1428 | ] 1429 | 1430 | [[package]] 1431 | name = "parking_lot_core" 1432 | version = "0.9.3" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" 1435 | dependencies = [ 1436 | "backtrace", 1437 | "cfg-if", 1438 | "libc", 1439 | "petgraph", 1440 | "redox_syscall", 1441 | "smallvec", 1442 | "thread-id", 1443 | "windows-sys", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "pbkdf2" 1448 | version = "0.8.0" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" 1451 | dependencies = [ 1452 | "crypto-mac", 1453 | "hmac", 1454 | ] 1455 | 1456 | [[package]] 1457 | name = "pear" 1458 | version = "0.2.3" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" 1461 | dependencies = [ 1462 | "inlinable_string", 1463 | "pear_codegen", 1464 | "yansi", 1465 | ] 1466 | 1467 | [[package]] 1468 | name = "pear_codegen" 1469 | version = "0.2.3" 1470 | source = "registry+https://github.com/rust-lang/crates.io-index" 1471 | checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" 1472 | dependencies = [ 1473 | "proc-macro2", 1474 | "proc-macro2-diagnostics", 1475 | "quote", 1476 | "syn", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "percent-encoding" 1481 | version = "2.1.0" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1484 | 1485 | [[package]] 1486 | name = "petgraph" 1487 | version = "0.6.2" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143" 1490 | dependencies = [ 1491 | "fixedbitset", 1492 | "indexmap", 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "pin-project" 1497 | version = "1.0.11" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | checksum = "78203e83c48cffbe01e4a2d35d566ca4de445d79a85372fc64e378bfc812a260" 1500 | dependencies = [ 1501 | "pin-project-internal", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "pin-project-internal" 1506 | version = "1.0.11" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "710faf75e1b33345361201d36d04e98ac1ed8909151a017ed384700836104c74" 1509 | dependencies = [ 1510 | "proc-macro2", 1511 | "quote", 1512 | "syn", 1513 | ] 1514 | 1515 | [[package]] 1516 | name = "pin-project-lite" 1517 | version = "0.2.9" 1518 | source = "registry+https://github.com/rust-lang/crates.io-index" 1519 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 1520 | 1521 | [[package]] 1522 | name = "pin-utils" 1523 | version = "0.1.0" 1524 | source = "registry+https://github.com/rust-lang/crates.io-index" 1525 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1526 | 1527 | [[package]] 1528 | name = "pkg-config" 1529 | version = "0.3.25" 1530 | source = "registry+https://github.com/rust-lang/crates.io-index" 1531 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 1532 | 1533 | [[package]] 1534 | name = "pnet_base" 1535 | version = "0.28.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "25488cd551a753dcaaa6fffc9f69a7610a412dd8954425bf7ffad5f7d1156fb8" 1538 | 1539 | [[package]] 1540 | name = "pnet_macros" 1541 | version = "0.28.0" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "30490e0852e58402b8fae0d39897b08a24f493023a4d6cf56b2e30f31ed57548" 1544 | dependencies = [ 1545 | "proc-macro2", 1546 | "quote", 1547 | "regex", 1548 | "syn", 1549 | ] 1550 | 1551 | [[package]] 1552 | name = "pnet_macros_support" 1553 | version = "0.28.0" 1554 | source = "registry+https://github.com/rust-lang/crates.io-index" 1555 | checksum = "d4714e10f30cab023005adce048f2d30dd4ac4f093662abf2220855655ef8f90" 1556 | dependencies = [ 1557 | "pnet_base", 1558 | ] 1559 | 1560 | [[package]] 1561 | name = "poly1305" 1562 | version = "0.7.2" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" 1565 | dependencies = [ 1566 | "cpufeatures", 1567 | "opaque-debug", 1568 | "universal-hash", 1569 | ] 1570 | 1571 | [[package]] 1572 | name = "ppv-lite86" 1573 | version = "0.2.16" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 1576 | 1577 | [[package]] 1578 | name = "primal-check" 1579 | version = "0.3.1" 1580 | source = "registry+https://github.com/rust-lang/crates.io-index" 1581 | checksum = "01419cee72c1a1ca944554e23d83e483e1bccf378753344e881de28b5487511d" 1582 | dependencies = [ 1583 | "num-integer", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "priority-queue" 1588 | version = "1.2.3" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "815082d99af3acc75a3e67efd2a07f72e67b4e81b4344eb8ca34c6ebf3dfa9c5" 1591 | dependencies = [ 1592 | "autocfg", 1593 | "indexmap", 1594 | ] 1595 | 1596 | [[package]] 1597 | name = "proc-macro2" 1598 | version = "1.0.43" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" 1601 | dependencies = [ 1602 | "unicode-ident", 1603 | ] 1604 | 1605 | [[package]] 1606 | name = "proc-macro2-diagnostics" 1607 | version = "0.9.1" 1608 | source = "registry+https://github.com/rust-lang/crates.io-index" 1609 | checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" 1610 | dependencies = [ 1611 | "proc-macro2", 1612 | "quote", 1613 | "syn", 1614 | "version_check", 1615 | "yansi", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "protobuf" 1620 | version = "2.27.1" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "cf7e6d18738ecd0902d30d1ad232c9125985a3422929b16c65517b38adc14f96" 1623 | 1624 | [[package]] 1625 | name = "protobuf-codegen" 1626 | version = "2.27.1" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "aec1632b7c8f2e620343439a7dfd1f3c47b18906c4be58982079911482b5d707" 1629 | dependencies = [ 1630 | "protobuf", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "protobuf-codegen-pure" 1635 | version = "2.27.1" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "9f8122fdb18e55190c796b088a16bdb70cd7acdcd48f7a8b796b58c62e532cc6" 1638 | dependencies = [ 1639 | "protobuf", 1640 | "protobuf-codegen", 1641 | ] 1642 | 1643 | [[package]] 1644 | name = "quote" 1645 | version = "1.0.21" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 1648 | dependencies = [ 1649 | "proc-macro2", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "rand" 1654 | version = "0.8.5" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1657 | dependencies = [ 1658 | "libc", 1659 | "rand_chacha", 1660 | "rand_core", 1661 | ] 1662 | 1663 | [[package]] 1664 | name = "rand_chacha" 1665 | version = "0.3.1" 1666 | source = "registry+https://github.com/rust-lang/crates.io-index" 1667 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1668 | dependencies = [ 1669 | "ppv-lite86", 1670 | "rand_core", 1671 | ] 1672 | 1673 | [[package]] 1674 | name = "rand_core" 1675 | version = "0.6.3" 1676 | source = "registry+https://github.com/rust-lang/crates.io-index" 1677 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 1678 | dependencies = [ 1679 | "getrandom", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "rand_distr" 1684 | version = "0.4.3" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 1687 | dependencies = [ 1688 | "num-traits 0.2.15", 1689 | "rand", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "realfft" 1694 | version = "3.0.1" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "8028eb3fabd68ddf331f744ba9c25a939804e276d820f9b218ab25a4bd7b91b8" 1697 | dependencies = [ 1698 | "rustfft", 1699 | ] 1700 | 1701 | [[package]] 1702 | name = "redox_syscall" 1703 | version = "0.2.16" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1706 | dependencies = [ 1707 | "bitflags", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "regex" 1712 | version = "1.6.0" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 1715 | dependencies = [ 1716 | "aho-corasick", 1717 | "memchr", 1718 | "regex-syntax", 1719 | ] 1720 | 1721 | [[package]] 1722 | name = "regex-automata" 1723 | version = "0.1.10" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 1726 | dependencies = [ 1727 | "regex-syntax", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "regex-syntax" 1732 | version = "0.6.27" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 1735 | 1736 | [[package]] 1737 | name = "remove_dir_all" 1738 | version = "0.5.3" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 1741 | dependencies = [ 1742 | "winapi", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "reqwest" 1747 | version = "0.11.11" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 1750 | dependencies = [ 1751 | "base64", 1752 | "bytes", 1753 | "encoding_rs", 1754 | "futures-core", 1755 | "futures-util", 1756 | "h2", 1757 | "http", 1758 | "http-body", 1759 | "hyper", 1760 | "hyper-rustls", 1761 | "ipnet", 1762 | "js-sys", 1763 | "lazy_static", 1764 | "log", 1765 | "mime", 1766 | "mime_guess", 1767 | "percent-encoding", 1768 | "pin-project-lite", 1769 | "rustls", 1770 | "rustls-pemfile", 1771 | "serde", 1772 | "serde_json", 1773 | "serde_urlencoded", 1774 | "tokio", 1775 | "tokio-rustls", 1776 | "tokio-util", 1777 | "tower-service", 1778 | "url", 1779 | "wasm-bindgen", 1780 | "wasm-bindgen-futures", 1781 | "web-sys", 1782 | "webpki-roots", 1783 | "winreg", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "ring" 1788 | version = "0.16.20" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 1791 | dependencies = [ 1792 | "cc", 1793 | "libc", 1794 | "once_cell", 1795 | "spin 0.5.2", 1796 | "untrusted", 1797 | "web-sys", 1798 | "winapi", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "rpassword" 1803 | version = "6.0.1" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956" 1806 | dependencies = [ 1807 | "libc", 1808 | "serde", 1809 | "serde_json", 1810 | "winapi", 1811 | ] 1812 | 1813 | [[package]] 1814 | name = "rubato" 1815 | version = "0.12.0" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "cd70209c27d5b08f5528bdc779ea3ffb418954e28987f9f9775c6eac41003f9c" 1818 | dependencies = [ 1819 | "num-complex", 1820 | "num-integer", 1821 | "num-traits 0.2.15", 1822 | "realfft", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "rustc-demangle" 1827 | version = "0.1.21" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" 1830 | 1831 | [[package]] 1832 | name = "rustc_version" 1833 | version = "0.4.0" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 1836 | dependencies = [ 1837 | "semver", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "rustfft" 1842 | version = "6.0.1" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "b1d089e5c57521629a59f5f39bca7434849ff89bd6873b521afe389c1c602543" 1845 | dependencies = [ 1846 | "num-complex", 1847 | "num-integer", 1848 | "num-traits 0.2.15", 1849 | "primal-check", 1850 | "strength_reduce", 1851 | "transpose", 1852 | ] 1853 | 1854 | [[package]] 1855 | name = "rustls" 1856 | version = "0.20.6" 1857 | source = "registry+https://github.com/rust-lang/crates.io-index" 1858 | checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" 1859 | dependencies = [ 1860 | "log", 1861 | "ring", 1862 | "sct", 1863 | "webpki", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "rustls-pemfile" 1868 | version = "1.0.1" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" 1871 | dependencies = [ 1872 | "base64", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "rustversion" 1877 | version = "1.0.9" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" 1880 | 1881 | [[package]] 1882 | name = "ryu" 1883 | version = "1.0.11" 1884 | source = "registry+https://github.com/rust-lang/crates.io-index" 1885 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 1886 | 1887 | [[package]] 1888 | name = "salsa20" 1889 | version = "0.9.0" 1890 | source = "registry+https://github.com/rust-lang/crates.io-index" 1891 | checksum = "0c0fbb5f676da676c260ba276a8f43a8dc67cf02d1438423aeb1c677a7212686" 1892 | dependencies = [ 1893 | "cipher 0.3.0", 1894 | "zeroize", 1895 | ] 1896 | 1897 | [[package]] 1898 | name = "scoped-tls" 1899 | version = "1.0.0" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 1902 | 1903 | [[package]] 1904 | name = "scopeguard" 1905 | version = "1.1.0" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1908 | 1909 | [[package]] 1910 | name = "sct" 1911 | version = "0.7.0" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 1914 | dependencies = [ 1915 | "ring", 1916 | "untrusted", 1917 | ] 1918 | 1919 | [[package]] 1920 | name = "semver" 1921 | version = "1.0.13" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" 1924 | 1925 | [[package]] 1926 | name = "serde" 1927 | version = "1.0.143" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" 1930 | dependencies = [ 1931 | "serde_derive", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "serde-value" 1936 | version = "0.7.0" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" 1939 | dependencies = [ 1940 | "ordered-float", 1941 | "serde", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "serde_derive" 1946 | version = "1.0.143" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" 1949 | dependencies = [ 1950 | "proc-macro2", 1951 | "quote", 1952 | "syn", 1953 | ] 1954 | 1955 | [[package]] 1956 | name = "serde_json" 1957 | version = "1.0.83" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" 1960 | dependencies = [ 1961 | "itoa", 1962 | "ryu", 1963 | "serde", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "serde_repr" 1968 | version = "0.1.9" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "1fe39d9fbb0ebf5eb2c7cb7e2a47e4f462fad1379f1166b8ae49ad9eae89a7ca" 1971 | dependencies = [ 1972 | "proc-macro2", 1973 | "quote", 1974 | "syn", 1975 | ] 1976 | 1977 | [[package]] 1978 | name = "serde_urlencoded" 1979 | version = "0.7.1" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1982 | dependencies = [ 1983 | "form_urlencoded", 1984 | "itoa", 1985 | "ryu", 1986 | "serde", 1987 | ] 1988 | 1989 | [[package]] 1990 | name = "serenity" 1991 | version = "0.11.5" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788" 1994 | dependencies = [ 1995 | "async-trait", 1996 | "async-tungstenite", 1997 | "base64", 1998 | "bitflags", 1999 | "bytes", 2000 | "cfg-if", 2001 | "chrono", 2002 | "command_attr", 2003 | "dashmap", 2004 | "flate2", 2005 | "futures", 2006 | "levenshtein", 2007 | "mime", 2008 | "mime_guess", 2009 | "parking_lot", 2010 | "percent-encoding", 2011 | "reqwest", 2012 | "serde", 2013 | "serde-value", 2014 | "serde_json", 2015 | "static_assertions", 2016 | "time 0.3.13", 2017 | "tokio", 2018 | "tracing", 2019 | "typemap_rev", 2020 | "url", 2021 | "uwl", 2022 | ] 2023 | 2024 | [[package]] 2025 | name = "serenity-voice-model" 2026 | version = "0.1.1" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "8be3aec8849ca2fde1e8a5dfbed96fbd68e9b5f4283fbe277d8694ce811d4952" 2029 | dependencies = [ 2030 | "bitflags", 2031 | "enum_primitive", 2032 | "serde", 2033 | "serde_json", 2034 | "serde_repr", 2035 | ] 2036 | 2037 | [[package]] 2038 | name = "sha-1" 2039 | version = "0.9.8" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" 2042 | dependencies = [ 2043 | "block-buffer 0.9.0", 2044 | "cfg-if", 2045 | "cpufeatures", 2046 | "digest 0.9.0", 2047 | "opaque-debug", 2048 | ] 2049 | 2050 | [[package]] 2051 | name = "sha-1" 2052 | version = "0.10.0" 2053 | source = "registry+https://github.com/rust-lang/crates.io-index" 2054 | checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" 2055 | dependencies = [ 2056 | "cfg-if", 2057 | "cpufeatures", 2058 | "digest 0.10.3", 2059 | ] 2060 | 2061 | [[package]] 2062 | name = "shannon" 2063 | version = "0.2.0" 2064 | source = "registry+https://github.com/rust-lang/crates.io-index" 2065 | checksum = "7ea5b41c9427b56caa7b808cb548a04fb50bb5b9e98590b53f28064ff4174561" 2066 | dependencies = [ 2067 | "byteorder", 2068 | ] 2069 | 2070 | [[package]] 2071 | name = "sharded-slab" 2072 | version = "0.1.4" 2073 | source = "registry+https://github.com/rust-lang/crates.io-index" 2074 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 2075 | dependencies = [ 2076 | "lazy_static", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "shell-words" 2081 | version = "1.1.0" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" 2084 | 2085 | [[package]] 2086 | name = "signal-hook-registry" 2087 | version = "1.4.0" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 2090 | dependencies = [ 2091 | "libc", 2092 | ] 2093 | 2094 | [[package]] 2095 | name = "slab" 2096 | version = "0.4.7" 2097 | source = "registry+https://github.com/rust-lang/crates.io-index" 2098 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 2099 | dependencies = [ 2100 | "autocfg", 2101 | ] 2102 | 2103 | [[package]] 2104 | name = "smallvec" 2105 | version = "1.9.0" 2106 | source = "registry+https://github.com/rust-lang/crates.io-index" 2107 | checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" 2108 | 2109 | [[package]] 2110 | name = "socket2" 2111 | version = "0.4.4" 2112 | source = "registry+https://github.com/rust-lang/crates.io-index" 2113 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 2114 | dependencies = [ 2115 | "libc", 2116 | "winapi", 2117 | ] 2118 | 2119 | [[package]] 2120 | name = "songbird" 2121 | version = "0.3.2" 2122 | source = "registry+https://github.com/rust-lang/crates.io-index" 2123 | checksum = "32f686a0fd771939de1da3e43cee45169fafe1595770b94680572cf18bdef288" 2124 | dependencies = [ 2125 | "async-trait", 2126 | "async-tungstenite", 2127 | "audiopus", 2128 | "byteorder", 2129 | "dashmap", 2130 | "derivative", 2131 | "discortp", 2132 | "flume", 2133 | "futures", 2134 | "parking_lot", 2135 | "pin-project", 2136 | "rand", 2137 | "serde", 2138 | "serde_json", 2139 | "serenity", 2140 | "serenity-voice-model", 2141 | "streamcatcher", 2142 | "symphonia-core", 2143 | "tokio", 2144 | "tracing", 2145 | "tracing-futures", 2146 | "typemap_rev", 2147 | "url", 2148 | "uuid 0.8.2", 2149 | "xsalsa20poly1305", 2150 | ] 2151 | 2152 | [[package]] 2153 | name = "spin" 2154 | version = "0.5.2" 2155 | source = "registry+https://github.com/rust-lang/crates.io-index" 2156 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 2157 | 2158 | [[package]] 2159 | name = "spin" 2160 | version = "0.9.4" 2161 | source = "registry+https://github.com/rust-lang/crates.io-index" 2162 | checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09" 2163 | dependencies = [ 2164 | "lock_api", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "static_assertions" 2169 | version = "1.1.0" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2172 | 2173 | [[package]] 2174 | name = "streamcatcher" 2175 | version = "1.0.1" 2176 | source = "registry+https://github.com/rust-lang/crates.io-index" 2177 | checksum = "71664755c349abb0758fda6218fb2d2391ca2a73f9302c03b145491db4fcea29" 2178 | dependencies = [ 2179 | "crossbeam-utils", 2180 | "futures-util", 2181 | "loom", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "strength_reduce" 2186 | version = "0.2.3" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "a3ff2f71c82567c565ba4b3009a9350a96a7269eaa4001ebedae926230bc2254" 2189 | 2190 | [[package]] 2191 | name = "subtle" 2192 | version = "2.4.1" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 2195 | 2196 | [[package]] 2197 | name = "symphonia-core" 2198 | version = "0.5.1" 2199 | source = "registry+https://github.com/rust-lang/crates.io-index" 2200 | checksum = "199a6417cd4115bac79289b64b859358ea050b7add0ceb364dc991f628c5b347" 2201 | dependencies = [ 2202 | "arrayvec", 2203 | "bitflags", 2204 | "bytemuck", 2205 | "lazy_static", 2206 | "log", 2207 | ] 2208 | 2209 | [[package]] 2210 | name = "syn" 2211 | version = "1.0.99" 2212 | source = "registry+https://github.com/rust-lang/crates.io-index" 2213 | checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13" 2214 | dependencies = [ 2215 | "proc-macro2", 2216 | "quote", 2217 | "unicode-ident", 2218 | ] 2219 | 2220 | [[package]] 2221 | name = "synstructure" 2222 | version = "0.12.6" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" 2225 | dependencies = [ 2226 | "proc-macro2", 2227 | "quote", 2228 | "syn", 2229 | "unicode-xid", 2230 | ] 2231 | 2232 | [[package]] 2233 | name = "tempfile" 2234 | version = "3.3.0" 2235 | source = "registry+https://github.com/rust-lang/crates.io-index" 2236 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 2237 | dependencies = [ 2238 | "cfg-if", 2239 | "fastrand", 2240 | "libc", 2241 | "redox_syscall", 2242 | "remove_dir_all", 2243 | "winapi", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "termcolor" 2248 | version = "1.1.3" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 2251 | dependencies = [ 2252 | "winapi-util", 2253 | ] 2254 | 2255 | [[package]] 2256 | name = "thiserror" 2257 | version = "1.0.32" 2258 | source = "registry+https://github.com/rust-lang/crates.io-index" 2259 | checksum = "f5f6586b7f764adc0231f4c79be7b920e766bb2f3e51b3661cdb263828f19994" 2260 | dependencies = [ 2261 | "thiserror-impl", 2262 | ] 2263 | 2264 | [[package]] 2265 | name = "thiserror-impl" 2266 | version = "1.0.32" 2267 | source = "registry+https://github.com/rust-lang/crates.io-index" 2268 | checksum = "12bafc5b54507e0149cdf1b145a5d80ab80a90bcd9275df43d4fff68460f6c21" 2269 | dependencies = [ 2270 | "proc-macro2", 2271 | "quote", 2272 | "syn", 2273 | ] 2274 | 2275 | [[package]] 2276 | name = "thread-id" 2277 | version = "4.0.0" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | checksum = "5fdfe0627923f7411a43ec9ec9c39c3a9b4151be313e0922042581fb6c9b717f" 2280 | dependencies = [ 2281 | "libc", 2282 | "redox_syscall", 2283 | "winapi", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "thread_local" 2288 | version = "1.1.4" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" 2291 | dependencies = [ 2292 | "once_cell", 2293 | ] 2294 | 2295 | [[package]] 2296 | name = "time" 2297 | version = "0.1.44" 2298 | source = "registry+https://github.com/rust-lang/crates.io-index" 2299 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 2300 | dependencies = [ 2301 | "libc", 2302 | "wasi 0.10.0+wasi-snapshot-preview1", 2303 | "winapi", 2304 | ] 2305 | 2306 | [[package]] 2307 | name = "time" 2308 | version = "0.3.13" 2309 | source = "registry+https://github.com/rust-lang/crates.io-index" 2310 | checksum = "db76ff9fa4b1458b3c7f077f3ff9887394058460d21e634355b273aaf11eea45" 2311 | dependencies = [ 2312 | "itoa", 2313 | "libc", 2314 | "num_threads", 2315 | "serde", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "tinyvec" 2320 | version = "1.6.0" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 2323 | dependencies = [ 2324 | "tinyvec_macros", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "tinyvec_macros" 2329 | version = "0.1.0" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 2332 | 2333 | [[package]] 2334 | name = "tokio" 2335 | version = "1.20.1" 2336 | source = "registry+https://github.com/rust-lang/crates.io-index" 2337 | checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581" 2338 | dependencies = [ 2339 | "autocfg", 2340 | "bytes", 2341 | "libc", 2342 | "memchr", 2343 | "mio", 2344 | "num_cpus", 2345 | "once_cell", 2346 | "parking_lot", 2347 | "pin-project-lite", 2348 | "signal-hook-registry", 2349 | "socket2", 2350 | "tokio-macros", 2351 | "winapi", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "tokio-macros" 2356 | version = "1.8.0" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" 2359 | dependencies = [ 2360 | "proc-macro2", 2361 | "quote", 2362 | "syn", 2363 | ] 2364 | 2365 | [[package]] 2366 | name = "tokio-rustls" 2367 | version = "0.23.4" 2368 | source = "registry+https://github.com/rust-lang/crates.io-index" 2369 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 2370 | dependencies = [ 2371 | "rustls", 2372 | "tokio", 2373 | "webpki", 2374 | ] 2375 | 2376 | [[package]] 2377 | name = "tokio-stream" 2378 | version = "0.1.9" 2379 | source = "registry+https://github.com/rust-lang/crates.io-index" 2380 | checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9" 2381 | dependencies = [ 2382 | "futures-core", 2383 | "pin-project-lite", 2384 | "tokio", 2385 | ] 2386 | 2387 | [[package]] 2388 | name = "tokio-util" 2389 | version = "0.7.3" 2390 | source = "registry+https://github.com/rust-lang/crates.io-index" 2391 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 2392 | dependencies = [ 2393 | "bytes", 2394 | "futures-core", 2395 | "futures-sink", 2396 | "pin-project-lite", 2397 | "tokio", 2398 | "tracing", 2399 | ] 2400 | 2401 | [[package]] 2402 | name = "toml" 2403 | version = "0.5.9" 2404 | source = "registry+https://github.com/rust-lang/crates.io-index" 2405 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 2406 | dependencies = [ 2407 | "serde", 2408 | ] 2409 | 2410 | [[package]] 2411 | name = "tower-service" 2412 | version = "0.3.2" 2413 | source = "registry+https://github.com/rust-lang/crates.io-index" 2414 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2415 | 2416 | [[package]] 2417 | name = "tracing" 2418 | version = "0.1.36" 2419 | source = "registry+https://github.com/rust-lang/crates.io-index" 2420 | checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" 2421 | dependencies = [ 2422 | "cfg-if", 2423 | "log", 2424 | "pin-project-lite", 2425 | "tracing-attributes", 2426 | "tracing-core", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "tracing-attributes" 2431 | version = "0.1.22" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" 2434 | dependencies = [ 2435 | "proc-macro2", 2436 | "quote", 2437 | "syn", 2438 | ] 2439 | 2440 | [[package]] 2441 | name = "tracing-core" 2442 | version = "0.1.29" 2443 | source = "registry+https://github.com/rust-lang/crates.io-index" 2444 | checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" 2445 | dependencies = [ 2446 | "once_cell", 2447 | "valuable", 2448 | ] 2449 | 2450 | [[package]] 2451 | name = "tracing-futures" 2452 | version = "0.2.5" 2453 | source = "registry+https://github.com/rust-lang/crates.io-index" 2454 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 2455 | dependencies = [ 2456 | "pin-project", 2457 | "tracing", 2458 | ] 2459 | 2460 | [[package]] 2461 | name = "tracing-log" 2462 | version = "0.1.3" 2463 | source = "registry+https://github.com/rust-lang/crates.io-index" 2464 | checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" 2465 | dependencies = [ 2466 | "lazy_static", 2467 | "log", 2468 | "tracing-core", 2469 | ] 2470 | 2471 | [[package]] 2472 | name = "tracing-serde" 2473 | version = "0.1.3" 2474 | source = "registry+https://github.com/rust-lang/crates.io-index" 2475 | checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" 2476 | dependencies = [ 2477 | "serde", 2478 | "tracing-core", 2479 | ] 2480 | 2481 | [[package]] 2482 | name = "tracing-subscriber" 2483 | version = "0.2.25" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" 2486 | dependencies = [ 2487 | "ansi_term", 2488 | "chrono", 2489 | "lazy_static", 2490 | "matchers 0.0.1", 2491 | "regex", 2492 | "serde", 2493 | "serde_json", 2494 | "sharded-slab", 2495 | "smallvec", 2496 | "thread_local", 2497 | "tracing", 2498 | "tracing-core", 2499 | "tracing-log", 2500 | "tracing-serde", 2501 | ] 2502 | 2503 | [[package]] 2504 | name = "tracing-subscriber" 2505 | version = "0.3.15" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" 2508 | dependencies = [ 2509 | "ansi_term", 2510 | "matchers 0.1.0", 2511 | "once_cell", 2512 | "regex", 2513 | "sharded-slab", 2514 | "smallvec", 2515 | "thread_local", 2516 | "tracing", 2517 | "tracing-core", 2518 | "tracing-log", 2519 | ] 2520 | 2521 | [[package]] 2522 | name = "transpose" 2523 | version = "0.2.1" 2524 | source = "registry+https://github.com/rust-lang/crates.io-index" 2525 | checksum = "95f9c900aa98b6ea43aee227fd680550cdec726526aab8ac801549eadb25e39f" 2526 | dependencies = [ 2527 | "num-integer", 2528 | "strength_reduce", 2529 | ] 2530 | 2531 | [[package]] 2532 | name = "try-lock" 2533 | version = "0.2.3" 2534 | source = "registry+https://github.com/rust-lang/crates.io-index" 2535 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 2536 | 2537 | [[package]] 2538 | name = "tungstenite" 2539 | version = "0.17.3" 2540 | source = "registry+https://github.com/rust-lang/crates.io-index" 2541 | checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" 2542 | dependencies = [ 2543 | "base64", 2544 | "byteorder", 2545 | "bytes", 2546 | "http", 2547 | "httparse", 2548 | "log", 2549 | "rand", 2550 | "rustls", 2551 | "sha-1 0.10.0", 2552 | "thiserror", 2553 | "url", 2554 | "utf-8", 2555 | "webpki", 2556 | ] 2557 | 2558 | [[package]] 2559 | name = "typemap_rev" 2560 | version = "0.1.5" 2561 | source = "registry+https://github.com/rust-lang/crates.io-index" 2562 | checksum = "ed5b74f0a24b5454580a79abb6994393b09adf0ab8070f15827cb666255de155" 2563 | 2564 | [[package]] 2565 | name = "typenum" 2566 | version = "1.15.0" 2567 | source = "registry+https://github.com/rust-lang/crates.io-index" 2568 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 2569 | 2570 | [[package]] 2571 | name = "uncased" 2572 | version = "0.9.7" 2573 | source = "registry+https://github.com/rust-lang/crates.io-index" 2574 | checksum = "09b01702b0fd0b3fadcf98e098780badda8742d4f4a7676615cad90e8ac73622" 2575 | dependencies = [ 2576 | "version_check", 2577 | ] 2578 | 2579 | [[package]] 2580 | name = "unicase" 2581 | version = "2.6.0" 2582 | source = "registry+https://github.com/rust-lang/crates.io-index" 2583 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 2584 | dependencies = [ 2585 | "version_check", 2586 | ] 2587 | 2588 | [[package]] 2589 | name = "unicode-bidi" 2590 | version = "0.3.8" 2591 | source = "registry+https://github.com/rust-lang/crates.io-index" 2592 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 2593 | 2594 | [[package]] 2595 | name = "unicode-ident" 2596 | version = "1.0.3" 2597 | source = "registry+https://github.com/rust-lang/crates.io-index" 2598 | checksum = "c4f5b37a154999a8f3f98cc23a628d850e154479cd94decf3414696e12e31aaf" 2599 | 2600 | [[package]] 2601 | name = "unicode-normalization" 2602 | version = "0.1.21" 2603 | source = "registry+https://github.com/rust-lang/crates.io-index" 2604 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 2605 | dependencies = [ 2606 | "tinyvec", 2607 | ] 2608 | 2609 | [[package]] 2610 | name = "unicode-width" 2611 | version = "0.1.9" 2612 | source = "registry+https://github.com/rust-lang/crates.io-index" 2613 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 2614 | 2615 | [[package]] 2616 | name = "unicode-xid" 2617 | version = "0.2.3" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" 2620 | 2621 | [[package]] 2622 | name = "universal-hash" 2623 | version = "0.4.1" 2624 | source = "registry+https://github.com/rust-lang/crates.io-index" 2625 | checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" 2626 | dependencies = [ 2627 | "generic-array", 2628 | "subtle", 2629 | ] 2630 | 2631 | [[package]] 2632 | name = "untrusted" 2633 | version = "0.7.1" 2634 | source = "registry+https://github.com/rust-lang/crates.io-index" 2635 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 2636 | 2637 | [[package]] 2638 | name = "url" 2639 | version = "2.2.2" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 2642 | dependencies = [ 2643 | "form_urlencoded", 2644 | "idna", 2645 | "matches", 2646 | "percent-encoding", 2647 | "serde", 2648 | ] 2649 | 2650 | [[package]] 2651 | name = "utf-8" 2652 | version = "0.7.6" 2653 | source = "registry+https://github.com/rust-lang/crates.io-index" 2654 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 2655 | 2656 | [[package]] 2657 | name = "uuid" 2658 | version = "0.8.2" 2659 | source = "registry+https://github.com/rust-lang/crates.io-index" 2660 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2661 | dependencies = [ 2662 | "getrandom", 2663 | ] 2664 | 2665 | [[package]] 2666 | name = "uuid" 2667 | version = "1.1.2" 2668 | source = "registry+https://github.com/rust-lang/crates.io-index" 2669 | checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" 2670 | dependencies = [ 2671 | "getrandom", 2672 | ] 2673 | 2674 | [[package]] 2675 | name = "uwl" 2676 | version = "0.6.0" 2677 | source = "registry+https://github.com/rust-lang/crates.io-index" 2678 | checksum = "f4bf03e0ca70d626ecc4ba6b0763b934b6f2976e8c744088bb3c1d646fbb1ad0" 2679 | 2680 | [[package]] 2681 | name = "valuable" 2682 | version = "0.1.0" 2683 | source = "registry+https://github.com/rust-lang/crates.io-index" 2684 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2685 | 2686 | [[package]] 2687 | name = "vergen" 2688 | version = "3.2.0" 2689 | source = "registry+https://github.com/rust-lang/crates.io-index" 2690 | checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" 2691 | dependencies = [ 2692 | "bitflags", 2693 | "chrono", 2694 | "rustc_version", 2695 | ] 2696 | 2697 | [[package]] 2698 | name = "version_check" 2699 | version = "0.9.4" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2702 | 2703 | [[package]] 2704 | name = "want" 2705 | version = "0.3.0" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 2708 | dependencies = [ 2709 | "log", 2710 | "try-lock", 2711 | ] 2712 | 2713 | [[package]] 2714 | name = "wasi" 2715 | version = "0.10.0+wasi-snapshot-preview1" 2716 | source = "registry+https://github.com/rust-lang/crates.io-index" 2717 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 2718 | 2719 | [[package]] 2720 | name = "wasi" 2721 | version = "0.11.0+wasi-snapshot-preview1" 2722 | source = "registry+https://github.com/rust-lang/crates.io-index" 2723 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2724 | 2725 | [[package]] 2726 | name = "wasm-bindgen" 2727 | version = "0.2.82" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" 2730 | dependencies = [ 2731 | "cfg-if", 2732 | "wasm-bindgen-macro", 2733 | ] 2734 | 2735 | [[package]] 2736 | name = "wasm-bindgen-backend" 2737 | version = "0.2.82" 2738 | source = "registry+https://github.com/rust-lang/crates.io-index" 2739 | checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" 2740 | dependencies = [ 2741 | "bumpalo", 2742 | "log", 2743 | "once_cell", 2744 | "proc-macro2", 2745 | "quote", 2746 | "syn", 2747 | "wasm-bindgen-shared", 2748 | ] 2749 | 2750 | [[package]] 2751 | name = "wasm-bindgen-futures" 2752 | version = "0.4.32" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" 2755 | dependencies = [ 2756 | "cfg-if", 2757 | "js-sys", 2758 | "wasm-bindgen", 2759 | "web-sys", 2760 | ] 2761 | 2762 | [[package]] 2763 | name = "wasm-bindgen-macro" 2764 | version = "0.2.82" 2765 | source = "registry+https://github.com/rust-lang/crates.io-index" 2766 | checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" 2767 | dependencies = [ 2768 | "quote", 2769 | "wasm-bindgen-macro-support", 2770 | ] 2771 | 2772 | [[package]] 2773 | name = "wasm-bindgen-macro-support" 2774 | version = "0.2.82" 2775 | source = "registry+https://github.com/rust-lang/crates.io-index" 2776 | checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" 2777 | dependencies = [ 2778 | "proc-macro2", 2779 | "quote", 2780 | "syn", 2781 | "wasm-bindgen-backend", 2782 | "wasm-bindgen-shared", 2783 | ] 2784 | 2785 | [[package]] 2786 | name = "wasm-bindgen-shared" 2787 | version = "0.2.82" 2788 | source = "registry+https://github.com/rust-lang/crates.io-index" 2789 | checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" 2790 | 2791 | [[package]] 2792 | name = "web-sys" 2793 | version = "0.3.59" 2794 | source = "registry+https://github.com/rust-lang/crates.io-index" 2795 | checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" 2796 | dependencies = [ 2797 | "js-sys", 2798 | "wasm-bindgen", 2799 | ] 2800 | 2801 | [[package]] 2802 | name = "webpki" 2803 | version = "0.22.0" 2804 | source = "registry+https://github.com/rust-lang/crates.io-index" 2805 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 2806 | dependencies = [ 2807 | "ring", 2808 | "untrusted", 2809 | ] 2810 | 2811 | [[package]] 2812 | name = "webpki-roots" 2813 | version = "0.22.4" 2814 | source = "registry+https://github.com/rust-lang/crates.io-index" 2815 | checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" 2816 | dependencies = [ 2817 | "webpki", 2818 | ] 2819 | 2820 | [[package]] 2821 | name = "winapi" 2822 | version = "0.3.9" 2823 | source = "registry+https://github.com/rust-lang/crates.io-index" 2824 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2825 | dependencies = [ 2826 | "winapi-i686-pc-windows-gnu", 2827 | "winapi-x86_64-pc-windows-gnu", 2828 | ] 2829 | 2830 | [[package]] 2831 | name = "winapi-i686-pc-windows-gnu" 2832 | version = "0.4.0" 2833 | source = "registry+https://github.com/rust-lang/crates.io-index" 2834 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2835 | 2836 | [[package]] 2837 | name = "winapi-util" 2838 | version = "0.1.5" 2839 | source = "registry+https://github.com/rust-lang/crates.io-index" 2840 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2841 | dependencies = [ 2842 | "winapi", 2843 | ] 2844 | 2845 | [[package]] 2846 | name = "winapi-x86_64-pc-windows-gnu" 2847 | version = "0.4.0" 2848 | source = "registry+https://github.com/rust-lang/crates.io-index" 2849 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2850 | 2851 | [[package]] 2852 | name = "windows" 2853 | version = "0.32.0" 2854 | source = "registry+https://github.com/rust-lang/crates.io-index" 2855 | checksum = "fbedf6db9096bc2364adce0ae0aa636dcd89f3c3f2cd67947062aaf0ca2a10ec" 2856 | dependencies = [ 2857 | "windows_aarch64_msvc 0.32.0", 2858 | "windows_i686_gnu 0.32.0", 2859 | "windows_i686_msvc 0.32.0", 2860 | "windows_x86_64_gnu 0.32.0", 2861 | "windows_x86_64_msvc 0.32.0", 2862 | ] 2863 | 2864 | [[package]] 2865 | name = "windows-sys" 2866 | version = "0.36.1" 2867 | source = "registry+https://github.com/rust-lang/crates.io-index" 2868 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 2869 | dependencies = [ 2870 | "windows_aarch64_msvc 0.36.1", 2871 | "windows_i686_gnu 0.36.1", 2872 | "windows_i686_msvc 0.36.1", 2873 | "windows_x86_64_gnu 0.36.1", 2874 | "windows_x86_64_msvc 0.36.1", 2875 | ] 2876 | 2877 | [[package]] 2878 | name = "windows_aarch64_msvc" 2879 | version = "0.32.0" 2880 | source = "registry+https://github.com/rust-lang/crates.io-index" 2881 | checksum = "d8e92753b1c443191654ec532f14c199742964a061be25d77d7a96f09db20bf5" 2882 | 2883 | [[package]] 2884 | name = "windows_aarch64_msvc" 2885 | version = "0.36.1" 2886 | source = "registry+https://github.com/rust-lang/crates.io-index" 2887 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 2888 | 2889 | [[package]] 2890 | name = "windows_i686_gnu" 2891 | version = "0.32.0" 2892 | source = "registry+https://github.com/rust-lang/crates.io-index" 2893 | checksum = "6a711c68811799e017b6038e0922cb27a5e2f43a2ddb609fe0b6f3eeda9de615" 2894 | 2895 | [[package]] 2896 | name = "windows_i686_gnu" 2897 | version = "0.36.1" 2898 | source = "registry+https://github.com/rust-lang/crates.io-index" 2899 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 2900 | 2901 | [[package]] 2902 | name = "windows_i686_msvc" 2903 | version = "0.32.0" 2904 | source = "registry+https://github.com/rust-lang/crates.io-index" 2905 | checksum = "146c11bb1a02615db74680b32a68e2d61f553cc24c4eb5b4ca10311740e44172" 2906 | 2907 | [[package]] 2908 | name = "windows_i686_msvc" 2909 | version = "0.36.1" 2910 | source = "registry+https://github.com/rust-lang/crates.io-index" 2911 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 2912 | 2913 | [[package]] 2914 | name = "windows_x86_64_gnu" 2915 | version = "0.32.0" 2916 | source = "registry+https://github.com/rust-lang/crates.io-index" 2917 | checksum = "c912b12f7454c6620635bbff3450962753834be2a594819bd5e945af18ec64bc" 2918 | 2919 | [[package]] 2920 | name = "windows_x86_64_gnu" 2921 | version = "0.36.1" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 2924 | 2925 | [[package]] 2926 | name = "windows_x86_64_msvc" 2927 | version = "0.32.0" 2928 | source = "registry+https://github.com/rust-lang/crates.io-index" 2929 | checksum = "504a2476202769977a040c6364301a3f65d0cc9e3fb08600b2bda150a0488316" 2930 | 2931 | [[package]] 2932 | name = "windows_x86_64_msvc" 2933 | version = "0.36.1" 2934 | source = "registry+https://github.com/rust-lang/crates.io-index" 2935 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 2936 | 2937 | [[package]] 2938 | name = "winreg" 2939 | version = "0.10.1" 2940 | source = "registry+https://github.com/rust-lang/crates.io-index" 2941 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 2942 | dependencies = [ 2943 | "winapi", 2944 | ] 2945 | 2946 | [[package]] 2947 | name = "xsalsa20poly1305" 2948 | version = "0.8.0" 2949 | source = "registry+https://github.com/rust-lang/crates.io-index" 2950 | checksum = "e68bcb965d6c650091450b95cea12f07dcd299a01c15e2f9433b0813ea3c0886" 2951 | dependencies = [ 2952 | "aead", 2953 | "poly1305", 2954 | "rand_core", 2955 | "salsa20", 2956 | "subtle", 2957 | "zeroize", 2958 | ] 2959 | 2960 | [[package]] 2961 | name = "yansi" 2962 | version = "0.5.1" 2963 | source = "registry+https://github.com/rust-lang/crates.io-index" 2964 | checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" 2965 | 2966 | [[package]] 2967 | name = "zerocopy" 2968 | version = "0.6.1" 2969 | source = "registry+https://github.com/rust-lang/crates.io-index" 2970 | checksum = "332f188cc1bcf1fe1064b8c58d150f497e697f49774aa846f2dc949d9a25f236" 2971 | dependencies = [ 2972 | "byteorder", 2973 | "zerocopy-derive", 2974 | ] 2975 | 2976 | [[package]] 2977 | name = "zerocopy-derive" 2978 | version = "0.3.1" 2979 | source = "registry+https://github.com/rust-lang/crates.io-index" 2980 | checksum = "a0fbc82b82efe24da867ee52e015e58178684bd9dd64c34e66bdf21da2582a9f" 2981 | dependencies = [ 2982 | "proc-macro2", 2983 | "syn", 2984 | "synstructure", 2985 | ] 2986 | 2987 | [[package]] 2988 | name = "zeroize" 2989 | version = "1.3.0" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" 2992 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "aoede" 3 | version = "0.9.0" 4 | authors = ["Max Isom "] 5 | edition = "2018" 6 | 7 | [dependencies] 8 | librespot = {version = "0.4.2", default-features = false} 9 | songbird = "0.3.1" 10 | tracing = "0.1" 11 | tracing-subscriber = "0.2" 12 | tracing-futures = "0.2" 13 | tokio = { version = "1.20.1", features = ["default"] } 14 | byteorder = "1.4.3" 15 | serde = "1.0" 16 | figment = { version = "0.10", features = ["toml", "env"] } 17 | rubato = "0.12.0" 18 | 19 | [dependencies.serenity] 20 | version = "0.11.2" 21 | features = ["client"] 22 | 23 | [profile.dev] 24 | split-debuginfo = "unpacked" 25 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:alpine AS dependencies 2 | 3 | RUN apk add --no-cache alpine-sdk cmake automake autoconf opus libtool 4 | RUN cargo install cargo-chef 5 | 6 | FROM dependencies AS planner 7 | WORKDIR app 8 | 9 | # We only pay the installation cost once, 10 | # it will be cached from the second build onwards 11 | # To ensure a reproducible build consider pinning 12 | # the cargo-chef version with `--version X.X.X` 13 | COPY . . 14 | RUN cargo chef prepare --recipe-path recipe.json 15 | 16 | FROM dependencies AS cacher 17 | WORKDIR app 18 | COPY --from=planner /app/recipe.json recipe.json 19 | RUN cargo chef cook --release --recipe-path recipe.json 20 | 21 | FROM dependencies AS builder 22 | WORKDIR app 23 | COPY . . 24 | # Copy over the cached dependencies 25 | COPY --from=cacher /app/target target 26 | COPY --from=cacher /usr/local/cargo /usr/local/cargo 27 | RUN cargo build --release --bin aoede 28 | 29 | FROM alpine AS runtime 30 | WORKDIR app 31 | COPY --from=builder /app/target/release/aoede /usr/local/bin 32 | 33 | ENV CACHE_DIR=/data 34 | 35 | ENTRYPOINT ["/usr/local/bin/aoede"] 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Max Isom 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 | 3 |

4 | 5 | Aoede is a Discord music bot that **directly** streams from **Spotify to Discord**. The only interface is Spotify itself. 6 | 7 | **Note**: a Spotify Premium account is currently required. This is a limitation of librespot, the Spotify library Aoede uses. Facebook logins [are not supported](https://github.com/librespot-org/librespot/discussions/635). 8 | 9 | ![Demo](https://raw.githubusercontent.com/codetheweb/aoede/main/.github/demo.gif) 10 | 11 | ## 💼 Usecases 12 | 13 | - Small servers with friends 14 | - Discord Stages, broadcast music to your audience 15 | 16 | ## 🏗 Usage 17 | 18 | (Images are available for x86 and arm64.) 19 | 20 | ### Notes: 21 | ⚠️ Aoede only supports bot tokens. Providing a user token won't work. 22 | 23 | Aoede will appear offline until you join a voice channel it has access it. 24 | 25 | ### Docker Compose (recommended): 26 | 27 | There are a variety of image tags available: 28 | - `:0`: versions >= 0.0.0 29 | - `:0.5`: versions >= 0.5.0 and < 0.6.0 30 | - `:0.5.1`: an exact version specifier 31 | - `:latest`: whatever the latest version is 32 | 33 | ```yaml 34 | version: '3.4' 35 | 36 | services: 37 | aoede: 38 | image: codetheweb/aoede 39 | restart: always 40 | volumes: 41 | - ./aoede:/data 42 | environment: 43 | - DISCORD_TOKEN= 44 | - SPOTIFY_USERNAME= 45 | - SPOTIFY_PASSWORD= 46 | - DISCORD_USER_ID= # Discord user ID of the user you want Aoede to follow 47 | - SPOTIFY_BOT_AUTOPLAY= # Autoplay similar songs when your music ends (true/false) 48 | - SPOTIFY_DEVICE_NAME= 49 | ``` 50 | 51 | ### Docker: 52 | ```env 53 | # .env 54 | DISCORD_TOKEN= 55 | SPOTIFY_USERNAME= 56 | SPOTIFY_PASSWORD= 57 | DISCORD_USER_ID= 58 | SPOTIFY_BOT_AUTOPLAY= 59 | SPOTIFY_DEVICE_NAME= 60 | ``` 61 | 62 | ```bash 63 | docker run --rm -d --env-file .env codetheweb/aoede 64 | ``` 65 | 66 | ### Prebuilt Binaries: 67 | 68 | Prebuilt binaries are available on the [releases page](https://github.com/codetheweb/aoede/releases). Download the binary for your platform, then inside a terminal session: 69 | 70 | 1. There are two options to make configuration values available to Aoede: 71 | 1. Copy the `config.sample.toml` file to `config.toml` and update as necessary. 72 | 2. Use environment variables (see the Docker Compose section above): 73 | - On Windows, you can use `setx DISCORD_TOKEN my-token` 74 | - On Linux / macOS, you can use `export DISCORD_TOKEN=my-token` 75 | 2. Run the binary: 76 | - For Linux / macOS, `./platform-latest-aoede` after navigating to the correct directory 77 | - For Windows, execute `windows-latest-aoede.exe` after navigating to the correct directory 78 | 79 | ### Building from source: 80 | 81 | Requirements: 82 | 83 | - automake 84 | - autoconf 85 | - cmake 86 | - libtool 87 | - Rust 88 | - Cargo 89 | 90 | Run `cargo build --release`. This will produce a binary in `target/release/aoede`. Set the required environment variables (see the Docker Compose section), then run the binary. 91 | -------------------------------------------------------------------------------- /config.sample.toml: -------------------------------------------------------------------------------- 1 | DISCORD_TOKEN="the discord bot token" 2 | SPOTIFY_USERNAME="your spotify email" 3 | SPOTIFY_PASSWORD="your spotify password" 4 | DISCORD_USER_ID="your discord id here" 5 | SPOTIFY_BOT_AUTOPLAY=true 6 | SPOTIFY_DEVICE_NAME="custom device name in spotify, optional" -------------------------------------------------------------------------------- /src/lib/config.rs: -------------------------------------------------------------------------------- 1 | use figment::{ 2 | providers::{Env, Format, Toml}, 3 | Error, Figment, 4 | }; 5 | use serde::Deserialize; 6 | 7 | #[derive(Deserialize, Clone)] 8 | pub struct Config { 9 | #[serde(alias = "DISCORD_TOKEN")] 10 | pub discord_token: String, 11 | #[serde(alias = "SPOTIFY_USERNAME")] 12 | pub spotify_username: String, 13 | #[serde(alias = "SPOTIFY_PASSWORD")] 14 | pub spotify_password: String, 15 | #[serde(alias = "DISCORD_USER_ID")] 16 | pub discord_user_id: u64, 17 | #[serde(alias = "SPOTIFY_BOT_AUTOPLAY")] 18 | pub spotify_bot_autoplay: bool, 19 | #[serde(alias = "SPOTIFY_DEVICE_NAME")] 20 | #[serde(default = "default_spotify_device_name")] 21 | pub spotify_device_name: String, 22 | } 23 | 24 | fn default_spotify_device_name() -> String { 25 | "Aoede".to_string() 26 | } 27 | 28 | impl Config { 29 | pub fn new() -> Result { 30 | let config: Config = Figment::new() 31 | .merge(Toml::file("config.toml")) 32 | .merge(Env::raw()) 33 | .extract()?; 34 | Ok(config) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/lib/player.rs: -------------------------------------------------------------------------------- 1 | use librespot::connect::spirc::Spirc; 2 | use librespot::core::{ 3 | authentication::Credentials, 4 | cache::Cache, 5 | config::{ConnectConfig, DeviceType, SessionConfig}, 6 | session::Session, 7 | }; 8 | use librespot::playback::{ 9 | audio_backend, 10 | audio_backend::SinkResult, 11 | config::Bitrate, 12 | config::{PlayerConfig, VolumeCtrl}, 13 | convert::Converter, 14 | decoder::AudioPacket, 15 | mixer::softmixer::SoftMixer, 16 | mixer::{Mixer, MixerConfig}, 17 | player::{Player, PlayerEventChannel}, 18 | }; 19 | 20 | use serenity::prelude::TypeMapKey; 21 | 22 | use std::clone::Clone; 23 | use std::sync::{ 24 | mpsc::{sync_channel, Receiver, SyncSender}, 25 | Arc, Mutex, 26 | }; 27 | use std::{io, mem}; 28 | 29 | use byteorder::{ByteOrder, LittleEndian}; 30 | use rubato::{FftFixedInOut, Resampler}; 31 | use songbird::input::reader::MediaSource; 32 | 33 | pub struct SpotifyPlayer { 34 | player_config: PlayerConfig, 35 | pub emitted_sink: EmittedSink, 36 | pub session: Session, 37 | pub spirc: Option>, 38 | pub event_channel: Option>>, 39 | mixer: Box, 40 | pub bot_autoplay: bool, 41 | pub device_name: String, 42 | } 43 | 44 | pub struct EmittedSink { 45 | sender: Arc>, 46 | pub receiver: Arc>>, 47 | input_buffer: Arc, Vec)>>, 48 | resampler: Arc>>, 49 | resampler_input_frames_needed: usize, 50 | } 51 | 52 | impl EmittedSink { 53 | fn new() -> EmittedSink { 54 | // By setting the sync_channel bound to at least the output frame size of one resampling 55 | // step (1120 for a chunk size of 1024 and our frequency settings) the number of 56 | // synchronizations needed between EmittedSink::write and EmittedSink::read can be reduced. 57 | let (sender, receiver) = sync_channel::<[f32; 2]>(1120); 58 | 59 | let resampler = FftFixedInOut::::new( 60 | librespot::playback::SAMPLE_RATE as usize, 61 | songbird::constants::SAMPLE_RATE_RAW, 62 | 1024, 63 | 2, 64 | ) 65 | .unwrap(); 66 | 67 | let resampler_input_frames_needed = resampler.input_frames_max(); 68 | 69 | EmittedSink { 70 | sender: Arc::new(sender), 71 | receiver: Arc::new(Mutex::new(receiver)), 72 | input_buffer: Arc::new(Mutex::new(( 73 | Vec::with_capacity(resampler_input_frames_needed), 74 | Vec::with_capacity(resampler_input_frames_needed), 75 | ))), 76 | resampler: Arc::new(Mutex::new(resampler)), 77 | resampler_input_frames_needed, 78 | } 79 | } 80 | } 81 | 82 | impl audio_backend::Sink for EmittedSink { 83 | fn start(&mut self) -> SinkResult<()> { 84 | Ok(()) 85 | } 86 | 87 | fn stop(&mut self) -> SinkResult<()> { 88 | Ok(()) 89 | } 90 | 91 | fn write(&mut self, packet: AudioPacket, _converter: &mut Converter) -> SinkResult<()> { 92 | let frames_needed = self.resampler_input_frames_needed; 93 | let mut input_buffer = self.input_buffer.lock().unwrap(); 94 | 95 | let mut resampler = self.resampler.lock().unwrap(); 96 | 97 | let mut resampled_buffer = resampler.output_buffer_allocate(); 98 | 99 | for c in packet.samples().unwrap().chunks_exact(2) { 100 | input_buffer.0.push(c[0] as f32); 101 | input_buffer.1.push(c[1] as f32); 102 | if input_buffer.0.len() == frames_needed { 103 | resampler 104 | .process_into_buffer( 105 | &[ 106 | &input_buffer.0[0..frames_needed], 107 | &input_buffer.1[0..frames_needed], 108 | ], 109 | &mut resampled_buffer, 110 | None, 111 | ) 112 | .unwrap(); 113 | 114 | input_buffer.0.clear(); 115 | input_buffer.1.clear(); 116 | 117 | let sender = self.sender.clone(); 118 | 119 | for i in 0..resampled_buffer[0].len() { 120 | sender 121 | .send([resampled_buffer[0][i], resampled_buffer[1][i]]) 122 | .unwrap() 123 | } 124 | } 125 | } 126 | 127 | Ok(()) 128 | } 129 | } 130 | 131 | impl io::Read for EmittedSink { 132 | fn read(&mut self, buff: &mut [u8]) -> io::Result { 133 | let sample_size = mem::size_of::() * 2; 134 | 135 | if buff.len() < sample_size { 136 | return Err(io::Error::new( 137 | io::ErrorKind::InvalidInput, 138 | "EmittedSink does not support read buffer too small to guarantee \ 139 | holding one audio sample (8 bytes)", 140 | )); 141 | } 142 | 143 | let receiver = self.receiver.lock().unwrap(); 144 | 145 | let mut bytes_written = 0; 146 | while bytes_written + (sample_size - 1) < buff.len() { 147 | if bytes_written == 0 { 148 | // We can not return 0 bytes because songbird then thinks that the track has ended, 149 | // therefore block until at least one stereo data set can be returned. 150 | 151 | let sample = receiver.recv().unwrap(); 152 | LittleEndian::write_f32_into( 153 | &sample, 154 | &mut buff[bytes_written..(bytes_written + sample_size)], 155 | ); 156 | } else if let Ok(data) = receiver.try_recv() { 157 | LittleEndian::write_f32_into( 158 | &data, 159 | &mut buff[bytes_written..(bytes_written + sample_size)], 160 | ); 161 | } else { 162 | break; 163 | } 164 | bytes_written += sample_size; 165 | } 166 | 167 | Ok(bytes_written) 168 | } 169 | } 170 | 171 | impl io::Seek for EmittedSink { 172 | fn seek(&mut self, _pos: io::SeekFrom) -> io::Result { 173 | unreachable!() 174 | } 175 | } 176 | 177 | impl MediaSource for EmittedSink { 178 | fn is_seekable(&self) -> bool { 179 | false 180 | } 181 | 182 | fn byte_len(&self) -> Option { 183 | None 184 | } 185 | } 186 | 187 | impl Clone for EmittedSink { 188 | fn clone(&self) -> EmittedSink { 189 | EmittedSink { 190 | receiver: self.receiver.clone(), 191 | sender: self.sender.clone(), 192 | input_buffer: self.input_buffer.clone(), 193 | resampler: self.resampler.clone(), 194 | resampler_input_frames_needed: self.resampler_input_frames_needed, 195 | } 196 | } 197 | } 198 | 199 | pub struct SpotifyPlayerKey; 200 | 201 | impl TypeMapKey for SpotifyPlayerKey { 202 | type Value = Arc>; 203 | } 204 | 205 | impl SpotifyPlayer { 206 | pub async fn new( 207 | username: String, 208 | password: String, 209 | quality: Bitrate, 210 | cache_dir: Option, 211 | bot_autoplay: bool, 212 | device_name: String, 213 | ) -> SpotifyPlayer { 214 | let credentials = Credentials::with_password(username, password); 215 | 216 | let session_config = SessionConfig::default(); 217 | 218 | // 4 GB 219 | let mut cache_limit: u64 = 10; 220 | cache_limit = cache_limit.pow(9); 221 | cache_limit *= 4; 222 | 223 | let cache = Cache::new( 224 | cache_dir.clone(), 225 | cache_dir.clone(), 226 | cache_dir, 227 | Some(cache_limit), 228 | ) 229 | .ok(); 230 | 231 | let (session, _) = Session::connect(session_config, credentials, cache, false) 232 | .await 233 | .expect("Error creating session"); 234 | 235 | let player_config = PlayerConfig { 236 | bitrate: quality, 237 | ..Default::default() 238 | }; 239 | 240 | let emitted_sink = EmittedSink::new(); 241 | 242 | let cloned_sink = emitted_sink.clone(); 243 | 244 | let mixer = Box::new(SoftMixer::open(MixerConfig { 245 | volume_ctrl: VolumeCtrl::Linear, 246 | ..MixerConfig::default() 247 | })); 248 | 249 | let (_player, rx) = Player::new( 250 | player_config.clone(), 251 | session.clone(), 252 | mixer.get_soft_volume(), 253 | move || Box::new(cloned_sink), 254 | ); 255 | 256 | SpotifyPlayer { 257 | player_config, 258 | emitted_sink, 259 | session, 260 | spirc: None, 261 | event_channel: Some(Arc::new(tokio::sync::Mutex::new(rx))), 262 | mixer, 263 | bot_autoplay, 264 | device_name, 265 | } 266 | } 267 | 268 | pub async fn enable_connect(&mut self) { 269 | let config = ConnectConfig { 270 | name: self.device_name.clone(), 271 | device_type: DeviceType::AudioDongle, 272 | initial_volume: None, 273 | has_volume_ctrl: true, 274 | autoplay: self.bot_autoplay, 275 | }; 276 | 277 | let cloned_sink = self.emitted_sink.clone(); 278 | 279 | let (player, player_events) = Player::new( 280 | self.player_config.clone(), 281 | self.session.clone(), 282 | self.mixer.get_soft_volume(), 283 | move || Box::new(cloned_sink), 284 | ); 285 | 286 | let cloned_session = self.session.clone(); 287 | 288 | let (spirc, task) = Spirc::new(config, cloned_session, player, self.mixer.clone()); 289 | 290 | let handle = tokio::runtime::Handle::current(); 291 | handle.spawn(async { 292 | task.await; 293 | }); 294 | 295 | self.spirc = Some(Box::new(spirc)); 296 | 297 | let mut channel_lock = self.event_channel.as_ref().unwrap().lock().await; 298 | *channel_lock = player_events; 299 | } 300 | 301 | pub async fn disable_connect(&mut self) { 302 | if let Some(spirc) = self.spirc.as_ref() { 303 | spirc.shutdown(); 304 | 305 | self.event_channel.as_ref().unwrap().lock().await.close(); 306 | } 307 | } 308 | } 309 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | use std::process::exit; 3 | 4 | use lib::config::Config; 5 | use songbird::{input, SerenityInit}; 6 | 7 | mod lib { 8 | pub mod config; 9 | pub mod player; 10 | } 11 | use figment::error::Kind::MissingField; 12 | use lib::player::{SpotifyPlayer, SpotifyPlayerKey}; 13 | use librespot::core::mercury::MercuryError; 14 | use librespot::playback::config::Bitrate; 15 | use librespot::playback::player::PlayerEvent; 16 | use std::sync::Arc; 17 | use tokio::sync::Mutex; 18 | use tokio::time::{sleep, Duration}; 19 | 20 | use serenity::Client; 21 | 22 | use serenity::prelude::TypeMapKey; 23 | 24 | use serenity::{ 25 | async_trait, 26 | client::{Context, EventHandler}, 27 | framework::StandardFramework, 28 | model::{gateway, gateway::Ready, id, user, voice::VoiceState}, 29 | }; 30 | 31 | struct Handler; 32 | 33 | pub struct ConfigKey; 34 | impl TypeMapKey for ConfigKey { 35 | type Value = Config; 36 | } 37 | 38 | #[async_trait] 39 | impl EventHandler for Handler { 40 | async fn ready(&self, _ctx: Context, ready: Ready) { 41 | println!("Ready!"); 42 | println!("Invite me with https://discord.com/api/oauth2/authorize?client_id={}&permissions=36700160&scope=bot", ready.user.id); 43 | } 44 | 45 | async fn cache_ready(&self, ctx: Context, guilds: Vec) { 46 | let data = ctx.data.read().await; 47 | 48 | let player = data.get::().unwrap().clone(); 49 | let config = data.get::().unwrap().clone(); 50 | 51 | // Handle case when user is in VC when bot starts 52 | for guild_id in guilds { 53 | let guild = ctx 54 | .cache 55 | .guild(guild_id) 56 | .expect("Could not find guild in cache."); 57 | 58 | let channel_id = guild 59 | .voice_states 60 | .get(&config.discord_user_id.into()) 61 | .and_then(|voice_state| voice_state.channel_id); 62 | drop(guild); 63 | 64 | if channel_id.is_some() { 65 | // Enable casting 66 | player.lock().await.enable_connect().await; 67 | break; 68 | } 69 | } 70 | 71 | let c = ctx.clone(); 72 | 73 | // Handle Spotify events 74 | tokio::spawn(async move { 75 | loop { 76 | let channel = player.lock().await.event_channel.clone().unwrap(); 77 | let mut receiver = channel.lock().await; 78 | 79 | let event = match receiver.recv().await { 80 | Some(e) => e, 81 | None => { 82 | // Busy waiting bad but quick and easy 83 | sleep(Duration::from_millis(256)).await; 84 | continue; 85 | } 86 | }; 87 | 88 | match event { 89 | PlayerEvent::Stopped { .. } => { 90 | c.set_presence(None, user::OnlineStatus::Online).await; 91 | 92 | let manager = songbird::get(&c) 93 | .await 94 | .expect("Songbird Voice client placed in at initialization.") 95 | .clone(); 96 | 97 | for guild_id in c.cache.guilds() { 98 | let _ = manager.remove(guild_id).await; 99 | } 100 | } 101 | 102 | PlayerEvent::Started { .. } => { 103 | let manager = songbird::get(&c) 104 | .await 105 | .expect("Songbird Voice client placed in at initialization.") 106 | .clone(); 107 | 108 | // Search for guild and channel ids by user id 109 | let Some((guild_id, channel_id)) = 110 | c.cache.guilds().iter().find_map(|gid| { 111 | c.cache 112 | .guild(gid) 113 | .expect("Could not find guild in cache.") 114 | .voice_states 115 | .get(&config.discord_user_id.into()) 116 | .map(|state| (gid.to_owned(), state.channel_id.unwrap())) 117 | }) 118 | else { 119 | println!("Could not find user in VC."); 120 | continue; 121 | }; 122 | 123 | let _handler = manager.join(guild_id, channel_id).await; 124 | 125 | if let Some(handler_lock) = manager.get(guild_id) { 126 | let mut handler = handler_lock.lock().await; 127 | 128 | let mut decoder = input::codec::OpusDecoderState::new().unwrap(); 129 | decoder.allow_passthrough = false; 130 | 131 | let source = input::Input::new( 132 | true, 133 | input::reader::Reader::Extension(Box::new( 134 | player.lock().await.emitted_sink.clone(), 135 | )), 136 | input::codec::Codec::FloatPcm, 137 | input::Container::Raw, 138 | None, 139 | ); 140 | 141 | handler.set_bitrate(songbird::driver::Bitrate::Auto); 142 | 143 | handler.play_only_source(source); 144 | } else { 145 | println!("Could not fetch guild by ID."); 146 | } 147 | } 148 | 149 | PlayerEvent::Paused { .. } => { 150 | c.set_presence(None, user::OnlineStatus::Online).await; 151 | } 152 | 153 | PlayerEvent::Playing { track_id, .. } => { 154 | let track: Result = 155 | librespot::metadata::Metadata::get( 156 | &player.lock().await.session, 157 | track_id, 158 | ) 159 | .await; 160 | 161 | if let Ok(track) = track { 162 | let artist: Result = 163 | librespot::metadata::Metadata::get( 164 | &player.lock().await.session, 165 | *track.artists.first().unwrap(), 166 | ) 167 | .await; 168 | 169 | if let Ok(artist) = artist { 170 | let listening_to = format!("{}: {}", artist.name, track.name); 171 | 172 | c.set_presence( 173 | Some(gateway::Activity::listening(listening_to)), 174 | user::OnlineStatus::Online, 175 | ) 176 | .await; 177 | } 178 | } 179 | } 180 | 181 | _ => {} 182 | } 183 | } 184 | }); 185 | } 186 | 187 | async fn voice_state_update(&self, ctx: Context, old: Option, new: VoiceState) { 188 | let data = ctx.data.read().await; 189 | 190 | let config = data.get::().unwrap(); 191 | 192 | if new.user_id.to_string() != config.discord_user_id.to_string() { 193 | return; 194 | } 195 | 196 | let player = data.get::().unwrap(); 197 | 198 | // If user just connected 199 | if old.clone().is_none() { 200 | // Enable casting 201 | player.lock().await.enable_connect().await; 202 | return; 203 | } 204 | 205 | // If user disconnected 206 | if old.clone().unwrap().channel_id.is_some() && new.channel_id.is_none() { 207 | // Disable casting 208 | ctx.invisible().await; 209 | player.lock().await.disable_connect().await; 210 | 211 | // Disconnect 212 | let manager = songbird::get(&ctx) 213 | .await 214 | .expect("Songbird Voice client placed in at initialization.") 215 | .clone(); 216 | 217 | let _handler = manager.remove(new.guild_id.unwrap()).await; 218 | 219 | return; 220 | } 221 | 222 | // If user moved channels 223 | if old.clone().unwrap().channel_id.unwrap() != new.channel_id.unwrap() { 224 | let bot_id = ctx.cache.current_user_id(); 225 | 226 | // A bit hacky way to get old guild id because 227 | // its not present when switching voice channels 228 | // for the first time for some reason 229 | let old_guild_id = match old.clone().unwrap().guild_id { 230 | Some(gid) => gid, 231 | None => ctx 232 | .cache 233 | .guilds() 234 | .iter() 235 | .find(|x| { 236 | ctx.cache 237 | .guild(**x) 238 | .unwrap() 239 | .channels 240 | .iter() 241 | .any(|ch| ch.1.id() == new.channel_id.unwrap()) 242 | }) 243 | .unwrap() 244 | .to_owned(), 245 | }; 246 | 247 | let bot_channel = ctx 248 | .cache 249 | .guild(old_guild_id) 250 | .unwrap() 251 | .voice_states 252 | .get(&bot_id) 253 | .and_then(|voice_state| voice_state.channel_id); 254 | 255 | if Option::is_some(&bot_channel) { 256 | let manager = songbird::get(&ctx) 257 | .await 258 | .expect("Songbird Voice client placed in at initialization.") 259 | .clone(); 260 | 261 | if old_guild_id != new.guild_id.unwrap() { 262 | let _handler = manager.remove(old_guild_id).await; 263 | } else { 264 | let _handler = manager 265 | .join(new.guild_id.unwrap(), new.channel_id.unwrap()) 266 | .await; 267 | } 268 | } 269 | 270 | return; 271 | } 272 | } 273 | } 274 | 275 | #[tokio::main] 276 | async fn main() { 277 | tracing_subscriber::fmt::init(); 278 | 279 | let framework = StandardFramework::new(); 280 | 281 | let config = match Config::new() { 282 | Ok(config) => config, 283 | Err(error) => { 284 | println!("Couldn't read config"); 285 | if let MissingField(f) = error.kind { 286 | println!("Missing field: '{}'", f.to_uppercase()); 287 | } else { 288 | println!("Error: {:?}", error); 289 | exit(2) 290 | } 291 | exit(1) 292 | } 293 | }; 294 | 295 | let mut cache_dir = None; 296 | 297 | if let Ok(c) = env::var("CACHE_DIR") { 298 | cache_dir = Some(c); 299 | } 300 | 301 | let player = Arc::new(Mutex::new( 302 | SpotifyPlayer::new( 303 | config.spotify_username.clone(), 304 | config.spotify_password.clone(), 305 | Bitrate::Bitrate320, 306 | cache_dir, 307 | config.spotify_bot_autoplay, 308 | config.spotify_device_name.clone(), 309 | ) 310 | .await, 311 | )); 312 | 313 | let mut client = Client::builder( 314 | &config.discord_token, 315 | gateway::GatewayIntents::non_privileged(), 316 | ) 317 | .event_handler(Handler) 318 | .framework(framework) 319 | .type_map_insert::(player) 320 | .type_map_insert::(config) 321 | .register_songbird() 322 | .await 323 | .expect("Err creating client"); 324 | 325 | let _ = client 326 | .start() 327 | .await 328 | .map_err(|why| println!("Client ended: {:?}", why)); 329 | } 330 | --------------------------------------------------------------------------------