feat(webseed): upload form accepts multiple web seeds (slice 2/3)

Let uploaders declare a backup origin at creation time so the swarm can keep
streaming when the primary CDN is overloaded.

- upload-modal.html: the single "Web Seed (ws)" input becomes a "Web seeds
  (one per line)" textarea with help text explaining the backup-origin use
  case and the byte-identical-file requirement.
- UploadModal: in upload mode the R2/CDN url stays the primary webseed and any
  textarea entries follow it (passed as [primaryUrl, textarea]); external mode
  already flowed the field through. All parsing stays in the payload layer.
- videoNotePayload.normalizeWebSeedList now splits every entry (array OR
  string) on newlines/commas, so the upload-modal's [url, "a\nb"] shape and a
  plain multi-line string both expand + dedupe correctly.

Mutation-verified (array entries no longer split fails the upload-shape test);
build + full unit suite green. Lints relevant to the change (inline-styles,
tokens, innerHTML) pass.

Note: npm run lint also reports pre-existing file-size violations in unrelated
files (SignerManager, watchHistory, playbackService, webtorrent, etc.) that
grew in earlier commits — none are touched here. Flagging separately.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
thePR0M3TH3ANandClaude Opus 4.8 committed 2026-06-19 08:36:13 -04:00
1 parent cf98d06cca
commit ce7ef9ef2d
4 files changed
+44 -13

No files matched your search

+7 -1
View File
@@ -1073,7 +1073,13 @@ export class UploadModal {
metadata.storagePointer =
this.videoUploadState.storagePointer ||
deriveStoragePointerFromUrl(metadata.url, providerLabel);
metadata.ws = this.videoUploadState.url; // WebSeed is same as R2 URL
// The R2/CDN url is the primary webseed; any additional backup
// webseeds the uploader entered (one per line) follow it.
// normalizeVideoNotePayload splits + dedupes this list.
metadata.ws = [
this.videoUploadState.url,
this.inputs.ws?.value || "",
];
metadata.xs = this.torrentState.url || "";
// NIP-71 IMETA for the main video