From 6820937a4b129e0fb91a4aa6900712ba2347e2b0 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Sat, 23 May 2026 02:17:45 +0000 Subject: [PATCH] feat(ui): add DVD disc icon and strict disc-file logo rules --- frontend/src/assets/dvd.webp | Bin 0 -> 10390 bytes .../src/components/ReleaseVersionCard.vue | 42 ++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 frontend/src/assets/dvd.webp diff --git a/frontend/src/assets/dvd.webp b/frontend/src/assets/dvd.webp new file mode 100644 index 0000000000000000000000000000000000000000..dea82d411ecb467d5b8c2f0bd2f936beb868bdf2 GIT binary patch literal 10390 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/ReleaseVersionCard.vue b/frontend/src/components/ReleaseVersionCard.vue index 0c2da97..77ca912 100644 --- a/frontend/src/components/ReleaseVersionCard.vue +++ b/frontend/src/components/ReleaseVersionCard.vue @@ -35,10 +35,16 @@
+ { const isDisc = computed(() => { if (!props.torrent.playable_file) return false; - const filename = props.torrent.playable_file.toLowerCase(); - return filename.endsWith('movieobject.bdmv') || filename.endsWith('index.bdmv') || filename.endsWith('.iso'); + const filename = props.torrent.playable_file; + return blurayPlayablePattern.test(filename) || dvdPlayablePattern.test(filename) || filename.toLowerCase().endsWith('.iso'); +}); + +const isBlurayDisc = computed(() => { + if (!props.torrent.playable_file) return false; + return blurayPlayablePattern.test(props.torrent.playable_file); +}); + +const isDvdDisc = computed(() => { + if (!props.torrent.playable_file) return false; + return dvdPlayablePattern.test(props.torrent.playable_file); }); const showBlurayLogo = computed(() => { - if (!isDisc.value) return false; - const filename = (props.torrent.playable_file || '').toLowerCase(); - if (filename.endsWith('movieobject.bdmv') || filename.endsWith('index.bdmv')) return true; - return hasAnyTag( - blurayTagPattern, - props.torrent.quality, - props.torrent.codec, - props.torrent.audio, - props.torrent.title, - ); + return isBlurayDisc.value; +}); + +const showDvdLogo = computed(() => { + return isDvdDisc.value; }); const displayQualityBadge = computed(() => { @@ -285,7 +299,7 @@ function handleActivate(event: MouseEvent | KeyboardEvent) { align-self: stretch; } -.version-bluray-logo { +.version-disc-logo { align-self: center; width: auto; height: 22px;