ESH-Media v1.0.11 — kiosk media browser for elderly users

Electron-based kiosk desktop app: large-tile launcher for YouTube, RuTube,
movie sites and Google services, designed for low-tech grandparent use.

Features:
  - WebContentsView-per-app tabbed browsing with session persistence
  - per-app proxy routing (Clash/V2Ray friendly, useProxy flag)
  - cliqz-electron adblocker with whitelist for OAuth/integrity domains
  - TMDB-backed movie search across kinogo / hdrezka / filmix
  - bookmark posters auto-fetched from og:image / JSON-LD
  - electron-updater wired to Gitea releases API (latest.yml + .blockmap)
  - cross-domain navigation confirms via custom WebContentsView dialogs
  - kiosk window with hidden menu, Ctrl+Shift+I devtools shortcut
  - Trusted Types disabled engine-wide so adblocker scriptlets work on YouTube

Google OAuth handling (the hard-won part):
  Google's anti-abuse JS rejects WebContentsView + custom session settings
  as "embedded browser". So accounts.google.com opens in a top-level
  BrowserWindow popup in a dedicated persist:google-login partition that
  we never call setProxy/setUserAgent on — it inherits Windows system
  proxy and the default Electron-tagged UA, both of which Google accepts.
  After login, .google.com/.youtube.com cookies migrate into the parent
  view's session and the view reloads to pick up the logged-in state.

Session restore: only the last-active tab attaches to the window; other
tabs load silently in the background and become instantly visible when
the user clicks them in the sidebar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-17 00:46:02 +03:00
commit 1c7bb75a05
69 changed files with 12035 additions and 0 deletions

87
README.md Normal file
View File

@@ -0,0 +1,87 @@
# ESH-Media
Десктопное приложение на Electron + React. Запускает веб-сервисы в отдельных WebContentsView, поиск и обзор фильмов через TMDB, встроенная блокировка рекламы.
## Стек
- Electron 32
- React 18 + TypeScript
- Vite
- @cliqz/adblocker-electron
## Запуск
```bash
npm install
npm run dev
```
## Сборка
```bash
# Windows (installer + zip)
npm run build:win
# Linux (AppImage + deb)
npm run build:linux
```
Артефакты в папке `release/`.
> Linux-сборку нужно запускать на Linux-машине.
## Настройка
Настройки открываются кнопкой в левом верхнем углу приложения.
### Приложения
Список сайтов, которые отображаются на главном экране в виде карточек. Для каждого можно указать:
- **Название** — отображается под иконкой
- **URL** — адрес сайта, открывается в отдельном WebContentsView
- **URL иконки** — картинка для карточки (необязательно)
- **Прокси** — использовать ли прокси для этого сайта (переключатель включается отдельно для каждого)
### Прокси
Приложение поддерживает HTTP/HTTPS/SOCKS5 прокси. Настраивается в разделе "Прокси" — указываешь хост и порт. Прокси применяется не глобально, а поприложенно: для каждого сайта в списке есть отдельный переключатель. Это позволяет, например, открывать заблокированные сайты через прокси, а остальные — напрямую.
Конфигурация прокси сохраняется в файл `~/.ESH-Media.json` и применяется при следующем запуске автоматически.
### Поиск фильмов
- **TMDB API Key** — ключ для поиска метаданных, постеров и обзора по фильтрам. Получить бесплатно на [themoviedb.org](https://www.themoviedb.org/settings/api). Поддерживаются как обычные API-ключи, так и Bearer-токены.
- **Сайты** — список фильмовых сайтов, на которых будет производиться поиск после выбора фильма из TMDB. Поддерживаются движки DLE (kinogo, lordfilm и зеркала), HDRezka, Filmix. Тип определяется автоматически по домену.
Если раздел "Сайты" пустой, приложение попробует использовать подходящие сайты из раздела "Приложения".
## Конфиг
Хранится в домашней директории пользователя: `~/.ESH-Media.json`.
```json
{
"apps": [...],
"proxy": { "host": "127.0.0.1", "port": "7890" },
"movieSites": [...],
"tmdbApiKey": "...",
"bookmarks": [...]
}
```
## Структура
```
main.js — main process
preload.js — preload / IPC bridge
index.html — точка входа основного UI
loader.html — экран загрузки
dialog-error.html — диалог ошибки
dialog-confirm.html — диалог подтверждения
src/
entries/ — entry points для Vite (loader, dialogs)
components/ — React компоненты
pages/ — страницы
styles/ — стили
```