Personal entertainment-media skills for NanoClaw: Trakt watch-history sync, TV-show and audiobook recommendations, watchlist release checks, YouTube channel-comment digests, and Audible backup — with a weekly cadence companion. NanoClaw per-chat overlay tile.
73
92%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
Before reading trakt-history.json, refresh it:
mcp__nanoclaw__fetch_trakt_history()Writes fresh /workspace/group/trakt-history.json. Skipping recommends already-watched shows. On MCP failure, proceed with the existing file but add this staleness note as the FIRST line of Step 5's output (before pitches): <i>⚠️ Trakt refresh failed — using cached history as of {mtime, ISO date}. Recommendations may include already-watched titles.</i>. Do NOT fabricate freshness; do NOT bury the note.
/workspace/group/netflix-history.csv — Netflix history. Format: "Show Name: Season X: Episode Name", "date" — split on : . Single-part titles are movies (skip). Group by show name./workspace/group/imdb-ratings.csv — Explicit ratings (Const, Your Rating 1–10, Title, Title Type, Year, Genres). ~160 entries./workspace/group/trakt-history.json — Trakt watch history. Format: [{"show": {"title": ...}, "episode": {"season": N, "number": N}, "watched_at": ...}]. Refreshed in Step 0 — trust Trakt over CSVs for recency. On Step 0 failure, Step 1a still applies and Step 5's staleness preamble discloses the age./workspace/group/watchlist.json — Upcoming tracked shows. Check before web research (Step 4a).Filter out kids' content: animated children's shows, preschool series, toy-brand cartoons.
Trakt is the primary source — live and synced across all platforms. The CSVs are static exports that go stale.
| Trakt watched | CSV watched | Decision |
|---|---|---|
| ✓ | any | Watched (primary signal) |
| ✗ | ✓ | Watched (Trakt sync may be incomplete) |
| ✗ | ✗ | Candidate for recommendation |
If Baruch reports "уже видел" for a recommendation, Trakt sync hadn't finished — note and pivot.
For each show, compute episodes_watched / total_episodes (search for total if needed). Derive thresholds from actual data distribution before applying these defaults:
Shows with 1–3 plays that never resumed are strong abandonment signals. IMDB ratings (imdb-ratings.csv): high-rated genres = confirmed loves; low-rated = genres that don't click.
Derive from data files using Step 2 classifications and IMDB ratings:
Intermediate output format (emit before Step 4 to anchor recommendations):
## Taste Profile (derived from data)
**Top genres:** Crime/Thriller, Dark Comedy, Sci-Fi (hard), Drama
**Avoided genres:** Reality TV, Procedural, Romantic Comedy
**Language signal:** Non-English shows rate 0.4 pts higher on average (lean into it)
**Episode structure:** Prefers serialized > episodic (completion rate 78% vs 41%)
**Quality floor:** Baruch's median IMDB rating = 7.8 → use 7.5 as recommendation floor
**Completed shows (top):** [Show A, Show B, Show C]
**Abandoned shows:** [Show X, Show Y]Before web research, read /workspace/group/watchlist.json. For notified: false entries, search for release status:
Training cutoff is stale; always search. Derive queries from Step 3's taste profile — top genres and themes from completed/high-rated shows. Do NOT hardcode genre names.
Cross-reference against all three data files; if present in any, he's seen it. Flag started-but-not-in-history shows as "new to you."
Use thresholds from Step 3. If sparse, fall back to IMDB ≥ 7.5 / RT ≥ 75%. Search for ratings before recommending if unavailable. Always include ratings.
Prioritize:
Avoid: Step 3 abandoned/low-rated genres, previously abandoned shows, shows below quality threshold.
Targeted pitch format (Telegram HTML, no Markdown):
<b>[Show Name]</b> ([Year], [Seasons]) — IMDB X.X | RT XX%
[1-2 sentence targeted pitch: connect to something he already loves]
[Where to watch] | [Status: ongoing/finished]Max 3–5 recommendations.
For announced-but-not-released shows (or just-announced new seasons) matching taste, add to /workspace/group/watchlist.json under tracking if not present:
{
"title": "Show Name",
"platform": "Platform",
"expected": "YYYY or YYYY-QN",
"reason": "Why it matches Baruch's taste",
"added": "YYYY-MM-DD",
"notified": false
}Read existing watchlist.json first, merge, write back. No duplicates.
skills
audible-backup
scripts
check-watchlist
entertainment-sync
recommend-books
recommend-shows
trakt-watch-history
youtube-comment-check