# Портфолио видео (Showcase)

Система для демонстрации лучших примеров сгенерированных видео пользователям.

## Обзор

Портфолио позволяет:
- Пользователям — смотреть примеры работ через команду `/portfolio`
- Администраторам — управлять списком видео через viewer bot

## Для пользователей

### Команда /portfolio

Отправляет 5 случайных примеров сгенерированных видео.

Когда показывается:
- В меню бота
- В сообщении при нехватке генераций
- В справке по команде /start

Особенности:
- Видео с артефактами автоматически исключаются
- Показывается рейтинг видео (звёздочки)
- После просмотра предлагается сгенерировать своё видео

## Для администраторов

### Viewer Bot: Команды управления

| Команда | Описание |
|---------|----------|
| `/showcase` | Список всех видео в портфолио с пагинацией |
| `/showcase_add <task_id> [rating]` | Добавить видео по task_id |
| `/showcase_rm <id>` | Удалить видео по ID в базе |

### Viewer Bot: Кнопки под видео

При просмотре любого видео через `/video` или `/v_<task_id>`:

- **➕ В портфолио** — добавить видео в портфолио
- **➖ Из портфолио (ID:X)** — удалить из портфолио
- **☆☆☆☆☆ / ★★★★★** — установить рейтинг 1-5

### Рейтинг

| Рейтинг | Значение |
|---------|----------|
| ⭐⭐⭐⭐⭐ (5) | Отлично |
| ⭐⭐⭐⭐ (4) | Хорошо |
| ⭐⭐⭐ (3) | Нормально |
| ⭐⭐ (2) | Плохо |
| ⭐ (1) | Очень плохо |
| — (0) | Без оценки |

### Флаг артефактов

Видео с флагом `has_artifacts` автоматически исключаются из `/portfolio`, но остаются в базе для анализа.

## Техническая документация

### База данных

Файл: `/mnt/video/showcase.db` (общий для dev и prod)

```sql
CREATE TABLE showcase_videos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    video_path TEXT NOT NULL UNIQUE,
    task_id TEXT,
    product_id TEXT,
    rating INTEGER DEFAULT 0,         -- 0-5
    has_artifacts INTEGER DEFAULT 0,  -- 0 или 1
    is_active INTEGER DEFAULT 1,      -- 0 или 1
    added_by INTEGER,                 -- user_id администратора
    added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
```

### API (database.py)

```python
# Инициализация
init_showcase_db()

# CRUD операции
add_showcase_video(video_path, task_id, product_id, rating, has_artifacts, added_by)
remove_showcase_video(video_id)
get_showcase_video(video_id)
get_showcase_video_by_task(task_id)
get_showcase_videos(active_only=True, exclude_artifacts=True, limit=None, offset=0)
get_showcase_videos_count(active_only=True, exclude_artifacts=True)
get_random_showcase_videos(count=5, exclude_artifacts=True)

# Обновление
set_showcase_video_active(video_id, active)
set_showcase_video_artifacts(video_id, has_artifacts)
set_showcase_video_rating(video_id, rating)
```

### Импорт данных

Скрипт: `scripts/import_showcase.py`

```bash
# Предварительный просмотр
python import_showcase.py --dry-run

# Импорт из good-generations.md
python import_showcase.py
```

Формат исходного файла:
```
/mnt/video/wb_XXXXX/YYYYMMDD_HHMMSS_xxxx/videos/video.mp4 -- примечание
```

Примечания:
- `отлично` → rating=5
- `артефакты` → has_artifacts=1

### Тестирование

```bash
cd /home/videobot/dev/scripts
source ../venv/bin/activate
python test_showcase.py
```

## Интеграция

### telegram_bot.py

- Команда `/portfolio` — отправка примеров
- Обновлённое сообщение `/start` с упоминанием `/portfolio`
- Обновлённое меню бота
- Обновлённое сообщение при нехватке генераций

### viewer_bot.py

- Команды `/showcase`, `/showcase_add`, `/showcase_rm`
- Кнопки под видео для добавления/удаления
- Кнопки рейтинга
- Веб-ссылка на видео: `https://your-server.example.com/wb_{product_id}/{task_id}/videos/video.mp4`

## CLI команды

```bash
# Инициализация базы
python database.py showcase init

# Статистика портфолио
python database.py showcase stats

# Импорт из файла
python import_showcase.py

# Тесты
python test_showcase.py
```
