forked from Keelrleek/SoulStream
Everything the import grew over the last week, landing in one go — the window, the picker, the audition pen, apply, and the review that stands between them. The fold is the new part. A release filed as a container of parts arrived as N albums, because the scan groups audio by its immediate parent and the container holds none of its own: Analord's eleven volumes were eleven records, and six more releases split the same way. Records now fold into the release above them, and apply is handed an explicit part list — never a recursive walk, which is what let one stray file swallow 288 descendants and duplicate 9 GB. Where releases live is read off the collection rather than assumed, so a genre-nested library moves the answer instead of breaking; below a dominant majority at one depth the pass refuses entirely, because no folding beats wrong folding. Three vetoes independent of depth catch a misread level. Every fold is listed in the review with a way out. research/import/fold-audit.mjs imports the shipping module, so the audited code is the running code: 9 folds, 0 swallows across four library shapes, and none of the 148 artist folders touched. It was that harness that killed the tempting version of this rule — matching a part against its container folded 40 artist folders, Mac Demarco's 8 albums into one, because album folders carry the artist's name. The regression test found a live bug on the way: parts number from 01 each, so flattening two discs collided, and "same name, same size" read the second file as already-imported and dropped it while still counting it. That reuse now also requires that this run has not already written the path. Also here: the picker's accent crossfades between records instead of cutting through the app's blue (ownership moved to the window, which survives the per-record re-key), the fullscreen viewer wears the album's accent instead of the one it left behind in the portal, Skip defers a record without deciding it, and Keep mine is gone — with the cards picked field by field it was Next under another name.
65 lines
1.9 KiB
TOML
65 lines
1.9 KiB
TOML
[package]
|
|
name = "app"
|
|
version.workspace = true
|
|
description = "SoulStream — music player, downloader and streamer for the Soulseek network"
|
|
authors.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
|
|
[lib]
|
|
name = "app_lib"
|
|
crate-type = ["staticlib", "cdylib", "rlib"]
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
|
|
[dev-dependencies]
|
|
# Import-apply tests build a whole source/pen/library bed on disk; already in
|
|
# the lock file via the dependency tree, so this adds no download.
|
|
tempfile = "3"
|
|
|
|
[dependencies]
|
|
tauri = { version = "2", features = [] }
|
|
tauri-plugin-log = "2"
|
|
tauri-plugin-dialog = "2"
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
log.workspace = true
|
|
image.workspace = true
|
|
tokio.workspace = true
|
|
|
|
base64 = "0.22"
|
|
keyring = { version = "3", features = ["windows-native"] }
|
|
sysinfo = "0.33"
|
|
soulseek-proto = { path = "../crates/soulseek-proto" }
|
|
soulseek-client = { path = "../crates/soulseek-client" }
|
|
player = { path = "../crates/player" }
|
|
tagger = { path = "../crates/tagger" }
|
|
metadata = { path = "../crates/metadata" }
|
|
library = { path = "../crates/library" }
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
windows = { version = "0.61.3", features = [
|
|
"AI_MachineLearning",
|
|
"Foundation_Collections",
|
|
"Globalization",
|
|
"Graphics_Imaging",
|
|
# SystemMediaTransportControls — the OS media card (see src/smtc.rs).
|
|
"Media",
|
|
"Media_FaceAnalysis",
|
|
"Media_Ocr",
|
|
"Storage_Streams",
|
|
"Win32_Foundation",
|
|
# Taskbar thumbnail toolbar — ITaskbarList3 + the window subclass that
|
|
# hears its clicks, and the GDI/registry bits that draw its icons.
|
|
"Win32_Graphics_Gdi",
|
|
"Win32_System_Com",
|
|
"Win32_System_Registry",
|
|
"Win32_UI_Shell",
|
|
"Win32_UI_WindowsAndMessaging",
|
|
"Win32_System_Performance",
|
|
"Win32_System_ProcessStatus",
|
|
"Win32_System_Threading",
|
|
"Win32_System_WinRT",
|
|
] }
|