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