# Google / YouTube для WindYT

Реализован официальный OAuth, без паролей Google. Личные профили WindYT отделены от прежних локальных карточек и браузерных профилей. Старые карточки не становятся подключёнными автоматически. Новый профиль регистрируется на странице «Каналы и публикации». Регистрация — по уникальному логину и паролю от 12 символов, без обязательной почты. Восстановление выполняет администратор.

## 1. Google Cloud

1. Создайте свой проект в https://console.cloud.google.com/ и включите **YouTube Data API v3** (APIs & Services → Library).
2. В Google Auth Platform настройте Branding: название WindYT, адрес поддержки, контакты разработчика. Authorized domains: `windyoutube.pro`. Для production укажите реальные публичные страницы приложения, политики конфиденциальности и условий. Подтвердите владение доменом, если Google потребует. Не выдавайте отсутствующие юридические страницы за готовые.
3. Audience: External, сначала Testing. Добавьте собственный Google-аккаунт в Test users. Настройте Data Access со scopes:
   - `https://www.googleapis.com/auth/youtube.force-ssl` — чтение/изменение видео и статусов;
   - `https://www.googleapis.com/auth/youtube.upload` — загрузки.
   Первый scope даёт Google более широкие разрешения, чем интерфейс WindYT; приложение не реализует удаление видео.
4. Clients → Create client → **Web application**. Имя: WindYT. Authorized redirect URI строго:
   `https://windyoutube.pro/api/youtube/callback`
   Никакого порта, завершающего слеша или `www` здесь нет. JavaScript origins для серверного OAuth не требуются. Если поле заполняется, используйте `https://windyoutube.pro`.
5. Client ID и Client secret передайте только через поддерживаемое защищённое серверное подключение хоста. Не вставляйте secret в чат, исходники или HTML.

## 2. Условия на сервере

HTTPS с доверенным сертификатом должен работать до OAuth. Ожидаемый Namecheap SSL не заменяется. Порт приложения и настройки других сайтов менять не нужно.

Приложение ожидает серверные переменные:

| Параметр | Назначение |
| --- | --- |
| GOOGLE_CLIENT_ID | OAuth client ID |
| GOOGLE_CLIENT_SECRET | Секрет OAuth клиента |
| WINDYT_TOKEN_KEY | Сгенерированный сервером ключ Fernet (32 случайных байта в urlsafe base64) |
| WINDYT_COOKIE_SECURE | `1` для HTTPS и защищённой cookie |
| WINDYT_DATA_DIR | Существующее постоянное приватное хранилище приложения |

Ключ шифрования хранить отдельно от базы, не менять без миграции токенов; его утрата делает подключения нечитаемыми. Web-приложение и worker должны получать одинаковые параметры и один постоянный DATA_DIR. SQLite, session-key и uploads сохраняются между выпусками. Пользователь службы — без root. Хранилище и резервные копии ограничить правами владельца. В логах прокси скрыть query callback (там краткоживущий OAuth code); приложение токены не логирует.

Загрузки выполняет поддержанный хостом worker `operations.py worker`. Дополнительная самостоятельная служба не требуется. HTTP-загрузка ограничена 256 МБ; прокси должен разрешать соответствующий размер запроса и время приёма. При неизвестном результате создания resumable-сессии повторная вставка автоматически не выполняется. Существующая сессия продолжает загрузку с подтверждённого Google смещения после перезапуска. Завершённые локальные файлы удаляются; файлы ошибочных/неопределённых заданий остаются для разбора и требуют контроля диска оператором.

**Граница текущей среды:** доступного инструмента управления VPS и подтверждённого механизма передачи произвольных Google-параметров в web/worker нет. Наличие формы SSH-подключения само по себе это не подтверждает. Хост должен предоставить защищённую установку этих параметров и подтвердить запуск worker. Секреты не нужно передавать исполнителю. До этого подключение в интерфейсе честно недоступно.

## 3. Ограничения Google

Testing для External ограничивает аудиторию тестовыми пользователями (обычно до 100), а refresh token для этих YouTube scopes обычно истекает через 7 дней. Возможны предупреждения о непроверенном приложении. Для публичного использования потребуется проверка OAuth по требованиям Google, политика конфиденциальности и при необходимости демонстрация сценария.

Квота YouTube привязана к Google Cloud проекту, а не каждому пользователю WindYT. Проверяйте актуальные лимиты и расход в Google Cloud; ошибку quotaExceeded приложение показывает отдельно. Не рассчитывайте на фиксированное число загрузок по одной общей цифре квоты.

Загрузки из непроверенных API-проектов, созданных после 28 июля 2020, могут принудительно оставаться private. Для снятия ограничения нужен аудит YouTube API; проверка OAuth и аудит YouTube — разные процедуры. Указание public в форме не обходит ограничений Google.

Планирование: private, будущий publishAt с часовым поясом, видео ранее не публиковалось. Интерфейс принимает время в UTC +00:00. API может отклонить планирование ранее опубликованного видео — одной текущей видимости private недостаточно. Отображаются только каналы, возвращённые Google; для другого Brand Account повторите подключение и выберите его в Google.

Отключение удаляет токены данного канала в WindYT, но не удаляет видео. Полный отзыв разрешения выполняется в Google Account → Security → сторонние подключения. Он может затронуть несколько каналов; приложение не делает такой отзыв молча.

## 4. Приёмка после настройки

На явно выбранном владельцем тестовом канале: вход в WindYT → подключение Google → отмена/повтор → обновление страницы → небольшая приватная загрузка → список видео → редактирование → планирование будущей публикации → проверка статуса в Studio. Проверить повторное нажатие, перезапуск worker, отзыв доступа в Google и повторное подключение. Второй профиль не должен видеть чужие каналы или задания. До этого локальные имитации API не подтверждают работу реального Google или VPS.

Официальные справки:
- https://developers.google.com/identity/protocols/oauth2/web-server
- https://developers.google.com/youtube/v3/guides/using_resumable_upload_protocol
- https://developers.google.com/youtube/v3/docs/videos/insert
- https://developers.google.com/youtube/v3/docs/videos/update
- https://developers.google.com/youtube/v3/guides/quota_and_compliance_audits


## 5. Вход и восстановление WindYT

Откройте `https://windyoutube.pro/youtube.html` после настройки HTTPS. Нажмите «Создать профиль», указав логин и пароль WindYT (не пароль Google). В дальнейшем нажимайте «Войти»; обновление страницы сохраняет сессию. Выход завершает все сессии этого профиля. Прежние аккаунты, каналы и история сохраняются, логины нечувствительны к регистру. Браузерные профили с прежним кодом доступа остаются отдельной существующей функцией.

После входа: «Подключить Google / YouTube» → выбрать свой Google/Brand Account и разрешить оба запрошенных доступа → выбрать канал в панели → выбрать небольшое видео и видимость «Приватное» → «Поставить в очередь» → проверить статус и YouTube Studio. Реальную проверку выполняйте только на согласованном тестовом канале. Публичная публикация зависит от ограничений Google, описанных выше.

Администратор видит раздел «Восстановление доступа»: проверяет личность владельца, вводит его логин, подтверждает сброс и передаёт показанный временный пароль по защищённому каналу. Пароль показывается только в ответе на сброс, хранится только его хеш, действует один час и допускает один вход. Все прежние сессии и незавершённые OAuth-запросы отзываются. После входа доступ к каналам блокируется до смены пароля. Если закрыта сессия до смены или временный пароль истёк, нужен новый сброс. Подключения и задания не удаляются. Обычная смена пароля требует текущий пароль и также отзывает прежние сессии.

**Первичное назначение администратора:** подтверждённая административная роль в исходной схеме отсутствовала. Миграция добавляет роль `user` всем существующим пользователям; новые регистрации тоже не дают прав администратора. Требуется защищённая серверная операция хоста: после проверки личности назначить `role=admin` конкретному существующему пользователю в `yt_users` по подтверждённому ID. Публичного API назначения нет. Доступного инструмента такой операции у исполнителя нет; никто автоматически администратором не назначен. Не присылайте пароль для назначения роли.

## 6. Что подтверждено и что ещё подключить

По предоставленному отчёту хоста текущая версия 27 прошла HTTP-проверку. Хост поддерживает управляемый `operations.py worker`, но отчёт не подтверждает состояние именно этого обработчика. HTTPS с купленным сертификатом, OAuth и реальные операции YouTube пока не подтверждены.

После выпуска сертификата требуется подтвердить HTTPS; затем настроить Google Cloud по разделу 1. Следующий необходимый механизм — защищённая установка `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, `WINDYT_TOKEN_KEY`, `WINDYT_COOKIE_SECURE=1` одновременно для web и worker с сохранением существующего хранилища. В доступных инструментах есть только локальная работа с кодом; форма подключения VPS не доказывает поддержку произвольных переменных окружения. Не вставляйте эти секреты в чат или файлы проекта. Нужно, чтобы хост предоставил защищённые поля для этих параметров и подтвердил их применение, работу worker и первичную роль администратора. Это конкретные оставшиеся серверные шаги; повторная загрузка проекта вручную не нужна.
