From 9051af0f3d70bb1baf06368d853611f12f9f0e4d Mon Sep 17 00:00:00 2001 From: gator Date: Wed, 9 Sep 2026 01:14:44 +0000 Subject: [PATCH] Share the short link, not the file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A link straight to the file cannot be counted — the recipient fetches bytes from the file host and we never hear about it. The short link runs through our own domain, so every open is a page load, and it is 33 characters against 74. --- videos.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/videos.html b/videos.html index 74ac316..4565c28 100644 --- a/videos.html +++ b/videos.html @@ -74,15 +74,11 @@ function card(p) { + esc(p.video_url) + '" download>Download'; } - // The file URL ends in /public with no filename. Headers are already right - // (video/mp4), but clients that sniff the URL string are not, and a filename - // query is accepted and ignored by the file service. + // Through our own domain, so an open is a page load we can count. A link + // straight to the file is invisible to us. 33 characters against 74. window.__shareUrl = window.__shareUrl || function (p) { - var u = p.cut_url || p.video_url || ""; - if (!u) return ""; - var slug = ((p.pet_name || "video") + " " + (p.title || "")).toLowerCase() - .replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 40) || "video"; - return u + (u.indexOf("?") < 0 ? "?" : "&") + "v=" + slug + ".mp4"; + if (!(p.cut_url || p.video_url)) return ""; + return location.origin + "/v/" + String(p.id || "").slice(0, 8); }; return '
' @@ -117,6 +113,10 @@ async function load() { if (!p) return; var link = window.__shareUrl(p); if (!link) { showMsg("msg", "That one has no video yet."); return; } + // Sharing is a decision: this is what makes the link resolve at all. + var s = await api("share_link", { email: email, project_id: p.id }); + if (!s.ok) { showMsg("msg", s.error || "Could not make a link."); return; } + link = s.url || link; var title = p.title || ((p.pet_name || "Your pet") + " has something to say"); // The native sheet is the shortest path into a text message on a phone. if (navigator.share) {