playbook/antigravity-awesome-skills/skills/2slides-ppt-generator/scripts/search_themes.py

138 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Search for available themes in the 2slides catalog.
"""
import os
import sys
import json
import argparse
import requests
from typing import Optional, List, Dict, Any
API_BASE_URL = "https://2slides.com/api/v1"
def get_api_key() -> str:
"""Get API key from environment variable."""
api_key = os.environ.get("SLIDES_2SLIDES_API_KEY")
if not api_key:
raise ValueError(
"API key not found. Set SLIDES_2SLIDES_API_KEY environment variable.\n"
"Get your API key from: https://2slides.com/api"
)
return api_key
def search_themes(
query: str,
limit: int = 20,
api_key: Optional[str] = None
) -> List[Dict[str, Any]]:
"""
Search for themes.
Args:
query: Search query (required keyword)
limit: Maximum number of results (max 100, default 20)
api_key: API key (uses env var if not provided)
Returns:
List of theme objects
"""
if api_key is None:
api_key = get_api_key()
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
params = {
"query": query,
"limit": min(limit, 100)
}
url = f"{API_BASE_URL}/themes/search"
print(f"Searching themes{f': {query}' if query else ''}...", file=sys.stderr)
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
result = response.json()
# Check API response structure
if not result.get("success"):
error_msg = result.get("error", "Unknown error")
raise ValueError(f"API error: {error_msg}")
# Extract data from response
data = result.get("data")
if not data:
raise ValueError("No data in API response")
themes = data.get("themes", [])
print(f"✓ Found {len(themes)} theme(s)", file=sys.stderr)
return themes
def format_theme(theme: Dict[str, Any]) -> str:
"""Format a theme object for display."""
theme_id = theme.get("id", "N/A")
name = theme.get("name", "Unnamed")
description = theme.get("description", "No description")
return f"ID: {theme_id}\nName: {name}\nDescription: {description}\n"
def main():
parser = argparse.ArgumentParser(
description="Search for 2slides themes",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Search for business themes
%(prog)s --query "business"
# Search for creative themes
%(prog)s --query "creative"
# Get more results
%(prog)s --query "professional" --limit 50
"""
)
parser.add_argument("--query", required=True, help="Search query (required keyword)")
parser.add_argument("--limit", type=int, default=20,
help="Maximum results (max 100, default 20)")
parser.add_argument("--json", action="store_true",
help="Output raw JSON")
args = parser.parse_args()
try:
themes = search_themes(
query=args.query,
limit=args.limit
)
if args.json:
print(json.dumps(themes, indent=2))
else:
print()
for i, theme in enumerate(themes, 1):
print(f"Theme {i}:")
print(format_theme(theme))
print("-" * 60)
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()