From 40d94cca705202734d33b3f2af5b595b16a4f9de Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Tue, 10 Aug 2021 10:34:59 +0600 Subject: [PATCH] improvements in files downloading api --- CHANGELOG.md | 4 ++ .../tgbotapi/extensions/api/DownloadFile.kt | 28 ++++++------- .../extensions/api/files/DownloadFile.kt | 39 +++++++++++++++++++ .../api/files/DownloadFileStream.kt | 29 ++++++++++++++ .../api/files/DownloadFileStreamAllocator.kt | 29 ++++++++++++++ .../api/{ => files}/DownloadFileToFile.kt | 15 ++++--- 6 files changed, 122 insertions(+), 22 deletions(-) create mode 100644 tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFile.kt create mode 100644 tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStream.kt create mode 100644 tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStreamAllocator.kt rename tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/{ => files}/DownloadFileToFile.kt (78%) diff --git a/CHANGELOG.md b/CHANGELOG.md index d27698adb1..7ddd062828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ * `API`: * New extensions `TelegramBot#downloadFile` for writing of incoming bytes to the file + * New extensions `TelegramBot#downloadFileStream` and `TelegramBot#downloadFileStreamAllocator` for getting of input + streams instead of whole bytes arrays + * Old extensions `TelegramBot#downloadFile` has been replaced to the new package. Migration: replace in your project + `import dev.inmo.tgbotapi.extensions.api.downloadFile` with `import dev.inmo.tgbotapi.extensions.api.files.downloadFile` * `PathedFile#filename` extension has been deprecated, and new property `PathedFile#fileName` has been included directly in `PathedFile` diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFile.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFile.kt index 3099d46591..627f75ec8b 100644 --- a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFile.kt +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFile.kt @@ -1,39 +1,33 @@ package dev.inmo.tgbotapi.extensions.api import dev.inmo.tgbotapi.bot.TelegramBot -import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo -import dev.inmo.tgbotapi.requests.DownloadFile +import dev.inmo.tgbotapi.extensions.api.files.downloadFile import dev.inmo.tgbotapi.requests.abstracts.FileId import dev.inmo.tgbotapi.types.files.PathedFile import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent +@Deprecated("Replaced", ReplaceWith("downloadFile", "dev.inmo.tgbotapi.extensions.api.files.downloadFile")) suspend fun TelegramBot.downloadFile( filePath: String -): ByteArray = execute( - DownloadFile(filePath) -) +): ByteArray = downloadFile(filePath) +@Deprecated("Replaced", ReplaceWith("downloadFile", "dev.inmo.tgbotapi.extensions.api.files.downloadFile")) suspend fun TelegramBot.downloadFile( pathedFile: PathedFile -): ByteArray = downloadFile( - pathedFile.filePath -) +): ByteArray = downloadFile(pathedFile) +@Deprecated("Replaced", ReplaceWith("downloadFile", "dev.inmo.tgbotapi.extensions.api.files.downloadFile")) suspend fun TelegramBot.downloadFile( fileId: FileId -): ByteArray = downloadFile( - getFileAdditionalInfo(fileId) -) +): ByteArray = downloadFile(fileId) +@Deprecated("Replaced", ReplaceWith("downloadFile", "dev.inmo.tgbotapi.extensions.api.files.downloadFile")) suspend fun TelegramBot.downloadFile( file: TelegramMediaFile -): ByteArray = downloadFile( - getFileAdditionalInfo(file) -) +): ByteArray = downloadFile(file) +@Deprecated("Replaced", ReplaceWith("downloadFile", "dev.inmo.tgbotapi.extensions.api.files.downloadFile")) suspend fun TelegramBot.downloadFile( file: MediaContent -): ByteArray = downloadFile( - getFileAdditionalInfo(file.media) -) +): ByteArray = downloadFile(file) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFile.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFile.kt new file mode 100644 index 0000000000..6a69e6b15b --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFile.kt @@ -0,0 +1,39 @@ +package dev.inmo.tgbotapi.extensions.api.files + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo +import dev.inmo.tgbotapi.requests.DownloadFile +import dev.inmo.tgbotapi.requests.abstracts.FileId +import dev.inmo.tgbotapi.types.files.PathedFile +import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile +import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent + +suspend fun TelegramBot.downloadFile( + filePath: String +): ByteArray = execute( + DownloadFile(filePath) +) + +suspend fun TelegramBot.downloadFile( + pathedFile: PathedFile +): ByteArray = downloadFile( + pathedFile.filePath +) + +suspend fun TelegramBot.downloadFile( + fileId: FileId +): ByteArray = downloadFile( + getFileAdditionalInfo(fileId) +) + +suspend fun TelegramBot.downloadFile( + file: TelegramMediaFile +): ByteArray = downloadFile( + getFileAdditionalInfo(file) +) + +suspend fun TelegramBot.downloadFile( + file: MediaContent +): ByteArray = downloadFile( + getFileAdditionalInfo(file.media) +) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStream.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStream.kt new file mode 100644 index 0000000000..f601f643c9 --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStream.kt @@ -0,0 +1,29 @@ +package dev.inmo.tgbotapi.extensions.api.files + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo +import dev.inmo.tgbotapi.requests.DownloadFileStream +import dev.inmo.tgbotapi.requests.abstracts.FileId +import dev.inmo.tgbotapi.types.files.PathedFile +import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile +import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent + +suspend fun TelegramBot.downloadFileStream( + filePath: String +) = downloadFileStreamAllocator(filePath).invoke() + +suspend fun TelegramBot.downloadFileStream( + pathedFile: PathedFile +) = downloadFileStream(pathedFile.filePath) + +suspend fun TelegramBot.downloadFileStream( + fileId: FileId +) = downloadFileStream(getFileAdditionalInfo(fileId)) + +suspend fun TelegramBot.downloadFileStream( + file: TelegramMediaFile +) = downloadFileStream(getFileAdditionalInfo(file)) + +suspend fun TelegramBot.downloadFileStream( + file: MediaContent +) = downloadFileStream(getFileAdditionalInfo(file.media)) diff --git a/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStreamAllocator.kt b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStreamAllocator.kt new file mode 100644 index 0000000000..8261d4c275 --- /dev/null +++ b/tgbotapi.extensions.api/src/commonMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileStreamAllocator.kt @@ -0,0 +1,29 @@ +package dev.inmo.tgbotapi.extensions.api.files + +import dev.inmo.tgbotapi.bot.TelegramBot +import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo +import dev.inmo.tgbotapi.requests.DownloadFileStream +import dev.inmo.tgbotapi.requests.abstracts.FileId +import dev.inmo.tgbotapi.types.files.PathedFile +import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile +import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent + +suspend fun TelegramBot.downloadFileStreamAllocator( + filePath: String +) = execute(DownloadFileStream(filePath)) + +suspend fun TelegramBot.downloadFileStreamAllocator( + pathedFile: PathedFile +) = downloadFileStreamAllocator(pathedFile.filePath) + +suspend fun TelegramBot.downloadFileStreamAllocator( + fileId: FileId +) = downloadFileStreamAllocator(getFileAdditionalInfo(fileId)) + +suspend fun TelegramBot.downloadFileStreamAllocator( + file: TelegramMediaFile +) = downloadFileStreamAllocator(getFileAdditionalInfo(file)) + +suspend fun TelegramBot.downloadFileStreamAllocator( + file: MediaContent +) = downloadFileStreamAllocator(getFileAdditionalInfo(file.media)) diff --git a/tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFileToFile.kt b/tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileToFile.kt similarity index 78% rename from tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFileToFile.kt rename to tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileToFile.kt index e9e6a23ffb..a0934f5247 100644 --- a/tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/DownloadFileToFile.kt +++ b/tgbotapi.extensions.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileToFile.kt @@ -1,24 +1,29 @@ -package dev.inmo.tgbotapi.extensions.api +package dev.inmo.tgbotapi.extensions.api.files import dev.inmo.micro_utils.coroutines.doOutsideOfCoroutine import dev.inmo.tgbotapi.bot.TelegramBot import dev.inmo.tgbotapi.extensions.api.get.getFileAdditionalInfo -import dev.inmo.tgbotapi.requests.DownloadFile import dev.inmo.tgbotapi.requests.abstracts.FileId import dev.inmo.tgbotapi.types.files.PathedFile import dev.inmo.tgbotapi.types.files.abstracts.TelegramMediaFile import dev.inmo.tgbotapi.types.message.content.abstracts.MediaContent +import io.ktor.util.cio.writeChannel +import io.ktor.utils.io.copyTo +import kotlinx.coroutines.job import java.io.File +import kotlin.coroutines.coroutineContext suspend fun TelegramBot.downloadFile( filePath: String, destFile: File ): File { - val bytes = downloadFile(filePath) - destFile.deleteRecursively() + val readChannel = downloadFileStream(filePath) + destFile.deleteRecursively() + destFile.parentFile.mkdirs() doOutsideOfCoroutine { destFile.createNewFile() } - destFile.writeBytes(bytes) + + readChannel.copyTo(destFile.writeChannel(coroutineContext.job)) return destFile }