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