From 978e0d37e08640c747a8c58e413e95a0513728b1 Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Fri, 8 Sep 2023 13:38:11 +0800 Subject: [PATCH 1/4] webui: search api model change. --- webui/src/api/search.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/webui/src/api/search.ts b/webui/src/api/search.ts index 9837c222..7568dc89 100644 --- a/webui/src/api/search.ts +++ b/webui/src/api/search.ts @@ -2,7 +2,7 @@ import { Observable, } from 'rxjs'; -import type { BangumiRule } from '#/bangumi'; +import type { BangumiRule, BangumiAPI } from '#/bangumi'; export const apiSearch = { /** @@ -18,7 +18,12 @@ export const apiSearch = { eventSource.onmessage = ev => { try { - const data: BangumiRule = JSON.parse(ev.data); + const apiData: BangumiAPI = JSON.parse(ev.data); + const data: BangumiRule = { + ...apiData, + filter: apiData.filter.split(','), + rss_link: apiData.rss_link.split(','), + } observer.next(data); } catch (error) { console.error('[/search/bangumi] Parse Error |', { keyword }, 'response:', ev.data) From 6367cc22a211d4e3f1afce3594d0f81750f08273 Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Fri, 8 Sep 2023 20:18:21 +0800 Subject: [PATCH 2/4] webui: move search component to ab-search-bar.vue --- webui/src/components/ab-search-bar.vue | 61 ++++++++++++ webui/src/components/basic/ab-search.vue | 112 +++++++--------------- webui/src/components/layout/ab-topbar.vue | 2 +- webui/src/store/search.ts | 22 ++--- webui/types/dts/components.d.ts | 1 + 5 files changed, 108 insertions(+), 90 deletions(-) create mode 100644 webui/src/components/ab-search-bar.vue diff --git a/webui/src/components/ab-search-bar.vue b/webui/src/components/ab-search-bar.vue new file mode 100644 index 00000000..66c7b2dc --- /dev/null +++ b/webui/src/components/ab-search-bar.vue @@ -0,0 +1,61 @@ + + + + + + + \ No newline at end of file diff --git a/webui/src/components/basic/ab-search.vue b/webui/src/components/basic/ab-search.vue index b5535db1..e9678637 100644 --- a/webui/src/components/basic/ab-search.vue +++ b/webui/src/components/basic/ab-search.vue @@ -1,28 +1,25 @@ @@ -41,86 +38,47 @@ onMounted(() => { shadow-inner > + -
-
- {{ provider }} -
-
- -
-
- -
-
- {{ site }} +
+ {{ provider }} +
+
+ +
-
-
-
-
diff --git a/webui/src/components/layout/ab-topbar.vue b/webui/src/components/layout/ab-topbar.vue index a216116f..70db3766 100644 --- a/webui/src/components/layout/ab-topbar.vue +++ b/webui/src/components/layout/ab-topbar.vue @@ -76,7 +76,7 @@ onUnmounted(() => { AutoBangumi - +
diff --git a/webui/src/store/search.ts b/webui/src/store/search.ts index e809ab3e..ba497d59 100644 --- a/webui/src/store/search.ts +++ b/webui/src/store/search.ts @@ -12,10 +12,11 @@ import type {BangumiRule} from "#/bangumi"; export function useSearchStore() { const bangumiList = ref([]); const inputValue = ref(''); - const selectingProvider = ref(false); const providers = ref(['mikan', 'dmhy', 'nyaa']); - const provider = ref('mikan'); + const provider = ref(providers.value[0]); + + const loading = ref(true); const input$ = new Subject(); @@ -44,31 +45,28 @@ export function useSearchStore() { // 有输入更新后清理之前的搜索结果 bangumiList.value = []; return input - ? apiSearch.get(input, provider.value) - : EMPTY + ? apiSearch.get(input, provider.value) + : EMPTY }), tap((bangumi: BangumiRule) => { bangumiList.value.push(bangumi); + }), ).subscribe() function onSearch() { + console.log('onSearch'); + loading.value = true; input$.next(inputValue.value); - } - - function onSelect(site: string) { - provider.value = site; - selectingProvider.value = !selectingProvider.value - onSearch(); + loading.value = false; } return { input$, bangumiInfo$, inputValue, - selectingProvider, - onSelect, onSearch, + loading, provider, getProviders, providers, diff --git a/webui/types/dts/components.d.ts b/webui/types/dts/components.d.ts index 259589f9..681c039a 100644 --- a/webui/types/dts/components.d.ts +++ b/webui/types/dts/components.d.ts @@ -24,6 +24,7 @@ declare module '@vue/runtime-core' { AbRssItem: typeof import('./../../src/components/ab-rss-item.vue')['default'] AbRule: typeof import('./../../src/components/ab-rule.vue')['default'] AbSearch: typeof import('./../../src/components/basic/ab-search.vue')['default'] + AbSearchBar: typeof import('./../../src/components/ab-search-bar.vue')['default'] AbSelect: typeof import('./../../src/components/basic/ab-select.vue')['default'] AbSetting: typeof import('./../../src/components/ab-setting.vue')['default'] AbSidebar: typeof import('./../../src/components/layout/ab-sidebar.vue')['default'] From 522b33dc34d28ad0b676de8c178f61f2c36217cc Mon Sep 17 00:00:00 2001 From: EstrellaXD Date: Fri, 8 Sep 2023 21:15:20 +0800 Subject: [PATCH 3/4] webui: fix search.ts --- webui/src/components/ab-search-bar.vue | 29 +++++++++++++++++++++++- webui/src/components/basic/ab-search.vue | 8 +++---- webui/src/store/search.ts | 2 +- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/webui/src/components/ab-search-bar.vue b/webui/src/components/ab-search-bar.vue index 66c7b2dc..65b642c5 100644 --- a/webui/src/components/ab-search-bar.vue +++ b/webui/src/components/ab-search-bar.vue @@ -2,8 +2,17 @@ import {ref} from 'vue'; import {vOnClickOutside} from "@vueuse/components"; +defineEmits(['add-bangumi']); const showProvider = ref(false); -const {providers, getProviders, provider, loading, onSearch} = useSearchStore(); +const { + providers, + getProviders, + provider, + loading, + onSearch, + inputValue, + bangumiList, +} = useSearchStore(); onMounted(() => { getProviders(); @@ -18,6 +27,7 @@ function onSelect(site: string) { \ No newline at end of file diff --git a/webui/src/components/basic/ab-search.vue b/webui/src/components/basic/ab-search.vue index e9678637..9314fed4 100644 --- a/webui/src/components/basic/ab-search.vue +++ b/webui/src/components/basic/ab-search.vue @@ -16,9 +16,9 @@ withDefaults( defineEmits(['select', 'search']); -const inputValue = ref(''); +const inputValue = defineModel('inputValue'); -watch (inputValue, (val) => { +watch(inputValue, (val) => { console.log(val); }); @@ -44,7 +44,7 @@ watch (inputValue, (val) => { fill="#fff" is-btn btn-click - @click="$emit('search', inputValue)" + @click="$emit('search')" /> @@ -53,7 +53,7 @@ watch (inputValue, (val) => { type="text" :placeholder="$t('topbar.search.placeholder')" input-reset - @keyup.enter="$emit('search', inputValue)" + @keyup.enter="$emit('search')" />
Date: Sat, 9 Sep 2023 12:25:13 +0800 Subject: [PATCH 4/4] fix: backend parser error. search add button function. --- backend/src/module/rss/analyser.py | 10 +++++++--- webui/src/components/ab-add-bangumi.vue | 9 +++++---- webui/src/components/ab-search-bar.vue | 9 ++++++--- webui/src/components/layout/ab-topbar.vue | 18 +++++++++++++----- webui/src/pages/index/bangumi.vue | 11 +++++++---- webui/src/store/search.ts | 16 +++++++++------- 6 files changed, 47 insertions(+), 26 deletions(-) diff --git a/backend/src/module/rss/analyser.py b/backend/src/module/rss/analyser.py index 7dcdd355..549fdc0a 100644 --- a/backend/src/module/rss/analyser.py +++ b/backend/src/module/rss/analyser.py @@ -14,9 +14,13 @@ logger = logging.getLogger(__name__) class RSSAnalyser(TitleParser): def official_title_parser(self, bangumi: Bangumi, rss: RSSItem, torrent: Torrent): if rss.parser == "mikan": - bangumi.poster_link, bangumi.official_title = self.mikan_parser( - torrent.homepage - ) + try: + bangumi.poster_link, bangumi.official_title = self.mikan_parser( + torrent.homepage + ) + except AttributeError: + logger.warning("[Parser] Mikan torrent has no homepage info.") + pass elif rss.parser == "tmdb": tmdb_title, season, year, poster_link = self.tmdb_parser( bangumi.official_title, bangumi.season, settings.rss_parser.language diff --git a/webui/src/components/ab-add-bangumi.vue b/webui/src/components/ab-add-bangumi.vue index 21c6ff1b..00b3dba1 100644 --- a/webui/src/components/ab-add-bangumi.vue +++ b/webui/src/components/ab-add-bangumi.vue @@ -13,8 +13,8 @@ const message = useMessage(); const { getAll } = useBangumiStore(); const rss = ref(rssTemplate); +const searchRule = defineModel('searchRule', { default: null }); const rule = ref(ruleTemplate); - const parserType = ['mikan', 'tmdb', 'parser']; const window = reactive({ @@ -33,6 +33,10 @@ watch(show, (val) => { setTimeout(() => { window.next = false; }, 300); + } else if (val || searchRule.value) { + window.next = true; + window.rule = true; + rule.value = searchRule.value; } }); @@ -59,9 +63,6 @@ async function addRss() { window.loading = true; const data = await apiDownload.analysis(rss.value); window.loading = false; - const response = await apiRSS.add(rss.value); - message.success(response.msg_en); - console.log('rss', response); rule.value = data; window.next = true; window.rule = true; diff --git a/webui/src/components/ab-search-bar.vue b/webui/src/components/ab-search-bar.vue index 65b642c5..70b0e9d4 100644 --- a/webui/src/components/ab-search-bar.vue +++ b/webui/src/components/ab-search-bar.vue @@ -10,6 +10,7 @@ const { provider, loading, onSearch, + clearSearch, inputValue, bangumiList, } = useSearchStore(); @@ -63,9 +64,11 @@ function onSelect(site: string) {
- + + -.search-result-enter-active, .search-result-leave-active { +.result-enter-active { transition: all 0.3s; } diff --git a/webui/src/components/layout/ab-topbar.vue b/webui/src/components/layout/ab-topbar.vue index 70db3766..c3d0230f 100644 --- a/webui/src/components/layout/ab-topbar.vue +++ b/webui/src/components/layout/ab-topbar.vue @@ -7,12 +7,14 @@ import { Power, Refresh, } from '@icon-park/vue-next'; +import type {BangumiRule} from "#/bangumi"; const {t, changeLocale} = useMyI18n(); const {running, onUpdate, offUpdate} = useAppInfo(); -const show = ref(false); +const showAccount = ref(false); const showAdd = ref(false); +const searchRule = ref() const {start, pause, shutdown, restart, resetRule} = useProgramStore(); @@ -52,13 +54,19 @@ const items = [ label: () => t('topbar.profile.title'), icon: Me, handle: () => { - show.value = true; + showAccount.value = true; }, }, ]; const onSearchFocus = ref(false); +function addSearchResult(bangumi: BangumiRule) { + showAdd.value = true; + searchRule.value = bangumi; + console.log('searchRule', searchRule.value); +} + onBeforeMount(() => { onUpdate(); }); @@ -76,7 +84,7 @@ onUnmounted(() => { AutoBangumi
- +
@@ -88,8 +96,8 @@ onUnmounted(() => { >
- + - + diff --git a/webui/src/pages/index/bangumi.vue b/webui/src/pages/index/bangumi.vue index 322b041f..dff22418 100644 --- a/webui/src/pages/index/bangumi.vue +++ b/webui/src/pages/index/bangumi.vue @@ -14,8 +14,11 @@ definePage({