├── .dockerignore ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── build.rs ├── docker ├── Dockerfile ├── README.md └── docker-build.sh ├── src ├── lms.rs └── main.rs └── t └── test.t /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | .git -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | releases/ 3 | **/*.rs.bk 4 | .history 5 | client_id.txt 6 | 7 | t/data/ 8 | test-data.json 9 | .vscode 10 | .vstags 11 | xbuild.sh 12 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aes" 3 | version = "0.3.2" 4 | source = "registry+https://github.com/rust-lang/crates.io-index" 5 | dependencies = [ 6 | "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 8 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 9 | ] 10 | 11 | [[package]] 12 | name = "aes-ctr" 13 | version = "0.3.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | dependencies = [ 16 | "aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 17 | "aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 18 | "ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 19 | "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 20 | ] 21 | 22 | [[package]] 23 | name = "aes-soft" 24 | version = "0.3.3" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | dependencies = [ 27 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 28 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 29 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 30 | ] 31 | 32 | [[package]] 33 | name = "aesni" 34 | version = "0.6.0" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | dependencies = [ 37 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 38 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 40 | ] 41 | 42 | [[package]] 43 | name = "aho-corasick" 44 | version = "0.7.6" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | dependencies = [ 47 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 48 | ] 49 | 50 | [[package]] 51 | name = "arc-swap" 52 | version = "0.4.3" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | 55 | [[package]] 56 | name = "atty" 57 | version = "0.2.13" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | dependencies = [ 60 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 61 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 62 | ] 63 | 64 | [[package]] 65 | name = "autocfg" 66 | version = "0.1.7" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | 69 | [[package]] 70 | name = "backtrace" 71 | version = "0.3.40" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | dependencies = [ 74 | "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 78 | ] 79 | 80 | [[package]] 81 | name = "backtrace-sys" 82 | version = "0.1.32" 83 | source = "registry+https://github.com/rust-lang/crates.io-index" 84 | dependencies = [ 85 | "cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)", 86 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 87 | ] 88 | 89 | [[package]] 90 | name = "base64" 91 | version = "0.9.3" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | dependencies = [ 94 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 96 | ] 97 | 98 | [[package]] 99 | name = "base64" 100 | version = "0.10.1" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | dependencies = [ 103 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 104 | ] 105 | 106 | [[package]] 107 | name = "bit-set" 108 | version = "0.5.1" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | dependencies = [ 111 | "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 112 | ] 113 | 114 | [[package]] 115 | name = "bit-vec" 116 | version = "0.5.1" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | 119 | [[package]] 120 | name = "bitflags" 121 | version = "1.2.1" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | 124 | [[package]] 125 | name = "block-buffer" 126 | version = "0.7.3" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | dependencies = [ 129 | "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 130 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 131 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 132 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 133 | ] 134 | 135 | [[package]] 136 | name = "block-cipher-trait" 137 | version = "0.6.2" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | dependencies = [ 140 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 141 | ] 142 | 143 | [[package]] 144 | name = "block-modes" 145 | version = "0.3.3" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | dependencies = [ 148 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 149 | "block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 150 | ] 151 | 152 | [[package]] 153 | name = "block-padding" 154 | version = "0.1.5" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | dependencies = [ 157 | "byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 158 | ] 159 | 160 | [[package]] 161 | name = "byte-tools" 162 | version = "0.3.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | 165 | [[package]] 166 | name = "byteorder" 167 | version = "1.3.2" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | 170 | [[package]] 171 | name = "bytes" 172 | version = "0.4.12" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | dependencies = [ 175 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 176 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 177 | ] 178 | 179 | [[package]] 180 | name = "c2-chacha" 181 | version = "0.2.3" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | dependencies = [ 184 | "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 185 | ] 186 | 187 | [[package]] 188 | name = "cc" 189 | version = "1.0.47" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | 192 | [[package]] 193 | name = "cfg-if" 194 | version = "0.1.10" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | 197 | [[package]] 198 | name = "chrono" 199 | version = "0.4.9" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | dependencies = [ 202 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 203 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 205 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 206 | ] 207 | 208 | [[package]] 209 | name = "cloudabi" 210 | version = "0.0.3" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | dependencies = [ 213 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 214 | ] 215 | 216 | [[package]] 217 | name = "crossbeam-deque" 218 | version = "0.7.2" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | dependencies = [ 221 | "crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 223 | ] 224 | 225 | [[package]] 226 | name = "crossbeam-epoch" 227 | version = "0.8.0" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | dependencies = [ 230 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 231 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 232 | "crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 233 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 234 | "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", 235 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 236 | ] 237 | 238 | [[package]] 239 | name = "crossbeam-queue" 240 | version = "0.1.2" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | dependencies = [ 243 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 244 | ] 245 | 246 | [[package]] 247 | name = "crossbeam-utils" 248 | version = "0.6.6" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | dependencies = [ 251 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 252 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 253 | ] 254 | 255 | [[package]] 256 | name = "crossbeam-utils" 257 | version = "0.7.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | dependencies = [ 260 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 261 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 262 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 263 | ] 264 | 265 | [[package]] 266 | name = "crypto-mac" 267 | version = "0.7.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | dependencies = [ 270 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 271 | "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 272 | ] 273 | 274 | [[package]] 275 | name = "ctr" 276 | version = "0.3.2" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | dependencies = [ 279 | "block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 280 | "stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 281 | ] 282 | 283 | [[package]] 284 | name = "digest" 285 | version = "0.8.1" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | dependencies = [ 288 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 289 | ] 290 | 291 | [[package]] 292 | name = "dtoa" 293 | version = "0.4.4" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | 296 | [[package]] 297 | name = "env_logger" 298 | version = "0.6.2" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | dependencies = [ 301 | "atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", 302 | "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 303 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 304 | "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 305 | "termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", 306 | ] 307 | 308 | [[package]] 309 | name = "error-chain" 310 | version = "0.12.1" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | dependencies = [ 313 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 314 | ] 315 | 316 | [[package]] 317 | name = "failure" 318 | version = "0.1.6" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | dependencies = [ 321 | "backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)", 322 | "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 323 | ] 324 | 325 | [[package]] 326 | name = "failure_derive" 327 | version = "0.1.6" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | dependencies = [ 330 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 331 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 332 | "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 333 | "synstructure 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", 334 | ] 335 | 336 | [[package]] 337 | name = "fake-simd" 338 | version = "0.1.2" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | 341 | [[package]] 342 | name = "fnv" 343 | version = "1.0.6" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | 346 | [[package]] 347 | name = "fuchsia-cprng" 348 | version = "0.1.1" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | 351 | [[package]] 352 | name = "fuchsia-zircon" 353 | version = "0.3.3" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | dependencies = [ 356 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 357 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 358 | ] 359 | 360 | [[package]] 361 | name = "fuchsia-zircon-sys" 362 | version = "0.3.3" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | 365 | [[package]] 366 | name = "futures" 367 | version = "0.1.29" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | 370 | [[package]] 371 | name = "futures-cpupool" 372 | version = "0.1.8" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | dependencies = [ 375 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 376 | "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 377 | ] 378 | 379 | [[package]] 380 | name = "gcc" 381 | version = "0.3.55" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | 384 | [[package]] 385 | name = "generic-array" 386 | version = "0.12.3" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | dependencies = [ 389 | "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", 390 | ] 391 | 392 | [[package]] 393 | name = "getopts" 394 | version = "0.2.21" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | dependencies = [ 397 | "unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 398 | ] 399 | 400 | [[package]] 401 | name = "getrandom" 402 | version = "0.1.13" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | dependencies = [ 405 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 406 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 407 | "wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 408 | ] 409 | 410 | [[package]] 411 | name = "hermit-abi" 412 | version = "0.1.3" 413 | source = "registry+https://github.com/rust-lang/crates.io-index" 414 | dependencies = [ 415 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 416 | ] 417 | 418 | [[package]] 419 | name = "hex" 420 | version = "0.3.2" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | 423 | [[package]] 424 | name = "hmac" 425 | version = "0.7.1" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | dependencies = [ 428 | "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 429 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 430 | ] 431 | 432 | [[package]] 433 | name = "httparse" 434 | version = "1.3.4" 435 | source = "registry+https://github.com/rust-lang/crates.io-index" 436 | 437 | [[package]] 438 | name = "humantime" 439 | version = "1.3.0" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | dependencies = [ 442 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 443 | ] 444 | 445 | [[package]] 446 | name = "hyper" 447 | version = "0.11.27" 448 | source = "registry+https://github.com/rust-lang/crates.io-index" 449 | dependencies = [ 450 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 451 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 452 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 453 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 454 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 455 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 456 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 457 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 458 | "mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 459 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 460 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 461 | "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 462 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 463 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 467 | "unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 468 | "want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 469 | ] 470 | 471 | [[package]] 472 | name = "hyper-proxy" 473 | version = "0.4.1" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | dependencies = [ 476 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 477 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 478 | "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", 479 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 480 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 481 | ] 482 | 483 | [[package]] 484 | name = "idna" 485 | version = "0.1.5" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | dependencies = [ 488 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 489 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 490 | "unicode-normalization 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 491 | ] 492 | 493 | [[package]] 494 | name = "iovec" 495 | version = "0.1.4" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | dependencies = [ 498 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 499 | ] 500 | 501 | [[package]] 502 | name = "itoa" 503 | version = "0.3.4" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | 506 | [[package]] 507 | name = "itoa" 508 | version = "0.4.4" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | 511 | [[package]] 512 | name = "kernel32-sys" 513 | version = "0.2.2" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | dependencies = [ 516 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 517 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 518 | ] 519 | 520 | [[package]] 521 | name = "language-tags" 522 | version = "0.2.2" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | 525 | [[package]] 526 | name = "lazy_static" 527 | version = "1.4.0" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | 530 | [[package]] 531 | name = "lewton" 532 | version = "0.9.4" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | dependencies = [ 535 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 536 | "ogg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 537 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 538 | ] 539 | 540 | [[package]] 541 | name = "libc" 542 | version = "0.2.65" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | 545 | [[package]] 546 | name = "libmdns" 547 | version = "0.2.3" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | dependencies = [ 550 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 551 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 552 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 553 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 554 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 555 | "multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 556 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 557 | "nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 558 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 559 | "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 560 | "socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 561 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 562 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 563 | ] 564 | 565 | [[package]] 566 | name = "librespot" 567 | version = "0.1.0" 568 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 569 | dependencies = [ 570 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 571 | "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 572 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 573 | "getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 574 | "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 575 | "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", 576 | "librespot-audio 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 577 | "librespot-connect 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 578 | "librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 579 | "librespot-metadata 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 580 | "librespot-playback 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 581 | "librespot-protocol 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 582 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 583 | "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 584 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 585 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 586 | "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 587 | "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 588 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 589 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 590 | "tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 591 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 592 | ] 593 | 594 | [[package]] 595 | name = "librespot-audio" 596 | version = "0.1.0" 597 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 598 | dependencies = [ 599 | "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 600 | "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 601 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 602 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 603 | "lewton 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", 604 | "librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 605 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 606 | "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 607 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 608 | "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 609 | ] 610 | 611 | [[package]] 612 | name = "librespot-connect" 613 | version = "0.1.0" 614 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 615 | dependencies = [ 616 | "aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 617 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 618 | "block-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 619 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 620 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 621 | "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", 622 | "libmdns 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 623 | "librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 624 | "librespot-playback 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 625 | "librespot-protocol 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 626 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 627 | "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 628 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 629 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 630 | "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 631 | "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 632 | "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", 633 | "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 634 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 635 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 636 | ] 637 | 638 | [[package]] 639 | name = "librespot-core" 640 | version = "0.1.0" 641 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 642 | dependencies = [ 643 | "aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 644 | "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 645 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 646 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 647 | "error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", 648 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 649 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 650 | "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 651 | "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", 652 | "hyper-proxy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 653 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 654 | "librespot-protocol 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 655 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 656 | "num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 657 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 658 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 659 | "pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 660 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 661 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 662 | "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 663 | "serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 664 | "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", 665 | "sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 666 | "shannon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 667 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 668 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 669 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 670 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 671 | "uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", 672 | "vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 673 | ] 674 | 675 | [[package]] 676 | name = "librespot-metadata" 677 | version = "0.1.0" 678 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 679 | dependencies = [ 680 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 681 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 682 | "librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 683 | "librespot-protocol 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 684 | "linear-map 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 685 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 686 | ] 687 | 688 | [[package]] 689 | name = "librespot-playback" 690 | version = "0.1.0" 691 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 692 | dependencies = [ 693 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 694 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 695 | "librespot-audio 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 696 | "librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 697 | "librespot-metadata 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 698 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 699 | ] 700 | 701 | [[package]] 702 | name = "librespot-protocol" 703 | version = "0.1.0" 704 | source = "git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c#8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 705 | dependencies = [ 706 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 707 | "protobuf-codegen 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 708 | "protobuf-codegen-pure 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 709 | ] 710 | 711 | [[package]] 712 | name = "linear-map" 713 | version = "1.2.0" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | 716 | [[package]] 717 | name = "lock_api" 718 | version = "0.3.1" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | dependencies = [ 721 | "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 722 | ] 723 | 724 | [[package]] 725 | name = "log" 726 | version = "0.3.9" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | dependencies = [ 729 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 730 | ] 731 | 732 | [[package]] 733 | name = "log" 734 | version = "0.4.8" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | dependencies = [ 737 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 738 | ] 739 | 740 | [[package]] 741 | name = "matches" 742 | version = "0.1.8" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | 745 | [[package]] 746 | name = "maybe-uninit" 747 | version = "2.0.0" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | 750 | [[package]] 751 | name = "memchr" 752 | version = "2.2.1" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | 755 | [[package]] 756 | name = "memoffset" 757 | version = "0.5.3" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | dependencies = [ 760 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 761 | ] 762 | 763 | [[package]] 764 | name = "mime" 765 | version = "0.3.14" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | 768 | [[package]] 769 | name = "mio" 770 | version = "0.6.19" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | dependencies = [ 773 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 774 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 775 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 776 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 777 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 778 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 779 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 780 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 781 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 782 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 783 | ] 784 | 785 | [[package]] 786 | name = "mio-uds" 787 | version = "0.6.7" 788 | source = "registry+https://github.com/rust-lang/crates.io-index" 789 | dependencies = [ 790 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 791 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 792 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 793 | ] 794 | 795 | [[package]] 796 | name = "miow" 797 | version = "0.2.1" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | dependencies = [ 800 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 801 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 802 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 803 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 804 | ] 805 | 806 | [[package]] 807 | name = "multimap" 808 | version = "0.4.0" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | dependencies = [ 811 | "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 812 | ] 813 | 814 | [[package]] 815 | name = "net2" 816 | version = "0.2.33" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | dependencies = [ 819 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 820 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 821 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 822 | ] 823 | 824 | [[package]] 825 | name = "nix" 826 | version = "0.10.0" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | dependencies = [ 829 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 830 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 831 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 832 | "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", 833 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 834 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 835 | ] 836 | 837 | [[package]] 838 | name = "num-bigint" 839 | version = "0.2.3" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | dependencies = [ 842 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 843 | "num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 844 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 845 | ] 846 | 847 | [[package]] 848 | name = "num-integer" 849 | version = "0.1.41" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | dependencies = [ 852 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 853 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 854 | ] 855 | 856 | [[package]] 857 | name = "num-traits" 858 | version = "0.1.43" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | dependencies = [ 861 | "num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 862 | ] 863 | 864 | [[package]] 865 | name = "num-traits" 866 | version = "0.2.8" 867 | source = "registry+https://github.com/rust-lang/crates.io-index" 868 | dependencies = [ 869 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 870 | ] 871 | 872 | [[package]] 873 | name = "num_cpus" 874 | version = "1.11.0" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | dependencies = [ 877 | "hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 878 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 879 | ] 880 | 881 | [[package]] 882 | name = "ogg" 883 | version = "0.7.0" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | dependencies = [ 886 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 887 | ] 888 | 889 | [[package]] 890 | name = "opaque-debug" 891 | version = "0.2.3" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | 894 | [[package]] 895 | name = "parking_lot" 896 | version = "0.9.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | dependencies = [ 899 | "lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 900 | "parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 901 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 902 | ] 903 | 904 | [[package]] 905 | name = "parking_lot_core" 906 | version = "0.6.2" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | dependencies = [ 909 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 910 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 911 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 912 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 913 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 914 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 915 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 916 | ] 917 | 918 | [[package]] 919 | name = "pbkdf2" 920 | version = "0.3.0" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | dependencies = [ 923 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 924 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 925 | "crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 926 | "hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 927 | "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", 928 | "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 929 | "subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 930 | ] 931 | 932 | [[package]] 933 | name = "percent-encoding" 934 | version = "1.0.1" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | 937 | [[package]] 938 | name = "ppv-lite86" 939 | version = "0.2.6" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | 942 | [[package]] 943 | name = "proc-macro2" 944 | version = "1.0.6" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | dependencies = [ 947 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 948 | ] 949 | 950 | [[package]] 951 | name = "protobuf" 952 | version = "2.8.1" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | 955 | [[package]] 956 | name = "protobuf-codegen" 957 | version = "2.8.1" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | dependencies = [ 960 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 961 | ] 962 | 963 | [[package]] 964 | name = "protobuf-codegen-pure" 965 | version = "2.8.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | dependencies = [ 968 | "protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 969 | "protobuf-codegen 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 970 | ] 971 | 972 | [[package]] 973 | name = "quick-error" 974 | version = "1.2.2" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | 977 | [[package]] 978 | name = "quote" 979 | version = "1.0.2" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | dependencies = [ 982 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 983 | ] 984 | 985 | [[package]] 986 | name = "rand" 987 | version = "0.3.23" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | dependencies = [ 990 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 991 | "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 992 | ] 993 | 994 | [[package]] 995 | name = "rand" 996 | version = "0.4.6" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | dependencies = [ 999 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1000 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1001 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1002 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1003 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1004 | ] 1005 | 1006 | [[package]] 1007 | name = "rand" 1008 | version = "0.5.6" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | dependencies = [ 1011 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1012 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1013 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1014 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1015 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1016 | ] 1017 | 1018 | [[package]] 1019 | name = "rand" 1020 | version = "0.6.5" 1021 | source = "registry+https://github.com/rust-lang/crates.io-index" 1022 | dependencies = [ 1023 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1024 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1025 | "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1026 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1027 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1028 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1029 | "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1030 | "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1031 | "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1032 | "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1033 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "rand" 1038 | version = "0.7.2" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | dependencies = [ 1041 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1042 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1043 | "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1044 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1045 | "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "rand_chacha" 1050 | version = "0.1.1" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | dependencies = [ 1053 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1054 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1055 | ] 1056 | 1057 | [[package]] 1058 | name = "rand_chacha" 1059 | version = "0.2.1" 1060 | source = "registry+https://github.com/rust-lang/crates.io-index" 1061 | dependencies = [ 1062 | "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1063 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | ] 1065 | 1066 | [[package]] 1067 | name = "rand_core" 1068 | version = "0.3.1" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | dependencies = [ 1071 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "rand_core" 1076 | version = "0.4.2" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | 1079 | [[package]] 1080 | name = "rand_core" 1081 | version = "0.5.1" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | dependencies = [ 1084 | "getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "rand_hc" 1089 | version = "0.1.0" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | dependencies = [ 1092 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "rand_hc" 1097 | version = "0.2.0" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | dependencies = [ 1100 | "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "rand_isaac" 1105 | version = "0.1.1" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | dependencies = [ 1108 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "rand_jitter" 1113 | version = "0.1.4" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | dependencies = [ 1116 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1117 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1118 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "rand_os" 1123 | version = "0.1.3" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | dependencies = [ 1126 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1127 | "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1128 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1129 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1130 | "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1131 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "rand_pcg" 1136 | version = "0.1.2" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | dependencies = [ 1139 | "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1140 | "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1141 | ] 1142 | 1143 | [[package]] 1144 | name = "rand_xorshift" 1145 | version = "0.1.1" 1146 | source = "registry+https://github.com/rust-lang/crates.io-index" 1147 | dependencies = [ 1148 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "rdrand" 1153 | version = "0.4.0" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | dependencies = [ 1156 | "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "redox_syscall" 1161 | version = "0.1.56" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | 1164 | [[package]] 1165 | name = "regex" 1166 | version = "1.3.1" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | dependencies = [ 1169 | "aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 1170 | "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1171 | "regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)", 1172 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1173 | ] 1174 | 1175 | [[package]] 1176 | name = "regex-syntax" 1177 | version = "0.6.12" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | 1180 | [[package]] 1181 | name = "relay" 1182 | version = "0.1.1" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | dependencies = [ 1185 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "remove_dir_all" 1190 | version = "0.5.2" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | dependencies = [ 1193 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1194 | ] 1195 | 1196 | [[package]] 1197 | name = "rpassword" 1198 | version = "3.0.2" 1199 | source = "registry+https://github.com/rust-lang/crates.io-index" 1200 | dependencies = [ 1201 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1202 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1203 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "rust-crypto" 1208 | version = "0.2.36" 1209 | source = "git+https://github.com/awmath/rust-crypto.git?branch=avx2#394c247254dbe2ac5d44483232cf335d10cf0260" 1210 | dependencies = [ 1211 | "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", 1214 | "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", 1215 | "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "rust-crypto" 1220 | version = "0.2.36" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | replace = "rust-crypto 0.2.36 (git+https://github.com/awmath/rust-crypto.git?branch=avx2)" 1223 | 1224 | [[package]] 1225 | name = "rustc-demangle" 1226 | version = "0.1.16" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | 1229 | [[package]] 1230 | name = "rustc-serialize" 1231 | version = "0.3.24" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | 1234 | [[package]] 1235 | name = "rustc_version" 1236 | version = "0.2.3" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | dependencies = [ 1239 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1240 | ] 1241 | 1242 | [[package]] 1243 | name = "ryu" 1244 | version = "1.0.2" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | 1247 | [[package]] 1248 | name = "safemem" 1249 | version = "0.3.3" 1250 | source = "registry+https://github.com/rust-lang/crates.io-index" 1251 | 1252 | [[package]] 1253 | name = "scoped-tls" 1254 | version = "0.1.2" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | 1257 | [[package]] 1258 | name = "scopeguard" 1259 | version = "1.0.0" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | 1262 | [[package]] 1263 | name = "semver" 1264 | version = "0.9.0" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | dependencies = [ 1267 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "semver-parser" 1272 | version = "0.7.0" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | 1275 | [[package]] 1276 | name = "serde" 1277 | version = "0.9.15" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | 1280 | [[package]] 1281 | name = "serde" 1282 | version = "1.0.102" 1283 | source = "registry+https://github.com/rust-lang/crates.io-index" 1284 | 1285 | [[package]] 1286 | name = "serde_derive" 1287 | version = "1.0.102" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | dependencies = [ 1290 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1291 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1292 | "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "serde_json" 1297 | version = "0.9.10" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | dependencies = [ 1300 | "dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 1301 | "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 1302 | "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", 1303 | "serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "serde_json" 1308 | version = "1.0.41" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | dependencies = [ 1311 | "itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", 1312 | "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1313 | "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", 1314 | ] 1315 | 1316 | [[package]] 1317 | name = "sha-1" 1318 | version = "0.8.1" 1319 | source = "registry+https://github.com/rust-lang/crates.io-index" 1320 | dependencies = [ 1321 | "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1322 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1323 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1324 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1325 | ] 1326 | 1327 | [[package]] 1328 | name = "sha2" 1329 | version = "0.8.0" 1330 | source = "registry+https://github.com/rust-lang/crates.io-index" 1331 | dependencies = [ 1332 | "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 1333 | "digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1334 | "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1335 | "opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "shannon" 1340 | version = "0.2.0" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | dependencies = [ 1343 | "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1344 | ] 1345 | 1346 | [[package]] 1347 | name = "signal-hook" 1348 | version = "0.1.11" 1349 | source = "registry+https://github.com/rust-lang/crates.io-index" 1350 | dependencies = [ 1351 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1352 | "signal-hook-registry 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "signal-hook-registry" 1357 | version = "1.1.1" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | dependencies = [ 1360 | "arc-swap 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1361 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1362 | ] 1363 | 1364 | [[package]] 1365 | name = "slab" 1366 | version = "0.3.0" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | 1369 | [[package]] 1370 | name = "slab" 1371 | version = "0.4.2" 1372 | source = "registry+https://github.com/rust-lang/crates.io-index" 1373 | 1374 | [[package]] 1375 | name = "smallvec" 1376 | version = "0.2.1" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | 1379 | [[package]] 1380 | name = "smallvec" 1381 | version = "0.6.13" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | dependencies = [ 1384 | "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "socket2" 1389 | version = "0.2.4" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | dependencies = [ 1392 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1393 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1394 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1395 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1397 | ] 1398 | 1399 | [[package]] 1400 | name = "spotty" 1401 | version = "0.35.0" 1402 | dependencies = [ 1403 | "env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 1404 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1405 | "getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)", 1406 | "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", 1407 | "librespot 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)", 1408 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1409 | "rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1410 | "rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", 1411 | "serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)", 1412 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 1413 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1414 | "tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "stream-cipher" 1419 | version = "0.3.2" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | dependencies = [ 1422 | "generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "subtle" 1427 | version = "1.0.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | 1430 | [[package]] 1431 | name = "syn" 1432 | version = "1.0.8" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | dependencies = [ 1435 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1436 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1437 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1438 | ] 1439 | 1440 | [[package]] 1441 | name = "synstructure" 1442 | version = "0.12.2" 1443 | source = "registry+https://github.com/rust-lang/crates.io-index" 1444 | dependencies = [ 1445 | "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1446 | "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1447 | "syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", 1448 | "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1449 | ] 1450 | 1451 | [[package]] 1452 | name = "take" 1453 | version = "0.1.0" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | 1456 | [[package]] 1457 | name = "tempfile" 1458 | version = "3.1.0" 1459 | source = "registry+https://github.com/rust-lang/crates.io-index" 1460 | dependencies = [ 1461 | "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1462 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1463 | "rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1464 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1465 | "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 1466 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1467 | ] 1468 | 1469 | [[package]] 1470 | name = "termcolor" 1471 | version = "1.0.5" 1472 | source = "registry+https://github.com/rust-lang/crates.io-index" 1473 | dependencies = [ 1474 | "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1475 | ] 1476 | 1477 | [[package]] 1478 | name = "thread_local" 1479 | version = "0.3.6" 1480 | source = "registry+https://github.com/rust-lang/crates.io-index" 1481 | dependencies = [ 1482 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "time" 1487 | version = "0.1.42" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | dependencies = [ 1490 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1491 | "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", 1492 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1493 | ] 1494 | 1495 | [[package]] 1496 | name = "tokio" 1497 | version = "0.1.22" 1498 | source = "registry+https://github.com/rust-lang/crates.io-index" 1499 | dependencies = [ 1500 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1501 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1502 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1503 | "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 1504 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1505 | "tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1506 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1507 | "tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1508 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1509 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1510 | "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1511 | "tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1512 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1513 | "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1514 | "tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1515 | "tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", 1516 | ] 1517 | 1518 | [[package]] 1519 | name = "tokio-codec" 1520 | version = "0.1.1" 1521 | source = "registry+https://github.com/rust-lang/crates.io-index" 1522 | dependencies = [ 1523 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1524 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1525 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "tokio-core" 1530 | version = "0.1.17" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | dependencies = [ 1533 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1534 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1535 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1536 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1537 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1538 | "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1539 | "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", 1540 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1541 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1542 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1543 | "tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1544 | ] 1545 | 1546 | [[package]] 1547 | name = "tokio-current-thread" 1548 | version = "0.1.6" 1549 | source = "registry+https://github.com/rust-lang/crates.io-index" 1550 | dependencies = [ 1551 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1552 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "tokio-executor" 1557 | version = "0.1.8" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | dependencies = [ 1560 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1561 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "tokio-fs" 1566 | version = "0.1.6" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | dependencies = [ 1569 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1570 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1571 | "tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1572 | ] 1573 | 1574 | [[package]] 1575 | name = "tokio-io" 1576 | version = "0.1.12" 1577 | source = "registry+https://github.com/rust-lang/crates.io-index" 1578 | dependencies = [ 1579 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1580 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1581 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "tokio-proto" 1586 | version = "0.1.1" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | dependencies = [ 1589 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1590 | "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", 1591 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 1592 | "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", 1593 | "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1594 | "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1595 | "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1596 | "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", 1597 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1598 | "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1599 | ] 1600 | 1601 | [[package]] 1602 | name = "tokio-reactor" 1603 | version = "0.1.10" 1604 | source = "registry+https://github.com/rust-lang/crates.io-index" 1605 | dependencies = [ 1606 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1607 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1608 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1609 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1610 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1611 | "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 1612 | "parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1613 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1614 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1615 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1616 | "tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1617 | ] 1618 | 1619 | [[package]] 1620 | name = "tokio-service" 1621 | version = "0.1.0" 1622 | source = "registry+https://github.com/rust-lang/crates.io-index" 1623 | dependencies = [ 1624 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1625 | ] 1626 | 1627 | [[package]] 1628 | name = "tokio-signal" 1629 | version = "0.2.7" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | dependencies = [ 1632 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1633 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1634 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1635 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1636 | "signal-hook 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 1637 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1638 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1639 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1640 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1641 | ] 1642 | 1643 | [[package]] 1644 | name = "tokio-sync" 1645 | version = "0.1.7" 1646 | source = "registry+https://github.com/rust-lang/crates.io-index" 1647 | dependencies = [ 1648 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1649 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "tokio-tcp" 1654 | version = "0.1.3" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | dependencies = [ 1657 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1658 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1659 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1660 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1661 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1662 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "tokio-threadpool" 1667 | version = "0.1.16" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | dependencies = [ 1670 | "crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1671 | "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1672 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1673 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1674 | "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1675 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1676 | "num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 1677 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1678 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1679 | ] 1680 | 1681 | [[package]] 1682 | name = "tokio-timer" 1683 | version = "0.2.11" 1684 | source = "registry+https://github.com/rust-lang/crates.io-index" 1685 | dependencies = [ 1686 | "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", 1687 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1688 | "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1689 | "tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1690 | ] 1691 | 1692 | [[package]] 1693 | name = "tokio-udp" 1694 | version = "0.1.5" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | dependencies = [ 1697 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1698 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1699 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1700 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1701 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1702 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1703 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "tokio-uds" 1708 | version = "0.2.5" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | dependencies = [ 1711 | "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", 1712 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1713 | "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1714 | "libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)", 1715 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1716 | "mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)", 1717 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1718 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1719 | "tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", 1720 | "tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1721 | ] 1722 | 1723 | [[package]] 1724 | name = "try-lock" 1725 | version = "0.1.0" 1726 | source = "registry+https://github.com/rust-lang/crates.io-index" 1727 | 1728 | [[package]] 1729 | name = "typenum" 1730 | version = "1.11.2" 1731 | source = "registry+https://github.com/rust-lang/crates.io-index" 1732 | 1733 | [[package]] 1734 | name = "unicase" 1735 | version = "2.5.1" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | dependencies = [ 1738 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "unicode-bidi" 1743 | version = "0.3.4" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | dependencies = [ 1746 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1747 | ] 1748 | 1749 | [[package]] 1750 | name = "unicode-normalization" 1751 | version = "0.1.9" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | dependencies = [ 1754 | "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "unicode-width" 1759 | version = "0.1.6" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | 1762 | [[package]] 1763 | name = "unicode-xid" 1764 | version = "0.2.0" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | 1767 | [[package]] 1768 | name = "url" 1769 | version = "1.7.2" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | dependencies = [ 1772 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1773 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 1774 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1775 | ] 1776 | 1777 | [[package]] 1778 | name = "uuid" 1779 | version = "0.7.4" 1780 | source = "registry+https://github.com/rust-lang/crates.io-index" 1781 | dependencies = [ 1782 | "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "vergen" 1787 | version = "3.0.4" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | dependencies = [ 1790 | "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1791 | "chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 1792 | "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1793 | ] 1794 | 1795 | [[package]] 1796 | name = "version_check" 1797 | version = "0.1.5" 1798 | source = "registry+https://github.com/rust-lang/crates.io-index" 1799 | 1800 | [[package]] 1801 | name = "void" 1802 | version = "1.0.2" 1803 | source = "registry+https://github.com/rust-lang/crates.io-index" 1804 | 1805 | [[package]] 1806 | name = "want" 1807 | version = "0.0.4" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | dependencies = [ 1810 | "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", 1811 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", 1812 | "try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "wasi" 1817 | version = "0.7.0" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | 1820 | [[package]] 1821 | name = "winapi" 1822 | version = "0.2.8" 1823 | source = "registry+https://github.com/rust-lang/crates.io-index" 1824 | 1825 | [[package]] 1826 | name = "winapi" 1827 | version = "0.3.8" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | dependencies = [ 1830 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1831 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1832 | ] 1833 | 1834 | [[package]] 1835 | name = "winapi-build" 1836 | version = "0.1.1" 1837 | source = "registry+https://github.com/rust-lang/crates.io-index" 1838 | 1839 | [[package]] 1840 | name = "winapi-i686-pc-windows-gnu" 1841 | version = "0.4.0" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | 1844 | [[package]] 1845 | name = "winapi-util" 1846 | version = "0.1.2" 1847 | source = "registry+https://github.com/rust-lang/crates.io-index" 1848 | dependencies = [ 1849 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1850 | ] 1851 | 1852 | [[package]] 1853 | name = "winapi-x86_64-pc-windows-gnu" 1854 | version = "0.4.0" 1855 | source = "registry+https://github.com/rust-lang/crates.io-index" 1856 | 1857 | [[package]] 1858 | name = "wincolor" 1859 | version = "1.0.2" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | dependencies = [ 1862 | "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1863 | "winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "ws2_32-sys" 1868 | version = "0.2.1" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | dependencies = [ 1871 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1872 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1873 | ] 1874 | 1875 | [metadata] 1876 | "checksum aes 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "54eb1d8fe354e5fc611daf4f2ea97dd45a765f4f1e4512306ec183ae2e8f20c9" 1877 | "checksum aes-ctr 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d2e5b0458ea3beae0d1d8c0f3946564f8e10f90646cf78c06b4351052058d1ee" 1878 | "checksum aes-soft 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd7e7ae3f9a1fb5c03b389fc6bb9a51400d0c13053f0dca698c832bfd893a0d" 1879 | "checksum aesni 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2f70a6b5f971e473091ab7cfb5ffac6cde81666c4556751d8d5620ead8abf100" 1880 | "checksum aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "58fb5e95d83b38284460a5fda7d6470aa0b8844d283a0b614b8535e880800d2d" 1881 | "checksum arc-swap 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f1a1eca3195b729bbd64e292ef2f5fff6b1c28504fed762ce2b1013dde4d8e92" 1882 | "checksum atty 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "1803c647a3ec87095e7ae7acfca019e98de5ec9a7d01343f611cf3152ed71a90" 1883 | "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" 1884 | "checksum backtrace 0.3.40 (registry+https://github.com/rust-lang/crates.io-index)" = "924c76597f0d9ca25d762c25a4d369d51267536465dc5064bdf0eb073ed477ea" 1885 | "checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" 1886 | "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" 1887 | "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" 1888 | "checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" 1889 | "checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" 1890 | "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 1891 | "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" 1892 | "checksum block-cipher-trait 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1c924d49bd09e7c06003acda26cd9742e796e34282ec6c1189404dee0c1f4774" 1893 | "checksum block-modes 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "31aa8410095e39fdb732909fb5730a48d5bd7c2e3cd76bd1b07b3dbea130c529" 1894 | "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" 1895 | "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" 1896 | "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" 1897 | "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" 1898 | "checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" 1899 | "checksum cc 1.0.47 (registry+https://github.com/rust-lang/crates.io-index)" = "aa87058dce70a3ff5621797f1506cb837edd02ac4c0ae642b4542dce802908b8" 1900 | "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 1901 | "checksum chrono 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e8493056968583b0193c1bb04d6f7684586f3726992d6c573261941a895dbd68" 1902 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 1903 | "checksum crossbeam-deque 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca" 1904 | "checksum crossbeam-epoch 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac" 1905 | "checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" 1906 | "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" 1907 | "checksum crossbeam-utils 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4" 1908 | "checksum crypto-mac 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" 1909 | "checksum ctr 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "022cd691704491df67d25d006fe8eca083098253c4d43516c2206479c58c6736" 1910 | "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" 1911 | "checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e" 1912 | "checksum env_logger 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" 1913 | "checksum error-chain 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ab49e9dcb602294bc42f9a7dfc9bc6e936fca4418ea300dbfb84fe16de0b7d9" 1914 | "checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" 1915 | "checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" 1916 | "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" 1917 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 1918 | "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" 1919 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 1920 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 1921 | "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" 1922 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 1923 | "checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" 1924 | "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" 1925 | "checksum getopts 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)" = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5" 1926 | "checksum getrandom 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e7db7ca94ed4cd01190ceee0d8a8052f08a247aa1b469a7f68c6a3b71afcf407" 1927 | "checksum hermit-abi 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "307c3c9f937f38e3534b1d6447ecf090cafcc9744e4a6360e8b037b2cf5af120" 1928 | "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" 1929 | "checksum hmac 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5dcb5e64cda4c23119ab41ba960d1e170a774c8e4b9d9e6a9bc18aabf5e59695" 1930 | "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" 1931 | "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" 1932 | "checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" 1933 | "checksum hyper-proxy 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44f0925de2747e481e6e477dd212c25e8f745567f02f6182e04d27b97c3fbece" 1934 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 1935 | "checksum iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 1936 | "checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" 1937 | "checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f" 1938 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1939 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 1940 | "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1941 | "checksum lewton 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8d542c1a317036c45c2aa1cf10cc9d403ca91eb2d333ef1a4917e5cb10628bd0" 1942 | "checksum libc 0.2.65 (registry+https://github.com/rust-lang/crates.io-index)" = "1a31a0627fdf1f6a39ec0dd577e101440b7db22672c0901fe00a9a6fbb5c24e8" 1943 | "checksum libmdns 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "10a5de2d38a254122ddb711aa0a5d48ffc501efe7cba4be7ea531b80a274bc0d" 1944 | "checksum librespot 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1945 | "checksum librespot-audio 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1946 | "checksum librespot-connect 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1947 | "checksum librespot-core 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1948 | "checksum librespot-metadata 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1949 | "checksum librespot-playback 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1950 | "checksum librespot-protocol 0.1.0 (git+https://github.com/michaelherger/librespot.git?rev=8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c)" = "" 1951 | "checksum linear-map 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bfae20f6b19ad527b550c223fddc3077a547fc70cda94b9b566575423fd303ee" 1952 | "checksum lock_api 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f8912e782533a93a167888781b836336a6ca5da6175c05944c86cf28c31104dc" 1953 | "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" 1954 | "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" 1955 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1956 | "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" 1957 | "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" 1958 | "checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" 1959 | "checksum mime 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "dd1d63acd1b78403cc0c325605908475dd9b9a3acbf65ed8bcab97e27014afcf" 1960 | "checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23" 1961 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 1962 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 1963 | "checksum multimap 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2eb04b9f127583ed176e163fb9ec6f3e793b87e21deedd5734a69386a18a0151" 1964 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 1965 | "checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" 1966 | "checksum num-bigint 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f9c3f34cdd24f334cb265d9bf8bfa8a241920d026916785747a92f0e55541a1a" 1967 | "checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09" 1968 | "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" 1969 | "checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32" 1970 | "checksum num_cpus 1.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "155394f924cdddf08149da25bfb932d226b4a593ca7468b08191ff6335941af5" 1971 | "checksum ogg 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d79f1db9148be9d0e174bb3ac890f6030fcb1ed947267c5a91ee4c91b5a91e15" 1972 | "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" 1973 | "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" 1974 | "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" 1975 | "checksum pbkdf2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "006c038a43a45995a9670da19e67600114740e8511d4333bf97a56e66a7542d9" 1976 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 1977 | "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" 1978 | "checksum proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9c9e470a8dc4aeae2dee2f335e8f533e2d4b347e1434e5671afc49b054592f27" 1979 | "checksum protobuf 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "40361836defdd5871ff7e84096c6f6444af7fc157f8ef1789f54f147687caa20" 1980 | "checksum protobuf-codegen 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "12c6abd78435445fc86898ebbd0521a68438063d4a73e23527b7134e6bf58b4a" 1981 | "checksum protobuf-codegen-pure 2.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c1646acda5319f5b28b0bff4a484324df43ddae2c0f5a3f3e63c0b26095cd600" 1982 | "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" 1983 | "checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" 1984 | "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" 1985 | "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" 1986 | "checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" 1987 | "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" 1988 | "checksum rand 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae1b169243eaf61759b8475a998f0a385e42042370f3a7dbaf35246eacc8412" 1989 | "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" 1990 | "checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" 1991 | "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" 1992 | "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" 1993 | "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1994 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 1995 | "checksum rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1996 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 1997 | "checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" 1998 | "checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" 1999 | "checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" 2000 | "checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" 2001 | "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" 2002 | "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" 2003 | "checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" 2004 | "checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" 2005 | "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" 2006 | "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" 2007 | "checksum rpassword 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c34fa7bcae7fca3c8471e8417088bbc3ad9af8066b0ecf4f3c0d98a0d772716e" 2008 | "checksum rust-crypto 0.2.36 (git+https://github.com/awmath/rust-crypto.git?branch=avx2)" = "" 2009 | "checksum rust-crypto 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f76d05d3993fd5f4af9434e8e436db163a12a9d40e1a58a726f27a01dfd12a2a" 2010 | "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" 2011 | "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" 2012 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 2013 | "checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" 2014 | "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 2015 | "checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" 2016 | "checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" 2017 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 2018 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 2019 | "checksum serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)" = "34b623917345a631dc9608d5194cc206b3fe6c3554cd1c75b937e55e285254af" 2020 | "checksum serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4b39bd9b0b087684013a792c59e3e07a46a01d2322518d8a1104641a0b1be0" 2021 | "checksum serde_derive 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)" = "ca13fc1a832f793322228923fbb3aba9f3f44444898f835d31ad1b74fa0a2bf8" 2022 | "checksum serde_json 0.9.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ad8bcf487be7d2e15d3d543f04312de991d631cfe1b43ea0ade69e6a8a5b16a1" 2023 | "checksum serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)" = "2f72eb2a68a7dc3f9a691bfda9305a1c017a6215e5a4545c258500d2099a37c2" 2024 | "checksum sha-1 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23962131a91661d643c98940b20fcaffe62d776a823247be80a48fcb8b6fce68" 2025 | "checksum sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b4d8bfd0e469f417657573d8451fb33d16cfe0989359b93baf3a1ffc639543d" 2026 | "checksum shannon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7ea5b41c9427b56caa7b808cb548a04fb50bb5b9e98590b53f28064ff4174561" 2027 | "checksum signal-hook 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cb543aecec4ba8b867f41284729ddfdb7e8fcd70ec3d7d37fca3007a4b53675f" 2028 | "checksum signal-hook-registry 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1797d48f38f91643908bb14e35e79928f9f4b3cefb2420a564dde0991b4358dc" 2029 | "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" 2030 | "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 2031 | "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" 2032 | "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" 2033 | "checksum socket2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b4896961171cd3317c7e9603d88f379f8c6e45342212235d356496680c68fd" 2034 | "checksum stream-cipher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" 2035 | "checksum subtle 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" 2036 | "checksum syn 1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "661641ea2aa15845cddeb97dad000d22070bb5c1fb456b96c1cba883ec691e92" 2037 | "checksum synstructure 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "575be94ccb86e8da37efb894a87e2b660be299b41d8ef347f9d6d79fbe61b1ba" 2038 | "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" 2039 | "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" 2040 | "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" 2041 | "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 2042 | "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" 2043 | "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" 2044 | "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" 2045 | "checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" 2046 | "checksum tokio-current-thread 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "d16217cad7f1b840c5a97dfb3c43b0c871fef423a6e8d2118c604e843662a443" 2047 | "checksum tokio-executor 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0f27ee0e6db01c5f0b2973824547ce7e637b2ed79b891a9677b0de9bd532b6ac" 2048 | "checksum tokio-fs 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "3fe6dc22b08d6993916647d108a1a7d15b9cd29c4f4496c62b92c45b5041b7af" 2049 | "checksum tokio-io 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5090db468dad16e1a7a54c8c67280c5e4b544f3d3e018f0b913b400261f85926" 2050 | "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" 2051 | "checksum tokio-reactor 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "c56391be9805bc80163151c0b9e5164ee64f4b0200962c346fea12773158f22d" 2052 | "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" 2053 | "checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" 2054 | "checksum tokio-sync 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d06554cce1ae4a50f42fba8023918afa931413aded705b560e29600ccf7c6d76" 2055 | "checksum tokio-tcp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1d14b10654be682ac43efee27401d792507e30fd8d26389e1da3b185de2e4119" 2056 | "checksum tokio-threadpool 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2bd2c6a3885302581f4401c82af70d792bb9df1700e7437b0aeb4ada94d5388c" 2057 | "checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e" 2058 | "checksum tokio-udp 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f02298505547f73e60f568359ef0d016d5acd6e830ab9bc7c4a5b3403440121b" 2059 | "checksum tokio-uds 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "037ffc3ba0e12a0ab4aca92e5234e0dedeb48fddf6ccd260f1f150a36a9f2445" 2060 | "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" 2061 | "checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" 2062 | "checksum unicase 2.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2e2e6bd1e59e56598518beb94fd6db628ded570326f0a98c679a304bd9f00150" 2063 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 2064 | "checksum unicode-normalization 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "09c8070a9942f5e7cfccd93f490fdebd230ee3c3c9f107cb25bad5351ef671cf" 2065 | "checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20" 2066 | "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" 2067 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 2068 | "checksum uuid 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" 2069 | "checksum vergen 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6aba5e34f93dc7051dfad05b98a18e9156f27e7b431fe1d2398cb6061c0a1dba" 2070 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 2071 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 2072 | "checksum want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a05d9d966753fa4b5c8db73fcab5eed4549cfe0e1e4e66911e5564a0085c35d1" 2073 | "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" 2074 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 2075 | "checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" 2076 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 2077 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2078 | "checksum winapi-util 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7168bab6e1daee33b4557efd0e95d5ca70a03706d39fa5f3fe7a236f584b03c9" 2079 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2080 | "checksum wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "96f5016b18804d24db43cebf3c77269e7569b8954a8464501c216cc5e070eaa9" 2081 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2082 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "spotty" 3 | version = "0.35.0" 4 | authors = ["Michael Herger "] 5 | 6 | [[bin]] 7 | name = "spotty" 8 | path = "src/main.rs" 9 | doc = false 10 | 11 | [dependencies] 12 | env_logger = "0.6" 13 | hyper = "0.11" 14 | rust-crypto = "0.2.36" 15 | futures = "0.1" 16 | getopts = "0.2" 17 | log = "0.4" 18 | rpassword = "3.0" 19 | serde_json = "0.9.5" 20 | tokio-core = "0.1" 21 | tokio-io = "0.1" 22 | tokio-signal = "0.2" 23 | 24 | [dependencies.librespot] 25 | git = "https://github.com/michaelherger/librespot.git" 26 | rev = "8c2bd4e0e2323ee1f835d28a6aa9ede700e7497c" 27 | #path = "../librespot" 28 | default-features = false 29 | # enable the following for macOS <= 10.9 compatibility 30 | #features = ["with-tremor","with-lewton"] 31 | 32 | [replace] 33 | "rust-crypto:0.2.36" = { git = "https://github.com/awmath/rust-crypto.git", branch = "avx2" } 34 | 35 | [profile.release] 36 | lto = true 37 | panic = 'abort' 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Paul Lietar 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spotty 2 | 3 | ## This repository is discontinued 4 | 5 | :exclamation: ***Please note that this repository is no longer maintained***. I continue development of the `spotty` helper application as a fork of [librespot](https://github.com/librespot-org/librespot). Head over to [https://github.com/michaelherger/librespot](https://github.com/michaelherger/librespot) and check out the `spotty` branch. :exclamation: 6 | 7 | Feel free to continue reading... but the below information is outdated and obsolete. 8 | 9 | ## Introduction 10 | 11 | *spotty* is an open source client application for Spotify. It's based on and using 12 | [librespot](https://github.com/librespot-org/librespot). It basically is a stripped 13 | down and slightly customized version of the librespot sample application. 14 | 15 | *spotty* has been tweaked to enable interaction with the [Logitech Media Server](https://github.com/Logitech/slimserver). 16 | 17 | * allow piping of a single track's audio data to LMS' transcoding framework (`--single-track`) 18 | * optionally start stream from given position in seconds (`--start-position 123`) 19 | * tell spotty in daemon mode how to notify LMS about state changes (`--lms {ip address}` and `--player-mac {MAC address}`) 20 | * get a token to be used with the [Spotify Web API](https://developer.spotify.com/web-api/) (`--get-token`) using a given client-id and scope (`--client-id abcd-...`, `--scope ...`) 21 | 22 | In order to enable all these features it uses a slightly [customized librespot](https://github.com/michaelherger/librespot/tree/spotty) to be found on my GitHub account. 23 | 24 | ## Disclaimer 25 | Using this code to connect to Spotify's API is probably forbidden by them. 26 | Use at your own risk. 27 | 28 | ## License 29 | Everything in this repository is licensed under the MIT license. 30 | 31 | -------------------------------------------------------------------------------- /build.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | use std::fs::File; 3 | use std::io::Write; 4 | use std::path::Path; 5 | 6 | fn main() { 7 | // create empty client_id.txt if it doesn't exist yet 8 | let clientid_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); 9 | let clientid_path = Path::new(&clientid_dir).join("src").join("client_id.txt"); 10 | 11 | if ! clientid_path.exists() { 12 | let mut f = File::create(&clientid_path).unwrap(); 13 | f.write_all("".as_bytes()).unwrap(); 14 | } 15 | } -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | # Cross compilation environment for spotty 2 | 3 | FROM debian:stretch 4 | 5 | RUN dpkg --add-architecture arm64 6 | RUN dpkg --add-architecture armhf 7 | RUN dpkg --add-architecture armel 8 | RUN dpkg --add-architecture i686 9 | RUN apt-get update 10 | 11 | RUN apt-get install -y curl git build-essential gcc-multilib musl-tools musl-dev musl 12 | RUN apt-get install -y crossbuild-essential-armhf crossbuild-essential-armel crossbuild-essential-arm64 13 | 14 | RUN curl https://sh.rustup.rs -sSf | sh -s -- -y 15 | ENV PATH="/root/.cargo/bin/:${PATH}" 16 | RUN rustup target add x86_64-unknown-linux-musl 17 | RUN rustup target add i686-unknown-linux-musl 18 | RUN rustup target add aarch64-unknown-linux-gnu 19 | #RUN rustup target add arm-unknown-linux-musleabihf 20 | RUN rustup target add arm-unknown-linux-gnueabihf 21 | RUN rustup target add arm-unknown-linux-gnueabi 22 | 23 | RUN mkdir /.cargo && \ 24 | echo '[target.aarch64-unknown-linux-gnu]\nlinker = "aarch64-linux-gnu-gcc"' > /.cargo/config && \ 25 | echo '[target.arm-unknown-linux-gnueabihf]\nlinker = "arm-linux-gnueabihf-gcc"' >> /.cargo/config && \ 26 | echo '[target.arm-unknown-linux-gnueabi]\nlinker = "arm-linux-gnueabi-gcc"' >> /.cargo/config 27 | # echo '[target.arm-unknown-linux-musleabihf]\nlinker = "arm-linux-gnueabihf-gcc"' >> /.cargo/config 28 | 29 | RUN mkdir /build 30 | ENV CARGO_TARGET_DIR /build 31 | ENV CARGO_HOME /build/cache 32 | 33 | RUN mkdir /src 34 | 35 | WORKDIR /src 36 | CMD ["/src/docker/docker-build.sh"] 37 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | # How to cross compile spotty 2 | 3 | If only I knew... Unfortunately I never managed to get all builds working in a Docker environment. But here we go anyway. The following targets should build successfully: 4 | 5 | * x86_64-unknown-linux-musl 6 | * i686-unknown-linux-musl 7 | * aarch64-unknown-linux-gnu (eg. Rock64) 8 | * arm-unknown-linux-gnueabihf (eg. Raspberry Pi 2+ - NOT built in default script) 9 | * arm-unknown-linux-gnueabi (eg. Pi1 - NOT built in default script) 10 | 11 | Build the docker image from the root of the project with the following command: 12 | 13 | ``` 14 | $ docker build -t spotty-cross -f docker/Dockerfile . 15 | ``` 16 | 17 | The resulting image can be used to build spotty for aforementioned platforms. 18 | 19 | ``` 20 | $ docker run -v ~/.spotty-build:/build -v $PWD:/src spotty-cross 21 | ``` 22 | 23 | The compiled binaries will be located in a sub folder called `releases`. 24 | 25 | If only one architecture is desired, cargo can be invoked directly with the appropriate options: 26 | 27 | ``` 28 | $ docker run -v ~/.spotty-build:/build -v $PWD:/src spotty-cross cargo build --release 29 | $ docker run -v ~/.spotty-build:/build -v $PWD:/src spotty-cross cargo build --release --target arm-unknown-linux-gnueabihf 30 | $ docker run -v ~/.spotty-build:/build -v $PWD:/src spotty-cross cargo build --release --target aarch64-unknown-linux-gnu 31 | ``` 32 | 33 | Resulting files could be found in ~/.spotty-build and sub-folders. -------------------------------------------------------------------------------- /docker/docker-build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -eux 3 | 4 | DESTDIR=/src/releases 5 | 6 | mkdir -p $DESTDIR/i386-linux 7 | rm -f $DESTDIR/i386-linux/* 8 | 9 | mkdir -p $DESTDIR/arm-linux 10 | rm -f $DESTDIR/arm-linux/* 11 | 12 | function build { 13 | echo Building for $1 to $3... 14 | cargo build --release --target $1 \ 15 | && $2 /build/$1/release/spotty \ 16 | && cp /build/$1/release/spotty $DESTDIR/$3 17 | } 18 | 19 | build x86_64-unknown-linux-musl strip i386-linux/spotty-x86_64 20 | build i686-unknown-linux-musl strip i386-linux/spotty 21 | build aarch64-unknown-linux-gnu aarch64-linux-gnu-strip arm-linux/spotty-aarch64 22 | 23 | # binary built in docker would not run on 1st gen. Pi running pCP. Whysoever. 24 | # build arm-unknown-linux-gnueabihf arm-linux-gnueabihf-strip arm-linux/spotty-hf 25 | 26 | # armel binary wouldn't run on eg. Synology due to wrong glibc version? 27 | # build arm-unknown-linux-gnueabi arm-linux-gnueabi-strip arm-linux/spotty 28 | -------------------------------------------------------------------------------- /src/lms.rs: -------------------------------------------------------------------------------- 1 | extern crate futures; 2 | extern crate hyper; 3 | extern crate tokio_core; 4 | 5 | use std::str::FromStr; 6 | use tokio_core::reactor::{Handle}; 7 | 8 | use futures::Future; 9 | use hyper::{Method, Request, Uri, Client}; 10 | use hyper::header::{Authorization, ContentLength, ContentType}; 11 | 12 | use librespot::playback::player::PlayerEvent; 13 | 14 | #[derive(Clone)] 15 | pub struct LMS { 16 | base_url: Option, 17 | player_mac: Option, 18 | auth: Option 19 | } 20 | 21 | #[allow(unused)] 22 | impl LMS { 23 | pub fn new(base_url: Option, player_mac: Option, auth: Option) -> LMS { 24 | LMS { 25 | base_url: Some(format!("http://{}/jsonrpc.js", base_url.unwrap_or("localhost:9000".to_string()))), 26 | player_mac: player_mac, 27 | auth: auth 28 | } 29 | } 30 | 31 | pub fn is_configured(&self) -> bool { 32 | if self.base_url != None { 33 | if self.player_mac != None { 34 | return true; 35 | } 36 | } 37 | 38 | return false; 39 | } 40 | 41 | pub fn signal_event(&self, event: PlayerEvent, handle: Handle) { 42 | let mut command = r#"["spottyconnect","change"]"#.to_string(); 43 | 44 | match event { 45 | PlayerEvent::Changed { 46 | old_track_id, 47 | new_track_id, 48 | } => { 49 | #[cfg(debug_assertions)] 50 | info!("change: spotify:track:{} -> spotify:track:{}", old_track_id.to_base62(), new_track_id.to_base62()); 51 | command = format!(r#"["spottyconnect","change","{}","{}"]"#, new_track_id.to_base62().to_string(), old_track_id.to_base62().to_string()); 52 | } 53 | PlayerEvent::Started { track_id } => { 54 | #[cfg(debug_assertions)] 55 | info!("play spotify:track:{}", track_id.to_base62()); 56 | command = format!(r#"["spottyconnect","start","{}"]"#, track_id.to_base62().to_string()); 57 | } 58 | PlayerEvent::Stopped { track_id } => { 59 | #[cfg(debug_assertions)] 60 | info!("stop spotify:track:{}", track_id.to_base62()); 61 | command = r#"["spottyconnect","stop"]"#.to_string(); 62 | } 63 | PlayerEvent::Volume { volume } => { 64 | #[cfg(debug_assertions)] 65 | info!("volume {}", volume); 66 | // we're not using the volume here, as LMS will read player state anyway 67 | command = format!(r#"["spottyconnect","volume",{}]"#, volume.to_string()); 68 | } 69 | PlayerEvent::Seek { position } => { 70 | #[cfg(debug_assertions)] 71 | info!("seek {}", position); 72 | // we're not implementing the seek event here, as it's going to read player state anyway 73 | command = r#"["spottyconnect","change"]"#.to_string(); 74 | } 75 | } 76 | 77 | if !self.is_configured() { 78 | #[cfg(debug_assertions)] 79 | info!("LMS connection is not configured"); 80 | return; 81 | } 82 | 83 | #[cfg(debug_assertions)] 84 | info!("Base URL to talk to LMS: {}", self.base_url.clone().unwrap()); 85 | 86 | if let Some(ref base_url) = self.base_url { 87 | #[cfg(debug_assertions)] 88 | info!("Player MAC address to control: {}", self.player_mac.clone().unwrap()); 89 | if let Some(ref player_mac) = self.player_mac { 90 | 91 | let client = Client::new(&handle); 92 | 93 | #[cfg(debug_assertions)] 94 | info!("Command to send to player: {}", command); 95 | 96 | let json = format!(r#"{{"id": 1,"method":"slim.request","params":["{}",{}]}}"#, player_mac, command); 97 | let uri = Uri::from_str(base_url).unwrap(); 98 | let mut req = Request::new(Method::Post, uri); 99 | 100 | if let Some(ref auth) = self.auth { 101 | req.headers_mut().set(Authorization(format!("Basic {}", auth).to_owned())); 102 | } 103 | 104 | req.headers_mut().set_raw("X-Scanner", "1"); 105 | req.headers_mut().set(ContentType::json()); 106 | req.headers_mut().set(ContentLength(json.len() as u64)); 107 | req.set_body(json); 108 | 109 | // ugh... just send that thing and don't care about the rest... 110 | let post = client.request(req).map(|_| ()).map_err(|_| ()); 111 | handle.spawn(post); 112 | } 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[cfg(debug_assertions)] 2 | #[macro_use] extern crate log; 3 | extern crate crypto; 4 | #[cfg(debug_assertions)] 5 | extern crate env_logger; 6 | extern crate futures; 7 | extern crate getopts; 8 | extern crate hyper; 9 | extern crate librespot; 10 | extern crate rpassword; 11 | #[macro_use] 12 | extern crate serde_json; 13 | extern crate tokio_core; 14 | extern crate tokio_io; 15 | extern crate tokio_signal; 16 | 17 | use futures::{Future, Async, Poll, Stream}; 18 | use futures::sync::mpsc::UnboundedReceiver; 19 | #[cfg(debug_assertions)] 20 | use std::env; 21 | use std::fs::File; 22 | use std::io::{self, stderr, Write}; 23 | use std::path::PathBuf; 24 | use std::process::exit; 25 | use std::str::FromStr; 26 | use tokio_core::reactor::{Handle, Core}; 27 | use tokio_io::IoStream; 28 | use std::mem; 29 | use crypto::digest::Digest; 30 | use crypto::sha1::Sha1; 31 | 32 | use librespot::core::authentication::{get_credentials, Credentials}; 33 | use librespot::core::cache::Cache; 34 | use librespot::core::config::{DeviceType, SessionConfig, ConnectConfig}; 35 | use librespot::core::session::Session; 36 | 37 | use librespot::playback::audio_backend::{self}; 38 | use librespot::playback::config::{Bitrate, PlayerConfig}; 39 | use librespot::connect::discovery::{discovery, DiscoveryStream}; 40 | use librespot::playback::mixer::{self, MixerConfig}; 41 | use librespot::playback::player::{Player, PlayerEvent}; 42 | use librespot::connect::spirc::{Spirc, SpircTask}; 43 | 44 | use librespot::core::spotify_id::SpotifyId; 45 | 46 | mod lms; 47 | use lms::LMS; 48 | 49 | const VERSION: &'static str = concat!(env!("CARGO_PKG_NAME"), " v", env!("CARGO_PKG_VERSION")); 50 | 51 | #[cfg(debug_assertions)] 52 | const DEBUGMODE: bool = true; 53 | #[cfg(not(debug_assertions))] 54 | const DEBUGMODE: bool = false; 55 | 56 | #[cfg(target_os="windows")] 57 | const NULLDEVICE: &'static str = "NUL"; 58 | #[cfg(not(target_os="windows"))] 59 | const NULLDEVICE: &'static str = "/dev/null"; 60 | 61 | fn device_id(name: &str) -> String { 62 | let mut h = Sha1::new(); 63 | h.input_str(name); 64 | h.result_str() 65 | } 66 | 67 | fn usage(program: &str, opts: &getopts::Options) -> String { 68 | println!("{}", VERSION.to_string()); 69 | 70 | let brief = format!("Usage: {} [options]", program); 71 | opts.usage(&brief) 72 | } 73 | 74 | #[cfg(debug_assertions)] 75 | fn setup_logging(verbose: bool) { 76 | let mut builder = env_logger::Builder::new(); 77 | match env::var("RUST_LOG") { 78 | Ok(config) => { 79 | builder.parse_filters(&config); 80 | builder.init(); 81 | 82 | if verbose { 83 | warn!("`--verbose` flag overidden by `RUST_LOG` environment variable"); 84 | } 85 | } 86 | Err(_) => { 87 | if verbose { 88 | builder.parse_filters("mdns=info,librespot=debug,spotty=info"); 89 | } else { 90 | builder.parse_filters("mdns=error,librespot=warn,spotty=error"); 91 | } 92 | builder.init(); 93 | } 94 | } 95 | } 96 | 97 | #[derive(Clone)] 98 | struct Setup { 99 | cache: Option, 100 | player_config: PlayerConfig, 101 | session_config: SessionConfig, 102 | connect_config: ConnectConfig, 103 | credentials: Option, 104 | enable_discovery: bool, 105 | 106 | authenticate: bool, 107 | 108 | get_token: bool, 109 | save_token: Option, 110 | client_id: Option, 111 | scope: Option, 112 | 113 | single_track: Option, 114 | start_position: u32, 115 | lms: LMS 116 | } 117 | 118 | fn setup(args: &[String]) -> Setup { 119 | let mut opts = getopts::Options::new(); 120 | opts.optopt("c", "cache", "Path to a directory where files will be cached.", "CACHE") 121 | .optflag("", "enable-audio-cache", "Enable caching of the audio data.") 122 | .optflag("", "disable-audio-cache", "(Only here fore compatibility with librespot - audio cache is disabled by default).") 123 | .reqopt("n", "name", "Device name", "NAME") 124 | .optopt("b", "bitrate", "Bitrate (96, 160 or 320). Defaults to 320.", "BITRATE") 125 | .optflag("", "pass-through", "Pass raw OGG stream to output") 126 | .optopt("", "player-mac", "MAC address of the Squeezebox to be controlled", "MAC") 127 | .optopt("", "lms", "hostname and port of Logitech Media Server instance (eg. localhost:9000)", "LMS") 128 | .optopt("", "lms-auth", "Authentication data to access Logitech Media Server", "LMSAUTH") 129 | .optopt("", "single-track", "Play a single track ID and exit.", "ID") 130 | .optopt("", "start-position", "Position (in seconds) where playback should be started. Only valid with the --single-track option.", "STARTPOSITION") 131 | .optflag("", "enable-volume-normalisation", "Play all tracks at the same volume") 132 | .optopt("u", "username", "Username to sign in with", "USERNAME") 133 | .optopt("p", "password", "Password", "PASSWORD") 134 | .optflag("a", "authenticate", "Authenticate given username and password. Make sure you define a cache folder to store credentials.") 135 | .optopt("", "ap-port", "Connect to AP with specified port. If no AP with that port are present fallback AP will be used. Available ports are usually 80, 443 and 4070", "AP_PORT") 136 | .optflag("", "disable-discovery", "Disable discovery mode") 137 | .optflag("t", "get-token", "Get oauth token to be used with the web API etc. and print it to the console.") 138 | .optopt("T", "save-token", "Get oauth token to be used with the web API etc. and store it in the given file.", "TOKENFILE") 139 | .optopt("i", "client-id", "A Spotify client_id to be used to get the oauth token. Required with the --get-token request.", "CLIENT_ID") 140 | .optopt("", "scope", "The scopes you want to have access to with the oauth token.", "SCOPE") 141 | .optflag("x", "check", "Run quick internal check") 142 | .optflag("v", "verbose", "Enable verbose output"); 143 | 144 | let matches = match opts.parse(&args[1..]) { 145 | Ok(m) => m, 146 | Err(f) => { 147 | writeln!(stderr(), "error: {}\n{}", f.to_string(), usage(&args[0], &opts)).unwrap(); 148 | exit(1); 149 | } 150 | }; 151 | 152 | if matches.opt_present("check") { 153 | println!("ok {}", VERSION.to_string()); 154 | 155 | let capabilities = json!({ 156 | "version": env!("CARGO_PKG_VERSION").to_string(), 157 | "lms-auth": true, 158 | "volume-normalisation": true, 159 | "debug": DEBUGMODE, 160 | "ogg-direct": true, 161 | "save-token": true, 162 | "podcasts": true 163 | }); 164 | 165 | println!("{}", capabilities.to_string()); 166 | exit(1); 167 | } 168 | 169 | #[cfg(debug_assertions)] 170 | { 171 | let verbose = matches.opt_present("verbose"); 172 | setup_logging(verbose); 173 | } 174 | 175 | let name = matches.opt_str("name").unwrap(); 176 | 177 | let use_audio_cache = matches.opt_present("enable-audio-cache") && !matches.opt_present("disable-audio-cache"); 178 | 179 | let cache = matches.opt_str("c").map(|cache_location| { 180 | Cache::new(PathBuf::from(cache_location), use_audio_cache) 181 | }); 182 | 183 | let credentials = { 184 | let cached_credentials = cache.as_ref().and_then(Cache::credentials); 185 | 186 | let password = |username: &String| -> String { 187 | write!(stderr(), "Password for {}: ", username).unwrap(); 188 | stderr().flush().unwrap(); 189 | rpassword::read_password().unwrap() 190 | }; 191 | 192 | get_credentials( 193 | matches.opt_str("username"), 194 | matches.opt_str("password"), 195 | cached_credentials, 196 | password 197 | ) 198 | }; 199 | 200 | let authenticate = matches.opt_present("authenticate"); 201 | 202 | let enable_discovery = !matches.opt_present("disable-discovery"); 203 | 204 | let start_position = matches.opt_str("start-position") 205 | .unwrap_or("0".to_string()) 206 | .parse::().unwrap_or(0.0); 207 | 208 | let session_config = { 209 | let device_id = device_id(&name); 210 | 211 | SessionConfig { 212 | user_agent: VERSION.to_string(), 213 | device_id: device_id, 214 | proxy: None, 215 | ap_port: matches 216 | .opt_str("ap-port") 217 | .map(|port| port.parse::().expect("Invalid port")), 218 | } 219 | }; 220 | 221 | let pass_through = matches.opt_present("pass-through"); 222 | 223 | let player_config = { 224 | let bitrate = matches.opt_str("b").as_ref() 225 | .map(|bitrate| Bitrate::from_str(bitrate).expect("Invalid bitrate")) 226 | .unwrap_or(Bitrate::Bitrate320); 227 | 228 | PlayerConfig { 229 | bitrate: bitrate, 230 | normalisation: matches.opt_present("enable-volume-normalisation"), 231 | normalisation_pregain: PlayerConfig::default().normalisation_pregain, 232 | pass_through: pass_through, 233 | lms_connect_mode: !matches.opt_present("single-track") 234 | } 235 | }; 236 | 237 | let connect_config = { 238 | ConnectConfig { 239 | name: name, 240 | device_type: DeviceType::Speaker, 241 | volume: 0x8000 as u16, 242 | linear_volume: true 243 | } 244 | }; 245 | 246 | let client_id = matches.opt_str("client-id") 247 | .unwrap_or(format!("{}", include_str!("client_id.txt"))); 248 | 249 | let save_token = matches.opt_str("save-token").unwrap_or("".to_string()); 250 | 251 | let lms = LMS::new(matches.opt_str("lms"), matches.opt_str("player-mac"), matches.opt_str("lms-auth")); 252 | 253 | Setup { 254 | cache: cache, 255 | session_config: session_config, 256 | player_config: player_config, 257 | connect_config: connect_config, 258 | credentials: credentials, 259 | authenticate: authenticate, 260 | enable_discovery: enable_discovery, 261 | 262 | get_token: matches.opt_present("get-token") || save_token.as_str().len() != 0, 263 | save_token: if save_token.as_str().len() == 0 { None } else { Some(save_token) }, 264 | 265 | client_id: if client_id.as_str().len() == 0 { None } else { Some(client_id) }, 266 | scope: matches.opt_str("scope"), 267 | 268 | single_track: matches.opt_str("single-track"), 269 | start_position: (start_position * 1000.0) as u32, 270 | 271 | lms: lms 272 | } 273 | } 274 | 275 | struct Main { 276 | cache: Option, 277 | player_config: PlayerConfig, 278 | session_config: SessionConfig, 279 | connect_config: ConnectConfig, 280 | handle: Handle, 281 | 282 | discovery: Option, 283 | signal: IoStream<()>, 284 | 285 | spirc: Option, 286 | spirc_task: Option, 287 | connect: Box>, 288 | 289 | shutdown: bool, 290 | authenticate: bool, 291 | 292 | event_channel: Option>, 293 | lms: LMS 294 | } 295 | 296 | impl Main { 297 | fn new(handle: Handle, setup: Setup) -> Main { 298 | let mut task = Main { 299 | handle: handle.clone(), 300 | cache: setup.cache, 301 | session_config: setup.session_config, 302 | player_config: setup.player_config, 303 | connect_config: setup.connect_config, 304 | 305 | connect: Box::new(futures::future::empty()), 306 | discovery: None, 307 | spirc: None, 308 | spirc_task: None, 309 | 310 | shutdown: false, 311 | authenticate: setup.authenticate, 312 | signal: Box::new(tokio_signal::ctrl_c().flatten_stream()), 313 | 314 | event_channel: None, 315 | lms: setup.lms 316 | }; 317 | 318 | if setup.enable_discovery { 319 | let config = task.connect_config.clone(); 320 | let device_id = task.session_config.device_id.clone(); 321 | 322 | task.discovery = Some(discovery(&handle, config, device_id, 0).unwrap()); 323 | } 324 | 325 | if let Some(credentials) = setup.credentials { 326 | task.credentials(credentials); 327 | } 328 | 329 | task 330 | } 331 | 332 | fn credentials(&mut self, credentials: Credentials) { 333 | let config = self.session_config.clone(); 334 | let handle = self.handle.clone(); 335 | 336 | let connection = Session::connect(config, credentials, self.cache.clone(), handle); 337 | 338 | self.connect = connection; 339 | self.spirc = None; 340 | let task = mem::replace(&mut self.spirc_task, None); 341 | if let Some(task) = task { 342 | self.handle.spawn(task); 343 | } 344 | } 345 | } 346 | 347 | impl Future for Main { 348 | type Item = (); 349 | type Error = (); 350 | 351 | fn poll(&mut self) -> Poll<(), ()> { 352 | loop { 353 | let mut progress = false; 354 | 355 | if let Some(Async::Ready(Some(creds))) = self.discovery.as_mut().map(|d| d.poll().unwrap()) { 356 | if let Some(ref spirc) = self.spirc { 357 | spirc.shutdown(); 358 | } 359 | self.credentials(creds); 360 | 361 | progress = true; 362 | } 363 | 364 | if let Async::Ready(ref mut session) = self.connect.poll().unwrap() { 365 | if self.authenticate { 366 | if !self.shutdown { 367 | if let Some(ref spirc) = self.spirc { 368 | spirc.shutdown(); 369 | } 370 | 371 | self.shutdown = true; 372 | 373 | return Ok(Async::Ready(())); 374 | } 375 | } 376 | else { 377 | self.connect = Box::new(futures::future::empty()); 378 | let player_config = self.player_config.clone(); 379 | let connect_config = self.connect_config.clone(); 380 | 381 | let mixer_config = MixerConfig { 382 | card: String::from("default"), 383 | mixer: String::from("PCM"), 384 | index: 0, 385 | }; 386 | 387 | let mixer = (mixer::find(Some("softvol")).unwrap())(Some(mixer_config)); 388 | 389 | let audio_filter = mixer.get_audio_filter(); 390 | let backend = audio_backend::find(None).unwrap(); 391 | let (player, event_channel) = Player::new(player_config, session.clone(), audio_filter, move || { 392 | (backend)(Some(NULLDEVICE.to_string())) 393 | }); 394 | 395 | let (spirc, spirc_task) = Spirc::new(connect_config, session.clone(), player, mixer); 396 | self.spirc = Some(spirc); 397 | self.spirc_task = Some(spirc_task); 398 | self.event_channel = Some(event_channel); 399 | } 400 | 401 | progress = true; 402 | } 403 | 404 | if let Async::Ready(Some(())) = self.signal.poll().unwrap() { 405 | if !self.shutdown { 406 | if let Some(ref spirc) = self.spirc { 407 | spirc.shutdown(); 408 | } 409 | self.shutdown = true; 410 | } else { 411 | return Ok(Async::Ready(())); 412 | } 413 | 414 | progress = true; 415 | } 416 | 417 | if let Some(ref mut spirc_task) = self.spirc_task { 418 | if let Async::Ready(()) = spirc_task.poll().unwrap() { 419 | if self.shutdown { 420 | return Ok(Async::Ready(())); 421 | } else { 422 | panic!("Spirc shut down unexpectedly"); 423 | } 424 | } 425 | } 426 | 427 | if let Some(ref mut event_channel) = self.event_channel { 428 | if let Async::Ready(Some(event)) = event_channel.poll().unwrap() { 429 | self.lms.signal_event(event, self.handle.clone()); 430 | } 431 | } 432 | 433 | if !progress { 434 | return Ok(Async::NotReady); 435 | } 436 | } 437 | } 438 | } 439 | 440 | fn main() { 441 | let mut core = Core::new().unwrap(); 442 | let handle = core.handle(); 443 | 444 | let args: Vec = std::env::args().collect(); 445 | let Setup { 446 | cache, 447 | session_config, 448 | player_config, 449 | connect_config, 450 | credentials, 451 | authenticate, 452 | enable_discovery, 453 | get_token, 454 | save_token, 455 | client_id, 456 | scope, 457 | single_track, 458 | start_position, 459 | lms 460 | } = setup(&args.clone()); 461 | 462 | if let Some(ref track_id) = single_track { 463 | match credentials { 464 | Some(credentials) => { 465 | let backend = audio_backend::find(None).unwrap(); 466 | 467 | let track = SpotifyId::from_uri( 468 | track_id.replace("spotty://", "spotify:") 469 | .replace("://", ":") 470 | .as_str()); 471 | 472 | let session = core.run(Session::connect(session_config.clone(), credentials, cache.clone(), handle)).unwrap(); 473 | 474 | let (player, _) = Player::new(player_config, session.clone(), None, move || (backend)(None)); 475 | 476 | core.run(player.load(track.unwrap(), true, start_position)).unwrap(); 477 | } 478 | None => { 479 | println!("Missing credentials"); 480 | } 481 | } 482 | } 483 | else if authenticate && !enable_discovery { 484 | core.run(Session::connect(session_config.clone(), credentials.unwrap(), cache.clone(), handle)).unwrap(); 485 | println!("authorized"); 486 | } 487 | else if get_token { 488 | if let Some(client_id) = client_id { 489 | let session = core.run(Session::connect(session_config, credentials.unwrap(), cache.clone(), handle)).unwrap(); 490 | let scope = scope.unwrap_or("user-read-private,playlist-read-private,playlist-read-collaborative,playlist-modify-public,playlist-modify-private,user-follow-modify,user-follow-read,user-library-read,user-library-modify,user-top-read,user-read-recently-played".to_string()); 491 | let url = format!("hm://keymaster/token/authenticated?client_id={}&scope={}", client_id, scope); 492 | 493 | let result = core.run(Box::new(session.mercury().get(url).map(move |response| { 494 | let data = response.payload.first().expect("Empty payload"); 495 | let token = String::from_utf8(data.clone()).unwrap(); 496 | 497 | if let Some(save_token) = save_token { 498 | let mut file = File::create(save_token.to_string()).expect("Can't create token file"); 499 | file.write(&token.clone().into_bytes()).expect("Can't write token file"); 500 | } 501 | else { 502 | println!("{}", token); 503 | } 504 | }))); 505 | 506 | match result { 507 | Ok(_) => (), 508 | Err(e) => println!("error getting token {:?}", e), 509 | } 510 | } 511 | else { 512 | println!("Use --client-id to provide a CLIENT_ID"); 513 | } 514 | } 515 | else { 516 | core.run(Main::new(handle, Setup { 517 | cache, 518 | session_config, 519 | player_config, 520 | connect_config, 521 | credentials, 522 | authenticate, 523 | enable_discovery, 524 | get_token, 525 | save_token, 526 | client_id, 527 | scope, 528 | single_track, 529 | start_position, 530 | lms 531 | })).unwrap() 532 | } 533 | } 534 | 535 | -------------------------------------------------------------------------------- /t/test.t: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use strict; 4 | 5 | use Data::Dump; 6 | use File::Slurp qw(read_file); 7 | use File::Spec::Functions qw(catdir catfile); 8 | use FindBin qw($Bin); 9 | use JSON; 10 | use Test::More; 11 | 12 | use constant TESTTRACKID => '5nAGT4XQVcVPAojSW0PxiL'; 13 | 14 | my $baseDir = catdir($Bin, '..'); 15 | my $cacheDir = catdir($Bin, 'data'); 16 | my $credsFile = catfile($cacheDir, 'credentials.json'); 17 | my $dataFile = catfile($Bin, 'test-data.json'); 18 | 19 | mkdir $cacheDir; 20 | 21 | plan tests => 17; 22 | 23 | my $binary = catdir($baseDir, 'target/debug/spotty'); 24 | 25 | if (!-e $binary) { 26 | `cd $baseDir && cargo build`; 27 | ok(!($? >> 8), "build binary"); 28 | } 29 | 30 | { 31 | ok(-f $binary && -e _, "$binary does exist and is executable"); 32 | } 33 | 34 | $binary = "RUST_BACKTRACE=full $binary -n 'Spotty testing'"; 35 | 36 | { 37 | my $checkData = `$binary --check`; 38 | ok($checkData && $checkData =~ /ok spotty/, 'received response to quick check: ' . $checkData); 39 | } 40 | 41 | { 42 | testCredentials(); 43 | } 44 | 45 | my $testData = readCredentials($dataFile) || {}; 46 | 47 | my $username = $ENV{SPOTIFY_USER} || $testData->{username}; 48 | my $password = $ENV{SPOTIFY_PASSWORD} || $testData->{password}; 49 | 50 | if ($username && $password) { 51 | testCredentials($username, $password); 52 | } 53 | 54 | { 55 | my $cmd = "$binary -c $cacheDir --get-token"; 56 | $cmd .= " -i " . $testData->{client_id} if $testData->{client_id}; 57 | my $tokenData = `$cmd`; 58 | ok(!($? >> 8), "helper exited token call normally"); 59 | ok($tokenData, "received token data"); 60 | 61 | my $token = decode_json($tokenData); 62 | ok($token && ref $token && $token->{accessToken}, "received accessToken"); 63 | } 64 | 65 | require Proc::Background; 66 | my $daemon; 67 | { 68 | $daemon = Proc::Background->new("$binary -c $cacheDir --disable-audio-cache"); 69 | ok($daemon, "daemon started\n"); 70 | } 71 | 72 | print "\nWe're now going to download some data. Please be patient...\n"; 73 | { 74 | my $testPCM = catfile($cacheDir, 'test.pcm'); 75 | my $streamCmd = sprintf('%s --bitrate=96 -c %s --single-track %s --disable-discovery --disable-audio-cache > %s', 76 | $binary, 77 | $cacheDir, 78 | TESTTRACKID, 79 | $testPCM 80 | ); 81 | 82 | `$streamCmd`; 83 | ok(!($? >> 8), "stream helper exited normally"); 84 | ok(-f $testPCM, "audio stream downloaded"); 85 | ok(-s _ > 2_000_000, "downloaded PCM data is of reasonable size: " . -s _); 86 | unlink $testPCM; 87 | } 88 | 89 | { 90 | ok($daemon->alive, "daemon is still alive and kicking"); 91 | $daemon->die if $daemon->alive; 92 | } 93 | 94 | 95 | sub testCredentials { 96 | my ($username, $password) = @_; 97 | 98 | unlink $credsFile; 99 | if (!$username && !$password) { 100 | print "\nTesting interactive authentication. Please use Spotify application to authenticate client 'Spotty testing'...\n"; 101 | `$binary -a -c $cacheDir`; 102 | } 103 | else { 104 | print "\nTesting username/password authentication.\n"; 105 | `$binary -a -c $cacheDir -u "$username" -p "$password" --disable-discovery`; 106 | } 107 | 108 | ok(!($? >> 8), "helper exited normally"); 109 | ok(-f $credsFile, "credentials file does exist"); 110 | 111 | my $credentials = readCredentials($credsFile); 112 | ok($credentials && $credentials->{auth_data}, "credentials file is readable and valid: " . ($credentials && $credentials->{auth_data} ? $credentials->{username} : 'unknown')); 113 | } 114 | 115 | sub readCredentials { 116 | my $file = shift || $credsFile; 117 | 118 | return decode_json(read_file($file)); 119 | } 120 | 121 | 1; --------------------------------------------------------------------------------