Commit Graph

50 Commits

Author SHA1 Message Date
Jeff Emmett c9cd56b452 feat: add World Radio page with 3D globe + Radio Garden integration
- New /radio page with interactive Three.js globe showing 30K+ radio stations worldwide
- Radio Garden API proxy routes (places, channels, stream resolver, search) with caching
- Extended Track type to MusicTrack | RadioTrack discriminated union
- MusicProvider handles radio streams (skip IndexedDB/precache, direct stream URL)
- Mini-player and full-screen player show LIVE badge, hide seek/download/lyrics for radio
- Shared globe component reused on /request-channel page (Search/Globe tab toggle)
- Homepage gets rose "Listen to Radio" button with Waves icon
- react-globe.gl for efficient rendering of 40K+ geo-points

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 16:48:01 -04:00
Jeff Emmett b56f8c4030 fix(ci): use SSH-based container status check for smoke test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 15:05:15 -07:00
Jeff Emmett d6d47410c7 ci: use internal registry (bypass Cloudflare upload limit)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 10:44:37 -07:00
Jeff Emmett 9335c0a4ce CI: fix smoke test to follow redirects and accept 2xx/3xx
CI/CD / deploy (push) Successful in 1m8s Details
Also increases sleep to 15s and timeout to 30s for slower containers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 09:53:23 -07:00
Jeff Emmett 7be3c75d79 Update copyright year to 2026
CI/CD / deploy (push) Failing after 1m8s Details
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 09:49:45 -07:00
Jeff Emmett 524eb4bbbb Add CI/CD pipeline (Gitea Actions)
CI/CD / deploy (push) Failing after 1m7s Details
Build + push to registry + deploy + smoke test with auto-rollback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-01 02:14:00 -07:00
Jeff Emmett c2af4327aa feat: add all to queue — show "Add All to Queue" when a song is playing
Replace "Play All" with "Add All to Queue" button on offline page when
a song is already playing, so it doesn't interrupt playback. Adds
ADD_ALL_TO_QUEUE batch action to music provider.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:37:30 -07:00
Jeff Emmett 02278f4cf8 feat: shuffle mode, queue-next fix, song switch confirmation, playlist dedup
- Add shuffle toggle to mini-player and full-screen player (Fisher-Yates
  shuffle of upcoming queue items, restores original order on toggle off)
- Fix ADD_TO_QUEUE to insert after current track instead of appending to end
- Add confirmation dialog ("Switch song, DJ Cutoff?") when clicking a
  different song while one is playing
- Dedup playlist songs by title+artist (keeps first occurrence)
- Make artist name clickable in full-screen player (navigates to search)
- Music page reads ?q= param to pre-fill search from artist links
- Add pre-cache module for upcoming tracks

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 21:03:34 -07:00
Jeff Emmett 4694db4f95 feat: queue view — view, rearrange, and manage playback queue
Adds full-screen queue panel with drag-and-drop reordering, remove,
jump-to, clear upcoming, and add-songs navigation. Accessible from
both the mini player bar and full-screen player actions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 20:25:56 -07:00
Jeff Emmett 345fbca1a9 fix: remove music.jefflix.lol from jefflix-website Traefik rule
music.jefflix.lol should route to the soulsync-player container,
not jefflix-website. Both containers were claiming the domain,
causing jefflix-website to win the Traefik routing conflict.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:26:00 -07:00
Jeff Emmett f5dcc3c804 fix: rewrite music.jefflix.lol root instead of redirect
Use NextResponse.rewrite so the URL stays as music.jefflix.lol/
instead of redirecting to music.jefflix.lol/music.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:21:36 -07:00
Jeff Emmett 47d7565d04 feat: synced scrolling lyrics + playlist offline download
- Fetch timed LRC lyrics from LRCLIB API (Navidrome fallback for plain text)
- Synced lyrics component with auto-scroll, active line highlighting, and tap-to-seek
- Past lines fade out, current line enlarges — Spotify-style karaoke experience
- Add "Download All" button on expanded playlists for bulk offline download
- Button shows green checkmark when all songs already downloaded

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:17:51 -07:00
Jeff Emmett c24962f829 feat: search dedup, MusicBrainz discovery, swipe-to-queue, audio output selector
- Deduplicate Navidrome search results by title+artist (keep highest bitRate)
- Deduplicate Soulseek results by filename across peers (show peer count badge)
- Add MusicBrainz fuzzy search with one-tap Soulseek auto-download
- Add swipe-right-to-queue gesture on mobile song rows
- Add audio output device selector (phone/Bluetooth) in full-screen player
- Include offline mode, download button, and service worker from prior work

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 19:06:28 -07:00
Jeff Emmett 0f76ce3cd7 feat: make update banner more prominent with header and one-click button
Redesigned the PWA update notification from a thin bar to a bold,
animated banner with gradient background, pulsing download icon,
"Update Available" header, and a large "Update Now" pill button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 12:20:02 -07:00
Jeff Emmett b86e7e7a1a fix: exclude /api/version from auth middleware
The update banner needs to reach /api/version without the
jefflix-access cookie, otherwise it gets redirected to /gate.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:41:47 -07:00
Jeff Emmett b122d00be3 feat: add "tap to update" banner when new version is deployed
Polls /api/version every 60s and on tab focus. When the server's
build ID differs from the one loaded at page init, a fixed purple
banner appears at the top of the screen prompting the user to reload.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 23:35:02 -07:00
Jeff Emmett 1bdb5e50ef feat: add playlist browsing with cover art on music page
Playlists now display as expandable cards with cover art thumbnails
on the /music page when no search is active. Tapping a playlist
reveals its songs with cover art via the SongRow component.
Also added GET handler for /api/music/playlist/[id] and
improved playlist-picker dialog with cover art.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 21:16:12 -07:00
Jeff Emmett a54e003196 feat: inject Navidrome/slskd/Threadfin secrets from Infisical
Replace hardcoded env vars with Infisical entrypoint wrapper that
fetches TOKEN_SECRET, THREADFIN_*, NAVIDROME_*, and SLSKD_* from
the claude-ops/media secret path at container startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 21:00:25 -07:00
Jeff Emmett b9551d7597 feat: add integrated music player with Navidrome + Soulseek support
Search and play music from the Navidrome library with a persistent mini
player, full-screen drawer with lyrics/playlists, and Soulseek P2P
fallback for discovering new tracks. All streaming proxied through
server-side API routes to keep credentials hidden.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:35:13 -07:00
Jeff Emmett 07e64e0627 fix: update pnpm-lock.yaml with ws dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:22:25 -07:00
Jeff Emmett 8c79b97ef7 feat: add one-click channel approval via email
Replace manual Threadfin lookup instructions with a signed approve
button in admin notification emails. Clicking it activates channels
in Threadfin via WebSocket API and sends a confirmation email to
the requester.

- Add /api/approve-channels endpoint with HMAC-signed tokens
- Add lib/threadfin.ts for WebSocket-based channel activation
- Add lib/token.ts for signed token creation/verification
- Add ws dependency for Threadfin WebSocket communication
- Update docker-compose with TOKEN_SECRET and THREADFIN_* env vars

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 12:15:10 -07:00
Jeff Emmett cee87aef10 feat: replace request channel form with iptv-org search & select UI
Users now browse the iptv-org catalog instead of manually typing channel
names. Adds /api/channels proxy with 1-hour cache, debounced search,
click-to-select with chips, and updated admin email format.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 18:21:36 -07:00
Jeff Emmett 709a87731c feat: add Request a Channel page, API route, and homepage buttons
Add channel request form (/request-channel) that emails admin with
channel details via nodemailer. Adds cyan "Request a Channel" button
to both hero and CTA sections of the homepage alongside Live TV and
Music buttons. Rename Traefik router to avoid conflicts with media stack.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-22 17:02:26 -07:00
Jeff Emmett 717eed7100 fix: remove @vercel/analytics import (package already removed)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:11:18 -07:00
Jeff Emmett 2673a247bc fix: update lockfile after @vercel/analytics removal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:10:04 -07:00
Jeff Emmett 228f3c6658 feat: replace Tailscale VPN gate with simple access code
Remove the vpn-setup/ directory (Headscale/Tailscale scripts, CoreDNS,
onboarding) and add a lightweight access code gate instead. Visitors
must enter a code to view the site — validated via API route with an
httpOnly cookie persisted for 1 year.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 14:07:22 -07:00
Jeff Emmett 9ea2a0ff9f chore: add backlog-notify onStatusChange hook
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 15:30:56 -07:00
Jeff Emmett 2c8614e01e feat: revamp Jefflix buttons, simplify onboarding, add backlog tasks
Replace Movies/Shows/Music/Live Sports buttons with Request/Watch/Upload
flow. Update request-access page with clear requests.jefflix.lol and
movies.jefflix.lol instructions plus install-as-app tips. Clean up
README, remove @vercel/analytics, add backlog tasks and vpn-setup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 22:39:48 -07:00
Jeff Emmett b43a72a080 Add Docker healthcheck to docker-compose.yml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 18:00:28 -07:00
Jeff Emmett 547431e9db chore: migrate SMTP from mx.jeffemmett.com to mail.rmail.online
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 20:15:36 +00:00
Jeff Emmett 99f9f0d681 fix: allow self-signed cert for Mailcow SMTP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:54:36 +00:00
Jeff Emmett f550fe0423 chore: update pnpm lockfile for nodemailer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:53:05 +00:00
Jeff Emmett 3a2604ea2e feat: switch email from Resend to Mailcow SMTP
Resend required domain verification that wasn't set up. Switch to
self-hosted Mailcow (mx.jeffemmett.com) using nodemailer for SMTP,
matching the pattern used by other projects (cosmolocal, etc).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 01:52:34 +00:00
Jeff Emmett a99d51c831 Add deployment scaffolding (Dockerfile, docker-compose, nginx)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 14:14:30 +01:00
Jeff Emmett 95ac4129b3 feat: add JFA-Go and SoulSync docker-compose configs
- jfa-go-docker-compose.yml: Jellyfin account invitation system (invite.jefflix.lol)
- soulsync-docker-compose.yml: Spotify/Tidal to Soulseek music sync
- tsconfig.json: formatting updates and jsx mode fix
- package-lock.json: lock dependencies

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 23:37:02 +00:00
Jeff Emmett 38dc171af7 feat: add backlog with Eleza TV task (due Fri) for reminder system test
- Initialize backlog.md for jefflix-website
- Add high-priority task for Eleza TV IPTV integration
- Set due_date to 2026-02-06 (Friday) to test reminder system

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 22:05:41 +00:00
Jeff Emmett 279bd30c72 feat: add Live Sports button and user access request system
- Add Live Sports button linking to Jellyfin Live TV section
- Create /request-access page for users to request account access
- Add API endpoint that sends email notifications via Resend
- Add environment variables for RESEND_API_KEY and ADMIN_EMAIL
- Add .gitignore to exclude build artifacts and node_modules

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 11:26:31 +00:00
Jeff Emmett 1821194648 feat: add /invite redirect to invite.jefflix.lol
Redirects jefflix.lol/invite to the Wizarr invite system at invite.jefflix.lol

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 03:12:08 +01:00
Jeff Emmett f66e6d7434 fix: update Shows link to point to movies.jefflix.lol
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-10 17:04:39 +00:00
Jeff Emmett 22f0ab2fe6 feat: add backlog task for Spotify API configuration in SoulSync
SoulSync is deployed with slskd (Soulseek) and Navidrome connected.
Spotify integration pending developer dashboard access.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 10:07:15 +01:00
Jeff Emmett 7a01ea37c2 feat: replace favicon with ROFL laughing emoji 🤣
- Updated icon.svg to use 🤣 emoji
- Added generate-favicon.mjs script for PNG generation
- Added canvas dependency for favicon generation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 23:18:04 -05:00
Jeff Emmett 73988e6378 Add Open Graph and Twitter Card metadata for social sharing
- Add og-image.jpg (1200x630) for link previews
- Add metadataBase, openGraph, and twitter metadata to layout.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-22 22:11:51 +01:00
Jeff Emmett 92bb2c3d9a feat: update server URLs to jefflix.lol domain
Change media server links from jeffemmett.com to jefflix.lol subdomains:
- movies.jefflix.lol for movies
- shows.jefflix.lol for TV shows
- music.jefflix.lol for music

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-20 12:24:21 -05:00
Jeff Emmett 737de72645 feat: add 'Redirect Your Subscriptions' section
Adds new section before footer encouraging users to support real artists
instead of extractive corporate gatekeepers:
- Filmworkers Unions (strike funds, worker cooperatives)
- Local Arts Funds (theaters, galleries, indie creators)
- Direct to Artists (Patreon, Bandcamp, Ko-fi)

Includes callout with streaming cost breakdown ($180/year to corporations)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-19 16:54:38 -05:00
Jeff Emmett 2852ad78f5 Remove personal photos from website
- Remove jeff-tea.jpg, jeff-blueberries.jpg, jeff-donkey.jpg
- Update page.tsx to remove Image components referencing these photos
- Remove unused next/image import

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 18:02:07 -05:00
Jeff Emmett 7a5281ef4d Add Docker configuration for production deployment
- Add Dockerfile with multi-stage build for Next.js standalone
- Add docker-compose.yml with Traefik labels for jefflix.lol
- Enable standalone output in next.config.mjs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 17:23:51 -08:00
v0 7e12d50cb7 feat: add custom solidarity fist icon component
Replace generic hand icon with new custom design in key section.

#VERCEL_SKIP

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
2025-12-02 20:36:04 +00:00
v0 f3a5a61aaf feat: color-code navigation buttons
Assign red to Movies, blue to Shows, and green to Music.

#VERCEL_SKIP

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
2025-12-02 20:18:11 +00:00
v0 6ba17a7828 revert v9 to v8 and restore images and components
#VERCEL_SKIP

Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
2025-11-28 07:03:56 +00:00
v0 980ec86afe Initialized repository for chat Jefflix website
Co-authored-by: Jeff Emmett <46964190+Jeff-Emmett@users.noreply.github.com>
2025-11-28 02:08:25 +00:00