ГлавнаяБлогRFD_YT_Engine: полный цикл управления YouTube-каналом на Python
Python

RFD_YT_Engine: полный цикл управления YouTube-каналом на Python

Узнайте, как построить систему на Python для управления YouTube-каналом: захват видео, транскрибация, загрузка, расписание и MCP-сервер. Начните автоматизировать свой канал уже сегодня.

Al
Редакция Algolitalgolit.ru
12 мин чтения1 июля 2026 г.

Зачем автоматизировать YouTube-канал на Python?

Управление YouTube-каналом вручную отнимает часы каждый день: вы проверяете расписание, правите метаданные, следите за коллизиями. А что, если можно просто сказать ассистенту «найди конфликты и исправь» — и всё сделается само? Именно это и делает RFD_YT_Engine — система на Python, которая управляет полным жизненным циклом видео: от записи до публикации. В статье разберём архитектуру, ключевые домены и уроки, которые вы сможете применить в своих проектах.

Архитектура системы: 8 доменов и MCP-сервер

RFD_YT_Engine — это система из восьми доменов на Python, объединённых MCP-сервером. MCP (Model Context Protocol) позволяет Claude Desktop вызывать инструменты системы через естественный язык. Главное правило архитектуры — однонаправленные зависимости: ни один домен не импортирует модули другого. Все данные передаются через общую инфраструктуру или слой Interface.

Вот восемь доменов:

  • Capture — интеграция с OBS, мониторинг сессий, определение игры.
  • Ingest — транскрибация через Whisper, извлечение битов, тегирование сессий.
  • Production — сборка Shorts через FFmpeg, Highlights с bridge TTS, привязка битов к клипам.
  • Distribution — загрузка через YouTube Data API v3, разрешение метаданных, публикация по расписанию.
  • Catalog — полное зеркало канала в локальной SQLite: 167 видео со всеми 11 колонками деталей.
  • Scheduling — управление календарём, обнаружение коллизий, перестановка видео.
  • Streaming — управление OBS через WebSocket, сессии стримов.
  • Interface — MCP-сервер. Единственный домен, которому разрешено вызывать другие домены.

Пример: как работает MCP-сервер

# Упрощённый пример MCP-инструмента для обнаружения коллизий
from mcp.server import Server
from scheduling import detect_collisions

app = Server("youtube-scheduler")

@app.tool()
def check_collisions():
    """Проверить расписание на конфликты."""
    conflicts = detect_collisions()
    if conflicts:
        return f"Найдено {len(conflicts)} коллизий: {conflicts}"
    return "Конфликтов нет"

# Запуск сервера
if __name__ == "__main__":
    app.run()

YouTube API: что пошло не так и как исправили

Я написал обёртку для YouTube Data API v3 и Analytics API v2 с нуля, потому что существующие библиотеки были либо слишком тонкими, либо слишком навязчивыми. Вот два важных урока.

Проблема 1: search.list() возвращает не все видео

При первой синхронизации метод search().list() вернул 64 видео. Правильное число — 167. Оказывается, search показывает только публичные видео. Приватные, запланированные и скрытые не видны. Решение: переключиться на плейлист загрузок канала. 4 API-запроса — и все 167 видео с полными данными.

Проблема 2: update_video_metadata() молча портит данные

Метод update_video_metadata() содержит тихую ошибку: YouTube при обновлении заменяет весь объект snippet. Если отправить только изменяемые поля — остальные сбрасываются: теги пропадают, категория сбрасывается. Фикс: сначала получить текущий snippet, объединить изменения, отправить полный объект.

def update_video_metadata(youtube, video_id, new_title=None, new_tags=None):
    # Получаем текущие данные видео
    response = youtube.videos().list(
        part='snippet',
        id=video_id
    ).execute()
    snippet = response['items'][0]['snippet']
    
    # Объединяем изменения
    if new_title:
        snippet['title'] = new_title
    if new_tags is not None:
        snippet['tags'] = new_tags
    
    # Отправляем полный snippet
    youtube.videos().update(
        part='snippet',
        body={
            'id': video_id,
            'snippet': snippet
        }
    ).execute()

Обнаружение коллизий в расписании

На канале было 89 запланированных видео. Конфликты по времени не очевидны в YouTube Studio — там показываются даты, а не точное время. Две видео с меткой 2026-08-29T02:00:00Z выглядят одинаково, пока одно из них не сломается при публикации.

Я написал две функции:

  • detect_collisions() — находит серии видео одной игры подряд, превышающие порог. Например, серия по Hotline Miami длилась 6 дней без перерыва. Исправление: перемешать 8 Shorts в окно этой серии, заполнив пустой сентябрь.
  • detect_same_day_collisions() — классифицирует дни с несколькими видео: либо true_conflict (одинаковое время — реальная проблема), либо multi_slot (разное время — нормально). Short в 2AM и длинное видео в 10PM в воскресенье — правильный паттерн. Два Shorts оба в 2AM — конфликт.
def detect_same_day_collisions(scheduled_videos):
    """Обнаруживает коллизии видео, запланированных на один день."""
    from collections import defaultdict
    by_date = defaultdict(list)
    for v in scheduled_videos:
        by_date[v['scheduled_date']].append(v)
    
    collisions = []
    for date, videos in by_date.items():
        if len(videos) < 2:
            continue
        # Группируем по точному времени
        times = {}
        for v in videos:
            t = v['scheduled_time']
            times.setdefault(t, []).append(v)
        for t, group in times.items():
            if len(group) > 1:
                collisions.append({
                    'date': date,
                    'time': t,
                    'videos': [v['title'] for v in group],
                    'type': 'true_conflict'
                })
    return collisions

Методология разработки: Spec-Driven Development

Весь проект разрабатывался по методологии Director → Pipeline → Agent. Я писал директивы, агент реализовывал, я проверял по сырым результатам pytest. Никакие отчёты агента не считались доказательством.

Ключевое правило: фазированная разработка с верифицируемыми порогами. Ни одна фаза не начиналась, пока предыдущая не проходила ровно заявленное количество тестов. В итоге — 190+ сертифицированных тестов.

Практический вывод: что делать прямо сейчас

Если вы управляете YouTube-каналом, начните с малого:

  1. Создайте локальное зеркало канала в SQLite. Это даст вам полный контроль над данными без ограничений API.
  2. Напишите функцию обнаружения коллизий для расписания. Вы удивитесь, сколько конфликтов скрыто в YouTube Studio.
  3. Автоматизируйте хотя бы один домен — например, загрузку видео по расписанию. Используйте YouTube Data API v3 с правильным обновлением snippet.

RFD_YT_Engine показал, что даже сложная система может быть построена поэтапно, если следовать чёткой архитектуре и тестировать каждый шаг. Начните с зеркала канала — и вы увидите, как много можно автоматизировать.

#YouTube API#автоматизация#Python#MCP#расписание
Al
Редакция Algolit

Пишем про алгоритмы, подготовку к собеседованиям и карьеру в IT — так, чтобы было понятно и полезно.

Хочешь закрепить знания на практике?

Решай задачи на Algolit — интерактивная платформа для обучения

Начать бесплатно →