aboutsummaryrefslogtreecommitdiffstats
path: root/src/app.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-30 10:10:10 -0700
committerAdam Soltys <[email protected]>2026-09-30 10:10:10 -0700
commit505cd84813a80e0a69b2cc95aa93c68cf2856cb2 (patch)
tree3453513920b23476e01efe508e73ba8651f438da /src/app.js
parent93c07bec934e8e8d847349b7792f4cc9089adbb7 (diff)
downloadcoinosv3-505cd84813a80e0a69b2cc95aa93c68cf2856cb2.tar.gz
coinosv3-505cd84813a80e0a69b2cc95aa93c68cf2856cb2.zip
Videos are shrunk on the phone before upload; nostr.build is the first media host.
No public Blossom host transcodes (nostr.build's and primal's BUD-05 /media return the same bitrate), so a 15-20 Mbps phone clip stalled on playback. src/video-compress.js re-encodes on the device with WebCodecs via Mediabunny (a lazily loaded chunk, left out of the SW precache and the standalone file): H.264, short edge 720, ~2.5 Mbps, moov first, audio passed through, rotation baked in. Anything short of a clear win uploads the original. A toast counts the shrinking down. Media hosts: blossom.nostr.build first, nostr.download second (it was unreachable for hours); a HEAD probe skips a host that doesn't answer within 5 s instead of waiting out the whole upload timeout. video-compress-test: 1080p 20 Mbps 5 s (landscape and rotated portrait) → 1.6 MB H.264 720p 2.49 Mbps with audio, moov first, in 2-3 s. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Du1qT1wbkYwYK6zkGH79Rp
Diffstat (limited to 'src/app.js')
-rw-r--r--src/app.js11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/app.js b/src/app.js
index 0bf3086..5b0bdb6 100644
--- a/src/app.js
+++ b/src/app.js
@@ -3483,6 +3483,17 @@ async function onbUpload(file) {
}
async function publicMediaUpload(file) {
+ // a phone video is shrunk on the device first (see video-compress.js);
+ // the toast counts it down, since a long clip takes a while
+ if (/^video\//.test(file?.type || '')) {
+ let shown = -1;
+ const { compressVideo } = await import('./video-compress.js');
+ file = await compressVideo(file, (p) => {
+ const pct = Math.floor(p * 100);
+ if (pct !== shown && pct % 5 === 0) { shown = pct; toast(t('mediaShrinking', { pct }), 60_000); }
+ });
+ if (shown >= 0) toast(t('mediaUploading'), 4000);
+ }
try {
return await uploadPublicMedia(file, (event) => wallet.nostrSign(event));
} catch (error) {