diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineDownloadProgress.kt b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineDownloadProgress.kt index 1085c16..ca9929f 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineDownloadProgress.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/CommandLineDownloadProgress.kt @@ -23,6 +23,8 @@ import de.fabianonline.telegram_backup.Utils internal class CommandLineDownloadProgress : DownloadProgressInterface { private var mediaCount = 0 private var i = 0 + private var step = 0 + private val chars = arrayOf("|", "/", "-", "\\") override fun onMessageDownloadStart(count: Int, source: String?) { i = 0 @@ -59,6 +61,21 @@ internal class CommandLineDownloadProgress : DownloadProgressInterface { override fun onMediaDownloaded(file_manager: AbstractMediaFileManager) { show(file_manager.letter.toUpperCase()) } + + override fun onMediaFileDownloadStarted() { + step = 0 + print(chars[step % chars.size]) + } + + override fun onMediaFileDownloadStep() { + step++ + print("\b") + print(chars[step % chars.size]) + } + + override fun onMediaFileDownloadFinished() { + print("\b") + } override fun onMediaDownloadedEmpty() { show("e") diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt index 2b7584f..422a665 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadManager.kt @@ -263,7 +263,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte prog.onMediaSkipped() } else { try { - val result = m.download() + val result = m.download(prog) if (result) { prog.onMediaDownloaded(m) } else { @@ -361,19 +361,19 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte internal val logger = LoggerFactory.getLogger(DownloadManager::class.java) @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - fun downloadFile(targetFilename: String, size: Int, dcId: Int, volumeId: Long, localId: Int, secret: Long) { + fun downloadFile(targetFilename: String, size: Int, dcId: Int, volumeId: Long, localId: Int, secret: Long, prog: DownloadProgressInterface?) { val loc = TLInputFileLocation(volumeId, localId, secret) - downloadFileFromDc(targetFilename, loc, dcId, size) + downloadFileFromDc(targetFilename, loc, dcId, size, prog) } @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - fun downloadFile(targetFilename: String, size: Int, dcId: Int, id: Long, accessHash: Long) { + fun downloadFile(targetFilename: String, size: Int, dcId: Int, id: Long, accessHash: Long, prog: DownloadProgressInterface?) { val loc = TLInputDocumentFileLocation(id, accessHash) - downloadFileFromDc(targetFilename, loc, dcId, size) + downloadFileFromDc(targetFilename, loc, dcId, size, prog) } @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - private fun downloadFileFromDc(target: String, loc: TLAbsInputFileLocation, dcID: Int, size: Int): Boolean { + private fun downloadFileFromDc(target: String, loc: TLAbsInputFileLocation, dcID: Int, size: Int, prog: DownloadProgressInterface?): Boolean { var fos: FileOutputStream? = null try { val temp_filename = target + ".downloading" @@ -392,6 +392,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } logger.trace("offset before the loop is {}", offset) fos = FileOutputStream(temp_filename, true) + if (prog != null) prog.onMediaFileDownloadStarted() do { logger.trace("offset: {} block_size: {} size: {}", offset, size, size) val req = TLRequestUploadGetFile(loc, offset, size) @@ -409,7 +410,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } val response = resp!! - + if (prog!=null) prog.onMediaFileDownloadStep() offset += response.getBytes().getData().size logger.trace("response: {} total size: {}", response.getBytes().getData().size, offset) @@ -418,6 +419,7 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte try { TimeUnit.MILLISECONDS.sleep(Config.DELAY_AFTER_GET_FILE) } catch (e: InterruptedException) { } } while (offset < size && response.getBytes().getData().size > 0) + if (prog != null) prog.onMediaFileDownloadFinished() fos.close() if (offset < size) { System.out.println("Requested file $target with $size bytes, but got only $offset bytes.") @@ -472,13 +474,18 @@ class DownloadManager(val client: TelegramClient, val prog: DownloadProgressInte } @Throws(IOException::class) - fun downloadExternalFile(target: String, url: String): Boolean { - val (_, response, result) = Fuel.get(url).response() - if (result is Result.Success) { - File(target).writeBytes(response.data) - return true + fun downloadExternalFile(target: String, url: String, prog: DownloadProgressInterface?): Boolean { + if (prog != null) prog.onMediaFileDownloadStarted() + var success = true + Fuel.download(url).destination { _, _ -> + File(target) + }.progress { _, _ -> + if (prog != null) prog.onMediaFileDownloadStep() + }.response { _, _, result -> + success = (result is Result.Success) } - return false + if (prog != null) prog.onMediaFileDownloadFinished() + return success } } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadProgressInterface.kt b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadProgressInterface.kt index 348781c..3864ac0 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/DownloadProgressInterface.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/DownloadProgressInterface.kt @@ -30,4 +30,7 @@ interface DownloadProgressInterface { fun onMediaAlreadyPresent(file_manager: AbstractMediaFileManager) fun onMediaDownloadFinished() fun onMediaFailed() + fun onMediaFileDownloadStarted() + fun onMediaFileDownloadStep() + fun onMediaFileDownloadFinished() } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt index 0b36df6..f107f1f 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/AbstractMediaFileManager.kt @@ -65,7 +65,7 @@ abstract class AbstractMediaFileManager(private var json: JsonObject, val file_b abstract val name: String abstract val description: String @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - abstract fun download(): Boolean + abstract fun download(prog: DownloadProgressInterface? = null): Boolean protected fun extensionFromMimetype(mime: String): String { when (mime) { diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/DocumentFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/DocumentFileManager.kt index 10321ef..493c0a6 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/DocumentFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/DocumentFileManager.kt @@ -18,7 +18,7 @@ package de.fabianonline.telegram_backup.mediafilemanager import de.fabianonline.telegram_backup.UserManager import de.fabianonline.telegram_backup.DownloadManager - +import de.fabianonline.telegram_backup.DownloadProgressInterface import com.github.badoualy.telegram.tl.api.* import com.github.badoualy.telegram.tl.exception.RpcErrorException @@ -74,8 +74,8 @@ open class DocumentFileManager(message: JsonObject, file_base: String) : Abstrac } @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - override fun download(): Boolean { - DownloadManager.downloadFile(targetPathAndFilename, size, json["dcId"].int, json["id"].long, json["accessHash"].long) + override fun download(prog: DownloadProgressInterface?): Boolean { + DownloadManager.downloadFile(targetPathAndFilename, size, json["dcId"].int, json["id"].long, json["accessHash"].long, prog) return true } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt index b933533..93c0639 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/GeoFileManager.kt @@ -18,7 +18,7 @@ package de.fabianonline.telegram_backup.mediafilemanager import de.fabianonline.telegram_backup.UserManager import de.fabianonline.telegram_backup.DownloadManager - +import de.fabianonline.telegram_backup.DownloadProgressInterface import com.github.badoualy.telegram.tl.api.* import de.fabianonline.telegram_backup.Config import de.fabianonline.telegram_backup.Settings @@ -61,12 +61,12 @@ class GeoFileManager(message: JsonObject, file_base: String, val settings: Setti } @Throws(IOException::class) - override fun download(): Boolean { + override fun download(prog: DownloadProgressInterface?): Boolean { val url = "https://maps.googleapis.com/maps/api/staticmap?" + "center=${json["lat"].float},${json["_long"].float}&" + "markers=color:red|${json["lat"].float},${json["_long"].float}&" + "zoom=14&size=300x150&scale=2&format=png&" + "key=" + (settings?.gmaps_key) - return DownloadManager.downloadExternalFile(targetPathAndFilename, url) + return DownloadManager.downloadExternalFile(targetPathAndFilename, url, prog) } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/PhotoFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/PhotoFileManager.kt index 024b1c8..72b768f 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/PhotoFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/PhotoFileManager.kt @@ -18,7 +18,7 @@ package de.fabianonline.telegram_backup.mediafilemanager import de.fabianonline.telegram_backup.UserManager import de.fabianonline.telegram_backup.DownloadManager - +import de.fabianonline.telegram_backup.DownloadProgressInterface import com.github.badoualy.telegram.tl.api.* import com.github.badoualy.telegram.tl.exception.RpcErrorException @@ -76,12 +76,12 @@ class PhotoFileManager(message: JsonObject, file_base: String) : AbstractMediaFi } @Throws(RpcErrorException::class, IOException::class, TimeoutException::class) - override fun download(): Boolean { + override fun download(prog: DownloadProgressInterface?): Boolean { /*if (isEmpty) return true*/ //val loc = photo_size.getLocation() as TLFileLocation val loc = biggestSize["location"].obj - DownloadManager.downloadFile(targetPathAndFilename, size, loc["dcId"].int, loc["volumeId"].long, loc["localId"].int, loc["secret"].long) + DownloadManager.downloadFile(targetPathAndFilename, size, loc["dcId"].int, loc["volumeId"].long, loc["localId"].int, loc["secret"].long, prog) return true } } diff --git a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/UnsupportedFileManager.kt b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/UnsupportedFileManager.kt index 7e7a7e4..5f1a203 100644 --- a/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/UnsupportedFileManager.kt +++ b/src/main/kotlin/de/fabianonline/telegram_backup/mediafilemanager/UnsupportedFileManager.kt @@ -17,7 +17,7 @@ package de.fabianonline.telegram_backup.mediafilemanager import de.fabianonline.telegram_backup.UserManager - +import de.fabianonline.telegram_backup.DownloadProgressInterface import com.github.badoualy.telegram.tl.api.* import com.google.gson.JsonObject @@ -32,5 +32,5 @@ class UnsupportedFileManager(json: JsonObject, file_base: String, type: String) override val letter = " " override val description = "Unsupported / non-downloadable Media" - override fun download(): Boolean = true + override fun download(prog: DownloadProgressInterface?): Boolean = true }