4, partial 5

This commit is contained in:
2026-02-04 01:00:57 -05:00
parent 7b5c256e07
commit d5ce8452e4
20 changed files with 2215 additions and 69 deletions

116
src/types/feed.ts Normal file
View File

@@ -0,0 +1,116 @@
/**
* Feed type definitions for PodTUI
*/
import type { Podcast } from "./podcast"
import type { Episode, EpisodeStatus } from "./episode"
/** Feed visibility */
export enum FeedVisibility {
PUBLIC = "public",
PRIVATE = "private",
}
/** Feed information */
export interface Feed {
/** Unique identifier */
id: string
/** Associated podcast */
podcast: Podcast
/** Episodes in this feed */
episodes: Episode[]
/** Whether feed is public or private */
visibility: FeedVisibility
/** Source ID that provided this feed */
sourceId: string
/** Last updated timestamp */
lastUpdated: Date
/** Custom feed name (user-defined) */
customName?: string
/** User notes about this feed */
notes?: string
/** Whether feed is pinned/favorited */
isPinned: boolean
/** Feed color for UI */
color?: string
}
/** Feed item for display in lists */
export interface FeedItem {
/** Episode data */
episode: Episode
/** Parent podcast */
podcast: Podcast
/** Feed ID */
feedId: string
/** Episode status */
status: EpisodeStatus
/** Progress percentage (0-100) */
progressPercent: number
/** Whether this item is new (unplayed) */
isNew: boolean
}
/** Feed filter options */
export interface FeedFilter {
/** Filter by visibility */
visibility?: FeedVisibility | "all"
/** Filter by source ID */
sourceId?: string
/** Filter by pinned status */
pinnedOnly?: boolean
/** Search query for filtering */
searchQuery?: string
/** Sort field */
sortBy?: FeedSortField
/** Sort direction */
sortDirection?: "asc" | "desc"
}
/** Feed sort fields */
export enum FeedSortField {
/** Sort by last updated */
UPDATED = "updated",
/** Sort by title */
TITLE = "title",
/** Sort by episode count */
EPISODE_COUNT = "episodeCount",
/** Sort by most recent episode */
LATEST_EPISODE = "latestEpisode",
}
/** Feed list display options */
export interface FeedListOptions {
/** Show episode count */
showEpisodeCount: boolean
/** Show last updated */
showLastUpdated: boolean
/** Show source indicator */
showSource: boolean
/** Compact mode */
compact: boolean
}
/** Default feed list options */
export const DEFAULT_FEED_LIST_OPTIONS: FeedListOptions = {
showEpisodeCount: true,
showLastUpdated: true,
showSource: false,
compact: false,
}
/** Feed statistics */
export interface FeedStats {
/** Total feed count */
totalFeeds: number
/** Public feed count */
publicFeeds: number
/** Private feed count */
privateFeeds: number
/** Total episode count across all feeds */
totalEpisodes: number
/** Unplayed episode count */
unplayedEpisodes: number
/** In-progress episode count */
inProgressEpisodes: number
}