feat: update embed player design with transparent background and overlay stats

- Removed background colors from `embed.html` for transparency.
- Added a hover-triggered overlay with "Watch on BitVid" button and stats (views, likes, dislikes).
- Updated `js/ui/components/EmbedPlayerModal.js` to implement stats update methods and handle the overlay elements.
- Updated `js/embed.js` to set the share URL on the overlay after video resolution.
- Verified visual changes with Playwright.
This commit is contained in:
google-labs-jules[bot] committed 2026-01-24 22:41:56 +00:00
1 parent a9bd7ec79e
commit d621e6f21a
6 files changed
+715 -25

No files matched your search

+94 -12
View File
@@ -69,28 +69,110 @@
<link href="css/tailwind.generated.css?v=2024.11.09" rel="stylesheet" />
</head>
<body class="min-h-screen bg-surface text-text" data-ds="new">
<body class="h-screen w-screen overflow-hidden bg-transparent text-text" data-ds="new">
<main
id="embedRoot"
class="mx-auto flex min-h-screen w-full max-w-5xl flex-col px-4 py-6"
class="flex h-full w-full flex-col items-center justify-center"
>
<section
class="flex flex-col gap-4 rounded-2xl border border-border bg-surface-alt/60 p-4 shadow-sm"
class="relative group flex h-full w-full flex-col items-center justify-center overflow-hidden"
>
<video
id="embedVideo"
class="h-full w-full object-contain bg-black"
controls
playsinline
preload="metadata"
></video>
<!-- Overlay -->
<div
class="aspect-video w-full overflow-hidden rounded-xl border border-border/70 bg-surface"
id="embedOverlay"
class="pointer-events-none absolute inset-0 flex flex-col justify-end bg-gradient-to-t from-black/80 via-transparent to-transparent p-4 opacity-0 transition-opacity duration-200 group-hover:opacity-100"
>
<video
id="embedVideo"
class="h-full w-full"
controls
playsinline
preload="metadata"
></video>
<div class="pointer-events-auto flex w-full items-end justify-between">
<a
id="embedWatchButton"
href="#"
target="_blank"
class="flex items-center gap-2 rounded-full border border-white/20 bg-white/10 px-3 py-1.5 text-xs font-medium text-white transition-colors hover:bg-white/20 backdrop-blur-md"
>
<img
src="assets/svg/bitvid-logo-light-mode.svg"
alt="BitVid"
class="h-4 w-auto"
/>
<span>Watch on BitVid</span>
</a>
<div
class="flex items-center gap-3 text-xs font-medium text-white drop-shadow-md"
>
<span
id="embedViewCount"
class="flex items-center gap-1.5"
title="Views"
>
<svg
class="h-4 w-4 text-white/80"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
></path>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
></path>
</svg>
<span data-view-count-text>--</span>
</span>
<span
id="embedLikeCount"
class="flex items-center gap-1.5"
title="Likes"
>
<svg
class="h-3.5 w-3.5 text-white/80"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"
></path>
</svg>
<span data-count>--</span>
</span>
<span
id="embedDislikeCount"
class="flex items-center gap-1.5"
title="Dislikes"
>
<svg
class="h-3.5 w-3.5 text-white/80"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3"
></path>
</svg>
<span data-count>--</span>
</span>
</div>
</div>
</div>
<p
id="embedStatus"
class="text-sm text-muted"
class="pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-md bg-black/60 px-3 py-1 text-sm text-white/90 backdrop-blur-sm"
role="status"
aria-live="polite"
>
+5
View File
@@ -396,6 +396,11 @@ const startEmbed = async () => {
forcedSource: playback || undefined,
trigger: videoEl,
});
if (app.videoModal && typeof app.videoModal.setShareUrl === "function") {
const shareUrl = app.buildShareUrlFromEventId(video.id);
app.videoModal.setShareUrl(shareUrl);
}
} catch (error) {
devLogger.warn("[embed] Playback failed:", error);
setStatus("Playback failed. Please try again.", "error");
+121 -13
View File
@@ -7,10 +7,16 @@ export class EmbedPlayerModal {
this.status = null;
this.eventTarget = new EventTarget();
// Overlay elements
this.watchButton = null;
this.viewCountEl = null;
this.likeCountEl = null;
this.dislikeCountEl = null;
this.toneClasses = {
default: "text-muted",
error: "text-danger",
success: "text-success",
default: "text-white/90",
error: "text-red-400",
success: "text-green-400",
};
}
@@ -19,6 +25,11 @@ export class EmbedPlayerModal {
this.root = this.document.getElementById("embedRoot");
this.video = this.document.getElementById("embedVideo");
this.status = this.document.getElementById("embedStatus");
this.watchButton = this.document.getElementById("embedWatchButton");
this.viewCountEl = this.document.getElementById("embedViewCount");
this.likeCountEl = this.document.getElementById("embedLikeCount");
this.dislikeCountEl = this.document.getElementById("embedDislikeCount");
}
return Promise.resolve(this.root);
}
@@ -39,7 +50,7 @@ export class EmbedPlayerModal {
}
resetStats() {
// no-op for embed view
// no-op for embed view (torrent stats)
}
setStatus(message, tone = "default") {
@@ -50,15 +61,16 @@ export class EmbedPlayerModal {
const normalizedMessage = typeof message === "string" ? message.trim() : "";
this.status.textContent = normalizedMessage;
Object.values(this.toneClasses).forEach((className) => {
if (className) {
this.status.classList.remove(className);
}
});
// Reset classes
this.status.className = "pointer-events-none absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 rounded-md bg-black/60 px-3 py-1 text-sm backdrop-blur-sm";
const toneClass = this.toneClasses[tone] || this.toneClasses.default;
if (toneClass) {
this.status.classList.add(toneClass);
this.status.classList.add(toneClass);
if (!normalizedMessage) {
this.status.hidden = true;
} else {
this.status.hidden = false;
}
}
@@ -67,11 +79,12 @@ export class EmbedPlayerModal {
}
applyLoadingPoster() {
this.setStatus("Preparing playback…", "default");
this.setStatus("Loading…", "default");
}
forceRemovePoster() {
return false;
this.setStatus("", "default");
return true;
}
clearPosterCleanup() {}
@@ -103,4 +116,99 @@ export class EmbedPlayerModal {
dispatch(type, detail) {
return this.eventTarget.dispatchEvent(new CustomEvent(type, { detail }));
}
// --- New Methods for Overlay ---
setShareUrl(url) {
if (this.watchButton && url) {
this.watchButton.href = url;
}
}
getViewCountElement() {
return this.viewCountEl;
}
updateViewCountLabel(text) {
if (!this.viewCountEl) {
return;
}
const label = this.viewCountEl.querySelector("[data-view-count-text]");
if (label) {
// App passes "123 views" or "– views". We strip "views" to keep it compact if desired,
// but the prompt asked for "view count" so maybe "1.2k views" is fine.
// Given the compact design (icon + text), just number is often cleaner, but let's stick to what app sends or simple parse.
// Actually app sends formatted string.
// Let's try to extract just the number/text if possible, or just render what is sent.
// "1.2k views" -> "1.2k"
const parts = (text || "").split(' ');
const compactText = parts[0] || "–";
label.textContent = compactText;
}
}
setViewCountPointer(pointerKey) {
if (this.viewCountEl && pointerKey) {
this.viewCountEl.dataset.pointerKey = pointerKey;
}
}
formatCount(num) {
const val = Number.isFinite(num) ? num : 0;
if (val === 0) return "0";
// Simple compact formatter
if (typeof Intl !== "undefined" && Intl.NumberFormat) {
try {
return new Intl.NumberFormat('en-US', {
notation: "compact",
maximumFractionDigits: 1
}).format(val);
} catch (e) {
// fallback
}
}
if (val >= 1000000) return (val / 1000000).toFixed(1) + 'M';
if (val >= 1000) return (val / 1000).toFixed(1) + 'k';
return String(val);
}
updateReactionSummary({ total, counts, userReaction } = {}) {
const likeCount = counts && typeof counts['+'] === 'number' ? counts['+'] : 0;
const dislikeCount = counts && typeof counts['-'] === 'number' ? counts['-'] : 0;
if (this.likeCountEl) {
const label = this.likeCountEl.querySelector("[data-count]");
if (label) label.textContent = this.formatCount(likeCount);
// Highlight if user liked? (Read-only for now but good visual feedback if we had auth state)
if (userReaction === '+') {
this.likeCountEl.classList.add("text-primary");
this.likeCountEl.classList.remove("text-white/80");
} else {
this.likeCountEl.classList.remove("text-primary");
this.likeCountEl.classList.add("text-white/80");
}
}
if (this.dislikeCountEl) {
const label = this.dislikeCountEl.querySelector("[data-count]");
if (label) label.textContent = this.formatCount(dislikeCount);
if (userReaction === '-') {
this.dislikeCountEl.classList.add("text-red-400");
this.dislikeCountEl.classList.remove("text-white/80");
} else {
this.dislikeCountEl.classList.remove("text-red-400");
this.dislikeCountEl.classList.add("text-white/80");
}
}
}
setUserReaction(reaction) {
// We don't have the full counts here to update UI fully,
// but updateReactionSummary will be called by controller with full data.
// So we can ignore this or just toggle classes optimistically.
}
}
+452
View File
@@ -0,0 +1,452 @@
npm warn exec The following package was not found and will be installed: [email protected]
INFO Accepting connections at http://localhost:3000
HTTP 1/24/2026 10:39:03 PM ::1 GET /embed.html
HTTP 1/24/2026 10:39:03 PM ::1 Returned 301 in 387 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /embed
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 15 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /css/tailwind.generated.css?v=2024.11.09
HTTP 1/24/2026 10:39:03 PM ::1 GET /assets/svg/bitvid-logo-light-mode.svg
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 11 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrToolsBootstrap.js?v=2024.11.09
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/embed.js?v=2024.11.09
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/utils/logger.js
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/app.js
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrClientFacade.js
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostr/index.js
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/utils/videoPointer.js
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrToolsBootstrap.js
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 10 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 13 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 22 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 20 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 22 ms
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 34 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostr/defaultClient.js
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:03 PM ::1 GET /js/nostrClientRegistry.js
HTTP 1/24/2026 10:39:03 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/client.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip07Permissions.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip71.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/watchHistory.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/watchHistoryBindings.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/viewEvents.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/reactionEvents.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/commentEvents.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/config.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/pointer.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/hex.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrViewEventsFacade.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/webtorrent.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/embedDiagnostics.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/accessControl.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnetUtils.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/playbackUtils.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/constants.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/gridHealth.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/urlHealthObserver.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/cardSourceVisibility.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoTags.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/hashtagNormalization.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/profileMedia.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/lists.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/userBlocks.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/relayManager.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/index.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/watchHistoryService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/r2Service.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/videoNotePayload.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/index.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/hashtagPreferencesService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/r2-quick.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/sidebarLoading.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/subscriptions.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/channelProfile.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/watchHistoryDebug.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/overlay/popoverEngine.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/videoMenuRenderers.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationService.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 11 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip46Client.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrEventSchemas.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrPublish.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/signRequestQueue.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/viewCounter.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapSplit.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/formatters.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/reactionCounter.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/domUtils.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/staticModalAccessibility.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/loginModalController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/tagPreferenceMenuController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/reactionController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/magnetValidators.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoDeduper.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/serviceWorkerFallbackMessages.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/profileBatchFetcher.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/videoTimestamps.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/hashView.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/appState.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/cache.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/applicationBootstrap.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/engagementController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/similarContentController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/urlHealthController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/videoModalCommentController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/torrentStatusController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationActionController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/moderationDecorator.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/trustBootstrap.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/videoEventUtils.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnetShared.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/toolkit.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/cachePolicies.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/profileCache.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /vendor/crypto-helpers.bundle.min.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/syncMetadataStore.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmSignalEvents.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/countDiagnostics.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/maxListenerDiagnostics.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/publishHelpers.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip04WorkerClient.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmDecryptWorkerClient.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/dmDecryptDiagnostics.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/lruCache.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/dmDb.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/dmNostrService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/sessionActor.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/signerHelpers.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nip07Adapter.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nsecAdapter.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/adapters/nip46Adapter.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /config/instance-config.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/viewEventBindings.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/adminListStore.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/webtorrent.min.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/safeDecode.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/dom/cardObserver.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/magnets.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/storage.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/engine.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/stages.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/exploreScoring.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/kidsScoring.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/kidsAudienceFilterStage.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/sorters.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/sources.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/watchHistoryFeed.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/applicationContext.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/r2.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/r2-mgmt.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/r2-s3.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/s3-multipart.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/storage/s3-client.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/storageService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nip07.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nip46.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/nsec.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authProviders/generate.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/views/VideoListView.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/nostrService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem/metrics.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/overlay/overlayRoot.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /vendor/floating-ui.dom.bundle.min.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostr/nip46Queue.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/VideoCard.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moderationUiHelpers.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moderationCopy.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapSharedState.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapNotifications.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/lnurl.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/platformAddress.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/nwcClient.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/FeedInfoPopover.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapReceiptValidator.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/platformFee.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 7 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/modalAccessibility.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/tagPreferenceMenu.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/qrcode.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/state/profileSettingsStore.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/mediaLoader.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/historyView.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/watchHistoryController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/watchHistoryTelemetry.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/playbackService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/authService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/discussionCountService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/commentThreadService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/exploreDataService.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/nwcSettingsService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/relayHealthService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/profileIdentityController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/videoListViewController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/profileModalController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/moreMenuController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 8 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/appChromeController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/ModalManager.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/feedEngine/utils.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/hashtagStripHelper.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/designSystem/dynamicStyles.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 10 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/attachments/attachmentUtils.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/directMessagesStore.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/dmNotificationManager.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/payments/zapMessages.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nostrWatchHistoryFacade.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/nwcSettings.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/tagPillList.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/VideoModal.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/RevertModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/ShareNostrModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EmbedVideoModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EmbedPlayerModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initUploadModal.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 12 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 14 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 14 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initEditModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/initDeleteModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/EventDetailsModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/zapController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/index.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/s3Service.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 9 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/attachmentService.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/utils/linkPreviewSettings.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 1 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/nip71FormManager.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/UploadModal.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/ambientBackground.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/commentsController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/reactionsController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/similarContentController.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/moderationController.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/video-modal/utils/commentAvatar.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/components/SimilarContentCard.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/services/linkPreviewService.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/AppShell.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/Avatar.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/ContactRow.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/ConversationList.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/MessageThread.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/MessageBubble.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/Composer.js
HTTP 1/24/2026 10:39:04 PM ::1 GET /js/ui/dm/NotificationCenter.js
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:04 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/DayDivider.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/ZapReceiptList.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/zapHelpers.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/components/EditModal.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/components/DeleteModal.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/storage/s3-url.js
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 5 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 6 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/utils/torrentHash.js
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/DMPrivacySettings.js
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 4 ms
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 2 ms
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/ui/dm/ZapInterface.js
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 3 ms
HTTP 1/24/2026 10:39:05 PM ::1 GET /js/payments/zapRequests.js
HTTP 1/24/2026 10:39:05 PM ::1 Returned 200 in 2 ms
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+43
View File
@@ -0,0 +1,43 @@
from playwright.sync_api import sync_playwright
import time
def verify_embed_overlay():
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
# Inject disclaimer bypass
context.add_init_script("localStorage.setItem('hasSeenDisclaimer', 'true');")
page = context.new_page()
# Go to embed page
# Note: We don't have a valid pointer, so video won't load, but UI should be there.
page.goto("http://localhost:3000/embed.html")
# Wait for page load
time.sleep(2)
# Force hover on the container to show overlay
container = page.locator("#embedRoot section")
container.hover()
# Wait for transition
time.sleep(1)
# Check elements visibility
overlay = page.locator("#embedOverlay")
watch_btn = page.locator("#embedWatchButton")
stats = page.locator("#embedViewCount")
print(f"Overlay visible: {overlay.is_visible()}")
print(f"Watch button visible: {watch_btn.is_visible()}")
print(f"Stats visible: {stats.is_visible()}")
# Screenshot
page.screenshot(path="verification/embed_verification.png")
browser.close()
if __name__ == "__main__":
verify_embed_overlay()