refactor(jm): 重构 JMComic 下载功能
All checks were successful
Sakura-Miki-build / Automatic-Packaging (push) Successful in 2m16s

- 优化了 OkHttpClient 实例的创建和配置
- 改进了错误处理和日志记录
- 调整了下载流程,增加了重定向处理
- 优化了变量声明和类型定义
This commit is contained in:
Grand-cocoa 2025-03-25 18:49:48 +08:00
parent 308c688f8c
commit d3931b215c

View File

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