Официальный SDK и boilerplate для контент-провайдеров WatchBuddy Создавайте децентрализованные скрейперы, тестируйте их изолированно и без лишних шагов интегрируйте в экосистему WatchBuddy. 🚀
🇺🇸 English • 🇹🇷 Türkçe • 🇫🇷 Français • 🇺🇦 Українська • 🇮🇳 हिन्दी • 🇨🇳 简体中文
Этот шаблон дает стандартизированную среду для разработки провайдеров WatchBuddy. Провайдер — это отдельный сервис, который поставляет контент в WatchBuddy (Web/Mobile) через децентрализованную сеть.
- 🔌 Plug & Play: добавьте URL провайдера в WatchBuddy и сразу начинайте смотреть.
- 🧪 Изолированная разработка: архитектура local-first позволяет тестировать плагины без влияния на ядро.
- 🎬 Единое медиаядро: на базе KekikStream для расширенного извлечения ссылок.
- 🛡️ Дружелюбно к CORS: работает со стандартными CORS/proxy-сценариями при необходимости.
Требования: Python 3.11+. Для разработки не нужны внешние медиаплееры.
# 1. Клонируйте репозиторий
git clone https://github.com/keyiflerolsun/ExampleProvider.git
cd ExampleProvider
# 2. Установите зависимости
pip install .
# 3. Настройте окружение
cp .env.example .env
# 4. Запустите движок
python run.py👉 Доступ к провайдеру: http://127.0.0.1:3310
👉 Интеграция с WatchBuddy (localhost): Добавить http://localhost:3310 в WatchBuddy
- Откройте WatchBuddy.
- Перейдите в раздел Providers.
- Вставьте базовый URL (например,
http://127.0.0.1:3310). - Сохраните и активируйте провайдер.
Требования:
- Провайдер должен отдавать
GET /api/v1/schema. - В ответе должны быть
provider_nameиdescription(плюс опциональные proxy URL).
WatchBuddy доступен на Android и iOS.
Чтобы находить больше тайтлов и быстро отправлять фильм или сериал в room, вы также можете использовать один из сервисов:
- 🌐 Stream Web: https://stream.watchbuddy.tv
- 🤖 Telegram-бот: https://t.me/WatchBuddyRobot
.
├── Stream/
│ ├── Plugins/ # 🔌 Ваши скрейперы сайтов (например, RareFilmm.py)
│ └── Extractors/ # 🔗 Ваши резолверы ссылок (например, OneFichier.py)
├── FastAPI/ # ⚡ Ядро API провайдера
├── run.py # 🚀 Основная точка входа
├── validate.py # 🧪 Инструмент тестирования и валидации
└── .env # ⚙️ Конфигурация
| Компонент | Ответственность | Папка |
|---|---|---|
| Plugin | Обход сайта, получение метаданных и embed URL. | Stream/Plugins/ |
| Extractor | Получение финальных воспроизводимых ссылок у хостинг-провайдеров. | Stream/Extractors/ |
Создать новый плагин просто: добавьте Python-файл в Stream/Plugins/. Минимальный пример:
from KekikStream.Core import HTMLHelper, PluginBase, MainPageResult, SearchResult, MovieInfo, Episode, SeriesInfo, Subtitle, ExtractResult
class MyPlugin(PluginBase):
name = "MyPlugin"
language = "ru"
main_url = "https://example.com"
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
description = "Описание MyPlugin"
# Список категорий на главной
main_page = {
f"{main_url}/category/" : "Название категории"
}
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
# Соберите данные и верните список MainPageResult
return results
async def search(self, query: str) -> list[SearchResult]:
# Верните список SearchResult
return results
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
# Верните MovieInfo или SeriesInfo
return details
async def load_links(self, url: str) -> list[ExtractResult]:
# self.collect_results(results, data) — сбор результатов (list/single/None)
# self.deduplicate(results) — дедупликация по URL
# await self.async_cf_get(url) — обход Cloudflare (async)
# Движок автоматически вызывает sync_subtitles(results) после load_links
return linksИспользуйте встроенный валидатор, чтобы проверить совместимость с моделями WatchBuddy.
# Проверить все локальные плагины
python validate.py
# Проверить конкретные плагины
python validate.py RareFilmmЭтот SDK использует загрузчик Local-First:
- локальные плагины (
Stream/Plugins/) загружаются приоритетно; - локальные экстракторы (
Stream/Extractors/) могут переопределять или расширять core extractors; - среда разработки остается полностью воспроизводимой и изолированной.
Для совместимости с WatchBuddy плагины ДОЛЖНЫ возвращать:
MainPageResult: для галерей на главной.SearchResult: для результатов поиска.MovieInfo/SeriesInfo: для метаданных и эпизодов.ExtractResult: для воспроизводимых ссылок (включая referer и user-agent).
graph TB
subgraph WatchBuddyApp[📱 Клиент WatchBuddy]
UI[Пользовательский интерфейс]
Player[Видеоплеер]
end
subgraph Provider[🎬 Ваш провайдер]
FastAPI[⚡ Точка входа FastAPI]
Loader[🔌 Ядро загрузчика]
subgraph LocalCode[Локальная разработка]
P1[📺 Плагин RareFilmm]
E1[🔗 Пользовательский экстрактор]
end
end
subgraph External[🌍 Веб]
Target[Медиа-сайт]
CDN[CDN с потоками]
end
UI -->|Поиск/Загрузка| FastAPI
FastAPI --> Loader
Loader --> P1
P1 -->|Скрапинг| Target
P1 -->|Запрос ссылки| E1
E1 -->|Разрешение| CDN
CDN -->|Поток| Player
style Provider fill:#2b2a29,stroke:#ef7f1a,stroke-width:2px
style WatchBuddyApp fill:#242322,stroke:#0087a3,stroke-width:2px
Copyright (C) 2026 by keyiflerolsun ❤️️ Лицензия: GNU GENERAL PUBLIC LICENSE Version 3.
Проект разработан @keyiflerolsun для @KekikAkademi.
⭐ Если SDK оказался полезным, поддержите проект звездой.