diff --git a/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt index 3020de6..1801157 100644 --- a/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt +++ b/src/main/kotlin/info/alinadace/sakuramiki/service/jm/util/DownloadUtil.kt @@ -2,7 +2,7 @@ package info.alinadace.sakuramiki.service.jm.util import cn.hutool.core.lang.UUID import com.mavis.service.AlistService -import info.alinadace.sakuramiki.util.okHttpClient +import info.alinadace.sakuramiki.util.log import info.alinadace.sakuramiki.util.parse import jakarta.annotation.Resource import okhttp3.OkHttpClient @@ -19,30 +19,40 @@ import org.springframework.stereotype.Service @Service class DownloadUtil { companion object { - private const val DIR = "/AliDrive/JMComic" - private const val OWNER = "Grand-cocoa" - private const val REPO = "JMComic-Crawler-Python" - private const val WORKFLOW_ID = "151600689" - private const val BASE = "https://api.github.com" - private const val CREATE = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/dispatches" - private const val LIST = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/runs" - private const val GET = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d" - private const val ARTIFACTS = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d/artifacts" - private const val DOWNLOAD = "${BASE}/repos/${OWNER}/${REPO}/actions/artifacts/%d/zip" - private const val APIKEY = "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" + const val DIR = "/AliDrive/JMComic" + const val OWNER = "Grand-cocoa" + const val REPO = "JMComic-Crawler-Python" + const val WORKFLOW_ID = "151600689" + const val BASE = "https://api.github.com" + const val CREATE = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/dispatches" + const val LIST = "${BASE}/repos/${OWNER}/${REPO}/actions/workflows/${WORKFLOW_ID}/runs" + const val GET = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d" + const val ARTIFACTS = "${BASE}/repos/${OWNER}/${REPO}/actions/runs/%d/artifacts" + const val DOWNLOAD = "${BASE}/repos/${OWNER}/${REPO}/actions/artifacts/%d/zip" + const val APIKEY = "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" - private const val CREATE_BODY = """{"inputs": {"JM_ALBUM_IDS": "%s","JM_PHOTO_IDS": ""},"ref": "master"}""" + const val CREATE_BODY = """{"inputs": {"JM_ALBUM_IDS": "%s","JM_PHOTO_IDS": ""},"ref": "master"}""" - private fun OkHttpClient.newCall(url: String, method: String, body: RequestBody? = null): Response { + val okHttpClient = OkHttpClient.Builder() + .followRedirects(false) + .addInterceptor { + val build = it.request().newBuilder() + .addHeader("Authorization", "Bearer $APIKEY") + .build() + it.proceed(build) + } + .build() + + fun OkHttpClient.newCall(url: String, method: String, body: RequestBody? = null): Response { return this.newCall(Request.Builder() .url(url) .method(method, body) -// .addHeader("Content-Type", "application/json") - .addHeader("Authorization", "Bearer $APIKEY") - .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") - .addHeader("Accept", "*/*") - .addHeader("Host", "api.github.com") - .addHeader("Connection", "keep-alive") +//// .addHeader("Content-Type", "application/json") +//// .addHeader("Authorization", "Bearer $APIKEY") +// .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") +// .addHeader("Accept", "*/*") +// .addHeader("Host", "api.github.com") +// .addHeader("Connection", "keep-alive") .build()).execute() } } @@ -54,12 +64,14 @@ class DownloadUtil { val createBody = CREATE_BODY.format(id).toRequestBody() // Request.Builder().post(createBody).addHeader() val create = okHttpClient.newCall(CREATE, "POST", createBody) - if (create.code != 200) return + if (create.code != 200 && create.code != 204) return + log.info("JMDownload - 下载开始") Thread.sleep(3000) val list = okHttpClient.newCall(LIST, "GET") if (list.code != 200) return + log.info("JMDownload - 任务确认") val listBody = parse(list.body?.string()!!) - val jobId = listBody.getByPath("workflow_runs[0].id") + val jobId = listBody.getByPath("workflow_runs[0].id") var status = false for (i in 0..10){ Thread.sleep(10000) @@ -68,18 +80,29 @@ class DownloadUtil { val getBody = parse(get.body?.string()!!) if (getBody.getByPath("conclusion") == "success"){ status = true + log.info("JMDownload - 远程下载完成") break } + log.info("JMDownload - 进度查询") } if (!status) return val artifacts = okHttpClient.newCall(ARTIFACTS.format(jobId), "GET") if (artifacts.code != 200) return + log.info("JMDownload - 工件查询完毕") val artifactsBody = parse(artifacts.body?.string()!!) - val artifactId = artifactsBody.getByPath("artifacts[0].id") + val artifactId = artifactsBody.getByPath("artifacts[0].id") val download = okHttpClient.newCall(DOWNLOAD.format(artifactId), "GET") - if (download.code != 200) return - val blob = download.body?.bytes() - val fastUUID = UUID.fastUUID().toString(true) - alistService.uploadFile(blob, DIR, fastUUID) + if (download.code != 302) return + if (download.headers["Location"] == null) return + val downloadUrl = download.headers["Location"]!! + if (downloadUrl.isEmpty()) return + val downloadFile = okHttpClient.newCall(downloadUrl, "GET") + if (downloadFile.code != 200) return + log.info("JMDownload - 内容提取完毕") + val blob = downloadFile.body?.bytes() + val fastUUID = UUID.fastUUID().toString(true) + ".zip" + log.info("JMDownload - 开始上传 - {}:{}", DIR, fastUUID) + val uploadFile = alistService.uploadFile(blob, DIR, fastUUID) + log.info("JMDownload - 上传完毕 - {}", uploadFile) } }