更新:课程视频播放改成原生video组件
This commit is contained in:
118
utils/videoStorage.ts
Normal file
118
utils/videoStorage.ts
Normal file
@@ -0,0 +1,118 @@
|
||||
// utils/videoStorage.ts
|
||||
|
||||
interface VideoPosition {
|
||||
id: number
|
||||
time: number
|
||||
updateTime: string
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
/**
|
||||
* 视频播放位置本地存储服务
|
||||
*/
|
||||
class VideoStorageService {
|
||||
private readonly STORAGE_KEY = 'videoOssList'
|
||||
private readonly MAX_STORAGE_COUNT = 50
|
||||
|
||||
/**
|
||||
* 获取视频播放位置
|
||||
* @param videoId 视频ID
|
||||
* @returns 播放位置(秒)或 null
|
||||
*/
|
||||
getVideoPosition(videoId: number): number | null {
|
||||
const list = this.getVideoList()
|
||||
const video = list.find((v) => v.id === videoId)
|
||||
return video?.time || null
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存视频播放位置
|
||||
* @param videoId 视频ID
|
||||
* @param time 播放位置(秒)
|
||||
* @param videoData 视频数据
|
||||
*/
|
||||
saveVideoPosition(videoId: number, time: number, videoData: any): void {
|
||||
const list = this.getVideoList()
|
||||
const index = list.findIndex((v) => v.id === videoId)
|
||||
|
||||
const newItem = {
|
||||
...videoData,
|
||||
id: videoId,
|
||||
time,
|
||||
updateTime: new Date().toISOString()
|
||||
}
|
||||
|
||||
if (index >= 0) {
|
||||
list[index] = newItem
|
||||
} else {
|
||||
list.push(newItem)
|
||||
}
|
||||
|
||||
this.setVideoList(list)
|
||||
|
||||
// 自动清理旧数据
|
||||
this.cleanOldData()
|
||||
}
|
||||
|
||||
/**
|
||||
* 清理旧数据(保留最近 50 个)
|
||||
*/
|
||||
cleanOldData(): void {
|
||||
const list = this.getVideoList()
|
||||
|
||||
if (list.length > this.MAX_STORAGE_COUNT) {
|
||||
// 按更新时间排序,保留最新的
|
||||
const sorted = list.sort((a, b) => {
|
||||
const timeA = new Date(b.updateTime || 0).getTime()
|
||||
const timeB = new Date(a.updateTime || 0).getTime()
|
||||
return timeA - timeB
|
||||
})
|
||||
|
||||
this.setVideoList(sorted.slice(0, this.MAX_STORAGE_COUNT))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除指定视频的播放位置
|
||||
* @param videoId 视频ID
|
||||
*/
|
||||
clearVideoPosition(videoId: number): void {
|
||||
const list = this.getVideoList()
|
||||
const filtered = list.filter((v) => v.id !== videoId)
|
||||
this.setVideoList(filtered)
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除所有播放位置
|
||||
*/
|
||||
clearAll(): void {
|
||||
uni.removeStorageSync(this.STORAGE_KEY)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取视频列表
|
||||
*/
|
||||
private getVideoList(): VideoPosition[] {
|
||||
try {
|
||||
const data = uni.getStorageSync(this.STORAGE_KEY)
|
||||
return data ? JSON.parse(data) : []
|
||||
} catch (error) {
|
||||
console.error('Failed to get video list from storage:', error)
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置视频列表
|
||||
*/
|
||||
private setVideoList(list: VideoPosition[]): void {
|
||||
try {
|
||||
uni.setStorageSync(this.STORAGE_KEY, JSON.stringify(list))
|
||||
} catch (error) {
|
||||
console.error('Failed to set video list to storage:', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 导出单例
|
||||
export const videoStorage = new VideoStorageService()
|
||||
Reference in New Issue
Block a user