xref: /MusicFree/src/core/mediaCache.ts (revision 32683ee62b4655ae6d3cb700ae12398eac644f02)
1*32683ee6Smaotoumaoimport { addFileScheme } from "@/utils/fileUtils";
2*32683ee6Smaotoumaoimport getOrCreateMMKV from "@/utils/getOrCreateMMKV";
3*32683ee6Smaotoumaoimport { getMediaKey } from "@/utils/mediaItem";
4*32683ee6Smaotoumaoimport safeParse from "@/utils/safeParse";
5*32683ee6Smaotoumaoimport { exists, unlink } from "react-native-fs";
643eb30bfS猫头猫
743eb30bfS猫头猫// Internal Method
843eb30bfS猫头猫const mediaCacheStore = getOrCreateMMKV('cache.MediaCache', true);
943eb30bfS猫头猫
10*32683ee6Smaotoumao// 最多缓存800条数据
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) {
5313cebe63S猫头猫        await checkPathAndRemove(cacheData.$localLyric.rawLrc);
5413cebe63S猫头猫        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