SYMBOL INDEX (786 symbols across 126 files) FILE: __tests__/__mocks__/bun-sqlite.ts class Database (line 3) | class Database { FILE: __tests__/reporter.ts type TaskState (line 5) | type TaskState = "pass" | "fail" | "skip" | "todo" | "pending" | "unknown"; type AnyTask (line 7) | type AnyTask = { type AnyFile (line 20) | type AnyFile = { type TaskResultPack (line 27) | type TaskResultPack = { function normalisePath (line 36) | function normalisePath(p: string) { function toRelative (line 40) | function toRelative(p: string) { function safeBasename (line 48) | function safeBasename(p: string) { function safeDirname (line 56) | function safeDirname(p: string) { function normaliseState (line 64) | function normaliseState(rawState: unknown, mode: unknown): TaskState { function iconFor (line 79) | function iconFor(state: TaskState) { function colourName (line 96) | function colourName(state: TaskState, text: string) { function formatDuration (line 110) | function formatDuration(ms?: number) { class PrettyReporter (line 116) | class PrettyReporter implements Reporter { method onInit (line 132) | onInit(ctx: Vitest) { method onTaskUpdate (line 144) | onTaskUpdate(packs: TaskResultPack[]) { method onTestRunEnd (line 179) | onTestRunEnd() { method getStateFiles (line 189) | private getStateFiles(): AnyFile[] { method ensureIndexedFromState (line 202) | private ensureIndexedFromState() { method renderProgressLine (line 224) | private renderProgressLine() { method printReportFromState (line 257) | private printReportFromState() { method computeTotals (line 361) | private computeTotals(files: AnyFile[]) { method computeFileTotals (line 390) | private computeFileTotals(file: AnyFile) { method printTaskTree (line 420) | private printTaskTree(task: AnyTask, indent: number) { FILE: __tests__/server/crossSeedCache.test.ts constant TEST_DATA_PATH (line 6) | const TEST_DATA_PATH = join(tmpdir(), `crossseed-test-${process.pid}`) FILE: __tests__/server/crossSeedWorker.test.ts function makeTorrentData (line 240) | function makeTorrentData(name: string, length: number): Buffer { type BencodeValue (line 244) | type BencodeValue = number | string | Buffer | BencodeValue[] | { [key: ... function encodeBencode (line 246) | function encodeBencode(data: BencodeValue): Buffer { function makeMultiFileTorrentData (line 275) | function makeMultiFileTorrentData( function resetState (line 287) | function resetState() { function mockQbtResponses (line 331) | function mockQbtResponses(torrents: unknown[], files: unknown[]) { FILE: __tests__/utils/fileTree.test.ts function createFile (line 6) | function createFile(name: string, size = 1000, priority = 1, progress = ... function createTestTree (line 113) | function createTestTree(): FileTreeNode[] { FILE: net-agent/main.go function main (line 22) | func main() { function detectSkipAuth (line 62) | func detectSkipAuth() bool { function withLogging (line 75) | func withLogging(next http.HandlerFunc) http.HandlerFunc { type statusWriter (line 84) | type statusWriter struct method WriteHeader (line 89) | func (w *statusWriter) WriteHeader(status int) { function withAuth (line 94) | func withAuth(next http.HandlerFunc) http.HandlerFunc { function validateSID (line 120) | func validateSID(sid string) bool { function handleHealth (line 134) | func handleHealth(w http.ResponseWriter, r *http.Request) { function handleIP (line 139) | func handleIP(w http.ResponseWriter, r *http.Request) { function handleSpeedtest (line 152) | func handleSpeedtest(w http.ResponseWriter, r *http.Request) { function handleSpeedtestServers (line 175) | func handleSpeedtestServers(w http.ResponseWriter, r *http.Request) { function handleDNS (line 190) | func handleDNS(w http.ResponseWriter, r *http.Request) { function handleInterfaces (line 211) | func handleInterfaces(w http.ResponseWriter, r *http.Request) { function handleExec (line 226) | func handleExec(w http.ResponseWriter, r *http.Request) { FILE: src/App.tsx type View (line 26) | type View = 'loading' | 'auth' | 'instances' | 'torrents' | 'mobile' type Tab (line 27) | type Tab = 'dashboard' | 'tools' type Tool (line 28) | type Tool = 'indexers' | 'files' | 'orphans' | 'rss' | 'logs' | 'cross-s... function parseHash (line 30) | function parseHash(): { tab: Tab; instanceId: number | null; tool: Tool } { function setHash (line 48) | function setHash(tab: Tab, instanceId: number | null, tool?: Tool) { function App (line 58) | function App() { FILE: src/api/auth.ts type User (line 1) | interface User { function register (line 6) | async function register(username: string, password: string): Promise { function logout (line 34) | async function logout(): Promise { function getMe (line 41) | async function getMe(): Promise { function changePassword (line 49) | async function changePassword(currentPassword: string, newPassword: stri... FILE: src/api/crossSeed.ts type MatchMode (line 1) | type MatchMode = 'strict' | 'flexible' type CrossSeedConfig (line 3) | interface CrossSeedConfig { type TorznabIndexer (line 22) | interface TorznabIndexer { type ScanResult (line 30) | interface ScanResult { type SchedulerStatus (line 43) | interface SchedulerStatus { type CacheStats (line 55) | interface CacheStats { type Searchee (line 60) | interface Searchee { type Decision (line 73) | interface Decision { function getCrossSeedConfig (line 85) | async function getCrossSeedConfig(instanceId: number): Promise { function getInstanceStatus (line 138) | async function getInstanceStatus(instanceId: number): Promise { function getSearchHistory (line 159) | async function getSearchHistory( function getDecisions (line 170) | async function getDecisions(instanceId: number, searcheeId: number): Pro... function stopScan (line 178) | async function stopScan(instanceId: number): Promise<{ stopped: boolean ... type LogEntry (line 190) | interface LogEntry { function getLogs (line 196) | async function getLogs(limit = 100): Promise { FILE: src/api/files.ts type FileEntry (line 1) | interface FileEntry { function listFiles (line 8) | async function listFiles(path: string): Promise { function getDownloadUrl (line 19) | function getDownloadUrl(path: string): string { function checkWritable (line 23) | async function checkWritable(): Promise { function deleteFiles (line 30) | async function deleteFiles(paths: string[]): Promise { function moveFiles (line 43) | async function moveFiles(paths: string[], destination: string): Promise<... function copyFiles (line 56) | async function copyFiles(paths: string[], destination: string): Promise<... function renameFile (line 69) | async function renameFile(path: string, newName: string): Promise { FILE: src/api/instances.ts type Instance (line 1) | interface Instance { type CreateInstanceData (line 12) | interface CreateInstanceData { type UpdateInstanceData (line 22) | interface UpdateInstanceData { function getInstances (line 32) | async function getInstances(): Promise { function createInstance (line 40) | async function createInstance(data: CreateInstanceData): Promise { FILE: src/api/integrations.ts type Integration (line 1) | interface Integration { type CreateIntegrationData (line 9) | interface CreateIntegrationData { type Indexer (line 16) | interface Indexer { type ProwlarrCategory (line 23) | interface ProwlarrCategory { type SearchResult (line 29) | interface SearchResult { function getIntegrations (line 44) | async function getIntegrations(): Promise { function createIntegration (line 50) | async function createIntegration(data: CreateIntegrationData): Promise { function testIntegrationConnection (line 72) | async function testIntegrationConnection( function getIndexers (line 89) | async function getIndexers(integrationId: number): Promise { function getProwlarrCategories (line 95) | async function getProwlarrCategories(integrationId: number): Promise(instanceId: number, endpoint: string): Pr... function getIpInfo (line 59) | async function getIpInfo(instanceId: number): Promise { function runSpeedtest (line 63) | async function runSpeedtest(instanceId: number, serverId?: number): Prom... function getSpeedtestServers (line 68) | async function getSpeedtestServers(instanceId: number): Promise<{ server... function getDnsInfo (line 72) | async function getDnsInfo(instanceId: number): Promise { function getInterfaces (line 76) | async function getInterfaces(instanceId: number): Promise { FILE: src/api/qbittorrent.ts function getBase (line 7) | function getBase(instanceId: number): string { function request (line 11) | async function request(instanceId: number, endpoint: string, options?... function action (line 30) | async function action(instanceId: number, endpoint: string, options?: Re... type TorrentFilterOptions (line 40) | interface TorrentFilterOptions { function getTorrents (line 46) | async function getTorrents(instanceId: number, options: TorrentFilterOpt... function getTransferInfo (line 55) | async function getTransferInfo(instanceId: number): Promise { function getSyncMaindata (line 59) | async function getSyncMaindata(instanceId: number): Promise { function stopTorrents (line 63) | async function stopTorrents(instanceId: number, hashes: string[]): Promi... function startTorrents (line 71) | async function startTorrents(instanceId: number, hashes: string[]): Prom... function recheckTorrents (line 79) | async function recheckTorrents(instanceId: number, hashes: string[]): Pr... function reannounceTorrents (line 87) | async function reannounceTorrents(instanceId: number, hashes: string[]):... function deleteTorrents (line 95) | async function deleteTorrents(instanceId: number, hashes: string[], dele... type AddTorrentOptions (line 106) | interface AddTorrentOptions { function addTorrent (line 117) | async function addTorrent(instanceId: number, options: AddTorrentOptions... type Category (line 156) | interface Category { function getCategories (line 161) | async function getCategories(instanceId: number): Promise { function createTags (line 213) | async function createTags(instanceId: number, tags: string): Promise { function toggleSpeedLimitsMode (line 343) | async function toggleSpeedLimitsMode(instanceId: number): Promise { function getPreferences (line 350) | async function getPreferences(instanceId: number): Promise { function setRSSRule (line 415) | async function setRSSRule(instanceId: number, ruleName: string, ruleDef:... function removeRSSRule (line 419) | async function removeRSSRule(instanceId: number, ruleName: string): Prom... function renameRSSRule (line 423) | async function renameRSSRule(instanceId: number, ruleName: string, newRu... function getMatchingArticles (line 427) | async function getMatchingArticles(instanceId: number, ruleName: string)... type LogEntry (line 431) | interface LogEntry { type PeerLogEntry (line 438) | interface PeerLogEntry { type LogOptions (line 446) | interface LogOptions { function getLog (line 454) | async function getLog(instanceId: number, options: LogOptions = {}): Pro... function getPeerLog (line 465) | async function getPeerLog(instanceId: number, lastKnownId?: number): Pro... FILE: src/api/stats.ts type PeriodStats (line 1) | interface PeriodStats { function getStats (line 10) | async function getStats(period: string): Promise { function getPeriods (line 16) | async function getPeriods(): Promise { FILE: src/components/AddTorrentModal.tsx type Props (line 5) | interface Props { type Tab (line 10) | type Tab = 'link' | 'file' function AddTorrentModal (line 12) | function AddTorrentModal({ open, onClose }: Props) { FILE: src/components/AuthForm.tsx type Props (line 5) | interface Props { function AuthForm (line 9) | function AuthForm({ onSuccess }: Props) { FILE: src/components/CategoryTagManager.tsx type Props (line 13) | interface Props { type Tab (line 18) | type Tab = 'categories' | 'tags' function CategoryTagManager (line 20) | function CategoryTagManager({ open, onClose }: Props) { FILE: src/components/ContextMenu.tsx type Props (line 21) | interface Props { type Submenu (line 28) | type Submenu = 'category' | 'addTag' | 'removeTag' | 'delete' | null type EditorMode (line 29) | type EditorMode = 'rename' | 'savePath' | 'downloadPath' | null function ContextMenu (line 31) | function ContextMenu({ x, y, torrents, onClose }: Props) { function MenuItem (line 318) | function MenuItem({ FILE: src/components/CrossSeedManager.tsx type Props (line 6) | interface Props { function CrossSeedManager (line 10) | function CrossSeedManager({ instances }: Props) { FILE: src/components/DateSettingsPopup.tsx type Props (line 4) | interface Props { function DateSettingsPopup (line 11) | function DateSettingsPopup({ anchor, hideTime, onSave, onClose }: Props) { FILE: src/components/FileBrowser.tsx function formatDate (line 15) | function formatDate(timestamp: number): string { type FolderPickerProps (line 25) | interface FolderPickerProps { function FolderPicker (line 31) | function FolderPicker({ title, onConfirm, onCancel }: FolderPickerProps) { type Props (line 141) | interface Props { function FileBrowser (line 145) | function FileBrowser({ enabled }: Props) { FILE: src/components/FilterBar.tsx type Props (line 33) | interface Props { function FilterBar (line 38) | function FilterBar({ filter, onFilterChange }: Props) { function SearchInput (line 60) | function SearchInput({ value, onChange }: { value: string; onChange: (s:... type DropdownProps (line 80) | interface DropdownProps { function Dropdown (line 88) | function Dropdown({ value, onChange, options, placehol... type CategoryDropdownProps (line 156) | interface CategoryDropdownProps { function CategoryDropdown (line 162) | function CategoryDropdown({ value, onChange, categories }: CategoryDropd... type TagDropdownProps (line 225) | interface TagDropdownProps { function TagDropdown (line 231) | function TagDropdown({ value, onChange, tags }: TagDropdownProps) { function ManageButton (line 293) | function ManageButton({ onClick }: { onClick: () => void }) { type TrackerDropdownProps (line 307) | interface TrackerDropdownProps { function TrackerDropdown (line 313) | function TrackerDropdown({ value, onChange, trackers }: TrackerDropdownP... type ColumnSelectorProps (line 325) | interface ColumnSelectorProps { function ColumnSelector (line 334) | function ColumnSelector({ columns, visible, onChange, columnOrder, onReo... FILE: src/components/Header.tsx type Tab (line 9) | type Tab = 'dashboard' | 'tools' type Props (line 11) | interface Props { function Header (line 20) | function Header({ activeTab, onTabChange, username, authDisabled, onLogo... FILE: src/components/InstanceManager.tsx type Tab (line 42) | type Tab = 'dashboard' | 'tools' type Tool (line 43) | type Tool = 'indexers' | 'files' | 'orphans' | 'rss' | 'logs' | 'cross-s... type InstanceStats (line 45) | interface InstanceStats { function SpeedGraph (line 61) | function SpeedGraph({ history, color }: { history: number[]; color: stri... type Props (line 82) | interface Props { function InstanceManager (line 93) | function InstanceManager({ FILE: src/components/Layout.tsx type Tab (line 5) | type Tab = 'dashboard' | 'tools' type Props (line 7) | interface Props { function Layout (line 16) | function Layout({ children, onTabChange, username, authDisabled, onLogou... FILE: src/components/LogViewer.tsx constant LOG_TYPES (line 7) | const LOG_TYPES = { type LogTab (line 14) | type LogTab = 'main' | 'peers' type SortOrder (line 15) | type SortOrder = 'newest' | 'oldest' type Props (line 17) | interface Props { function LogViewer (line 21) | function LogViewer({ instances }: Props) { FILE: src/components/NetworkTools.tsx type Props (line 34) | interface Props { type CardStatus (line 38) | type CardStatus = 'idle' | 'loading' | 'success' | 'error' type CardState (line 40) | interface CardState { function formatBandwidth (line 46) | function formatBandwidth(bps: number): string { function RunButton (line 51) | function RunButton({ onClick, disabled, loading }: { onClick: () => void... function NetworkTools (line 64) | function NetworkTools({ instances }: Props) { FILE: src/components/OrphanManager.tsx type OrphanTorrent (line 7) | interface OrphanTorrent { type Props (line 17) | interface Props { function OrphanManager (line 21) | function OrphanManager({ instances }: Props) { FILE: src/components/RSSManager.tsx type Tab (line 8) | type Tab = 'feeds' | 'rules' type ArticleDownloadProps (line 10) | interface ArticleDownloadProps { function ArticleDownload (line 17) | function ArticleDownload({ article, idx, instances, rss }: ArticleDownlo... type Props (line 88) | interface Props { function RSSManager (line 92) | function RSSManager({ instances }: Props) { FILE: src/components/RatioThresholdPopup.tsx type Props (line 3) | interface Props { function RatioThresholdPopup (line 10) | function RatioThresholdPopup({ anchor, threshold, onSave, onClose }: Pro... FILE: src/components/SearchPanel.tsx function formatAge (line 22) | function formatAge(dateStr: string): string { function SearchPanel (line 34) | function SearchPanel() { FILE: src/components/SettingsPanel.tsx type SettingsTab (line 15) | type SettingsTab = 'behavior' | 'downloads' | 'connection' | 'speed' | '... constant TABS (line 17) | const TABS: { id: SettingsTab; label: string; icon: ReactNode }[] = [ type Props (line 108) | interface Props { function SettingsPanel (line 113) | function SettingsPanel({ instance, onClose }: Props) { FILE: src/components/Statistics.tsx function Statistics (line 6) | function Statistics() { FILE: src/components/StatusBar.tsx function formatLimit (line 20) | function formatLimit(bytes: number): string { function PerPageDropdown (line 25) | function PerPageDropdown({ value, onChange }: { value: number; onChange:... function useAltSpeedMode (line 74) | function useAltSpeedMode(instanceId: number) { function StatusBar (line 105) | function StatusBar() { FILE: src/components/ThemeManager.tsx type View (line 9) | type View = 'list' | 'editor' type ThemeManagerProps (line 11) | interface ThemeManagerProps { function ThemeManager (line 15) | function ThemeManager({ onClose }: ThemeManagerProps) { type ListViewProps (line 118) | interface ListViewProps { function ListView (line 128) | function ListView({ customThemes, onClose, onNew, onEdit, onDelete, onEx... type EditorViewProps (line 208) | interface EditorViewProps { function EditorView (line 215) | function EditorView({ initialTheme, existingNames, onSave, onBack }: Edi... function ColorInput (line 349) | function ColorInput({ label, value, onChange }: { label: string; value: ... FILE: src/components/ThemeSwitcher.tsx function ThemeSwitcher (line 6) | function ThemeSwitcher() { function ThemeRow (line 103) | function ThemeRow({ FILE: src/components/TorrentDetailsPanel.tsx type Props (line 31) | interface Props { type Tab (line 42) | type Tab = 'general' | 'trackers' | 'peers' | 'http' | 'content' constant TABS (line 44) | const TABS: { id: Tab; label: string; Icon: React.ComponentType<{ classN... constant MIN_HEIGHT (line 52) | const MIN_HEIGHT = 120 constant MAX_HEIGHT_PERCENT (line 53) | const MAX_HEIGHT_PERCENT = 0.55 constant COLLAPSED_HEIGHT (line 54) | const COLLAPSED_HEIGHT = 36 constant TRACKER_STATUSES (line 56) | const TRACKER_STATUSES: Record = { skip: 0, normal: 1, ... constant PRIORITY_COLORS (line 609) | const PRIORITY_COLORS: Record = { function ContentTabInner (line 617) | function ContentTabInner({ hash, files }: { hash: string; files: Torrent... function ContentTab (line 763) | function ContentTab({ hash }: { hash: string }) { function TorrentDetailsPanel (line 770) | function TorrentDetailsPanel({ hash, name, category, tags, expanded, onT... FILE: src/components/TorrentList.tsx constant DEFAULT_PANEL_HEIGHT (line 51) | const DEFAULT_PANEL_HEIGHT = 220 function SortIcon (line 53) | function SortIcon({ active, asc }: { active: boolean; asc: boolean }) { function ActionButton (line 64) | function ActionButton({ function TorrentList (line 90) | function TorrentList() { FILE: src/components/TorrentRow.tsx type StateType (line 6) | type StateType = 'accent' | 'warning' | 'muted' | 'info' | 'error' function getStateInfo (line 8) | function getStateInfo(state: TorrentState): { label: string; type: State... function getColor (line 35) | function getColor(type: StateType): string { constant TWO_PART_TLD_MARKERS (line 46) | const TWO_PART_TLD_MARKERS = new Set(['co', 'com', 'net', 'org', 'gov', ... function getTrackerName (line 48) | function getTrackerName(tracker: string): string { type CellContext (line 71) | interface CellContext { function renderCell (line 81) | function renderCell(columnId: string, torrent: Torrent, ctx: CellContext... type Props (line 273) | interface Props { function TorrentRow (line 286) | function TorrentRow({ FILE: src/components/ViewSelector.tsx type ViewSelectorProps (line 6) | interface ViewSelectorProps { function ViewSelector (line 16) | function ViewSelector({ FILE: src/components/columns.ts type SortKey (line 1) | type SortKey = type ColumnDef (line 23) | interface ColumnDef { constant COLUMNS (line 29) | const COLUMNS: ColumnDef[] = [ constant DEFAULT_VISIBLE_COLUMNS (line 52) | const DEFAULT_VISIBLE_COLUMNS = new Set([ constant DEFAULT_COLUMN_ORDER (line 64) | const DEFAULT_COLUMN_ORDER = COLUMNS.map((c) => c.id) FILE: src/components/settings/AdvancedTab.tsx type Props (line 5) | interface Props { constant RESUME_DATA_STORAGE_TYPES (line 10) | const RESUME_DATA_STORAGE_TYPES = [ constant TORRENT_CONTENT_REMOVE_OPTIONS (line 15) | const TORRENT_CONTENT_REMOVE_OPTIONS = [ constant DISK_IO_TYPES (line 20) | const DISK_IO_TYPES = [ constant DISK_IO_MODES (line 26) | const DISK_IO_MODES = [ constant UTP_TCP_MIXED_MODES (line 31) | const UTP_TCP_MIXED_MODES = [ constant UPLOAD_SLOTS_BEHAVIORS (line 36) | const UPLOAD_SLOTS_BEHAVIORS = [ constant UPLOAD_CHOKING_ALGORITHMS (line 41) | const UPLOAD_CHOKING_ALGORITHMS = [ function AdvancedTab (line 47) | function AdvancedTab({ preferences, onChange }: Props) { FILE: src/components/settings/BehaviorTab.tsx type Props (line 5) | interface Props { constant LOCALES (line 10) | const LOCALES = [ constant FILE_LOG_AGE_TYPES (line 31) | const FILE_LOG_AGE_TYPES = [ function BehaviorTab (line 37) | function BehaviorTab({ preferences, onChange }: Props) { FILE: src/components/settings/BitTorrentTab.tsx type Props (line 4) | interface Props { constant ENCRYPTION_OPTIONS (line 9) | const ENCRYPTION_OPTIONS = [ constant RATIO_ACTION_OPTIONS (line 15) | const RATIO_ACTION_OPTIONS = [ function BitTorrentTab (line 22) | function BitTorrentTab({ preferences, onChange }: Props) { FILE: src/components/settings/ConnectionTab.tsx type Props (line 4) | interface Props { constant PROTOCOL_OPTIONS (line 9) | const PROTOCOL_OPTIONS = [ constant PROXY_TYPES (line 15) | const PROXY_TYPES = [ function ConnectionTab (line 24) | function ConnectionTab({ preferences, onChange }: Props) { FILE: src/components/settings/DownloadsTab.tsx type Props (line 4) | interface Props { constant CONTENT_LAYOUT_OPTIONS (line 9) | const CONTENT_LAYOUT_OPTIONS = [ constant STOP_CONDITION_OPTIONS (line 15) | const STOP_CONDITION_OPTIONS = [ function DownloadsTab (line 21) | function DownloadsTab({ preferences, onChange }: Props) { FILE: src/components/settings/RSSTab.tsx type Props (line 4) | interface Props { function RSSTab (line 9) | function RSSTab({ preferences, onChange }: Props) { FILE: src/components/settings/SpeedTab.tsx constant SCHEDULER_DAYS (line 5) | const SCHEDULER_DAYS = [ type Props (line 18) | interface Props { function bytesToKB (line 23) | function bytesToKB(bytes: number | undefined): string { function kbToBytes (line 28) | function kbToBytes(kb: string): number { function SpeedTab (line 33) | function SpeedTab({ preferences, onChange }: Props) { FILE: src/components/settings/WebUITab.tsx type Props (line 5) | interface Props { constant DYNDNS_SERVICES (line 10) | const DYNDNS_SERVICES = [ function WebUITab (line 15) | function WebUITab({ preferences, onChange }: Props) { FILE: src/components/ui/Checkbox.tsx function Checkbox (line 4) | function Checkbox({ FILE: src/components/ui/MultiSelect.tsx type Option (line 5) | interface Option { type MultiSelectProps (line 10) | interface MultiSelectProps { function MultiSelect (line 17) | function MultiSelect({ options, selected, onChange, placeholder = 'Selec... FILE: src/components/ui/Select.tsx type SelectProps (line 4) | interface SelectProps { function Select (line 12) | function Select({ FILE: src/components/ui/Toggle.tsx function Toggle (line 1) | function Toggle({ checked, onChange }: { checked: boolean; onChange: (v:... FILE: src/contexts/InstanceProvider.tsx type Props (line 5) | interface Props { function InstanceProvider (line 10) | function InstanceProvider({ instance, children }: Props) { FILE: src/contexts/PaginationProvider.tsx function PaginationProvider (line 4) | function PaginationProvider({ children }: { children: ReactNode }) { FILE: src/contexts/ThemeContext.ts type ThemeContextValue (line 4) | interface ThemeContextValue { FILE: src/contexts/ThemeProvider.tsx constant STORAGE_KEY (line 5) | const STORAGE_KEY = 'qbitwebui-theme' constant CUSTOM_THEMES_KEY (line 6) | const CUSTOM_THEMES_KEY = 'qbitwebui-custom-themes' function applyTheme (line 8) | function applyTheme(colors: (typeof themes)[0]['colors']) { function ThemeProvider (line 24) | function ThemeProvider({ children }: { children: ReactNode }) { FILE: src/contexts/instanceContext.ts type InstanceContextValue (line 4) | interface InstanceContextValue { FILE: src/contexts/paginationContext.ts type PaginationContextValue (line 3) | interface PaginationContextValue { FILE: src/hooks/useClickOutside.ts function useClickOutside (line 3) | function useClickOutside(ref: RefObject, handler: ()... FILE: src/hooks/useCrossSeed.ts function useCrossSeed (line 21) | function useCrossSeed(instances: Instance[]) { function formatTimestamp (line 229) | function formatTimestamp(ts: number | null): string { constant LOG_LEVEL_COLORS (line 239) | const LOG_LEVEL_COLORS: Record = { FILE: src/hooks/useInstance.ts function useInstance (line 5) | function useInstance(): Instance { FILE: src/hooks/usePagination.ts function usePagination (line 4) | function usePagination() { FILE: src/hooks/useRSSManager.ts constant FEED_REFRESH_DELAY (line 19) | const FEED_REFRESH_DELAY = 500 type FlatFeed (line 21) | interface FlatFeed { function flattenFeeds (line 30) | function flattenFeeds(items: RSSItems, parentPath = '', depth = 0): Flat... type UseRSSManagerOptions (line 62) | interface UseRSSManagerOptions { function useRSSManager (line 67) | function useRSSManager({ instances, onViewChange }: UseRSSManagerOptions) { FILE: src/hooks/useStats.ts constant PERIODS (line 4) | const PERIODS = [ type PeriodData (line 18) | interface PeriodData { type InstanceOption (line 26) | interface InstanceOption { type UseStatsResult (line 31) | interface UseStatsResult { function useStats (line 40) | function useStats(): UseStatsResult { FILE: src/hooks/useSyncMaindata.ts function useSyncMaindata (line 5) | function useSyncMaindata() { FILE: src/hooks/useTheme.ts function useTheme (line 4) | function useTheme() { FILE: src/hooks/useTorrentDetails.ts function useTorrentProperties (line 5) | function useTorrentProperties(hash: string | null) { function useTorrentTrackers (line 15) | function useTorrentTrackers(hash: string | null) { function useTorrentPeers (line 25) | function useTorrentPeers(hash: string | null) { function useTorrentFiles (line 35) | function useTorrentFiles(hash: string | null) { function useTorrentWebSeeds (line 44) | function useTorrentWebSeeds(hash: string | null) { function useSetFilePriority (line 53) | function useSetFilePriority() { function useAddTrackers (line 77) | function useAddTrackers() { function useRemoveTrackers (line 86) | function useRemoveTrackers() { FILE: src/hooks/useTorrents.ts function useTorrents (line 6) | function useTorrents(options: TorrentFilterOptions = {}) { function useStopTorrents (line 15) | function useStopTorrents() { function useStartTorrents (line 24) | function useStartTorrents() { function useRecheckTorrents (line 33) | function useRecheckTorrents() { function useReannounceTorrents (line 42) | function useReannounceTorrents() { function useDeleteTorrents (line 49) | function useDeleteTorrents() { function useAddTorrent (line 59) | function useAddTorrent() { function useCategories (line 69) | function useCategories() { function useTags (line 77) | function useTags() { function useSetCategory (line 85) | function useSetCategory() { function useAddTags (line 95) | function useAddTags() { function useRemoveTags (line 107) | function useRemoveTags() { function useRenameTorrent (line 119) | function useRenameTorrent() { function useSetTorrentLocation (line 128) | function useSetTorrentLocation() { function useSetTorrentDownloadPath (line 141) | function useSetTorrentDownloadPath() { function useCreateTag (line 154) | function useCreateTag() { function useDeleteTag (line 163) | function useDeleteTag() { function useCreateCategory (line 175) | function useCreateCategory() { function useEditCategory (line 185) | function useEditCategory() { function useDeleteCategory (line 195) | function useDeleteCategory() { function useExportTorrents (line 207) | function useExportTorrents() { FILE: src/hooks/useTransferInfo.ts function useTransferInfo (line 5) | function useTransferInfo() { FILE: src/hooks/useUpdateCheck.ts type GitHubRelease (line 5) | interface GitHubRelease { function compareVersions (line 11) | function compareVersions(current: string, latest: string): number { function useUpdateCheck (line 21) | function useUpdateCheck() { FILE: src/mobile/MobileApp.tsx type MainTab (line 21) | type MainTab = 'torrents' | 'tools' type Tool (line 22) | type Tool = 'search' | 'files' | 'orphans' | 'rss' | 'logs' | 'cross-see... function parseHash (line 47) | function parseHash(): { tab: MainTab; tool: Tool } { function setHash (line 58) | function setHash(tab: MainTab, tool: Tool) { function useAltSpeedMode (line 66) | function useAltSpeedMode(instanceId: number | null) { type Props (line 106) | interface Props { function MobileApp (line 112) | function MobileApp({ username, onLogout, authDisabled }: Props) { FILE: src/mobile/MobileCrossSeedManager.tsx type Props (line 8) | interface Props { function MobileCrossSeedManager (line 13) | function MobileCrossSeedManager({ instances, onBack }: Props): ReactNode { FILE: src/mobile/MobileFileBrowser.tsx function formatDate (line 27) | function formatDate(timestamp: number): string { type Props (line 31) | interface Props { function MobileFileBrowser (line 35) | function MobileFileBrowser({ onBack }: Props) { FILE: src/mobile/MobileInstancePicker.tsx type Props (line 5) | interface Props { function MobileInstancePicker (line 11) | function MobileInstancePicker({ instances, current, onChange }: Props) { FILE: src/mobile/MobileLogViewer.tsx constant LOG_TYPES (line 6) | const LOG_TYPES = { type LogTab (line 13) | type LogTab = 'main' | 'peers' type SortOrder (line 14) | type SortOrder = 'newest' | 'oldest' type Props (line 16) | interface Props { function MobileLogViewer (line 21) | function MobileLogViewer({ instances, onBack }: Props) { FILE: src/mobile/MobileNetworkTools.tsx type Props (line 37) | interface Props { type CardStatus (line 42) | type CardStatus = 'idle' | 'loading' | 'success' | 'error' type CardState (line 44) | interface CardState { function formatBandwidth (line 50) | function formatBandwidth(bps: number): string { function MobileNetworkTools (line 55) | function MobileNetworkTools({ instances, onBack }: Props) { FILE: src/mobile/MobileOrphanManager.tsx type OrphanTorrent (line 7) | interface OrphanTorrent { type Props (line 17) | interface Props { function MobileOrphanManager (line 22) | function MobileOrphanManager({ instances, onBack }: Props) { FILE: src/mobile/MobileRSSManager.tsx type Tab (line 8) | type Tab = 'feeds' | 'rules' type View (line 9) | type View = 'list' | 'articles' | 'editor' type MobileArticleDownloadProps (line 11) | interface MobileArticleDownloadProps { function MobileArticleDownload (line 18) | function MobileArticleDownload({ article, idx, instances, rss }: MobileA... type Props (line 89) | interface Props { function MobileRSSManager (line 94) | function MobileRSSManager({ instances, onBack }: Props) { FILE: src/mobile/MobileSearchPanel.tsx function formatAge (line 22) | function formatAge(dateStr: string): string { type Props (line 34) | interface Props { function MobileSearchPanel (line 39) | function MobileSearchPanel({ instances, onBack }: Props) { FILE: src/mobile/MobileStatistics.tsx type Props (line 6) | interface Props { function MobileStatistics (line 10) | function MobileStatistics({ onBack }: Props): ReactNode { FILE: src/mobile/MobileStats.tsx type Props (line 7) | interface Props { function MobileStats (line 11) | function MobileStats({ instances }: Props) { FILE: src/mobile/MobileThemeManager.tsx type View (line 9) | type View = 'list' | 'editor' type MobileThemeManagerProps (line 11) | interface MobileThemeManagerProps { function MobileThemeManager (line 15) | function MobileThemeManager({ onClose }: MobileThemeManagerProps) { type ListViewProps (line 130) | interface ListViewProps { function ListView (line 139) | function ListView({ customThemes, onNew, onEdit, onDelete, onExport, onI... type EditorViewProps (line 225) | interface EditorViewProps { function EditorView (line 232) | function EditorView({ initialTheme, existingNames, onSave, onBack }: Edi... function ColorInput (line 369) | function ColorInput({ label, value, onChange }: { label: string; value: ... FILE: src/mobile/MobileThemeSwitcher.tsx function MobileThemeSwitcher (line 6) | function MobileThemeSwitcher() { function ThemeRow (line 97) | function ThemeRow({ FILE: src/mobile/MobileTools.tsx type Tool (line 28) | type Tool = 'search' | 'files' | 'orphans' | 'rss' | 'logs' | 'cross-see... function LazyTool (line 39) | function LazyTool({ children }: { children: ReactNode }): ReactNode { type Props (line 43) | interface Props { function MobileTools (line 49) | function MobileTools({ instances, activeTool, onToolChange }: Props): Re... FILE: src/mobile/MobileTorrentDetail.tsx type Tab (line 10) | type Tab = 'general' | 'files' | 'trackers' | 'peers' | 'http' type PathEditorMode (line 11) | type PathEditorMode = 'savePath' | 'downloadPath' | null constant PAUSED_STATES (line 13) | const PAUSED_STATES: TorrentState[] = ['pausedDL', 'pausedUP', 'stoppedD... function getTrackerStatus (line 15) | function getTrackerStatus(status: number): string { function getPriorityLabel (line 28) | function getPriorityLabel(priority: number): string { type Props (line 39) | interface Props { function MobileTorrentDetail (line 45) | function MobileTorrentDetail({ torrentHash, instanceId, onClose }: Props) { function InfoRow (line 558) | function InfoRow({ function PathRow (line 584) | function PathRow({ FILE: src/mobile/MobileTorrentList.tsx type TorrentWithInstance (line 29) | type TorrentWithInstance = Torrent & { instanceId: number; instanceLabel... type StatusFilter (line 31) | type StatusFilter = 'all' | 'downloading' | 'seeding' | 'paused' type SortField (line 32) | type SortField = 'dlspeed' | 'upspeed' | 'ratio' | 'seeding_time' | 'add... constant DOWNLOADING_STATES (line 34) | const DOWNLOADING_STATES: TorrentState[] = [ constant SEEDING_STATES (line 43) | const SEEDING_STATES: TorrentState[] = ['uploading', 'forcedUP', 'stalle... constant PAUSED_STATES (line 44) | const PAUSED_STATES: TorrentState[] = ['pausedDL', 'pausedUP', 'stoppedD... type StateInfo (line 46) | type StateInfo = { color: string; label: string; icon: 'download' | 'upl... constant STATE_INFO (line 48) | const STATE_INFO: Partial> = { function getStateInfo (line 59) | function getStateInfo(state: TorrentState): StateInfo { function MobileSelect (line 67) | function MobileSelect({ constant STATE_ICONS (line 134) | const STATE_ICONS = { function StateIcon (line 142) | function StateIcon({ type, color }: { type: keyof typeof STATE_ICONS; co... type Props (line 147) | interface Props { constant STATUS_OPTIONS (line 155) | const STATUS_OPTIONS: { value: StatusFilter; label: string }[] = [ constant SORT_OPTIONS (line 162) | const SORT_OPTIONS: { value: SortField; label: string }[] = [ function MobileTorrentList (line 171) | function MobileTorrentList({ instances, search, compact, onToggleCompact... FILE: src/server/db/index.ts type User (line 191) | interface User { type Instance (line 198) | interface Instance { type Integration (line 211) | interface Integration { type MatchModeType (line 226) | type MatchModeType = (typeof MatchMode)[keyof typeof MatchMode] type CrossSeedConfig (line 228) | interface CrossSeedConfig { type CrossSeedIndexer (line 254) | interface CrossSeedIndexer { type CrossSeedSearchee (line 263) | interface CrossSeedSearchee { type CrossSeedDecision (line 275) | interface CrossSeedDecision { type BlocklistTypeValue (line 312) | type BlocklistTypeValue = (typeof BlocklistType)[keyof typeof BlocklistT... type TransferStats (line 314) | interface TransferStats { function cleanupExpiredSessions (line 322) | function cleanupExpiredSessions() { constant AUTH_DISABLED (line 330) | const AUTH_DISABLED = process.env.DISABLE_AUTH === 'true' constant REGISTRATION_DISABLED (line 331) | const REGISTRATION_DISABLED = process.env.DISABLE_REGISTRATION === 'true' function generateSecurePassword (line 342) | function generateSecurePassword(): string { function initDefaultAdmin (line 361) | async function initDefaultAdmin() { function clearDefaultCredentials (line 373) | function clearDefaultCredentials() { FILE: src/server/middleware/auth.ts type AuthUser (line 5) | interface AuthUser { type ContextVariableMap (line 11) | interface ContextVariableMap { FILE: src/server/routes/auth.ts constant SESSION_DURATION (line 11) | const SESSION_DURATION = 7 * 24 * 60 * 60 function validatePassword (line 13) | function validatePassword(password: string): string | null { FILE: src/server/routes/crossSeed.ts function userOwnsInstance (line 32) | function userOwnsInstance(userId: number, instanceId: number): boolean { function parseJsonArray (line 39) | function parseJsonArray(json: string | null, guard: (v: unknown) => v... function parseIndexerIds (line 49) | function parseIndexerIds(json: string | null): number[] { function parseBlocklist (line 53) | function parseBlocklist(json: string | null): string[] { function validateLinkDir (line 103) | function validateLinkDir(dir: string): { valid: boolean; writable: boole... function validateConfig (line 113) | function validateConfig(body: Record): { valid: boolean... FILE: src/server/routes/files.ts constant DOWNLOADS_PATH (line 9) | const DOWNLOADS_PATH = process.env.DOWNLOADS_PATH function isPathSafe (line 14) | function isPathSafe(requestedPath: string): string | null { function sanitizeFilename (line 22) | function sanitizeFilename(name: string): string { type FileEntry (line 26) | interface FileEntry { method pull (line 168) | async pull(controller) { method cancel (line 185) | cancel() { FILE: src/server/routes/instances.ts type InstanceBackoff (line 12) | interface InstanceBackoff { constant BACKOFF_DELAYS (line 18) | const BACKOFF_DELAYS = [10000, 15000, 30000] constant INITIAL_TIMEOUT (line 19) | const INITIAL_TIMEOUT = 3000 type InstanceResponse (line 23) | interface InstanceResponse { function toResponse (line 34) | function toResponse(i: Instance): InstanceResponse { type TorrentInfo (line 55) | interface TorrentInfo { type TransferInfo (line 61) | interface TransferInfo { type SyncMaindata (line 66) | interface SyncMaindata { type InstanceStats (line 74) | interface InstanceStats { function fetchInstanceStats (line 90) | async function fetchInstanceStats(instance: Instance): Promise { function getQbtSession (line 44) | async function getQbtSession(instance: Instance): Promise { function clearQbtSession (line 55) | function clearQbtSession(instanceId: number) { function getAgentUrl (line 139) | function getAgentUrl(instance: Instance): string { FILE: src/server/routes/stats.ts constant PERIODS (line 11) | const PERIODS: Record = { type InstancePeriodStats (line 24) | interface InstancePeriodStats extends PeriodStats { FILE: src/server/routes/tools.ts type Torrent (line 12) | interface Torrent { type Tracker (line 19) | interface Tracker { type OrphanResult (line 25) | interface OrphanResult { function qbtRequest (line 35) | async function qbtRequest(instance: Instance, cookie: string | null, ... FILE: src/server/utils/crossSeedCache.ts function getDir (line 7) | function getDir(type: 'cache' | 'output'): string { function getCacheDir (line 17) | function getCacheDir(): string { function getOutputDir (line 21) | function getOutputDir(): string { constant VALID_HASH_REGEX (line 25) | const VALID_HASH_REGEX = /^[a-fA-F0-9]+$/ function sanitizeHash (line 27) | function sanitizeHash(hash: string): string { function getTorrentCachePath (line 34) | function getTorrentCachePath(instanceId: number, infoHash: string): stri... function getOutputPath (line 41) | function getOutputPath(instanceId: number, name: string, infoHash: strin... function cacheTorrent (line 49) | function cacheTorrent(instanceId: number, infoHash: string, data: Buffer... function getCachedTorrent (line 55) | function getCachedTorrent(instanceId: number, infoHash: string): Buffer ... function hasCachedTorrent (line 61) | function hasCachedTorrent(instanceId: number, infoHash: string): boolean { function saveTorrentToOutput (line 65) | function saveTorrentToOutput(instanceId: number, name: string, infoHash:... function clearTorrentsInDir (line 72) | function clearTorrentsInDir(dir: string): number { function clearCacheForInstance (line 79) | function clearCacheForInstance(instanceId: number): number { function clearOutputForInstance (line 85) | function clearOutputForInstance(instanceId: number): number { function getTorrentFiles (line 91) | function getTorrentFiles(dir: string): string[] { function getCacheStats (line 96) | function getCacheStats(instanceId: number): { count: number; totalSize: ... function getOutputStats (line 112) | function getOutputStats(instanceId: number): { count: number; files: str... function _resetCachePaths (line 117) | function _resetCachePaths(): void { FILE: src/server/utils/crossSeedMatcher.ts type FileInfo (line 4) | interface FileInfo { type Searchee (line 9) | interface Searchee { type MatchResult (line 19) | interface MatchResult { type PreFilterResult (line 28) | interface PreFilterResult { constant RESOLUTION_REGEX (line 33) | const RESOLUTION_REGEX = /\b(2160p|1080p|1080i|720p|576p|576i|480p|480i|... constant RELEASE_GROUP_REGEX (line 34) | const RELEASE_GROUP_REGEX = constant ANIME_GROUP_REGEX (line 36) | const ANIME_GROUP_REGEX = /^\s*\[(?.+?)\]/i constant SOURCE_REGEX (line 37) | const SOURCE_REGEX = /\b(AMZN|NF|NETFLIX|DSNP|HULU|ATVP|PCOK|PMTP|HBO|HM... constant PROPER_REPACK_REGEX (line 38) | const PROPER_REPACK_REGEX = /\b(PROPER|REPACK|RERIP|REAL)\d?\b/i constant VIDEO_EXTENSIONS (line 39) | const VIDEO_EXTENSIONS = /\.(mkv|mp4|avi|m4v|ts|wmv|webm)$/i constant SEASON_REGEX (line 40) | const SEASON_REGEX = /^(?.+?)[[(_.\s-]+(?<season>S(?:eason)?\s*\d... constant EP_REGEX (line 41) | const EP_REGEX = constant VIDEO_EXTS (line 43) | const VIDEO_EXTS = ['.mkv', '.mp4', '.avi', '.ts', '.m4v', '.mov', '.wmv... constant BAD_GROUP_PARSE_REGEX (line 44) | const BAD_GROUP_PARSE_REGEX = constant PARSE_BLOCKLIST_REGEX (line 46) | const PARSE_BLOCKLIST_REGEX = /^(?<blocklistType>.+?):(?<blocklistValue>... function extractResolution (line 48) | function extractResolution(name: string): string | null { function stripExtension (line 56) | function stripExtension(name: string): string { function extractReleaseGroup (line 60) | function extractReleaseGroup(name: string): string | null { function extractAnimeGroup (line 69) | function extractAnimeGroup(name: string): string | null { function extractSource (line 74) | function extractSource(name: string): string | null { function hasProperRepack (line 83) | function hasProperRepack(name: string): boolean { function checkMatch (line 87) | function checkMatch( function resolutionMatches (line 99) | function resolutionMatches(sourceName: string, candidateName: string): P... function releaseGroupMatches (line 103) | function releaseGroupMatches(sourceName: string, candidateName: string):... function sourceMatches (line 121) | function sourceMatches(sourceName: string, candidateName: string): PreFi... function properRepackMatches (line 125) | function properRepackMatches(sourceName: string, candidateName: string):... function compareFileTrees (line 135) | function compareFileTrees(candidateFiles: FileInfo[], searcheeFiles: Fil... function compareFileTreesIgnoringNames (line 139) | function compareFileTreesIgnoringNames(candidateFiles: FileInfo[], searc... function matchTorrentsBySizes (line 153) | function matchTorrentsBySizes(searcheeFiles: FileInfo[], candidateFiles:... function fuzzySizeMatch (line 198) | function fuzzySizeMatch(sourceSize: number, candidateSize: number, toler... function preFilterCandidate (line 202) | function preFilterCandidate( function isSeasonPack (line 229) | function isSeasonPack(title: string): boolean { function isSingleEpisode (line 233) | function isSingleEpisode(title: string, files: FileInfo[]): boolean { function shouldRejectSeasonEpisodeMismatch (line 239) | function shouldRejectSeasonEpisodeMismatch( function parseBlocklistEntry (line 250) | function parseBlocklistEntry(entry: string): { blocklistType: BlocklistT... function findBlockedStringInRelease (line 264) | function findBlockedStringInRelease(searchee: Searchee, blocklist: strin... FILE: src/server/utils/crossSeedScheduler.ts type ScheduledInstance (line 5) | interface ScheduledInstance { constant CHECK_INTERVAL_MS (line 18) | const CHECK_INTERVAL_MS = 60 * 1000 type SchedulerStatus (line 20) | interface SchedulerStatus { function getInstanceUserId (line 32) | function getInstanceUserId(instanceId: number): number | null { function calculateNextRun (line 37) | function calculateNextRun(lastRun: number | null, intervalHours: number)... function scheduleNextRun (line 44) | function scheduleNextRun(instanceId: number, userId: number, intervalHou... function runScheduledScan (line 50) | async function runScheduledScan(instanceId: number): Promise<void> { function scheduleInstance (line 96) | function scheduleInstance(instanceId: number, userId: number, nextRunTim... function loadEnabledConfigs (line 119) | function loadEnabledConfigs(): void { function checkMissedScans (line 144) | function checkMissedScans(): void { function startScheduler (line 165) | function startScheduler(): void { function stopScheduler (line 172) | function stopScheduler(): void { function updateInstanceSchedule (line 189) | function updateInstanceSchedule(instanceId: number, enabled: boolean): v... function triggerManualScan (line 215) | async function triggerManualScan( function configToStatus (line 270) | function configToStatus(config: CrossSeedConfig & { label: string }): Sc... function getSchedulerStatus (line 285) | function getSchedulerStatus(): SchedulerStatus[] { function getInstanceStatus (line 295) | function getInstanceStatus(instanceId: number): SchedulerStatus | null { function isInstanceRunning (line 305) | function isInstanceRunning(instanceId: number): boolean { function stopScan (line 309) | function stopScan(instanceId: number): boolean { FILE: src/server/utils/crossSeedWorker.ts constant DEFAULT_DELAY_SECONDS (line 29) | const DEFAULT_DELAY_SECONDS = 30 function wait (line 31) | function wait(ms: number): Promise<void> { type CandidateFileInfo (line 35) | interface CandidateFileInfo { type CandidateFilesWithRoot (line 41) | interface CandidateFilesWithRoot { function createHardlinks (line 46) | async function createHardlinks( function canCreateHardlink (line 96) | async function canCreateHardlink(sourcePath: string, destDir: string): P... type ScanOptions (line 110) | interface ScanOptions { type ScanResult (line 118) | interface ScanResult { type QbtTorrent (line 131) | interface QbtTorrent { type QbtFile (line 144) | interface QbtFile { type QbtVersion (line 152) | interface QbtVersion { constant RESUME_SLEEP_MS (line 158) | const RESUME_SLEEP_MS = 15 * 1000 constant RESUME_ERROR_SLEEP_MS (line 159) | const RESUME_ERROR_SLEEP_MS = 5 * 60 * 1000 constant RESUME_TIMEOUT_MS (line 160) | const RESUME_TIMEOUT_MS = 60 * 60 * 1000 function qbtFetch (line 162) | async function qbtFetch(instance: Instance, cookie: string | null, endpo... function qbtRequest (line 173) | async function qbtRequest<T>(instance: Instance, cookie: string | null, ... function qbtRequestText (line 178) | async function qbtRequestText(instance: Instance, cookie: string | null,... constant DEFAULT_QBT_VERSION (line 183) | const DEFAULT_QBT_VERSION: QbtVersion = { major: 4, minor: 0, patch: 0 } function getQbtVersion (line 185) | async function getQbtVersion(instance: Instance, cookie: string | null):... function getTorrentInfo (line 196) | async function getTorrentInfo( function qbtPost (line 216) | async function qbtPost(instance: Instance, cookie: string | null, endpoi... function recheckTorrent (line 232) | async function recheckTorrent( function resumeInjection (line 243) | async function resumeInjection( function addTorrentToQbt (line 286) | async function addTorrentToQbt( type TorrentInfo (line 348) | interface TorrentInfo { function parseTorrentInfo (line 354) | function parseTorrentInfo(torrentData: Buffer): TorrentInfo | null { function parseFileSizesFromTorrent (line 363) | function parseFileSizesFromTorrent(torrentData: Buffer): FileInfo[] | nu... function parseFilesWithPathsFromTorrent (line 382) | function parseFilesWithPathsFromTorrent(torrentData: Buffer): CandidateF... type BencodeValue (line 408) | type BencodeValue = number | Buffer | string | BencodeValue[] | { [key: ... constant MAX_BENCODE_DEPTH (line 410) | const MAX_BENCODE_DEPTH = 100 constant MAX_BENCODE_ITERATIONS (line 411) | const MAX_BENCODE_ITERATIONS = 100000 function decodeBencode (line 413) | function decodeBencode(buffer: Buffer): BencodeValue { function getInfoHashFromTorrent (line 485) | function getInfoHashFromTorrent(torrentData: Buffer): string | null { function encodeBencode (line 499) | function encodeBencode(data: BencodeValue): Buffer { function upsertSearchee (line 536) | function upsertSearchee( function runCrossSeedScan (line 559) | async function runCrossSeedScan(options: ScanOptions): Promise<ScanResul... FILE: src/server/utils/crypto.ts constant SALT_PATH (line 5) | const SALT_PATH = process.env.SALT_PATH || './data/.salt' function getKey (line 9) | function getKey(): Buffer { function getOrCreateSalt (line 25) | function getOrCreateSalt(): Buffer { function hashPassword (line 35) | async function hashPassword(password: string): Promise<string> { function verifyPassword (line 39) | async function verifyPassword(password: string, hash: string): Promise<b... function encrypt (line 43) | function encrypt(text: string): string { function decrypt (line 51) | function decrypt(encrypted: string): string { function generateSessionId (line 78) | function generateSessionId(): string { FILE: src/server/utils/fetch.ts type FetchOptions (line 3) | type FetchOptions = RequestInit & { function fetchWithTls (line 7) | async function fetchWithTls(url: string, options: RequestInit = {}): Pro... FILE: src/server/utils/logger.ts type LogEntry (line 1) | interface LogEntry { constant MAX_LOG_ENTRIES (line 7) | const MAX_LOG_ENTRIES = 500 function addToBuffer (line 12) | function addToBuffer(level: LogEntry['level'], msg: string) { function getLogs (line 35) | function getLogs(filter?: string, limit = 100): LogEntry[] { function clearLogs (line 43) | function clearLogs(): void { FILE: src/server/utils/qbt.ts type QbtInstance (line 5) | interface QbtInstance { type QbtLoginResult (line 12) | type QbtLoginResult = function loginToQbt (line 24) | async function loginToQbt(instance: QbtInstance, timeout?: number): Prom... function testQbtConnection (line 66) | async function testQbtConnection( function testStoredQbtInstance (line 117) | async function testStoredQbtInstance(instance: QbtInstance): Promise<Qbt... type SyncMaindata (line 143) | interface SyncMaindata { function fetchInstanceTransferStats (line 150) | async function fetchInstanceTransferStats( FILE: src/server/utils/rateLimit.ts type RateLimitEntry (line 1) | interface RateLimitEntry { constant WINDOW_MS (line 8) | const WINDOW_MS = 60 * 1000 constant MAX_ATTEMPTS (line 9) | const MAX_ATTEMPTS = 5 function checkRateLimit (line 11) | function checkRateLimit(key: string): { allowed: boolean; retryAfter?: n... function resetRateLimit (line 28) | function resetRateLimit(key: string): void { FILE: src/server/utils/statsRecorder.ts constant RECORD_INTERVAL_MS (line 5) | const RECORD_INTERVAL_MS = 5 * 60 * 1000 constant PRUNE_AFTER_DAYS (line 6) | const PRUNE_AFTER_DAYS = 365 function recordStats (line 10) | async function recordStats(): Promise<void> { function pruneOldStats (line 29) | function pruneOldStats(): void { function startStatsRecorder (line 37) | function startStatsRecorder(): void { function stopStatsRecorder (line 47) | function stopStatsRecorder(): void { type PeriodStats (line 55) | interface PeriodStats { function getStatsForPeriod (line 62) | function getStatsForPeriod(instanceId: number, periodSeconds: number): P... FILE: src/server/utils/torznab.ts constant RATE_LIMIT_SNOOZE_MS (line 6) | const RATE_LIMIT_SNOOZE_MS = 60 * 60 * 1000 constant ERROR_SNOOZE_MS (line 7) | const ERROR_SNOOZE_MS = 10 * 60 * 1000 type TorznabIndexer (line 9) | interface TorznabIndexer { type TorznabResult (line 17) | interface TorznabResult { type TorznabXmlResult (line 28) | interface TorznabXmlResult { type TorznabXmlResponse (line 37) | interface TorznabXmlResponse { function getTorznabIndexers (line 43) | async function getTorznabIndexers(prowlarrUrl: string, apiKey: string): ... function getIndexerStatus (line 69) | function getIndexerStatus(integrationId: number, indexerId: number): Cro... function updateIndexerStatus (line 78) | function updateIndexerStatus( function isIndexerAvailable (line 98) | function isIndexerAvailable(integrationId: number, indexerId: number): b... function clearIndexerStatus (line 106) | function clearIndexerStatus(integrationId: number, indexerId: number): v... function handleResponseError (line 114) | function handleResponseError( function parseTorznabResults (line 137) | function parseTorznabResults(xml: TorznabXmlResponse, indexer: TorznabIn... function searchTorznab (line 161) | async function searchTorznab( function searchAllIndexers (line 219) | async function searchAllIndexers( constant SNATCH_RETRIES (line 262) | const SNATCH_RETRIES = 4 constant SNATCH_DELAY_MS (line 263) | const SNATCH_DELAY_MS = 60 * 1000 function snatchOnce (line 265) | async function snatchOnce(link: string): Promise<Buffer | { error: strin... function downloadTorrentDirect (line 297) | async function downloadTorrentDirect( FILE: src/server/utils/url.ts constant CLOUD_METADATA (line 1) | const CLOUD_METADATA = ['169.254.169.254', 'metadata.google.internal', '... function isUrlAllowed (line 3) | function isUrlAllowed(urlString: string): { allowed: boolean; reason?: s... function validateUrl (line 24) | function validateUrl(urlString: string): void { FILE: src/themes/index.ts type Theme (line 1) | interface Theme { function getThemeById (line 131) | function getThemeById(id: string): Theme { FILE: src/types/preferences.ts type QBittorrentPreferences (line 1) | interface QBittorrentPreferences { FILE: src/types/qbittorrent.ts type TorrentState (line 1) | type TorrentState = type Torrent (line 24) | interface Torrent { type TransferInfo (line 50) | interface TransferInfo { type SyncServerState (line 61) | interface SyncServerState { type SyncMaindata (line 69) | interface SyncMaindata { type TorrentFilter (line 73) | type TorrentFilter = FILE: src/types/rss.ts type RSSArticle (line 1) | interface RSSArticle { type RSSFeedData (line 11) | interface RSSFeedData { type RSSItems (line 21) | type RSSItems = { type RSSRule (line 25) | interface RSSRule { type RSSRules (line 49) | type RSSRules = Record<string, RSSRule> type MatchingArticles (line 51) | interface MatchingArticles { FILE: src/types/torrentDetails.ts type TorrentProperties (line 1) | interface TorrentProperties { type Tracker (line 42) | interface Tracker { type Peer (line 53) | interface Peer { type PeersResponse (line 71) | interface PeersResponse { type TorrentFile (line 78) | interface TorrentFile { type WebSeed (line 89) | interface WebSeed { FILE: src/types/views.ts type CustomView (line 4) | interface CustomView { type CustomViewsStorage (line 21) | interface CustomViewsStorage { FILE: src/utils/colorUtils.ts function generateThemeColors (line 7) | function generateThemeColors( function isValidHex (line 46) | function isValidHex(hex: string): boolean { FILE: src/utils/customViews.ts constant STORAGE_KEY (line 6) | const STORAGE_KEY = 'customViews' constant DEFAULT_STORAGE (line 8) | const DEFAULT_STORAGE: CustomViewsStorage = { function loadCustomViews (line 13) | function loadCustomViews(): CustomViewsStorage { function saveCustomViews (line 30) | function saveCustomViews(storage: CustomViewsStorage): void { function createView (line 34) | function createView( function viewsAreEqual (line 67) | function viewsAreEqual( FILE: src/utils/dateSettings.ts function loadHideAddedTime (line 1) | function loadHideAddedTime(): boolean { function saveHideAddedTime (line 5) | function saveHideAddedTime(hide: boolean): void { FILE: src/utils/fileTree.ts type FileTreeNode (line 3) | interface FileTreeNode { function buildFileTree (line 15) | function buildFileTree(files: TorrentFile[]): FileTreeNode[] { function getPriorityLabel (line 61) | function getPriorityLabel(priority: number): 'skip' | 'normal' | 'high' ... function calculateFolderStats (line 68) | function calculateFolderStats(nodes: FileTreeNode[], files: TorrentFile[... function sortNodes (line 97) | function sortNodes(nodes: FileTreeNode[]): void { function flattenVisibleNodes (line 107) | function flattenVisibleNodes( function getInitialExpanded (line 122) | function getInitialExpanded(nodes: FileTreeNode[]): Set<string> { FILE: src/utils/format.ts function formatSpeed (line 1) | function formatSpeed(bytes: number, showZero = true): string { function formatSize (line 8) | function formatSize(bytes: number): string { function formatCompactSpeed (line 16) | function formatCompactSpeed(bytes: number): string { function formatCompactSize (line 23) | function formatCompactSize(bytes: number): string { function formatEta (line 30) | function formatEta(seconds: number): string { function formatDate (line 38) | function formatDate(timestamp: number): string { function formatDuration (line 49) | function formatDuration(seconds: number): string { function formatRelativeTime (line 61) | function formatRelativeTime(timestamp: number): string { function formatRelativeDate (line 72) | function formatRelativeDate(timestamp: number): string { function normalizeSearch (line 83) | function normalizeSearch(str: string): string { function formatCountdown (line 87) | function formatCountdown(timestamp: number | null, fallback = '—'): stri... FILE: src/utils/markdown.tsx function renderInline (line 3) | function renderInline(text: string): ReactNode[] { function renderMarkdown (line 67) | function renderMarkdown(markdown: string): ReactNode[] { FILE: src/utils/pagination.ts constant PER_PAGE_OPTIONS (line 1) | const PER_PAGE_OPTIONS = [25, 50, 100, 200] as const FILE: src/utils/ratioThresholds.ts constant DEFAULT_THRESHOLD (line 1) | const DEFAULT_THRESHOLD = 1.0 function loadRatioThreshold (line 3) | function loadRatioThreshold(): number { function saveRatioThreshold (line 12) | function saveRatioThreshold(threshold: number): void { FILE: src/utils/search.ts constant PATTERNS (line 1) | const PATTERNS = [ function extractTags (line 9) | function extractTags(titles: string[]): { tag: string; count: number }[] { type SortKey (line 30) | type SortKey = 'seeders' | 'size' | 'age' function sortResults (line 32) | function sortResults<T extends { seeders?: number; size: number; publish... function filterResults (line 50) | function filterResults<T extends { title: string }>(results: T[], filter... FILE: vite.config.ts method manualChunks (line 15) | manualChunks(id) {