{"id":49479304,"url":"https://github.com/x0doit/asoplay","last_synced_at":"2026-05-07T06:01:31.718Z","repository":{"id":354907194,"uuid":"1225533724","full_name":"x0doit/asoplay","owner":"x0doit","description":"Сервис для просмотра аниме с каталогом, поиском, личными списками и интеграцией AnimeSocial.","archived":false,"fork":false,"pushed_at":"2026-05-03T22:51:16.000Z","size":1397,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T05:02:55.110Z","etag":null,"topics":["anime","anime-catalog","anime-streaming","animesocial","fastapi","mysql","proprietary-software","user-profiles","vanilla-js","watch-progress"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/x0doit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":"COPYRIGHT","agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T11:29:13.000Z","updated_at":"2026-05-03T22:50:44.000Z","dependencies_parsed_at":"2026-04-30T22:03:12.778Z","dependency_job_id":"a135aff1-4b83-4c38-9d24-4bfb44cc3cfe","html_url":"https://github.com/x0doit/asoplay","commit_stats":null,"previous_names":["x0doit/asoplay"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/x0doit/asoplay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0doit%2Fasoplay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0doit%2Fasoplay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0doit%2Fasoplay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0doit%2Fasoplay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/x0doit","download_url":"https://codeload.github.com/x0doit/asoplay/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/x0doit%2Fasoplay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32725216,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["anime","anime-catalog","anime-streaming","animesocial","fastapi","mysql","proprietary-software","user-profiles","vanilla-js","watch-progress"],"created_at":"2026-04-30T22:00:14.887Z","updated_at":"2026-05-07T06:01:31.677Z","avatar_url":"https://github.com/x0doit.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AsoPlay\n\n![Status](https://img.shields.io/badge/status-production--ready-22c55e)\n![Backend](https://img.shields.io/badge/backend-FastAPI-009688)\n![Frontend](https://img.shields.io/badge/frontend-vanilla%20JS-f7df1e)\n![Database](https://img.shields.io/badge/database-MySQL%208-4479a1)\n![License](https://img.shields.io/badge/license-proprietary-red)\n\n**Язык:** Русский | [English](#english)\n\n**AsoPlay** — сервис для просмотра аниме с каталогом тайтлов, поиском,\nSEO-страницами, плеером с несколькими источниками, личными списками,\nпрогрессом просмотра, публичными профилями и интеграцией с AnimeSocial.\nФронтенд написан на vanilla JavaScript, бэкенд работает на Python/FastAPI,\nа пользовательские данные хранятся в MySQL.\n\n\u003e Copyright © Чепела Даниэль Максимович (x0doit). Все права защищены.\n\u003e Репозиторий не является open source. Любое использование требует прямого\n\u003e письменного разрешения правообладателя.\n\n---\n\n## Содержание\n\n- [Возможности](#возможности)\n- [Архитектура](#архитектура)\n- [Стек](#стек)\n- [Развертывание владельцем](#развертывание-владельцем)\n- [Конфигурация](#конфигурация)\n- [Модель данных](#модель-данных)\n- [Безопасность](#безопасность)\n- [Авторские права и лицензия](#авторские-права-и-лицензия)\n- [English](#english)\n\n---\n\n## Возможности\n\n- **Каталог и поиск** на базе данных Jikan, AniList и Shikimori.\n- **Страницы тайтлов** `/anime/{mal_id}-{slug}/` с мета-тегами на стороне\n  сервера, Open Graph, JSON-LD, canonical URL, sitemap и `\u003cnoscript\u003e`\n  fallback для просмотра без JavaScript.\n- **Плеер с несколькими источниками** с резервным поиском по доступным\n  провайдерам и безопасной обработкой iframe `postMessage`.\n- **Интеграция AnimeSocial**: авторизация через существующую MySQL-базу\n  AnimeSocial и локальные HTTP-only сессии проекта.\n- **Личный кабинет**: избранное, продолжить просмотр, списки, статусы,\n  оценки, выбранные озвучки, настройки и приватность.\n- **Автоматические статусы списков**: auto-watching, auto-completed и\n  stale auto-dropped на основе реального прогресса просмотра.\n- **Публичные профили** со списками, которые учитывают настройки приватности,\n  и графиком активности.\n- **Прокси и кэш во время работы** для внешних API с данными и изображениями.\n- **Опциональный xray/Shadowsocks bridge** для окружений, где внешние anime API\n  недоступны напрямую.\n\n---\n\n## Архитектура\n\n```text\n.\n├── index.html                  SPA shell и SSR placeholders\n├── app.js                      публичный router, каталог, тайтл, player\n├── styles.css                  дизайн-система приложения\n├── assets/                     статические media assets\n├── js/\n│   └── account.js              auth UI, личные разделы, store, профили\n├── server/\n│   ├── main.py                 FastAPI wiring, static serving, sources\n│   ├── animesocial.py          AnimeSocial DB auth bridge и sessions\n│   ├── animesocial_config.py   AnimeSocial URL/media configuration\n│   ├── account_api.py          account compatibility API\n│   ├── user_lists.py           list/status/favorite domain и auto-rules\n│   ├── activity_log.py         contribution/activity event log\n│   ├── profile_pages.py        public profile API и SSR shell\n│   ├── title_pages.py          canonical anime pages, sitemap, robots\n│   ├── proxies.py              Jikan/AniList/Shiki/translate/image proxies\n│   ├── vpn_bridge.py           optional xray runtime bridge\n│   ├── animevost.py            native AnimeVost source adapter\n│   ├── oldyummy.py             native old.yummyani source adapter\n│   └── requirements.txt        Python runtime dependencies\n├── sql/\n│   ├── aviev-schema.sql        базовая схема aviev_*\n│   └── aviev-schema-pass2.sql  списки, приватность, активность, compatibility\n├── animesocial.json            public URL/media mapping для AnimeSocial\n├── animesocial-db.php          формат DB-конфига AnimeSocial\n├── vpn.template.json           шаблон xray-конфига\n├── .env.example                шаблон environment variables\n├── COPYRIGHT                   proprietary copyright notice\n└── .gitignore                  ignored local/runtime artifacts\n```\n\n---\n\n## Стек\n\n- **Frontend:** HTML, CSS, vanilla JavaScript ES modules.\n- **Backend:** Python 3.11+, FastAPI, Uvicorn, httpx.\n- **Database:** MySQL 8 / OpenServer-compatible AnimeSocial database.\n- **Auth:** существующая users-таблица AnimeSocial + локальные `aviev_sessions`.\n- **Metadata:** Jikan, AniList, Shikimori.\n- **Network bridge:** optional xray/Shadowsocks через `.env`.\n\n---\n\n## Развертывание владельцем\n\nЭтот раздел предназначен только для владельца проекта или лиц, получивших\nпрямое письменное разрешение. Наличие инструкций по запуску не предоставляет\nправа использовать, копировать, разворачивать или публиковать проект.\n\nУстановить Python dependencies:\n\n```bash\npip install -r server/requirements.txt\n```\n\nСоздать runtime configuration:\n\n```bash\ncopy .env.example .env\n```\n\nПрименить database schema строго по порядку:\n\n```bash\nmysql -u root AnimeSocial \u003c sql/aviev-schema.sql\nmysql -u root AnimeSocial \u003c sql/aviev-schema-pass2.sql\n```\n\nЗапустить приложение:\n\n```bash\npython -B -m server.main\n```\n\nЛокальный адрес по умолчанию:\n\n```text\nhttp://127.0.0.1:8787\n```\n\nHealth endpoint:\n\n```text\nGET /health\n```\n\nОжидаемый ответ:\n\n```json\n{\n  \"ok\": true,\n  \"sources\": [\"...\"],\n  \"vpn\": true,\n  \"db\": {\n    \"ok\": true,\n    \"aviev_schema_present\": true\n  }\n}\n```\n\n---\n\n## Конфигурация\n\nBackend читает runtime settings из `.env`, `animesocial-db.php` и\n`animesocial.json`.\n\nОсновные группы переменных:\n\n- `AV_BIND_HOST`, `AV_BIND_PORT` — адрес FastAPI.\n- `AV_SITE_URL`, `AV_SITE_NAME` — canonical SEO URLs и имя сайта.\n- `AV_ALLOWED_ORIGINS` — CORS origins для development/production.\n- `AV_DB_*` — optional DB overrides.\n- `AV_USER_*` — optional AnimeSocial users-table/column overrides.\n- `AV_AUTH_VERIFIER` — override password verification strategy.\n- `AV_COOKIE_SECURE`, `AV_COOKIE_SAMESITE`, `AV_SESSION_TTL_DAYS` — session\n  cookie behavior.\n- `AV_ANIMESOCIAL_SITE_URL` — public host override для AnimeSocial.\n- `SS_ADDRESS`, `SS_PORT`, `SS_METHOD`, `SS_PASSWORD` — optional xray outbound.\n\nProduction secrets должны храниться только на сервере. Нельзя коммитить реальные\nпароли, токены, proxy credentials, session data или приватные ключи.\n\n---\n\n## Модель данных\n\nПроект создает и использует только таблицы с префиксом `aviev_`. Существующие\nтаблицы AnimeSocial остаются источником identity и login credentials.\n\nОсновные таблицы проекта:\n\n- `aviev_sessions` — HTTP-only login sessions.\n- `aviev_user_lists` — canonical title status + favorite flag.\n- `aviev_watch_history` — continue-watching feed.\n- `aviev_episode_progress` — per-episode progress.\n- `aviev_title_ratings` — personal ratings.\n- `aviev_dub_prefs` — preferred dubbing per title.\n- `aviev_account_settings` — account toggles.\n- `aviev_privacy` — public profile privacy controls.\n- `aviev_activity` — contribution/activity graph events.\n- `aviev_title_pages` — canonical SEO title-page cache.\n- `aviev_title_refresh_queue` — title page refresh queue.\n- `aviev_import_marks` — one-time localStorage import markers.\n\n`aviev_activity` использует unique deduplication index:\n\n```sql\nUNIQUE KEY uq_act_dedup (user_id, day, kind, mal_id, meta(64))\n```\n\n---\n\n## Безопасность\n\n- Сессионные токены хранятся на сервере и передаются через HTTP-only cookies.\n- Личные API-методы доступны только при активной авторизованной сессии.\n- Публичные профили отдают данные с учетом настроек приватности пользователя.\n- Плеер принимает iframe `postMessage` только от ожидаемого окна источника.\n- Прокси ограничены конкретными сценариями для API и media-файлов.\n- `robots.txt` закрывает внутренние account/auth/proxy/source endpoints.\n\n---\n\n## Авторские права и лицензия\n\nЭтот репозиторий **не является open source**.\n\nCopyright © Чепела Даниэль Максимович (x0doit). Все права защищены.\n\nНикакая лицензия третьим лицам не предоставляется. Без прямого письменного\nразрешения правообладателя запрещено использовать, копировать, скачивать,\nзеркалировать, изменять, запускать, разворачивать, хостить, распространять,\nсублицензировать, перепродавать, публиковать, переупаковывать, использовать для\nобучения моделей, включать в datasets или создавать производные работы на основе\nэтого репозитория или любой его части.\n\nПолный proprietary notice: [`COPYRIGHT`](./COPYRIGHT).\n\nЗапросы по лицензированию: \u003chttps://crazydev.pro/\u003e\n\n---\n\n\u003ca id=\"english\"\u003e\u003c/a\u003e\n\n# AsoPlay\n\n**Language:** [Русский](#asoplay) | English\n\n**AsoPlay** is an anime viewing service with a searchable title catalog,\nSEO-ready title pages, a multi-source player, personal lists, watch progress,\npublic profiles and AnimeSocial integration. The frontend is written in vanilla\nJavaScript, the backend runs on Python/FastAPI, and user data is stored in MySQL.\n\n\u003e Copyright © Chepela Daniel Maximovich (x0doit). All rights reserved.\n\u003e This repository is not open source. Any use requires direct written permission\n\u003e from the copyright owner.\n\n---\n\n## Contents\n\n- [Features](#features)\n- [Architecture](#architecture)\n- [Stack](#stack)\n- [Owner Deployment](#owner-deployment)\n- [Configuration](#configuration)\n- [Data Model](#data-model)\n- [Security](#security)\n- [Copyright and License](#copyright-and-license)\n\n---\n\n## Features\n\n- **Catalog and search** powered by Jikan, AniList and Shikimori data.\n- **Title pages** at `/anime/{mal_id}-{slug}/` with server-rendered\n  metadata, Open Graph tags, JSON-LD, canonical URLs, sitemap support and\n  `\u003cnoscript\u003e` fallbacks.\n- **Multi-source player** with fallback search across supported anime video\n  providers and safe iframe `postMessage` handling.\n- **AnimeSocial authentication bridge** using the existing AnimeSocial MySQL\n  account database with project-local HTTP-only sessions.\n- **Personal library** with favorites, continue watching, statuses, ratings,\n  dub preferences, settings and privacy controls.\n- **Automatic list statuses** driven by real watch progress: auto-watching,\n  auto-completed and stale auto-dropped states.\n- **Public profiles** with lists that respect privacy settings and activity\n  graph rendering.\n- **Runtime proxy and cache** for external data APIs and media images.\n- **Optional xray/Shadowsocks bridge** for environments where upstream anime\n  metadata APIs are blocked.\n\n---\n\n## Architecture\n\n```text\n.\n├── index.html                  SPA shell and SSR placeholders\n├── app.js                      public router, catalog, title page, player\n├── styles.css                  application design system\n├── assets/                     static media assets\n├── js/\n│   └── account.js              auth UI, personal sections, store, profiles\n├── server/\n│   ├── main.py                 FastAPI app wiring, static serving, sources\n│   ├── animesocial.py          AnimeSocial DB auth bridge and sessions\n│   ├── animesocial_config.py   AnimeSocial URL/media configuration\n│   ├── account_api.py          account compatibility API\n│   ├── user_lists.py           list/status/favorite domain and auto-rules\n│   ├── activity_log.py         contribution/activity event log\n│   ├── profile_pages.py        public profile API and SSR shell\n│   ├── title_pages.py          canonical anime pages, sitemap, robots\n│   ├── proxies.py              Jikan/AniList/Shiki/translate/image proxies\n│   ├── vpn_bridge.py           optional xray runtime bridge\n│   ├── animevost.py            native AnimeVost source adapter\n│   ├── oldyummy.py             native old.yummyani source adapter\n│   └── requirements.txt        Python runtime dependencies\n├── sql/\n│   ├── aviev-schema.sql        base aviev_* schema\n│   └── aviev-schema-pass2.sql  lists, privacy, activity and compatibility\n├── animesocial.json            AnimeSocial public URL/media mapping\n├── animesocial-db.php          AnimeSocial DB config format\n├── vpn.template.json           xray config template\n├── .env.example                environment template\n├── COPYRIGHT                   proprietary copyright notice\n└── .gitignore                  ignored local/runtime artifacts\n```\n\n---\n\n## Stack\n\n- **Frontend:** plain HTML, CSS and JavaScript ES modules.\n- **Backend:** Python 3.11+, FastAPI, Uvicorn, httpx.\n- **Database:** MySQL 8 / OpenServer-compatible AnimeSocial database.\n- **Auth:** existing AnimeSocial users table + project-local `aviev_sessions`.\n- **Metadata:** Jikan, AniList, Shikimori.\n- **Network bridge:** optional xray/Shadowsocks through `.env`.\n\n---\n\n## Owner Deployment\n\nThis section is for the project owner and explicitly licensed operators only.\nPublishing operational instructions does not grant permission to use, copy,\ndeploy, host or redistribute the project.\n\nInstall Python dependencies:\n\n```bash\npip install -r server/requirements.txt\n```\n\nCreate runtime configuration:\n\n```bash\ncopy .env.example .env\n```\n\nApply database schema in order:\n\n```bash\nmysql -u root AnimeSocial \u003c sql/aviev-schema.sql\nmysql -u root AnimeSocial \u003c sql/aviev-schema-pass2.sql\n```\n\nStart the application:\n\n```bash\npython -B -m server.main\n```\n\nDefault local URL:\n\n```text\nhttp://127.0.0.1:8787\n```\n\nHealth endpoint:\n\n```text\nGET /health\n```\n\nExpected response:\n\n```json\n{\n  \"ok\": true,\n  \"sources\": [\"...\"],\n  \"vpn\": true,\n  \"db\": {\n    \"ok\": true,\n    \"aviev_schema_present\": true\n  }\n}\n```\n\n---\n\n## Configuration\n\nThe backend reads runtime settings from `.env`, `animesocial-db.php` and\n`animesocial.json`.\n\nImportant environment groups:\n\n- `AV_BIND_HOST`, `AV_BIND_PORT` — FastAPI bind address.\n- `AV_SITE_URL`, `AV_SITE_NAME` — canonical SEO URLs and site name.\n- `AV_ALLOWED_ORIGINS` — CORS origins for development or production.\n- `AV_DB_*` — optional DB overrides.\n- `AV_USER_*` — optional AnimeSocial users-table/column overrides.\n- `AV_AUTH_VERIFIER` — password verification strategy override.\n- `AV_COOKIE_SECURE`, `AV_COOKIE_SAMESITE`, `AV_SESSION_TTL_DAYS` — session\n  cookie behavior.\n- `AV_ANIMESOCIAL_SITE_URL` — AnimeSocial public host override.\n- `SS_ADDRESS`, `SS_PORT`, `SS_METHOD`, `SS_PASSWORD` — optional xray outbound.\n\nProduction secrets must stay outside Git. Never commit real passwords, tokens,\nprivate proxy credentials, session data or private keys.\n\n---\n\n## Data Model\n\nThe application creates and owns only tables with the `aviev_` prefix. Existing\nAnimeSocial tables remain the source of identity and login credentials.\n\nCore project tables:\n\n- `aviev_sessions` — HTTP-only login sessions.\n- `aviev_user_lists` — canonical title status + favorite flag.\n- `aviev_watch_history` — continue-watching feed.\n- `aviev_episode_progress` — per-episode progress.\n- `aviev_title_ratings` — personal ratings.\n- `aviev_dub_prefs` — preferred dubbing per title.\n- `aviev_account_settings` — account toggles.\n- `aviev_privacy` — public profile privacy controls.\n- `aviev_activity` — contribution/activity graph events.\n- `aviev_title_pages` — canonical SEO title-page cache.\n- `aviev_title_refresh_queue` — title page refresh queue.\n- `aviev_import_marks` — one-time localStorage import markers.\n\n`aviev_activity` uses a unique deduplication index:\n\n```sql\nUNIQUE KEY uq_act_dedup (user_id, day, kind, mal_id, meta(64))\n```\n\n---\n\n## Security\n\n- Session tokens are stored on the server and sent through HTTP-only cookies.\n- Private account endpoints require authenticated sessions.\n- Public profile endpoints enforce privacy rules on the server.\n- The player accepts iframe `postMessage` events only from the expected source\n  window.\n- Proxy endpoints are constrained to specific API/media scenarios.\n- `robots.txt` blocks internal account/auth/proxy/source endpoints.\n\n---\n\n## Copyright and License\n\nThis repository is **not open source**.\n\nCopyright © Chepela Daniel Maximovich (x0doit). All rights reserved.\n\nNo license is granted to any third party. Without direct written permission from\nthe copyright owner, no person or organization may use, copy, download, mirror,\nmodify, run, deploy, host, distribute, sublicense, resell, publish, repackage,\ntrain on, index into a dataset, or create derivative works from this repository\nor any part of it.\n\nFull proprietary notice: [`COPYRIGHT`](./COPYRIGHT).\n\nLicensing inquiries: \u003chttps://crazydev.pro/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx0doit%2Fasoplay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fx0doit%2Fasoplay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fx0doit%2Fasoplay/lists"}