diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 7b79d1d92..a751495af 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -2,6 +2,28 @@ 更新日志文档,版本顺序从新到旧,最新版本在最前(上)面。 +# 0.11.1 + +## 问题修复 + +- 插件无法正常新增附件 +- 当没有指定附件ID时无法正常保存附件 +- 多次引用同一个封面,会不停地给封面文件名添加前缀 +- 剧集的音乐分组DIST无法正常在控制台显示 +- 游戏条目绑定了压缩包资源时,剧集详情资源栏目显示异常 +- 控制台附件页无法正常输入名称 + +## 插件 + +- 番组计划插件升级适配v0.11.1和问题修复 +- Jellyfin插件升级适配v0.11.1和问题修复 +- 本地导入插件升级适配v0.11.1和问题修复 +- 蜜柑计划插件升级适配v0.11.1和问题修复 + +## 变更 + +- 控制台全局查询按键更改为`ctrl`+ `/`键 + # 0.11.0 ## 新特性 diff --git a/api/src/main/java/run/ikaros/api/core/attachment/AttachmentOperate.java b/api/src/main/java/run/ikaros/api/core/attachment/AttachmentOperate.java index a1eb68644..cd8a3f08f 100644 --- a/api/src/main/java/run/ikaros/api/core/attachment/AttachmentOperate.java +++ b/api/src/main/java/run/ikaros/api/core/attachment/AttachmentOperate.java @@ -27,4 +27,9 @@ Mono removeByTypeAndParentIdAndName( Mono createDirectory(@Nullable Long parentId, @NotBlank String name); + + Mono existsByParentIdAndName(@Nullable Long parentId, String name); + + Mono existsByTypeAndParentIdAndName(AttachmentType type, + @Nullable Long parentId, String name); } diff --git a/api/src/main/java/run/ikaros/api/core/attachment/AttachmentReferenceOperate.java b/api/src/main/java/run/ikaros/api/core/attachment/AttachmentReferenceOperate.java new file mode 100644 index 000000000..750ed8db7 --- /dev/null +++ b/api/src/main/java/run/ikaros/api/core/attachment/AttachmentReferenceOperate.java @@ -0,0 +1,25 @@ +package run.ikaros.api.core.attachment; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.ikaros.api.plugin.AllowPluginOperate; +import run.ikaros.api.store.enums.AttachmentReferenceType; + +public interface AttachmentReferenceOperate extends AllowPluginOperate { + Mono save(AttachmentReference attachmentReference); + + Flux findAllByTypeAndAttachmentId( + AttachmentReferenceType type, Long attachmentId); + + Mono removeById(Long attachmentRefId); + + Mono removeByTypeAndAttachmentIdAndReferenceId( + AttachmentReferenceType type, Long attachmentId, Long referenceId); + + Mono matchingAttachmentsAndSubjectEpisodes(Long subjectId, Long[] attachmentIds); + + Mono matchingAttachmentsAndSubjectEpisodes(Long subjectId, Long[] attachmentIds, + boolean notify); + + Mono matchingAttachmentsForEpisode(Long episodeId, Long[] attachmentIds); +} diff --git a/console/src/layouts/BasicLayout.vue b/console/src/layouts/BasicLayout.vue index 6094b4893..2d88c2aac 100644 --- a/console/src/layouts/BasicLayout.vue +++ b/console/src/layouts/BasicLayout.vue @@ -18,11 +18,11 @@ const asideWidth = computed(() => { const globalSearchDialogVisible = ref(false); -// const isMac = /macintosh|mac os x/i.test(navigator.userAgent); +const isMac = /macintosh|mac os x/i.test(navigator.userAgent); const handleGlobalSearchKeybinding = (e: KeyboardEvent) => { - const { key } = e; - if (key === '/') { + const { key, ctrlKey, metaKey } = e; + if (key === '/' && ((ctrlKey && !isMac) || metaKey)) { globalSearchDialogVisible.value = true; e.preventDefault(); } diff --git a/console/src/modules/common/constants.ts b/console/src/modules/common/constants.ts index 0096d0db5..8c0c01f6c 100644 --- a/console/src/modules/common/constants.ts +++ b/console/src/modules/common/constants.ts @@ -47,6 +47,11 @@ export const episodeGroupLabelMap = new Map([ ['COMMERCIAL_MESSAGE', '广告(CM)'], ['LIVE', '直播(Live)'], ['OTHER', '其它(Other)'], + ['MUSIC_DIST1', '音乐列表一(MUSIC_DIST1)'], + ['MUSIC_DIST2', '音乐列表二(MUSIC_DIST2)'], + ['MUSIC_DIST3', '音乐列表三(MUSIC_DIST3)'], + ['MUSIC_DIST4', '音乐列表四(MUSIC_DIST4)'], + ['MUSIC_DIST5', '音乐列表五(MUSIC_DIST5)'], ]); export const subjectTypes = [ diff --git a/console/src/modules/content/attachment/Attachments.vue b/console/src/modules/content/attachment/Attachments.vue index c432629f5..e665e7e84 100644 --- a/console/src/modules/content/attachment/Attachments.vue +++ b/console/src/modules/content/attachment/Attachments.vue @@ -378,8 +378,8 @@ watch(attachmentCondition.value, () => { const name = attachmentCondition.value.name; const parentId = attachmentCondition.value.parentId; const query = JSON.parse(JSON.stringify(route.query)); - if (name !== route.query.searchName) { - query.searchName = base64Encode(name); + if (name !== route.query.name) { + query.name = base64Encode(encodeURI(name)); } if (parentId !== parseInt(route.query.parentId as string)) { query.parentId = parentId + ''; diff --git a/console/src/modules/content/subject/EpisodeDetailsDialog.vue b/console/src/modules/content/subject/EpisodeDetailsDialog.vue index baa43a3ec..7aa589004 100644 --- a/console/src/modules/content/subject/EpisodeDetailsDialog.vue +++ b/console/src/modules/content/subject/EpisodeDetailsDialog.vue @@ -104,6 +104,7 @@ const urlIsArachivePackage = (url: string | undefined): boolean => { " >{{ episode?.resources[0].name }} +