Everything written this session that has not been through the device: rounds 43 to 48 (each patch adversarially verified, 43's transient-notice expectation fixed), a partial round 49, the pipeline scripts, the Android Auto design and the icon comparison mock. Also the two harness changes that were never A/B'd — adaptive waits, which may only shorten a declared wait and never lengthen it, and a ship that runs the mock walk and the deploy at the same time. The A/B and its 255-step baseline are in handoff/tools; main stays at what the phone has actually walked.
19 lines
1.1 KiB
Plaintext
19 lines
1.1 KiB
Plaintext
/* the desktop's copy_stream_to_folder: the cached stream written into a
|
|
folder picked on this phone, as the file it is — no re-download, no
|
|
tagging, no library row. Nothing leaves the phone, so the Wi-Fi guard
|
|
has no say here. A track that has not finished streaming is counted
|
|
back as missing, never fetched. */
|
|
async function copyToFolder(entries) {
|
|
const files = entries.filter((e) => e.t?.stream && e.t.path).map((e) => ({ username: e.t.stream.username, path: e.t.path }));
|
|
if (!files.length) return;
|
|
try {
|
|
const r = await api.pickLibraryFolder();
|
|
if (!r?.path) { player.error = "That folder has no path the phone can write to — pick one on this phone's storage."; return; }
|
|
const [saved, missing] = await api.copyStreamToFolder(files, r.path);
|
|
note(saved ? saved + " file" + (saved === 1 ? "" : "s") + " copied" + (missing ? " · " + missing + " not cached yet" : "")
|
|
: "Not cached yet — play it through first");
|
|
} catch (e) {
|
|
if (!/cancelled/.test(String(e))) oops(e);
|
|
}
|
|
}
|