From dc6184f41d41dfedf5363bd718d791144c50a46b Mon Sep 17 00:00:00 2001 From: Nicholas Wallace Date: Mon, 20 Jul 2026 18:59:19 -0700 Subject: [PATCH] Remove old and slow simplePath from SAF, also autoformatted --- .../audiobookshelf/app/data/DeviceClasses.kt | 243 ++++++++++-------- .../app/data/LocalLibraryItem.kt | 2 +- .../audiobookshelf/app/data/LocalMediaItem.kt | 1 - .../app/device/FolderScanner.kt | 3 - .../app/plugins/AbsFileSystem.kt | 201 ++++++++------- plugins/capacitor/AbsDatabase.js | 2 - 6 files changed, 247 insertions(+), 205 deletions(-) diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt index 9c242b42..fc9beb58 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt @@ -11,53 +11,66 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo import java.io.File enum class LockOrientationSetting { - NONE, PORTRAIT, LANDSCAPE + NONE, + PORTRAIT, + LANDSCAPE } enum class HapticFeedbackSetting { - OFF, LIGHT, MEDIUM, HEAVY + OFF, + LIGHT, + MEDIUM, + HEAVY } enum class ShakeSensitivitySetting { - VERY_LOW, LOW, MEDIUM, HIGH, VERY_HIGH + VERY_LOW, + LOW, + MEDIUM, + HIGH, + VERY_HIGH } enum class DownloadUsingCellularSetting { - ASK, ALWAYS, NEVER + ASK, + ALWAYS, + NEVER } enum class StreamingUsingCellularSetting { - ASK, ALWAYS, NEVER + ASK, + ALWAYS, + NEVER } enum class AndroidAutoBrowseSeriesSequenceOrderSetting { - ASC, DESC + ASC, + DESC } @JsonIgnoreProperties(ignoreUnknown = true) data class ServerConnectionConfig( - var id:String, - var index:Int, - var name:String, - var address:String, - // version added after 0.9.81-beta - var version:String?, - var userId:String, - var username:String, - var token:String, - var customHeaders:Map? + var id: String, + var index: Int, + var name: String, + var address: String, + // version added after 0.9.81-beta + var version: String?, + var userId: String, + var username: String, + var token: String, + var customHeaders: Map? ) @JsonIgnoreProperties(ignoreUnknown = true) data class LocalFile( - var id:String, - var filename:String?, - var contentUrl:String, - var basePath:String, - var absolutePath:String, - var simplePath:String, - var mimeType:String?, - var size:Long + var id: String, + var filename: String?, + var contentUrl: String, + var basePath: String, + var absolutePath: String, + var mimeType: String?, + var size: Long ) { @JsonIgnore fun exists(ctx: Context): Boolean { @@ -73,17 +86,17 @@ data class LocalFile( } @JsonIgnore - fun isAudioFile():Boolean { + fun isAudioFile(): Boolean { if (mimeType == "application/octet-stream") return true if (mimeType == "video/mp4") return true return mimeType?.startsWith("audio") == true } @JsonIgnore - fun isEBookFile():Boolean { + fun isEBookFile(): Boolean { return getEBookFormat() != null } @JsonIgnore - fun getEBookFormat():String? { + fun getEBookFormat(): String? { if (mimeType == "application/epub+zip") return "epub" if (mimeType == "application/pdf") return "pdf" if (mimeType == "application/x-mobipocket-ebook") return "mobi" @@ -96,118 +109,124 @@ data class LocalFile( @JsonIgnoreProperties(ignoreUnknown = true) data class LocalFolder( - var id:String, - var name:String, - var contentUrl:String, - var basePath:String, - var absolutePath:String, - var simplePath:String, - var storageType:String, - var mediaType:String + var id: String, + var name: String, + var contentUrl: String, + var basePath: String, + var absolutePath: String, + var storageType: String, + var mediaType: String ) -@JsonTypeInfo(use= JsonTypeInfo.Id.DEDUCTION) -@JsonSubTypes( - JsonSubTypes.Type(LibraryItem::class), - JsonSubTypes.Type(LocalLibraryItem::class) -) -open class LibraryItemWrapper(var id:String) { +@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION) +@JsonSubTypes(JsonSubTypes.Type(LibraryItem::class), JsonSubTypes.Type(LocalLibraryItem::class)) +open class LibraryItemWrapper(var id: String) { @JsonIgnore - open fun getMediaDescription(progress:MediaProgressWrapper?, ctx: Context): MediaDescriptionCompat { return MediaDescriptionCompat.Builder().build() } + open fun getMediaDescription( + progress: MediaProgressWrapper?, + ctx: Context + ): MediaDescriptionCompat { + return MediaDescriptionCompat.Builder().build() + } } @JsonIgnoreProperties(ignoreUnknown = true) data class DeviceInfo( - var deviceId:String, - var manufacturer:String, - var model:String, - var sdkVersion:Int, - var clientVersion: String + var deviceId: String, + var manufacturer: String, + var model: String, + var sdkVersion: Int, + var clientVersion: String ) @JsonIgnoreProperties(ignoreUnknown = true) data class PlayItemRequestPayload( - var mediaPlayer:String, - var forceDirectPlay:Boolean, - var forceTranscode:Boolean, - var deviceInfo:DeviceInfo + var mediaPlayer: String, + var forceDirectPlay: Boolean, + var forceTranscode: Boolean, + var deviceInfo: DeviceInfo ) @JsonIgnoreProperties(ignoreUnknown = true) data class DeviceSettings( - var disableAutoRewind:Boolean, - var enableAltView:Boolean, - var allowSeekingOnMediaControls:Boolean, - var jumpBackwardsTime:Int, - var jumpForwardTime:Int, - var enableMp3IndexSeeking:Boolean, - var disableShakeToResetSleepTimer:Boolean, - var shakeSensitivity: ShakeSensitivitySetting, - var lockOrientation: LockOrientationSetting, - var hapticFeedback: HapticFeedbackSetting, - var autoSleepTimer: Boolean, - var autoSleepTimerStartTime: String, - var autoSleepTimerEndTime: String, - var autoSleepTimerAutoRewind: Boolean, - var autoSleepTimerAutoRewindTime: Long, //Time in milliseconds - var sleepTimerLength: Long, // Time in milliseconds - var disableSleepTimerFadeOut: Boolean, - var disableSleepTimerResetFeedback: Boolean, - var enableSleepTimerAlmostDoneChime: Boolean, - var languageCode: String, - var downloadUsingCellular: DownloadUsingCellularSetting, - var streamingUsingCellular: StreamingUsingCellularSetting, - var androidAutoBrowseLimitForGrouping: Int, - var androidAutoBrowseSeriesSequenceOrder: AndroidAutoBrowseSeriesSequenceOrderSetting + var disableAutoRewind: Boolean, + var enableAltView: Boolean, + var allowSeekingOnMediaControls: Boolean, + var jumpBackwardsTime: Int, + var jumpForwardTime: Int, + var enableMp3IndexSeeking: Boolean, + var disableShakeToResetSleepTimer: Boolean, + var shakeSensitivity: ShakeSensitivitySetting, + var lockOrientation: LockOrientationSetting, + var hapticFeedback: HapticFeedbackSetting, + var autoSleepTimer: Boolean, + var autoSleepTimerStartTime: String, + var autoSleepTimerEndTime: String, + var autoSleepTimerAutoRewind: Boolean, + var autoSleepTimerAutoRewindTime: Long, // Time in milliseconds + var sleepTimerLength: Long, // Time in milliseconds + var disableSleepTimerFadeOut: Boolean, + var disableSleepTimerResetFeedback: Boolean, + var enableSleepTimerAlmostDoneChime: Boolean, + var languageCode: String, + var downloadUsingCellular: DownloadUsingCellularSetting, + var streamingUsingCellular: StreamingUsingCellularSetting, + var androidAutoBrowseLimitForGrouping: Int, + var androidAutoBrowseSeriesSequenceOrder: AndroidAutoBrowseSeriesSequenceOrderSetting ) { companion object { // Static method to get default device settings - fun default():DeviceSettings { + fun default(): DeviceSettings { return DeviceSettings( - disableAutoRewind = false, - enableAltView = true, - allowSeekingOnMediaControls = false, - jumpBackwardsTime = 10, - jumpForwardTime = 10, - enableMp3IndexSeeking = false, - disableShakeToResetSleepTimer = false, - shakeSensitivity = ShakeSensitivitySetting.MEDIUM, - lockOrientation = LockOrientationSetting.NONE, - hapticFeedback = HapticFeedbackSetting.LIGHT, - autoSleepTimer = false, - autoSleepTimerStartTime = "22:00", - autoSleepTimerEndTime = "06:00", - sleepTimerLength = 900000L, // 15 minutes - autoSleepTimerAutoRewind = false, - autoSleepTimerAutoRewindTime = 300000L, // 5 minutes - disableSleepTimerFadeOut = false, - disableSleepTimerResetFeedback = false, - enableSleepTimerAlmostDoneChime = false, - languageCode = "en-us", - downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS, - streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS, - androidAutoBrowseLimitForGrouping = 100, - androidAutoBrowseSeriesSequenceOrder = AndroidAutoBrowseSeriesSequenceOrderSetting.ASC + disableAutoRewind = false, + enableAltView = true, + allowSeekingOnMediaControls = false, + jumpBackwardsTime = 10, + jumpForwardTime = 10, + enableMp3IndexSeeking = false, + disableShakeToResetSleepTimer = false, + shakeSensitivity = ShakeSensitivitySetting.MEDIUM, + lockOrientation = LockOrientationSetting.NONE, + hapticFeedback = HapticFeedbackSetting.LIGHT, + autoSleepTimer = false, + autoSleepTimerStartTime = "22:00", + autoSleepTimerEndTime = "06:00", + sleepTimerLength = 900000L, // 15 minutes + autoSleepTimerAutoRewind = false, + autoSleepTimerAutoRewindTime = 300000L, // 5 minutes + disableSleepTimerFadeOut = false, + disableSleepTimerResetFeedback = false, + enableSleepTimerAlmostDoneChime = false, + languageCode = "en-us", + downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS, + streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS, + androidAutoBrowseLimitForGrouping = 100, + androidAutoBrowseSeriesSequenceOrder = AndroidAutoBrowseSeriesSequenceOrderSetting.ASC ) } } @get:JsonIgnore - val jumpBackwardsTimeMs get() = jumpBackwardsTime * 1000L + val jumpBackwardsTimeMs + get() = jumpBackwardsTime * 1000L @get:JsonIgnore - val jumpForwardTimeMs get() = jumpForwardTime * 1000L + val jumpForwardTimeMs + get() = jumpForwardTime * 1000L @get:JsonIgnore - val autoSleepTimerStartHour get() = autoSleepTimerStartTime.split(":")[0].toInt() + val autoSleepTimerStartHour + get() = autoSleepTimerStartTime.split(":")[0].toInt() @get:JsonIgnore - val autoSleepTimerStartMinute get() = autoSleepTimerStartTime.split(":")[1].toInt() + val autoSleepTimerStartMinute + get() = autoSleepTimerStartTime.split(":")[1].toInt() @get:JsonIgnore - val autoSleepTimerEndHour get() = autoSleepTimerEndTime.split(":")[0].toInt() + val autoSleepTimerEndHour + get() = autoSleepTimerEndTime.split(":")[0].toInt() @get:JsonIgnore - val autoSleepTimerEndMinute get() = autoSleepTimerEndTime.split(":")[1].toInt() - + val autoSleepTimerEndMinute + get() = autoSleepTimerEndTime.split(":")[1].toInt() @JsonIgnore - fun getShakeThresholdGravity() : Float { // Used in ShakeDetector + fun getShakeThresholdGravity(): Float { // Used in ShakeDetector return if (shakeSensitivity == ShakeSensitivitySetting.VERY_HIGH) 1.1f else if (shakeSensitivity == ShakeSensitivitySetting.HIGH) 1.3f else if (shakeSensitivity == ShakeSensitivitySetting.MEDIUM) 1.5f @@ -221,10 +240,10 @@ data class DeviceSettings( } data class DeviceData( - var serverConnectionConfigs:MutableList, - var lastServerConnectionConfigId:String?, - var deviceSettings: DeviceSettings?, - var lastPlaybackSession: PlaybackSession? + var serverConnectionConfigs: MutableList, + var lastServerConnectionConfigId: String?, + var deviceSettings: DeviceSettings?, + var lastPlaybackSession: PlaybackSession? ) { @JsonIgnore fun getLastServerConnectionConfig(): ServerConnectionConfig? { diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt index 8fbe9ac3..1236bc5c 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/LocalLibraryItem.kt @@ -100,7 +100,7 @@ class LocalLibraryItem( @JsonIgnore private fun trackExists(ctx: Context, contentUrl: String?, path: String): Boolean { - return LocalFile("", null, contentUrl ?: "", "", path, "", null, 0).exists(ctx) + return LocalFile("", null, contentUrl ?: "", "", path, null, 0).exists(ctx) } @JsonIgnore diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/LocalMediaItem.kt b/android/app/src/main/java/com/audiobookshelf/app/data/LocalMediaItem.kt index 987e5c88..11673e89 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/LocalMediaItem.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/LocalMediaItem.kt @@ -14,7 +14,6 @@ data class LocalMediaItem( var mediaType: String, var folderId: String, var contentUrl: String, - var simplePath: String, var basePath: String, var absolutePath: String, var audioTracks: MutableList, diff --git a/android/app/src/main/java/com/audiobookshelf/app/device/FolderScanner.kt b/android/app/src/main/java/com/audiobookshelf/app/device/FolderScanner.kt index 69d45512..9051149f 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/device/FolderScanner.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/device/FolderScanner.kt @@ -35,7 +35,6 @@ class FolderScanner(private val ctx: Context) { Uri.fromFile(file).toString(), file.getBasePath(ctx), file.absolutePath, - file.getSimplePath(ctx), file.mimeType, file.length() ) @@ -61,7 +60,6 @@ class FolderScanner(private val ctx: Context) { contentUrl, part.localFolderName, part.finalDestinationPath, - part.finalDestinationPath, mimeTypeFor(part), size ) @@ -81,7 +79,6 @@ class FolderScanner(private val ctx: Context) { document.uri.toString(), document.getBasePath(ctx), document.getAbsolutePath(ctx), - document.getSimplePath(ctx), document.mimeType, document.length() ) diff --git a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt index 35828180..47d6304f 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsFileSystem.kt @@ -23,40 +23,49 @@ import java.io.File class AbsFileSystem : Plugin() { private val TAG = "AbsFileSystem" private val tag = "AbsFileSystem" - private var jacksonMapper = jacksonObjectMapper().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature()) + private var jacksonMapper = + jacksonObjectMapper() + .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature()) lateinit var mainActivity: MainActivity override fun load() { mainActivity = (activity as MainActivity) - mainActivity.storage.storageAccessCallback = object : StorageAccessCallback { - override fun onRootPathNotSelected( - requestCode: Int, - rootPath: String, - uri: Uri, - selectedStorageType: StorageType, - expectedStorageType: StorageType - ) { - Log.d(TAG, "STORAGE ACCESS CALLBACK") - } + mainActivity.storage.storageAccessCallback = + object : StorageAccessCallback { + override fun onRootPathNotSelected( + requestCode: Int, + rootPath: String, + uri: Uri, + selectedStorageType: StorageType, + expectedStorageType: StorageType + ) { + Log.d(TAG, "STORAGE ACCESS CALLBACK") + } - override fun onCanceledByUser(requestCode: Int) { - Log.d(TAG, "STORAGE ACCESS CALLBACK") - } + override fun onCanceledByUser(requestCode: Int) { + Log.d(TAG, "STORAGE ACCESS CALLBACK") + } - override fun onExpectedStorageNotSelected(requestCode: Int, selectedFolder: DocumentFile, selectedStorageType: StorageType, expectedBasePath: String, expectedStorageType: StorageType) { - Log.d(TAG, "STORAGE ACCESS CALLBACK") - } + override fun onExpectedStorageNotSelected( + requestCode: Int, + selectedFolder: DocumentFile, + selectedStorageType: StorageType, + expectedBasePath: String, + expectedStorageType: StorageType + ) { + Log.d(TAG, "STORAGE ACCESS CALLBACK") + } - override fun onStoragePermissionDenied(requestCode: Int) { - Log.d(TAG, "STORAGE ACCESS CALLBACK") - } + override fun onStoragePermissionDenied(requestCode: Int) { + Log.d(TAG, "STORAGE ACCESS CALLBACK") + } - override fun onRootPathPermissionGranted(requestCode: Int, root: DocumentFile) { - Log.d(TAG, "STORAGE ACCESS CALLBACK") - } - } + override fun onRootPathPermissionGranted(requestCode: Int, root: DocumentFile) { + Log.d(TAG, "STORAGE ACCESS CALLBACK") + } + } } @PluginMethod @@ -65,60 +74,77 @@ class AbsFileSystem : Plugin() { val REQUEST_CODE_SELECT_FOLDER = 6 val REQUEST_CODE_SDCARD_ACCESS = 7 - mainActivity.storage.folderPickerCallback = object : FolderPickerCallback { - override fun onFolderSelected(requestCode: Int, folder: DocumentFile) { - Log.d(TAG, "ON FOLDER SELECTED ${folder.uri} ${folder.name}") - val absolutePath = folder.getAbsolutePath(activity) - val storageType = folder.getStorageType(activity) - val simplePath = folder.getSimplePath(activity) - val basePath = folder.getBasePath(activity) - val folderId = android.util.Base64.encodeToString(folder.id.toByteArray(), android.util.Base64.DEFAULT) + mainActivity.storage.folderPickerCallback = + object : FolderPickerCallback { + override fun onFolderSelected(requestCode: Int, folder: DocumentFile) { + Log.d(TAG, "ON FOLDER SELECTED ${folder.uri} ${folder.name}") + val absolutePath = folder.getAbsolutePath(activity) + val storageType = folder.getStorageType(activity) + val basePath = folder.getBasePath(activity) + val folderId = + android.util.Base64.encodeToString( + folder.id.toByteArray(), + android.util.Base64.DEFAULT + ) - val localFolder = LocalFolder(folderId, folder.name ?: "", folder.uri.toString(),basePath,absolutePath, simplePath, storageType.toString(), mediaType) + val localFolder = + LocalFolder( + folderId, + folder.name ?: "", + folder.uri.toString(), + basePath, + absolutePath, + storageType.toString(), + mediaType + ) - DeviceManager.dbManager.saveLocalFolder(localFolder) - call.resolve(JSObject(jacksonMapper.writeValueAsString(localFolder))) - } + DeviceManager.dbManager.saveLocalFolder(localFolder) + call.resolve(JSObject(jacksonMapper.writeValueAsString(localFolder))) + } - override fun onStorageAccessDenied( - requestCode: Int, - folder: DocumentFile?, - storageType: StorageType, - storageId: String - ) { - Log.e(tag, "Storage Access Denied ${folder?.getAbsolutePath(mainActivity)}") + override fun onStorageAccessDenied( + requestCode: Int, + folder: DocumentFile?, + storageType: StorageType, + storageId: String + ) { + Log.e(tag, "Storage Access Denied ${folder?.getAbsolutePath(mainActivity)}") - val jsobj = JSObject() - if (requestCode == REQUEST_CODE_SELECT_FOLDER) { + val jsobj = JSObject() + if (requestCode == REQUEST_CODE_SELECT_FOLDER) { - val builder: AlertDialog.Builder = AlertDialog.Builder(mainActivity) - builder.setMessage( - "You have no write access to this storage, thus selecting this folder is useless." + - "\nWould you like to grant access to this folder?") - builder.setNegativeButton("Dont Allow") { _, _ -> - run { - jsobj.put("error", "User Canceled, Access Denied") - call.resolve(jsobj) + val builder: AlertDialog.Builder = AlertDialog.Builder(mainActivity) + builder.setMessage( + "You have no write access to this storage, thus selecting this folder is useless." + + "\nWould you like to grant access to this folder?" + ) + builder.setNegativeButton("Dont Allow") { _, _ -> + run { + jsobj.put("error", "User Canceled, Access Denied") + call.resolve(jsobj) + } + } + builder.setPositiveButton("Allow.") { _, _ -> + mainActivity.storageHelper.requestStorageAccess( + REQUEST_CODE_SDCARD_ACCESS, + initialPath = FileFullPath(mainActivity, storageId, "") + ) + } + builder.show() + } else { + Log.d(TAG, "STORAGE ACCESS DENIED $requestCode") + jsobj.put("error", "Access Denied") + call.resolve(jsobj) + } + } + + override fun onStoragePermissionDenied(requestCode: Int) { + Log.d(TAG, "STORAGE PERMISSION DENIED $requestCode") + val jsobj = JSObject() + jsobj.put("error", "Permission Denied") + call.resolve(jsobj) + } } - } - builder.setPositiveButton("Allow.") { _, _ -> mainActivity.storageHelper.requestStorageAccess(REQUEST_CODE_SDCARD_ACCESS, initialPath = FileFullPath(mainActivity, storageId, "")) } - builder.show() - } else { - Log.d(TAG, "STORAGE ACCESS DENIED $requestCode") - jsobj.put("error", "Access Denied") - call.resolve(jsobj) - } - } - - - override fun onStoragePermissionDenied(requestCode: Int) { - Log.d(TAG, "STORAGE PERMISSION DENIED $requestCode") - val jsobj = JSObject() - jsobj.put("error", "Permission Denied") - call.resolve(jsobj) - } - - } mainActivity.storage.openFolderPicker(REQUEST_CODE_SELECT_FOLDER) } @@ -152,7 +178,7 @@ class AbsFileSystem : Plugin() { val folderUrl = call.data.getString("folderUrl", "").toString() Log.d(TAG, "Check Folder Permissions for $folderUrl") - val hasAccess = SimpleStorage.hasStorageAccess(context,folderUrl,true) + val hasAccess = SimpleStorage.hasStorageAccess(context, folderUrl, true) val jsobj = JSObject() jsobj.put("value", hasAccess) @@ -196,26 +222,29 @@ class AbsFileSystem : Plugin() { if (localLibraryItem?.folderId?.startsWith("internal-") == true) { Log.d(tag, "Deleting internal library item at absolutePath $absolutePath") val file = File(absolutePath) - success = if (file.exists()) { - file.deleteRecursively() - } else { - true - } + success = + if (file.exists()) { + file.deleteRecursively() + } else { + true + } } else { var subfolderPathToDelete = "" localLibraryItem?.folderId?.let { folderId -> val folder = DeviceManager.dbManager.getLocalFolder(folderId) folder?.absolutePath?.let { folderPath -> val splitAbsolutePath = absolutePath.split("/") - val fullSubDir = splitAbsolutePath.subList(0, splitAbsolutePath.size - 1).joinToString("/") + val fullSubDir = + splitAbsolutePath.subList(0, splitAbsolutePath.size - 1).joinToString("/") if (fullSubDir != folderPath) { - val subdirHasAnItem = DeviceManager.dbManager.getLocalLibraryItems().any { _localLibraryItem -> - if (_localLibraryItem.id == localLibraryItemId) { - false - } else { - _localLibraryItem.absolutePath.startsWith(fullSubDir) - } - } + val subdirHasAnItem = + DeviceManager.dbManager.getLocalLibraryItems().any { _localLibraryItem -> + if (_localLibraryItem.id == localLibraryItemId) { + false + } else { + _localLibraryItem.absolutePath.startsWith(fullSubDir) + } + } subfolderPathToDelete = if (subdirHasAnItem) "" else fullSubDir } } diff --git a/plugins/capacitor/AbsDatabase.js b/plugins/capacitor/AbsDatabase.js index 3676e97c..58a2e30d 100644 --- a/plugins/capacitor/AbsDatabase.js +++ b/plugins/capacitor/AbsDatabase.js @@ -119,7 +119,6 @@ class AbsDatabaseWeb extends WebPlugin { name: 'Audiobooks', contentUrl: 'test', absolutePath: '/audiobooks', - simplePath: 'audiobooks', storageType: 'primary', mediaType: 'book' } @@ -196,7 +195,6 @@ class AbsDatabaseWeb extends WebPlugin { filename: 'lf1.mp3', contentUrl: 'test', absolutePath: 'test', - simplePath: 'test', mimeType: 'audio/mpeg', size: 39048290 }