Skip to content

Commit decc56a

Browse files
committed
feat(share): add data view media upload support
implement data view media upload functionality in share service add new API endpoint for data view media upload add i18n translations for data view media processing messages process data view media resources in batches similar to regular media
1 parent 425c1b2 commit decc56a

File tree

4 files changed

+200
-4
lines changed

4 files changed

+200
-4
lines changed

src/api/share-api.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ class ShareApi {
6464
return res
6565
}
6666

67+
public async uploadDataViewMedia(shareBody: any) {
68+
const res = await this.shareServiceRequest(ServiceApiKeys.API_UPLOAD_DATA_VIEW_MEDIA, shareBody)
69+
this.logger.info("data view media uploaded =>", res)
70+
return res
71+
}
72+
6773
public async listDoc(params: any) {
6874
const res = await this.shareServiceRequest(ServiceApiKeys.API_LIST_DOC, params)
6975
this.logger.info("get share list =>", res)
@@ -161,6 +167,7 @@ enum ServiceApiKeys {
161167
API_SHARE_UPDATE_OPTIONS = "/api/share/updateOptions",
162168
API_LICENSE_VIP_INFO = "/api/license/vipInfo",
163169
API_UPLOAD_MEDIA = "/api/asset/upload",
170+
API_UPLOAD_DATA_VIEW_MEDIA = "/api/asset/uploadDataView",
164171
API_LIST_DOC = "/api/share/listDoc",
165172
API_GET_SETTING = "/api/settings/share",
166173
API_GET_SETTING_BY_AUTHOR = "/api/settings/byAuthor",

src/i18n/en_US.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,24 @@
114114
"processingMedia": "Processing media files",
115115
"nonImageResource": "Non-image resource detected, skipping",
116116
"getPost": "Get document information",
117-
"getDataViews": "Get data views"
117+
"getDataViews": "Get data views",
118+
"msgProcessDataViewMedia": "Processing database media resources",
119+
"msgStartDataViewMediaBack": "Backend processing database media started...",
120+
"msgEndDataViewMediaBack": "Backend processing database media completed.",
121+
"msgStartDataViewGroup": "Starting to process database media group [param1]. Total [param2] groups, each group contains [param3] items.",
122+
"msgStartCurrentDataViewMedia": "Starting to process database media index [param1]: [param2], please wait...",
123+
"msgDataViewGroupProcessSuccess": "Database media group [param1] processed successfully. Total [param2] groups, each group contains [param3] items.",
124+
"msgDataViewMediaUploadError": "An exception occurred while uploading database media =>",
125+
"msgProcessDataViewMediaBatch": "Preparing to upload database media group [param1], please wait...",
126+
"msgDataViewBatchResult": "Database media batch processing result=>",
127+
"msgSuccessUpdateDataViewMedia": "」has successfully updated database media resources",
128+
"msgCurrentDataViewMediaSuccess": "Group [param1] has successfully uploaded database media",
129+
"msgCurrentDataViewMediaError": "Group [param1] database media upload failed=>",
130+
"successDataViewMedia": "Congratulations, all database media have been processed successfully",
131+
"successDataViewMediaCount": "All database media have been processed, total ([param1]), succeed ([param2]), failed ([param3])",
132+
"errorDataViewMedia": "[param1] database media failed to process, please check the logs",
133+
"processingDataViewMedia": "Processing database media files",
134+
"nonDataViewMediaResource": "Non-database media resource detected, skipping"
118135
},
119136
"topbar": {
120137
"shareSuccessError": "Share service exception, please contact [email protected]:",

src/i18n/zh_CN.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,24 @@
116116
"processingMedia": "正在处理媒体文件",
117117
"nonImageResource": "检测到非图片资源,跳过处理",
118118
"getPost": "获取文档信息",
119-
"getDataViews": "获取数据视图"
119+
"getDataViews": "获取数据库",
120+
"msgProcessDataViewMedia": "文本已分享,检测到数据库媒体资源,开始处理数据库资源...",
121+
"msgStartDataViewMediaBack": "后台处理数据库媒体开始...",
122+
"msgEndDataViewMediaBack": "后台处理数据库媒体完毕.",
123+
"msgStartDataViewGroup": "开始处理数据库媒体第[param1]组.共[param2]组,每组[param3]个资源",
124+
"msgStartCurrentDataViewMedia": "开始处理数据库媒体第[param1]个:[param2] ,请稍候...",
125+
"msgDataViewGroupProcessSuccess": "数据库媒体第[param1]组处理完毕.共[param2]组,每组[param3]个资源",
126+
"msgDataViewMediaUploadError": "上传数据库媒体时发生异常 =>",
127+
"msgProcessDataViewMediaBatch": "准备批量上传数据库媒体第[param1]组,请稍候...",
128+
"msgDataViewBatchResult": "数据库媒体批量处理结果=>",
129+
"msgSuccessUpdateDataViewMedia": "」已成功更新数据库媒体资源",
130+
"msgCurrentDataViewMediaSuccess": "第[param1]组已成功上传数据库媒体",
131+
"msgCurrentDataViewMediaError": "第[param1]组数据库媒体上传失败=>",
132+
"successDataViewMedia": "恭喜你,数据库媒体全部处理成功",
133+
"successDataViewMediaCount": "数据库媒体全部处理完毕,总数([param1]),成功([param2]),失败([param3])",
134+
"errorDataViewMedia": "[param1]个数据库媒体处理失败,请查看日志",
135+
"processingDataViewMedia": "正在处理数据库媒体文件",
136+
"nonDataViewMediaResource": "检测到非数据库媒体资源,跳过处理"
120137
},
121138
"topbar": {
122139
"shareSuccessError": "分享服务异常,请联系 [email protected]",

src/service/ShareService.ts

Lines changed: 157 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,30 @@ class ShareService {
114114
.replace("[param2]", "[" + docId + "]")
115115
this.addLog(successMsg, "info")
116116

117-
// 处理图片
117+
// 处理图片和DataViews媒体资源
118118
const data = resp.data
119+
120+
// 处理常规媒体资源
119121
const media = data.media
120122
if (media && media.length > 0) {
121123
showMessage(this.pluginInstance.i18n["shareService"]["msgProcessPic"], 7000, "info")
122124
// 异步处理图片
123125
this.addLog(this.pluginInstance.i18n["shareService"]["msgStartPicBack"], "info")
124126
void this.processShareMedia(docId, media)
125127
this.addLog(this.pluginInstance.i18n["shareService"]["msgEndPicBack"], "info")
126-
} else {
128+
}
129+
130+
// 处理数据库媒体资源
131+
const dataViewMedia = data.dataViewMedia
132+
if (dataViewMedia && dataViewMedia.length > 0) {
133+
showMessage(this.pluginInstance.i18n["shareService"]["msgProcessPic"], 7000, "info")
134+
// 异步处理数据库媒体资源
135+
this.addLog(this.pluginInstance.i18n["shareService"]["msgStartDataViewMediaBack"], "info")
136+
void this.processDataViewMedia(docId, dataViewMedia)
137+
this.addLog(this.pluginInstance.i18n["shareService"]["msgEndDataViewMediaBack"], "info")
138+
}
139+
140+
if (!media || media.length === 0) {
127141
showMessage(this.pluginInstance.i18n["shareService"]["msgShareSuccess"], 3000, "info")
128142
}
129143
} catch (e) {
@@ -355,6 +369,147 @@ class ShareService {
355369
}
356370
}
357371

372+
/**
373+
* 处理数据库媒体资源
374+
* @param docId 文档ID
375+
* @param mediaList 数据库媒体资源列表
376+
*/
377+
private async processDataViewMedia(docId: string, mediaList: any[]) {
378+
const processingMsg = this.pluginInstance.i18n["shareService"]["processingDataViewMedia"] + ":" + docId
379+
this.addLog(processingMsg, "info")
380+
const { cfg } = await ApiUtils.getSiyuanKernelApi(this.pluginInstance)
381+
382+
const perReq = 5
383+
const groupedMedia = []
384+
for (let i = 0; i < mediaList.length; i += perReq) {
385+
groupedMedia.push(mediaList.slice(i, i + perReq))
386+
}
387+
388+
let errorCount = 0
389+
let successCount = 0
390+
let totalCount = 0
391+
for (let i = 0; i < groupedMedia.length; i++) {
392+
const mediaGroup = groupedMedia[i]
393+
const processedParams = []
394+
395+
const msgStartGroup = this.pluginInstance.i18n["shareService"]["msgStartGroup"]
396+
const msgStartGroupWithParam = msgStartGroup
397+
.replace("[param1]", i + 1)
398+
.replace("[param2]", groupedMedia.length)
399+
.replace("[param3]", perReq)
400+
this.addLog(msgStartGroupWithParam, "info")
401+
for (const media of mediaGroup) {
402+
try {
403+
totalCount += 1
404+
405+
const originalUrl = media.originalUrl ?? ""
406+
let imageUrl = originalUrl
407+
const alt = media.alt
408+
const title = media.title
409+
410+
if (!imageUrl.startsWith("http")) {
411+
if (cfg.serviceApiConfig.apiUrl.endsWith("/")) {
412+
imageUrl = cfg.siyuanConfig.apiUrl + imageUrl
413+
} else {
414+
imageUrl = cfg.siyuanConfig.apiUrl + "/" + imageUrl
415+
}
416+
}
417+
418+
const msgStartCurrentPic = this.pluginInstance.i18n["shareService"]["msgStartCurrentDataViewMedia"]
419+
const msgStartCurrentPicWithParam = msgStartCurrentPic
420+
.replace("[param1]", totalCount)
421+
.replace("[param2]", imageUrl)
422+
this.addLog(msgStartCurrentPicWithParam, "info")
423+
424+
const res = await ImageUtils.fetchBase64WithContentType(imageUrl)
425+
this.addLog(`DataView image base64 response =>${res}`, "info")
426+
427+
if (res?.status !== 200) {
428+
errorCount += 1
429+
this.addLog(`DataView image retrieval error: ${res.msg}`, "error")
430+
continue
431+
}
432+
433+
const base64 = res.body
434+
const type = res.contentType
435+
const params = {
436+
file: base64,
437+
originalUrl: originalUrl,
438+
alt: alt,
439+
title: title,
440+
type: type,
441+
source: "dataviews" // 标识资源来源为DataView
442+
}
443+
processedParams.push(params)
444+
} catch (e) {
445+
const mediaErrorMsg = this.pluginInstance.i18n["shareService"]["msgDataViewMediaUploadError"] + e
446+
this.addLog(mediaErrorMsg, "error")
447+
showMessage(this.pluginInstance.i18n["shareService"]["msgDataViewMediaUploadError"] + e, 7000, "error")
448+
}
449+
}
450+
const msgGroupProcessSuccess = this.pluginInstance.i18n["shareService"]["msgGroupProcessSuccess"]
451+
const msgGroupProcessSuccessWithParam = msgGroupProcessSuccess
452+
.replace("[param1]", i + 1)
453+
.replace("[param2]", groupedMedia.length)
454+
.replace("[param3]", perReq)
455+
this.addLog(msgGroupProcessSuccessWithParam, "info")
456+
457+
const hasNext = i < groupedMedia.length - 1
458+
const reqParams = {
459+
docId: docId,
460+
medias: processedParams,
461+
hasNext: hasNext,
462+
}
463+
464+
// 处理上传结果
465+
const msgProcessPicBatch = this.pluginInstance.i18n["shareService"]["msgProcessDataViewMediaBatch"]
466+
const msgProcessPicBatchWithParam = msgProcessPicBatch.replace("[param1]", i + 1)
467+
this.addLog(msgProcessPicBatchWithParam, "info")
468+
const uploadResult = await this.shareApi.uploadDataViewMedia(reqParams)
469+
this.addLog(this.pluginInstance.i18n["shareService"]["msgBatchResult"] + JSON.stringify(uploadResult), "info")
470+
if (uploadResult.code === 0) {
471+
successCount += processedParams.length
472+
if (!hasNext) {
473+
showMessage(
474+
this.pluginInstance.i18n["shareService"]["msgYourDoc"] +
475+
docId +
476+
this.pluginInstance.i18n["shareService"]["msgSuccessUpdateDataViewMedia"],
477+
3000,
478+
"info"
479+
)
480+
}
481+
const msgCurrentMediaSuccess = this.pluginInstance.i18n["shareService"]["msgCurrentDataViewMediaSuccess"]
482+
const msgCurrentMediaSuccessWithParam = msgCurrentMediaSuccess.replace("[param1]", i + 1)
483+
this.addLog(msgCurrentMediaSuccessWithParam, "info")
484+
} else {
485+
errorCount += processedParams.length
486+
let rtnMsg = uploadResult.msg
487+
if (!uploadResult.msg) {
488+
rtnMsg = (uploadResult as any).message
489+
}
490+
const msgCurrentMediaError = this.pluginInstance.i18n["shareService"]["msgCurrentDataViewMediaError"]
491+
const msgCurrentMediaErrorWithParam = msgCurrentMediaError.replace("[param1]", i + 1)
492+
const errMsg = msgCurrentMediaErrorWithParam + rtnMsg
493+
this.addLog(errMsg, "error")
494+
showMessage(errMsg, 7000, "error")
495+
}
496+
}
497+
498+
const successPic = this.pluginInstance.i18n["shareService"]["successDataViewMedia"]
499+
const successPicWithParam = successPic
500+
.replace("[param1]", totalCount)
501+
.replace("[param2]", successCount)
502+
.replace("[param3]", errorCount)
503+
this.addLog(successPicWithParam, "info")
504+
if (successCount === totalCount) {
505+
showMessage(this.pluginInstance.i18n["shareService"]["success"], 3000, "info")
506+
} else {
507+
const errorPic = this.pluginInstance.i18n["shareService"]["errorDataViewMedia"]
508+
const msgWithParam = errorPic.replace("[param1]", errorCount)
509+
showMessage(msgWithParam, 7000, "error")
510+
}
511+
}
512+
358513
private addLog(msg: string, type: "info" | "error") {
359514
updateStatusBar(this.pluginInstance, msg)
360515
if (type === "info") {

0 commit comments

Comments
 (0)