Commit Graph
1233 Commits
Author SHA1 Message Date
thePR0M3TH3AN ebd825fb37 Add webseed-only status to WebTorrent probes 2026-01-15 09:37:25 -05:00
thePR0M3TH3AN a01f1adea9 Adjust WebTorrent probe health detection 2026-01-15 09:27:47 -05:00
google-labs-jules[bot] 4e840c6159 feat: improve magnet link reliability with webseeds
- Update `UploadModal.js` to pre-calculate R2 keys and public URLs before upload.
- Update `torrentHash.js` to embed the calculated video URL as a webseed (`url-list`) in the `.torrent` file.
- Update `r2Service.js` to accept forced keys/URLs and append `&xs=` (pointing to the .torrent file) to the magnet link.
- Ensures magnet links work for peerless downloads via WebSeed (BEP19) and HTTP Seeding (BEP17).
2026-01-15 13:26:27 +00:00
thePR0M3TH3AN a3374f0569 Guard upload when info hash is unavailable 2026-01-14 21:38:27 -05:00
thePR0M3TH3AN f52da2581b Merge pull request #1230 from PR0M3TH3AN/codex/add-torrent-file-generation-and-upload
Upload .torrent metadata to R2 and publish xs hint for video posts
2026-01-14 21:31:43 -05:00
thePR0M3TH3AN 6262a3cb37 Add torrent metadata upload for R2 videos 2026-01-14 21:28:57 -05:00
google-labs-jules[bot] 4639a572fe fix: prevent hashtag preferences reset on empty or stale relay responses
This commit updates `HashtagPreferencesService.load` to handle transient empty responses from relays more robustly.
- It prevents `reset()` if `wasLoadedForUser` is true and the fetch returns empty, ensuring existing data isn't wiped during connectivity issues or relay switches.
- It adds a staleness check to ignore incoming events that are older than the currently loaded data, protecting against out-of-sync relays returning obsolete preferences.

This addresses the issue where hashtag interests would disappear ("turn gray") or revert to older states shortly after login when video grid filters were applied.
2026-01-15 02:21:57 +00:00
thePR0M3TH3AN a5d0d03ac6 Merge pull request #1228 from PR0M3TH3AN/r2-imeta-fix-13043697172182060536
fix: ensure infohash is included in r2 upload imeta tags
2026-01-14 21:05:32 -05:00
google-labs-jules[bot] 657ee40eb5 fix(r2): inject infohash into nip-71 imeta tags for webtorrent bootstrapping 2026-01-15 02:04:14 +00:00
thePR0M3TH3AN a52aed0a5d Fix event details channel navigation 2026-01-14 20:58:01 -05:00
thePR0M3TH3AN ae62b4ea59 Normalize profile pubkey inputs 2026-01-14 20:32:30 -05:00
thePR0M3TH3AN 5c2d7133e6 Handle npub inputs in goToProfile 2026-01-14 20:28:12 -05:00
google-labs-jules[bot] 48ceed6797 fix(hashtagPreferences): prevent state reset on transient load failures
Prevents `HashtagPreferencesService` from aggressively resetting local state to empty when a load attempt fails due to transient issues (like empty relay lists or network errors) if valid data is already loaded for the current user. This fixes a race condition where tags would briefly load correctly and then turn gray/disappear during application initialization.
2026-01-15 01:23:55 +00:00
google-labs-jules[bot] 7dc60c36ef Add playback source toggle (CDN/P2P) to video modal
- Added toggle buttons and stat counters to `video-modal.html`.
- Updated `VideoModal.js` to manage toggle visibility (show if either source exists, disable unavailable option) and dispatch `playback:switch-source` events.
- Updated `app.js` to handle source switching by restarting playback with a `forcedSource`.
- Updated `playbackService.js` to respect `forcedSource` by bypassing probe logic when a specific source is requested.
2026-01-15 01:06:56 +00:00
google-labs-jules[bot] 6c3ac4d49f Implement video source toggle (CDN vs P2P)
- Added source toggle UI in `components/video-modal.html`.
- Updated `VideoModal.js` to manage toggle visibility (only when both URL and Magnet exist), update peer/server counts, and dispatch `playback:switch-source` events.
- Updated `PlaybackService.js` to support a `forcedSource` option, allowing bypassing of the URL probe when "torrent" is forced.
- Updated `app.js` to listen for the toggle event and re-initialize playback with the forced source preference.
- Updated `tests/ui/helpers/jsdom-test-helpers.mjs` to expose necessary globals for JSDOM testing.
- Verified functionality with targeted updates and existing unit tests.
2026-01-14 21:18:46 +00:00
google-labs-jules[bot] 71a9eaf288 feat: add event details modal with edit history navigation
- Added `EventDetailsModal` to display raw JSON and metadata.
- Implemented `open-channel` action to navigate to creator profile.
- Fixed profile image loading by checking `creatorPicture` and `creator.picture`.
- Added `hideModal()` to `Application` class to fix crash in `openCreatorChannel`.
- Wired up "Event Details" menu option in video card menu.
- Ensured edit history is sorted Newest First for navigation.
2026-01-14 20:55:29 +00:00
google-labs-jules[bot] 6794a54fba Fix View Channel button functionality and styling in EventDetailsModal 2026-01-14 20:42:36 +00:00
google-labs-jules[bot] f1d74894f2 Fix View Channel button functionality and styling in EventDetailsModal 2026-01-14 20:28:26 +00:00
google-labs-jules[bot] 1c7daff733 Update Event Details Modal to use hydrateVideoHistory and improved layout 2026-01-14 19:54:38 +00:00
google-labs-jules[bot] 9a6efdc1b6 Add Event Details modal to video card menu 2026-01-14 19:47:23 +00:00
google-labs-jules[bot] 4b5a46c5bd Add Event Details modal to video card menu 2026-01-14 19:29:32 +00:00
google-labs-jules[bot] 7b9781a3dd feat: enhance playback service logging to debug R2 404 issues 2026-01-14 17:56:11 +00:00
google-labs-jules[bot] 175a6f73b4 fix(webtorrent): support webseeds in health checks
Updated `probePeers` in `js/webtorrent.js` to detect `ws` (WebSeed) parameters in magnet links. If a web seed is present, the torrent is now considered "healthy" with at least one peer, even if tracker probing fails or returns zero peers. This ensures videos hosted on R2 (or other HTTP sources) are correctly marked as available in the UI.
2026-01-14 17:37:50 +00:00
google-labs-jules[bot] 0a79108c05 fix(r2): validate baseDomain to reject S3 API endpoints
Updated `r2Service.js` to detect if the user inputs an S3 API endpoint (e.g. `*.r2.cloudflarestorage.com`) as the Public Bucket URL. If detected, it prevents saving and displays a clear error message instructing the user to use the correct public domain (e.g. `*.r2.dev`). This prevents CORS errors and confusion caused by using the wrong endpoint type.
2026-01-14 17:19:14 +00:00
google-labs-jules[bot] fe1b6d0ae2 fix(storage): fix R2 setup issues (CORS, polyfills, headers)
- Switched to `esm.sh` bundle for `@aws-sdk/client-s3` to fix browser compatibility and `fs.readFile` errors.
- Removed `cf-create-bucket-if-missing` header from `multipartUpload` to prevent 403 Forbidden/CORS failures with standard API tokens.
- Refactored `verifyPublicAccess` to attempt CORS setup even if bucket check fails, and added specific error messaging for CORS issues.
- Updated documentation to include `POST` and `HEAD` in the recommended R2 CORS policy.
2026-01-14 17:11:04 +00:00
google-labs-jules[bot] 2758081a2f fix(storage): prevent r2 upload failure by removing restricted header
Removed the `cf-create-bucket-if-missing` header from the multipart upload request in `js/storage/r2-s3.js`. This header triggers a 403 Forbidden error (and subsequent "Failed to fetch" due to CORS behavior) when using R2 API tokens with limited "Object Read & Write" permissions, as it requires bucket creation privileges. Bucket existence is now handled separately.
2026-01-14 16:55:25 +00:00
google-labs-jules[bot] 8097f64ba8 fix(storage): handle R2 CORS errors & use bundled aws-sdk
1.  **Refactor R2 Verification**: Separated bucket existence checks from CORS configuration in `r2Service.js`. Previously, if `HeadBucket` failed (e.g., due to CORS restrictions), the CORS configuration step was skipped. Now, CORS setup is attempted independently, increasing the chance of successful auto-configuration.
2.  **Improve Error Messaging**: Enhanced error handling in `verifyPublicAccess` to detect "Failed to fetch" errors and explicitly suggest checking Cloudflare R2 CORS settings in the UI.
3.  **Fix AWS SDK Import**: Consolidated the AWS SDK import fix to use the `?bundle` version from `esm.sh` in `r2-s3.js`. This prevents `fs.readFile` runtime errors by ensuring a browser-compatible build is loaded.
2026-01-14 16:36:25 +00:00
google-labs-jules[bot] 857536c28f fix(storage): use esm.sh bundled aws-sdk to prevent fs error
Switched the CDN provider for the AWS SDK (R2 client) to the bundled version from `esm.sh` (`?bundle`). This resolves a runtime error `[unenv] fs.readFile is not implemented yet!` which occurred because the previous build was attempting to import Node.js-specific credential providers that rely on the filesystem.

The bundled version from `esm.sh` correctly resolves the browser entry points and provides browser-compatible polyfills (or safe defaults) for dependencies, ensuring the SDK initializes correctly in the client environment.

This change updates the `AWS_SDK_SPECIFIER` constant in `js/storage/r2-s3.js`.
2026-01-14 16:11:20 +00:00
google-labs-jules[bot] 4aa0021029 fix(storage): replace jsdelivr with esm.sh for aws-sdk
Switched the CDN provider for the AWS SDK (R2 client) from `jsdelivr` to `esm.sh` to resolve a runtime dependency error ("does not provide an export named 'blobHasher'"). This error was caused by a broken bundling of the transitive dependency `@smithy/hash-blob-browser` on `jsdelivr`.

This change updates the `AWS_SDK_SPECIFIER` constant in `js/storage/r2-s3.js`.
2026-01-14 15:48:30 +00:00
google-labs-jules[bot] 4bf3605fd2 Fix: Ensure history pane refreshes on subsequent visits
This change ensures that the profile history pane refreshes its content when the user navigates back to it, addressing a bug where stale data could be displayed.

It implements an optimized strategy:
- On the first load, `ensureInitialLoad` is called, which handles the initial fetch internally.
- On subsequent visits (when the renderer is already initialized), `refresh({ force: true })` is called explicitly to update the list.

The unit test `history pane lazily initializes the watch history renderer` was updated to reflect this behavior, verifying that `ensureInitialLoad` is called once and `refresh` is called on subsequent opens.
2026-01-14 04:05:23 +00:00
google-labs-jules[bot] f3075b8929 Fix unit tests for comment events and improve target normalization logic
- Updated `subscribeVideoComments` test to expect `#A` filter keys (uppercase), matching the implementation and other tests.
- Improved `normalizeCommentTarget` in `js/nostr/commentEvents.js` to correctly derive `parentKind` and `parentAuthorPubkey` from the `parentCommentEvent` object if available.
- Enhanced `parentAuthorRelay` resolution to look up the specific `p` tag for the author pubkey instead of defaulting to the first found `p` tag.
- Updated `publishComment` test expectations to remove duplicate tags (implementation correctly deduplicates) and reflect improved metadata derivation (correct `K` tag and `P` relay).
- Added async wait to `subscribeVideoComments` test to prevent race condition in unsubscribe assertion.
2026-01-14 03:22:25 +00:00
thePR0M3TH3AN 06c3d9a978 Add breakpoint token helpers for media queries 2026-01-13 21:26:53 -05:00
thePR0M3TH3AN b48edbb055 Refactor inline styles to CSS rules 2026-01-13 21:13:32 -05:00
thePR0M3TH3AN a697a1de5f Refactor iframe theme accent sync 2026-01-13 20:48:05 -05:00
thePR0M3TH3AN 4c4f57c6e5 Replace inline styles with classes 2026-01-13 20:29:38 -05:00
thePR0M3TH3AN 5ba24a4cb6 Fix watch history storage persistence 2026-01-13 18:34:26 -05:00
thePR0M3TH3AN 602207fbee Merge pull request #1203 from PR0M3TH3AN/fix-ci-env-lint-tests-7993553949094506329
Fix CI, Env, and Unit Tests
2026-01-13 15:35:05 -05:00
google-labs-jules[bot] d6882fb5bb Fix CI, environment, linting, and unit test issues
- Fix circular dependency in `js/adminListStore.js` by importing from `js/nostrClientRegistry.js`.
- Update `js/services/hashtagPreferencesService.js` to include legacy kind 30005 in filters.
- Fix JSDOM mocking in `tests/modal-accessibility.test.mjs` (navigator getter) and `UploadModal` selectors.
- Add `getRoot()` to `js/ui/components/UploadModal.js` for API consistency.
- Update `tests/magnet-utils.test.mjs` expectations to reflect removed default tracker.
- Mock `ensureActiveSignerForPubkey` in `tests/moderation/submit-report.test.mjs`.
- Fix mock loader path in `tests/moderation/trust-seeds.test.mjs` to target `trustBootstrap.js`.
- Fix duplicate pointer tags in `js/nostrEventSchemas.js`'s `buildCommentEvent`.
- Update `tests/nostr/comment-events.test.mjs` and `tests/comment-event-builder.test.mjs` to match current code behavior (legacy kinds, unique tags).
2026-01-13 20:32:06 +00:00
google-labs-jules[bot] d3008d0bbe Fix: Sidebar 'Subscriptions' link remains hidden for logged-in users
The `resolveSubscriptionsLink` method in `js/app.js` cached the sidebar DOM element (`this.subscriptionsLink`) during initialization. However, the sidebar is re-rendered dynamically, causing the cached reference to point to a detached DOM node. Consequently, `applyAuthenticatedUiState` would update the visibility of the detached element, leaving the visible sidebar unchanged.

This fix updates `resolveSubscriptionsLink` to check `this.subscriptionsLink.isConnected`. If the cached element is detached, it re-queries the DOM to retrieve the current live element, ensuring visibility updates apply correctly.

Additionally, `js/index.js` now awaits `applicationReadyPromise` before hydrating the sidebar, preventing race conditions during startup. `js/nostr/toolkit.js` was updated to support function-based subscription closers, fixing potential leaks.
2026-01-13 16:58:45 +00:00
google-labs-jules[bot] eb8b3c70dd Fix subscriptions loading issues and sidebar link visibility race condition.
- Updated `shimLegacySimplePoolMethods` in `js/nostr/toolkit.js` to correctly handle `nostr-tools` v2 subscription closers (which are functions) in `unsub`. This prevents subscription leaks that were causing relays to reject new requests, leading to empty subscription lists.
- Updated `bootstrapInterface` in `js/index.js` to await `applicationReadyPromise` before attempting to hydrate the sidebar navigation. This fixes a race condition where the sidebar "Subscriptions" link would remain hidden because the application auth state wasn't fully initialized when the sidebar was rendered.
2026-01-13 15:25:03 +00:00
thePR0M3TH3AN 778b35874d Merge pull request #1201 from PR0M3TH3AN/fix-slow-loading-video-grid-7505675586453320961
Unblock video grid loading by backgrounding access control checks
2026-01-13 09:50:29 -05:00
google-labs-jules[bot] bdc86aaef6 Fix future timestamp bug and improve loading spinner UX 2026-01-13 14:48:56 +00:00
google-labs-jules[bot] 81e8b2ed40 Refine Video Modal moderation UI styles: blur creator avatar and fix text contrast. 2026-01-13 14:28:42 +00:00
google-labs-jules[bot] 14d7423e29 Remove blocking access control checks to fix slow initial video loading 2026-01-13 14:25:22 +00:00
google-labs-jules[bot] 0772d2fa09 Refactor Video Modal moderation UI to a persistent bar above the player. 2026-01-13 14:12:14 +00:00
thePR0M3TH3AN efb42e93db Merge pull request #1198 from PR0M3TH3AN/stale-while-revalidate-moderation-13578942910948659410
feat: implement stale-while-revalidate for moderation lists
2026-01-13 08:53:18 -05:00
google-labs-jules[bot] ef34d3cf02 Optimize startup by non-blocking moderation and relay init 2026-01-13 13:36:49 +00:00
google-labs-jules[bot] e77418f0a8 feat: overlay moderation badge on blurred video thumbnails
Moves the moderation warning badge ("Content blocked...") to overlay the blurred thumbnail image instead of sitting below it or increasing card height. This logic is applied to both the main `VideoCard` and the `SimilarContentCard` to ensure layout consistency.

Changes:
- VideoCard.js: Refactor `updateModerationBadge` to append the badge container as a child of the `anchorEl` (thumbnail wrapper) with absolute positioning.
- SimilarContentCard.js: Implement `refreshModerationUi` logic to generate and overlay a simplified moderation badge on the thumbnail when `trustedMuted` context is present.
- Fix tests/moderation/video-card.test.mjs: Patch test environment to mock `globalThis.navigator`.
2026-01-13 04:29:36 +00:00
google-labs-jules[bot] 29857dc36c Optimize application startup speed by parallelizing initialization 2026-01-13 04:21:13 +00:00
google-labs-jules[bot] fb15ff3eb0 Update Similar Content Card to match Video Card layout.
- Remove view count and separator from the metadata row in `SimilarContentCard.js`.
- Add new `buildEngagementSection` method to render view count and discussion count in a dedicated footer.
- Use Eye and Message SVG icons for engagement metrics.
- Ensure visual consistency with the main Video Card component.
- Fix import and definition of `SVG_NAMESPACE` to support icon creation.
2026-01-12 21:21:11 +00:00