xref: /MusicFree/src/core/mediaCache.ts (revision 43eb30bf16ea88ab8e3cdff98faf307c8c8f93d3)
1*43eb30bfS猫头猫import getOrCreateMMKV from '@/utils/getOrCreateMMKV';
2*43eb30bfS猫头猫import {getMediaKey} from '@/utils/mediaItem';
3*43eb30bfS猫头猫import safeParse from '@/utils/safeParse';
4*43eb30bfS猫头猫
5*43eb30bfS猫头猫// Internal Method
6*43eb30bfS猫头猫const mediaCacheStore = getOrCreateMMKV('cache.MediaCache', true);
7*43eb30bfS猫头猫
8*43eb30bfS猫头猫// 最多缓存1000条数据
9*43eb30bfS猫头猫const maxCacheCount = 800;
10*43eb30bfS猫头猫
11*43eb30bfS猫头猫/** 获取meta信息 */
12*43eb30bfS猫头猫const getMediaCache = (mediaItem: ICommon.IMediaBase) => {
13*43eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
14*43eb30bfS猫头猫        const cacheMediaItem = mediaCacheStore.getString(
15*43eb30bfS猫头猫            getMediaKey(mediaItem),
16*43eb30bfS猫头猫        );
17*43eb30bfS猫头猫        return cacheMediaItem
18*43eb30bfS猫头猫            ? safeParse<ICommon.IMediaBase>(cacheMediaItem)
19*43eb30bfS猫头猫            : null;
20*43eb30bfS猫头猫    }
21*43eb30bfS猫头猫
22*43eb30bfS猫头猫    return null;
23*43eb30bfS猫头猫};
24*43eb30bfS猫头猫
25*43eb30bfS猫头猫/** 设置meta信息 */
26*43eb30bfS猫头猫const setMediaCache = (mediaItem: ICommon.IMediaBase) => {
27*43eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
28*43eb30bfS猫头猫        const allKeys = mediaCacheStore.getAllKeys();
29*43eb30bfS猫头猫        if (allKeys.length >= maxCacheCount) {
30*43eb30bfS猫头猫            // TODO: 随机删一半
31*43eb30bfS猫头猫            for (let i = 0; i < maxCacheCount / 2; ++i) {
32*43eb30bfS猫头猫                mediaCacheStore.delete(allKeys[i]);
33*43eb30bfS猫头猫            }
34*43eb30bfS猫头猫        }
35*43eb30bfS猫头猫
36*43eb30bfS猫头猫        mediaCacheStore.set(getMediaKey(mediaItem), JSON.stringify(mediaItem));
37*43eb30bfS猫头猫        return true;
38*43eb30bfS猫头猫    }
39*43eb30bfS猫头猫
40*43eb30bfS猫头猫    return false;
41*43eb30bfS猫头猫};
42*43eb30bfS猫头猫
43*43eb30bfS猫头猫/** 移除缓存信息 */
44*43eb30bfS猫头猫const removeMediaCache = (mediaItem: ICommon.IMediaBase) => {
45*43eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
46*43eb30bfS猫头猫        mediaCacheStore.delete(getMediaKey(mediaItem));
47*43eb30bfS猫头猫    }
48*43eb30bfS猫头猫
49*43eb30bfS猫头猫    return false;
50*43eb30bfS猫头猫};
51*43eb30bfS猫头猫
52*43eb30bfS猫头猫const MediaCache = {
53*43eb30bfS猫头猫    getMediaCache,
54*43eb30bfS猫头猫    setMediaCache,
55*43eb30bfS猫头猫    removeMediaCache,
56*43eb30bfS猫头猫};
57*43eb30bfS猫头猫
58*43eb30bfS猫头猫export default MediaCache;
59