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.
23 lines
1.2 KiB
Plaintext
23 lines
1.2 KiB
Plaintext
/** Stage a playlist FILE. The name travels beside the path rather than
|
|
* being read off it: the picked document's own name is what chooses the
|
|
* parser and titles the draft, and a document the phone had no path for
|
|
* arrives as a cache copy. Rows naming a file by a relative path resolve
|
|
* against the file's own folder; a copied file's rows fall back to the
|
|
* library's basename index, so they still find what this phone holds. A
|
|
* playlist file does produce stream rows, so the catalog pass runs. */
|
|
export async function startFile(path, name) {
|
|
const g = ++gen;
|
|
Object.assign(importer, { door: "file", source: path, busy: true, error: "", progress: null, draft: null, name: "", includeUnresolved: true, checks: {}, committing: false, links: false });
|
|
try {
|
|
const draft = await api.playlistImportProbe(path, name);
|
|
if (g !== gen) return;
|
|
importer.busy = false;
|
|
if (!draft) { importer.error = "Nothing came back from that file."; return; }
|
|
importer.draft = draft;
|
|
importer.name = draft.name ?? "";
|
|
if (draft.entries?.length) queueMicrotask(() => void verifyStreams(g));
|
|
} catch (e) {
|
|
if (g === gen) { importer.error = String(e); importer.busy = false; }
|
|
}
|
|
}
|