173 lines
6.5 KiB
Markdown
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 |