# Навык: download_yandex_v8

## Что это

Универсальный скачиватель из публичного Яндекс.Диска с 8 потоками,
SHA-256 контролем целостности и JSONL манифестом.

## Когда использовать

- Перенос файлов из публичного Яндекс.Диска в локальное хранилище
- Массовое скачивание папок проекта
- Автоматическое сканирование и загрузка

## Установка

Скопируйте `yandex_disk_downloader.py` из рабочей папки в удобное место:

```bash
cp /opt/data/workspace/.object-context/tasks/<task_id>/yandex_disk_downloader.py ./
```

## Использование

### Вариант 1: По манифесту (рекомендуется)

```bash
cd /opt/data/workspace/.object-context/tasks/<task_id>/

python3 yandex_disk_downloader.py \
  --public-key https://disk.yandex.ru/d/ССЫЛКА \
  --manifest sync_yandex/manifest.jsonl \
  --output sync_yandex
```

### Вариант 2: Автоматическое сканирование

```bash
python3 yandex_disk_downloader.py \
  --public-key https://disk.yandex.ru/d/ССЫЛКА \
  --scan-root "/Проект" \
  --output sync_yandex
```

## Параметры

| Параметр | По умолчанию | Описание |
|---|---|---|
| `--public-key` | ссылка на диск | Публичная ссылка Яндекс.Диска |
| `--manifest, -m` | — | JSONL манифест файлов |
| `--scan-root, -s` | — | Корневая папка для сканирования |
| `--output, -o` | `.` | Каталог сохранения |
| `--workers, -w` | 8 | Количество потоков |
| `--batch, -b` | 20 | Размер пакета файлов |

## Формат манифеста (JSONL)

Одна запись на строку:

```json
{"project":"Имя","remote":"/путь/к/файлу","size":12345}
```

Поля:
- `project` — имя проекта (обязательно)
- `remote` — полный путь к файлу в Диске (обязательно)
- `size` — размер файла в байтах (опционально)

Прошедшие файлы помечаются `status=ok`, неудачные — `status=error`.

## Возможности

- ✅ **8 параллельных потоков** — в 2 раза быстрее чем 4
- ✅ **SHA-256 контроль** целостности каждого файла
- ✅ **Проверка размера** — сверка с метаданными API
- ✅ **JSONL манифест** с автоматическим обновлением
- ✅ **Авто-сканирование** папок через API
- ✅ **Логирование** в `downloader_YYYYMMDD.log`

## Ограничения

- ⚠️ Работает только с **публичными** Яндекс.Дисками
- ⚠️ Не поддерживает авторизацию
- ⚠️ Для файлов > 2 ГБ может потребоваться больше времени
- ⚠️ 8 потоков — оптимум для канала 40+ Мбит/с

## Справочные команды

```bash
# Посмотреть справку
python3 yandex_disk_downloader.py --help

# Посчитать файлы в манифесте
wc -l manifest.jsonl

# Проверить прогресс
python3 -c "
import json
with open('manifest.jsonl') as f:
    total = ok = err = 0
    for line in f:
        d = json.loads(line.strip())
        total += 1
        if d.get('status') == 'ok': ok += 1
        elif d.get('status') != 'skip': err += 1
    print(f'Всего: {total}, OK: {ok}, Ошибки: {err}')
"
```
