Files
taimed-international-app/utils/videoStorage.ts

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()