diff --git a/crates/bili_sync/src/api/request.rs b/crates/bili_sync/src/api/request.rs index 672d19c..ded5b0f 100644 --- a/crates/bili_sync/src/api/request.rs +++ b/crates/bili_sync/src/api/request.rs @@ -82,6 +82,7 @@ pub struct FollowedCollectionsRequest { pub struct FollowedUppersRequest { pub page_num: Option, pub page_size: Option, + pub name: Option, } #[derive(Deserialize, Validate)] diff --git a/crates/bili_sync/src/api/routes/me/mod.rs b/crates/bili_sync/src/api/routes/me/mod.rs index 36162d1..cdf8a7c 100644 --- a/crates/bili_sync/src/api/routes/me/mod.rs +++ b/crates/bili_sync/src/api/routes/me/mod.rs @@ -153,7 +153,9 @@ pub async fn get_followed_uppers( let credential = &VersionedConfig::get().read().credential; let me = Me::new(bili_client.as_ref(), credential); let (page_num, page_size) = (params.page_num.unwrap_or(1), params.page_size.unwrap_or(20)); - let bili_uppers = me.get_followed_uppers(page_num, page_size).await?; + let bili_uppers = me + .get_followed_uppers(page_num, page_size, params.name.as_deref()) + .await?; let bili_uid: Vec<_> = bili_uppers.list.iter().map(|upper| upper.mid).collect(); diff --git a/crates/bili_sync/src/bilibili/me.rs b/crates/bili_sync/src/bilibili/me.rs index 819723b..78bd551 100644 --- a/crates/bili_sync/src/bilibili/me.rs +++ b/crates/bili_sync/src/bilibili/me.rs @@ -60,21 +60,31 @@ impl<'a> Me<'a> { Ok(serde_json::from_value(resp["data"].take())?) } - pub async fn get_followed_uppers(&self, page_num: i32, page_size: i32) -> Result { + pub async fn get_followed_uppers( + &self, + page_num: i32, + page_size: i32, + name: Option<&str>, + ) -> Result { ensure!( !self.mid().is_empty(), "未获取到用户 ID,请确保填写设置中的 B 站认证信息" ); - let mut resp = self + let url = if name.is_some() { + "https://api.bilibili.com/x/relation/followings/search" + } else { + "https://api.bilibili.com/x/relation/followings" + }; + let mut request = self .client - .request( - Method::GET, - "https://api.bilibili.com/x/relation/followings", - self.credential, - ) + .request(Method::GET, url, self.credential) .await .query(&[("vmid", self.mid())]) - .query(&[("pn", page_num), ("ps", page_size)]) + .query(&[("pn", page_num), ("ps", page_size)]); + if let Some(name) = name { + request = request.query(&[("name", name)]); + } + let mut resp = request .send() .await? .error_for_status()? diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index 5293cbc..2cbffb2 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -199,11 +199,13 @@ class ApiClient { async getFollowedUppers( pageNum?: number, - pageSize?: number + pageSize?: number, + name?: string ): Promise> { const params = { page_num: pageNum, - page_size: pageSize + page_size: pageSize, + name: name }; return this.get('/me/uppers', params as Record); } @@ -294,8 +296,8 @@ const api = { getCreatedFavorites: () => apiClient.getCreatedFavorites(), getFollowedCollections: (pageNum?: number, pageSize?: number) => apiClient.getFollowedCollections(pageNum, pageSize), - getFollowedUppers: (pageNum?: number, pageSize?: number) => - apiClient.getFollowedUppers(pageNum, pageSize), + getFollowedUppers: (pageNum?: number, pageSize?: number, name?: string) => + apiClient.getFollowedUppers(pageNum, pageSize, name), insertFavorite: (request: InsertFavoriteRequest) => apiClient.insertFavorite(request), insertCollection: (request: InsertCollectionRequest) => apiClient.insertCollection(request), insertSubmission: (request: InsertSubmissionRequest) => apiClient.insertSubmission(request), diff --git a/web/src/routes/me/uppers/+page.svelte b/web/src/routes/me/uppers/+page.svelte index 88030f6..01bac68 100644 --- a/web/src/routes/me/uppers/+page.svelte +++ b/web/src/routes/me/uppers/+page.svelte @@ -3,6 +3,7 @@ import { toast } from 'svelte-sonner'; import SubscriptionCard from '$lib/components/subscription-card.svelte'; import Pagination from '$lib/components/pagination.svelte'; + import SearchBar from '$lib/components/search-bar.svelte'; import { setBreadcrumb } from '$lib/stores/breadcrumb'; import api from '$lib/api'; import type { Followed, ApiError } from '$lib/types'; @@ -11,13 +12,14 @@ let totalCount = 0; let currentPage = 0; let loading = false; + let searchQuery = ''; const pageSize = 50; - async function loadUppers(page: number = 0) { + async function loadUppers(page: number = 0, name?: string) { loading = true; try { - const response = await api.getFollowedUppers(page + 1, pageSize); // API 使用 1 基索引 + const response = await api.getFollowedUppers(page + 1, pageSize, name || undefined); // API 使用 1 基索引 uppers = response.data.uppers; totalCount = response.data.total; } catch (error) { @@ -32,12 +34,18 @@ function handleSubscriptionSuccess() { // 重新加载数据以获取最新状态 - loadUppers(currentPage); + loadUppers(currentPage, searchQuery); } async function handlePageChange(page: number) { currentPage = page; - await loadUppers(page); + await loadUppers(page, searchQuery); + } + + async function handleSearch(query: string) { + searchQuery = query; + currentPage = 0; + await loadUppers(0, query); } onMount(async () => { @@ -53,6 +61,10 @@
+
+ +
+
{#if !loading}