diff --git a/android/app/build.gradle b/android/app/build.gradle index b400e876c..f304ec273 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -118,8 +118,8 @@ android { applicationId "io.filen.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 2057 - versionName "2.0.57" + versionCode 2058 + versionName "2.0.58" } splits { diff --git a/ios/Filen.xcodeproj/project.pbxproj b/ios/Filen.xcodeproj/project.pbxproj index dcadb4cbf..850674053 100644 --- a/ios/Filen.xcodeproj/project.pbxproj +++ b/ios/Filen.xcodeproj/project.pbxproj @@ -648,7 +648,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Filen/Filen.entitlements; - CURRENT_PROJECT_VERSION = 2057; + CURRENT_PROJECT_VERSION = 2058; DEVELOPMENT_TEAM = 7YTW5D2K7P; ENABLE_BITCODE = NO; INFOPLIST_FILE = Filen/Info.plist; @@ -657,7 +657,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.57; + MARKETING_VERSION = 2.0.58; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -685,7 +685,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Filen/Filen.entitlements; - CURRENT_PROJECT_VERSION = 2057; + CURRENT_PROJECT_VERSION = 2058; DEVELOPMENT_TEAM = 7YTW5D2K7P; INFOPLIST_FILE = Filen/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.0; @@ -693,7 +693,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 2.0.57; + MARKETING_VERSION = 2.0.58; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/ios/Filen.xcodeproj/xcshareddata/xcschemes/Filen.xcscheme b/ios/Filen.xcodeproj/xcshareddata/xcschemes/Filen.xcscheme index b4c796f5a..8ac4529eb 100644 --- a/ios/Filen.xcodeproj/xcshareddata/xcschemes/Filen.xcscheme +++ b/ios/Filen.xcodeproj/xcshareddata/xcschemes/Filen.xcscheme @@ -41,7 +41,7 @@ +- thumbnail.compress(Bitmap.CompressFormat.JPEG, (options.quality * 100).toInt(), outputStream) +- } +- promise.resolve( +- VideoThumbnailResult( +- uri = Uri.fromFile(File(path)).toString(), +- width = thumbnail.width, +- height = thumbnail.height ++ if(thumbnail == null){ ++ promise.reject(ERROR_TAG, "Thumbnail generation failed", GenerateThumbnailException()) ++ } ++ else{ ++ try { ++ val path = FileUtilities.generateOutputPath(context.cacheDir, "VideoThumbnails", "jpg") ++ FileOutputStream(path).use { outputStream -> ++ thumbnail.compress(Bitmap.CompressFormat.JPEG, (options.quality * 100).toInt(), outputStream) ++ } ++ promise.resolve( ++ VideoThumbnailResult( ++ uri = Uri.fromFile(File(path)).toString(), ++ width = thumbnail.width, ++ height = thumbnail.height ++ ) + ) +- ) +- } catch (ex: IOException) { +- promise.reject(ERROR_TAG, ex.message, ex) +- } catch (ex: RuntimeException) { +- promise.reject(ERROR_TAG, ex.message, ex) ++ } catch (ex: IOException) { ++ promise.reject(ERROR_TAG, ex.message, ex) ++ } catch (ex: RuntimeException) { ++ promise.reject(ERROR_TAG, ex.message, ex) ++ } + } + } + } +@@ -71,21 +76,28 @@ class VideoThumbnailsModule : Module() { + + private class GetThumbnail(private val sourceFilename: String, private val videoOptions: VideoThumbnailOptions, private val context: Context) { + fun execute(): Bitmap? { +- val retriever = MediaMetadataRetriever() ++ try{ ++ val retriever = MediaMetadataRetriever() + +- if (URLUtil.isFileUrl(sourceFilename)) { +- retriever.setDataSource(Uri.decode(sourceFilename).replace("file://", "")) +- } else if (URLUtil.isContentUrl(sourceFilename)) { +- val fileUri = Uri.parse(sourceFilename) +- val fileDescriptor = context.contentResolver.openFileDescriptor(fileUri, "r")!!.fileDescriptor +- FileInputStream(fileDescriptor).use { inputStream -> +- retriever.setDataSource(inputStream.fd) ++ if (URLUtil.isFileUrl(sourceFilename)) { ++ retriever.setDataSource(Uri.decode(sourceFilename).replace("file://", "")) ++ } else if (URLUtil.isContentUrl(sourceFilename)) { ++ val fileUri = Uri.parse(sourceFilename) ++ val fileDescriptor = context.contentResolver.openFileDescriptor(fileUri, "r")!!.fileDescriptor ++ FileInputStream(fileDescriptor).use { inputStream -> ++ retriever.setDataSource(inputStream.fd) ++ } ++ } else { ++ retriever.setDataSource(sourceFilename, videoOptions.headers) + } +- } else { +- retriever.setDataSource(sourceFilename, videoOptions.headers) ++ ++ return retriever.getFrameAtTime(videoOptions.time.toLong() * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC) + } ++ catch(e: RuntimeException){ ++ Log.e(ERROR_TAG, "setDataSource failed") + +- return retriever.getFrameAtTime(videoOptions.time.toLong() * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC) ++ return null ++ } + } + } +