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 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<Int>("workflow_runs[0].id")
val jobId = listBody.getByPath<Long>("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<String>("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<Int>("artifacts[0].id")
val artifactId = artifactsBody.getByPath<Long>("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)
}
}