diff --git a/js/embed.js b/js/embed.js index 89d94309..945f3170 100644 --- a/js/embed.js +++ b/js/embed.js @@ -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"); diff --git a/js/ui/components/EmbedPlayerModal.js b/js/ui/components/EmbedPlayerModal.js index 291d3fc1..ace36178 100644 --- a/js/ui/components/EmbedPlayerModal.js +++ b/js/ui/components/EmbedPlayerModal.js @@ -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. + } } diff --git a/serve.log b/serve.log new file mode 100644 index 00000000..8c0e8577 --- /dev/null +++ b/serve.log @@ -0,0 +1,452 @@ +npm warn exec The following package was not found and will be installed: serve@14.2.5 + 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 diff --git a/verification/embed_verification.png b/verification/embed_verification.png new file mode 100644 index 00000000..bab740d8 Binary files /dev/null and b/verification/embed_verification.png differ diff --git a/verification/verify_embed.py b/verification/verify_embed.py new file mode 100644 index 00000000..05e35539 --- /dev/null +++ b/verification/verify_embed.py @@ -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()