添加跳过配置功能,包括数据库和API支持,更新播放器以处理跳过片段
This commit is contained in:
+63
-1
@@ -3,7 +3,7 @@
|
||||
import { Redis } from '@upstash/redis';
|
||||
|
||||
import { AdminConfig } from './admin.types';
|
||||
import { Favorite, IStorage, PlayRecord } from './types';
|
||||
import { EpisodeSkipConfig, Favorite, IStorage, PlayRecord } from './types';
|
||||
|
||||
// 搜索历史最大条数
|
||||
const SEARCH_HISTORY_LIMIT = 20;
|
||||
@@ -267,6 +267,68 @@ export class UpstashRedisStorage implements IStorage {
|
||||
async setAdminConfig(config: AdminConfig): Promise<void> {
|
||||
await withRetry(() => this.client.set(this.adminConfigKey(), config));
|
||||
}
|
||||
|
||||
// 跳过配置相关
|
||||
private skipConfigKey(userName: string, key: string): string {
|
||||
return `katelyatv:skip_config:${userName}:${key}`;
|
||||
}
|
||||
|
||||
private skipConfigsKey(userName: string): string {
|
||||
return `katelyatv:skip_configs:${userName}`;
|
||||
}
|
||||
|
||||
async getSkipConfig(
|
||||
userName: string,
|
||||
key: string
|
||||
): Promise<EpisodeSkipConfig | null> {
|
||||
const data = await withRetry(() =>
|
||||
this.client.get(this.skipConfigKey(userName, key))
|
||||
);
|
||||
return data ? (data as EpisodeSkipConfig) : null;
|
||||
}
|
||||
|
||||
async setSkipConfig(
|
||||
userName: string,
|
||||
key: string,
|
||||
config: EpisodeSkipConfig
|
||||
): Promise<void> {
|
||||
await withRetry(async () => {
|
||||
// 保存到独立的key
|
||||
await this.client.set(this.skipConfigKey(userName, key), config);
|
||||
// 同时加入到用户的跳过配置集合中
|
||||
await this.client.sadd(this.skipConfigsKey(userName), key);
|
||||
});
|
||||
}
|
||||
|
||||
async getAllSkipConfigs(
|
||||
userName: string
|
||||
): Promise<{ [key: string]: EpisodeSkipConfig }> {
|
||||
const keys = await withRetry(() =>
|
||||
this.client.smembers(this.skipConfigsKey(userName))
|
||||
);
|
||||
|
||||
const configs: { [key: string]: EpisodeSkipConfig } = {};
|
||||
|
||||
for (const key of ensureStringArray(keys || [])) {
|
||||
const data = await withRetry(() =>
|
||||
this.client.get(this.skipConfigKey(userName, key))
|
||||
);
|
||||
if (data) {
|
||||
configs[key] = data as EpisodeSkipConfig;
|
||||
}
|
||||
}
|
||||
|
||||
return configs;
|
||||
}
|
||||
|
||||
async deleteSkipConfig(userName: string, key: string): Promise<void> {
|
||||
await withRetry(async () => {
|
||||
// 删除独立的key
|
||||
await this.client.del(this.skipConfigKey(userName, key));
|
||||
// 从用户的跳过配置集合中移除
|
||||
await this.client.srem(this.skipConfigsKey(userName), key);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 单例 Upstash Redis 客户端
|
||||
|
||||
Reference in New Issue
Block a user