mirror of
https://github.com/svemagie/indiekit-endpoint-youtube.git
synced 2026-04-02 15:54:59 +02:00
docs: add YouTube Likes Sync documentation to README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
111
README.md
111
README.md
@@ -289,6 +289,117 @@ channels: [
|
|||||||
|
|
||||||
Either `id` or `handle` is required. The `name` field is optional and used for display purposes.
|
Either `id` or `handle` is required. The `name` field is optional and used for display purposes.
|
||||||
|
|
||||||
|
## YouTube Likes Sync
|
||||||
|
|
||||||
|
Sync your YouTube liked videos as "like" posts on your IndieWeb blog. Each liked video becomes a like post with the video URL, title, channel name, and thumbnail.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
1. Go to [Google Cloud Console](https://console.cloud.google.com/apis/credentials)
|
||||||
|
2. Create an **OAuth 2.0 Client ID** (Application type: Web application)
|
||||||
|
3. Add an authorized redirect URI: `https://yourdomain.com/youtube/likes/callback`
|
||||||
|
4. Make sure **YouTube Data API v3** is enabled for the project
|
||||||
|
5. Set the environment variables:
|
||||||
|
|
||||||
|
| Variable | Required | Description |
|
||||||
|
|----------|----------|-------------|
|
||||||
|
| `YOUTUBE_OAUTH_CLIENT_ID` | Yes | OAuth 2.0 client ID |
|
||||||
|
| `YOUTUBE_OAUTH_CLIENT_SECRET` | Yes | OAuth 2.0 client secret |
|
||||||
|
|
||||||
|
6. Add the OAuth config to your Indiekit configuration:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
"@rmdes/indiekit-endpoint-youtube": {
|
||||||
|
mountPath: "/youtube",
|
||||||
|
apiKey: process.env.YOUTUBE_API_KEY,
|
||||||
|
channelId: process.env.YOUTUBE_CHANNEL_ID,
|
||||||
|
oauth: {
|
||||||
|
clientId: process.env.YOUTUBE_OAUTH_CLIENT_ID,
|
||||||
|
clientSecret: process.env.YOUTUBE_OAUTH_CLIENT_SECRET,
|
||||||
|
},
|
||||||
|
likes: {
|
||||||
|
syncInterval: 3_600_000, // 1 hour (default)
|
||||||
|
maxPages: 3, // 50 likes per page, up to 150 per sync
|
||||||
|
autoSync: true, // enable background sync
|
||||||
|
},
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
7. Visit `/youtube/likes` in the Indiekit admin panel and click **Connect YouTube Account**
|
||||||
|
8. Authorize access — your refresh token is stored in MongoDB and persists across restarts
|
||||||
|
|
||||||
|
### Likes Options
|
||||||
|
|
||||||
|
| Option | Default | Description |
|
||||||
|
|--------|---------|-------------|
|
||||||
|
| `oauth.clientId` | - | Google OAuth 2.0 client ID |
|
||||||
|
| `oauth.clientSecret` | - | Google OAuth 2.0 client secret |
|
||||||
|
| `likes.syncInterval` | `3600000` | Background sync interval in ms (1 hour) |
|
||||||
|
| `likes.maxPages` | `3` | Max pages per sync (50 likes/page) |
|
||||||
|
| `likes.autoSync` | `true` | Enable background periodic sync |
|
||||||
|
|
||||||
|
### Likes Routes
|
||||||
|
|
||||||
|
#### Admin Routes (require authentication)
|
||||||
|
|
||||||
|
| Route | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| `GET /youtube/likes` | OAuth status, sync info, and controls |
|
||||||
|
| `GET /youtube/likes/connect` | Start OAuth flow (redirects to Google) |
|
||||||
|
| `POST /youtube/likes/disconnect` | Remove stored tokens |
|
||||||
|
| `POST /youtube/likes/sync` | Trigger manual sync |
|
||||||
|
|
||||||
|
#### Public Routes
|
||||||
|
|
||||||
|
| Route | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| `GET /youtube/likes/callback` | OAuth callback (Google redirects here) |
|
||||||
|
| `GET /youtube/api/likes` | JSON API for synced likes (`?limit=N&offset=N`) |
|
||||||
|
|
||||||
|
### Likes API Response
|
||||||
|
|
||||||
|
#### GET /youtube/api/likes
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"likes": [
|
||||||
|
{
|
||||||
|
"post-type": "like",
|
||||||
|
"like-of": "https://www.youtube.com/watch?v=abc123",
|
||||||
|
"name": "Liked \"Video Title\" by Channel Name",
|
||||||
|
"published": "2024-01-15T10:00:00Z",
|
||||||
|
"url": "https://yourdomain.com/likes/yt-like-abc123/",
|
||||||
|
"youtube-video-id": "abc123",
|
||||||
|
"youtube-channel": "Channel Name",
|
||||||
|
"youtube-thumbnail": "https://i.ytimg.com/vi/abc123/mqdefault.jpg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"count": 20,
|
||||||
|
"total": 142,
|
||||||
|
"offset": 0
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Likes Quota Usage
|
||||||
|
|
||||||
|
Fetching liked videos uses `videos.list` with `myRating=like` — **1 quota unit per page** (50 videos). With default settings (3 pages per sync, hourly), that's ~72 units/day.
|
||||||
|
|
||||||
|
### Eleventy Integration for Likes
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// _data/youtubeLikes.js
|
||||||
|
import EleventyFetch from "@11ty/eleventy-fetch";
|
||||||
|
|
||||||
|
export default async function() {
|
||||||
|
const baseUrl = process.env.SITE_URL || "https://example.com";
|
||||||
|
const data = await EleventyFetch(
|
||||||
|
`${baseUrl}/youtube/api/likes?limit=50`,
|
||||||
|
{ duration: "15m", type: "json" }
|
||||||
|
);
|
||||||
|
return data.likes;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Quota Efficiency
|
## Quota Efficiency
|
||||||
|
|
||||||
YouTube Data API has a daily quota (10,000 units by default). This plugin is optimized:
|
YouTube Data API has a daily quota (10,000 units by default). This plugin is optimized:
|
||||||
|
|||||||
Reference in New Issue
Block a user