xref: /MusicFree/src/core/mediaCache.ts (revision 13cebe639f366cc764bcbd619c248f8037fbbb8f)
16e000b99S猫头猫import {addFileScheme} from '@/utils/fileUtils';
243eb30bfS猫头猫import getOrCreateMMKV from '@/utils/getOrCreateMMKV';
343eb30bfS猫头猫import {getMediaKey} from '@/utils/mediaItem';
443eb30bfS猫头猫import safeParse from '@/utils/safeParse';
56e000b99S猫头猫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) {
346e000b99S猫头猫                const rawCacheMedia = mediaCacheStore.getString(allKeys[i]);
356e000b99S猫头猫                const cacheData = rawCacheMedia
366e000b99S猫头猫                    ? safeParse(rawCacheMedia)
376e000b99S猫头猫                    : null;
386e000b99S猫头猫                clearLocalCaches(cacheData);
396e000b99S猫头猫
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猫头猫
516e000b99S猫头猫async function clearLocalCaches(cacheData: IMusic.IMusicItemCache) {
526e000b99S猫头猫    if (cacheData.$localLyric) {
53*13cebe63S猫头猫        await checkPathAndRemove(cacheData.$localLyric.rawLrc);
54*13cebe63S猫头猫        await checkPathAndRemove(cacheData.$localLyric.translation);
556e000b99S猫头猫    }
566e000b99S猫头猫}
576e000b99S猫头猫
586e000b99S猫头猫async function checkPathAndRemove(filePath?: string) {
596e000b99S猫头猫    if (!filePath) {
606e000b99S猫头猫        return;
616e000b99S猫头猫    }
626e000b99S猫头猫    filePath = addFileScheme(filePath);
636e000b99S猫头猫    if (await exists(filePath)) {
646e000b99S猫头猫        unlink(filePath);
656e000b99S猫头猫    }
666e000b99S猫头猫}
676e000b99S猫头猫
6843eb30bfS猫头猫/** 移除缓存信息 */
6943eb30bfS猫头猫const removeMediaCache = (mediaItem: ICommon.IMediaBase) => {
7043eb30bfS猫头猫    if (mediaItem.platform && mediaItem.id) {
7143eb30bfS猫头猫        mediaCacheStore.delete(getMediaKey(mediaItem));
7243eb30bfS猫头猫    }
7343eb30bfS猫头猫
7443eb30bfS猫头猫    return false;
7543eb30bfS猫头猫};
7643eb30bfS猫头猫
7743eb30bfS猫头猫const MediaCache = {
7843eb30bfS猫头猫    getMediaCache,
7943eb30bfS猫头猫    setMediaCache,
8043eb30bfS猫头猫    removeMediaCache,
8143eb30bfS猫头猫};
8243eb30bfS猫头猫
8343eb30bfS猫头猫export default MediaCache;
84