Hide unsubscribed channels from the channels list, add a Saved tab
- GET /api/channels called with subscribed=true from the Channels page, so a channel disappears from the list as soon as it's unsubscribed instead of lingering with a badge - GET /api/feed gains a `downloaded` filter (this was already anticipated in the original TZ's feed query params but left unimplemented until download_jobs existed) -- matches on each video's *latest* job only, so a redownload/delete history doesn't leave stale matches - New /saved route: same category filtering, video grid and download actions as the main feed, scoped to downloaded videos only 2 new backend tests (76 total). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
62f8fb746b
commit
b29bcfb8d7
7 changed files with 127 additions and 3 deletions
|
|
@ -64,12 +64,13 @@ export function getChannel(channelId: number) {
|
|||
}
|
||||
|
||||
export function listChannels(
|
||||
params: { search?: string; categoryId?: number; uncategorized?: boolean } = {},
|
||||
params: { search?: string; categoryId?: number; uncategorized?: boolean; subscribed?: boolean } = {},
|
||||
) {
|
||||
const qs = new URLSearchParams()
|
||||
if (params.search) qs.set('search', params.search)
|
||||
if (params.categoryId != null) qs.set('category_id', String(params.categoryId))
|
||||
if (params.uncategorized) qs.set('uncategorized', 'true')
|
||||
if (params.subscribed != null) qs.set('subscribed', String(params.subscribed))
|
||||
const suffix = qs.toString() ? `?${qs.toString()}` : ''
|
||||
return request<ChannelDto[]>(`/api/channels${suffix}`)
|
||||
}
|
||||
|
|
@ -199,12 +200,19 @@ export function recheckLocal(youtubeVideoId: string) {
|
|||
}
|
||||
|
||||
export function getFeed(
|
||||
params: { categoryId?: number; uncategorized?: boolean; channelId?: number; cursor?: string } = {},
|
||||
params: {
|
||||
categoryId?: number
|
||||
uncategorized?: boolean
|
||||
channelId?: number
|
||||
downloaded?: boolean
|
||||
cursor?: string
|
||||
} = {},
|
||||
) {
|
||||
const qs = new URLSearchParams()
|
||||
if (params.categoryId != null) qs.set('category_id', String(params.categoryId))
|
||||
if (params.uncategorized) qs.set('uncategorized', 'true')
|
||||
if (params.channelId != null) qs.set('channel_id', String(params.channelId))
|
||||
if (params.downloaded) qs.set('downloaded', 'true')
|
||||
if (params.cursor) qs.set('cursor', params.cursor)
|
||||
const suffix = qs.toString() ? `?${qs.toString()}` : ''
|
||||
return request<{ items: FeedVideoDto[]; next_cursor: string | null }>(`/api/feed${suffix}`)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue