Skip to content

Commit 3360d9d

Browse files
committed
Implement download helper for properly tracking download progress
1 parent a17e799 commit 3360d9d

File tree

3 files changed

+71
-6
lines changed

3 files changed

+71
-6
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
unitytranslate_version = 0.4.1
1+
unitytranslate_version = 0.4.2
22

33
# https://github.com/OpenNMT/CTranslate2/blob/master/python/ctranslate2/version.py
44
ct2_version = 4.6.0

library/src/main/kotlin/xyz/bluspring/unitytranslate/library/models/argos/ArgosPackageIndex.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import kotlinx.serialization.json.Json
44
import xyz.bluspring.unitytranslate.library.UnityTranslateLib
55
import xyz.bluspring.unitytranslate.library.models.ModelInfo
66
import xyz.bluspring.unitytranslate.library.models.PackageIndex
7+
import xyz.bluspring.unitytranslate.library.util.DownloadHelper
78
import java.net.URI
89
import java.nio.file.Path
910
import java.util.zip.ZipFile
@@ -62,6 +63,13 @@ class ArgosPackageIndex(path: Path) : PackageIndex<ArgosPackage>(path, "argos")
6263

6364
override suspend fun getOrDownloadModelInfo(pkg: ArgosPackage): ModelInfo {
6465
val pkgDir = path.resolve("${pkg.code}_${pkg.packageVersion}")
66+
val downloadId = "argos_${pkg.code}"
67+
68+
if (DownloadHelper.getDownloadInfo(downloadId) != null) {
69+
while (DownloadHelper.getDownloadInfo(downloadId) != null) {
70+
// just keep blocking I guess? idk how else to handle this
71+
}
72+
}
6573

6674
if (pkgDir.exists()) {
6775
return ModelInfo(
@@ -78,11 +86,8 @@ class ArgosPackageIndex(path: Path) : PackageIndex<ArgosPackage>(path, "argos")
7886
try {
7987
val url = URI.create(link).toURL()
8088
val zipPath = path.resolve("${pkg.code}_${pkg.packageVersion}.argosmodel")
81-
url.openStream().use {
82-
zipPath.outputStream().use { o ->
83-
it.copyTo(o)
84-
}
85-
}
89+
90+
DownloadHelper.download(downloadId, url.openConnection(), zipPath)
8691

8792
val zipFile = ZipFile(zipPath)
8893
for (entry in zipFile.entries()) {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package xyz.bluspring.unitytranslate.library.util
2+
3+
import java.io.File
4+
import java.net.URLConnection
5+
import java.util.*
6+
7+
object DownloadHelper {
8+
val runningDownloads: MutableList<DownloadInfo> = Collections.synchronizedList(mutableListOf<DownloadInfo>())
9+
10+
fun getDownloadInfo(id: String): DownloadInfo? {
11+
synchronized(runningDownloads) {
12+
return runningDownloads.firstOrNull { it.id == id }
13+
}
14+
}
15+
16+
fun getAllDownloadsById(id: String): List<DownloadInfo> {
17+
synchronized(runningDownloads) {
18+
return runningDownloads.filter { it.id == id }
19+
}
20+
}
21+
22+
fun download(id: String, connection: URLConnection, output: File) {
23+
val tempOutput = output.parentFile.resolve("${output.name}.tmp")
24+
val info = DownloadInfo(id, connection, tempOutput, output)
25+
26+
if (tempOutput.exists())
27+
tempOutput.delete()
28+
29+
runningDownloads.add(info)
30+
try {
31+
connection.inputStream.use {
32+
tempOutput.outputStream().use { o ->
33+
it.copyTo(o)
34+
}
35+
}
36+
37+
if (output.exists())
38+
output.delete()
39+
40+
tempOutput.renameTo(output)
41+
} finally {
42+
runningDownloads.remove(info)
43+
}
44+
}
45+
46+
data class DownloadInfo(val id: String, private val connection: URLConnection, private val tempOutput: File, private val output: File) {
47+
val totalLength: Long
48+
get() {
49+
return connection.contentLengthLong
50+
}
51+
52+
val currentLength: Long
53+
get() {
54+
return if (tempOutput.exists())
55+
tempOutput.length()
56+
else
57+
output.length()
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)