UNPKG

@ctrl/qbittorrent

Version:

TypeScript api wrapper for qbittorrent using got

1,292 lines (1,291 loc) 32.2 kB
export interface BuildInfo { /** * QT version */ qt: string; /** * libtorrent version */ libtorrent: string; /** * Boost version */ boost: string; /** * OpenSSL version */ openssl: string; /** * Application bitness (e.g. 64-bit) */ bitness: string; } /** * @deprecated Replaced by 'running' in qBittorrent v5. */ type TorrentFilterResumed = 'resumed'; /** * @deprecated Replaced by 'stopped' in qBittorrent v5. */ type TorrentFilterPaused = 'paused'; export type TorrentFilters = 'all' | 'downloading' | 'seeding' | 'completed' | TorrentFilterPaused | 'stopped' | 'active' | 'inactive' | TorrentFilterResumed | 'running' | 'stalled' | 'stalled_uploading' | 'stalled_downloading' | 'checking' | 'moving' | 'errored'; export interface Torrent { /** * Torrent name */ name: string; hash: string; magnet_uri: string; /** * datetime in seconds */ added_on: number; /** * Torrent size */ size: number; /** * Torrent progress */ progress: number; /** * Torrent download speed (bytes/s) */ dlspeed: number; /** * Torrent upload speed (bytes/s) */ upspeed: number; /** * Torrent priority (-1 if queuing is disabled) */ priority: number; /** * Torrent seeds connected to */ num_seeds: number; /** * Torrent seeds in the swarm */ num_complete: number; /** * Torrent leechers connected to */ num_leechs: number; /** * Torrent leechers in the swarm */ num_incomplete: number; /** * Torrent share ratio */ ratio: number; /** * Torrent ETA */ eta: number; /** * Torrent state */ state: TorrentState; /** * Torrent sequential download state */ seq_dl: boolean; /** * Torrent first last piece priority state */ f_l_piece_prio: boolean; /** * Torrent copletion datetime in seconds */ completion_on: number; /** * Torrent tracker */ tracker: string; trackers_count: number; /** * Torrent download limit */ dl_limit: number; /** * Torrent upload limit */ up_limit: number; /** * Amount of data downloaded */ downloaded: number; /** * Amount of data uploaded */ uploaded: number; /** * Amount of data downloaded since program open */ downloaded_session: number; /** * Amount of data uploaded since program open */ uploaded_session: number; /** * Amount of data left to download */ amount_left: number; /** * Torrent save path */ save_path: string; /** * Amount of data completed */ completed: number; /** * Upload max share ratio */ max_ratio: number; /** * Upload max seeding time */ max_seeding_time: number; /** * Upload share ratio limit */ ratio_limit: number; /** * Upload seeding time limit */ seeding_time_limit: number; /** * True if super seeding is enabled */ super_seeding: boolean; /** * Indicates the time when the torrent was last seen complete/whole */ seen_complete: number; /** * Last time when a chunk was downloaded/uploaded */ last_activity: number; /** * Size including unwanted data */ total_size: number; time_active: number; /** * Category name */ category: string; /** * Comma-concatenated tag list of the torrent e.g. - "abc, 123" */ tags: string; } export type TorrentCategories = Record<string, Category>; interface Category { name: string; savePath: string; } export declare enum TorrentState { /** * Some error occurred, applies to paused torrents */ Error = "error", /** * Torrent is paused and has finished downloading * ``pausedUP`` was renamed to ``stoppedUP`` in Web API v2.11.0 */ PausedUP = "pausedUP", /** * Torrent is paused and has NOT finished downloading * ``pausedDL`` was renamed to ``stoppedDL`` in Web API v2.11.0 */ PausedDL = "pausedDL", /** * Queuing is enabled and torrent is queued for upload */ QueuedUP = "queuedUP", /** * Queuing is enabled and torrent is queued for download */ QueuedDL = "queuedDL", /** * Torrent is being seeded and data is being transferred */ Uploading = "uploading", /** * Torrent is being seeded, but no connection were made */ StalledUP = "stalledUP", /** * Torrent has finished downloading and is being checked; this status also applies to preallocation (if enabled) and checking resume data on qBt startup */ CheckingUP = "checkingUP", /** * Same as checkingUP, but torrent has NOT finished downloading */ CheckingDL = "checkingDL", /** * Torrent is being downloaded and data is being transferred */ Downloading = "downloading", /** * Torrent has been stopped while downloading */ StoppedDL = "stoppedDL", /** * Torrent has been stopped while downloading */ StoppedUP = "stoppedUP", /** * Torrent is being downloaded, but no connection were made */ StalledDL = "stalledDL", /** * Torrent is forced to downloading to ignore queue limit */ ForcedDL = "forcedDL", /** * Forced Downloading Metadata */ ForcedMetaDL = "ForcedMetaDL", /** * Torrent is forced to uploading and ignore queue limit */ ForcedUP = "forcedUP", /** * Torrent has just started downloading and is fetching metadata */ MetaDL = "metaDL", /** * Torrent is allocating disk space for download */ Allocating = "allocating", QueuedForChecking = "queuedForChecking", /** * Checking resume data on qBt startup */ CheckingResumeData = "checkingResumeData", /** * Torrent is moving to another location */ Moving = "moving", /** * Unknown status */ Unknown = "unknown", /** * Torrent data files is missing */ MissingFiles = "missingFiles" } export interface TorrentProperties { /** * Torrent save path */ save_path: string; /** * Torrent creation date (Unix timestamp) */ creation_date: number; /** * Torrent piece size (bytes) */ piece_size: number; /** * Torrent comment */ comment: string; /** * Total data wasted for torrent (bytes) */ total_wasted: number; /** * Total data uploaded for torrent (bytes) */ total_uploaded: number; /** * Total data uploaded this session (bytes) */ total_uploaded_session: number; /** * Total data uploaded for torrent (bytes) */ total_downloaded: number; /** * Total data downloaded this session (bytes) */ total_downloaded_session: number; /** * Torrent upload limit (bytes/s) */ up_limit: number; /** * Torrent download limit (bytes/s) */ dl_limit: number; /** * Torrent elapsed time (seconds) */ time_elapsed: number; /** * Torrent elapsed time while complete (seconds) */ seeding_time: number; /** * Torrent connection count */ nb_connections: number; /** * Torrent connection count limit */ nb_connections_limit: number; /** * Torrent share ratio */ share_ratio: number; /** * When this torrent was added (unix timestamp) */ addition_date: number; /** * Torrent completion date (unix timestamp) */ completion_date: number; /** * Torrent creator */ created_by: string; /** * Torrent average download speed (bytes/second) */ dl_speed_avg: number; /** * Torrent download speed (bytes/second) */ dl_speed: number; /** * Torrent ETA (seconds) */ eta: number; /** * Last seen complete date (unix timestamp) */ last_seen: number; /** * Number of peers connected to */ peers: number; /** * Number of peers in the swarm */ peers_total: number; /** * Number of pieces owned */ pieces_have: number; /** * Number of pieces of the torrent */ pieces_num: number; /** * Number of seconds until the next announce */ reannounce: number; /** * Number of seeds connected to */ seeds: number; /** * Number of seeds in the swarm */ seeds_total: number; /** * Torrent total size (bytes) */ total_size: number; /** * Torrent average upload speed (bytes/second) */ up_speed_avg: number; /** * Torrent upload speed (bytes/second) */ up_speed: number; } export interface TorrentTrackers { /** * Tracker url */ url: string; /** * Tracker status. See the table below for possible values */ status: TorrentTrackerStatus; /** * Tracker priority tier. Lower tier trackers are tried before higher tiers */ tier: number; /** * Number of peers for current torrent, as reported by the tracker */ num_peers: number; /** * Number of seeds for current torrent, asreported by the tracker */ num_seeds: number; /** * Number of leeches for current torrent, as reported by the tracker */ num_leeches: number; /** * Number of completed downlods for current torrent, as reported by the tracker */ num_downloaded: number; /** * Tracker message (there is no way of knowing what this message is - it's up to tracker admins) */ msg: string; } export declare enum TorrentTrackerStatus { /** * Tracker is disabled (used for DHT, PeX, and LSD) */ Disabled = 0, /** * Tracker has not been contacted yet */ Waiting = 1, /** * Tracker has been contacted and is working */ Working = 2, /** * Tracker is updating */ Updating = 3, /** * Tracker has been contacted, but it is not working (or doesn't send proper replies) */ Errored = 4 } export interface WebSeed { /** * URL of the web seed */ url: string; } export interface TorrentFile { /** * File name (including relative path) */ name: string; /** * File size (bytes) */ size: number; /** * File progress (percentage/100) */ progress: number; /** * File priority. See possible values here below */ priority: number; /** * True if file is seeding/complete */ is_seed: boolean; /** * array The first number is the starting piece index and the second number is the ending piece index (inclusive) */ piece_range: [number, number]; /** * Percentage of file pieces currently available */ availability: number; } export declare enum TorrentFilePriority { /** * Do not download */ Skip = 0, /** * Normal priority */ NormalPriority = 1, /** * High priority */ HighPriority = 6, /** * Maximal priority */ MaxPriority = 7 } export declare enum TorrentPieceState { /** * Not downloaded yet */ NotDownloaded = 0, /** * Now downloading */ Requested = 1, /** * Already downloaded */ Downloaded = 2 } type TrueFalseStr = 'true' | 'false'; export interface AddTorrentOptions { /** * not totally sure what its for but its required * NOTE: not included in deluge options blob. This should be removed and passed in seperatly. * Added to AddTorrentOptions to make the api's more similar with other clients * default: torrent */ filename: string; /** * Download folder */ savepath: string; /** * Category for the torrent */ category: string; /** * Tags for the torrent, split by ',' */ tags: string; /** * Skip hash checking. Possible values are true, false (default) */ skip_checking: TrueFalseStr; /** * Add torrents in the paused state. Possible values are true, false (default) */ paused?: TrueFalseStr; stopped?: TrueFalseStr; /** * Control filesystem structure for content (added in Web API v2.7) * Migrating from rootFolder example rootFolder ? 'Original' : 'NoSubfolder' */ contentLayout: 'Original' | 'Subfolder' | 'NoSubfolder'; /** * Rename torrent */ rename: string; /** * Set torrent upload speed limit. Unit in bytes/second */ upLimit: number; /** * Set torrent download speed limit. Unit in bytes/second */ dlLimit: number; /** * Set torrent share ratio limit */ ratioLimit: number; /** * Set torrent seeding time limit. Unit in seconds */ seedingTimeLimit: number; /** * Whether Automatic Torrent Management should be used, disables use of savepath */ useAutoTMM: TrueFalseStr; /** * Enable sequential download. Possible values are true, false (default) */ sequentialDownload: TrueFalseStr; /** * Prioritize download first last piece. Possible values are true, false (default) */ firstLastPiecePrio: TrueFalseStr; } export interface AddMagnetOptions { savepath: string; cookie: string; /** * Category for the torrent */ category: string; /** * Tags for the torrent, split by ',' */ tags: string; /** * Skip hash checking. Possible values are true, false (default) */ skip_checking: TrueFalseStr; /** * Add torrents in the paused state. Possible values are true, false (default) */ paused?: TrueFalseStr; stopped?: TrueFalseStr; /** * Create the root folder. Possible values are true, false, unset (default) */ root_folder: TrueFalseStr; /** * Rename torrent */ rename: string; /** * Set torrent upload speed limit. Unit in bytes/second */ upLimit: number; /** * Set torrent download speed limit. Unit in bytes/second */ dlLimit: number; /** * Whether Automatic Torrent Management should be used, disables use of savepath */ useAutoTMM: TrueFalseStr; /** * Enable sequential download. Possible values are true, false (default) */ sequentialDownload: TrueFalseStr; /** * Prioritize download first last piece. Possible values are true, false (default) */ firstLastPiecePrio: TrueFalseStr; } export interface Preferences { /** * Currently selected language (e.g. en_GB for English) */ locale: string; /** * True if a subfolder should be created when adding a torrent */ create_subfolder_enabled: boolean; /** * True if torrents should be added in a Paused state */ start_paused_enabled: boolean; /** * TODO */ auto_delete_mode: number; /** * True if disk space should be pre-allocated for all files */ preallocate_all: boolean; /** * True if ".!qB" should be appended to incomplete files */ incomplete_files_ext: boolean; /** * True if Automatic Torrent Management is enabled by default */ auto_tmm_enabled: boolean; /** * True if torrent should be relocated when its Category changes */ torrent_changed_tmm_enabled: boolean; /** * True if torrent should be relocated when the default save path changes */ save_path_changed_tmm_enabled: boolean; /** * True if torrent should be relocated when its Category's save path changes */ category_changed_tmm_enabled: boolean; /** * Default save path for torrents, separated by slashes */ save_path: string; /** * True if folder for incomplete torrents is enabled */ temp_path_enabled: boolean; /** * Path for incomplete torrents, separated by slashes */ temp_path: string; /** * Directory to watch for torrent files, value: where torrents loaded from this directory should be downloaded to (see list of possible values below). Slashes are used as path separators; multiple key/value pairs can be specified * Possible values of scan_dirs: * 0 Download to the monitored folder * 1 Download to the default save path * "/path/to/download/to" Download to this path */ scan_dirs: Record<string, 0 | 1 | string>; /** * Path to directory to copy .torrent files to. Slashes are used as path separators */ export_dir: string; /** * Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators */ export_dir_fin: string; /** * True if e-mail notification should be enabled */ mail_notification_enabled: boolean; /** * e-mail where notifications should originate from */ mail_notification_sender: string; /** * e-mail to send notifications to */ mail_notification_email: string; /** * smtp server for e-mail notifications */ mail_notification_smtp: string; /** * True if smtp server requires SSL connection */ mail_notification_ssl_enabled: boolean; /** * True if smtp server requires authentication */ mail_notification_auth_enabled: boolean; /** * Username for smtp authentication */ mail_notification_username: string; /** * Password for smtp authentication */ mail_notification_password: string; /** * True if external program should be run after torrent has finished downloading */ autorun_enabled: boolean; /** * Program path/name/arguments to run if autorun_enabled is enabled; path is separated by slashes; you can use %f and %n arguments, which will be expanded by qBittorent as path_to_torrent_file and torrent_name (from the GUI; not the .torrent file name) respectively */ autorun_program: string; /** * True if torrent queuing is enabled */ queueing_enabled: boolean; /** * Maximum number of active simultaneous downloads */ max_active_downloads: number; /** * Maximum number of active simultaneous downloads and uploads */ max_active_torrents: number; /** * Maximum number of active simultaneous uploads */ max_active_uploads: number; /** * If true torrents w/o any activity (stalled ones) will not be counted towards max_active_* limits; see [dont_count_slow_torrents](https://www.libtorrent.org/reference-Settings.html#dont_count_slow_torrents) for more information */ dont_count_slow_torrents: boolean; /** * Download rate in KiB/s for a torrent to be considered "slow" */ slow_torrent_dl_rate_threshold: number; /** * Upload rate in KiB/s for a torrent to be considered "slow" */ slow_torrent_ul_rate_threshold: number; /** * Seconds a torrent should be inactive before considered "slow" */ slow_torrent_inactive_timer: number; /** * True if share ratio limit is enabled */ max_ratio_enabled: boolean; /** * Get the global share ratio limit */ max_ratio: number; /** * Action performed when a torrent reaches the maximum share ratio. See list of possible values here below. */ max_ratio_act: boolean; /** * Port for incoming connections */ listen_port: number; /** * True if UPnP/NAT-PMP is enabled */ upnp: boolean; /** * True if the port is randomly selected */ random_port: boolean; /** * Global download speed limit in KiB/s; -1 means no limit is applied */ dl_limit: number; /** * Global upload speed limit in KiB/s; -1 means no limit is applied */ up_limit: number; /** * Maximum global number of simultaneous connections */ max_connec: number; /** * Maximum number of simultaneous connections per torrent */ max_connec_per_torrent: number; /** * Maximum number of upload slots */ max_uploads: number; /** * Maximum number of upload slots per torrent */ max_uploads_per_torrent: number; /** * Timeout in seconds for a stopped announce request to trackers */ stop_tracker_timeout: number; /** * True if the advanced libtorrent option piece_extent_affinity is enabled */ enable_piece_extent_affinity: boolean; /** * Bittorrent Protocol to use * 0 TCP and μTP * 1 TCP * 2 μTP */ bittorrent_protocol: 0 | 1 | 2; /** * True if [du]l_limit should be applied to uTP connections; this option is only available in qBittorent built against libtorrent version 0.16.X and higher */ limit_utp_rate: boolean; /** * True if [du]l_limit should be applied to estimated TCP overhead (service data: e.g. packet headers) */ limit_tcp_overhead: boolean; /** * True if [du]l_limit should be applied to peers on the LAN */ limit_lan_peers: boolean; /** * Alternative global download speed limit in KiB/s */ alt_dl_limit: number; /** * Alternative global upload speed limit in KiB/s */ alt_up_limit: number; /** * True if alternative limits should be applied according to schedule */ scheduler_enabled: boolean; /** * Scheduler starting hour */ schedule_from_hour: number; /** * Scheduler starting minute */ schedule_from_min: number; /** * Scheduler ending hour */ schedule_to_hour: number; /** * Scheduler ending minute */ schedule_to_min: number; /** * Scheduler days. See possible values here below * 0 Every day * 1 Every weekday * 2 Every weekend * 3 Every Monday * 4 Every Tuesday * 5 Every Wednesday * 6 Every Thursday * 7 Every Friday * 8 Every Saturday * 9 Every Sunday */ scheduler_days: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; /** * True if DHT is enabled */ dht: boolean; /** * True if PeX is enabled */ pex: boolean; /** * True if LSD is enabled */ lsd: boolean; /** * See list of possible values here below * 0 Prefer encryption * 1 Force encryption on * 2 Force encryption off */ encryption: 0 | 1 | 2; /** * If true anonymous mode will be enabled; read more [here](https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher */ anonymous_mode: boolean; /** * See list of possible values here below */ proxy_type: number; /** * Proxy IP address or domain name */ proxy_ip: string; /** * Proxy port */ proxy_port: number; /** * True if peer and web seed connections should be proxified; this option will have any effect only in qBittorent built against libtorrent version 0.16.X and higher */ proxy_peer_connections: boolean; /** * True proxy requires authentication; doesn't apply to SOCKS4 proxies */ proxy_auth_enabled: boolean; /** * Username for proxy authentication */ proxy_username: string; /** * Password for proxy authentication */ proxy_password: string; /** * True if proxy is only used for torrents */ proxy_torrents_only: boolean; /** * True if external IP filter should be enabled */ ip_filter_enabled: boolean; /** * Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes */ ip_filter_path: string; /** * True if IP filters are applied to trackers */ ip_filter_trackers: boolean; /** * Comma-separated list of domains to accept when performing Host header validation */ web_ui_domain_list: string; /** * IP address to use for the WebUI */ web_ui_address: string; /** * WebUI port */ web_ui_port: number; /** * True if UPnP is used for the WebUI port */ web_ui_upnp: boolean; /** * WebUI username */ web_ui_username: string; /** * For API ≥ v2.3.0: Plaintext WebUI password, not readable, write-only. For API < v2.3.0: MD5 hash of WebUI password, hash is generated from the following string: username:Web UI Access:plain_text_web_ui_password */ web_ui_password?: string; /** * True if WebUI CSRF protection is enabled */ web_ui_csrf_protection_enabled: boolean; /** * True if WebUI clickjacking protection is enabled */ web_ui_clickjacking_protection_enabled: boolean; /** * True if WebUI cookie Secure flag is enabled */ web_ui_secure_cookie_enabled: boolean; /** * Maximum number of authentication failures before WebUI access ban */ web_ui_max_auth_fail_count: number; /** * WebUI access ban duration in seconds */ web_ui_ban_duration: number; /** * Seconds until WebUI is automatically signed off */ web_ui_session_timeout: number; /** * True if WebUI host header validation is enabled */ web_ui_host_header_validation_enabled: boolean; /** * True if authentication challenge for loopback address (127.0.0.1) should be disabled */ bypass_local_auth: boolean; /** * True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist */ bypass_auth_subnet_whitelist_enabled: boolean; /** * (White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas */ bypass_auth_subnet_whitelist: string; /** * True if an alternative WebUI should be used */ alternative_webui_enabled: boolean; /** * File path to the alternative WebUI */ alternative_webui_path: string; /** * True if WebUI HTTPS access is enabled */ use_https: boolean; /** * SSL keyfile contents (this is a not a path) */ ssl_key: string; /** * SSL certificate contents (this is a not a path) */ ssl_cert: string; /** * For API ≥ v2.0.1: Path to SSL keyfile */ web_ui_https_key_path: string; /** * For API ≥ v2.0.1: Path to SSL certificate */ web_ui_https_cert_path: string; /** * True if server DNS should be updated dynamically */ dyndns_enabled: boolean; /** * See list of possible values here below */ dyndns_service: number; /** * Username for DDNS service */ dyndns_username: string; /** * Password for DDNS service */ dyndns_password: string; /** * Your DDNS domain name */ dyndns_domain: string; /** * RSS refresh interval */ rss_refresh_interval: number; /** * Max stored articles per RSS feed */ rss_max_articles_per_feed: number; /** * Enable processing of RSS feeds */ rss_processing_enabled: boolean; /** * Enable auto-downloading of torrents from the RSS feeds */ rss_auto_downloading_enabled: boolean; /** * For API ≥ v2.5.1: Enable downloading of repack/proper Episodes */ rss_download_repack_proper_episodes: boolean; /** * For API ≥ v2.5.1: List of RSS Smart Episode Filters */ rss_smart_episode_filters: string; /** * Enable automatic adding of trackers to new torrents */ add_trackers_enabled: boolean; /** * List of trackers to add to new torrent */ add_trackers: string; /** * For API ≥ v2.5.1: Enable custom http headers */ web_ui_use_custom_http_headers_enabled: boolean; /** * For API ≥ v2.5.1: List of custom http headers */ web_ui_custom_http_headers: string; /** * True enables max seeding time */ max_seeding_time_enabled: boolean; /** * Number of minutes to seed a torrent */ max_seeding_time: number; /** * TODO */ announce_ip: string; /** * True always announce to all tiers */ announce_to_all_tiers: boolean; /** * True always announce to all trackers in a tier */ announce_to_all_trackers: boolean; /** * Number of asynchronous I/O threads */ async_io_threads: number; /** * List of banned IPs */ banned_IPs: string; /** * Outstanding memory when checking torrents in MiB */ checking_memory_use: number; /** * IP Address to bind to. Empty String means All addresses */ current_interface_address: string; /** * Network Interface used */ current_network_interface: string; /** * Disk cache used in MiB */ disk_cache: number; /** * Disk cache expiry interval in seconds */ disk_cache_ttl: number; /** * Port used for embedded tracker */ embedded_tracker_port: number; /** * True enables coalesce reads & writes */ enable_coalesce_read_write: boolean; /** * True enables embedded tracker */ enable_embedded_tracker: boolean; /** * True allows multiple connections from the same IP address */ enable_multi_connections_from_same_ip: boolean; /** * True enables os cache */ enable_os_cache: boolean; /** * True enables sending of upload piece suggestions */ enable_upload_suggestions: boolean; /** * File pool size */ file_pool_size: number; /** * Maximal outgoing port (0: Disabled) */ outgoing_ports_max: number; /** * Minimal outgoing port (0: Disabled) */ outgoing_ports_min: number; /** * True rechecks torrents on completion */ recheck_completed_torrents: boolean; /** * True resolves peer countries */ resolve_peer_countries: boolean; /** * Save resume data interval in min */ save_resume_data_interval: number; /** * Send buffer low watermark in KiB */ send_buffer_low_watermark: number; /** * Send buffer watermark in KiB */ send_buffer_watermark: number; /** * Send buffer watermark factor in percent */ send_buffer_watermark_factor: number; /** * Socket backlog size */ socket_backlog_size: number; /** * Upload choking algorithm used (see list of possible values below) */ upload_choking_algorithm: number; /** * Upload slots behavior used (see list of possible values below) */ upload_slots_behavior: number; /** * UPnP lease duration (0: Permanent lease) */ upnp_lease_duration: number; /** * μTP-TCP mixed mode algorithm (see list of possible values below) */ utp_tcp_mixed_mode: number; } export interface TorrentPeersResponse { full_update: boolean; peers: Peers; rid: number; show_flags: boolean; } type Peers = Record<string, TorrentPeer>; export interface TorrentPeer { client?: string; connection?: string; country?: string; country_code?: string; dl_speed?: number; downloaded?: number; files?: string; flags?: string; flags_desc?: string; ip?: string; port?: number; progress?: number; relevance?: number; up_speed?: number; uploaded?: number; } export type DownloadSpeed = Record<string, number>; export type UploadSpeed = Record<string, number>; export {};