From f6508eccdb23a7e4bdefa3a4fa7e0ef86df5447e Mon Sep 17 00:00:00 2001 From: lingyunxsh Date: Mon, 15 Jun 2026 22:46:12 +0800 Subject: [PATCH] init --- .dockerignore | 6 + .gitignore | 24 + README.md | 103 +++ config/server.json | 30 + config/server.local.json | 30 + docker-compose.yml | 21 + docs/first-version-plan.md | 717 ++++++++++++++++++ hbuilder_app/App.vue | 13 + hbuilder_app/common/api.js | 29 + hbuilder_app/common/device.js | 8 + hbuilder_app/common/player.js | 71 ++ hbuilder_app/common/sync.js | 52 ++ hbuilder_app/main.js | 7 + hbuilder_app/manifest.json | 31 + .../nativeplugins/SyncTV-VLC/README.md | 57 ++ hbuilder_app/pages.json | 16 + hbuilder_app/pages/index/index.vue | 305 ++++++++ server/Dockerfile | 19 + server/cmd/synctv-server/main.go | 77 ++ server/go.mod | 13 + server/go.sum | 12 + server/internal/config/config.go | 123 +++ server/internal/config/duration.go | 31 + server/internal/httpapi/server.go | 120 +++ server/internal/proxy/proxy.go | 112 +++ server/internal/room/model.go | 80 ++ server/internal/room/service.go | 139 ++++ server/internal/store/redis.go | 82 ++ server/internal/ws/hub.go | 285 +++++++ windows_py_client/README_CLIENT.md | 17 + windows_py_client/build_exe.ps1 | 13 + windows_py_client/requirements.txt | 5 + windows_py_client/synctv_client/__init__.py | 1 + windows_py_client/synctv_client/api_client.py | 24 + .../synctv_client/device_store.py | 19 + windows_py_client/synctv_client/main.py | 269 +++++++ windows_py_client/synctv_client/models.py | 108 +++ .../synctv_client/sync_client.py | 64 ++ 38 files changed, 3133 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 README.md create mode 100644 config/server.json create mode 100644 config/server.local.json create mode 100644 docker-compose.yml create mode 100644 docs/first-version-plan.md create mode 100644 hbuilder_app/App.vue create mode 100644 hbuilder_app/common/api.js create mode 100644 hbuilder_app/common/device.js create mode 100644 hbuilder_app/common/player.js create mode 100644 hbuilder_app/common/sync.js create mode 100644 hbuilder_app/main.js create mode 100644 hbuilder_app/manifest.json create mode 100644 hbuilder_app/nativeplugins/SyncTV-VLC/README.md create mode 100644 hbuilder_app/pages.json create mode 100644 hbuilder_app/pages/index/index.vue create mode 100644 server/Dockerfile create mode 100644 server/cmd/synctv-server/main.go create mode 100644 server/go.mod create mode 100644 server/go.sum create mode 100644 server/internal/config/config.go create mode 100644 server/internal/config/duration.go create mode 100644 server/internal/httpapi/server.go create mode 100644 server/internal/proxy/proxy.go create mode 100644 server/internal/room/model.go create mode 100644 server/internal/room/service.go create mode 100644 server/internal/store/redis.go create mode 100644 server/internal/ws/hub.go create mode 100644 windows_py_client/README_CLIENT.md create mode 100644 windows_py_client/build_exe.ps1 create mode 100644 windows_py_client/requirements.txt create mode 100644 windows_py_client/synctv_client/__init__.py create mode 100644 windows_py_client/synctv_client/api_client.py create mode 100644 windows_py_client/synctv_client/device_store.py create mode 100644 windows_py_client/synctv_client/main.py create mode 100644 windows_py_client/synctv_client/models.py create mode 100644 windows_py_client/synctv_client/sync_client.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f05a008 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.idea +client_flutter/build +server/bin +**/.dart_tool +**/.packages +**/node_modules diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..66a7fb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +.idea/ + +# Go +server/synctv-server +server/synctv-server.exe +server/bin/ + +# Local env +.env + +# Local toolchains and downloaded SDK archives +.tools/ +flutter_windows_*.zip + +# Python Windows client +windows_py_client/.venv/ +windows_py_client/build/ +windows_py_client/dist/ +windows_py_client/*.spec +windows_py_client/**/__pycache__/ +windows_py_client/**/*.pyc + +# HBuilder +hbuilder_app/unpackage/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..6601859 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# SyncTV + +SyncTV is a no-account synchronized watching app. The first version keeps the server thin: room state, WebSocket signaling, Redis-backed temporary state, and optional streaming proxy when the room owner enables it. + +## Quick Start + +```bash +docker compose up --build +``` + +Server: + +- HTTP: `http://yuyun-us1.stormrain.cn:8088` +- WebSocket: `ws://yuyun-us1.stormrain.cn:8088/ws?roomCode=&deviceId=` +- Health: `GET /health` + +## Local Server + +```bash +cd server +$env:SYNCTV_CONFIG="../config/server.local.json" +go run ./cmd/synctv-server +``` + +Create a local config with Redis pointing at your local Redis instance. + +## HTTP API + +- `GET /health` +- `POST /api/rooms` +- `GET /api/rooms/{code}?deviceId={deviceId}` +- `POST /api/rooms/{code}/source` with `X-Device-Id` +- `GET /api/rooms/{code}/stream` for proxy mode playback + +## WebSocket + +Connect: + +```text +ws://yuyun-us1.stormrain.cn:8088/ws?roomCode=A7K29Q&deviceId=dev_xxx +``` + +Client events: + +- `setSource` +- `play` +- `pause` +- `seek` +- `syncProgress` +- `syncToLive` +- `heartbeat` + +Server events: + +- `roomSnapshot` +- `sourceChanged` +- `playbackChanged` +- `presenceChanged` +- `heartbeatAck` +- `error` + +## Clients + +The product is split by platform. + +### Windows + +Windows source lives in `windows_py_client`. + +Required tools: + +- Python 3.11+ +- VLC 64-bit runtime + +Run: + +```powershell +cd windows_py_client +python -m venv .venv +.\.venv\Scripts\pip install -r requirements.txt +.\.venv\Scripts\python synctv_client\main.py +``` + +Build exe: + +```powershell +.\build_exe.ps1 +``` + +The Windows client uses PySide6 + python-vlc. + +### App + +HBuilder/uni-app source lives in `hbuilder_app`. + +Open `hbuilder_app` in HBuilderX and run/build as an App project. + +Playback direction: + +- Development fallback: built-in `