Skill: tamil-9421/letterboxd-tracker (version 1.0.0)

--- name: letterboxd-tracker description: Your personal movie assistant. Track what you watch, check your lists, and get movie info from Letterboxd instantly. author: Tamizh version: 1.1.0 --- # Letterboxd Skill This skill allows the agent to retrieve information about movies or user activity from Letterboxd. ## Setup ```bash pip install letterboxdpy ``` ## Usage Use this when the user asks about: - Their Letterboxd profile stats - Movies they've watched recently - Their watchlist - Specific movie details ## Commands ### `lb_user` - **command**: `python lb_tool.py user "{{username}}"` - **description**: Gets user profile stats (watched count, reviews, lists, favorites) - **parameters**: - `username`: The Letterboxd username ### `lb_diary` - **command**: `python lb_tool.py diary "{{username}}" [limit]` - **description**: Gets recently watched movies from user's diary - **parameters**: - `username`: The Letterboxd username - `limit`: Optional, default 10 ### `lb_watchlist` - **command**: `python lb_tool.py watchlist "{{username}}" [limit]` - **description**: Gets movies in user's watchlist - **parameters**: - `username`: The Letterboxd username - `limit`: Optional, default 10 ### `lb_movie` - **command**: `python lb_tool.py movie "{{slug}}"` - **description**: Gets movie details (title, year, rating, directors, description) - **parameters**: - `slug`: Movie URL slug (e.g., `vikram-2022`, `the-batman`) ## Examples User: "How many movies have I watched on Letterboxd?" Agent: (Calls `lb_user` with username="tamilventhan") User: "What movies did I watch recently?" Agent: (Calls `lb_diary` with username="tamilventhan") User: "Show my watchlist" Agent: (Calls `lb_watchlist` with username="tamilventhan") User: "Tell me about the movie Vikram" Agent: (Calls `lb_movie` with slug="vikram-2022")

path: lb_tool.py
content: import sys
import json
from letterboxdpy import user, movie

def get_user_info(username):
    """Fetches user profile stats and favorites."""
    try:
        lb_user = user.User(username)
        stats = lb_user.get_stats()
        favorites = lb_user.get_favorites()
        
        return json.dumps({
            "username": username,
            "display_name": lb_user.get_display_name(),
            "watched_count": stats.get("films", 0),
            "reviews_count": stats.get("reviews", 0),
            "lists_count": stats.get("lists", 0),
            "favorites": favorites.get("films", [])[:5] if favorites else []
        }, indent=2)
    except Exception as e:
        return f"Error fetching user {username}: {str(e)}"

def get_user_diary(username, limit=10):
    """Fetches recent movies from user's diary."""
    try:
        lb_user = user.User(username)
        diary = lb_user.get_diary_recent()
        
        if not diary or not diary.get("months"):
            return f"No recent diary entries for {username}"
        
        results = []
        months = diary.get("months", {})
        
        # Iterate through months (newest first)
        for month, days in sorted(months.items(), reverse=True):
            for day, films in sorted(days.items(), reverse=True):
                for film in films:
                    results.append({
                        "date": f"2026-{month}-{day}",
                        "name": film.get("name", ""),
                        "slug": film.get("slug", "")
                    })
                    if len(results) >= limit:
                        break
                if len(results) >= limit:
                    break
            if len(results) >= limit:
                break
        
        return json.dumps(results, indent=2)
    except Exception as e:
        return f"Error fetching diary for {username}: {str(e)}"

def get_user_watchlist(username, limit=10):
    """Fetches user's watchlist."""
    try:
        lb_user = user.User(username)
        watchlist = lb_user.get_watchlist_movies()
        
        if not watchlist:
            return f"No watchlist for {username}"
        
        results = []
        count = 0
        for film_id, film_data in watchlist.items():
            if count >= limit:
                break
            results.append({
                "name": film_data.get("name", ""),
                "year": film_data.get("year", ""),
                "slug": film_data.get("slug", "")
            })
            count += 1
        
        return json.dumps(results, indent=2)
    except Exception as e:
        return f"Error fetching watchlist for {username}: {str(e)}"

def get_movie_details(movie_slug):
    """Fetches details for a specific movie."""
    try:
        lb_movie = movie.Movie(movie_slug)
        crew = lb_movie.get_crew()
        
        directors = []
        if crew:
            directors = [c.get("name") for c in crew.get("directors", [])]
        
        return json.dumps({
            "title": lb_movie.title,
            "year": lb_movie.year,
            "rating": lb_movie.rating,
            "description": lb_movie.description,
            "directors": directors,
            "genres": lb_movie.genres,
            "runtime": lb_movie.runtime,
            "url": lb_movie.url
        }, indent=2)
    except Exception as e:
        return f"Error fetching movie '{movie_slug}': {str(e)}"

if __name__ == "__main__":
    command = sys.argv[1] if len(sys.argv) > 1 else ""
    target = sys.argv[2] if len(sys.argv) > 2 else ""
    
    if command == "user":
        print(get_user_info(target))
    elif command == "diary":
        limit = int(sys.argv[3]) if len(sys.argv) > 3 else 10
        print(get_user_diary(target, limit))
    elif command == "watchlist":
        limit = int(sys.argv[3]) if len(sys.argv) > 3 else 10
        print(get_user_watchlist(target, limit))
    elif command == "movie":
        print(get_movie_details(target))
    else:
        print("Commands: user <username>, diary <username> [limit], watchlist <username> [limit], movie <slug>")


path: README.md
content: # Letterboxd Tracker Skill for OpenCLAW

**Author:** Tamizh  
**Version:** 1.1.0

## Description
Your personal movie assistant. Track what you watch, check your lists, and get movie info from Letterboxd instantly.

This skill allows your OpenCLAW agent to retrieve information from Letterboxd.com, including user profiles, diaries, watchlists, and movie details. It uses the `letterboxdpy` library to scrape public data.

## Features
- **User Stats:** Get a user's watched count, reviews, lists, and favorite movies.
- **Diary:** Fetch recently watched movies from a user's diary.
- **Watchlist:** Retrieve movies from a user's watchlist.
- **Movie Details:** Get information about a specific movie (directors, year, rating).

## Installation

1. Ensure you have Python installed.
2. Install the required dependency:
   ```bash
   pip install letterboxdpy
   ```
3. Place these files in your OpenCLAW skill directory.

## Usage
The skill exposes the following commands to the agent:
- `lb_user`: Get profile stats.
- `lb_diary`: Get recent diary entries.
- `lb_watchlist`: Get watchlist items.
- `lb_movie`: Get movie details.

## License
MIT License - Copyright (c) 2026 Tamizh


path: requirements.txt
content: letterboxdpy


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (MEDIUM)