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