xref: /MusicFree/src/core/mediaCache.ts (revision 6e000b9998608a65a4fb0f4cc1aee5067e172a2d)
1*6e000b99S猫头猫import {addFileScheme} from '@/utils/fileUtils';
243eb30bfS猫头猫import getOrCreateMMKV from '@/utils/getOrCreateMMKV';
343eb30bfS猫头猫import {getMediaKey} from '@/utils/mediaItem';
443eb30bfS猫头猫import safeParse from '@/utils/safeParse';
5*6e000b99S猫头猫import {exists, unlink} from 'react-native-fs';
643eb30bfS猫头猫
743eb30bfS猫头猫// Internal Method
843eb30bfS猫头猫const mediaCacheStore = getOrCreateMMKV('cache.MediaCache', true);
943eb30bfS猫头猫
1043eb30bfS猫头猫// 最多缓存1000条数据
1143eb30bfS猫头猫const maxCacheCount = 800;
1243eb30bfS猫头猫
1343eb30bfS猫头猫/** 获取meta信息 */
1443eb30bfS猫头猫const getMediaCache = (mediaItem: ICommon.IMediaBase) => {
1543eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
1643eb30bfS猫头猫        const cacheMediaItem = mediaCacheStore.getString(
1743eb30bfS猫头猫            getMediaKey(mediaItem),
1843eb30bfS猫头猫        );
1943eb30bfS猫头猫        return cacheMediaItem
2043eb30bfS猫头猫            ? safeParse<ICommon.IMediaBase>(cacheMediaItem)
2143eb30bfS猫头猫            : null;
2243eb30bfS猫头猫    }
2343eb30bfS猫头猫
2443eb30bfS猫头猫    return null;
2543eb30bfS猫头猫};
2643eb30bfS猫头猫
2743eb30bfS猫头猫/** 设置meta信息 */
2843eb30bfS猫头猫const setMediaCache = (mediaItem: ICommon.IMediaBase) => {
2943eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
3043eb30bfS猫头猫        const allKeys = mediaCacheStore.getAllKeys();
3143eb30bfS猫头猫        if (allKeys.length >= maxCacheCount) {
3243eb30bfS猫头猫            // TODO: 随机删一半
3343eb30bfS猫头猫            for (let i = 0; i < maxCacheCount / 2; ++i) {
34*6e000b99S猫头猫                const rawCacheMedia = mediaCacheStore.getString(allKeys[i]);
35*6e000b99S猫头猫                const cacheData = rawCacheMedia
36*6e000b99S猫头猫                    ? safeParse(rawCacheMedia)
37*6e000b99S猫头猫                    : null;
38*6e000b99S猫头猫                clearLocalCaches(cacheData);
39*6e000b99S猫头猫
4043eb30bfS猫头猫                mediaCacheStore.delete(allKeys[i]);
4143eb30bfS猫头猫            }
4243eb30bfS猫头猫        }
4343eb30bfS猫头猫
4443eb30bfS猫头猫        mediaCacheStore.set(getMediaKey(mediaItem), JSON.stringify(mediaItem));
4543eb30bfS猫头猫        return true;
4643eb30bfS猫头猫    }
4743eb30bfS猫头猫
4843eb30bfS猫头猫    return false;
4943eb30bfS猫头猫};
5043eb30bfS猫头猫
51*6e000b99S猫头猫async function clearLocalCaches(cacheData: IMusic.IMusicItemCache) {
52*6e000b99S猫头猫    if (cacheData.$localLyric) {
53*6e000b99S猫头猫        await checkPathAndRemove(cacheData.$localLyric.lrc);
54*6e000b99S猫头猫        const versions = cacheData.$localLyric.versions;
55*6e000b99S猫头猫        if (versions) {
56*6e000b99S猫头猫            for (let v in versions) {
57*6e000b99S猫头猫                await checkPathAndRemove(versions[v].lrc);
58*6e000b99S猫头猫            }
59*6e000b99S猫头猫        }
60*6e000b99S猫头猫    }
61*6e000b99S猫头猫}
62*6e000b99S猫头猫
63*6e000b99S猫头猫async function checkPathAndRemove(filePath?: string) {
64*6e000b99S猫头猫    if (!filePath) {
65*6e000b99S猫头猫        return;
66*6e000b99S猫头猫    }
67*6e000b99S猫头猫    filePath = addFileScheme(filePath);
68*6e000b99S猫头猫    if (await exists(filePath)) {
69*6e000b99S猫头猫        unlink(filePath);
70*6e000b99S猫头猫    }
71*6e000b99S猫头猫}
72*6e000b99S猫头猫
7343eb30bfS猫头猫/** 移除缓存信息 */
7443eb30bfS猫头猫const removeMediaCache = (mediaItem: ICommon.IMediaBase) => {
7543eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
7643eb30bfS猫头猫        mediaCacheStore.delete(getMediaKey(mediaItem));
7743eb30bfS猫头猫    }
7843eb30bfS猫头猫
7943eb30bfS猫头猫    return false;
8043eb30bfS猫头猫};
8143eb30bfS猫头猫
8243eb30bfS猫头猫const MediaCache = {
8343eb30bfS猫头猫    getMediaCache,
8443eb30bfS猫头猫    setMediaCache,
8543eb30bfS猫头猫    removeMediaCache,
8643eb30bfS猫头猫};
8743eb30bfS猫头猫
8843eb30bfS猫头猫export default MediaCache;
89