refactor(jm): 重构 JMComic 下载功能
All checks were successful
Sakura-Miki-build / Automatic-Packaging (push) Successful in 2m16s
All checks were successful
Sakura-Miki-build / Automatic-Packaging (push) Successful in 2m16s
- 优化了 OkHttpClient 实例的创建和配置 - 改进了错误处理和日志记录 - 调整了下载流程,增加了重定向处理 - 优化了变量声明和类型定义
This commit is contained in:
parent
308c688f8c
commit
d3931b215c
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user