tgbotapi/tgbotapi.api/src/jvmMain/kotlin/dev/inmo/tgbotapi/extensions/api/files/DownloadFileToFile.kt

66 lines
1.6 KiB
Kotlin
Raw Normal View History

2021-08-10 04:34:59 +00:00
package dev.inmo.tgbotapi.extensions.api.files
2021-08-09 13:55:08 +00:00
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.abstracts.FileId
import dev.inmo.tgbotapi.types.files.PathedFile
2022-04-17 12:15:24 +00:00
import dev.inmo.tgbotapi.types.files.TelegramMediaFile
2022-05-01 05:52:02 +00:00
import dev.inmo.tgbotapi.types.message.content.MediaContent
2021-08-10 05:08:08 +00:00
import io.ktor.util.cio.use
2021-08-10 04:34:59 +00:00
import io.ktor.util.cio.writeChannel
import io.ktor.utils.io.copyAndClose
2021-08-10 04:34:59 +00:00
import io.ktor.utils.io.copyTo
import kotlinx.coroutines.job
2021-08-09 13:55:08 +00:00
import java.io.File
2021-08-10 04:34:59 +00:00
import kotlin.coroutines.coroutineContext
2021-08-09 13:55:08 +00:00
suspend fun TelegramBot.downloadFile(
filePath: String,
destFile: File
): File {
2021-08-10 04:34:59 +00:00
val readChannel = downloadFileStream(filePath)
2021-08-09 13:55:08 +00:00
2021-08-10 04:34:59 +00:00
destFile.deleteRecursively()
destFile.parentFile.mkdirs()
2021-08-09 13:55:08 +00:00
doOutsideOfCoroutine { destFile.createNewFile() }
2021-08-10 04:34:59 +00:00
2021-08-10 05:08:08 +00:00
destFile.writeChannel(coroutineContext.job).use {
readChannel.copyAndClose(this)
2021-08-10 05:08:08 +00:00
}
2021-08-09 13:55:08 +00:00
return destFile
}
suspend fun TelegramBot.downloadFile(
pathedFile: PathedFile,
destFile: File
) = downloadFile(
pathedFile.filePath,
destFile
)
suspend fun TelegramBot.downloadFile(
fileId: FileId,
destFile: File
) = downloadFile(
getFileAdditionalInfo(fileId),
destFile
)
suspend fun TelegramBot.downloadFile(
file: TelegramMediaFile,
destFile: File
): File = downloadFile(
getFileAdditionalInfo(file),
destFile
)
suspend fun TelegramBot.downloadFile(
file: MediaContent,
destFile: File
) = downloadFile(
getFileAdditionalInfo(file.media),
destFile
)