init: media-center v2

Rewrite of ESH-Media v1 with separated main/renderer/shared architecture
(vite-plugin-electron, React 18, react-router-dom). Includes NeDB storage,
electron-store config, proxy manager with FoxyProxy/uBlock extensions,
custom server-checked updater, NSIS installer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-11 23:49:43 +03:00
commit ecb5e7e49f
52 changed files with 11718 additions and 0 deletions

135
search-scripts/README.md Normal file
View File

@@ -0,0 +1,135 @@
# Поисковые Скрипты для Media Center
Эта папка содержит кастомные JavaScript скрипты для поиска фильмов и сериалов на различных сайтах.
## Как работают скрипты
Каждый скрипт выполняется в защищенном контексте Electron и получает доступ к следующим инструментам:
- **axios** - для HTTP запросов
- **cheerio** - для парсинга HTML (jQuery-подобный синтаксис)
- **proxyConfig** - настройки прокси (если включен для сайта)
## Структура скрипта
Каждый скрипт должен экспортировать функцию `search` со следующей сигнатурой:
```javascript
async function search(query, siteUrl, useProxy, axios, cheerio, proxyConfig) {
// Ваш код поиска
return [{name: "Название фильма", url: "https://..."}];
}
```
### Параметры:
- `query` (string) - поисковый запрос пользователя
- `siteUrl` (string) - базовый URL сайта (например, "https://kinogo.biz")
- `useProxy` (boolean) - нужно ли использовать прокси
- `axios` (object) - экземпляр axios для HTTP запросов
- `cheerio` (object) - библиотека для парсинга HTML
- `proxyConfig` (object) - настройки прокси `{host: string, port: number}`
### Возвращаемое значение:
Массив объектов с результатами поиска. Каждый объект должен содержать:
**Обязательные поля:**
- `name` (string) - название фильма/сериала
- `url` (string) - ссылка на страницу фильма
**Опциональные поля:**
- `image` (string) - URL постера
- `year` (string) - год выпуска
- `description` (string) - описание
- `rating` (string) - рейтинг
## Примеры
### Пример 1: JSON API
```javascript
async function search(query, siteUrl, useProxy, axios, cheerio, proxyConfig) {
const config = {
params: { q: query },
timeout: 15000
};
if (useProxy && proxyConfig) {
config.proxy = { host: proxyConfig.host, port: proxyConfig.port };
}
const response = await axios.get(`${siteUrl}/api/search`, config);
return response.data.results.map(item => ({
name: item.title,
url: item.link,
image: item.poster
}));
}
```
### Пример 2: HTML парсинг
```javascript
async function search(query, siteUrl, useProxy, axios, cheerio, proxyConfig) {
const config = {
params: { q: query },
timeout: 15000
};
if (useProxy && proxyConfig) {
config.proxy = { host: proxyConfig.host, port: proxyConfig.port };
}
const response = await axios.get(`${siteUrl}/search`, config);
const $ = cheerio.load(response.data);
const results = [];
$('.movie-card').each((i, el) => {
const $el = $(el);
results.push({
name: $el.find('.title').text().trim(),
url: siteUrl + $el.find('a').attr('href'),
image: $el.find('img').attr('src')
});
});
return results;
}
```
## Добавление нового скрипта
1. Создайте файл `sitename.js` в этой папке
2. Используйте `SCRIPT_TEMPLATE.js` как основу
3. Реализуйте функцию `search()`
4. Обновите конфигурацию сайта в настройках приложения
## Обновление скриптов
Скрипты можно обновлять с сервера через настройки приложения. При обновлении конфигурации новые скрипты автоматически загружаются.
## Расположение скриптов
Скрипты хранятся в двух местах:
1. **Встроенные скрипты**: `<app>/search-scripts/` (только для чтения)
2. **Пользовательские скрипты**: `<userData>/search-scripts/` (можно обновлять)
Пользовательские скрипты имеют приоритет над встроенными.
## Безопасность
- Скрипты выполняются в изолированном контексте
- Таймаут выполнения: 30 секунд
- Доступ только к axios и cheerio
- Нет доступа к файловой системе или другим модулям Node.js
## Отладка
Ошибки скриптов логируются в консоль Electron DevTools. Для отладки:
1. Откройте DevTools (F12)
2. Выполните поиск
3. Проверьте консоль на наличие ошибок