[INFO] cloning repository https://github.com/AD-Archer/RustySound
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/AD-Archer/RustySound" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FAD-Archer%2FRustySound", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FAD-Archer%2FRustySound'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] c35ada6c5db8f0b7a8364f9ec7d4816b0e3b21ce
[INFO] checking AD-Archer/RustySound against try#f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2 for pr-156992
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FAD-Archer%2FRustySound" "/workspace/builds/worker-3-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-3-tc2/source'...
[INFO] [stderr] done.
[INFO] removed /workspace/builds/worker-3-tc2/source/.cargo/config.toml
[INFO] started tweaking git repo https://github.com/AD-Archer/RustySound
[INFO] finished tweaking git repo https://github.com/AD-Archer/RustySound
[INFO] tweaked toml for git repo https://github.com/AD-Archer/RustySound written to /workspace/builds/worker-3-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/AD-Archer/RustySound on toolchain f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/AD-Archer/RustySound already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] [stdout] d593e86a2a5ca3daef02119aa195a9417797c0bee8ae19c1bcecbe6cf8c078a8
[INFO] running `Command { std: "docker" "start" "-a" "d593e86a2a5ca3daef02119aa195a9417797c0bee8ae19c1bcecbe6cf8c078a8", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "d593e86a2a5ca3daef02119aa195a9417797c0bee8ae19c1bcecbe6cf8c078a8", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "d593e86a2a5ca3daef02119aa195a9417797c0bee8ae19c1bcecbe6cf8c078a8", kill_on_drop: false }`
[INFO] [stdout] d593e86a2a5ca3daef02119aa195a9417797c0bee8ae19c1bcecbe6cf8c078a8
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-3-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+f16624c7fb52ccf15cd304a9728caf1ef4b9c0d2" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }`
[INFO] [stdout] c640e66d7a0e19268e3563bdf68d0fa64de40a2e8846d302f710e236ebd15268
[INFO] running `Command { std: "docker" "start" "-a" "c640e66d7a0e19268e3563bdf68d0fa64de40a2e8846d302f710e236ebd15268", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.105
[INFO] [stderr]    Compiling unicode-ident v1.0.22
[INFO] [stderr]    Compiling quote v1.0.43
[INFO] [stderr]     Checking cfg-if v1.0.4
[INFO] [stderr]    Compiling libc v0.2.180
[INFO] [stderr]     Checking once_cell v1.21.3
[INFO] [stderr]    Compiling version_check v0.9.5
[INFO] [stderr]    Compiling rustversion v1.0.22
[INFO] [stderr]     Checking smallvec v1.15.1
[INFO] [stderr]     Checking pin-project-lite v0.2.16
[INFO] [stderr]    Compiling serde_core v1.0.228
[INFO] [stderr]     Checking futures-core v0.3.31
[INFO] [stderr]    Compiling wasm-bindgen-shared v0.2.106
[INFO] [stderr]    Compiling parking_lot_core v0.9.12
[INFO] [stderr]    Compiling serde v1.0.228
[INFO] [stderr]     Checking scopeguard v1.2.0
[INFO] [stderr]    Compiling bumpalo v3.19.1
[INFO] [stderr]     Checking pin-utils v0.1.0
[INFO] [stderr]     Checking memchr v2.7.6
[INFO] [stderr]     Checking lock_api v0.4.14
[INFO] [stderr]     Checking futures-task v0.3.31
[INFO] [stderr]     Checking slab v0.4.11
[INFO] [stderr]     Checking tracing-core v0.1.36
[INFO] [stderr]     Checking futures-io v0.3.31
[INFO] [stderr]    Compiling typenum v1.19.0
[INFO] [stderr]     Checking futures-sink v0.3.31
[INFO] [stderr]     Checking bytes v1.11.1
[INFO] [stderr]     Checking futures-channel v0.3.31
[INFO] [stderr]    Compiling thiserror v2.0.17
[INFO] [stderr]     Checking stable_deref_trait v1.2.1
[INFO] [stderr]    Compiling zerocopy v0.8.33
[INFO] [stderr]     Checking itoa v1.0.17
[INFO] [stderr]    Compiling anyhow v1.0.100
[INFO] [stderr]     Checking dioxus-core-types v0.7.3
[INFO] [stderr]    Compiling generic-array v0.14.7
[INFO] [stderr]    Compiling slotmap v1.1.1
[INFO] [stderr]    Compiling unicode-xid v0.2.6
[INFO] [stderr]    Compiling shlex v1.3.0
[INFO] [stderr]    Compiling find-msvc-tools v0.1.7
[INFO] [stderr]     Checking libloading v0.8.9
[INFO] [stderr]     Checking rustc-hash v2.1.1
[INFO] [stderr]     Checking longest-increasing-subsequence v0.1.0
[INFO] [stderr]     Checking litemap v0.8.1
[INFO] [stderr]    Compiling fnv v1.0.7
[INFO] [stderr]    Compiling unicode-segmentation v1.12.0
[INFO] [stderr]     Checking writeable v0.6.2
[INFO] [stderr]    Compiling ident_case v1.0.1
[INFO] [stderr]    Compiling autocfg v1.5.0
[INFO] [stderr]    Compiling httparse v1.10.1
[INFO] [stderr]    Compiling getrandom v0.3.4
[INFO] [stderr]    Compiling lazy-js-bundle v0.7.3
[INFO] [stderr]    Compiling cc v1.2.52
[INFO] [stderr]     Checking http v1.4.0
[INFO] [stderr]    Compiling proc-macro2-diagnostics v0.10.1
[INFO] [stderr]     Checking bitflags v2.10.0
[INFO] [stderr]    Compiling icu_properties_data v2.1.2
[INFO] [stderr]    Compiling wasm-bindgen v0.2.106
[INFO] [stderr]    Compiling convert_case v0.8.0
[INFO] [stderr]    Compiling icu_normalizer_data v2.1.1
[INFO] [stderr]     Checking memmap2 v0.9.9
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]     Checking errno v0.3.14
[INFO] [stderr]     Checking getrandom v0.2.17
[INFO] [stderr]     Checking socket2 v0.6.1
[INFO] [stderr]     Checking parking_lot v0.12.5
[INFO] [stderr]     Checking signal-hook-registry v1.4.8
[INFO] [stderr]     Checking mio v1.1.1
[INFO] [stderr]     Checking percent-encoding v2.3.2
[INFO] [stderr]    Compiling zmij v1.0.13
[INFO] [stderr]     Checking zeroize v1.8.2
[INFO] [stderr]    Compiling serde_json v1.0.149
[INFO] [stderr]     Checking rand_core v0.9.3
[INFO] [stderr]    Compiling syn v2.0.114
[INFO] [stderr]     Checking untrusted v0.9.0
[INFO] [stderr]     Checking form_urlencoded v1.2.2
[INFO] [stderr]     Checking keyboard-types v0.7.0
[INFO] [stderr]     Checking rustls-pki-types v1.13.2
[INFO] [stderr]    Compiling const_format_proc_macros v0.2.34
[INFO] [stderr]    Compiling ahash v0.8.12
[INFO] [stderr]     Checking tower-service v0.3.3
[INFO] [stderr]    Compiling rustls v0.23.36
[INFO] [stderr]     Checking log v0.4.29
[INFO] [stderr]     Checking try-lock v0.2.5
[INFO] [stderr]     Checking utf8_iter v1.0.4
[INFO] [stderr]     Checking cpufeatures v0.2.17
[INFO] [stderr]     Checking regex-syntax v0.8.8
[INFO] [stderr]     Checking want v0.3.1
[INFO] [stderr]    Compiling dioxus-document v0.7.3
[INFO] [stderr]    Compiling dioxus-interpreter-js v0.7.3
[INFO] [stderr]     Checking data-encoding v2.10.0
[INFO] [stderr]    Compiling vcpkg v0.2.15
[INFO] [stderr]     Checking utf-8 v0.7.6
[INFO] [stderr]    Compiling crc32fast v1.5.0
[INFO] [stderr]     Checking subtle v2.6.1
[INFO] [stderr]     Checking simd-adler32 v0.3.8
[INFO] [stderr]     Checking atomic-waker v1.1.2
[INFO] [stderr]     Checking http-body v1.0.1
[INFO] [stderr]    Compiling pkg-config v0.3.32
[INFO] [stderr]    Compiling winnow v0.7.14
[INFO] [stderr]     Checking lazy_static v1.5.0
[INFO] [stderr]     Checking rustc-hash v1.1.0
[INFO] [stderr]    Compiling block-buffer v0.10.4
[INFO] [stderr]    Compiling crypto-common v0.1.7
[INFO] [stderr]     Checking sharded-slab v0.1.7
[INFO] [stderr]     Checking sledgehammer_utils v0.3.1
[INFO] [stderr]    Compiling digest v0.10.7
[INFO] [stderr]    Compiling dioxus-web v0.7.3
[INFO] [stderr]    Compiling ring v0.17.14
[INFO] [stderr]     Checking euclid v0.22.11
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]     Checking sync_wrapper v1.0.2
[INFO] [stderr]     Checking thread_local v1.1.9
[INFO] [stderr]     Checking adler2 v2.0.1
[INFO] [stderr]     Checking const_format v0.2.35
[INFO] [stderr]     Checking ipnet v2.11.0
[INFO] [stderr]    Compiling base16 v0.2.1
[INFO] [stderr]     Checking base64 v0.22.1
[INFO] [stderr]    Compiling libsqlite3-sys v0.30.1
[INFO] [stderr]    Compiling dunce v1.0.5
[INFO] [stderr]     Checking tower-layer v0.3.3
[INFO] [stderr]     Checking miniz_oxide v0.8.9
[INFO] [stderr]     Checking webpki-roots v1.0.5
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking ppv-lite86 v0.2.21
[INFO] [stderr]     Checking sha1 v0.10.6
[INFO] [stderr]     Checking send_wrapper v0.6.0
[INFO] [stderr]     Checking iri-string v0.7.10
[INFO] [stderr]     Checking ryu v1.0.22
[INFO] [stderr]     Checking dirs-sys v0.4.1
[INFO] [stderr]     Checking regex-automata v0.4.13
[INFO] [stderr]     Checking rand_chacha v0.9.0
[INFO] [stderr]     Checking flate2 v1.1.8
[INFO] [stderr]     Checking hashbrown v0.14.5
[INFO] [stderr]     Checking rand_chacha v0.3.1
[INFO] [stderr]     Checking http-body-util v0.1.3
[INFO] [stderr]     Checking fdeflate v0.3.7
[INFO] [stderr]     Checking rand v0.9.2
[INFO] [stderr]    Compiling dioxus-config-macro v0.7.3
[INFO] [stderr]     Checking iana-time-zone v0.1.64
[INFO] [stderr]     Checking fallible-streaming-iterator v0.1.9
[INFO] [stderr]    Compiling rustysound v3.0.0 (/opt/rustwide/workdir)
[INFO] [stderr]     Checking fallible-iterator v0.3.0
[INFO] [stderr]     Checking bitflags v1.3.2
[INFO] [stderr]     Checking dioxus-config-macros v0.7.3
[INFO] [stderr]     Checking rand v0.8.5
[INFO] [stderr]     Checking png v0.17.16
[INFO] [stderr]     Checking dirs v5.0.1
[INFO] [stderr]     Checking uuid v1.19.0
[INFO] [stderr]     Checking md5 v0.7.0
[INFO] [stderr]     Checking urlencoding v2.1.3
[INFO] [stderr]     Checking hashlink v0.9.1
[INFO] [stderr]     Checking matchers v0.2.0
[INFO] [stderr]     Checking rustls-webpki v0.103.10
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]    Compiling wasm-bindgen-macro-support v0.2.106
[INFO] [stderr]    Compiling darling_core v0.21.3
[INFO] [stderr]    Compiling macro-string v0.1.4
[INFO] [stderr]    Compiling dioxus-rsx v0.7.3
[INFO] [stderr]    Compiling serde_derive v1.0.228
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling futures-macro v0.3.31
[INFO] [stderr]    Compiling zerofrom-derive v0.1.6
[INFO] [stderr]    Compiling thiserror-impl v2.0.17
[INFO] [stderr]    Compiling yoke-derive v0.8.1
[INFO] [stderr]    Compiling zerovec-derive v0.11.2
[INFO] [stderr]    Compiling displaydoc v0.2.5
[INFO] [stderr]    Compiling pin-project-internal v1.1.10
[INFO] [stderr]    Compiling warnings-macro v0.2.0
[INFO] [stderr]    Compiling const-serialize-macro v0.7.2
[INFO] [stderr]    Compiling tokio-macros v2.6.0
[INFO] [stderr]    Compiling const-serialize-macro v0.8.0-alpha.0
[INFO] [stderr]    Compiling const-serialize v0.7.2
[INFO] [stderr]    Compiling async-trait v0.1.89
[INFO] [stderr]     Checking tokio v1.49.0
[INFO] [stderr]    Compiling dioxus-html-internal-macro v0.7.3
[INFO] [stderr]    Compiling sledgehammer_bindgen_macro v0.6.1
[INFO] [stderr]     Checking futures-util v0.3.31
[INFO] [stderr]    Compiling dioxus-stores-macro v0.7.3
[INFO] [stderr]    Compiling dioxus-router-macro v0.7.3
[INFO] [stderr]     Checking pin-project v1.1.10
[INFO] [stderr]     Checking tracing v0.1.44
[INFO] [stderr]     Checking generational-box v0.7.3
[INFO] [stderr]     Checking warnings v0.2.1
[INFO] [stderr]     Checking zerofrom v0.1.6
[INFO] [stderr]    Compiling dioxus-core-macro v0.7.3
[INFO] [stderr]     Checking tungstenite v0.27.0
[INFO] [stderr]     Checking tracing-subscriber v0.3.22
[INFO] [stderr]     Checking yoke v0.8.1
[INFO] [stderr]     Checking zerovec v0.11.5
[INFO] [stderr]     Checking zerotrie v0.2.3
[INFO] [stderr]    Compiling darling_macro v0.21.3
[INFO] [stderr]     Checking tinystr v0.8.2
[INFO] [stderr]     Checking potential_utf v0.1.4
[INFO] [stderr]    Compiling wasm-bindgen-macro v0.2.106
[INFO] [stderr]     Checking icu_collections v2.1.1
[INFO] [stderr]    Compiling darling v0.21.3
[INFO] [stderr]    Compiling enumset_derive v0.14.0
[INFO] [stderr]     Checking icu_locale_core v2.1.1
[INFO] [stderr]     Checking icu_provider v2.1.1
[INFO] [stderr]     Checking subsecond-types v0.7.3
[INFO] [stderr]     Checking const-serialize v0.8.0-alpha.0
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking chrono v0.4.42
[INFO] [stderr]     Checking subsecond v0.7.3
[INFO] [stderr]     Checking icu_properties v2.1.2
[INFO] [stderr]     Checking icu_normalizer v2.1.1
[INFO] [stderr]     Checking enumset v1.1.10
[INFO] [stderr]     Checking js-sys v0.3.83
[INFO] [stderr]     Checking dioxus-cli-config v0.7.3
[INFO] [stderr]     Checking sledgehammer_bindgen v0.6.0
[INFO] [stderr]     Checking manganis-core v0.7.3
[INFO] [stderr]     Checking dioxus-logger v0.7.3
[INFO] [stderr]     Checking dioxus-core v0.7.3
[INFO] [stderr]    Compiling manganis-macro v0.7.3
[INFO] [stderr]     Checking idna_adapter v1.2.1
[INFO] [stderr]     Checking idna v1.1.0
[INFO] [stderr]     Checking manganis v0.7.3
[INFO] [stderr]     Checking url v2.5.8
[INFO] [stderr]     Checking hyper v1.8.1
[INFO] [stderr]     Checking tower v0.5.2
[INFO] [stderr]     Checking tokio-rustls v0.26.4
[INFO] [stderr]     Checking dioxus-signals v0.7.3
[INFO] [stderr]     Checking dioxus-history v0.7.3
[INFO] [stderr]     Checking dioxus-devtools-types v0.7.3
[INFO] [stderr]     Checking hyper-util v0.1.19
[INFO] [stderr]     Checking tower-http v0.6.8
[INFO] [stderr]     Checking dioxus-hooks v0.7.3
[INFO] [stderr]     Checking dioxus-devtools v0.7.3
[INFO] [stderr]     Checking dioxus-stores v0.7.3
[INFO] [stderr]     Checking dioxus-html v0.7.3
[INFO] [stderr]     Checking rusqlite v0.32.1
[INFO] [stderr]     Checking wasm-bindgen-futures v0.4.56
[INFO] [stderr]     Checking web-sys v0.3.83
[INFO] [stderr]     Checking gloo-timers v0.3.0
[INFO] [stderr]     Checking serde-wasm-bindgen v0.6.5
[INFO] [stderr]     Checking hyper-rustls v0.27.7
[INFO] [stderr]     Checking reqwest v0.12.28
[INFO] [stderr]     Checking dioxus-router v0.7.3
[INFO] [stderr]     Checking wasm-streams v0.4.2
[INFO] [stderr]     Checking dioxus-asset-resolver v0.7.3
[INFO] [stderr]     Checking dioxus v0.7.3
[INFO] [stdout] warning: static `LYRICS_HTTP_CLIENT` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:18:8
[INFO] [stdout]    |
[INFO] [stdout] 18 | static LYRICS_HTTP_CLIENT: Lazy<reqwest::Client> = Lazy::new(reqwest::Client::new);
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `LYRICS_SUCCESS_CACHE` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:19:8
[INFO] [stdout]    |
[INFO] [stdout] 19 | static LYRICS_SUCCESS_CACHE: Lazy<Mutex<HashMap<String, LyricsResult>>> =
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DEFAULT_LYRICS_PROVIDER_KEYS` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:22:11
[INFO] [stdout]    |
[INFO] [stdout] 22 | pub const DEFAULT_LYRICS_PROVIDER_KEYS: [&str; 3] = ["lrclib", "genius", "netease"];
[INFO] [stdout]    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Netease`, `Lrclib`, and `Genius` are never constructed
[INFO] [stdout]   --> src/api/lyrics.rs:26:5
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub enum LyricsProvider {
[INFO] [stdout]    |          -------------- variants in this enum
[INFO] [stdout] 26 |     Netease,
[INFO] [stdout]    |     ^^^^^^^
[INFO] [stdout] 27 |     Lrclib,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout] 28 |     Genius,
[INFO] [stdout]    |     ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `LyricsProvider` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `key`, `label`, and `from_key` are never used
[INFO] [stdout]   --> src/api/lyrics.rs:32:12
[INFO] [stdout]    |
[INFO] [stdout] 31 | impl LyricsProvider {
[INFO] [stdout]    | ------------------- associated items in this implementation
[INFO] [stdout] 32 |     pub fn key(self) -> &'static str {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 40 |     pub fn label(self) -> &'static str {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 48 |     pub fn from_key(key: &str) -> Option<Self> {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_lyrics_provider_order` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:58:8
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub fn default_lyrics_provider_order() -> Vec<String> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_provider_keys` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:65:4
[INFO] [stdout]    |
[INFO] [stdout] 65 | fn normalize_provider_keys(order: &[String], append_defaults: bool) -> Vec<String> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_lyrics_provider_order` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:89:8
[INFO] [stdout]    |
[INFO] [stdout] 89 | pub fn normalize_lyrics_provider_order(order: &[String]) -> Vec<String> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_lyrics_provider_selection` is never used
[INFO] [stdout]   --> src/api/lyrics.rs:93:4
[INFO] [stdout]    |
[INFO] [stdout] 93 | fn normalize_lyrics_provider_selection(order: &[String]) -> Vec<String> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `from_song` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:111:12
[INFO] [stdout]     |
[INFO] [stdout] 110 | impl LyricsQuery {
[INFO] [stdout]     | ---------------- associated function in this implementation
[INFO] [stdout] 111 |     pub fn from_song(song: &Song) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PersistentLyricLine` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:135:8
[INFO] [stdout]     |
[INFO] [stdout] 135 | struct PersistentLyricLine {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PersistentLyricsResult` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:141:8
[INFO] [stdout]     |
[INFO] [stdout] 141 | struct PersistentLyricsResult {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `to_runtime` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:148:8
[INFO] [stdout]     |
[INFO] [stdout] 147 | impl PersistentLyricsResult {
[INFO] [stdout]     | --------------------------- method in this implementation
[INFO] [stdout] 148 |     fn to_runtime(&self) -> Option<LyricsResult> {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_lyrics_with_fallback` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:192:14
[INFO] [stdout]     |
[INFO] [stdout] 192 | pub async fn fetch_lyrics_with_fallback(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_lyrics_candidates` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:295:14
[INFO] [stdout]     |
[INFO] [stdout] 295 | pub async fn search_lyrics_candidates(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_provider_candidates` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:382:10
[INFO] [stdout]     |
[INFO] [stdout] 382 | async fn search_provider_candidates(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_from_provider` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:394:10
[INFO] [stdout]     |
[INFO] [stdout] 394 | async fn fetch_from_provider(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_netease_candidates` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:415:10
[INFO] [stdout]     |
[INFO] [stdout] 415 | async fn search_netease_candidates(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_from_netease` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:521:10
[INFO] [stdout]     |
[INFO] [stdout] 521 | async fn fetch_from_netease(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `LrclibResponse` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:655:8
[INFO] [stdout]     |
[INFO] [stdout] 655 | struct LrclibResponse {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_lrclib_candidates` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:670:10
[INFO] [stdout]     |
[INFO] [stdout] 670 | async fn search_lrclib_candidates(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_from_lrclib` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:788:10
[INFO] [stdout]     |
[INFO] [stdout] 788 | async fn fetch_from_lrclib(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_lrclib_result` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:860:4
[INFO] [stdout]     |
[INFO] [stdout] 860 | fn build_lrclib_result(response: LrclibResponse) -> Option<LyricsResult> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusSearchResponse` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:889:8
[INFO] [stdout]     |
[INFO] [stdout] 889 | struct GeniusSearchResponse {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusSearchPayload` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:894:8
[INFO] [stdout]     |
[INFO] [stdout] 894 | struct GeniusSearchPayload {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusSection` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:900:8
[INFO] [stdout]     |
[INFO] [stdout] 900 | struct GeniusSection {
[INFO] [stdout]     |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusHit` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:906:8
[INFO] [stdout]     |
[INFO] [stdout] 906 | struct GeniusHit {
[INFO] [stdout]     |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusSongResult` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:913:8
[INFO] [stdout]     |
[INFO] [stdout] 913 | struct GeniusSongResult {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `GeniusArtist` is never constructed
[INFO] [stdout]    --> src/api/lyrics.rs:923:8
[INFO] [stdout]     |
[INFO] [stdout] 923 | struct GeniusArtist {
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_genius_candidates` is never used
[INFO] [stdout]    --> src/api/lyrics.rs:937:10
[INFO] [stdout]     |
[INFO] [stdout] 937 | async fn search_genius_candidates(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_from_genius` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1020:10
[INFO] [stdout]      |
[INFO] [stdout] 1020 | async fn fetch_from_genius(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `netease_headers` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1105:4
[INFO] [stdout]      |
[INFO] [stdout] 1105 | fn netease_headers() -> HeaderMap {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `optional_browser_headers` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1119:4
[INFO] [stdout]      |
[INFO] [stdout] 1119 | fn optional_browser_headers() -> HeaderMap {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lyrics_cache_key` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1131:4
[INFO] [stdout]      |
[INFO] [stdout] 1131 | fn lyrics_cache_key(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lyrics_query_cache_key` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1141:4
[INFO] [stdout]      |
[INFO] [stdout] 1141 | fn lyrics_query_cache_key(query: &LyricsQuery) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `score_match` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1149:4
[INFO] [stdout]      |
[INFO] [stdout] 1149 | fn score_match(title: &str, artist: &str, duration: Option<u32>, query: &LyricsQuery) -> i32 {
[INFO] [stdout]      |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_lrc_lines` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1185:4
[INFO] [stdout]      |
[INFO] [stdout] 1185 | fn parse_lrc_lines(raw_lrc: &str) -> Vec<LyricLine> {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_lrc_timestamp` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1238:4
[INFO] [stdout]      |
[INFO] [stdout] 1238 | fn parse_lrc_timestamp(token: &str) -> Option<f64> {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `strip_lrc_metadata` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1261:4
[INFO] [stdout]      |
[INFO] [stdout] 1261 | fn strip_lrc_metadata(raw: &str) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `extract_genius_lyrics` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1294:4
[INFO] [stdout]      |
[INFO] [stdout] 1294 | fn extract_genius_lyrics(html: &str) -> Option<String> {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `strip_html_tags` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1329:4
[INFO] [stdout]      |
[INFO] [stdout] 1329 | fn strip_html_tags(input: &str) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `decode_html_entities` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1345:4
[INFO] [stdout]      |
[INFO] [stdout] 1345 | fn decode_html_entities(input: &str) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compact_whitespace` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1356:4
[INFO] [stdout]      |
[INFO] [stdout] 1356 | fn compact_whitespace(value: &str) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_for_match` is never used
[INFO] [stdout]     --> src/api/lyrics.rs:1364:4
[INFO] [stdout]      |
[INFO] [stdout] 1364 | fn normalize_for_match(value: &str) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]   --> src/api/models.rs:14:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | impl ServerConfig {
[INFO] [stdout]    | ----------------- associated function in this implementation
[INFO] [stdout] 14 |     pub fn new(name: String, url: String, username: String, password: String) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Album`, `Playlist`, `Favorites`, `RandomMix`, and `Artist` are never constructed
[INFO] [stdout]    --> src/api/models.rs:114:5
[INFO] [stdout]     |
[INFO] [stdout] 113 | pub enum QueueSourceKind {
[INFO] [stdout]     |          --------------- variants in this enum
[INFO] [stdout] 114 |     Album,
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 115 |     Playlist,
[INFO] [stdout]     |     ^^^^^^^^
[INFO] [stdout] 116 |     Favorites,
[INFO] [stdout]     |     ^^^^^^^^^
[INFO] [stdout] 117 |     RandomMix,
[INFO] [stdout]     |     ^^^^^^^^^
[INFO] [stdout] 118 |     Artist,
[INFO] [stdout]     |     ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `QueueSourceKind` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SearchResult` is never constructed
[INFO] [stdout]    --> src/api/models.rs:186:12
[INFO] [stdout]     |
[INFO] [stdout] 186 | pub struct SearchResult {
[INFO] [stdout]     |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_duration` is never used
[INFO] [stdout]    --> src/api/models.rs:205:8
[INFO] [stdout]     |
[INFO] [stdout] 205 | pub fn format_duration(seconds: u32) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `NATIVE_AUTH_CACHE` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:20:8
[INFO] [stdout]    |
[INFO] [stdout] 20 | static NATIVE_AUTH_CACHE: Lazy<Mutex<HashMap<String, NativeAuthSession>>> =
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NativeAuthSession` is never constructed
[INFO] [stdout]   --> src/api/navidrome/mod.rs:31:8
[INFO] [stdout]    |
[INFO] [stdout] 31 | struct NativeAuthSession {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `NativeSongSortField` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:37:10
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub enum NativeSongSortField {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `as_query_value` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:43:8
[INFO] [stdout]    |
[INFO] [stdout] 42 | impl NativeSongSortField {
[INFO] [stdout]    | ------------------------ method in this implementation
[INFO] [stdout] 43 |     fn as_query_value(self) -> &'static str {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `NativeSortOrder` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:52:10
[INFO] [stdout]    |
[INFO] [stdout] 52 | pub enum NativeSortOrder {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `as_query_value` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:57:8
[INFO] [stdout]    |
[INFO] [stdout] 56 | impl NativeSortOrder {
[INFO] [stdout]    | -------------------- method in this implementation
[INFO] [stdout] 57 |     fn as_query_value(self) -> &'static str {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NativeLoginRequest` is never constructed
[INFO] [stdout]   --> src/api/navidrome/mod.rs:65:8
[INFO] [stdout]    |
[INFO] [stdout] 65 | struct NativeLoginRequest {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NativeLoginResponse` is never constructed
[INFO] [stdout]   --> src/api/navidrome/mod.rs:71:8
[INFO] [stdout]    |
[INFO] [stdout] 71 | struct NativeLoginResponse {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_pick_value` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:78:4
[INFO] [stdout]    |
[INFO] [stdout] 78 | fn json_pick_value<'a>(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_pick_string` is never used
[INFO] [stdout]   --> src/api/navidrome/mod.rs:91:4
[INFO] [stdout]    |
[INFO] [stdout] 91 | fn json_pick_string(value: &serde_json::Value, keys: &[&str]) -> Option<String> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_pick_u32` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:108:4
[INFO] [stdout]     |
[INFO] [stdout] 108 | fn json_pick_u32(value: &serde_json::Value, keys: &[&str]) -> Option<u32> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `json_pick_bool` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:130:4
[INFO] [stdout]     |
[INFO] [stdout] 130 | fn json_pick_bool(value: &serde_json::Value, keys: &[&str]) -> Option<bool> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `IcyNowPlaying` is never constructed
[INFO] [stdout]    --> src/api/navidrome/mod.rs:153:12
[INFO] [stdout]     |
[INFO] [stdout] 153 | pub struct IcyNowPlaying {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/api/navidrome/auth_native_and_stream.rs:3:12
[INFO] [stdout]     |
[INFO] [stdout]   2 | impl NavidromeClient {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout]   3 |     pub fn new(server: ServerConfig) -> Self {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout]  81 |     fn native_cache_key(&self) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  88 |     fn native_base_url(&self, path: &str) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  96 |     fn clear_native_auth_session(&self) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 102 |     fn invalidate_favorites_cache(&self) {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 112 |     pub fn refresh_playlist_cache(&self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     async fn ensure_native_auth_session(&self) -> Result<NativeAuthSession, String> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 166 |     fn normalize_native_song_list(&self, payload: serde_json::Value) -> Vec<Song> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 263 |     pub async fn get_native_songs(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 311 |     pub fn get_cover_art_url(&self, cover_art_id: &str, size: u32) -> String {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 344 |     fn build_cover_art_network_url(&self, cover_art_id: &str, requested_size: u32) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 367 |     pub async fn read_icy_now_playing(stream_url: &str) -> Result<Option<IcyNowPlaying>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple associated items are never used
[INFO] [stdout]    --> src/api/navidrome/library_browsing.rs:3:18
[INFO] [stdout]     |
[INFO] [stdout]   2 | impl NavidromeClient {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout]   3 |     pub async fn ping(&self) -> Result<bool, String> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout]  22 |     pub async fn get_artists(&self) -> Result<Vec<Artist>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  58 |     pub async fn get_albums(
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 149 |     pub async fn get_song(&self, song_id: &str) -> Result<Song, String> {
[INFO] [stdout]     |                  ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 184 |     pub async fn get_artist(&self, artist_id: &str) -> Result<(Artist, Vec<Album>), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 232 |     pub async fn get_random_songs(&self, size: u32) -> Result<Vec<Song>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 310 |     pub async fn get_top_songs(&self, artist: &str, count: u32) -> Result<Vec<Song>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 333 |     pub async fn get_scan_status(&self) -> Result<ScanStatus, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 344 |     pub async fn start_scan(&self) -> Result<ScanStatus, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 355 |     fn extract_scan_status(json: SubsonicResponse) -> Result<ScanStatus, String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 371 |     pub async fn get_starred(&self) -> Result<(Vec<Artist>, Vec<Album>, Vec<Song>), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `star`, `unstar`, `set_rating`, and `get_playlists` are never used
[INFO] [stdout]    --> src/api/navidrome/bookmarks_favorites_and_playlists.rs:42:18
[INFO] [stdout]     |
[INFO] [stdout]   2 | impl NavidromeClient {
[INFO] [stdout]     | -------------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout]  42 |     pub async fn star(&self, id: &str, item_type: &str) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 163 |     pub async fn unstar(&self, id: &str, item_type: &str) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 193 |     pub async fn set_rating(&self, id: &str, rating: u32) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 213 |     pub async fn get_playlists(&self) -> Result<Vec<Playlist>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `rename_playlist`, `delete_playlist`, `remove_songs_from_playlist`, and `reorder_playlist` are never used
[INFO] [stdout]    --> src/api/navidrome/playlist_mutations.rs:3:18
[INFO] [stdout]     |
[INFO] [stdout]   2 | impl NavidromeClient {
[INFO] [stdout]     | -------------------- methods in this implementation
[INFO] [stdout]   3 |     pub async fn rename_playlist(&self, playlist_id: &str, name: &str) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 138 |     pub async fn delete_playlist(&self, playlist_id: &str) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 163 |     pub async fn remove_songs_from_playlist(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 206 |     pub async fn reorder_playlist(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `get_internet_radio_stations`, `create_internet_radio_station`, `update_internet_radio_station`, `delete_internet_radio_station`, and `search` are never used
[INFO] [stdout]    --> src/api/navidrome/radio_search_and_scrobble.rs:3:18
[INFO] [stdout]     |
[INFO] [stdout]   2 | impl NavidromeClient {
[INFO] [stdout]     | -------------------- methods in this implementation
[INFO] [stdout]   3 |     pub async fn get_internet_radio_stations(&self) -> Result<Vec<RadioStation>, String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  33 |     pub async fn create_internet_radio_station(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  62 |     pub async fn update_internet_radio_station(
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout]  96 |     pub async fn delete_internet_radio_station(&self, station_id: &str) -> Result<(), String> {
[INFO] [stdout]     |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 116 |     pub async fn search(
[INFO] [stdout]     |                  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_artist_cover_art` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:222:4
[INFO] [stdout]     |
[INFO] [stdout] 222 | fn normalize_artist_cover_art(artist: &mut Artist) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `icy_metadata_candidate_urls` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:236:4
[INFO] [stdout]     |
[INFO] [stdout] 236 | fn icy_metadata_candidate_urls(stream_url: &str) -> Vec<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `read_icy_now_playing_from_url` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:292:10
[INFO] [stdout]     |
[INFO] [stdout] 292 | async fn read_icy_now_playing_from_url(stream_url: &str) -> Result<Option<IcyNowPlaying>, String> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_icy_metadata_block` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:375:4
[INFO] [stdout]     |
[INFO] [stdout] 375 | fn parse_icy_metadata_block(block: &[u8]) -> Option<IcyNowPlaying> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `extract_icy_field` is never used
[INFO] [stdout]    --> src/api/navidrome/mod.rs:407:4
[INFO] [stdout]     |
[INFO] [stdout] 407 | fn extract_icy_field(raw: &str, field: &str) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/api/navidrome/response_models.rs:12:9
[INFO] [stdout]    |
[INFO] [stdout]  9 | pub struct SubsonicResponseInner {
[INFO] [stdout]    |            --------------------- fields in this struct
[INFO] [stdout] ...
[INFO] [stdout] 12 |     pub artists: Option<ArtistsContainer>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 13 |     #[serde(alias = "albumList2")]
[INFO] [stdout] 14 |     pub album_list2: Option<AlbumList2>,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 15 |     pub album: Option<AlbumWithSongs>,
[INFO] [stdout] 16 |     pub song: Option<Song>,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 17 |     #[serde(alias = "artist")]
[INFO] [stdout] 18 |     pub artist_detail: Option<ArtistWithAlbums>,
[INFO] [stdout]    |         ^^^^^^^^^^^^^
[INFO] [stdout] 19 |     #[serde(alias = "randomSongs")]
[INFO] [stdout] 20 |     pub random_songs: Option<SongList>,
[INFO] [stdout]    |         ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 28 |     pub top_songs: Option<SongList>,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 29 |     #[serde(alias = "starred2")]
[INFO] [stdout] 30 |     pub starred2: Option<Starred2>,
[INFO] [stdout]    |         ^^^^^^^^
[INFO] [stdout] 31 |     pub playlists: Option<PlaylistsContainer>,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 34 |     pub internet_radio_stations: Option<InternetRadioStations>,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 35 |     #[serde(alias = "searchResult3")]
[INFO] [stdout] 36 |     pub search_result3: Option<SearchResult3>,
[INFO] [stdout]    |         ^^^^^^^^^^^^^^
[INFO] [stdout] 37 |     #[serde(alias = "scanStatus")]
[INFO] [stdout] 38 |     pub scan_status: Option<ScanStatusPayload>,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `SubsonicResponseInner` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `index` is never read
[INFO] [stdout]   --> src/api/navidrome/response_models.rs:51:9
[INFO] [stdout]    |
[INFO] [stdout] 50 | pub struct ArtistsContainer {
[INFO] [stdout]    |            ---------------- field in this struct
[INFO] [stdout] 51 |     pub index: Option<Vec<ArtistIndex>>,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ArtistsContainer` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `artist` is never read
[INFO] [stdout]   --> src/api/navidrome/response_models.rs:58:9
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub struct ArtistIndex {
[INFO] [stdout]    |            ----------- field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 58 |     pub artist: Option<Vec<Artist>>,
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ArtistIndex` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `album` is never read
[INFO] [stdout]   --> src/api/navidrome/response_models.rs:63:9
[INFO] [stdout]    |
[INFO] [stdout] 62 | pub struct AlbumList2 {
[INFO] [stdout]    |            ---------- field in this struct
[INFO] [stdout] 63 |     pub album: Option<Vec<Album>>,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `AlbumList2` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: multiple fields are never read
[INFO] [stdout]   --> src/api/navidrome/response_models.rs:88:9
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub struct ArtistWithAlbums {
[INFO] [stdout]    |            ---------------- fields in this struct
[INFO] [stdout] 88 |     pub id: String,
[INFO] [stdout]    |         ^^
[INFO] [stdout] 89 |     pub name: String,
[INFO] [stdout]    |         ^^^^
[INFO] [stdout] 90 |     #[serde(alias = "albumCount")]
[INFO] [stdout] 91 |     pub album_count: Option<u32>,
[INFO] [stdout]    |         ^^^^^^^^^^^
[INFO] [stdout] 92 |     #[serde(alias = "coverArt")]
[INFO] [stdout] 93 |     pub cover_art: Option<String>,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 94 |     pub starred: Option<String>,
[INFO] [stdout]    |         ^^^^^^^
[INFO] [stdout] 95 |     #[serde(default)]
[INFO] [stdout] 96 |     pub server_id: String,
[INFO] [stdout]    |         ^^^^^^^^^
[INFO] [stdout] 97 |     pub album: Option<Vec<Album>>,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `ArtistWithAlbums` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `artist`, `album`, and `song` are never read
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:107:9
[INFO] [stdout]     |
[INFO] [stdout] 106 | pub struct Starred2 {
[INFO] [stdout]     |            -------- fields in this struct
[INFO] [stdout] 107 |     pub artist: Option<Vec<Artist>>,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] 108 |     pub album: Option<Vec<Album>>,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] 109 |     pub song: Option<Vec<Song>>,
[INFO] [stdout]     |         ^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `Starred2` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `status`, `current_task`, `seconds_remaining`, and `seconds_elapsed` are never read
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:115:9
[INFO] [stdout]     |
[INFO] [stdout] 113 | pub struct ScanStatusPayload {
[INFO] [stdout]     |            ----------------- fields in this struct
[INFO] [stdout] 114 |     #[serde(rename = "status")]
[INFO] [stdout] 115 |     pub status: Option<String>,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] 116 |     #[serde(rename = "currentTask")]
[INFO] [stdout] 117 |     pub current_task: Option<String>,
[INFO] [stdout]     |         ^^^^^^^^^^^^
[INFO] [stdout] 118 |     #[serde(rename = "secondsRemaining")]
[INFO] [stdout] 119 |     pub seconds_remaining: Option<u64>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 120 |     #[serde(rename = "secondsElapsed")]
[INFO] [stdout] 121 |     pub seconds_elapsed: Option<u64>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `ScanStatusPayload` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScanStatus` is never constructed
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:125:12
[INFO] [stdout]     |
[INFO] [stdout] 125 | pub struct ScanStatus {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `into_status` is never used
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:133:8
[INFO] [stdout]     |
[INFO] [stdout] 132 | impl ScanStatusPayload {
[INFO] [stdout]     | ---------------------- method in this implementation
[INFO] [stdout] 133 |     fn into_status(self) -> ScanStatus {
[INFO] [stdout]     |        ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `playlist` is never read
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:145:9
[INFO] [stdout]     |
[INFO] [stdout] 144 | pub struct PlaylistsContainer {
[INFO] [stdout]     |            ------------------ field in this struct
[INFO] [stdout] 145 |     pub playlist: Option<Vec<Playlist>>,
[INFO] [stdout]     |         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `PlaylistsContainer` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `internet_radio_station` is never read
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:171:9
[INFO] [stdout]     |
[INFO] [stdout] 169 | pub struct InternetRadioStations {
[INFO] [stdout]     |            --------------------- field in this struct
[INFO] [stdout] 170 |     #[serde(alias = "internetRadioStation")]
[INFO] [stdout] 171 |     pub internet_radio_station: Option<Vec<RadioStation>>,
[INFO] [stdout]     |         ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `InternetRadioStations` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `artist`, `album`, and `song` are never read
[INFO] [stdout]    --> src/api/navidrome/response_models.rs:176:9
[INFO] [stdout]     |
[INFO] [stdout] 175 | pub struct SearchResult3 {
[INFO] [stdout]     |            ------------- fields in this struct
[INFO] [stdout] 176 |     pub artist: Option<Vec<Artist>>,
[INFO] [stdout]     |         ^^^^^^
[INFO] [stdout] 177 |     pub album: Option<Vec<Album>>,
[INFO] [stdout]     |         ^^^^^
[INFO] [stdout] 178 |     pub song: Option<Vec<Song>>,
[INFO] [stdout]     |         ^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `SearchResult3` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `clear`, `size_bytes`, `resize_max_size_mb`, and `stats` are never used
[INFO] [stdout]    --> src/cache.rs:147:12
[INFO] [stdout]     |
[INFO] [stdout]  95 | impl SimpleCache {
[INFO] [stdout]     | ---------------- methods in this implementation
[INFO] [stdout] ...
[INFO] [stdout] 147 |     pub fn clear(&mut self) {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 168 |     pub fn size_bytes(&self) -> usize {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 172 |     pub fn resize_max_size_mb(&mut self, max_size_mb: u32) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 202 |     pub fn stats(&self) -> CacheStats {
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CacheStats` is never constructed
[INFO] [stdout]    --> src/cache.rs:212:12
[INFO] [stdout]     |
[INFO] [stdout] 212 | pub struct CacheStats {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: field `cache_size_mb` is never read
[INFO] [stdout]   --> src/cache_service.rs:14:5
[INFO] [stdout]    |
[INFO] [stdout] 10 | struct RuntimeCacheConfig {
[INFO] [stdout]    |        ------------------ field in this struct
[INFO] [stdout] ...
[INFO] [stdout] 14 |     cache_size_mb: u32,
[INFO] [stdout]    |     ^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `RuntimeCacheConfig` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_enabled` is never used
[INFO] [stdout]   --> src/cache_service.rs:58:8
[INFO] [stdout]    |
[INFO] [stdout] 58 | pub fn is_enabled(include_images: bool) -> bool {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_settings` is never used
[INFO] [stdout]   --> src/cache_service.rs:73:8
[INFO] [stdout]    |
[INFO] [stdout] 73 | pub fn apply_settings(settings: &AppSettings) {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `clear_all` is never used
[INFO] [stdout]    --> src/cache_service.rs:131:8
[INFO] [stdout]     |
[INFO] [stdout] 131 | pub fn clear_all() {
[INFO] [stdout]     |        ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stats` is never used
[INFO] [stdout]    --> src/cache_service.rs:137:8
[INFO] [stdout]     |
[INFO] [stdout] 137 | pub fn stats() -> CacheStats {
[INFO] [stdout]     |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `VolumeSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:18:12
[INFO] [stdout]    |
[INFO] [stdout] 18 | pub struct VolumeSignal(pub Signal<f64>);
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SeekRequestSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:25:12
[INFO] [stdout]    |
[INFO] [stdout] 25 | pub struct SeekRequestSignal(pub Signal<Option<(String, f64)>>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `SidebarOpenSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:28:12
[INFO] [stdout]    |
[INFO] [stdout] 28 | pub struct SidebarOpenSignal(pub Signal<bool>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PreviewPlaybackSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:31:12
[INFO] [stdout]    |
[INFO] [stdout] 31 | pub struct PreviewPlaybackSignal(pub Signal<bool>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeRefreshSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:34:12
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub struct HomeRefreshSignal(pub Signal<u64>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `IsPlayingSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:37:12
[INFO] [stdout]    |
[INFO] [stdout] 37 | pub struct IsPlayingSignal(pub Signal<bool>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ShuffleEnabledSignal` is never constructed
[INFO] [stdout]   --> src/components/mod.rs:40:12
[INFO] [stdout]    |
[INFO] [stdout] 40 | pub struct ShuffleEnabledSignal(pub Signal<bool>);
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUICK_PREVIEW_DURATION_MS` is never used
[INFO] [stdout]  --> src/components/add_to_menu/intent.rs:3:7
[INFO] [stdout]   |
[INFO] [stdout] 3 | const QUICK_PREVIEW_DURATION_MS: u64 = 12000;
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_preview_delay_ms` is never used
[INFO] [stdout]  --> src/components/add_to_menu/intent.rs:6:10
[INFO] [stdout]   |
[INFO] [stdout] 6 | async fn quick_preview_delay_ms(ms: u64) {
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: fields `target` and `label` are never read
[INFO] [stdout]   --> src/components/add_to_menu/intent.rs:34:9
[INFO] [stdout]    |
[INFO] [stdout] 33 | pub struct AddIntent {
[INFO] [stdout]    |            --------- fields in this struct
[INFO] [stdout] 34 |     pub target: AddTarget,
[INFO] [stdout]    |         ^^^^^^
[INFO] [stdout] 35 |     pub label: String,
[INFO] [stdout]    |         ^^^^^
[INFO] [stdout]    |
[INFO] [stdout]    = note: `AddIntent` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated functions `from_song`, `from_album`, and `from_playlist` are never used
[INFO] [stdout]   --> src/components/add_to_menu/intent.rs:39:12
[INFO] [stdout]    |
[INFO] [stdout] 38 | impl AddIntent {
[INFO] [stdout]    | -------------- associated functions in this implementation
[INFO] [stdout] 39 |     pub fn from_song(song: Song) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 54 |     pub fn from_album(album: &Album) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 65 |     pub fn from_playlist(playlist: &Playlist) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `open`, `close`, and `current` are never used
[INFO] [stdout]   --> src/components/add_to_menu/intent.rs:83:12
[INFO] [stdout]    |
[INFO] [stdout] 82 | impl AddMenuController {
[INFO] [stdout]    | ---------------------- associated items in this implementation
[INFO] [stdout] 83 |     pub fn new(intent: Signal<Option<AddIntent>>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 87 |     pub fn open(&mut self, intent: AddIntent) {
[INFO] [stdout]    |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 91 |     pub fn close(&mut self) {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 95 |     pub fn current(&self) -> Option<AddIntent> {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `SuggestionDestination` is never used
[INFO] [stdout]    --> src/components/add_to_menu/intent.rs:101:6
[INFO] [stdout]     |
[INFO] [stdout] 101 | enum SuggestionDestination {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_key` is never used
[INFO] [stdout]    --> src/components/add_to_menu/intent.rs:109:4
[INFO] [stdout]     |
[INFO] [stdout] 109 | fn song_key(song: &Song) -> String {
[INFO] [stdout]     |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resolve_target_songs` is never used
[INFO] [stdout]  --> src/components/add_to_menu/song_resolver.rs:3:10
[INFO] [stdout]   |
[INFO] [stdout] 3 | async fn resolve_target_songs(
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_similar_songs_for_seed` is never used
[INFO] [stdout]   --> src/components/add_to_menu/song_resolver.rs:43:10
[INFO] [stdout]    |
[INFO] [stdout] 43 | async fn fetch_similar_songs_for_seed(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_dual_seed_suggestions` is never used
[INFO] [stdout]   --> src/components/add_to_menu/song_resolver.rs:96:10
[INFO] [stdout]    |
[INFO] [stdout] 96 | async fn build_dual_seed_suggestions(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_INIT_QUICK_PICK_LIMIT_STANDARD` is never used
[INFO] [stdout]   --> src/components/app.rs:44:7
[INFO] [stdout]    |
[INFO] [stdout] 44 | const HOME_INIT_QUICK_PICK_LIMIT_STANDARD: usize = 72;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_INIT_SECTION_BASE_COUNT_STANDARD` is never used
[INFO] [stdout]   --> src/components/app.rs:45:7
[INFO] [stdout]    |
[INFO] [stdout] 45 | const HOME_INIT_SECTION_BASE_COUNT_STANDARD: usize = 9;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_INIT_SECTION_LOAD_STEP_STANDARD` is never used
[INFO] [stdout]   --> src/components/app.rs:46:7
[INFO] [stdout]    |
[INFO] [stdout] 46 | const HOME_INIT_SECTION_LOAD_STEP_STANDARD: usize = 6;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_INIT_SECTION_FETCH_LIMIT_STANDARD` is never used
[INFO] [stdout]   --> src/components/app.rs:47:7
[INFO] [stdout]    |
[INFO] [stdout] 47 | const HOME_INIT_SECTION_FETCH_LIMIT_STANDARD: usize = 180;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_INIT_WARMUP_FLAG_CACHE_HOURS` is never used
[INFO] [stdout]   --> src/components/app.rs:48:7
[INFO] [stdout]    |
[INFO] [stdout] 48 | const HOME_INIT_WARMUP_FLAG_CACHE_HOURS: u32 = 24 * 365;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_DOWNLOAD_POLL_INTERVAL_MS` is never used
[INFO] [stdout]   --> src/components/app.rs:49:7
[INFO] [stdout]    |
[INFO] [stdout] 49 | const AUTO_DOWNLOAD_POLL_INTERVAL_MS: u64 = 5 * 60 * 1000;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeInitFetchBudget` is never constructed
[INFO] [stdout]   --> src/components/app.rs:52:8
[INFO] [stdout]    |
[INFO] [stdout] 52 | struct HomeInitFetchBudget {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_fetch_budget` is never used
[INFO] [stdout]   --> src/components/app.rs:62:4
[INFO] [stdout]    |
[INFO] [stdout] 62 | fn home_init_fetch_budget(profile: HomeFeedLoadProfile) -> HomeInitFetchBudget {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_profile_from_settings` is never used
[INFO] [stdout]    --> src/components/app.rs:109:4
[INFO] [stdout]     |
[INFO] [stdout] 109 | fn home_init_profile_from_settings(settings: &AppSettings) -> HomeFeedLoadProfile {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_profile_cache_key` is never used
[INFO] [stdout]    --> src/components/app.rs:113:4
[INFO] [stdout]     |
[INFO] [stdout] 113 | fn home_init_profile_cache_key(profile: HomeFeedLoadProfile) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `queue_snapshot_signature` is never used
[INFO] [stdout]    --> src/components/app.rs:117:4
[INFO] [stdout]     |
[INFO] [stdout] 117 | fn queue_snapshot_signature(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `loading_progress_percent` is never used
[INFO] [stdout]    --> src/components/app.rs:162:4
[INFO] [stdout]     |
[INFO] [stdout] 162 | fn loading_progress_percent(progress: f32) -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_volume` is never used
[INFO] [stdout]    --> src/components/app.rs:185:4
[INFO] [stdout]     |
[INFO] [stdout] 185 | fn normalize_volume(mut value: f64) -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_warmup_cache_key` is never used
[INFO] [stdout]    --> src/components/app.rs:197:4
[INFO] [stdout]     |
[INFO] [stdout] 197 | fn home_init_warmup_cache_key(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_cache_prefix` is never used
[INFO] [stdout]    --> src/components/app.rs:213:4
[INFO] [stdout]     |
[INFO] [stdout] 213 | fn home_init_cache_prefix(active_servers: &[ServerConfig], profile: HomeFeedLoadProfile) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeFeedState` is never constructed
[INFO] [stdout]    --> src/components/app.rs:227:12
[INFO] [stdout]     |
[INFO] [stdout] 227 | pub struct HomeFeedState {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `CachedHomeFeedSnapshot` is never constructed
[INFO] [stdout]    --> src/components/app.rs:240:8
[INFO] [stdout]     |
[INFO] [stdout] 240 | struct CachedHomeFeedSnapshot {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `has_full_snapshot` is never used
[INFO] [stdout]    --> src/components/app.rs:250:8
[INFO] [stdout]     |
[INFO] [stdout] 249 | impl CachedHomeFeedSnapshot {
[INFO] [stdout]     | --------------------------- method in this implementation
[INFO] [stdout] 250 |     fn has_full_snapshot(&self) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeFeedSnapshot` is never constructed
[INFO] [stdout]    --> src/components/app.rs:261:8
[INFO] [stdout]     |
[INFO] [stdout] 261 | struct HomeFeedSnapshot {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `summary` is never used
[INFO] [stdout]    --> src/components/app.rs:271:8
[INFO] [stdout]     |
[INFO] [stdout] 270 | impl HomeFeedSnapshot {
[INFO] [stdout]     | --------------------- method in this implementation
[INFO] [stdout] 271 |     fn summary(&self) -> HomeInitSummary {
[INFO] [stdout]     |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_cached_home_feed_snapshot` is never used
[INFO] [stdout]    --> src/components/app.rs:283:4
[INFO] [stdout]     |
[INFO] [stdout] 283 | fn load_cached_home_feed_snapshot(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_cached_home_feed_snapshot` is never used
[INFO] [stdout]    --> src/components/app.rs:302:4
[INFO] [stdout]     |
[INFO] [stdout] 302 | fn apply_cached_home_feed_snapshot(home_feed: &HomeFeedState, snapshot: &CachedHomeFeedSnapshot) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_home_feed_snapshot` is never used
[INFO] [stdout]    --> src/components/app.rs:354:4
[INFO] [stdout]     |
[INFO] [stdout] 354 | fn apply_home_feed_snapshot(home_feed: &HomeFeedState, snapshot: &HomeFeedSnapshot) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `set_empty_home_feed_snapshot` is never used
[INFO] [stdout]    --> src/components/app.rs:383:4
[INFO] [stdout]     |
[INFO] [stdout] 383 | fn set_empty_home_feed_snapshot(home_feed: &HomeFeedState) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_has_cached_payload` is never used
[INFO] [stdout]    --> src/components/app.rs:403:4
[INFO] [stdout]     |
[INFO] [stdout] 403 | fn home_init_has_cached_payload(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_is_warmed` is never used
[INFO] [stdout]    --> src/components/app.rs:410:4
[INFO] [stdout]     |
[INFO] [stdout] 410 | fn home_init_is_warmed(active_servers: &[ServerConfig], profile: HomeFeedLoadProfile) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_server_signature` is never used
[INFO] [stdout]    --> src/components/app.rs:425:4
[INFO] [stdout]     |
[INFO] [stdout] 425 | fn home_init_server_signature(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_song_key` is never used
[INFO] [stdout]    --> src/components/app.rs:441:4
[INFO] [stdout]     |
[INFO] [stdout] 441 | fn home_init_song_key(song: &Song) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_home_init_played_timestamp` is never used
[INFO] [stdout]    --> src/components/app.rs:445:4
[INFO] [stdout]     |
[INFO] [stdout] 445 | fn parse_home_init_played_timestamp(value: &str) -> Option<i64> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_home_init_optional_i64_desc` is never used
[INFO] [stdout]    --> src/components/app.rs:464:4
[INFO] [stdout]     |
[INFO] [stdout] 464 | fn compare_home_init_optional_i64_desc(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_home_init_optional_u32_desc` is never used
[INFO] [stdout]    --> src/components/app.rs:476:4
[INFO] [stdout]     |
[INFO] [stdout] 476 | fn compare_home_init_optional_u32_desc(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_home_init_song_title` is never used
[INFO] [stdout]    --> src/components/app.rs:488:4
[INFO] [stdout]     |
[INFO] [stdout] 488 | fn compare_home_init_song_title(left: &Song, right: &Song) -> std::cmp::Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sort_home_init_songs` is never used
[INFO] [stdout]    --> src/components/app.rs:492:4
[INFO] [stdout]     |
[INFO] [stdout] 492 | fn sort_home_init_songs(songs: &mut [Song], sort: NativeSongSortField) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_home_init_songs` is never used
[INFO] [stdout]    --> src/components/app.rs:520:4
[INFO] [stdout]     |
[INFO] [stdout] 520 | fn dedupe_home_init_songs(songs: Vec<Song>, limit: usize) -> Vec<Song> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merge_home_init_song_lists` is never used
[INFO] [stdout]    --> src/components/app.rs:535:4
[INFO] [stdout]     |
[INFO] [stdout] 535 | fn merge_home_init_song_lists(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_home_init_albums_for_servers` is never used
[INFO] [stdout]    --> src/components/app.rs:545:10
[INFO] [stdout]     |
[INFO] [stdout] 545 | async fn fetch_home_init_albums_for_servers(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_home_init_random_songs_for_servers` is never used
[INFO] [stdout]    --> src/components/app.rs:574:10
[INFO] [stdout]     |
[INFO] [stdout] 574 | async fn fetch_home_init_random_songs_for_servers(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_home_init_sorted_songs_for_servers` is never used
[INFO] [stdout]    --> src/components/app.rs:595:10
[INFO] [stdout]     |
[INFO] [stdout] 595 | async fn fetch_home_init_sorted_songs_for_servers(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_init_fetch_yield` is never used
[INFO] [stdout]    --> src/components/app.rs:627:10
[INFO] [stdout]     |
[INFO] [stdout] 627 | async fn home_init_fetch_yield() {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `loading_log_poll_sleep` is never used
[INFO] [stdout]    --> src/components/app.rs:637:10
[INFO] [stdout]     |
[INFO] [stdout] 637 | async fn loading_log_poll_sleep() {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `auto_download_poll_sleep` is never used
[INFO] [stdout]    --> src/components/app.rs:647:10
[INFO] [stdout]     |
[INFO] [stdout] 647 | async fn auto_download_poll_sleep() {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeInitSummary` is never constructed
[INFO] [stdout]    --> src/components/app.rs:660:8
[INFO] [stdout]     |
[INFO] [stdout] 660 | struct HomeInitSummary {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `initialize_home_cache` is never used
[INFO] [stdout]    --> src/components/app.rs:669:10
[INFO] [stdout]     |
[INFO] [stdout] 669 | async fn initialize_home_cache(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `view_label` is never used
[INFO] [stdout]   --> src/components/app_view.rs:55:8
[INFO] [stdout]    |
[INFO] [stdout] 55 | pub fn view_label(view: &AppView) -> &'static str {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `view_instance_key` is never used
[INFO] [stdout]   --> src/components/app_view.rs:78:8
[INFO] [stdout]    |
[INFO] [stdout] 78 | pub fn view_instance_key(view: &AppView) -> String {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AudioState` is never constructed
[INFO] [stdout]   --> src/components/audio_manager/shared_types_and_web_helpers.rs:86:12
[INFO] [stdout]    |
[INFO] [stdout] 86 | pub struct AudioState {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `set_transport_loading` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:109:4
[INFO] [stdout]     |
[INFO] [stdout] 109 | fn set_transport_loading(mut audio_state: Signal<AudioState>, loading: bool, message: Option<&str>) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ios_audio_log_snapshot` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:376:8
[INFO] [stdout]     |
[INFO] [stdout] 376 | pub fn ios_audio_log_snapshot(_max_lines: usize) -> Vec<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ios_audio_log_clear` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:504:8
[INFO] [stdout]     |
[INFO] [stdout] 504 | pub fn ios_audio_log_clear() {}
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ios_audio_log_export_txt` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:507:8
[INFO] [stdout]     |
[INFO] [stdout] 507 | pub fn ios_audio_log_export_txt(_contents: &str) -> Result<String, String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ios_diag_now_ms` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:623:4
[INFO] [stdout]     |
[INFO] [stdout] 623 | fn ios_diag_now_ms() -> u128 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ios_diag_log` is never used
[INFO] [stdout]    --> src/components/audio_manager/shared_types_and_web_helpers.rs:628:8
[INFO] [stdout]     |
[INFO] [stdout] 628 | pub fn ios_diag_log(_tag: &str, _message: &str) {}
[INFO] [stdout]     |        ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `NATIVE_AUDIO_BOOTSTRAP_JS` is never used
[INFO] [stdout]  --> src/components/audio_manager/native_bridge_bootstrap.rs:8:7
[INFO] [stdout]   |
[INFO] [stdout] 8 | const NATIVE_AUDIO_BOOTSTRAP_JS: &str = r#"
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NativeAudioSnapshot` is never constructed
[INFO] [stdout]  --> src/components/audio_manager/native_windows_backend.rs:5:8
[INFO] [stdout]   |
[INFO] [stdout] 5 | struct NativeAudioSnapshot {
[INFO] [stdout]   |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `NativeTrackMetadata` is never constructed
[INFO] [stdout]   --> src/components/audio_manager/native_windows_backend.rs:18:8
[INFO] [stdout]    |
[INFO] [stdout] 18 | struct NativeTrackMetadata {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ensure_native_audio_bridge` is never used
[INFO] [stdout]  --> src/components/audio_manager/native_bridge_runtime.rs:7:4
[INFO] [stdout]   |
[INFO] [stdout] 7 | fn ensure_native_audio_bridge() {
[INFO] [stdout]   |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `native_audio_command` is never used
[INFO] [stdout]   --> src/components/audio_manager/native_bridge_runtime.rs:26:4
[INFO] [stdout]    |
[INFO] [stdout] 26 | fn native_audio_command(value: serde_json::Value) {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `native_audio_snapshot` is never used
[INFO] [stdout]   --> src/components/audio_manager/native_bridge_runtime.rs:60:10
[INFO] [stdout]    |
[INFO] [stdout] 60 | async fn native_audio_snapshot() -> Option<NativeAudioSnapshot> {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `native_delay_ms` is never used
[INFO] [stdout]    --> src/components/audio_manager/native_bridge_runtime.rs:100:10
[INFO] [stdout]     |
[INFO] [stdout] 100 | async fn native_delay_ms(ms: u64) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_metadata` is never used
[INFO] [stdout]    --> src/components/audio_manager/native_bridge_runtime.rs:121:4
[INFO] [stdout]     |
[INFO] [stdout] 121 | fn song_metadata(song: &Song, servers: &[ServerConfig]) -> NativeTrackMetadata {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `queue_extension_song_key` is never used
[INFO] [stdout]   --> src/components/audio_manager/queue_and_stream_helpers.rs:14:4
[INFO] [stdout]    |
[INFO] [stdout] 14 | fn queue_extension_song_key(song: &Song) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `extend_unique_queue_candidates` is never used
[INFO] [stdout]   --> src/components/audio_manager/queue_and_stream_helpers.rs:18:4
[INFO] [stdout]    |
[INFO] [stdout] 18 | fn extend_unique_queue_candidates(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `generate_queue_extension_from_seed` is never used
[INFO] [stdout]   --> src/components/audio_manager/queue_and_stream_helpers.rs:36:21
[INFO] [stdout]    |
[INFO] [stdout] 36 | pub(crate) async fn generate_queue_extension_from_seed(
[INFO] [stdout]    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `assign_collection_queue_meta` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:103:15
[INFO] [stdout]     |
[INFO] [stdout] 103 | pub(crate) fn assign_collection_queue_meta(
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `queue_should_generate_similar_on_end` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:130:15
[INFO] [stdout]     |
[INFO] [stdout] 130 | pub(crate) fn queue_should_generate_similar_on_end(
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_collection_shuffle_mode` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:150:15
[INFO] [stdout]     |
[INFO] [stdout] 150 | pub(crate) fn apply_collection_shuffle_mode(
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `queue_source_kind_tag` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:290:4
[INFO] [stdout]     |
[INFO] [stdout] 290 | fn queue_source_kind_tag(source_kind: &QueueSourceKind) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `shuffle_songs_in_place` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:313:4
[INFO] [stdout]     |
[INFO] [stdout] 313 | fn shuffle_songs_in_place(songs: &mut [Song]) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `spawn_shuffle_queue` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:387:15
[INFO] [stdout]     |
[INFO] [stdout] 387 | pub(crate) fn spawn_shuffle_queue(
[INFO] [stdout]     |               ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resolve_stream_url` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:476:4
[INFO] [stdout]     |
[INFO] [stdout] 476 | fn resolve_stream_url(song: &Song, servers: &[ServerConfig], offline_mode: bool) -> Option<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `can_save_server_bookmark` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:506:4
[INFO] [stdout]     |
[INFO] [stdout] 506 | fn can_save_server_bookmark(song: &Song) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `scrobble_song` is never used
[INFO] [stdout]    --> src/components/audio_manager/queue_and_stream_helpers.rs:523:4
[INFO] [stdout]     |
[INFO] [stdout] 523 | fn scrobble_song(servers: &[ServerConfig], song: &Song, finished: bool) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `seek_to` is never used
[INFO] [stdout]   --> src/components/audio_manager/playback_api.rs:11:8
[INFO] [stdout]    |
[INFO] [stdout] 11 | pub fn seek_to(position: f64) {
[INFO] [stdout]    |        ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `Navigation` is never constructed
[INFO] [stdout]   --> src/components/navigation.rs:12:12
[INFO] [stdout]    |
[INFO] [stdout] 12 | pub struct Navigation(
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `should_refresh_detail_route` is never used
[INFO] [stdout]   --> src/components/navigation.rs:18:4
[INFO] [stdout]    |
[INFO] [stdout] 18 | fn should_refresh_detail_route(current: &AppView, target: &AppView) -> bool {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `route_refresh_pause` is never used
[INFO] [stdout]   --> src/components/navigation.rs:55:10
[INFO] [stdout]    |
[INFO] [stdout] 55 | async fn route_refresh_pause() {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `reset_main_scroll_position` is never used
[INFO] [stdout]   --> src/components/navigation.rs:64:4
[INFO] [stdout]    |
[INFO] [stdout] 64 | fn reset_main_scroll_position() {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `navigate_to`, `resume_pending_navigation`, `can_go_back`, and `go_back` are never used
[INFO] [stdout]    --> src/components/navigation.rs:101:12
[INFO] [stdout]     |
[INFO] [stdout] 100 | impl Navigation {
[INFO] [stdout]     | --------------- associated items in this implementation
[INFO] [stdout] 101 |     pub fn new(
[INFO] [stdout]     |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 109 |     pub fn navigate_to(&self, target: AppView) {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 131 |     pub fn resume_pending_navigation(&self) {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 153 |     pub fn can_go_back(&self) -> bool {
[INFO] [stdout]     |            ^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 157 |     pub fn go_back(&self) -> Option<AppView> {
[INFO] [stdout]     |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SIDEBAR_LOGO` is never used
[INFO] [stdout]  --> src/components/sidebar.rs:5:7
[INFO] [stdout]   |
[INFO] [stdout] 5 | const SIDEBAR_LOGO: Asset = asset!("/assets/favicon-96x96.png");
[INFO] [stdout]   |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: variants `Queue`, `Related`, and `Lyrics` are never constructed
[INFO] [stdout]  --> src/components/song_details/types.rs:6:5
[INFO] [stdout]   |
[INFO] [stdout] 4 | pub enum SongDetailsTab {
[INFO] [stdout]   |          -------------- variants in this enum
[INFO] [stdout] 5 |     Details,
[INFO] [stdout] 6 |     Queue,
[INFO] [stdout]   |     ^^^^^
[INFO] [stdout] 7 |     Related,
[INFO] [stdout]   |     ^^^^^^^
[INFO] [stdout] 8 |     Lyrics,
[INFO] [stdout]   |     ^^^^^^
[INFO] [stdout]   |
[INFO] [stdout]   = note: `SongDetailsTab` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `label` is never used
[INFO] [stdout]   --> src/components/song_details/types.rs:12:8
[INFO] [stdout]    |
[INFO] [stdout] 11 | impl SongDetailsTab {
[INFO] [stdout]    | ------------------- method in this implementation
[INFO] [stdout] 12 |     fn label(self) -> &'static str {
[INFO] [stdout]    |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `new`, `open`, `close`, `set_tab`, and `current` are never used
[INFO] [stdout]   --> src/components/song_details/types.rs:45:12
[INFO] [stdout]    |
[INFO] [stdout] 44 | impl SongDetailsController {
[INFO] [stdout]    | -------------------------- associated items in this implementation
[INFO] [stdout] 45 |     pub fn new(state: Signal<SongDetailsState>) -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 49 |     pub fn open(&mut self, song: Song) {
[INFO] [stdout]    |            ^^^^
[INFO] [stdout] ...
[INFO] [stdout] 56 |     pub fn close(&mut self) {
[INFO] [stdout]    |            ^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 62 |     pub fn set_tab(&mut self, tab: SongDetailsTab) {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 68 |     pub fn current(&self) -> SongDetailsState {
[INFO] [stdout]    |            ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DESKTOP_TABS` is never used
[INFO] [stdout]   --> src/components/song_details/types.rs:73:7
[INFO] [stdout]    |
[INFO] [stdout] 73 | const DESKTOP_TABS: [SongDetailsTab; 3] = [
[INFO] [stdout]    |       ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `MOBILE_TABS` is never used
[INFO] [stdout]   --> src/components/song_details/types.rs:78:7
[INFO] [stdout]    |
[INFO] [stdout] 78 | const MOBILE_TABS: [SongDetailsTab; 4] = [
[INFO] [stdout]    |       ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_live_song` is never used
[INFO] [stdout]   --> src/components/song_details/types.rs:84:4
[INFO] [stdout]    |
[INFO] [stdout] 84 | fn is_live_song(song: &Song) -> bool {
[INFO] [stdout]    |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `plain_lyrics_lines` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:22:4
[INFO] [stdout]    |
[INFO] [stdout] 22 | fn plain_lyrics_lines(lyrics: &LyricsResult) -> Vec<String> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScreenshotLyricBar` is never constructed
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:33:8
[INFO] [stdout]    |
[INFO] [stdout] 33 | struct ScreenshotLyricBar {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ScreenshotShotTheme` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:39:6
[INFO] [stdout]    |
[INFO] [stdout] 39 | enum ScreenshotShotTheme {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ScreenshotTextPalette` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:47:6
[INFO] [stdout]    |
[INFO] [stdout] 47 | enum ScreenshotTextPalette {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ScreenshotShareIntent` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:56:6
[INFO] [stdout]    |
[INFO] [stdout] 56 | enum ScreenshotShareIntent {
[INFO] [stdout]    |      ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_lyrics_bars` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:61:4
[INFO] [stdout]    |
[INFO] [stdout] 61 | fn screenshot_lyrics_bars(lyrics: &LyricsResult, sync_lyrics: bool) -> Vec<ScreenshotLyricBar> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_bar_label` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:83:4
[INFO] [stdout]    |
[INFO] [stdout] 83 | fn screenshot_bar_label(bar: &ScreenshotLyricBar, include_timestamp: bool) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_share_file_name` is never used
[INFO] [stdout]   --> src/components/song_details/lyrics_panel.rs:93:4
[INFO] [stdout]    |
[INFO] [stdout] 93 | fn screenshot_share_file_name(song_title: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_share_intent_key` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:122:4
[INFO] [stdout]     |
[INFO] [stdout] 122 | fn screenshot_share_intent_key(intent: ScreenshotShareIntent) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ShotTextColors` is never constructed
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:130:8
[INFO] [stdout]     |
[INFO] [stdout] 130 | struct ShotTextColors {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_shot_text_colors` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:140:4
[INFO] [stdout]     |
[INFO] [stdout] 140 | fn screenshot_shot_text_colors(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_picker_pill_class` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:207:4
[INFO] [stdout]     |
[INFO] [stdout] 207 | fn screenshot_picker_pill_class(active: bool) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `screenshot_share_status_message` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:215:4
[INFO] [stdout]     |
[INFO] [stdout] 215 | fn screenshot_share_status_message(status: &str, intent: ScreenshotShareIntent) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lyrics_share_delay_ms` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:257:10
[INFO] [stdout]     |
[INFO] [stdout] 257 | async fn lyrics_share_delay_ms(ms: u64) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `share_screenshot_lyrics_image` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:266:10
[INFO] [stdout]     |
[INFO] [stdout] 266 | async fn share_screenshot_lyrics_image(
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RUSTYSOUND_MARK` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:916:7
[INFO] [stdout]     |
[INFO] [stdout] 916 | const RUSTYSOUND_MARK: Asset = asset!("/assets/favicon-96x96.png");
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HTML2CANVAS_BUNDLE` is never used
[INFO] [stdout]    --> src/components/song_details/lyrics_panel.rs:917:7
[INFO] [stdout]     |
[INFO] [stdout] 917 | const HTML2CANVAS_BUNDLE: &str = include_str!("../../../assets/vendor/html2canvas.min.js");
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_cover_url` is never used
[INFO] [stdout]  --> src/components/song_details/helpers.rs:3:4
[INFO] [stdout]   |
[INFO] [stdout] 3 | fn song_cover_url(song: &Song, servers: &[ServerConfig], size: u32) -> Option<String> {
[INFO] [stdout]   |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_first_available_lyrics` is never used
[INFO] [stdout]   --> src/components/song_details/helpers.rs:10:10
[INFO] [stdout]    |
[INFO] [stdout] 10 | async fn fetch_first_available_lyrics(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_mini_lyrics_preview` is never used
[INFO] [stdout]   --> src/components/song_details/helpers.rs:36:4
[INFO] [stdout]    |
[INFO] [stdout] 36 | fn build_mini_lyrics_preview(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pick_display_lyrics` is never used
[INFO] [stdout]   --> src/components/song_details/helpers.rs:86:4
[INFO] [stdout]    |
[INFO] [stdout] 86 | fn pick_display_lyrics(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `active_lyric_index` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:124:4
[INFO] [stdout]     |
[INFO] [stdout] 124 | fn active_lyric_index(lines: &[LyricLine], playback_seconds: f64) -> Option<usize> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_timestamp` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:140:4
[INFO] [stdout]     |
[INFO] [stdout] 140 | fn format_timestamp(seconds: f64) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_dom_id` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:147:4
[INFO] [stdout]     |
[INFO] [stdout] 147 | fn sanitize_dom_id(raw: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `now_millis` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:165:4
[INFO] [stdout]     |
[INFO] [stdout] 165 | fn now_millis() -> f64 {
[INFO] [stdout]     |    ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `adjusted_queue_index_after_reorder` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:181:4
[INFO] [stdout]     |
[INFO] [stdout] 181 | fn adjusted_queue_index_after_reorder(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `reorder_queue_entry` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:197:4
[INFO] [stdout]     |
[INFO] [stdout] 197 | fn reorder_queue_entry(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_queue_entry` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:242:4
[INFO] [stdout]     |
[INFO] [stdout] 242 | fn remove_queue_entry(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_related_candidates` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:288:10
[INFO] [stdout]     |
[INFO] [stdout] 288 | async fn fetch_related_candidates(client: &NavidromeClient, song: &Song, count: u32) -> Vec<Song> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `toggle_song_favorite` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:326:4
[INFO] [stdout]     |
[INFO] [stdout] 326 | fn toggle_song_favorite(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `set_now_playing_rating` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:376:4
[INFO] [stdout]     |
[INFO] [stdout] 376 | fn set_now_playing_rating(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_related_songs` is never used
[INFO] [stdout]    --> src/components/song_details/helpers.rs:423:10
[INFO] [stdout]     |
[INFO] [stdout] 423 | async fn load_related_songs(maybe_song: Option<Song>, servers: Vec<ServerConfig>) -> Vec<Song> {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `anchored_menu_style` is never used
[INFO] [stdout]   --> src/components/views/album_detail.rs:15:4
[INFO] [stdout]    |
[INFO] [stdout] 15 | fn anchored_menu_style(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `anchored_menu_style` is never used
[INFO] [stdout]   --> src/components/views/album_song_row.rs:10:4
[INFO] [stdout]    |
[INFO] [stdout] 10 | fn anchored_menu_style(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `ARTIST_ALBUM_BATCH_SIZE` is never used
[INFO] [stdout]  --> src/components/views/artist_detail.rs:9:7
[INFO] [stdout]   |
[INFO] [stdout] 9 | const ARTIST_ALBUM_BATCH_SIZE: usize = 24;
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `render_album_item` is never used
[INFO] [stdout]   --> src/components/views/artist_detail.rs:11:4
[INFO] [stdout]    |
[INFO] [stdout] 11 | fn render_album_item(album: Album, navigation: Navigation) -> Element {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_artist_names` is never used
[INFO] [stdout]  --> src/components/views/artist_links.rs:5:15
[INFO] [stdout]   |
[INFO] [stdout] 5 | pub(crate) fn parse_artist_names(artist_text: &str) -> Vec<String> {
[INFO] [stdout]   |               ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_artist_name_key` is never used
[INFO] [stdout]   --> src/components/views/artist_links.rs:25:4
[INFO] [stdout]    |
[INFO] [stdout] 25 | fn normalize_artist_name_key(artist_name: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resolve_artist_id_for_name` is never used
[INFO] [stdout]   --> src/components/views/artist_links.rs:42:21
[INFO] [stdout]    |
[INFO] [stdout] 42 | pub(crate) async fn resolve_artist_id_for_name(
[INFO] [stdout]    |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `artists_delay_ms` is never used
[INFO] [stdout]  --> src/components/views/artists.rs:8:10
[INFO] [stdout]   |
[INFO] [stdout] 8 | async fn artists_delay_ms(ms: u64) {
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_size` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:16:4
[INFO] [stdout]    |
[INFO] [stdout] 16 | fn format_size(bytes: u64) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `download_poll_delay_ms` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:26:10
[INFO] [stdout]    |
[INFO] [stdout] 26 | async fn download_poll_delay_ms(ms: u64) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `download_song_key` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:35:4
[INFO] [stdout]    |
[INFO] [stdout] 35 | fn download_song_key(server_id: &str, song_id: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `infer_downloaded_albums` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:39:4
[INFO] [stdout]    |
[INFO] [stdout] 39 | fn infer_downloaded_albums(entries: &[DownloadIndexEntry]) -> Vec<DownloadCollectionEntry> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_download_count_key` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:79:4
[INFO] [stdout]    |
[INFO] [stdout] 79 | fn collection_download_count_key(entry: &DownloadCollectionEntry) -> (String, String, String) {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_progress` is never used
[INFO] [stdout]   --> src/components/views/downloads.rs:87:4
[INFO] [stdout]    |
[INFO] [stdout] 87 | fn collection_progress(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_detail_view` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:106:4
[INFO] [stdout]     |
[INFO] [stdout] 106 | fn collection_detail_view(collection: &DownloadCollectionEntry) -> Option<AppView> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `PendingDownloadsDelete` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:123:6
[INFO] [stdout]     |
[INFO] [stdout] 123 | enum PendingDownloadsDelete {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pending_delete_title` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:138:4
[INFO] [stdout]     |
[INFO] [stdout] 138 | fn pending_delete_title(action: &PendingDownloadsDelete) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pending_delete_message` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:147:4
[INFO] [stdout]     |
[INFO] [stdout] 147 | fn pending_delete_message(action: &PendingDownloadsDelete) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DownloadsTab` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:165:6
[INFO] [stdout]     |
[INFO] [stdout] 165 | enum DownloadsTab {
[INFO] [stdout]     |      ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DownloadSongSort` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:170:6
[INFO] [stdout]     |
[INFO] [stdout] 170 | enum DownloadSongSort {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOADS_POLL_IDLE_MS` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:178:7
[INFO] [stdout]     |
[INFO] [stdout] 178 | const DOWNLOADS_POLL_IDLE_MS: u64 = 5000;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOADS_POLL_ACTIVE_MS` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:179:7
[INFO] [stdout]     |
[INFO] [stdout] 179 | const DOWNLOADS_POLL_ACTIVE_MS: u64 = 1400;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOADS_SONG_PAGE_SIZE` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:180:7
[INFO] [stdout]     |
[INFO] [stdout] 180 | const DOWNLOADS_SONG_PAGE_SIZE: usize = 80;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOADS_COLLECTION_PAGE_SIZE` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:181:7
[INFO] [stdout]     |
[INFO] [stdout] 181 | const DOWNLOADS_COLLECTION_PAGE_SIZE: usize = 60;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_download_field` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:183:4
[INFO] [stdout]     |
[INFO] [stdout] 183 | fn normalize_download_field(value: &Option<String>) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `to_download_song` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:190:4
[INFO] [stdout]     |
[INFO] [stdout] 190 | fn to_download_song(entry: &DownloadIndexEntry, servers: &[ServerConfig]) -> Song {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `download_entry_cover_url` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:220:4
[INFO] [stdout]     |
[INFO] [stdout] 220 | fn download_entry_cover_url(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `ordered_download_entries_for_song_ids` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:244:4
[INFO] [stdout]     |
[INFO] [stdout] 244 | fn ordered_download_entries_for_song_ids(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `replace_queue_with_download_entries` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:263:4
[INFO] [stdout]     |
[INFO] [stdout] 263 | fn replace_queue_with_download_entries(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `replace_queue_with_shuffled_download_entries` is never used
[INFO] [stdout]    --> src/components/views/downloads.rs:285:4
[INFO] [stdout]     |
[INFO] [stdout] 285 | fn replace_queue_with_shuffled_download_entries(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FAVORITES_INITIAL_LIMIT` is never used
[INFO] [stdout]   --> src/components/views/favorites.rs:13:7
[INFO] [stdout]    |
[INFO] [stdout] 13 | const FAVORITES_INITIAL_LIMIT: usize = 30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FAVORITES_SERVER_SONG_CAP` is never used
[INFO] [stdout]   --> src/components/views/favorites.rs:14:7
[INFO] [stdout]    |
[INFO] [stdout] 14 | const FAVORITES_SERVER_SONG_CAP: usize = 300;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FAVORITES_SERVER_ALBUM_CAP` is never used
[INFO] [stdout]   --> src/components/views/favorites.rs:15:7
[INFO] [stdout]    |
[INFO] [stdout] 15 | const FAVORITES_SERVER_ALBUM_CAP: usize = 250;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `FAVORITES_SERVER_ARTIST_CAP` is never used
[INFO] [stdout]   --> src/components/views/favorites.rs:16:7
[INFO] [stdout]    |
[INFO] [stdout] 16 | const FAVORITES_SERVER_ARTIST_CAP: usize = 200;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_SECTION_BASE_COUNT` is never used
[INFO] [stdout]   --> src/components/views/home.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const HOME_SECTION_BASE_COUNT: usize = 9;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_SECTION_LOAD_STEP` is never used
[INFO] [stdout]   --> src/components/views/home.rs:28:7
[INFO] [stdout]    |
[INFO] [stdout] 28 | const HOME_SECTION_LOAD_STEP: usize = 6;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_LOADING_FORCE_UNBLOCK_MS` is never used
[INFO] [stdout]   --> src/components/views/home.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const HOME_LOADING_FORCE_UNBLOCK_MS: u64 = 12_000;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `anchored_menu_style` is never used
[INFO] [stdout]   --> src/components/views/home.rs:31:4
[INFO] [stdout]    |
[INFO] [stdout] 31 | fn anchored_menu_style(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `loading_progress_percent` is never used
[INFO] [stdout]   --> src/components/views/home.rs:45:4
[INFO] [stdout]    |
[INFO] [stdout] 45 | fn loading_progress_percent(progress: f32) -> u32 {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_loading_log_poll_sleep` is never used
[INFO] [stdout]   --> src/components/views/home.rs:69:10
[INFO] [stdout]    |
[INFO] [stdout] 69 | async fn home_loading_log_poll_sleep() {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_quick_picks_grid_poll_sleep` is never used
[INFO] [stdout]   --> src/components/views/home.rs:79:10
[INFO] [stdout]    |
[INFO] [stdout] 79 | async fn home_quick_picks_grid_poll_sleep() {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `home_now_millis` is never used
[INFO] [stdout]   --> src/components/views/home.rs:89:4
[INFO] [stdout]    |
[INFO] [stdout] 89 | fn home_now_millis() -> u64 {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `section_direction_is_asc` is never used
[INFO] [stdout]    --> src/components/views/home.rs:101:4
[INFO] [stdout]     |
[INFO] [stdout] 101 | fn section_direction_is_asc(direction: HomeSortDirection) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_albums` is never used
[INFO] [stdout]    --> src/components/views/home.rs:105:4
[INFO] [stdout]     |
[INFO] [stdout] 105 | fn dedupe_albums(items: Vec<Album>) -> Vec<Album> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_songs` is never used
[INFO] [stdout]    --> src/components/views/home.rs:117:4
[INFO] [stdout]     |
[INFO] [stdout] 117 | fn dedupe_songs(items: Vec<Song>) -> Vec<Song> {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `stable_hash_u64` is never used
[INFO] [stdout]    --> src/components/views/home.rs:129:4
[INFO] [stdout]     |
[INFO] [stdout] 129 | fn stable_hash_u64<T: Hash>(value: &T) -> u64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_album_direction` is never used
[INFO] [stdout]    --> src/components/views/home.rs:135:4
[INFO] [stdout]     |
[INFO] [stdout] 135 | fn apply_album_direction(mut items: Vec<Album>, direction: HomeSortDirection) -> Vec<Album> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `apply_song_direction` is never used
[INFO] [stdout]    --> src/components/views/home.rs:142:4
[INFO] [stdout]     |
[INFO] [stdout] 142 | fn apply_song_direction(mut items: Vec<Song>, direction: HomeSortDirection) -> Vec<Song> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_direction` is never used
[INFO] [stdout]    --> src/components/views/home.rs:149:4
[INFO] [stdout]     |
[INFO] [stdout] 149 | fn compare_direction(ord: Ordering, direction: HomeSortDirection) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_album_section_items` is never used
[INFO] [stdout]    --> src/components/views/home.rs:157:4
[INFO] [stdout]     |
[INFO] [stdout] 157 | fn build_album_section_items(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_song_section_items` is never used
[INFO] [stdout]    --> src/components/views/home.rs:235:4
[INFO] [stdout]     |
[INFO] [stdout] 235 | fn build_song_section_items(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_play_action_title` is never used
[INFO] [stdout]    --> src/components/views/home.rs:309:4
[INFO] [stdout]     |
[INFO] [stdout] 309 | fn quick_play_action_title(action: HomeQuickPlayAction) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_play_action_icon` is never used
[INFO] [stdout]    --> src/components/views/home.rs:325:4
[INFO] [stdout]     |
[INFO] [stdout] 325 | fn quick_play_action_icon(action: HomeQuickPlayAction) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_play_action_gradient` is never used
[INFO] [stdout]    --> src/components/views/home.rs:341:4
[INFO] [stdout]     |
[INFO] [stdout] 341 | fn quick_play_action_gradient(action: HomeQuickPlayAction) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_play_action_view` is never used
[INFO] [stdout]    --> src/components/views/home.rs:357:4
[INFO] [stdout]     |
[INFO] [stdout] 357 | fn quick_play_action_view(action: HomeQuickPlayAction) -> AppView {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `album_section_key` is never used
[INFO] [stdout]    --> src/components/views/home.rs:373:4
[INFO] [stdout]     |
[INFO] [stdout] 373 | fn album_section_key(id: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_section_key` is never used
[INFO] [stdout]    --> src/components/views/home.rs:377:4
[INFO] [stdout]     |
[INFO] [stdout] 377 | fn song_section_key(id: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `even_card_count` is never used
[INFO] [stdout]    --> src/components/views/home.rs:381:4
[INFO] [stdout]     |
[INFO] [stdout] 381 | fn even_card_count(count: usize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_album_section_title` is never used
[INFO] [stdout]    --> src/components/views/home.rs:389:4
[INFO] [stdout]     |
[INFO] [stdout] 389 | fn default_album_section_title(source: HomeAlbumSource) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_song_section_title` is never used
[INFO] [stdout]    --> src/components/views/home.rs:400:4
[INFO] [stdout]     |
[INFO] [stdout] 400 | fn default_song_section_title(source: HomeSongSource) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `should_autoname_section_title` is never used
[INFO] [stdout]    --> src/components/views/home.rs:411:4
[INFO] [stdout]     |
[INFO] [stdout] 411 | fn should_autoname_section_title(current_title: &str, previous_default: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `QuickPicksVisibleAmount` is never used
[INFO] [stdout]    --> src/components/views/home.rs:417:6
[INFO] [stdout]     |
[INFO] [stdout] 417 | enum QuickPicksVisibleAmount {
[INFO] [stdout]     |      ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]    --> src/components/views/home.rs:424:8
[INFO] [stdout]     |
[INFO] [stdout] 423 | impl QuickPicksVisibleAmount {
[INFO] [stdout]     | ---------------------------- associated items in this implementation
[INFO] [stdout] 424 |     fn as_value(self) -> &'static str {
[INFO] [stdout]     |        ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 432 |     fn from_value(value: &str) -> Self {
[INFO] [stdout]     |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_visible_count_for_amount` is never used
[INFO] [stdout]    --> src/components/views/home.rs:441:4
[INFO] [stdout]     |
[INFO] [stdout] 441 | fn quick_picks_visible_count_for_amount(amount: QuickPicksVisibleAmount) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_visible_amount_from_count` is never used
[INFO] [stdout]    --> src/components/views/home.rs:449:4
[INFO] [stdout]     |
[INFO] [stdout] 449 | fn quick_picks_visible_amount_from_count(count: usize) -> QuickPicksVisibleAmount {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_quick_picks_requested_count` is never used
[INFO] [stdout]    --> src/components/views/home.rs:463:4
[INFO] [stdout]     |
[INFO] [stdout] 463 | fn normalize_quick_picks_requested_count(count: usize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `snap_quick_picks_requested_to_grid` is never used
[INFO] [stdout]    --> src/components/views/home.rs:475:4
[INFO] [stdout]     |
[INFO] [stdout] 475 | fn snap_quick_picks_requested_to_grid(requested_visible: usize, columns: usize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_grid_visible_limit_for_loaded` is never used
[INFO] [stdout]    --> src/components/views/home.rs:491:4
[INFO] [stdout]     |
[INFO] [stdout] 491 | fn quick_picks_grid_visible_limit_for_loaded(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_list_visible_limit_for_loaded` is never used
[INFO] [stdout]    --> src/components/views/home.rs:510:4
[INFO] [stdout]     |
[INFO] [stdout] 510 | fn quick_picks_list_visible_limit_for_loaded(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_target_columns` is never used
[INFO] [stdout]    --> src/components/views/home.rs:525:4
[INFO] [stdout]     |
[INFO] [stdout] 525 | fn quick_picks_target_columns(size: HomeQuickPicksSize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_card_min_px` is never used
[INFO] [stdout]    --> src/components/views/home.rs:529:4
[INFO] [stdout]     |
[INFO] [stdout] 529 | fn quick_picks_card_min_px(size: HomeQuickPicksSize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_picks_list_batch_size` is never used
[INFO] [stdout]    --> src/components/views/home.rs:537:4
[INFO] [stdout]     |
[INFO] [stdout] 537 | fn quick_picks_list_batch_size(size: HomeQuickPicksSize) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `new_album_section` is never used
[INFO] [stdout]    --> src/components/views/home.rs:545:4
[INFO] [stdout]     |
[INFO] [stdout] 545 | fn new_album_section() -> HomeAlbumSectionConfig {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `new_song_section` is never used
[INFO] [stdout]    --> src/components/views/home.rs:559:4
[INFO] [stdout]     |
[INFO] [stdout] 559 | fn new_song_section() -> HomeSongSectionConfig {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `profile_section_defaults` is never used
[INFO] [stdout]    --> src/components/views/home.rs:573:4
[INFO] [stdout]     |
[INFO] [stdout] 573 | fn profile_section_defaults(profile: HomeFeedLoadProfile) -> (usize, usize) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `section_auto_budget` is never used
[INFO] [stdout]    --> src/components/views/home.rs:581:4
[INFO] [stdout]     |
[INFO] [stdout] 581 | fn section_auto_budget(profile: HomeFeedLoadProfile, total_items: usize) -> (usize, usize) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `HOME_LAYOUT_SETTINGS_VERSION` is never used
[INFO] [stdout]  --> src/components/views/home_layout.rs:3:11
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub const HOME_LAYOUT_SETTINGS_VERSION: u8 = 1;
[INFO] [stdout]   |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeFeedLoadProfile` is never used
[INFO] [stdout]  --> src/components/views/home_layout.rs:7:10
[INFO] [stdout]   |
[INFO] [stdout] 7 | pub enum HomeFeedLoadProfile {
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `from_storage` and `as_storage` are never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:15:12
[INFO] [stdout]    |
[INFO] [stdout] 14 | impl HomeFeedLoadProfile {
[INFO] [stdout]    | ------------------------ associated items in this implementation
[INFO] [stdout] 15 |     pub fn from_storage(value: &str) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 23 |     pub fn as_storage(self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeTopStripMode` is never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:34:10
[INFO] [stdout]    |
[INFO] [stdout] 34 | pub enum HomeTopStripMode {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:42:12
[INFO] [stdout]    |
[INFO] [stdout] 41 | impl HomeTopStripMode {
[INFO] [stdout]    | --------------------- associated items in this implementation
[INFO] [stdout] 42 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 50 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeSortDirection` is never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:61:10
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub enum HomeSortDirection {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:68:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | impl HomeSortDirection {
[INFO] [stdout]    | ---------------------- associated items in this implementation
[INFO] [stdout] 68 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]    |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 75 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]    |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeAlbumSource` is never used
[INFO] [stdout]   --> src/components/views/home_layout.rs:85:10
[INFO] [stdout]    |
[INFO] [stdout] 85 | pub enum HomeAlbumSource {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:96:12
[INFO] [stdout]     |
[INFO] [stdout]  95 | impl HomeAlbumSource {
[INFO] [stdout]     | -------------------- associated items in this implementation
[INFO] [stdout]  96 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 107 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeSongSource` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:121:10
[INFO] [stdout]     |
[INFO] [stdout] 121 | pub enum HomeSongSource {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout] 131 | impl HomeSongSource {
[INFO] [stdout]     | ------------------- associated items in this implementation
[INFO] [stdout] 132 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 143 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeQuickPicksLayout` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:157:10
[INFO] [stdout]     |
[INFO] [stdout] 157 | pub enum HomeQuickPicksLayout {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value` and `from_value` are never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:164:12
[INFO] [stdout]     |
[INFO] [stdout] 163 | impl HomeQuickPicksLayout {
[INFO] [stdout]     | ------------------------- associated items in this implementation
[INFO] [stdout] 164 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 171 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeQuickPicksSize` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:181:10
[INFO] [stdout]     |
[INFO] [stdout] 181 | pub enum HomeQuickPicksSize {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `as_value`, `from_value`, and `target_columns` are never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:189:12
[INFO] [stdout]     |
[INFO] [stdout] 188 | impl HomeQuickPicksSize {
[INFO] [stdout]     | ----------------------- associated items in this implementation
[INFO] [stdout] 189 |     pub fn as_value(self) -> &'static str {
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 197 |     pub fn from_value(value: &str) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 205 |     pub fn target_columns(self) -> usize {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `HomeQuickPlayAction` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:216:10
[INFO] [stdout]     |
[INFO] [stdout] 216 | pub enum HomeQuickPlayAction {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `all` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:232:12
[INFO] [stdout]     |
[INFO] [stdout] 231 | impl HomeQuickPlayAction {
[INFO] [stdout]     | ------------------------ associated function in this implementation
[INFO] [stdout] 232 |     pub fn all() -> [HomeQuickPlayAction; 11] {
[INFO] [stdout]     |            ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeQuickPlaySettings` is never constructed
[INFO] [stdout]    --> src/components/views/home_layout.rs:250:12
[INFO] [stdout]     |
[INFO] [stdout] 250 | pub struct HomeQuickPlaySettings {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeAlbumSectionConfig` is never constructed
[INFO] [stdout]    --> src/components/views/home_layout.rs:273:12
[INFO] [stdout]     |
[INFO] [stdout] 273 | pub struct HomeAlbumSectionConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeSongSectionConfig` is never constructed
[INFO] [stdout]    --> src/components/views/home_layout.rs:291:12
[INFO] [stdout]     |
[INFO] [stdout] 291 | pub struct HomeSongSectionConfig {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeQuickPicksSettings` is never constructed
[INFO] [stdout]    --> src/components/views/home_layout.rs:309:12
[INFO] [stdout]     |
[INFO] [stdout] 309 | pub struct HomeQuickPicksSettings {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `HomeLayoutSettings` is never constructed
[INFO] [stdout]    --> src/components/views/home_layout.rs:338:12
[INFO] [stdout]     |
[INFO] [stdout] 338 | pub struct HomeLayoutSettings {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_true` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:378:4
[INFO] [stdout]     |
[INFO] [stdout] 378 | fn default_true() -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_layout_version` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:382:4
[INFO] [stdout]     |
[INFO] [stdout] 382 | fn default_layout_version() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_top_quick_play_rows` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:386:4
[INFO] [stdout]     |
[INFO] [stdout] 386 | fn default_top_quick_play_rows() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_top_quick_play_columns` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:390:4
[INFO] [stdout]     |
[INFO] [stdout] 390 | fn default_top_quick_play_columns() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_top_album_visible` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:394:4
[INFO] [stdout]     |
[INFO] [stdout] 394 | fn default_top_album_visible() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_section_initial_visible` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:398:4
[INFO] [stdout]     |
[INFO] [stdout] 398 | fn default_section_initial_visible() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_section_load_step` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:402:4
[INFO] [stdout]     |
[INFO] [stdout] 402 | fn default_section_load_step() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_quick_picks_columns` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:406:4
[INFO] [stdout]     |
[INFO] [stdout] 406 | fn default_quick_picks_columns() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_quick_picks_rows` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:410:4
[INFO] [stdout]     |
[INFO] [stdout] 410 | fn default_quick_picks_rows() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_quick_picks_visible_count` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:414:4
[INFO] [stdout]     |
[INFO] [stdout] 414 | fn default_quick_picks_visible_count() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_quick_play_actions` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:418:4
[INFO] [stdout]     |
[INFO] [stdout] 418 | fn default_quick_play_actions() -> Vec<HomeQuickPlayAction> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_album_sections` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:427:4
[INFO] [stdout]     |
[INFO] [stdout] 427 | fn default_album_sections() -> Vec<HomeAlbumSectionConfig> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_song_sections` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:452:4
[INFO] [stdout]     |
[INFO] [stdout] 452 | fn default_song_sections() -> Vec<HomeSongSectionConfig> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_home_layout_settings` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:487:8
[INFO] [stdout]     |
[INFO] [stdout] 487 | pub fn parse_home_layout_settings(raw: &str) -> HomeLayoutSettings {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `serialize_home_layout_settings` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:497:8
[INFO] [stdout]     |
[INFO] [stdout] 497 | pub fn serialize_home_layout_settings(layout: &HomeLayoutSettings) -> String {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: method `normalized` is never used
[INFO] [stdout]    --> src/components/views/home_layout.rs:502:12
[INFO] [stdout]     |
[INFO] [stdout] 501 | impl HomeLayoutSettings {
[INFO] [stdout]     | ----------------------- method in this implementation
[INFO] [stdout] 502 |     pub fn normalized(mut self) -> Self {
[INFO] [stdout]     |            ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUICK_PREVIEW_DURATION_MS` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:25:7
[INFO] [stdout]    |
[INFO] [stdout] 25 | const QUICK_PREVIEW_DURATION_MS: u64 = 12000;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_LIMIT` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:26:7
[INFO] [stdout]    |
[INFO] [stdout] 26 | const AUTO_RECOMMENDATION_LIMIT: usize = 25;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_FIRST_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:27:7
[INFO] [stdout]    |
[INFO] [stdout] 27 | const AUTO_RECOMMENDATION_FIRST_SEED_COUNT: usize = 4;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_LAST_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:28:7
[INFO] [stdout]    |
[INFO] [stdout] 28 | const AUTO_RECOMMENDATION_LAST_SEED_COUNT: usize = 4;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_RECENT_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:29:7
[INFO] [stdout]    |
[INFO] [stdout] 29 | const AUTO_RECOMMENDATION_RECENT_SEED_COUNT: usize = 17;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `anchored_menu_style` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:31:4
[INFO] [stdout]    |
[INFO] [stdout] 31 | fn anchored_menu_style(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_preview_delay_ms` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:46:10
[INFO] [stdout]    |
[INFO] [stdout] 46 | async fn quick_preview_delay_ms(ms: u64) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `playlist_search_delay_ms` is never used
[INFO] [stdout]   --> src/components/views/playlist_detail.rs:56:10
[INFO] [stdout]    |
[INFO] [stdout] 56 | async fn playlist_search_delay_ms(ms: u64) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `same_song_identity` is never used
[INFO] [stdout]     --> src/components/views/playlist_detail.rs:2089:4
[INFO] [stdout]      |
[INFO] [stdout] 2089 | fn same_song_identity(left: &Song, right: &Song) -> bool {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_playlist_add_candidates` is never used
[INFO] [stdout]     --> src/components/views/playlist_detail.rs:2093:10
[INFO] [stdout]      |
[INFO] [stdout] 2093 | async fn search_playlist_add_candidates(server: Option<ServerConfig>, query: String) -> Vec<Song> {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_identity_key` is never used
[INFO] [stdout]     --> src/components/views/playlist_detail.rs:2146:4
[INFO] [stdout]      |
[INFO] [stdout] 2146 | fn song_identity_key(song: &Song) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_similar_playlist_candidates` is never used
[INFO] [stdout]     --> src/components/views/playlist_detail.rs:2150:10
[INFO] [stdout]      |
[INFO] [stdout] 2150 | async fn fetch_similar_playlist_candidates(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_playlist_add_recommendations` is never used
[INFO] [stdout]     --> src/components/views/playlist_detail.rs:2196:10
[INFO] [stdout]      |
[INFO] [stdout] 2196 | async fn build_playlist_add_recommendations(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `PLAYLIST_INITIAL_LIMIT` is never used
[INFO] [stdout]  --> src/components/views/playlists.rs:6:7
[INFO] [stdout]   |
[INFO] [stdout] 6 | const PLAYLIST_INITIAL_LIMIT: usize = 20;
[INFO] [stdout]   |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `anchored_menu_style` is never used
[INFO] [stdout]  --> src/components/views/playlists.rs:8:4
[INFO] [stdout]   |
[INFO] [stdout] 8 | fn anchored_menu_style(
[INFO] [stdout]   |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `QUICK_PREVIEW_DURATION_MS` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:16:7
[INFO] [stdout]    |
[INFO] [stdout] 16 | const QUICK_PREVIEW_DURATION_MS: u64 = 12000;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_LIMIT` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:17:7
[INFO] [stdout]    |
[INFO] [stdout] 17 | const AUTO_RECOMMENDATION_LIMIT: usize = 25;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_FIRST_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:18:7
[INFO] [stdout]    |
[INFO] [stdout] 18 | const AUTO_RECOMMENDATION_FIRST_SEED_COUNT: usize = 4;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_LAST_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const AUTO_RECOMMENDATION_LAST_SEED_COUNT: usize = 4;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUTO_RECOMMENDATION_RECENT_SEED_COUNT` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:20:7
[INFO] [stdout]    |
[INFO] [stdout] 20 | const AUTO_RECOMMENDATION_RECENT_SEED_COUNT: usize = 17;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `quick_preview_delay_ms` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:23:10
[INFO] [stdout]    |
[INFO] [stdout] 23 | async fn quick_preview_delay_ms(ms: u64) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `queue_search_delay_ms` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:33:10
[INFO] [stdout]    |
[INFO] [stdout] 33 | async fn queue_search_delay_ms(ms: u64) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `restore_queue_snapshot` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:42:4
[INFO] [stdout]    |
[INFO] [stdout] 42 | fn restore_queue_snapshot(
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prefetch_lrclib_lyrics_for_queue` is never used
[INFO] [stdout]   --> src/components/views/queue.rs:75:10
[INFO] [stdout]    |
[INFO] [stdout] 75 | async fn prefetch_lrclib_lyrics_for_queue(songs: Vec<Song>, max_songs: usize) {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `adjusted_queue_index_after_reorder` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1598:4
[INFO] [stdout]      |
[INFO] [stdout] 1598 | fn adjusted_queue_index_after_reorder(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `reorder_queue_entry` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1614:4
[INFO] [stdout]      |
[INFO] [stdout] 1614 | fn reorder_queue_entry(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_queue_entry` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1659:4
[INFO] [stdout]      |
[INFO] [stdout] 1659 | fn remove_queue_entry(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `enqueue_song_to_queue` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1705:4
[INFO] [stdout]      |
[INFO] [stdout] 1705 | fn enqueue_song_to_queue(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_queue_add_candidates` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1749:10
[INFO] [stdout]      |
[INFO] [stdout] 1749 | async fn search_queue_add_candidates(servers: Vec<ServerConfig>, query: String) -> Vec<Song> {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `same_song_identity` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1849:4
[INFO] [stdout]      |
[INFO] [stdout] 1849 | fn same_song_identity(left: &Song, right: &Song) -> bool {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_identity_key` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1853:4
[INFO] [stdout]      |
[INFO] [stdout] 1853 | fn song_identity_key(song: &Song) -> String {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_similar_queue_candidates` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1857:10
[INFO] [stdout]      |
[INFO] [stdout] 1857 | async fn fetch_similar_queue_candidates(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `build_queue_add_recommendations` is never used
[INFO] [stdout]     --> src/components/views/queue.rs:1911:10
[INFO] [stdout]      |
[INFO] [stdout] 1911 | async fn build_queue_add_recommendations(
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `radio_metadata_delay_ms` is never used
[INFO] [stdout]  --> src/components/views/radio.rs:6:10
[INFO] [stdout]   |
[INFO] [stdout] 6 | async fn radio_metadata_delay_ms(ms: u64) {
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `RadioFormMode` is never used
[INFO] [stdout]   --> src/components/views/radio.rs:16:6
[INFO] [stdout]    |
[INFO] [stdout] 16 | enum RadioFormMode {
[INFO] [stdout]    |      ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RANDOM_BATCH_PER_SERVER` is never used
[INFO] [stdout]   --> src/components/views/random.rs:11:7
[INFO] [stdout]    |
[INFO] [stdout] 11 | const RANDOM_BATCH_PER_SERVER: u32 = 25;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RANDOM_VISIBLE_BASE` is never used
[INFO] [stdout]   --> src/components/views/random.rs:12:7
[INFO] [stdout]    |
[INFO] [stdout] 12 | const RANDOM_VISIBLE_BASE: usize = 30;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RANDOM_VISIBLE_STEP` is never used
[INFO] [stdout]   --> src/components/views/random.rs:13:7
[INFO] [stdout]    |
[INFO] [stdout] 13 | const RANDOM_VISIBLE_STEP: usize = 25;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RANDOM_CACHE_TTL_HOURS` is never used
[INFO] [stdout]   --> src/components/views/random.rs:14:7
[INFO] [stdout]    |
[INFO] [stdout] 14 | const RANDOM_CACHE_TTL_HOURS: u32 = 2;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `RANDOM_MAX_POOL` is never used
[INFO] [stdout]   --> src/components/views/random.rs:15:7
[INFO] [stdout]    |
[INFO] [stdout] 15 | const RANDOM_MAX_POOL: usize = 500;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `random_song_key` is never used
[INFO] [stdout]   --> src/components/views/random.rs:17:4
[INFO] [stdout]    |
[INFO] [stdout] 17 | fn random_song_key(song: &Song) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_random_songs` is never used
[INFO] [stdout]   --> src/components/views/random.rs:21:4
[INFO] [stdout]    |
[INFO] [stdout] 21 | fn dedupe_random_songs(songs: Vec<Song>, limit: usize) -> Vec<Song> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `extend_unique_songs` is never used
[INFO] [stdout]   --> src/components/views/random.rs:36:4
[INFO] [stdout]    |
[INFO] [stdout] 36 | fn extend_unique_songs(existing: &mut Vec<Song>, incoming: Vec<Song>, max_len: usize) {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `random_cache_key` is never used
[INFO] [stdout]   --> src/components/views/random.rs:49:4
[INFO] [stdout]    |
[INFO] [stdout] 49 | fn random_cache_key(active_servers: &[ServerConfig]) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `random_yield` is never used
[INFO] [stdout]   --> src/components/views/random.rs:59:10
[INFO] [stdout]    |
[INFO] [stdout] 59 | async fn random_yield() {
[INFO] [stdout]    |          ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_random_songs_for_servers` is never used
[INFO] [stdout]   --> src/components/views/random.rs:68:10
[INFO] [stdout]    |
[INFO] [stdout] 68 | async fn fetch_random_songs_for_servers(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `shuffle_songs` is never used
[INFO] [stdout]    --> src/components/views/random.rs:407:4
[INFO] [stdout]     |
[INFO] [stdout] 407 | fn shuffle_songs(songs: &mut Vec<Song>) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `search_delay_ms` is never used
[INFO] [stdout]  --> src/components/views/search.rs:9:10
[INFO] [stdout]   |
[INFO] [stdout] 9 | async fn search_delay_ms(ms: u64) {
[INFO] [stdout]   |          ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_text` is never used
[INFO] [stdout]    --> src/components/views/search.rs:367:4
[INFO] [stdout]     |
[INFO] [stdout] 367 | fn normalize_text(text: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `tokenize` is never used
[INFO] [stdout]    --> src/components/views/search.rs:376:4
[INFO] [stdout]     |
[INFO] [stdout] 376 | fn tokenize(text: &str) -> Vec<String> {
[INFO] [stdout]     |    ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_search_results` is never used
[INFO] [stdout]    --> src/components/views/search.rs:384:4
[INFO] [stdout]     |
[INFO] [stdout] 384 | fn dedupe_search_results(mut results: SearchResult) -> SearchResult {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `calculate_score` is never used
[INFO] [stdout]    --> src/components/views/search.rs:405:4
[INFO] [stdout]     |
[INFO] [stdout] 405 | fn calculate_score(field: &str, tokens: &[String]) -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `token_matches_field` is never used
[INFO] [stdout]    --> src/components/views/search.rs:440:4
[INFO] [stdout]     |
[INFO] [stdout] 440 | fn token_matches_field(field_normalized: &str, token: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `score_song` is never used
[INFO] [stdout]    --> src/components/views/search.rs:446:4
[INFO] [stdout]     |
[INFO] [stdout] 446 | fn score_song(song: &Song, tokens: &[String]) -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `score_album` is never used
[INFO] [stdout]    --> src/components/views/search.rs:485:4
[INFO] [stdout]     |
[INFO] [stdout] 485 | fn score_album(album: &Album, tokens: &[String]) -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `score_artist` is never used
[INFO] [stdout]    --> src/components/views/search.rs:503:4
[INFO] [stdout]     |
[INFO] [stdout] 503 | fn score_artist(artist: &Artist, tokens: &[String]) -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `filter_and_score_results` is never used
[INFO] [stdout]    --> src/components/views/search.rs:516:4
[INFO] [stdout]     |
[INFO] [stdout] 516 | fn filter_and_score_results(mut results: SearchResult, query: &str) -> SearchResult {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `resolve_server_name` is never used
[INFO] [stdout]   --> src/components/views/settings.rs:18:4
[INFO] [stdout]    |
[INFO] [stdout] 18 | fn resolve_server_name(name: &str, url: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_local_http_host` is never used
[INFO] [stdout]   --> src/components/views/settings.rs:27:4
[INFO] [stdout]    |
[INFO] [stdout] 27 | fn is_local_http_host(host: &str) -> bool {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_server_url` is never used
[INFO] [stdout]   --> src/components/views/settings.rs:48:4
[INFO] [stdout]    |
[INFO] [stdout] 48 | fn normalize_server_url(raw: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_server_url` is never used
[INFO] [stdout]   --> src/components/views/settings.rs:74:4
[INFO] [stdout]    |
[INFO] [stdout] 74 | fn sanitize_server_url(raw: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `format_connection_error` is never used
[INFO] [stdout]   --> src/components/views/settings.rs:87:4
[INFO] [stdout]    |
[INFO] [stdout] 87 | fn format_connection_error(error: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `lyrics_provider_label` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:175:4
[INFO] [stdout]     |
[INFO] [stdout] 175 | fn lyrics_provider_label(provider_key: &str) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `artwork_pref_key` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:181:4
[INFO] [stdout]     |
[INFO] [stdout] 181 | fn artwork_pref_key(pref: ArtworkDownloadPreference) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_artwork_pref` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:190:4
[INFO] [stdout]     |
[INFO] [stdout] 190 | fn parse_artwork_pref(value: &str) -> ArtworkDownloadPreference {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ScanResultEntry` is never constructed
[INFO] [stdout]    --> src/components/views/settings.rs:200:8
[INFO] [stdout]     |
[INFO] [stdout] 200 | struct ScanResultEntry {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_ALBUMS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:205:7
[INFO] [stdout]     |
[INFO] [stdout] 205 | const SMART_CACHE_MIN_ALBUMS_PER_SERVER: u32 = 24;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_RANDOM_SONGS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:206:7
[INFO] [stdout]     |
[INFO] [stdout] 206 | const SMART_CACHE_MIN_RANDOM_SONGS_PER_SERVER: u32 = 30;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_PLAYLISTS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:207:7
[INFO] [stdout]     |
[INFO] [stdout] 207 | const SMART_CACHE_MIN_PLAYLISTS_PER_SERVER: usize = 4;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_ALBUM_DETAILS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:208:7
[INFO] [stdout]     |
[INFO] [stdout] 208 | const SMART_CACHE_MIN_ALBUM_DETAILS_PER_SERVER: usize = 6;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_LYRICS_LIMIT` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:209:7
[INFO] [stdout]     |
[INFO] [stdout] 209 | const SMART_CACHE_MIN_LYRICS_LIMIT: usize = 36;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MIN_ARTWORK_LIMIT` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:210:7
[INFO] [stdout]     |
[INFO] [stdout] 210 | const SMART_CACHE_MIN_ARTWORK_LIMIT: usize = 160;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_ALBUMS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:211:7
[INFO] [stdout]     |
[INFO] [stdout] 211 | const SMART_CACHE_MAX_ALBUMS_PER_SERVER: u32 = 120;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_RANDOM_SONGS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:212:7
[INFO] [stdout]     |
[INFO] [stdout] 212 | const SMART_CACHE_MAX_RANDOM_SONGS_PER_SERVER: u32 = 220;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_PLAYLISTS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:213:7
[INFO] [stdout]     |
[INFO] [stdout] 213 | const SMART_CACHE_MAX_PLAYLISTS_PER_SERVER: usize = 16;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_ALBUM_DETAILS_PER_SERVER` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:214:7
[INFO] [stdout]     |
[INFO] [stdout] 214 | const SMART_CACHE_MAX_ALBUM_DETAILS_PER_SERVER: usize = 30;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_LYRICS_LIMIT` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:215:7
[INFO] [stdout]     |
[INFO] [stdout] 215 | const SMART_CACHE_MAX_LYRICS_LIMIT: usize = 600;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_MAX_ARTWORK_LIMIT` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:216:7
[INFO] [stdout]     |
[INFO] [stdout] 216 | const SMART_CACHE_MAX_ARTWORK_LIMIT: usize = 4800;
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_SONG_ART_SIZES` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:217:7
[INFO] [stdout]     |
[INFO] [stdout] 217 | const SMART_CACHE_SONG_ART_SIZES: [u32; 3] = [80, 120, 160];
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_ALBUM_ART_SIZES` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:218:7
[INFO] [stdout]     |
[INFO] [stdout] 218 | const SMART_CACHE_ALBUM_ART_SIZES: [u32; 4] = [120, 160, 300, 500];
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `SMART_CACHE_PLAYLIST_ART_SIZES` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:219:7
[INFO] [stdout]     |
[INFO] [stdout] 219 | const SMART_CACHE_PLAYLIST_ART_SIZES: [u32; 3] = [120, 160, 300];
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_albums_per_server` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:221:4
[INFO] [stdout]     |
[INFO] [stdout] 221 | fn smart_cache_albums_per_server(cache_size_mb: u32) -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_random_songs_per_server` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:228:4
[INFO] [stdout]     |
[INFO] [stdout] 228 | fn smart_cache_random_songs_per_server(cache_size_mb: u32) -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_playlists_per_server` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:235:4
[INFO] [stdout]     |
[INFO] [stdout] 235 | fn smart_cache_playlists_per_server(cache_size_mb: u32) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_album_details_per_server` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:242:4
[INFO] [stdout]     |
[INFO] [stdout] 242 | fn smart_cache_album_details_per_server(cache_size_mb: u32) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_lyrics_limit` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:250:4
[INFO] [stdout]     |
[INFO] [stdout] 250 | fn smart_cache_lyrics_limit(cache_size_mb: u32) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_artwork_limit` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:255:4
[INFO] [stdout]     |
[INFO] [stdout] 255 | fn smart_cache_artwork_limit(cache_size_mb: u32) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `push_cover_art_request` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:260:4
[INFO] [stdout]     |
[INFO] [stdout] 260 | fn push_cover_art_request(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_cache_key` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:281:4
[INFO] [stdout]     |
[INFO] [stdout] 281 | fn song_cache_key(song: &Song) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_id3_cover_art_id` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:285:4
[INFO] [stdout]     |
[INFO] [stdout] 285 | fn is_id3_cover_art_id(cover_art_id: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `include_cover_for_pref` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:289:4
[INFO] [stdout]     |
[INFO] [stdout] 289 | fn include_cover_for_pref(cover_art_id: &str, pref: ArtworkDownloadPreference) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collect_song_cover_urls` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:297:4
[INFO] [stdout]     |
[INFO] [stdout] 297 | fn collect_song_cover_urls(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collect_album_cover_urls` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:335:4
[INFO] [stdout]     |
[INFO] [stdout] 335 | fn collect_album_cover_urls(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collect_playlist_cover_urls` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:369:4
[INFO] [stdout]     |
[INFO] [stdout] 369 | fn collect_playlist_cover_urls(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `push_unique_songs` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:403:4
[INFO] [stdout]     |
[INFO] [stdout] 403 | fn push_unique_songs(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `dedupe_trim_urls` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:416:4
[INFO] [stdout]     |
[INFO] [stdout] 416 | fn dedupe_trim_urls(urls: Vec<String>, limit: usize) -> Vec<String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `smart_cache_pause` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:440:10
[INFO] [stdout]     |
[INFO] [stdout] 440 | async fn smart_cache_pause(_ms: u32) {}
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `warm_cover_art_urls` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:472:4
[INFO] [stdout]     |
[INFO] [stdout] 472 | fn warm_cover_art_urls(_urls: &[String]) -> Result<usize, String> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `settings_toast_pause` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:482:10
[INFO] [stdout]     |
[INFO] [stdout] 482 | async fn settings_toast_pause(ms: u32) {
[INFO] [stdout]     |          ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `persist_settings_with_toast` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:486:4
[INFO] [stdout]     |
[INFO] [stdout] 486 | fn persist_settings_with_toast(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `persist_servers_immediately` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:507:4
[INFO] [stdout]     |
[INFO] [stdout] 507 | fn persist_servers_immediately(servers: Vec<ServerConfig>) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `INPUT_FIELD_CLASS` is never used
[INFO] [stdout]    --> src/components/views/settings.rs:512:7
[INFO] [stdout]     |
[INFO] [stdout] 512 | const INPUT_FIELD_CLASS: &str = "w-full px-4 py-3 bg-zinc-900/50 border border-zinc-700/50 rounded-xl text-white placeholder:text-z...
[INFO] [stdout]     |       ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_songs_from_album_order` is never used
[INFO] [stdout]   --> src/components/views/songs.rs:15:10
[INFO] [stdout]    |
[INFO] [stdout] 15 | async fn fetch_songs_from_album_order(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `fetch_songs_from_native_order` is never used
[INFO] [stdout]   --> src/components/views/songs.rs:68:10
[INFO] [stdout]    |
[INFO] [stdout] 68 | async fn fetch_songs_from_native_order(
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `parse_played_timestamp` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:474:4
[INFO] [stdout]     |
[INFO] [stdout] 474 | fn parse_played_timestamp(value: &str) -> Option<i64> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `effective_song_rating` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:493:4
[INFO] [stdout]     |
[INFO] [stdout] 493 | fn effective_song_rating(song: &Song, overrides: &HashMap<String, u32>) -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_song_title` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:501:4
[INFO] [stdout]     |
[INFO] [stdout] 501 | fn compare_song_title(left: &Song, right: &Song, ascending: bool) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_optional_i64` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:511:4
[INFO] [stdout]     |
[INFO] [stdout] 511 | fn compare_optional_i64(left: Option<i64>, right: Option<i64>, ascending: bool) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_optional_u32` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:526:4
[INFO] [stdout]     |
[INFO] [stdout] 526 | fn compare_optional_u32(left: Option<u32>, right: Option<u32>, ascending: bool) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_song_last_played` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:541:4
[INFO] [stdout]     |
[INFO] [stdout] 541 | fn compare_song_last_played(left: &Song, right: &Song, ascending: bool) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `compare_song_most_played` is never used
[INFO] [stdout]    --> src/components/views/songs.rs:550:4
[INFO] [stdout]     |
[INFO] [stdout] 550 | fn compare_song_most_played(left: &Song, right: &Song, ascending: bool) -> Ordering {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TEMP_QUEUE_SNAPSHOT_LIMIT` is never used
[INFO] [stdout]   --> src/db/mod.rs:44:7
[INFO] [stdout]    |
[INFO] [stdout] 44 | const TEMP_QUEUE_SNAPSHOT_LIMIT: usize = 1;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `RepeatMode` is never used
[INFO] [stdout]   --> src/db/mod.rs:48:10
[INFO] [stdout]    |
[INFO] [stdout] 48 | pub enum RepeatMode {
[INFO] [stdout]    |          ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `ArtworkDownloadPreference` is never used
[INFO] [stdout]   --> src/db/mod.rs:57:10
[INFO] [stdout]    |
[INFO] [stdout] 57 | pub enum ArtworkDownloadPreference {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AppSettings` is never constructed
[INFO] [stdout]   --> src/db/mod.rs:67:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub struct AppSettings {
[INFO] [stdout]    |            ^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_lyrics_request_timeout_secs` is never used
[INFO] [stdout]    --> src/db/mod.rs:134:4
[INFO] [stdout]     |
[INFO] [stdout] 134 | fn default_lyrics_request_timeout_secs() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_lyrics_screenshot_mode` is never used
[INFO] [stdout]    --> src/db/mod.rs:138:4
[INFO] [stdout]     |
[INFO] [stdout] 138 | fn default_lyrics_screenshot_mode() -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_lyrics_theme` is never used
[INFO] [stdout]    --> src/db/mod.rs:142:4
[INFO] [stdout]     |
[INFO] [stdout] 142 | fn default_lyrics_theme() -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_cache_expiry_days` is never used
[INFO] [stdout]    --> src/db/mod.rs:146:4
[INFO] [stdout]     |
[INFO] [stdout] 146 | fn default_cache_expiry_days() -> i32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_bookmark_limit` is never used
[INFO] [stdout]    --> src/db/mod.rs:150:4
[INFO] [stdout]     |
[INFO] [stdout] 150 | fn default_bookmark_limit() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_bookmark_auto_save` is never used
[INFO] [stdout]    --> src/db/mod.rs:154:4
[INFO] [stdout]     |
[INFO] [stdout] 154 | fn default_bookmark_auto_save() -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_downloads_enabled` is never used
[INFO] [stdout]    --> src/db/mod.rs:158:4
[INFO] [stdout]     |
[INFO] [stdout] 158 | fn default_downloads_enabled() -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_auto_download_tier` is never used
[INFO] [stdout]    --> src/db/mod.rs:162:4
[INFO] [stdout]     |
[INFO] [stdout] 162 | fn default_auto_download_tier() -> u8 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_auto_download_album_count` is never used
[INFO] [stdout]    --> src/db/mod.rs:166:4
[INFO] [stdout]     |
[INFO] [stdout] 166 | fn default_auto_download_album_count() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_auto_download_playlist_count` is never used
[INFO] [stdout]    --> src/db/mod.rs:170:4
[INFO] [stdout]     |
[INFO] [stdout] 170 | fn default_auto_download_playlist_count() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_download_limit_count` is never used
[INFO] [stdout]    --> src/db/mod.rs:174:4
[INFO] [stdout]     |
[INFO] [stdout] 174 | fn default_download_limit_count() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_download_limit_mb` is never used
[INFO] [stdout]    --> src/db/mod.rs:178:4
[INFO] [stdout]     |
[INFO] [stdout] 178 | fn default_download_limit_mb() -> u32 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_artwork_download_preference` is never used
[INFO] [stdout]    --> src/db/mod.rs:182:4
[INFO] [stdout]     |
[INFO] [stdout] 182 | fn default_artwork_download_preference() -> ArtworkDownloadPreference {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_home_layout_json` is never used
[INFO] [stdout]    --> src/db/mod.rs:186:4
[INFO] [stdout]     |
[INFO] [stdout] 186 | fn default_home_layout_json() -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `default_home_feed_load_profile` is never used
[INFO] [stdout]    --> src/db/mod.rs:190:4
[INFO] [stdout]     |
[INFO] [stdout] 190 | fn default_home_feed_load_profile() -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `migrate_settings` is never used
[INFO] [stdout]    --> src/db/mod.rs:194:4
[INFO] [stdout]     |
[INFO] [stdout] 194 | fn migrate_settings(mut settings: AppSettings) -> AppSettings {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PlaybackState` is never constructed
[INFO] [stdout]    --> src/db/mod.rs:297:12
[INFO] [stdout]     |
[INFO] [stdout] 297 | pub struct PlaybackState {
[INFO] [stdout]     |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `QueueItem` is never constructed
[INFO] [stdout]    --> src/db/mod.rs:306:12
[INFO] [stdout]     |
[INFO] [stdout] 306 | pub struct QueueItem {
[INFO] [stdout]     |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `TemporaryQueueSnapshot` is never constructed
[INFO] [stdout]    --> src/db/mod.rs:312:12
[INFO] [stdout]     |
[INFO] [stdout] 312 | pub struct TemporaryQueueSnapshot {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `snapshot_signature` is never used
[INFO] [stdout]    --> src/db/mod.rs:321:4
[INFO] [stdout]     |
[INFO] [stdout] 321 | fn snapshot_signature(snapshot: &TemporaryQueueSnapshot) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `normalize_queue_snapshots` is never used
[INFO] [stdout]    --> src/db/mod.rs:340:4
[INFO] [stdout]     |
[INFO] [stdout] 340 | fn normalize_queue_snapshots(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `upsert_queue_snapshot` is never used
[INFO] [stdout]    --> src/db/mod.rs:371:4
[INFO] [stdout]     |
[INFO] [stdout] 371 | fn upsert_queue_snapshot(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_servers` is never used
[INFO] [stdout]    --> src/db/mod.rs:407:14
[INFO] [stdout]     |
[INFO] [stdout] 407 | pub async fn save_servers(servers: Vec<ServerConfig>) -> Result<(), DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_servers_now` is never used
[INFO] [stdout]    --> src/db/mod.rs:412:8
[INFO] [stdout]     |
[INFO] [stdout] 412 | pub fn save_servers_now(servers: &[ServerConfig]) -> Result<(), DbError> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_servers_inner` is never used
[INFO] [stdout]    --> src/db/mod.rs:418:4
[INFO] [stdout]     |
[INFO] [stdout] 418 | fn save_servers_inner(
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_servers` is never used
[INFO] [stdout]    --> src/db/mod.rs:458:14
[INFO] [stdout]     |
[INFO] [stdout] 458 | pub async fn load_servers() -> Result<Vec<ServerConfig>, DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_settings` is never used
[INFO] [stdout]    --> src/db/mod.rs:492:14
[INFO] [stdout]     |
[INFO] [stdout] 492 | pub async fn save_settings(settings: AppSettings) -> Result<(), DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_settings` is never used
[INFO] [stdout]    --> src/db/mod.rs:513:14
[INFO] [stdout]     |
[INFO] [stdout] 513 | pub async fn load_settings() -> Result<AppSettings, DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_playback_state` is never used
[INFO] [stdout]    --> src/db/mod.rs:539:14
[INFO] [stdout]     |
[INFO] [stdout] 539 | pub async fn save_playback_state(state: PlaybackState) -> Result<(), DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_playback_state` is never used
[INFO] [stdout]    --> src/db/mod.rs:559:14
[INFO] [stdout]     |
[INFO] [stdout] 559 | pub async fn load_playback_state() -> Result<PlaybackState, DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_temporary_queue_snapshot` is never used
[INFO] [stdout]    --> src/db/mod.rs:583:14
[INFO] [stdout]     |
[INFO] [stdout] 583 | pub async fn save_temporary_queue_snapshot(
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_temporary_queue_snapshots` is never used
[INFO] [stdout]    --> src/db/mod.rs:616:14
[INFO] [stdout]     |
[INFO] [stdout] 616 | pub async fn load_temporary_queue_snapshots() -> Result<Vec<TemporaryQueueSnapshot>, DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `initialize_database` is never used
[INFO] [stdout]    --> src/db/mod.rs:643:14
[INFO] [stdout]     |
[INFO] [stdout] 643 | pub async fn initialize_database() -> Result<(), DbError> {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `PerfTimer` is never constructed
[INFO] [stdout]  --> src/diagnostics.rs:3:12
[INFO] [stdout]   |
[INFO] [stdout] 3 | pub struct PerfTimer {
[INFO] [stdout]   |            ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated items `now` and `elapsed_ms` are never used
[INFO] [stdout]   --> src/diagnostics.rs:15:12
[INFO] [stdout]    |
[INFO] [stdout] 13 | impl PerfTimer {
[INFO] [stdout]    | -------------- associated items in this implementation
[INFO] [stdout] 14 |     #[inline]
[INFO] [stdout] 15 |     pub fn now() -> Self {
[INFO] [stdout]    |            ^^^
[INFO] [stdout] ...
[INFO] [stdout] 32 |     fn elapsed_ms(self) -> u128 {
[INFO] [stdout]    |        ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `log_perf` is never used
[INFO] [stdout]   --> src/diagnostics.rs:46:8
[INFO] [stdout]    |
[INFO] [stdout] 46 | pub fn log_perf(scope: &str, started_at: PerfTimer, details: &str) {
[INFO] [stdout]    |        ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `COVER_ART_CACHE_SUBDIR` is never used
[INFO] [stdout]   --> src/offline_art.rs:19:7
[INFO] [stdout]    |
[INFO] [stdout] 19 | const COVER_ART_CACHE_SUBDIR: &str = "cover_art_cache";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `IN_FLIGHT_ART` is never used
[INFO] [stdout]   --> src/offline_art.rs:22:8
[INFO] [stdout]    |
[INFO] [stdout] 22 | static IN_FLIGHT_ART: Lazy<Mutex<HashSet<String>>> = Lazy::new(|| Mutex::new(HashSet::new()));
[INFO] [stdout]    |        ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `ART_HTTP_CLIENT` is never used
[INFO] [stdout]   --> src/offline_art.rs:24:8
[INFO] [stdout]    |
[INFO] [stdout] 24 | static ART_HTTP_CLIENT: Lazy<reqwest::Client> = Lazy::new(reqwest::Client::new);
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_file_component` is never used
[INFO] [stdout]   --> src/offline_art.rs:27:4
[INFO] [stdout]    |
[INFO] [stdout] 27 | fn sanitize_file_component(raw: &str) -> String {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cover_art_cache_dir` is never used
[INFO] [stdout]   --> src/offline_art.rs:46:4
[INFO] [stdout]    |
[INFO] [stdout] 46 | fn cover_art_cache_dir() -> Option<PathBuf> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cover_art_file_path` is never used
[INFO] [stdout]   --> src/offline_art.rs:53:4
[INFO] [stdout]    |
[INFO] [stdout] 53 | fn cover_art_file_path(server_id: &str, cover_art_id: &str, size: u32) -> Option<PathBuf> {
[INFO] [stdout]    |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cached_cover_art_data_url` is never used
[INFO] [stdout]   --> src/offline_art.rs:61:8
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub fn cached_cover_art_data_url(server_id: &str, cover_art_id: &str, size: u32) -> Option<String> {
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `maybe_prefetch_cover_art` is never used
[INFO] [stdout]   --> src/offline_art.rs:81:8
[INFO] [stdout]    |
[INFO] [stdout] 81 | pub fn maybe_prefetch_cover_art(
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `AUDIO_HTTP_CLIENT` is never used
[INFO] [stdout]   --> src/offline_audio.rs:33:8
[INFO] [stdout]    |
[INFO] [stdout] 33 | static AUDIO_HTTP_CLIENT: Lazy<reqwest::Client> = Lazy::new(reqwest::Client::new);
[INFO] [stdout]    |        ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `AUDIO_CACHE_SUBDIR` is never used
[INFO] [stdout]   --> src/offline_audio.rs:36:7
[INFO] [stdout]    |
[INFO] [stdout] 36 | const AUDIO_CACHE_SUBDIR: &str = "audio_cache";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOAD_INDEX_FILE` is never used
[INFO] [stdout]   --> src/offline_audio.rs:38:7
[INFO] [stdout]    |
[INFO] [stdout] 38 | const DOWNLOAD_INDEX_FILE: &str = "download_index.json";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `COLLECTION_INDEX_FILE` is never used
[INFO] [stdout]   --> src/offline_audio.rs:40:7
[INFO] [stdout]    |
[INFO] [stdout] 40 | const COLLECTION_INDEX_FILE: &str = "download_collections.json";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `COLLECTION_MEMBERSHIP_INDEX_FILE` is never used
[INFO] [stdout]   --> src/offline_audio.rs:42:7
[INFO] [stdout]    |
[INFO] [stdout] 42 | const COLLECTION_MEMBERSHIP_INDEX_FILE: &str = "download_collection_memberships.json";
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `DOWNLOAD_ARTWORK_SIZES` is never used
[INFO] [stdout]   --> src/offline_audio.rs:44:7
[INFO] [stdout]    |
[INFO] [stdout] 44 | const DOWNLOAD_ARTWORK_SIZES: [u32; 7] = [80, 100, 120, 160, 300, 500, 512];
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `CACHE_AUDIO_EXTENSIONS` is never used
[INFO] [stdout]   --> src/offline_audio.rs:46:7
[INFO] [stdout]    |
[INFO] [stdout] 46 | const CACHE_AUDIO_EXTENSIONS: [&str; 8] =
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: constant `TEMP_QUEUE_PREFETCH_LIMIT_WHEN_AUTO_OFF` is never used
[INFO] [stdout]   --> src/offline_audio.rs:49:7
[INFO] [stdout]    |
[INFO] [stdout] 49 | const TEMP_QUEUE_PREFETCH_LIMIT_WHEN_AUTO_OFF: usize = 5;
[INFO] [stdout]    |       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: enum `DownloadOrigin` is never used
[INFO] [stdout]   --> src/offline_audio.rs:53:10
[INFO] [stdout]    |
[INFO] [stdout] 53 | pub enum DownloadOrigin {
[INFO] [stdout]    |          ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadStats` is never constructed
[INFO] [stdout]   --> src/offline_audio.rs:61:12
[INFO] [stdout]    |
[INFO] [stdout] 61 | pub struct DownloadStats {
[INFO] [stdout]    |            ^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `AutoDownloadReport` is never constructed
[INFO] [stdout]   --> src/offline_audio.rs:67:12
[INFO] [stdout]    |
[INFO] [stdout] 67 | pub struct AutoDownloadReport {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadBatchReport` is never constructed
[INFO] [stdout]   --> src/offline_audio.rs:77:12
[INFO] [stdout]    |
[INFO] [stdout] 77 | pub struct DownloadBatchReport {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadCacheRefreshReport` is never constructed
[INFO] [stdout]   --> src/offline_audio.rs:87:12
[INFO] [stdout]    |
[INFO] [stdout] 87 | pub struct DownloadCacheRefreshReport {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadIndexEntry` is never constructed
[INFO] [stdout]   --> src/offline_audio.rs:96:12
[INFO] [stdout]    |
[INFO] [stdout] 96 | pub struct DownloadIndexEntry {
[INFO] [stdout]    |            ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadCollectionEntry` is never constructed
[INFO] [stdout]    --> src/offline_audio.rs:115:12
[INFO] [stdout]     |
[INFO] [stdout] 115 | pub struct DownloadCollectionEntry {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: methods `effective_total_song_count` and `effective_downloaded_song_count` are never used
[INFO] [stdout]    --> src/offline_audio.rs:132:12
[INFO] [stdout]     |
[INFO] [stdout] 131 | impl DownloadCollectionEntry {
[INFO] [stdout]     | ---------------------------- methods in this implementation
[INFO] [stdout] 132 |     pub fn effective_total_song_count(&self) -> usize {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] ...
[INFO] [stdout] 142 |     pub fn effective_downloaded_song_count(&self) -> usize {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `DownloadCollectionMembershipEntry` is never constructed
[INFO] [stdout]    --> src/offline_audio.rs:155:12
[INFO] [stdout]     |
[INFO] [stdout] 155 | pub struct DownloadCollectionMembershipEntry {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ActiveDownloadEntry` is never constructed
[INFO] [stdout]    --> src/offline_audio.rs:165:12
[INFO] [stdout]     |
[INFO] [stdout] 165 | pub struct ActiveDownloadEntry {
[INFO] [stdout]     |            ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: static `ACTIVE_DOWNLOADS` is never used
[INFO] [stdout]    --> src/offline_audio.rs:177:8
[INFO] [stdout]     |
[INFO] [stdout] 177 | static ACTIVE_DOWNLOADS: Lazy<std::sync::Mutex<Vec<ActiveDownloadEntry>>> =
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `now_timestamp_millis` is never used
[INFO] [stdout]    --> src/offline_audio.rs:181:4
[INFO] [stdout]     |
[INFO] [stdout] 181 | fn now_timestamp_millis() -> u64 {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sanitize_file_component` is never used
[INFO] [stdout]    --> src/offline_audio.rs:191:4
[INFO] [stdout]     |
[INFO] [stdout] 191 | fn sanitize_file_component(raw: &str) -> String {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `audio_cache_dir` is never used
[INFO] [stdout]    --> src/offline_audio.rs:210:4
[INFO] [stdout]     |
[INFO] [stdout] 210 | fn audio_cache_dir() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `audio_cache_file_path_by_ids` is never used
[INFO] [stdout]    --> src/offline_audio.rs:217:4
[INFO] [stdout]     |
[INFO] [stdout] 217 | fn audio_cache_file_path_by_ids(server_id: &str, song_id: &str) -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `audio_cache_file_path` is never used
[INFO] [stdout]    --> src/offline_audio.rs:234:4
[INFO] [stdout]     |
[INFO] [stdout] 234 | fn audio_cache_file_path(song: &Song) -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `preferred_audio_file_extension` is never used
[INFO] [stdout]    --> src/offline_audio.rs:265:4
[INFO] [stdout]     |
[INFO] [stdout] 265 | fn preferred_audio_file_extension(song: &Song) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_cached_audio_extension` is never used
[INFO] [stdout]    --> src/offline_audio.rs:303:4
[INFO] [stdout]     |
[INFO] [stdout] 303 | fn is_cached_audio_extension(ext: &str) -> bool {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_audio_cache_files_by_ids` is never used
[INFO] [stdout]    --> src/offline_audio.rs:310:4
[INFO] [stdout]     |
[INFO] [stdout] 310 | fn remove_audio_cache_files_by_ids(server_id: &str, song_id: &str) -> usize {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `audio_mime_type` is never used
[INFO] [stdout]    --> src/offline_audio.rs:334:4
[INFO] [stdout]     |
[INFO] [stdout] 334 | fn audio_mime_type(song: &Song) -> &'static str {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `index_file_path` is never used
[INFO] [stdout]    --> src/offline_audio.rs:374:4
[INFO] [stdout]     |
[INFO] [stdout] 374 | fn index_file_path() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_index_file_path` is never used
[INFO] [stdout]    --> src/offline_audio.rs:379:4
[INFO] [stdout]     |
[INFO] [stdout] 379 | fn collection_index_file_path() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_membership_index_file_path` is never used
[INFO] [stdout]    --> src/offline_audio.rs:384:4
[INFO] [stdout]     |
[INFO] [stdout] 384 | fn collection_membership_index_file_path() -> Option<PathBuf> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_download_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:389:4
[INFO] [stdout]     |
[INFO] [stdout] 389 | fn load_download_index() -> Vec<DownloadIndexEntry> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_download_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:400:4
[INFO] [stdout]     |
[INFO] [stdout] 400 | fn save_download_index(index: &[DownloadIndexEntry]) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_collection_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:410:4
[INFO] [stdout]     |
[INFO] [stdout] 410 | fn load_collection_index() -> Vec<DownloadCollectionEntry> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_collection_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:421:4
[INFO] [stdout]     |
[INFO] [stdout] 421 | fn save_collection_index(index: &[DownloadCollectionEntry]) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `load_collection_membership_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:431:4
[INFO] [stdout]     |
[INFO] [stdout] 431 | fn load_collection_membership_index() -> Vec<DownloadCollectionMembershipEntry> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `save_collection_membership_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:442:4
[INFO] [stdout]     |
[INFO] [stdout] 442 | fn save_collection_membership_index(index: &[DownloadCollectionMembershipEntry]) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `merged_download_origin` is never used
[INFO] [stdout]    --> src/offline_audio.rs:452:4
[INFO] [stdout]     |
[INFO] [stdout] 452 | fn merged_download_origin(existing: DownloadOrigin, incoming: DownloadOrigin) -> DownloadOrigin {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `upsert_download_index` is never used
[INFO] [stdout]    --> src/offline_audio.rs:461:4
[INFO] [stdout]     |
[INFO] [stdout] 461 | fn upsert_download_index(song: &Song, size_bytes: u64, origin: DownloadOrigin) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `purge_index_missing_files` is never used
[INFO] [stdout]    --> src/offline_audio.rs:503:4
[INFO] [stdout]     |
[INFO] [stdout] 503 | fn purge_index_missing_files() -> Vec<DownloadIndexEntry> {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prune_audio_cache` is never used
[INFO] [stdout]    --> src/offline_audio.rs:519:4
[INFO] [stdout]     |
[INFO] [stdout] 519 | fn prune_audio_cache(max_size_mb: u32) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `cached_audio_url` is never used
[INFO] [stdout]    --> src/offline_audio.rs:572:8
[INFO] [stdout]     |
[INFO] [stdout] 572 | pub fn cached_audio_url(song: &Song) -> Option<String> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_song_downloaded` is never used
[INFO] [stdout]    --> src/offline_audio.rs:605:8
[INFO] [stdout]     |
[INFO] [stdout] 605 | pub fn is_song_downloaded(song: &Song) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_album_downloaded` is never used
[INFO] [stdout]    --> src/offline_audio.rs:615:8
[INFO] [stdout]     |
[INFO] [stdout] 615 | pub fn is_album_downloaded(server_id: &str, album_id: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `download_stats` is never used
[INFO] [stdout]    --> src/offline_audio.rs:630:8
[INFO] [stdout]     |
[INFO] [stdout] 630 | pub fn download_stats() -> DownloadStats {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_downloaded_entries` is never used
[INFO] [stdout]    --> src/offline_audio.rs:646:8
[INFO] [stdout]     |
[INFO] [stdout] 646 | pub fn list_downloaded_entries() -> Vec<DownloadIndexEntry> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mark_collection_downloaded` is never used
[INFO] [stdout]    --> src/offline_audio.rs:658:8
[INFO] [stdout]     |
[INFO] [stdout] 658 | pub fn mark_collection_downloaded(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `mark_playlist_auto_download_tracked` is never used
[INFO] [stdout]    --> src/offline_audio.rs:705:8
[INFO] [stdout]     |
[INFO] [stdout] 705 | pub fn mark_playlist_auto_download_tracked(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_playlist_auto_download_tracked` is never used
[INFO] [stdout]    --> src/offline_audio.rs:763:8
[INFO] [stdout]     |
[INFO] [stdout] 763 | pub fn is_playlist_auto_download_tracked(server_id: &str, playlist_id: &str) -> bool {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sync_downloaded_collection_members` is never used
[INFO] [stdout]    --> src/offline_audio.rs:784:8
[INFO] [stdout]     |
[INFO] [stdout] 784 | pub fn sync_downloaded_collection_members(
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_downloaded_collection_memberships` is never used
[INFO] [stdout]    --> src/offline_audio.rs:849:8
[INFO] [stdout]     |
[INFO] [stdout] 849 | pub fn list_downloaded_collection_memberships() -> Vec<DownloadCollectionMembershipEntry> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_downloaded_collections` is never used
[INFO] [stdout]    --> src/offline_audio.rs:859:8
[INFO] [stdout]     |
[INFO] [stdout] 859 | pub fn list_downloaded_collections() -> Vec<DownloadCollectionEntry> {
[INFO] [stdout]     |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sync_downloaded_collection_metadata` is never used
[INFO] [stdout]    --> src/offline_audio.rs:871:14
[INFO] [stdout]     |
[INFO] [stdout] 871 | pub async fn sync_downloaded_collection_metadata(servers: &[ServerConfig]) -> usize {
[INFO] [stdout]     |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `push_active_download` is never used
[INFO] [stdout]    --> src/offline_audio.rs:994:4
[INFO] [stdout]     |
[INFO] [stdout] 994 | fn push_active_download(song: &Song) {
[INFO] [stdout]     |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `pop_active_download` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1022:4
[INFO] [stdout]      |
[INFO] [stdout] 1022 | fn pop_active_download(server_id: &str, song_id: &str) {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `list_active_downloads` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1030:8
[INFO] [stdout]      |
[INFO] [stdout] 1030 | pub fn list_active_downloads() -> Vec<ActiveDownloadEntry> {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: struct `ActiveDownloadGuard` is never constructed
[INFO] [stdout]     --> src/offline_audio.rs:1045:8
[INFO] [stdout]      |
[INFO] [stdout] 1045 | struct ActiveDownloadGuard {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: associated function `new` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1052:8
[INFO] [stdout]      |
[INFO] [stdout] 1051 | impl ActiveDownloadGuard {
[INFO] [stdout]      | ------------------------ associated function in this implementation
[INFO] [stdout] 1052 |     fn new(song: &Song) -> Self {
[INFO] [stdout]      |        ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `collection_index_key` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1069:4
[INFO] [stdout]      |
[INFO] [stdout] 1069 | fn collection_index_key(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `entry_matches_collection` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1082:4
[INFO] [stdout]      |
[INFO] [stdout] 1082 | fn entry_matches_collection(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sync_collection_download_counts_with_index` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1109:4
[INFO] [stdout]      |
[INFO] [stdout] 1109 | fn sync_collection_download_counts_with_index(entries: &[DownloadIndexEntry]) {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `sync_collection_memberships_with_index` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1203:4
[INFO] [stdout]      |
[INFO] [stdout] 1203 | fn sync_collection_memberships_with_index(entries: &[DownloadIndexEntry]) {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_download_index_keys` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1242:4
[INFO] [stdout]      |
[INFO] [stdout] 1242 | fn remove_download_index_keys(keys: &HashSet<(String, String)>) -> usize {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prune_temporary_queue_prefetch_downloads` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1274:8
[INFO] [stdout]      |
[INFO] [stdout] 1274 | pub fn prune_temporary_queue_prefetch_downloads(max_count: usize) -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_downloaded_song` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1302:8
[INFO] [stdout]      |
[INFO] [stdout] 1302 | pub fn remove_downloaded_song(server_id: &str, song_id: &str) -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_downloaded_collection` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1318:8
[INFO] [stdout]      |
[INFO] [stdout] 1318 | pub fn remove_downloaded_collection(kind: &str, server_id: &str, collection_id: &str) -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `remove_downloaded_album` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1349:8
[INFO] [stdout]      |
[INFO] [stdout] 1349 | pub fn remove_downloaded_album(server_id: &str, collection_id: &str, fallback_name: &str) -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `clear_downloads` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1405:8
[INFO] [stdout]      |
[INFO] [stdout] 1405 | pub fn clear_downloads() -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prune_download_cache` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1445:8
[INFO] [stdout]      |
[INFO] [stdout] 1445 | pub fn prune_download_cache(max_count: u32, max_size_mb: u32) -> usize {
[INFO] [stdout]      |        ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `auto_download_favorite_limit` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1545:4
[INFO] [stdout]      |
[INFO] [stdout] 1545 | fn auto_download_favorite_limit(tier: u8) -> usize {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `push_unique_song` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1554:4
[INFO] [stdout]      |
[INFO] [stdout] 1554 | fn push_unique_song(target: &mut Vec<Song>, seen: &mut HashSet<String>, song: Song) {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `is_id3_cover_art_id` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1565:4
[INFO] [stdout]      |
[INFO] [stdout] 1565 | fn is_id3_cover_art_id(cover_art_id: &str) -> bool {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `include_cover_for_preference` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1570:4
[INFO] [stdout]      |
[INFO] [stdout] 1570 | fn include_cover_for_preference(cover_art_id: &str, preference: ArtworkDownloadPreference) -> bool {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `song_cover_art_candidates` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1579:4
[INFO] [stdout]      |
[INFO] [stdout] 1579 | fn song_cover_art_candidates(song: &Song, preference: ArtworkDownloadPreference) -> Vec<String> {
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `warm_song_cover_art` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1610:4
[INFO] [stdout]      |
[INFO] [stdout] 1610 | fn warm_song_cover_art(
[INFO] [stdout]      |    ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `warm_song_lyrics` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1633:10
[INFO] [stdout]      |
[INFO] [stdout] 1633 | async fn warm_song_lyrics(song: &Song, settings: &AppSettings) -> Option<bool> {
[INFO] [stdout]      |          ^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `run_auto_download_pass` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1658:14
[INFO] [stdout]      |
[INFO] [stdout] 1658 | pub async fn run_auto_download_pass(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `download_songs_batch` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1817:14
[INFO] [stdout]      |
[INFO] [stdout] 1817 | pub async fn download_songs_batch(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `refresh_downloaded_cache` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1881:14
[INFO] [stdout]      |
[INFO] [stdout] 1881 | pub async fn refresh_downloaded_cache(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prefetch_song_audio_with_origin` is never used
[INFO] [stdout]     --> src/offline_audio.rs:1958:14
[INFO] [stdout]      |
[INFO] [stdout] 1958 | pub async fn prefetch_song_audio_with_origin(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: function `prefetch_song_audio` is never used
[INFO] [stdout]     --> src/offline_audio.rs:2063:14
[INFO] [stdout]      |
[INFO] [stdout] 2063 | pub async fn prefetch_song_audio(
[INFO] [stdout]      |              ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 53s
[INFO] running `Command { std: "docker" "inspect" "c640e66d7a0e19268e3563bdf68d0fa64de40a2e8846d302f710e236ebd15268", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "c640e66d7a0e19268e3563bdf68d0fa64de40a2e8846d302f710e236ebd15268", kill_on_drop: false }`
[INFO] [stdout] c640e66d7a0e19268e3563bdf68d0fa64de40a2e8846d302f710e236ebd15268
