From f1b660ff5a6318cc1eb73e2c4a8ee345ca28254e Mon Sep 17 00:00:00 2001 From: lyswhut Date: Wed, 20 Dec 2023 13:42:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9C=AC=E5=9C=B0=E6=AD=8C?= =?UTF-8?q?=E6=9B=B2=E5=B0=81=E9=9D=A2=E7=BC=93=E5=AD=98=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/toside/music/mobile/utils/Utils.java | 29 +++++++++++++++++++ .../music/mobile/utils/UtilsModule.java | 5 ++++ src/utils/fs.ts | 2 +- src/utils/localMediaMetadata.ts | 12 +++++++- src/utils/nativeModules/utils.ts | 3 ++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/java/cn/toside/music/mobile/utils/Utils.java b/android/app/src/main/java/cn/toside/music/mobile/utils/Utils.java index 8208514..df7a981 100644 --- a/android/app/src/main/java/cn/toside/music/mobile/utils/Utils.java +++ b/android/app/src/main/java/cn/toside/music/mobile/utils/Utils.java @@ -4,7 +4,9 @@ package cn.toside.music.mobile.utils; import android.content.Context; import android.os.storage.StorageManager; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactMethod; import java.io.BufferedReader; import java.io.File; @@ -16,6 +18,7 @@ import java.io.InputStreamReader; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Objects; import java.util.concurrent.Callable; public class Utils { @@ -118,4 +121,30 @@ public class Utils { return null; } } + + private static void deleteRecursive(File fileOrDirectory) { + if (fileOrDirectory.isDirectory()) { + for (File child : Objects.requireNonNull(fileOrDirectory.listFiles())) { + deleteRecursive(child); + } + } + + fileOrDirectory.delete(); + } + public static void unlink(String filepath) { + deleteRecursive(new File(filepath)); + } + static class Unlink implements Callable { + private final String filePath; + + public Unlink(String filePath) { + this.filePath = filePath; + } + + @Override + public Object call() { + unlink(filePath); + return null; + } + } } diff --git a/android/app/src/main/java/cn/toside/music/mobile/utils/UtilsModule.java b/android/app/src/main/java/cn/toside/music/mobile/utils/UtilsModule.java index e8c846a..a146e0d 100644 --- a/android/app/src/main/java/cn/toside/music/mobile/utils/UtilsModule.java +++ b/android/app/src/main/java/cn/toside/music/mobile/utils/UtilsModule.java @@ -315,6 +315,11 @@ public class UtilsModule extends ReactContextBaseJavaModule { AsyncTask.runTask(new Utils.WriteStringToFile(filePath, dataStr), promise); } + @ReactMethod + public void unlink(String filePath, Promise promise) { + AsyncTask.runTask(new Utils.Unlink(filePath), promise); + } + // https://stackoverflow.com/questions/73463341/in-per-app-language-how-to-get-app-locale-in-api-33-if-system-locale-is-diffe @ReactMethod public void getSystemLocales(Promise promise) { diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 650d25e..7b9af93 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -5,7 +5,7 @@ export const externalDirectoryPath = RNFS.ExternalDirectoryPath export const temporaryDirectoryPath = RNFS.TemporaryDirectoryPath export const externalStorageDirectoryPath = RNFS.ExternalStorageDirectoryPath -export const unlink = async(path: string) => RNFS.unlink(path) +// export const unlink = async(path: string) => RNFS.unlink(path) export const readDir = async(path: string) => RNFS.readDir(path) diff --git a/src/utils/localMediaMetadata.ts b/src/utils/localMediaMetadata.ts index 465eb41..ee0fbbb 100644 --- a/src/utils/localMediaMetadata.ts +++ b/src/utils/localMediaMetadata.ts @@ -1,5 +1,6 @@ import { temporaryDirectoryPath } from '@/utils/fs' import { scanFiles, readPic as _readPic } from 'react-native-local-media-metadata' +import { unlink } from './nativeModules/utils' export { type MusicMetadata, type MusicMetadataFull, @@ -10,12 +11,21 @@ export { writeLyric, } from 'react-native-local-media-metadata' +let cleared = false +const picCachePath = temporaryDirectoryPath + '/local-media-metadata' + export const scanAudioFiles = async(dirPath: string): Promise => { return scanFiles(dirPath, ['mp3', 'flac', 'ogg', 'wav']) } +const clearPicCache = async() => { + await unlink(picCachePath) + cleared = true +} + export const readPic = async(dirPath: string): Promise => { - return _readPic(dirPath, temporaryDirectoryPath + '/local-media-metadata') + if (!cleared) await clearPicCache() + return _readPic(dirPath, picCachePath) } // export interface MusicMetadata { diff --git a/src/utils/nativeModules/utils.ts b/src/utils/nativeModules/utils.ts index 2fdcae9..561b863 100644 --- a/src/utils/nativeModules/utils.ts +++ b/src/utils/nativeModules/utils.ts @@ -54,6 +54,9 @@ export const writeFile = async(filePath: string, data: string): Promise => export const readFile = async(filePath: string): Promise => { return UtilsModule.getStringFromFile(filePath) } +export const unlink = async(filePath: string): Promise => { + return UtilsModule.unlink(filePath) +} export const getSystemLocales = async(): Promise => { return UtilsModule.getSystemLocales() }