tubewatch/CLAUDE.md

173 lines
6.5 KiB
Markdown

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
MeTube is a web-based GUI for youtube-dl/yt-dlp that allows downloading videos from YouTube and 100+ other sites. It consists of a Python backend with aiohttp and an Angular frontend, providing real-time download progress via WebSocket.
## Development Commands
### Frontend Development
```bash
cd ui
npm install # Install Angular dependencies
npm run build # Build production frontend
npm run start # Start development server
npm run lint # Run Angular linting
npm run test # Run Angular tests
```
### Backend Development
```bash
# Install Python dependencies using uv (preferred)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv sync # Install dependencies from pyproject.toml
uv run python3 app/main.py # Run the backend server
# Alternative using pip
pip install -r requirements.txt
python3 app/main.py
```
### Docker Development
```bash
docker build -t metube . # Build Docker image
docker-compose up -d # Run with docker-compose
docker-compose up -d --build --force-recreate # Rebuild and restart
```
### Code Quality
```bash
# Python linting
pylint app/ # Run pylint on Python code
# Type checking (if configured)
pyright # Run Python type checking
```
## Architecture Overview
### Backend Structure (`app/`)
- `main.py`: Main aiohttp server with REST API and WebSocket support
- `ytdl.py`: Download queue management, yt-dlp integration, and notifier pattern
- `dl_formats.py`: Format selection logic for video/audio downloads
### Frontend Structure (`ui/src/app/`)
- `app.component.ts/html`: Main UI component with download interface
- `downloads.service.ts`: HTTP client for backend API communication
- `metube-socket.ts`: WebSocket client for real-time updates
- `downloads.pipe.ts`: Angular pipes for formatting download info
### Key Technologies
- **Backend**: Python 3.13+, aiohttp, python-socketio, yt-dlp, shelve storage
- **Frontend**: Angular 19+, TypeScript, Bootstrap 5, FontAwesome
- **Communication**: REST API + WebSocket for real-time updates
- **Storage**: Shelve-based persistent queues in STATE_DIR
## Environment Configuration
Key environment variables (see README.md for complete list):
- `DOWNLOAD_DIR`: Download location (default: `/downloads`)
- `DOWNLOAD_MODE`: `sequential`|`concurrent`|`limited` (default: `limited`)
- `MAX_CONCURRENT_DOWNLOADS`: For limited mode (default: 3)
- `YTDL_OPTIONS`: JSON options passed to yt-dlp
- `URL_PREFIX`: For reverse proxy setups
- `HOST`/`PORT`: Server binding (default: 0.0.0.0:8081)
## API Endpoints
### REST API
- `POST /add`: Add new download
- `POST /delete`: Cancel/delete download
- `GET /history`: Get download history
- `GET /info`: Get server info and configuration
### WebSocket Events
- `added`: New download queued
- `updated`: Download progress update
- `completed`: Download finished
- `canceled`: Download canceled
- `cleared`: Download removed from history
## Next Implementation: Playlist Monitor Service
The PLAYLIST_MONITOR_ARCHITECTURE.md document outlines a comprehensive plan for adding automated playlist monitoring capabilities. This should be implemented as a separate microservice.
### Architecture Summary
- **Service Type**: FastAPI-based microservice (Python 3.13+)
- **Database**: SQLite with SQLAlchemy ORM
- **Scheduler**: APScheduler for periodic tasks
- **Integration**: MeTube REST API + WebSocket client
- **Deployment**: Docker container alongside MeTube
### Key Components
1. **Playlist Manager**: Subscription management, yt-dlp integration
2. **Video Tracker**: Status tracking, file movement handling
3. **Scheduler Engine**: Periodic playlist checking, download triggering
4. **State Manager**: SQLite persistence, data migrations
5. **MeTube Client**: HTTP/WebSocket communication
### Implementation Phases (6 weeks)
- **Phase 1**: Core infrastructure, FastAPI setup, database models
- **Phase 2**: Playlist management, yt-dlp integration, start point logic
- **Phase 3**: Scheduler, periodic checks, MeTube integration
- **Phase 4**: File tracking, re-downloads, error handling
- **Phase 5**: UI integration (extend MeTube Angular or separate frontend)
- **Phase 6**: Testing, Docker containerization, documentation
### API Design
- `/api/playlists`: CRUD operations for playlist subscriptions
- `/api/playlists/{id}/videos`: Video status management
- `/api/videos/{id}/download`: Manual download triggering
- `/api/status`: System health and statistics
### Database Schema
- `playlists`: Subscription configuration
- `videos`: Individual video tracking with status, errors, file location
- `activity_log`: Audit trail for operations
### Configuration
```yaml
metube:
url: http://localhost:8081
scheduler:
default_check_interval: 60 # minutes
max_concurrent_downloads: 3
database:
url: sqlite:///data/playlists.db
```
## Key Implementation Notes
1. **Download Queue Management**: Uses async patterns with notifier callbacks for real-time updates
2. **Format Selection**: Complex logic in `dl_formats.py` handles quality/format preferences
3. **Error Handling**: Robust error tracking and retry mechanisms built into ytdl.py
4. **File Organization**: Supports custom directories, templates, and file naming patterns
5. **WebSocket Integration**: Real-time communication between backend and frontend
6. **Docker Considerations**: Multi-stage builds, volume mounts for downloads, environment configuration
## Common Development Tasks
### Adding New Download Features
1. Update `ytdl.py` for backend logic
2. Modify `app/main.py` for new API endpoints
3. Update frontend components in `ui/src/app/`
4. Test with various URLs and formats
### Modifying Frontend
1. Angular components in `ui/src/app/`
2. Use existing Bootstrap 5 styling
3. Maintain WebSocket connection patterns
4. Test build process with `npm run build`
### Database/Storage Changes
1. Shelve storage in STATE_DIR (default: `/downloads/.metube`)
2. Persistent queue files: `completed`, `pending`, `queue`
3. Cookie storage in `cookies/` subdirectory
### Testing Downloads
1. Use Docker for consistent environment
2. Test with various sites from yt-dlp supported sites
3. Check different quality/format combinations
4. Verify WebSocket updates in frontend