The `content` property caused the video to render twice: once from
the markdown body and once from the `likeOf` frontmatter in the
Eleventy template. Likes now rely solely on `like-of` + `name`.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Previously sync only inserted into MongoDB, causing "file not found" errors
when Indiekit tried to read the post. Now generates markdown via
publication.postTemplate() and writes to GitHub via publication.store.createFile(),
matching the micropub endpoint's create flow. Reset also deletes store files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Content is now "Title - Author" instead of "Liked X by Y on YouTube".
Posts are created with post-status: draft so they can be reviewed
before publishing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
POST /likes/reset deletes all YouTube like posts from the posts
collection, clears the youtubeLikesSeen set, and removes the
baseline and sync metadata. Next sync will re-baseline.
Button is tucked inside a <details> disclosure to prevent
accidental clicks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Controller passes baseline status, seen count, recent like posts,
total count, and flash messages from query params
- View uses Indiekit UI components (section, summary, prose, button,
notificationBanner) for consistent look
- Recent likes list with thumbnails, titles, channel names
- Connection badge (connected/disconnected), sync controls
- Overview stats: seen videos, like posts, baseline status, last sync
- CSS for likes dashboard components
- Updated en/de locale strings with flash messages and new labels
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
First sync snapshots all current liked video IDs into a
youtubeLikesSeen collection without creating posts. Subsequent
syncs only create posts for likes not in the seen set.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- 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>