@sweet-player/core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,130 @@
1
+ # @sweet-player/core
2
+
3
+ 基于 hls.js 的自定义视频播放器,核心零框架依赖,TypeScript 编写,支持原生 JS / React / Vue。
4
+
5
+ > React 封装见 [@sweet-player/react](https://www.npmjs.com/package/@sweet-player/react),Vue 封装见 [@sweet-player/vue](https://www.npmjs.com/package/@sweet-player/vue)。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ npm install @sweet-player/core
11
+ ```
12
+
13
+ 或通过 `<script>` 标签引入 IIFE 版:
14
+
15
+ ```html
16
+ <script src="https://unpkg.com/@sweet-player/core/dist/sweet-player.global.js"></script>
17
+ <script>
18
+ const player = new SweetPlayer.SweetPlayer({ container: '#player', src: '...' });
19
+ </script>
20
+ ```
21
+
22
+ ## 使用
23
+
24
+ ```ts
25
+ import { SweetPlayer } from '@sweet-player/core';
26
+
27
+ const player = new SweetPlayer({
28
+ container: '#player', // 元素或选择器
29
+ src: 'https://example.com/video.m3u8',
30
+ title: '影片标题',
31
+ id: 'ep-01', // 传入后自动断点续播
32
+ volume: 80, // 0-100(localStorage 偏好优先)
33
+ seekStep: 10, // 快进快退秒数
34
+ longSeek: { steps: [10, 30, 60], stepUpInterval: 2000 },
35
+ playbackRates: [0.5, 1, 1.5, 2],
36
+ autoQuality: true, // 默认 true:自动读取 hls levels 填充画质菜单(含"自动"档)
37
+ persist: true, // 默认 true:记忆音量/静音/倍速
38
+ autoNext: 5, // 播完 5 秒倒计时自动下一个(需配合 onNext)
39
+ locale: 'zh-CN', // 内置 zh-CN / en,registerLocale 可扩展
40
+ onPrev: () => {},
41
+ onNext: () => {},
42
+ onQualityChange: (q) => {},
43
+ onAudioTrackChange: (t) => {},
44
+ });
45
+
46
+ player.on('timeupdate', ({ currentTime, duration }) => {});
47
+ player.destroy();
48
+ ```
49
+
50
+ ## 功能
51
+
52
+ - **完整 UI 控件**:播放/暂停、快进退、进度条(拖拽+缓冲)、倍速、画质、画面比例、音轨、音量、全屏、画中画
53
+ - **键盘快捷键**:空格播放暂停、方向键 seek(长按阶梯加速 10→30→60 秒/秒)、↑↓ 音量、F 全屏、M 静音
54
+ - **触屏手势**:横滑 seek、右半屏竖滑音量、双击快进退/全屏、单击切换控制栏
55
+ - **画质自动接入**:HLS 多档画质/音轨自动填充菜单,也支持业务自定义列表
56
+ - **偏好持久化**:音量/倍速 localStorage 记忆;传 `id` 后断点续播
57
+ - **状态蒙层**:缓冲转圈、错误重试、结束重播+自动连播倒计时
58
+ - **i18n**:内置 zh-CN/en,支持自定义语言
59
+ - **插件机制**:`plugins` 选项或 `player.use(plugin)` 运行时安装
60
+ - **主题定制**:CSS 变量覆盖,如 `--sp-accent`
61
+ - **右键菜单**:屏蔽原生菜单,内置"更新记录(当前版本,跳转 npm)"、"视频信息(YouTube 风格统计面板)"、"快捷键(键位说明面板)"
62
+ - **按需隐藏**:`hiddenControls: ['ratio', 'audioTrack', ...]` 收集不显示的功能,默认全显示(只影响 UI,不影响 API 与快捷键)
63
+
64
+ ## 画质 / 音轨
65
+
66
+ - **自动模式(默认)**:HLS 流有多档画质/音轨时自动填充菜单,选择"自动"由 hls.js ABR 决定。
67
+ - **业务模式**:传入 `qualities` / `audioTracks` 列表则以业务为准,切换通过回调通知;运行时可用 `setQualities()` / `setAudioTracks()` 更新。
68
+
69
+ ## 插件
70
+
71
+ ```ts
72
+ import type { SweetPlayerPlugin } from '@sweet-player/core';
73
+
74
+ const myPlugin: SweetPlayerPlugin = {
75
+ name: 'my-plugin',
76
+ apply(player) {
77
+ // player.video / player.container / player.on 可用
78
+ return () => { /* destroy 时清理 */ };
79
+ },
80
+ };
81
+
82
+ new SweetPlayer({ ..., plugins: [myPlugin] });
83
+ // 或运行时:player.use(myPlugin);
84
+ ```
85
+
86
+ ### 接入 sweet-subtitle 字幕
87
+
88
+ 插件工厂持有字幕实例并对外暴露切换 API,运行时换字幕无需重建播放器:
89
+
90
+ ```ts
91
+ import { SweetSubtitle } from 'sweet-subtitle';
92
+ import type { SweetPlayerPlugin } from '@sweet-player/core';
93
+
94
+ function createSubtitlePlugin(src?: string) {
95
+ let sub: SweetSubtitle | null = null;
96
+ const plugin: SweetPlayerPlugin = {
97
+ name: 'sweet-subtitle',
98
+ apply(player) {
99
+ sub = new SweetSubtitle(player.video, src ? { src } : {});
100
+ return () => { sub?.destroy(); sub = null; }; // 播放器 destroy 时自动清理
101
+ },
102
+ };
103
+ return {
104
+ plugin,
105
+ load: (url: string) => sub?.loadFromUrl(url), // 切换字幕
106
+ show: () => sub?.show(),
107
+ hide: () => sub?.hide(),
108
+ setOffset: (s: number) => sub?.setOffset(s),
109
+ };
110
+ }
111
+
112
+ const subtitle = createSubtitlePlugin('/subs/ep-01.ass');
113
+ const player = new SweetPlayer({ ..., plugins: [subtitle.plugin] });
114
+
115
+ // 随时换字幕 / 关字幕,播放器不动
116
+ await subtitle.load('/subs/ep-02.ass');
117
+ subtitle.hide();
118
+ ```
119
+
120
+ 不想用插件的话也可以完全独立管理:`new SweetSubtitle(player.video, ...)` 拿到实例自己持有,只需在销毁播放器前调用 `sub.destroy()`。
121
+
122
+ ## 实例 API
123
+
124
+ `play()` `pause()` `toggle()` `seek(t)` `seekBy(±s)` `setRate(r)` `setVolume(0-100)` `setMuted(b)` `setAspectRatio(r)` `setQualities(list)` `setAudioTracks(list)` `toggleFullscreen()` `togglePip()` `load(src)` `setTitle(s)` `use(plugin)` `on/off(event, fn)` `destroy()`
125
+
126
+ 事件:`ready` `play` `pause` `ended` `timeupdate` `ratechange` `volumechange` `fullscreenchange` `pipchange` `aspectratiochange` `qualitychange` `audiotrackchange` `error` `destroy`
127
+
128
+ ## License
129
+
130
+ MIT