Skip to content

Commit 773f0f3

Browse files
committed
Merge VideoTogether website integration
Closes #132
2 parents 48ad9bc + 9c3a984 commit 773f0f3

4 files changed

Lines changed: 77 additions & 1 deletion

File tree

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
- **全屏模式选择**:支持系统全屏和网页全屏两种模式
4848
- **代理播放**:三种代理模式(智能重试、仅直连、总是代理),灵活应对不同网络环境
4949
- **卡顿检测**:自动检测播放卡顿并提示
50+
- **一起看 (VideoTogether)**:播放器页面内置官方网页集成脚本,可直接创建或加入房间与朋友同步观看
5051
- **键盘快捷键**:空格/K 播放暂停、F 全屏、M 静音、P 画中画、J/L/方向键 快进快退、上下键 音量调节
5152

5253
### 多源并行搜索
@@ -473,6 +474,28 @@ docker run -d -p 3000:3000 \
473474

474475
> 用户还可以在设置页面的「弹幕 API」区域添加多个 API 端点并选择当前使用的,用户选择的 API 优先于系统默认配置。
475476
477+
## 一起看 (VideoTogether) 配置
478+
479+
播放器页面和 IPTV 页面默认内置 [VideoTogether](https://videotogether.github.io/zh-cn/guide/website.html) 官方网页集成脚本,进入播放页后即可直接使用一起看功能。
480+
481+
| 变量名 | 说明 | 默认值 |
482+
|--------|------|--------|
483+
| `VIDEOTOGETHER_ENABLED` | 设为 `false` 时禁用一起看集成 | `true` |
484+
| `VIDEOTOGETHER_SCRIPT_URL` | 自定义 VideoTogether 脚本地址,适合自托管或替换 CDN | `https://fastly.jsdelivr.net/gh/VideoTogether/VideoTogether@latest/release/extension.website.user.js` |
485+
| `VIDEOTOGETHER_SETTING_URL` | 自定义 VideoTogether 设置页地址,对应官方 `window.videoTogetherWebsiteSettingUrl` 接口 | - |
486+
487+
**示例:**
488+
489+
```bash
490+
# Docker
491+
docker run -d -p 3000:3000 \
492+
-e VIDEOTOGETHER_SCRIPT_URL="https://your-domain.example.com/extension.website.user.js" \
493+
-e VIDEOTOGETHER_SETTING_URL="https://your-domain.example.com/videotogether-settings.html" \
494+
--name kvideo kuekhaoyang/kvideo:latest
495+
```
496+
497+
> 如果部署环境无法稳定访问 jsDelivr,直接自托管 `extension.website.user.js` 并通过 `VIDEOTOGETHER_SCRIPT_URL` 指向自己的地址即可。
498+
476499
## IPTV 直播源配置
477500

478501
通过环境变量预设 IPTV 直播源,应用启动时会自动添加到直播源列表中。
@@ -612,6 +635,9 @@ docker run -e PORT=8080 -p 8080:8080 --name kvideo kuekhaoyang/kvideo:latest
612635
| `AD_KEYWORDS` / `NEXT_PUBLIC_AD_KEYWORDS` | 广告过滤关键词 | - |
613636
| `AD_KEYWORDS_FILE` | 广告关键词文件路径 | - |
614637
| `DANMAKU_API_URL` / `NEXT_PUBLIC_DANMAKU_API_URL` | 弹幕聚合 API 地址 | - |
638+
| `VIDEOTOGETHER_ENABLED` | 是否启用 VideoTogether 一起看集成(`false` 时关闭) | `true` |
639+
| `VIDEOTOGETHER_SCRIPT_URL` | VideoTogether 脚本地址 | `https://fastly.jsdelivr.net/gh/VideoTogether/VideoTogether@latest/release/extension.website.user.js` |
640+
| `VIDEOTOGETHER_SETTING_URL` | VideoTogether 设置页地址 | - |
615641
| `UPSTASH_REDIS_REST_URL` | Upstash Redis REST URL(跨设备同步:配置、历史、收藏) | - |
616642
| `UPSTASH_REDIS_REST_TOKEN` | Upstash Redis REST Token | - |
617643

app/iptv/layout.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { VideoTogetherScript } from '@/components/VideoTogetherScript';
2+
3+
export default function IPTVLayout({
4+
children,
5+
}: {
6+
children: React.ReactNode;
7+
}) {
8+
return (
9+
<>
10+
{children}
11+
<VideoTogetherScript />
12+
</>
13+
);
14+
}

app/player/layout.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Metadata } from 'next';
2+
import { VideoTogetherScript } from '@/components/VideoTogetherScript';
23

34
export const metadata: Metadata = {
45
referrer: 'no-referrer',
@@ -9,5 +10,10 @@ export default function PlayerLayout({
910
}: {
1011
children: React.ReactNode;
1112
}) {
12-
return children;
13+
return (
14+
<>
15+
{children}
16+
<VideoTogetherScript />
17+
</>
18+
);
1319
}

components/VideoTogetherScript.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import Script from 'next/script';
2+
3+
const DEFAULT_VIDEOTOGETHER_SCRIPT_URL =
4+
'https://fastly.jsdelivr.net/gh/VideoTogether/VideoTogether@latest/release/extension.website.user.js';
5+
6+
export function VideoTogetherScript() {
7+
if (process.env.VIDEOTOGETHER_ENABLED === 'false') {
8+
return null;
9+
}
10+
11+
const scriptUrl = process.env.VIDEOTOGETHER_SCRIPT_URL?.trim() || DEFAULT_VIDEOTOGETHER_SCRIPT_URL;
12+
const settingUrl = process.env.VIDEOTOGETHER_SETTING_URL?.trim();
13+
14+
return (
15+
<>
16+
{settingUrl ? (
17+
<script
18+
dangerouslySetInnerHTML={{
19+
__html: `window.videoTogetherWebsiteSettingUrl = ${JSON.stringify(settingUrl)};`,
20+
}}
21+
/>
22+
) : null}
23+
<Script
24+
id="videotogether-script"
25+
src={scriptUrl}
26+
strategy="afterInteractive"
27+
/>
28+
</>
29+
);
30+
}

0 commit comments

Comments
 (0)