Adds OAuth 2.0 flow to connect a YouTube account and sync liked
videos as "like" posts on the blog. Includes:
- OAuth authorize/callback/disconnect flow with token persistence
- getLikedVideos() method using videos.list?myRating=like
- Background periodic sync + manual sync trigger
- Dashboard UI for connection status and sync controls
- Public JSON API for querying synced likes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract 177 lines inline CSS to assets/styles.css
- Create intermediate layout (views/layouts/youtube.njk)
- Use section() macro for dashboard sections
- Rename CSS prefix from yt-* to youtube-*
- Replace inline style for LIVE duration badge with CSS class
- Use upstream CSS custom properties without fallbacks
- Keep animation CSS (@keyframes youtube-pulse)
- Add assets to package.json files array
- Bump version to 1.2.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Dashboard now fetches and displays all configured channels
- Each channel shows its own header, live status, and videos
- Channels are separated by visual dividers
- Backward compatible with single-channel config
- Version bump to 1.2.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Indiekit backend UI was broken when using channels array
because the dashboard controller only checked for channelId/channelHandle.
Now uses getPrimaryChannel() helper to extract the first channel
from either single-channel or multi-channel configuration.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- Display latest videos from any YouTube channel
- Live streaming status with animated badge
- Upcoming stream detection
- Admin dashboard with video grid
- Public JSON API for Eleventy integration
- Quota-efficient API usage (playlist method)
- Smart caching (5min videos, 1min live status)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>