119 lines
2.7 KiB
TypeScript
119 lines
2.7 KiB
TypeScript
// 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()
|