diff --git a/Cargo.lock b/Cargo.lock index 4cd36a2..879a9ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,25 +17,6 @@ version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" -[[package]] -name = "api-gen" -version = "0.1.0" -dependencies = [ - "anyhow", - "case", - "parser", - "proc-macro2", - "quote", - "regex", - "reqwest", - "serde", - "serde_json", - "syn", - "thiserror", - "tokio", - "trybuild", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -393,10 +374,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" -[[package]] -name = "md-parser" -version = "0.1.0" - [[package]] name = "memchr" version = "2.5.0" @@ -533,15 +510,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "parser" -version = "0.1.0" -dependencies = [ - "case", - "md-parser", - "regex", -] - [[package]] name = "percent-encoding" version = "2.1.0" @@ -579,7 +547,7 @@ dependencies = [ name = "qbittorrent-web-api" version = "0.1.0" dependencies = [ - "api-gen", + "qbittorrent-web-api-gen", "reqwest", "serde", "serde_json", @@ -587,6 +555,24 @@ dependencies = [ "tokio", ] +[[package]] +name = "qbittorrent-web-api-gen" +version = "0.1.0" +dependencies = [ + "anyhow", + "case", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn", + "thiserror", + "tokio", + "trybuild", +] + [[package]] name = "quote" version = "1.0.20" diff --git a/Cargo.toml b/Cargo.toml index 544b854..9c1a40e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,14 +10,12 @@ path = "src/lib.rs" [dependencies] reqwest = { version = "0.11.11", features = ["json", "multipart"] } tokio = { version = "1.19.2", features = ["full"] } -api-gen = { path = "./api-gen", version = "*" } +qbittorrent-web-api-gen = { path = "./qbittorrent-web-api-gen", version = "0.1.0" } serde = { version = "1.0.138", features = ["derive"] } serde_json = "1.0.82" thiserror = "1.0.31" [workspace] members = [ - "api-gen", - "parser", - "md-parser", + "qbittorrent-web-api-gen", ] diff --git a/md-parser/Cargo.toml b/md-parser/Cargo.toml deleted file mode 100644 index 00ef5df..0000000 --- a/md-parser/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "md-parser" -version = "0.1.0" -edition = "2021" - -[dependencies] diff --git a/parser/Cargo.toml b/parser/Cargo.toml deleted file mode 100644 index 85fed80..0000000 --- a/parser/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "parser" -version = "0.1.0" -edition = "2021" - -[dependencies] -md-parser = { path = "../md-parser" } -case = "1.0.0" -regex = "1.6.0" diff --git a/parser/src/api-4_1.md b/parser/src/api-4_1.md deleted file mode 100644 index cf94502..0000000 --- a/parser/src/api-4_1.md +++ /dev/null @@ -1,3345 +0,0 @@ -This WebUI API documentation applies to qBittorrent v4.1+. For other WebUI API versions, visit [WebUI API](https://github.com/qbittorrent/qBittorrent/wiki#WebUI-API). - -# Table of Contents # - -1. [Changes](#changes) - 1. [API v2.0](#api-v20) - 1. [API v2.0.1](#api-v201) - 1. [API v2.0.2](#api-v202) - 1. [API v2.1.0](#api-v210) - 1. [API v2.1.1](#api-v211) - 1. [API v2.2.0](#api-v220) - 1. [API v2.2.1](#api-v221) - 1. [API v2.3.0](#api-v230) - 1. [API v2.4.0](#api-v240) - 1. [API v2.4.1](#api-v241) - 1. [API v2.5.0](#api-v250) - 1. [API v2.5.1](#api-v251) - 1. [API v2.6.0](#api-v260) - 1. [API v2.6.1](#api-v261) - 1. [API v2.6.2](#api-v262) - 1. [API v2.7.0](#api-v270) - 1. [API v2.8.0](#api-v280) - 1. [API v2.8.1](#api-v281) - 1. [API v2.8.2](#api-v282) - 1. [API v2.8.3](#api-v283) -1. [General information](#general-information) -1. [Authentication](#authentication) - 1. [Login](#login) - 1. [Logout](#logout) -1. [Application](#application) - 1. [Get application version](#get-application-version) - 1. [Get API version](#get-api-version) - 1. [Get build info](#get-build-info) - 1. [Shutdown application](#shutdown-application) - 1. [Get application preferences](#get-application-preferences) - 1. [Set application preferences](#set-application-preferences) - 1. [Get default save path](#get-default-save-path) -1. [Log](#log) - 1. [Get log](#get-log) - 1. [Get peer log](#get-peer-log) -1. [Sync](#sync) - 1. [Get main data](#get-main-data) - 1. [Get torrent peers data](#get-torrent-peers-data) -1. [Transfer info](#transfer-info) - 1. [Get global transfer info](#get-global-transfer-info) - 1. [Get alternative speed limits state](#get-alternative-speed-limits-state) - 1. [Toggle alternative speed limits](#toggle-alternative-speed-limits) - 1. [Get global download limit](#get-global-download-limit) - 1. [Set global download limit](#set-global-download-limit) - 1. [Get global upload limit](#get-global-upload-limit) - 1. [Set global upload limit](#set-global-upload-limit) - 1. [Ban peers](#ban-peers) -1. [Torrent management](#torrent-management) - 1. [Get torrent list](#get-torrent-list) - 1. [Get torrent generic properties](#get-torrent-generic-properties) - 1. [Get torrent trackers](#get-torrent-trackers) - 1. [Get torrent web seeds](#get-torrent-web-seeds) - 1. [Get torrent contents](#get-torrent-contents) - 1. [Get torrent pieces' states](#get-torrent-pieces-states) - 1. [Get torrent pieces' hashes](#get-torrent-pieces-hashes) - 1. [Pause torrents](#pause-torrents) - 1. [Resume torrents](#resume-torrents) - 1. [Delete torrents](#delete-torrents) - 1. [Recheck torrents](#recheck-torrents) - 1. [Reannounce torrents](#reannounce-torrents) - 1. [Edit trackers](#edit-trackers) - 1. [Remove trackers](#remove-trackers) - 1. [Add peers](#add-peers) - 1. [Add new torrent](#add-new-torrent) - 1. [Add trackers to torrent](#add-trackers-to-torrent) - 1. [Increase torrent priority](#increase-torrent-priority) - 1. [Decrease torrent priority](#decrease-torrent-priority) - 1. [Maximal torrent priority](#maximal-torrent-priority) - 1. [Minimal torrent priority](#minimal-torrent-priority) - 1. [Set file priority](#set-file-priority) - 1. [Get torrent download limit](#get-torrent-download-limit) - 1. [Set torrent download limit](#set-torrent-download-limit) - 1. [Set torrent share limit](#set-torrent-share-limit) - 1. [Get torrent upload limit](#get-torrent-upload-limit) - 1. [Set torrent upload limit](#set-torrent-upload-limit) - 1. [Set torrent location](#set-torrent-location) - 1. [Set torrent name](#set-torrent-name) - 1. [Set torrent category](#set-torrent-category) - 1. [Get all categories](#get-all-categories) - 1. [Add new category](#add-new-category) - 1. [Edit category](#edit-category) - 1. [Remove categories](#remove-categories) - 1. [Add torrent tags](#add-torrent-tags) - 1. [Remove torrent tags](#remove-torrent-tags) - 1. [Get all tags](#get-all-tags) - 1. [Create tags](#create-tags) - 1. [Delete tags](#delete-tags) - 1. [Set automatic torrent management](#set-automatic-torrent-management) - 1. [Toggle sequential download](#toggle-sequential-download) - 1. [Set first/last piece priority](#set-firstlast-piece-priority) - 1. [Set force start](#set-force-start) - 1. [Set super seeding](#set-super-seeding) - 1. [Rename file](#rename-file) - 1. [Rename folder](#rename-folder) -1. [RSS (experimental)](#rss-experimental) - 1. [Add folder](#add-folder) - 1. [Add feed](#add-feed) - 1. [Remove item](#remove-item) - 1. [Move item](#move-item) - 1. [Get all items](#get-all-items) - 1. [Mark as read](#mark-as-read) - 1. [Refresh item](#refresh-item) - 1. [Set auto-downloading rule](#set-auto-downloading-rule) - 1. [Rename auto-downloading rule](#rename-auto-downloading-rule) - 1. [Remove auto-downloading rule](#remove-auto-downloading-rule) - 1. [Get all auto-downloading rules](#get-all-auto-downloading-rules) - 1. [Get all articles matching a rule](#get-all-articles-matching-a-rule) -1. [Search](#search) - 1. [Start search](#start-search) - 1. [Stop search](#stop-search) - 1. [Get search status](#get-search-status) - 1. [Get search results](#get-search-results) - 1. [Delete search](#delete-search) - 1. [Get search plugins](#get-search-plugins) - 1. [Install search plugin](#install-search-plugin) - 1. [Uninstall search plugin](#uninstall-search-plugin) - 1. [Enable search plugin](#enable-search-plugin) - 1. [Update search plugins](#update-search-plugins) -1. [WebAPI versioning](#webapi-versioning) - -*** - -# Changes # - -## API v2.0 ## - -- New version naming scheme: X.Y.Z (where X - major version, Y - minor version, Z - release version) -- New API paths. All API methods are under `api/vX/` (where X is API major version) -- API methods are under new scopes - -## API v2.0.1 ## - -- Add `hashes` field to `/torrents/info` ([#8782](https://github.com/qbittorrent/qBittorrent/pull/8782)) -- Add `/torrents/setShareLimits/` method ([#8598](https://github.com/qbittorrent/qBittorrent/pull/8598)) - -## API v2.0.2 ## - -- Add `/torrents/reannounce` method ([#9229](https://github.com/qbittorrent/qBittorrent/pull/9229)) - -## API v2.1.0 ## - -- Change `/sync/maindata` `categories` field from `array` to `object` ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228)) -- Add `savePath` field to `/torrents/createCategory` ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228)). This method now requires the category to already exist and will not create new categories. -- Add `/torrents/editCategory` method ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228)) - -## API v2.1.1 ## - -- Add `/torrents/categories` method ([#9586](https://github.com/qbittorrent/qBittorrent/pull/9586)) -- Add `/search/` methods ([#8584](https://github.com/qbittorrent/qBittorrent/pull/8584)) -- Add `free_space_on_disk` field to `/sync/maindata` ([#8217](https://github.com/qbittorrent/qBittorrent/pull/8217)) - -## API v2.2.0 ## - -- Add `/torrents/editTracker` and `/torrents/removeTracker` methods ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375)) -- Add `tier`, `num_seeds`, `num_leeches`, and `num_downloaded` fields to `/torrents/trackers` ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375)) -- Change `status` field from translated string to an integer for `/torrents/trackers` ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375)) -- Change `/torrents/filePrio` `id` field to accept multiple ids ([#9541](https://github.com/qbittorrent/qBittorrent/pull/9541)) -- Throw additional errors for failed requests to `/torrents/filePrio` ([#9541](https://github.com/qbittorrent/qBittorrent/pull/9541)) -- Add `autoTMM` field to `/torrents/add` ([#9752](https://github.com/qbittorrent/qBittorrent/pull/9752)) -- Add various fields to `/app/getPreferences` and `/app/setPreferences` (`create_subfolder_enabled`, `start_paused_enabled`, `auto_delete_mode`, `preallocate_all`, `incomplete_files_ext`, `auto_tmm_enabled`, `torrent_changed_tmm_enabled`, `save_path_changed_tmm_enabled`, `category_changed_tmm_enabled`, `mail_notification_sender`, `limit_lan_peers`, `slow_torrent_dl_rate_threshold`, `slow_torrent_ul_rate_threshold`, `slow_torrent_inactive_timer`, `alternative_webui_enabled`, `alternative_webui_path`) ([#9752](https://github.com/qbittorrent/qBittorrent/pull/9752)) - -## API v2.2.1 ## - -- Add `rss/refreshItem` ([#11067](https://github.com/qbittorrent/qBittorrent/pull/11067)) - -## API v2.3.0 ## - -- Remove `web_ui_password` field from `/app/preferences`, this field is still writable in `/app/setPreferences` method ([#9942](https://github.com/qbittorrent/qBittorrent/pull/9942)) -- Add `/app/buildInfo` method ([#10096](https://github.com/qbittorrent/qBittorrent/pull/10096)) -- Always use `/` as path separator in `/torrents/files` response ([#10153](https://github.com/qbittorrent/qBittorrent/pull/10153/)) -- Add `/torrents/addPeers` and `/transfer/banPeers` methods ([#10158](https://github.com/qbittorrent/qBittorrent/pull/10158)) -- Add `/torrents/addTags`, `/torrents/removeTags`, `/torrents/tags`, `/torrents/createTags`, `/torrents/deleteTags` methods ([#10527](https://github.com/qbittorrent/qBittorrent/pull/10527)) - -## API v2.4.0 ## - -- Add `/torrents/renameFile` method ([#11029](https://github.com/qbittorrent/qBittorrent/pull/11029)) - -## API v2.4.1 ## - -- Add `stalled`, `stalled_uploading` and `stalled_downloading` as possible values for the `filter` parameter in `/torrents/info` ([#11825](https://github.com/qbittorrent/qBittorrent/pull/11825)) -- Add various fields to `/app/preferences` and `/app/setPreferences` (`piece_extent_affinity`, `web_ui_secure_cookie_enabled`, `web_ui_max_auth_fail_count`, `web_ui_ban_duration`, `stop_tracker_timeout`) ([#11781](https://github.com/qbittorrent/qBittorrent/pull/11781), [#11726](https://github.com/qbittorrent/qBittorrent/pull/11726), [#12004](https://github.com/qbittorrent/qBittorrent/pull/12004), [#11834](https://github.com/qbittorrent/qBittorrent/pull/11834)) - -## API v2.5.0 ## -- Removes `enable_super_seeding` as fields from `/app/preferences` and `/app/setPreferences` ([#12423](https://github.com/qbittorrent/qBittorrent/pull/12423)) - -## API v2.5.1 ## -- Add `web_ui_use_custom_http_headers_enabled`, `web_ui_custom_http_headers`, `rss_download_repack_proper_episodes` and `rss_smart_episode_filters` as fields to `/app/preferences` and `/app/setPreferences` ([#12579](https://github.com/qbittorrent/qBittorrent/pull/12579), [#12549](https://github.com/qbittorrent/qBittorrent/pull/12549)) -- Add `/rss/markAsRead` and `/rss/matchingArticles` methods ([#12549](https://github.com/qbittorrent/qBittorrent/pull/12549)) - -## API v2.6.0 ## -- Removed `/search/categories` method and modified `/search/plugins` method's response ([#12705](https://github.com/qbittorrent/qBittorrent/pull/12705)) - -## API v2.6.1 ## -- Exposed `contentPath` via the `content_path` field in the response to `/torrents/info` ([#13625](https://github.com/qbittorrent/qBittorrent/pull/13625)) - -## API v2.6.2 ## -- Added `tags` optional field to `/torrents/add` ([#13882](https://github.com/qbittorrent/qBittorrent/pull/13882)) - -## API v2.8.0 ## -- Added `/torrents/renameFolder` method and modified `/torrents/renameFile` method's parameters ([#13995](https://github.com/qbittorrent/qBittorrent/pull/13995)) - -Note that this change was released in qBittorrent v4.3.3, but the WebAPI version was incorrectly set to v2.7.0 (see [#14275](https://github.com/qbittorrent/qBittorrent/pull/14275#issuecomment-766310862) for details) - -## API v2.8.1 ## -- Added `ratioLimit` and `seedingTimeLimit` optional fields to `/torrents/add` ([#14519](https://github.com/qbittorrent/qBittorrent/pull/14519)) -- Added `seeding_time` field to `/torrents/info` ([#14554](https://github.com/qbittorrent/qBittorrent/pull/14554)) - -## API v2.8.2 ## -- Added `indexes` optional parameter to `/torrents/files` ([#14795](https://github.com/qbittorrent/qBittorrent/pull/14795)) -- Added `index` field to `/torrents/files` response ([#14795](https://github.com/qbittorrent/qBittorrent/pull/14795)) - -## API v2.8.3 ## -- Added `tag` optional parameter to `/torrents/info` ([#15152](https://github.com/qbittorrent/qBittorrent/pull/15152)) - -# General Information # - -- All API methods are under `/api/v2/APIName/methodName`, where `APIName` is a certain subgroup of API methods whose functionality is related. -- Either `GET` or `POST` can be used as the request type for all API methods. -- All API methods require [authentication](#authentication) (except the `/api/v2/auth/login` method itself, obviously). - -# Authentication # - -All Authentication API methods are under "auth", e.g.: `/api/v2/auth/methodName`. - -qBittorrent uses cookie-based authentication. - -## Login ## - -Name: `login` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`username` | string | Username used to access the WebUI -`password` | string | Password used to access the WebUI - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -403 | User's IP is banned for too many failed login attempts -200 | All other scenarios - -Upon success, the response will contain a cookie with your SID. You must supply the cookie whenever you want to perform an operation that requires authentication. - -Example showing how to login and execute a command that requires authentication using `curl`: - -```sh -$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login -HTTP/1.1 200 OK -Content-Encoding: -Content-Length: 3 -Content-Type: text/plain; charset=UTF-8 -Set-Cookie: SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ; path=/ -$ curl http://localhost:8080/api/v2/torrents/info --cookie "SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ" -``` - -Note: Set `Referer` or `Origin` header to the exact same domain and port as used in the HTTP query `Host` header. - -## Logout ## - -Name: `logout` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -# Application # - -All Application API methods are under "app", e.g.: `/api/v2/app/methodName`. - -## Get application version ## - -Name: `version` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is a string with the application version, e.g. `v4.1.3` - -## Get API version ## - -Name: `webapiVersion` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is a string with the WebAPI version, e.g. `2.0` - -## Get build info ## - -Name: `buildInfo` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON object containing the following fields - -Property | Type | Description --------------|---------|------------ -`qt` | string | QT version -`libtorrent` | string | libtorrent version -`boost` | string | Boost version -`openssl` | string | OpenSSL version -`bitness` | int | Application bitness (e.g. 64-bit) - -## Shutdown application ## - -Name: `shutdown` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get application preferences ## - -Name: `preferences` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON object with several fields (key-value) pairs representing the application's settings. The contents may vary depending on which settings are present in qBittorrent.ini. - -Possible fields: - -Property | Type | Description ------------------------------------------|---------|------------ -`locale` | string | Currently selected language (e.g. en_GB for English) -`create_subfolder_enabled` | bool | True if a subfolder should be created when adding a torrent -`start_paused_enabled` | bool | True if torrents should be added in a Paused state -`auto_delete_mode` | integer | TODO -`preallocate_all` | bool | True if disk space should be pre-allocated for all files -`incomplete_files_ext` | bool | True if ".!qB" should be appended to incomplete files -`auto_tmm_enabled` | bool | True if Automatic Torrent Management is enabled by default -`torrent_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category changes -`save_path_changed_tmm_enabled` | bool | True if torrent should be relocated when the default save path changes -`category_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category's save path changes -`save_path` | string | Default save path for torrents, separated by slashes -`temp_path_enabled` | bool | True if folder for incomplete torrents is enabled -`temp_path` | string | Path for incomplete torrents, separated by slashes -`scan_dirs` | object | Property: 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 -`export_dir` | string | Path to directory to copy .torrent files to. Slashes are used as path separators -`export_dir_fin` | string | Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators -`mail_notification_enabled` | bool | True if e-mail notification should be enabled -`mail_notification_sender` | string | e-mail where notifications should originate from -`mail_notification_email` | string | e-mail to send notifications to -`mail_notification_smtp` | string | smtp server for e-mail notifications -`mail_notification_ssl_enabled` | bool | True if smtp server requires SSL connection -`mail_notification_auth_enabled` | bool | True if smtp server requires authentication -`mail_notification_username` | string | Username for smtp authentication -`mail_notification_password` | string | Password for smtp authentication -`autorun_enabled` | bool | True if external program should be run after torrent has finished downloading -`autorun_program` | string | 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 -`queueing_enabled` | bool | True if torrent queuing is enabled -`max_active_downloads` | integer | Maximum number of active simultaneous downloads -`max_active_torrents` | integer | Maximum number of active simultaneous downloads and uploads -`max_active_uploads` | integer | Maximum number of active simultaneous uploads -`dont_count_slow_torrents` | bool | 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 -`slow_torrent_dl_rate_threshold` | integer | Download rate in KiB/s for a torrent to be considered "slow" -`slow_torrent_ul_rate_threshold` | integer | Upload rate in KiB/s for a torrent to be considered "slow" -`slow_torrent_inactive_timer` | integer | Seconds a torrent should be inactive before considered "slow" -`max_ratio_enabled` | bool | True if share ratio limit is enabled -`max_ratio` | float | Get the global share ratio limit -`max_ratio_act` | integer | Action performed when a torrent reaches the maximum share ratio. See list of possible values here below. -`listen_port` | integer | Port for incoming connections -`upnp` | bool | True if UPnP/NAT-PMP is enabled -`random_port` | bool | True if the port is randomly selected -`dl_limit` | integer | Global download speed limit in KiB/s; `-1` means no limit is applied -`up_limit` | integer | Global upload speed limit in KiB/s; `-1` means no limit is applied -`max_connec` | integer | Maximum global number of simultaneous connections -`max_connec_per_torrent` | integer | Maximum number of simultaneous connections per torrent -`max_uploads` | integer | Maximum number of upload slots -`max_uploads_per_torrent` | integer | Maximum number of upload slots per torrent -`stop_tracker_timeout` | integer | Timeout in seconds for a `stopped` announce request to trackers -`enable_piece_extent_affinity` | bool | True if the advanced libtorrent option `piece_extent_affinity` is enabled -`bittorrent_protocol` | integer | Bittorrent Protocol to use (see list of possible values below) -`limit_utp_rate` | bool | 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_tcp_overhead` | bool | True if `[du]l_limit` should be applied to estimated TCP overhead (service data: e.g. packet headers) -`limit_lan_peers` | bool | True if `[du]l_limit` should be applied to peers on the LAN -`alt_dl_limit` | integer | Alternative global download speed limit in KiB/s -`alt_up_limit` | integer | Alternative global upload speed limit in KiB/s -`scheduler_enabled` | bool | True if alternative limits should be applied according to schedule -`schedule_from_hour` | integer | Scheduler starting hour -`schedule_from_min` | integer | Scheduler starting minute -`schedule_to_hour` | integer | Scheduler ending hour -`schedule_to_min` | integer | Scheduler ending minute -`scheduler_days` | integer | Scheduler days. See possible values here below -`dht` | bool | True if DHT is enabled -`pex` | bool | True if PeX is enabled -`lsd` | bool | True if LSD is enabled -`encryption` | integer | See list of possible values here below -`anonymous_mode` | bool | If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher -`proxy_type` | integer | See list of possible values here below -`proxy_ip` | string | Proxy IP address or domain name -`proxy_port` | integer | Proxy port -`proxy_peer_connections` | bool | 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_auth_enabled` | bool | True proxy requires authentication; doesn't apply to SOCKS4 proxies -`proxy_username` | string | Username for proxy authentication -`proxy_password` | string | Password for proxy authentication -`proxy_torrents_only` | bool | True if proxy is only used for torrents -`ip_filter_enabled` | bool | True if external IP filter should be enabled -`ip_filter_path` | string | Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes -`ip_filter_trackers` | bool | True if IP filters are applied to trackers -`web_ui_domain_list` | string | Comma-separated list of domains to accept when performing Host header validation -`web_ui_address` | string | IP address to use for the WebUI -`web_ui_port` | integer | WebUI port -`web_ui_upnp` | bool | True if UPnP is used for the WebUI port -`web_ui_username` | string | WebUI username -`web_ui_password` | 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_csrf_protection_enabled` | bool | True if WebUI CSRF protection is enabled -`web_ui_clickjacking_protection_enabled` | bool | True if WebUI clickjacking protection is enabled -`web_ui_secure_cookie_enabled` | bool | True if WebUI cookie `Secure` flag is enabled -`web_ui_max_auth_fail_count` | integer | Maximum number of authentication failures before WebUI access ban -`web_ui_ban_duration` | integer | WebUI access ban duration in seconds -`web_ui_session_timeout` | integer | Seconds until WebUI is automatically signed off -`web_ui_host_header_validation_enabled` | bool | True if WebUI host header validation is enabled -`bypass_local_auth` | bool | True if authentication challenge for loopback address (127.0.0.1) should be disabled -`bypass_auth_subnet_whitelist_enabled` | bool | 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` | string | (White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas -`alternative_webui_enabled` | bool | True if an alternative WebUI should be used -`alternative_webui_path` | string | File path to the alternative WebUI -`use_https` | bool | True if WebUI HTTPS access is enabled -`ssl_key` | string | For API < v2.0.1: SSL keyfile contents (this is a not a path) -`ssl_cert` | string | For API < v2.0.1: SSL certificate contents (this is a not a path) -`web_ui_https_key_path` | string | For API ≥ v2.0.1: Path to SSL keyfile -`web_ui_https_cert_path` | string | For API ≥ v2.0.1: Path to SSL certificate -`dyndns_enabled` | bool | True if server DNS should be updated dynamically -`dyndns_service` | integer | See list of possible values here below -`dyndns_username` | string | Username for DDNS service -`dyndns_password` | string | Password for DDNS service -`dyndns_domain` | string | Your DDNS domain name -`rss_refresh_interval` | integer | RSS refresh interval -`rss_max_articles_per_feed` | integer | Max stored articles per RSS feed -`rss_processing_enabled` | bool | Enable processing of RSS feeds -`rss_auto_downloading_enabled` | bool | Enable auto-downloading of torrents from the RSS feeds -`rss_download_repack_proper_episodes` | bool | For API ≥ v2.5.1: Enable downloading of repack/proper Episodes -`rss_smart_episode_filters` | string | For API ≥ v2.5.1: List of RSS Smart Episode Filters -`add_trackers_enabled` | bool | Enable automatic adding of trackers to new torrents -`add_trackers` | string | List of trackers to add to new torrent -`web_ui_use_custom_http_headers_enabled` | bool | For API ≥ v2.5.1: Enable custom http headers -`web_ui_custom_http_headers` | string | For API ≥ v2.5.1: List of custom http headers -`max_seeding_time_enabled` | bool | True enables max seeding time -`max_seeding_time` | integer | Number of minutes to seed a torrent -`announce_ip` | string | TODO -`announce_to_all_tiers` | bool | True always announce to all tiers -`announce_to_all_trackers` | bool | True always announce to all trackers in a tier -`async_io_threads` | integer | Number of asynchronous I/O threads -`banned_IPs` | string | List of banned IPs -`checking_memory_use` | integer | Outstanding memory when checking torrents in MiB -`current_interface_address` | string | IP Address to bind to. Empty String means All addresses -`current_network_interface` | string | Network Interface used -`disk_cache` | integer | Disk cache used in MiB -`disk_cache_ttl` | integer | Disk cache expiry interval in seconds -`embedded_tracker_port` | integer | Port used for embedded tracker -`enable_coalesce_read_write` | bool | True enables coalesce reads & writes -`enable_embedded_tracker` | bool | True enables embedded tracker -`enable_multi_connections_from_same_ip` | bool | True allows multiple connections from the same IP address -`enable_os_cache` | bool | True enables os cache -`enable_upload_suggestions` | bool | True enables sending of upload piece suggestions -`file_pool_size` | integer | File pool size -`outgoing_ports_max` | integer | Maximal outgoing port (0: Disabled) -`outgoing_ports_min` | integer | Minimal outgoing port (0: Disabled) -`recheck_completed_torrents` | bool | True rechecks torrents on completion -`resolve_peer_countries` | bool | True resolves peer countries -`save_resume_data_interval` | integer | Save resume data interval in min -`send_buffer_low_watermark` | integer | Send buffer low watermark in KiB -`send_buffer_watermark` | integer | Send buffer watermark in KiB -`send_buffer_watermark_factor` | integer | Send buffer watermark factor in percent -`socket_backlog_size` | integer | Socket backlog size -`upload_choking_algorithm` | integer | Upload choking algorithm used (see list of possible values below) -`upload_slots_behavior` | integer | Upload slots behavior used (see list of possible values below) -`upnp_lease_duration` | integer | UPnP lease duration (0: Permanent lease) -`utp_tcp_mixed_mode` | integer | μTP-TCP mixed mode algorithm (see list of possible values below) - -Possible values of `scan_dirs`: - -Value | Description -----------------------------|------------ -`0` | Download to the monitored folder -`1` | Download to the default save path -`"/path/to/download/to"` | Download to this path - -Possible values of `scheduler_days`: - -Value | Description --------|------------ -`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 - -Possible values of `encryption`: - -Value | Description --------|------------ -`0` | Prefer encryption -`1` | Force encryption on -`2` | Force encryption off - -NB: the first options allows you to use both encrypted and unencrypted connections (this is the default); other options are mutually exclusive: e.g. by forcing encryption on you won't be able to use unencrypted connections and vice versa. - -Possible values of `proxy_type`: - -Value | Description -------|------------ -`-1` | Proxy is disabled -`1` | HTTP proxy without authentication -`2` | SOCKS5 proxy without authentication -`3` | HTTP proxy with authentication -`4` | SOCKS5 proxy with authentication -`5` | SOCKS4 proxy without authentication - -Possible values of `dyndns_service`: - -Value | Description --------|------------ -`0` | Use DyDNS -`1` | Use NOIP - -Possible values of `max_ratio_act`: - -Value | Description -------|------------ -`0` | Pause torrent -`1` | Remove torrent - -Possible values of `bittorrent_protocol`: - -Value | Description --------|------------ -`0` | TCP and μTP -`1` | TCP -`2` | μTP - -Possible values of `upload_choking_algorithm`: - -Value | Description --------|------------ -`0` | Round-robin -`1` | Fastest upload -`2` | Anti-leech - -Possible values of `upload_slots_behavior`: - -Value | Description --------|------------ -`0` | Fixed slots -`1` | Upload rate based - -Possible values of `utp_tcp_mixed_mode`: - -Value | Description --------|------------ -`0` | Prefer TCP -`1` | Peer proportional - -Example: - -```JSON -{ - "add_trackers": "", - "add_trackers_enabled": false, - "alt_dl_limit": 10240, - "alt_up_limit": 10240, - "alternative_webui_enabled": false, - "alternative_webui_path": "/home/user/Documents/qbit-webui", - "announce_ip": "", - "announce_to_all_tiers": true, - "announce_to_all_trackers": false, - "anonymous_mode": false, - "async_io_threads": 4, - "auto_delete_mode": 0, - "auto_tmm_enabled": false, - "autorun_enabled": false, - "autorun_program": "", - "banned_IPs": "", - "bittorrent_protocol": 0, - "bypass_auth_subnet_whitelist": "", - "bypass_auth_subnet_whitelist_enabled": false, - "bypass_local_auth": false, - "category_changed_tmm_enabled": false, - "checking_memory_use": 32, - "create_subfolder_enabled": true, - "current_interface_address": "", - "current_network_interface": "", - "dht": true, - "disk_cache": -1, - "disk_cache_ttl": 60, - "dl_limit": 0, - "dont_count_slow_torrents": false, - "dyndns_domain": "changeme.dyndns.org", - "dyndns_enabled": false, - "dyndns_password": "", - "dyndns_service": 0, - "dyndns_username": "", - "embedded_tracker_port": 9000, - "enable_coalesce_read_write": false, - "enable_embedded_tracker": false, - "enable_multi_connections_from_same_ip": false, - "enable_os_cache": true, - "enable_piece_extent_affinity": false, - "enable_upload_suggestions": false, - "encryption": 0, - "export_dir": "/home/user/Downloads/all", - "export_dir_fin": "/home/user/Downloads/completed", - "file_pool_size": 40, - "incomplete_files_ext": false, - "ip_filter_enabled": false, - "ip_filter_path": "", - "ip_filter_trackers": false, - "limit_lan_peers": true, - "limit_tcp_overhead": false, - "limit_utp_rate": true, - "listen_port": 58925, - "locale": "en", - "lsd": true, - "mail_notification_auth_enabled": false, - "mail_notification_email": "", - "mail_notification_enabled": false, - "mail_notification_password": "", - "mail_notification_sender": "qBittorrent_notification@example.com", - "mail_notification_smtp": "smtp.changeme.com", - "mail_notification_ssl_enabled": false, - "mail_notification_username": "", - "max_active_downloads": 3, - "max_active_torrents": 5, - "max_active_uploads": 3, - "max_connec": 500, - "max_connec_per_torrent": 100, - "max_ratio": -1, - "max_ratio_act": 0, - "max_ratio_enabled": false, - "max_seeding_time": -1, - "max_seeding_time_enabled": false, - "max_uploads": -1, - "max_uploads_per_torrent": -1, - "outgoing_ports_max": 0, - "outgoing_ports_min": 0, - "pex": true, - "preallocate_all": false, - "proxy_auth_enabled": false, - "proxy_ip": "0.0.0.0", - "proxy_password": "", - "proxy_peer_connections": false, - "proxy_port": 8080, - "proxy_torrents_only": false, - "proxy_type": 0, - "proxy_username": "", - "queueing_enabled": false, - "random_port": false, - "recheck_completed_torrents": false, - "resolve_peer_countries": true, - "rss_auto_downloading_enabled":true, - "rss_download_repack_proper_episodes":true, - "rss_max_articles_per_feed":50, - "rss_processing_enabled":true, - "rss_refresh_interval":30, - "rss_smart_episode_filters":"s(\\d+)e(\\d+)\n(\\d+)x(\\d+)\n(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", - "save_path": "/home/user/Downloads/", - "save_path_changed_tmm_enabled": false, - "save_resume_data_interval": 60, - "scan_dirs": - { - "/home/user/Downloads/incoming/games": 0, - "/home/user/Downloads/incoming/movies": 1, - }, - "schedule_from_hour": 8, - "schedule_from_min": 0, - "schedule_to_hour": 20, - "schedule_to_min": 0, - "scheduler_days": 0, - "scheduler_enabled": false, - "send_buffer_low_watermark": 10, - "send_buffer_watermark": 500, - "send_buffer_watermark_factor": 50, - "slow_torrent_dl_rate_threshold": 2, - "slow_torrent_inactive_timer": 60, - "slow_torrent_ul_rate_threshold": 2, - "socket_backlog_size": 30, - "start_paused_enabled": false, - "stop_tracker_timeout": 1, - "temp_path": "/home/user/Downloads/temp", - "temp_path_enabled": false, - "torrent_changed_tmm_enabled": true, - "up_limit": 0, - "upload_choking_algorithm": 1, - "upload_slots_behavior": 0, - "upnp": true, - "use_https": false, - "utp_tcp_mixed_mode": 0, - "web_ui_address": "*", - "web_ui_ban_duration": 3600, - "web_ui_clickjacking_protection_enabled": true, - "web_ui_csrf_protection_enabled": true, - "web_ui_custom_http_headers": "", - "web_ui_domain_list": "*", - "web_ui_host_header_validation_enabled": true, - "web_ui_https_cert_path": "", - "web_ui_https_key_path": "", - "web_ui_max_auth_fail_count": 5, - "web_ui_port": 8080, - "web_ui_secure_cookie_enabled": true, - "web_ui_session_timeout": 3600, - "web_ui_upnp": false, - "web_ui_use_custom_http_headers_enabled": false, - "web_ui_username": "admin" -} -``` - -## Set application preferences ## - -Name: `setPreferences` - -**Parameters:** - -A json object with key-value pairs of the settings you want to change and their new values. - -Example: - -```JSON -json={"save_path":"C:/Users/Dayman/Downloads","queueing_enabled":false,"scan_dirs":{"C:/Games": 0,"D:/Downloads": 1}} -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -**Notes**: - - 1. There is no need to pass all possible preferences' `token:value` pairs if you only want to change one option - 1. Paths in `scan_dirs` must exist, otherwise this option will have no effect - 1. String values must be quoted; integer and boolean values must never be quoted - -For a list of possible preference options see [Get application preferences](#get-application-preferences) - -## Get default save path ## - -Name: `defaultSavePath` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is a string with the default save path, e.g. `C:/Users/Dayman/Downloads`. - -# Log # - -All Log API methods are under "log", e.g.: `/api/v2/log/methodName`. - -## Get log ## - -Name: `main` - -**Parameters:** - -Parameter | Type | Description -----------------|---------|------------ -`normal` | bool | Include normal messages (default: `true`) -`info` | bool | Include info messages (default: `true`) -`warning` | bool | Include warning messages (default: `true`) -`critical` | bool | Include critical messages (default: `true`) -`last_known_id` | integer | Exclude messages with "message id" <= `last_known_id` (default: `-1`) - -Example: - -```http -/api/v2/log/main?normal=true&info=true&warning=true&critical=true&last_known_id=-1 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON array in which each element is an entry of the log. - -Each element of the array has the following properties: - -Property | Type | Description -------------|---------|------------ -`id` | integer | ID of the message -`message` | string | Text of the message -`timestamp` | integer | Milliseconds since epoch -`type` | integer | Type of the message: Log::NORMAL: `1`, Log::INFO: `2`, Log::WARNING: `4`, Log::CRITICAL: `8` - -Example: - -```JSON -[ - { - "id":0, - "message":"qBittorrent v3.4.0 started", - "timestamp":1507969127860, - "type":1 - }, - { - "id":1, - "message":"qBittorrent is trying to listen on any interface port: 19036", - "timestamp":1507969127869, - "type":2 - }, - { - "id":2, - "message":"Peer ID: -qB3400-", - "timestamp":1507969127870, - "type":1 - }, - { - "id":3, - "message":"HTTP User-Agent is 'qBittorrent/3.4.0'", - "timestamp":1507969127870, - "type":1 - }, - { - "id":4, - "message":"DHT support [ON]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":5, - "message":"Local Peer Discovery support [ON]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":6, - "message":"PeX support [ON]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":7, - "message":"Anonymous mode [OFF]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":8, - "message":"Encryption support [ON]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":9, - "message":"Embedded Tracker [OFF]", - "timestamp":1507969127871, - "type":2 - }, - { - "id":10, - "message":"UPnP / NAT-PMP support [ON]", - "timestamp":1507969127873, - "type":2 - }, - { - "id":11, - "message":"Web UI: Now listening on port 8080", - "timestamp":1507969127883, - "type":1 - }, - { - "id":12, - "message":"Options were saved successfully.", - "timestamp":1507969128055, - "type":1 - }, - { - "id":13, - "message":"qBittorrent is successfully listening on interface :: port: TCP/19036", - "timestamp":1507969128270, - "type":2 - }, - { - "id":14, - "message":"qBittorrent is successfully listening on interface 0.0.0.0 port: TCP/19036", - "timestamp":1507969128271, - "type":2 - }, - { - "id":15, - "message":"qBittorrent is successfully listening on interface 0.0.0.0 port: UDP/19036", - "timestamp":1507969128272, - "type":2 - } -] -``` - -## Get peer log ## - -Name: `peers` - -**Parameters:** - -Parameter | Type | Description -----------------|---------|------------ -`last_known_id` | integer | Exclude messages with "message id" <= `last_known_id` (default: `-1`) - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response a JSON array. Each element of the array of objects (each object is the information relative to a peer) containing the following fields - -Property | Type | Description -------------|---------|------------ -`id` | integer | ID of the peer -`ip` | string | IP of the peer -`timestamp` | integer | Milliseconds since epoch -`blocked` | boolean | Whether or not the peer was blocked -`reason` | string | Reason of the block - -# Sync # - -Sync API implements requests for obtaining changes since the last request. -All Sync API methods are under "sync", e.g.: `/api/v2/sync/methodName`. - -## Get main data ## - -Name: `maindata` - -**Parameters:** - -Parameter | Type | Description -----------|---------|------------ -`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info) - -Example: - -```http -/api/v2/sync/maindata?rid=14 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON object with the following possible fields - -Property | Type | Description -------------------------------|---------|------------ -`rid` | integer | Response ID -`full_update` | bool | Whether the response contains all the data or partial data -`torrents` | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list) -`torrents_removed` | array | List of hashes of torrents removed since last request -`categories` | object | Info for categories added since last request -`categories_removed` | array | List of categories removed since last request -`tags` | array | List of tags added since last request -`tags_removed` | array | List of tags removed since last request -`server_state` | object | Global transfer info - -Example: - -```JSON -{ - "rid":15, - "torrents": - { - "8c212779b4abde7c6bc608063a0d008b7e40ce32": - { - "state":"pausedUP" - } - } -} -``` - -## Get torrent peers data ## - -Name: `torrentPeers` - -**Parameters:** - -Parameter | Type | Description -----------|---------|------------ -`hash` | string | Torrent hash -`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info) - -Example: - -```http -/api/v2/sync/torrentPeers?hash=8c212779b4abde7c6bc608063a0d008b7e40ce32?rid=14 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is TODO - -# Transfer info # - -All Transfer info API methods are under "transfer", e.g.: `/api/v2/transfer/methodName`. - -## Get global transfer info ## - -This method returns info you usually see in qBt status bar. - -Name: `info` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON object with the following fields - -Property | Type | Description ---------------------|---------|------------ -`dl_info_speed` | integer | Global download rate (bytes/s) -`dl_info_data` | integer | Data downloaded this session (bytes) -`up_info_speed` | integer | Global upload rate (bytes/s) -`up_info_data` | integer | Data uploaded this session (bytes) -`dl_rate_limit` | integer | Download rate limit (bytes/s) -`up_rate_limit` | integer | Upload rate limit (bytes/s) -`dht_nodes` | integer | DHT nodes connected to -`connection_status` | string | Connection status. See possible values here below - -In addition to the above in partial data requests (see [Get partial data](#get-partial-data) for more info): - -Property | Type | Description ------------------------|---------|------------ -`queueing` | bool | True if torrent queueing is enabled -`use_alt_speed_limits` | bool | True if alternative speed limits are enabled -`refresh_interval` | integer | Transfer list refresh interval (milliseconds) - -Possible values of `connection_status`: - -Value | ---------------------| -`connected` | -`firewalled` | -`disconnected` | - -Example: - -```JSON -{ - "connection_status":"connected", - "dht_nodes":386, - "dl_info_data":681521119, - "dl_info_speed":0, - "dl_rate_limit":0, - "up_info_data":10747904, - "up_info_speed":0, - "up_rate_limit":1048576 -} -``` - -## Get alternative speed limits state ## - -Name: `speedLimitsMode` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is `1` if alternative speed limits are enabled, `0` otherwise. - -## Toggle alternative speed limits ## - -Name: `toggleSpeedLimitsMode` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get global download limit ## - -Name: `downloadLimit` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is the value of current global download speed limit in bytes/second; this value will be zero if no limit is applied. - -## Set global download limit ## - -Name: `setDownloadLimit` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`limit` | integer | The global download speed limit to set in bytes/second - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get global upload limit ## - -Name: `uploadLimit` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -The response is the value of current global upload speed limit in bytes/second; this value will be zero if no limit is applied. - -## Set global upload limit ## - -Name: `setUploadLimit` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`limit` | integer | The global upload speed limit to set in bytes/second - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Ban peers ## - -Name: `banPeers` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`peers` | string | The peer to ban, or multiple peers separated by a pipe `\|`. Each peer is a colon-separated `host:port` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -# Torrent management # - -All Torrent management API methods are under "torrents", e.g.: `/api/v2/torrents/methodName`. - -## Get torrent list ## - -Name: `info` - -**Parameters:** - -Parameter | Type | Description -----------------------|---------|------------ -`filter` _optional_ | string | Filter torrent list by state. Allowed state filters: `all`, `downloading`, `seeding`, `completed`, `paused`, `active`, `inactive`, `resumed`, `stalled`, `stalled_uploading`, `stalled_downloading`, `errored` -`category` _optional_ | string | Get torrents with the given category (empty string means "without category"; no "category" parameter means "any category" <- broken until [#11748](https://github.com/qbittorrent/qBittorrent/issues/11748) is resolved). Remember to URL-encode the category name. For example, `My category` becomes `My%20category` -`tag` _optional_ since 2.8.3 | string | Get torrents with the given tag (empty string means "without tag"; no "tag" parameter means "any tag". Remember to URL-encode the category name. For example, `My tag` becomes `My%20tag` -`sort` _optional_ | string | Sort torrents by given key. They can be sorted using any field of the response's JSON array (which are documented below) as the sort key. -`reverse` _optional_ | bool | Enable reverse sorting. Defaults to `false` -`limit` _optional_ | integer | Limit the number of torrents returned -`offset` _optional_ | integer | Set offset (if less than 0, offset from end) -`hashes` _optional_ | string | Filter by hashes. Can contain multiple hashes separated by `\|` - -Example: - -```http -/api/v2/torrents/info?filter=downloading&category=sample%20category&sort=ratio -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON array with the following fields - -Property | Type | Description ----------------------|---------|------------ -`added_on` | integer | Time (Unix Epoch) when the torrent was added to the client -`amount_left` | integer | Amount of data left to download (bytes) -`auto_tmm` | bool | Whether this torrent is managed by Automatic Torrent Management -`availability` | float | Percentage of file pieces currently available -`category` | string | Category of the torrent -`completed` | integer | Amount of transfer data completed (bytes) -`completion_on` | integer | Time (Unix Epoch) when the torrent completed -`content_path` | string | Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents) -`dl_limit` | integer | Torrent download speed limit (bytes/s). `-1` if ulimited. -`dlspeed` | integer | Torrent download speed (bytes/s) -`downloaded` | integer | Amount of data downloaded -`downloaded_session` | integer | Amount of data downloaded this session -`eta` | integer | Torrent ETA (seconds) -`f_l_piece_prio` | bool | True if first last piece are prioritized -`force_start` | bool | True if force start is enabled for this torrent -`hash` | string | Torrent hash -`last_activity` | integer | Last time (Unix Epoch) when a chunk was downloaded/uploaded -`magnet_uri` | string | Magnet URI corresponding to this torrent -`max_ratio` | float | Maximum share ratio until torrent is stopped from seeding/uploading -`max_seeding_time` | integer | Maximum seeding time (seconds) until torrent is stopped from seeding -`name` | string | Torrent name -`num_complete` | integer | Number of seeds in the swarm -`num_incomplete` | integer | Number of leechers in the swarm -`num_leechs` | integer | Number of leechers connected to -`num_seeds` | integer | Number of seeds connected to -`priority` | integer | Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode -`progress` | float | Torrent progress (percentage/100) -`ratio` | float | Torrent share ratio. Max ratio value: 9999. -`ratio_limit` | float | TODO (what is different from `max_ratio`?) -`save_path` | string | Path where this torrent's data is stored -`seeding_time` | integer | Torrent elapsed time while complete (seconds) -`seeding_time_limit` | integer | TODO (what is different from `max_seeding_time`?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1. -`seen_complete` | integer | Time (Unix Epoch) when this torrent was last seen complete -`seq_dl` | bool | True if sequential download is enabled -`size` | integer | Total size (bytes) of files selected for download -`state` | string | Torrent state. See table here below for the possible values -`super_seeding` | bool | True if super seeding is enabled -`tags` | string | Comma-concatenated tag list of the torrent -`time_active` | integer | Total active time (seconds) -`total_size` | integer | Total size (bytes) of all file in this torrent (including unselected ones) -`tracker` | string | The first tracker with working status. Returns empty string if no tracker is working. -`up_limit` | integer | Torrent upload speed limit (bytes/s). `-1` if ulimited. -`uploaded` | integer | Amount of data uploaded -`uploaded_session` | integer | Amount of data uploaded this session -`upspeed` | integer | Torrent upload speed (bytes/s) - -Possible values of `state`: - -Value | Description ---------------|------------ -`error` | Some error occurred, applies to paused torrents -`missingFiles`| Torrent data files is missing -`uploading` | Torrent is being seeded and data is being transferred -`pausedUP` | Torrent is paused and has finished downloading -`queuedUP` | Queuing is enabled and torrent is queued for upload -`stalledUP` | Torrent is being seeded, but no connection were made -`checkingUP` | Torrent has finished downloading and is being checked -`forcedUP` | Torrent is forced to uploading and ignore queue limit -`allocating` | Torrent is allocating disk space for download -`downloading` | Torrent is being downloaded and data is being transferred -`metaDL` | Torrent has just started downloading and is fetching metadata -`pausedDL` | Torrent is paused and has NOT finished downloading -`queuedDL` | Queuing is enabled and torrent is queued for download -`stalledDL` | Torrent is being downloaded, but no connection were made -`checkingDL` | Same as checkingUP, but torrent has NOT finished downloading -`forcedDL` | Torrent is forced to downloading to ignore queue limit -`checkingResumeData`| Checking resume data on qBt startup -`moving` | Torrent is moving to another location -`unknown` | Unknown status - -Example: - -```JSON -[ - { - "dlspeed":9681262, - "eta":87, - "f_l_piece_prio":false, - "force_start":false, - "hash":"8c212779b4abde7c6bc608063a0d008b7e40ce32", - "category":"", - "tags": "", - "name":"debian-8.1.0-amd64-CD-1.iso", - "num_complete":-1, - "num_incomplete":-1, - "num_leechs":2, - "num_seeds":54, - "priority":1, - "progress":0.16108787059783936, - "ratio":0, - "seq_dl":false, - "size":657457152, - "state":"downloading", - "super_seeding":false, - "upspeed":0 - }, - { - another_torrent_info - } -] -``` - -## Get torrent generic properties ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `properties` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the generic properties of - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is: - -- empty, if the torrent hash is invalid -- otherwise, a JSON object with the following fields - -Property | Type | Description ---------------------------|---------|------------ -`save_path` | string | Torrent save path -`creation_date` | integer | Torrent creation date (Unix timestamp) -`piece_size` | integer | Torrent piece size (bytes) -`comment` | string | Torrent comment -`total_wasted` | integer | Total data wasted for torrent (bytes) -`total_uploaded` | integer | Total data uploaded for torrent (bytes) -`total_uploaded_session` | integer | Total data uploaded this session (bytes) -`total_downloaded` | integer | Total data downloaded for torrent (bytes) -`total_downloaded_session`| integer | Total data downloaded this session (bytes) -`up_limit` | integer | Torrent upload limit (bytes/s) -`dl_limit` | integer | Torrent download limit (bytes/s) -`time_elapsed` | integer | Torrent elapsed time (seconds) -`seeding_time` | integer | Torrent elapsed time while complete (seconds) -`nb_connections` | integer | Torrent connection count -`nb_connections_limit` | integer | Torrent connection count limit -`share_ratio` | float | Torrent share ratio -`addition_date` | integer | When this torrent was added (unix timestamp) -`completion_date` | integer | Torrent completion date (unix timestamp) -`created_by` | string | Torrent creator -`dl_speed_avg` | integer | Torrent average download speed (bytes/second) -`dl_speed` | integer | Torrent download speed (bytes/second) -`eta` | integer | Torrent ETA (seconds) -`last_seen` | integer | Last seen complete date (unix timestamp) -`peers` | integer | Number of peers connected to -`peers_total` | integer | Number of peers in the swarm -`pieces_have` | integer | Number of pieces owned -`pieces_num` | integer | Number of pieces of the torrent -`reannounce` | integer | Number of seconds until the next announce -`seeds` | integer | Number of seeds connected to -`seeds_total` | integer | Number of seeds in the swarm -`total_size` | integer | Torrent total size (bytes) -`up_speed_avg` | integer | Torrent average upload speed (bytes/second) -`up_speed` | integer | Torrent upload speed (bytes/second) - -NB: `-1` is returned if the type of the property is integer but its value is not known. - -Example: - -```JSON -{ - "addition_date":1438429165, - "comment":"\"Debian CD from cdimage.debian.org\"", - "completion_date":1438429234, - "created_by":"", - "creation_date":1433605214, - "dl_limit":-1, - "dl_speed":0, - "dl_speed_avg":9736015, - "eta":8640000, - "last_seen":1438430354, - "nb_connections":3, - "nb_connections_limit":250, - "peers":1, - "peers_total":89, - "piece_size":524288, - "pieces_have":1254, - "pieces_num":1254, - "reannounce":672, - "save_path":"/Downloads/debian-8.1.0-amd64-CD-1.iso", - "seeding_time":1128, - "seeds":1, - "seeds_total":254, - "share_ratio":0.00072121022562178299, - "time_elapsed":1197, - "total_downloaded":681521119, - "total_downloaded_session":681521119, - "total_size":657457152, - "total_uploaded":491520, - "total_uploaded_session":491520, - "total_wasted":23481724, - "up_limit":-1, - "up_speed":0, - "up_speed_avg":410 -} -``` - -## Get torrent trackers ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `trackers` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the trackers of - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is a JSON array, where each element contains info about one tracker, with the following fields - -Property | Type | Description ------------------|----------|------------- -`url` | string | Tracker url -`status` | integer | Tracker status. See the table below for possible values -`tier` | integer | Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when `>= 0`, `< 0` is used as placeholder when `tier` does not exist for special entries (such as DHT). -`num_peers` | integer | Number of peers for current torrent, as reported by the tracker -`num_seeds` | integer | Number of seeds for current torrent, asreported by the tracker -`num_leeches` | integer | Number of leeches for current torrent, as reported by the tracker -`num_downloaded` | integer | Number of completed downlods for current torrent, as reported by the tracker -`msg` | string | Tracker message (there is no way of knowing what this message is - it's up to tracker admins) - -Possible values of `status`: - -Value | Description --------|------------ -0 | Tracker is disabled (used for DHT, PeX, and LSD) -1 | Tracker has not been contacted yet -2 | Tracker has been contacted and is working -3 | Tracker is updating -4 | Tracker has been contacted, but it is not working (or doesn't send proper replies) - -Example: - -```JSON -[ - { - "msg":"", - "num_peers":100, - "status":2, - "url":"http://bttracker.debian.org:6969/announce" - }, - { - another_tracker_info - } -] -``` - -## Get torrent web seeds ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `webseeds` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the webseeds of - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is a JSON array, where each element is information about one webseed, with the following fields - -Property | Type | Description ---------------|----------|------------ -`url` | string | URL of the web seed - -Example: - -```JSON -[ - { - "url":"http://some_url/" - }, - { - "url":"http://some_other_url/" - } -] -``` - -## Get torrent contents ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `files` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the contents of -`indexes` _optional_ since 2.8.2 | string | The indexes of the files you want to retrieve. `indexes` can contain multiple values separated by `\|`. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is: - -- empty, if the torrent hash is invalid -- otherwise, a JSON array, where each element contains info about one file, with the following fields - -Property | Type | Description ----------------|---------------|------------- -`index` since 2.8.2 | integer | File index -`name` | string | File name (including relative path) -`size` | integer | File size (bytes) -`progress` | float | File progress (percentage/100) -`priority` | integer | File priority. See possible values here below -`is_seed` | bool | True if file is seeding/complete -`piece_range` | integer array | The first number is the starting piece index and the second number is the ending piece index (inclusive) -`availability` | float | Percentage of file pieces currently available (percentage/100) - -Possible values of `priority`: - -Value | Description ------------|------------ -`0` | Do not download -`1` | Normal priority -`6` | High priority -`7` | Maximal priority - -Example: - -```JSON - -[ - { - "index":0, - "is_seed":false, - "name":"debian-8.1.0-amd64-CD-1.iso", - "piece_range":[0,1253], - "priority":1, - "progress":0, - "size":657457152, - "availability":0.5, - } -] -``` - -## Get torrent pieces' states ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `pieceStates` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the pieces' states of - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is: - -- empty, if the torrent hash is invalid -- otherwise, an array of states (integers) of all pieces (in order) of a specific torrent. - -Value meanings are defined as below: - -Value | Description ------------|------------ -`0` | Not downloaded yet -`1` | Now downloading -`2` | Already downloaded - -Example: - -```JSON -[0,0,2,1,0,0,2,1] -``` - -## Get torrent pieces' hashes ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `pieceHashes` - -**Parameters:** - -Parameter | Type | Description -----------|--------|------------ -`hash` | string | The hash of the torrent you want to get the pieces' hashes of - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios- see JSON below - -The response is: - -- empty, if the torrent hash is invalid -- otherwise, an array of hashes (strings) of all pieces (in order) of a specific torrent. - -Example: - -```JSON -["54eddd830a5b58480a6143d616a97e3a6c23c439","f8a99d225aa4241db100f88407fc3bdaead583ab","928fb615b9bd4dd8f9e9022552c8f8f37ef76f58"] -``` - -## Pause torrents ## - -Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). - -Name: `pause` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to pause. `hashes` can contain multiple hashes separated by `\|`, to pause multiple torrents, or set to `all`, to pause all torrents. - -Example: - -```http -/api/v2/torrents/pause?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Resume torrents ## - -Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). - -Name: `resume` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to resume. `hashes` can contain multiple hashes separated by `\|`, to resume multiple torrents, or set to `all`, to resume all torrents. - -Example: - -```http -/api/v2/torrents/resume?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Delete torrents ## - -Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). - -Name: `delete` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to delete. `hashes` can contain multiple hashes separated by `\|`, to delete multiple torrents, or set to `all`, to delete all torrents. -`deleteFiles` | If set to `true`, the downloaded data will also be deleted, otherwise has no effect. - -Example: - -```http -/api/v2/torrents/delete?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32&deleteFiles=false -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Recheck torrents ## - -Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). - -Name: `recheck` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to recheck. `hashes` can contain multiple hashes separated by `\|`, to recheck multiple torrents, or set to `all`, to recheck all torrents. - -Example: - -```http -/api/v2/torrents/recheck?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Reannounce torrents ## - -Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list). - -Name: `reannounce` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to reannounce. `hashes` can contain multiple hashes separated by `\|`, to reannounce multiple torrents, or set to `all`, to reannounce all torrents. - -Example: - -```http -/api/v2/torrents/reannounce?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Add new torrent ## - -This method can add torrents from server local file or from URLs. `http://`, `https://`, `magnet:` and `bc://bt/` links are supported. - -Name: `add` - -Add torrent from URLs example: - -```http -POST /api/v2/torrents/add HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: multipart/form-data; boundary=---------------------------6688794727912 -Content-Length: length - ------------------------------6688794727912 -Content-Disposition: form-data; name="urls" - -https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E7.torrent -https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E8.torrent ------------------------------6688794727912 -Content-Disposition: form-data; name="savepath" - -C:/Users/qBit/Downloads ------------------------------6688794727912 -Content-Disposition: form-data; name="cookie" - -ui=28979218048197 ------------------------------6688794727912 -Content-Disposition: form-data; name="category" - -movies ------------------------------6688794727912 -Content-Disposition: form-data; name="skip_checking" - -true ------------------------------6688794727912 -Content-Disposition: form-data; name="paused" - -true ------------------------------6688794727912 -Content-Disposition: form-data; name="root_folder" - -true ------------------------------6688794727912-- -``` - -Add torrents from files example: - -```http -POST /api/v2/torrents/add HTTP/1.1 -Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Length: length - ----------------------------acebdf13572468 -Content-Disposition: form-data; name="torrents"; filename="8f18036b7a205c9347cb84a253975e12f7adddf2.torrent" -Content-Type: application/x-bittorrent - -file_binary_data_goes_here ----------------------------acebdf13572468 -Content-Disposition: form-data; name="torrents"; filename="UFS.torrent" -Content-Type: application/x-bittorrent - -file_binary_data_goes_here ----------------------------acebdf13572468-- - -``` - -The above example will add two torrent files. `file_binary_data_goes_here` represents raw data of torrent file (basically a byte array). - -**Parameters:** - -Property | Type | Description ---------------------------------|---------|------------ -`urls` | string | URLs separated with newlines -`torrents` | raw | Raw data of torrent file. `torrents` can be presented multiple times. -`savepath` _optional_ | string | Download folder -`cookie` _optional_ | string | Cookie sent to download the .torrent file -`category` _optional_ | string | Category for the torrent -`tags` _optional_ | string | Tags for the torrent, split by ',' -`skip_checking` _optional_ | string | Skip hash checking. Possible values are `true`, `false` (default) -`paused` _optional_ | string | Add torrents in the paused state. Possible values are `true`, `false` (default) -`root_folder` _optional_ | string | Create the root folder. Possible values are `true`, `false`, unset (default) -`rename` _optional_ | string | Rename torrent -`upLimit` _optional_ | integer | Set torrent upload speed limit. Unit in bytes/second -`dlLimit` _optional_ | integer | Set torrent download speed limit. Unit in bytes/second -`ratioLimit` _optional_ since 2.8.1 | float | Set torrent share ratio limit -`seedingTimeLimit` _optional_ since 2.8.1 | integer | Set torrent seeding time limit. Unit in seconds -`autoTMM` _optional_ | bool | Whether Automatic Torrent Management should be used -`sequentialDownload` _optional_ | string | Enable sequential download. Possible values are `true`, `false` (default) -`firstLastPiecePrio` _optional_ | string | Prioritize download first last piece. Possible values are `true`, `false` (default) - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -415 | Torrent file is not valid -200 | All other scenarios - -## Add trackers to torrent ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `addTrackers` - -```http -POST /api/v2/torrents/addTrackers HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&urls=http://192.168.0.1/announce%0Audp://192.168.0.1:3333/dummyAnnounce -``` - -This adds two trackers to torrent with hash `8c212779b4abde7c6bc608063a0d008b7e40ce32`. Note `%0A` (aka LF newline) between trackers. Ampersand in tracker urls **MUST** be escaped. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -200 | All other scenarios - -## Edit trackers ## - -Name: `editTracker` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`hash` | string | The hash of the torrent -`origUrl` | string | The tracker URL you want to edit -`newUrl` | string | The new URL to replace the `origUrl` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | `newUrl` is not a valid URL -404 | Torrent hash was not found -409 | `newUrl` already exists for the torrent -409 | `origUrl` was not found -200 | All other scenarios - -## Remove trackers ## - -Name: `removeTrackers` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`hash` | string | The hash of the torrent -`urls` | string | URLs to remove, separated by `\|` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash was not found -409 | All `urls` were not found -200 | All other scenarios - -## Add peers ## - -Name: `addPeers` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`hashes` | string | The hash of the torrent, or multiple hashes separated by a pipe `\|` -`peers` | string | The peer to add, or multiple peers separated by a pipe `\|`. Each peer is a colon-separated `host:port` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | None of the supplied peers are valid -200 | All other scenarios - -## Increase torrent priority ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `increasePrio` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to increase the priority of. `hashes` can contain multiple hashes separated by `\|`, to increase the priority of multiple torrents, or set to `all`, to increase the priority of all torrents. - -Example: - -```http -/api/v2/torrents/increasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Torrent queueing is not enabled -200 | All other scenarios - -## Decrease torrent priority ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `decreasePrio` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to decrease the priority of. `hashes` can contain multiple hashes separated by `\|`, to decrease the priority of multiple torrents, or set to `all`, to decrease the priority of all torrents. - -Example: - -```http -/api/v2/torrents/decreasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Torrent queueing is not enabled -200 | All other scenarios - -## Maximal torrent priority ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `topPrio` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to set to the maximum priority. `hashes` can contain multiple hashes separated by `\|`, to set multiple torrents to the maximum priority, or set to `all`, to set all torrents to the maximum priority. - -Example: - -```http -/api/v2/torrents/topPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Torrent queueing is not enabled -200 | All other scenarios - -## Minimal torrent priority ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `bottomPrio` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to set to the minimum priority. `hashes` can contain multiple hashes separated by `\|`, to set multiple torrents to the minimum priority, or set to `all`, to set all torrents to the minimum priority. - -Example: - -```http -/api/v2/torrents/bottomPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Torrent queueing is not enabled -200 | All other scenarios - -## Set file priority ## - -Name: `filePrio` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`hash` | string | The hash of the torrent -`id` | string | File ids, separated by `\|` -`priority` | number | File priority to set (consult [torrent contents API](#get-torrent-contents) for possible values) - -`id` values correspond to file position inside the array returned by [torrent contents API](#get-torrent-contents), e.g. `id=0` for first file, `id=1` for second file, etc. - -Since 2.8.2 it is reccomended to use `index` field returned by [torrent contents API](#get-torrent-contents) (since the files can be filtered and the `index` value may differ from the position inside the response array). - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Priority is invalid -400 | At least one file `id` is not a valid integer -404 | Torrent hash was not found -409 | Torrent metadata hasn't downloaded yet -409 | At least one file `id` was not found -200 | All other scenarios - -## Get torrent download limit ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `downloadLimit` - -```http -POST /api/v2/torrents/downloadLimit HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` - -Server reply (example): - -```http -HTTP/1.1 200 OK -content-type: application/json -content-length: length - -{"8c212779b4abde7c6bc608063a0d008b7e40ce32":338944,"284b83c9c7935002391129fd97f43db5d7cc2ba0":123} -``` - -`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent and `338944` its download speed limit in bytes per second; this value will be zero if no limit is applied. - -## Set torrent download limit ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -```http -POST /api/v2/torrents/setDownloadLimit HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`limit` is the download speed limit in bytes per second you want to set. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set torrent share limit ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setShareLimits` - -```http -POST /api/v2/torrents/setShareLimits HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&ratioLimit=1.0&seedingTimeLimit=60 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`ratioLimit` is the max ratio the torrent should be seeded until. `-2` means the global limit should be used, `-1` means no limit. -`seedingTimeLimit` is the max amount of time the torrent should be seeded. `-2` means the global limit should be used, `-1` means no limit. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get torrent upload limit ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `uploadLimit` - -```http -POST /api/v2/torrents/uploadLimit HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` - -Server reply (example): - -```http -HTTP/1.1 200 OK -content-type: application/json -content-length: length - -{"8c212779b4abde7c6bc608063a0d008b7e40ce32":338944,"284b83c9c7935002391129fd97f43db5d7cc2ba0":123} -``` - -`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent in the request and `338944` its upload speed limit in bytes per second; this value will be zero if no limit is applied. - -## Set torrent upload limit ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setUploadLimit` - -```http -POST /api/v2/torrents/setUploadLimit HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`limit` is the upload speed limit in bytes per second you want to set. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set torrent location ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setLocation` - -```http -POST /api/v2/torrents/setLocation HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&location=/mnt/nfs/media -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`location` is the location to download the torrent to. If the location doesn't exist, the torrent's location is unchanged. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Save path is empty -403 | User does not have write access to directory -409 | Unable to create save path directory -200 | All other scenarios - -## Set torrent name ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `rename` - -```http -POST /api/v2/torrents/rename HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&name=This%20is%20a%20test -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Torrent hash is invalid -409 | Torrent name is empty -200 | All other scenarios - -## Set torrent category ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setCategory` - -```http -POST /api/v2/torrents/setCategory HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&category=CategoryName -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` - -`category` is the torrent category you want to set. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Category name does not exist -200 | All other scenarios - -## Get all categories ## - -Name: `categories` - -Parameters: - -None - -Returns all categories in JSON format, e.g.: - -```JSON -{ - "Video": { - "name": "Video", - "savePath": "/home/user/torrents/video/" - }, - "eBooks": { - "name": "eBooks", - "savePath": "/home/user/torrents/eBooks/" - } -} -``` -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Add new category ## - -Name: `createCategory` - -```http -POST /api/v2/torrents/createCategory HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -category=CategoryName&savePath=/path/to/dir -``` - -`category` is the category you want to create. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Category name is empty -409 | Category name is invalid -200 | All other scenarios - -## Edit category ## - -Name: `editCategory` - -```http -POST /api/v2/torrents/editCategory HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -category=CategoryName&savePath=/path/to/save/torrents/to -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Category name is empty -409 | Category editing failed -200 | All other scenarios - -## Remove categories ## - -Name: `removeCategories` - -```http -POST /api/v2/torrents/removeCategories HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -categories=Category1%0ACategory2 -``` - -`categories` can contain multiple cateogies separated by `\n` (%0A urlencoded) - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Add torrent tags ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `addTags` - -```http -POST /api/v2/torrents/addTags HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` - -`tags` is the list of tags you want to add to passed torrents. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Remove torrent tags ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `removeTags` - -```http -POST /api/v2/torrents/removeTags HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2 -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` - -`tags` is the list of tags you want to remove from passed torrents. -Empty list removes all tags from relevant torrents. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get all tags ## - -Name: `tags` - -Parameters: - -None - -Returns all tags in JSON format, e.g.: - -```JSON -[ - "Tag 1", - "Tag 2" -] -``` -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Create tags ## - -Name: `createTags` - -```http -POST /api/v2/torrents/createTags HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -tags=TagName1,TagName2 -``` -`tags` is a list of tags you want to create. -Can contain multiple tags separated by `,`. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Delete tags ## - -Name: `deleteTags` - -```http -POST /api/v2/torrents/deleteTags HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -tags=TagName1,TagName2 -``` - -`tags` is a list of tags you want to delete. -Can contain multiple tags separated by `,`. - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set automatic torrent management ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setAutoManagement` - -```http -POST /api/v2/torrents/setAutoManagement HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&enable=true -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`enable` is a boolean, affects the torrents listed in `hashes`, default is `false` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Toggle sequential download ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `toggleSequentialDownload` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to toggle sequential download for. `hashes` can contain multiple hashes separated by `\|`, to toggle sequential download for multiple torrents, or set to `all`, to toggle sequential download for all torrents. - -Example: - -```http -/api/v2/torrents/toggleSequentialDownload?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set first/last piece priority ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `toggleFirstLastPiecePrio` - -**Parameters:** - -Parameter | Type | Description -------------|----------|------------ -`hashes` | string | The hashes of the torrents you want to toggle the first/last piece priority for. `hashes` can contain multiple hashes separated by `\|`, to toggle the first/last piece priority for multiple torrents, or set to `all`, to toggle the first/last piece priority for all torrents. - -Example: - -```http -/api/v2/torrents/toggleFirstLastPiecePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439 -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set force start ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setForceStart` - -```http -POST /api/v2/torrents/setForceStart HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`value` is a boolean, affects the torrents listed in `hashes`, default is `false` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set super seeding ## - -Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list). - -Name: `setSuperSeeding` - -```http -POST /api/v2/torrents/setSuperSeeding HTTP/1.1 -User-Agent: Fiddler -Host: 127.0.0.1 -Cookie: SID=your_sid -Content-Type: application/x-www-form-urlencoded -Content-Length: length - -hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true -``` - -`hashes` can contain multiple hashes separated by `|` or set to `all` -`value` is a boolean, affects the torrents listed in `hashes`, default is `false` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Rename file ## - -Name: `renameFile` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|----------|------------ -`hash` | string | The hash of the torrent -`oldPath` | string | The old path of the torrent -`newPath` | string | The new path to use for the file - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Missing `newPath` parameter -409 | Invalid `newPath` or `oldPath`, or `newPath` already in use -200 | All other scenarios - -## Rename folder ## - -Name: `renameFolder` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|----------|------------ -`hash` | string | The hash of the torrent -`oldPath` | string | The old path of the torrent -`newPath` | string | The new path to use for the file - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -400 | Missing `newPath` parameter -409 | Invalid `newPath` or `oldPath`, or `newPath` already in use -200 | All other scenarios - -# RSS (experimental) # - -All RSS API methods are under "rss", e.g.: `/api/v2/rss/methodName`. - -## Add folder ## - -Name: `addFolder` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`path` | string | Full path of added folder (e.g. "The Pirate Bay\Top100") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Failure to add folder -200 | All other scenarios - -## Add feed ## - -Name: `addFeed` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`url` | string | URL of RSS feed (e.g. "[http://thepiratebay.org/rss//top100/200](http://thepiratebay.org/rss//top100/200)") -`path` _optional_ | string | Full path of added folder (e.g. "The Pirate Bay\Top100\Video") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Failure to add feed -200 | All other scenarios - -## Remove item ## - -Removes folder or feed. - -Name: `removeItem` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`path` | string | Full path of removed item (e.g. "The Pirate Bay\Top100") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Failure to remove item -200 | All other scenarios - -## Move item ## - -Moves/renames folder or feed. - -Name: `moveItem` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") -`destPath` | string | New full path of item (e.g. "The Pirate Bay") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | Failure to move item -200 | All other scenarios - -## Get all items ## - -Name: `items` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`withData` _optional_ | bool | True if you need current feed articles - -Returns all RSS items in JSON format, e.g.: - -```JSON -{ - "HD-Torrents.org": "https://hd-torrents.org/rss.php", - "PowerfulJRE": "https://www.youtube.com/feeds/videos.xml?channel_id=UCzQUP1qoWDoEbmsQxvdjxgQ", - "The Pirate Bay": { - "Audio": "https://thepiratebay.org/rss//top100/100", - "Video": "https://thepiratebay.org/rss//top100/200" - } -} -``` - -## Mark as read ## - -If `articleId` is provided only the article is marked as read otherwise the whole feed is going to be marked as read. - -Name: `markAsRead` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") -`articleId` _optional_ | string | ID of article - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Refresh item ## - -Refreshes folder or feed. - -Name: `refreshItem` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`itemPath` | string | Current full path of item (e.g. "The Pirate Bay\Top100") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Set auto-downloading rule ## - -Name: `setRule` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`ruleName` | string | Rule name (e.g. "Punisher") -`ruleDef` | string | JSON encoded rule definition - -Rule definition is JSON encoded dictionary with the following fields: - -Field | Type | Description -----------------------------------|---------|------------ -`enabled` | bool | Whether the rule is enabled -`mustContain` | string | The substring that the torrent name must contain -`mustNotContain` | string | The substring that the torrent name must not contain -`useRegex` | bool | Enable regex mode in "mustContain" and "mustNotContain" -`episodeFilter` | string | Episode filter definition -`smartFilter` | bool | Enable smart episode filter -`previouslyMatchedEpisodes` | list | The list of episode IDs already matched by smart filter -`affectedFeeds` | list | The feed URLs the rule applied to -`ignoreDays` | number | Ignore sunsequent rule matches -`lastMatch` | string | The rule last match time -`addPaused` | bool | Add matched torrent in paused mode -`assignedCategory` | string | Assign category to the torrent -`savePath` | string | Save torrent to the given directory - -E.g.: - -```JSON -{ - "enabled": false, - "mustContain": "The *Punisher*", - "mustNotContain": "", - "useRegex": false, - "episodeFilter": "1x01-;", - "smartFilter": false, - "previouslyMatchedEpisodes": [ - ], - "affectedFeeds": [ - "http://showrss.info/user/134567.rss?magnets=true" - ], - "ignoreDays": 0, - "lastMatch": "20 Nov 2017 09:05:11", - "addPaused": true, - "assignedCategory": "", - "savePath": "C:/Users/JohnDoe/Downloads/Punisher" -} -``` - -## Rename auto-downloading rule ## - -Name: `renameRule` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`ruleName` | string | Rule name (e.g. "Punisher") -`newRuleName` | string | New rule name (e.g. "The Punisher") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Remove auto-downloading rule ## - -Name: `removeRule` - -Parameters: - -Parameter | Type | Description -----------------------------------|---------|------------ -`ruleName` | string | Rule name (e.g. "Punisher") - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - - -## Get all auto-downloading rules ## - -Name: `rules` - -Returns all auto-downloading rules in JSON format, e.g.: - -```JSON -{ - "The Punisher": { - "enabled": false, - "mustContain": "The *Punisher*", - "mustNotContain": "", - "useRegex": false, - "episodeFilter": "1x01-;", - "smartFilter": false, - "previouslyMatchedEpisodes": [ - ], - "affectedFeeds": [ - "http://showrss.info/user/134567.rss?magnets=true" - ], - "ignoreDays": 0, - "lastMatch": "20 Nov 2017 09:05:11", - "addPaused": true, - "assignedCategory": "", - "savePath": "C:/Users/JohnDoe/Downloads/Punisher" - } -} -``` -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Get all articles matching a rule ## - -Name: `matchingArticles` - -Parameter | Type | Description -----------------------------------|---------|------------ -`ruleName` | string | Rule name (e.g. "Linux") - - -Returns all articles that match a rule by feed name in JSON format, e.g.: - -```JSON -{ - "DistroWatch":[ - "sparkylinux-5.11-i686-minimalgui.iso.torrent", - "sparkylinux-5.11-x86_64-minimalgui.iso.torrent", - "sparkylinux-5.11-i686-xfce.iso.torrent", - "bluestar-linux-5.6.3-2020.04.09-x86_64.iso.torrent", - "robolinux64-mate3d-v10.10.iso.torrent", - ], - "Linuxtracker":[ - "[Alpine Linux] alpine-extended-3.11.6", - "[Alpine Linux] alpine-standard-3.11.6", - "[Linuxfx] linuxfx10-wxs-lts-beta5.iso", - "[Linux Lite] linux-lite-5.0-rc1-64bit.iso (MULTI)", - "[Scientific Linux] SL-7.8-x86_64-Pack", - "[NixOS] nixos-plasma5-20.03.1418.5272327b81e-x86_64-linux.iso" - ] -} -``` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - - -# Search # - -All Search API methods are under "search", e.g.: `/api/v2/search/methodName`. - -## Start search ## - -Name: `start` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`pattern` | string | Pattern to search for (e.g. "Ubuntu 18.04") -`plugins` | string | Plugins to use for searching (e.g. "legittorrents"). Supports multiple plugins separated by `\|`. Also supports `all` and `enabled` -`category` | string | Categories to limit your search to (e.g. "legittorrents"). Available categories depend on the specified `plugins`. Also supports `all` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -409 | User has reached the limit of max `Running` searches (currently set to 5) -200 | All other scenarios- see JSON below - -The response is a JSON object with the following fields - -Field | Type | Description -----------------------------------|---------|------------ -`id` | number | ID of the search job - -Example: - -```JSON -{ - "id": 12345 -} -``` - -## Stop search ## - -Name: `stop` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`id` | number | ID of the search job - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Search job was not found -200 | All other scenarios - -## Get search status ## - -Name: `status` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`id` _optional_ | number | ID of the search job. If not specified, all search jobs are returned - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Search job was not found -200 | All other scenarios- see JSON below - -The response is a JSON array of objects containing the following fields - -Field | Type | Description -----------------------------------|---------|------------ -`id` | number | ID of the search job -`status` | string | Current status of the search job (either `Running` or `Stopped`) -`total` | number | Total number of results. If the status is `Running` this number may contineu to increase - -Example: - -```JSON -[ - { - "id": 12345, - "status": "Running", - "total": 170 - } -] -``` - -## Get search results ## - -Name: `results` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`id` | number | ID of the search job -`limit` _optional_ | number | max number of results to return. 0 or negative means no limit -`offset` _optional_ | number | result to start at. A negative number means count backwards (e.g. `-2` returns the 2 most recent results) - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Search job was not found -409 | Offset is too large, or too small (e.g. absolute value of negative number is greater than # results) -200 | All other scenarios- see JSON below - -The response is a JSON object with the following fields - -Field | Type | Description -----------------------------------|---------|------------ -`results` | array | Array of `result` objects- see table below -`status` | string | Current status of the search job (either `Running` or `Stopped`) -`total` | number | Total number of results. If the status is `Running` this number may continue to increase - -**Result object:** - -Field | Type | Description -----------------------------------|---------|------------ -`descrLink` | string | URL of the torrent's description page -`fileName` | string | Name of the file -`fileSize` | number | Size of the file in Bytes -`fileUrl` | string | Torrent download link (usually either .torrent file or magnet link) -`nbLeechers` | number | Number of leechers -`nbSeeders` | number | Number of seeders -`siteUrl` | string | URL of the torrent site - -Example: - -```JSON -{ - "results": [ - { - "descrLink": "http://www.legittorrents.info/index.php?page=torrent-details&id=8d5f512e1acb687029b8d7cc6c5a84dce51d7a41", - "fileName": "Ubuntu-10.04-32bit-NeTV.ova", - "fileSize": -1, - "fileUrl": "http://www.legittorrents.info/download.php?id=8d5f512e1acb687029b8d7cc6c5a84dce51d7a41&f=Ubuntu-10.04-32bit-NeTV.ova.torrent", - "nbLeechers": 1, - "nbSeeders": 0, - "siteUrl": "http://www.legittorrents.info" - }, - { - "descrLink": "http://www.legittorrents.info/index.php?page=torrent-details&id=d5179f53e105dc2c2401bcfaa0c2c4936a6aa475", - "fileName": "mangOH-Legato-17_06-Ubuntu-16_04.ova", - "fileSize": -1, - "fileUrl": "http://www.legittorrents.info/download.php?id=d5179f53e105dc2c2401bcfaa0c2c4936a6aa475&f=mangOH-Legato-17_06-Ubuntu-16_04.ova.torrent", - "nbLeechers": 0, - "nbSeeders": 59, - "siteUrl": "http://www.legittorrents.info" - } - ], - "status": "Running", - "total": 2 -} -``` - -## Delete search ## - -Name: `delete` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`id` | number | ID of the search job - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -404 | Search job was not found -200 | All other scenarios - -## Get search plugins ## - -Name: `plugins` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios- see JSON below - -The response is a JSON array of objects containing the following fields - -Field | Type | Description -----------------------------------|---------|------------ -`enabled` | bool | Whether the plugin is enabled -`fullName` | string | Full name of the plugin -`name` | string | Short name of the plugin -`supportedCategories` | array | List of category objects -`url` | string | URL of the torrent site -`version` | string | Installed version of the plugin - -```JSON -[ - { - "enabled": true, - "fullName": "Legit Torrents", - "name": "legittorrents", - "supportedCategories": [{ - "id": "all", - "name": "All categories" - }, { - "id": "anime", - "name": "Anime" - }, { - "id": "books", - "name": "Books" - }, { - "id": "games", - "name": "Games" - }, { - "id": "movies", - "name": "Movies" - }, { - "id": "music", - "name": "Music" - }, { - "id": "tv", - "name": "TV shows" - }], - "url": "http://www.legittorrents.info", - "version": "2.3" - } -] -``` - -## Install search plugin ## - -Name: `installPlugin` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`sources` | string | Url or file path of the plugin to install (e.g. "[https://raw.githubusercontent.com/qbittorrent/search-plugins/master/nova3/engines/legittorrents.py](https://raw.githubusercontent.com/qbittorrent/search-plugins/master/nova3/engines/legittorrents.py)"). Supports multiple sources separated by `\|` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Uninstall search plugin ## - -Name: `uninstallPlugin` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`names` | string | Name of the plugin to uninstall (e.g. "legittorrents"). Supports multiple names separated by `\|` - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Enable search plugin ## - -Name: `enablePlugin` - -**Parameters:** - -Parameter | Type | Description -----------------------------------|---------|------------ -`names` | string | Name of the plugin to enable/disable (e.g. "legittorrents"). Supports multiple names separated by `\|` -`enable` | bool | Whether the plugins should be enabled - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -## Update search plugins ## - -Name: `updatePlugins` - -**Parameters:** - -None - -**Returns:** - -HTTP Status Code | Scenario -----------------------------------|--------------------- -200 | All scenarios - -# WebAPI versioning # -WebAPI uses the following versioning: `1.2.3`: -1. Main version. Should be changed only on some global changes (e.g. total redesign/relayout) -2. Changed on incompatible API changes (i.e. if it breaks outdated clients). E.g. if you change/remove something -3. Changed on compatible API changes (i.e. if it doesn't break outdated clients). E.g. if you add something new outdated clients still can access old subset of API. diff --git a/api-gen/Cargo.toml b/qbittorrent-web-api-gen/Cargo.toml similarity index 91% rename from api-gen/Cargo.toml rename to qbittorrent-web-api-gen/Cargo.toml index 61c26f2..11c9c0a 100644 --- a/api-gen/Cargo.toml +++ b/qbittorrent-web-api-gen/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "api-gen" +name = "qbittorrent-web-api-gen" version = "0.1.0" edition = "2021" @@ -7,7 +7,6 @@ edition = "2021" proc-macro = true [dependencies] -parser = { path = "../parser" } syn = { version = "1.0.98", features = ["extra-traits"]} quote = "1.0.20" proc-macro2 = "1.0.40" diff --git a/api-gen/src/api-4_1.md b/qbittorrent-web-api-gen/api-4_1.md similarity index 100% rename from api-gen/src/api-4_1.md rename to qbittorrent-web-api-gen/api-4_1.md diff --git a/parser/groups.txt b/qbittorrent-web-api-gen/groups.txt similarity index 100% rename from parser/groups.txt rename to qbittorrent-web-api-gen/groups.txt diff --git a/api-gen/src/group.rs b/qbittorrent-web-api-gen/src/group.rs similarity index 99% rename from api-gen/src/group.rs rename to qbittorrent-web-api-gen/src/group.rs index 9dfc9d3..67cc7e0 100644 --- a/api-gen/src/group.rs +++ b/qbittorrent-web-api-gen/src/group.rs @@ -1,11 +1,10 @@ use std::{collections::HashMap, vec::Vec}; use case::CaseExt; -use parser::types::TypeInfo; use quote::{format_ident, quote}; use regex::Regex; -use crate::{skeleton::auth_ident, util}; +use crate::{parser::{self, types::TypeInfo}, skeleton::auth_ident, util}; pub fn generate_groups(groups: Vec) -> proc_macro2::TokenStream { let gr = groups diff --git a/api-gen/src/lib.rs b/qbittorrent-web-api-gen/src/lib.rs similarity index 90% rename from api-gen/src/lib.rs rename to qbittorrent-web-api-gen/src/lib.rs index a9a670f..75a9b9c 100644 --- a/api-gen/src/lib.rs +++ b/qbittorrent-web-api-gen/src/lib.rs @@ -1,6 +1,8 @@ mod group; mod skeleton; mod util; +mod parser; +mod md_parser; use case::CaseExt; use proc_macro::TokenStream; @@ -10,7 +12,7 @@ use syn::parse_macro_input; use crate::group::generate_groups; -const API_CONTENT: &str = include_str!("api-4_1.md"); +const API_CONTENT: &str = include_str!("../api-4_1.md"); #[proc_macro_derive(QBittorrentApiGen, attributes(api_gen))] pub fn derive(input: TokenStream) -> TokenStream { diff --git a/md-parser/src/lib.rs b/qbittorrent-web-api-gen/src/md_parser/mod.rs similarity index 100% rename from md-parser/src/lib.rs rename to qbittorrent-web-api-gen/src/md_parser/mod.rs diff --git a/parser/src/group_parser/description.rs b/qbittorrent-web-api-gen/src/parser/group_parser/description.rs similarity index 97% rename from parser/src/group_parser/description.rs rename to qbittorrent-web-api-gen/src/parser/group_parser/description.rs index b83f8b3..0819ec2 100644 --- a/parser/src/group_parser/description.rs +++ b/qbittorrent-web-api-gen/src/parser/group_parser/description.rs @@ -1,4 +1,4 @@ -use md_parser::MdContent; +use crate::md_parser::MdContent; pub fn get_group_description(content: &[MdContent]) -> Option { let return_desc = content diff --git a/parser/src/group_parser/mod.rs b/qbittorrent-web-api-gen/src/parser/group_parser/mod.rs similarity index 91% rename from parser/src/group_parser/mod.rs rename to qbittorrent-web-api-gen/src/parser/group_parser/mod.rs index 4010bcb..0683654 100644 --- a/parser/src/group_parser/mod.rs +++ b/qbittorrent-web-api-gen/src/parser/group_parser/mod.rs @@ -1,14 +1,14 @@ +use crate::md_parser::TokenTree; + +use self::{return_type::get_return_type, parameters::get_parameters}; + +use super::{ApiGroup, ApiMethod, util}; + mod description; mod parameters; mod return_type; mod url_parser; -use md_parser::TokenTree; - -use crate::{util, ApiGroup, ApiMethod}; - -use self::{parameters::get_parameters, return_type::get_return_type}; - pub fn parse_groups(trees: Vec) -> Vec { trees.into_iter().map(parse_api_group).collect() } diff --git a/parser/src/group_parser/parameters.rs b/qbittorrent-web-api-gen/src/parser/group_parser/parameters.rs similarity index 94% rename from parser/src/group_parser/parameters.rs rename to qbittorrent-web-api-gen/src/parser/group_parser/parameters.rs index 0ba8e6f..2b6bc12 100644 --- a/parser/src/group_parser/parameters.rs +++ b/qbittorrent-web-api-gen/src/parser/group_parser/parameters.rs @@ -1,8 +1,9 @@ use std::collections::HashMap; -use md_parser::MdContent; - -use crate::types::{Type, OPTIONAL}; +use crate::{ + md_parser::MdContent, + parser::types::{Type, OPTIONAL}, +}; pub fn get_parameters(content: &[MdContent]) -> Option> { let mut it = content diff --git a/parser/src/group_parser/return_type.rs b/qbittorrent-web-api-gen/src/parser/group_parser/return_type.rs similarity index 92% rename from parser/src/group_parser/return_type.rs rename to qbittorrent-web-api-gen/src/parser/group_parser/return_type.rs index a7ab9bd..241d4d0 100644 --- a/parser/src/group_parser/return_type.rs +++ b/qbittorrent-web-api-gen/src/parser/group_parser/return_type.rs @@ -1,6 +1,4 @@ -use md_parser::MdContent; - -use crate::{object_types::get_object_types, types::Type, ReturnType, ReturnTypeParameter}; +use crate::{md_parser::MdContent, parser::{ReturnType, object_types::get_object_types, ReturnTypeParameter, types::Type}}; pub fn get_return_type(content: &[MdContent]) -> Option { let table = content diff --git a/parser/src/group_parser/url_parser.rs b/qbittorrent-web-api-gen/src/parser/group_parser/url_parser.rs similarity index 93% rename from parser/src/group_parser/url_parser.rs rename to qbittorrent-web-api-gen/src/parser/group_parser/url_parser.rs index 3bb6be2..43a5ac7 100644 --- a/parser/src/group_parser/url_parser.rs +++ b/qbittorrent-web-api-gen/src/parser/group_parser/url_parser.rs @@ -1,7 +1,6 @@ -use md_parser::MdContent; use regex::Regex; -use crate::util; +use crate::{md_parser::MdContent, parser::util}; pub fn get_group_url(content: &[MdContent]) -> String { let row = util::find_content_contains(content, "API methods are under") diff --git a/qbittorrent-web-api-gen/src/parser/groups.txt b/qbittorrent-web-api-gen/src/parser/groups.txt new file mode 100644 index 0000000..96d8e85 --- /dev/null +++ b/qbittorrent-web-api-gen/src/parser/groups.txt @@ -0,0 +1,5696 @@ +[ + ApiGroup { + name: "authentication", + methods: [ + ApiMethod { + name: "login", + description: Some( + "Example showing how to login and execute a command that requires authentication using `curl`:\n\n```sh\n$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login\nHTTP/1.1 200 OK\nContent-Encoding:\nContent-Length: 3\nContent-Type: text/plain; charset=UTF-8\nSet-Cookie: SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ; path=/\n$ curl http://localhost:8080/api/v2/torrents/info --cookie \"SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ\"\n```\n\nNote: Set `Referer` or `Origin` header to the exact same domain and port as used in the HTTP query `Host` header.", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "username", + is_optional: false, + is_list: false, + description: Some( + "Username used to access the WebUI", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "password", + is_optional: false, + is_list: false, + description: Some( + "Password used to access the WebUI", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "login", + }, + ApiMethod { + name: "logout", + description: None, + parameters: None, + return_type: None, + url: "logout", + }, + ], + description: Some( + "All Authentication API methods are under \"auth\", e.g.: `/api/v2/auth/methodName`.\n\nqBittorrent uses cookie-based authentication.", + ), + url: "auth", + }, + ApiGroup { + name: "application", + methods: [ + ApiMethod { + name: "version", + description: None, + parameters: None, + return_type: None, + url: "version", + }, + ApiMethod { + name: "webapiVersion", + description: None, + parameters: None, + return_type: None, + url: "webapiVersion", + }, + ApiMethod { + name: "buildInfo", + description: None, + parameters: None, + return_type: Some( + ReturnType { + is_list: false, + parameters: [ + ReturnTypeParameter { + name: "qt", + description: "QT version", + return_type: String( + TypeInfo { + name: "qt", + is_optional: false, + is_list: false, + description: Some( + "QT version", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "libtorrent", + description: "libtorrent version", + return_type: String( + TypeInfo { + name: "libtorrent", + is_optional: false, + is_list: false, + description: Some( + "libtorrent version", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "boost", + description: "Boost version", + return_type: String( + TypeInfo { + name: "boost", + is_optional: false, + is_list: false, + description: Some( + "Boost version", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "openssl", + description: "OpenSSL version", + return_type: String( + TypeInfo { + name: "openssl", + is_optional: false, + is_list: false, + description: Some( + "OpenSSL version", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "bitness", + description: "Application bitness (e.g. 64-bit)", + return_type: Number( + TypeInfo { + name: "bitness", + is_optional: false, + is_list: false, + description: Some( + "Application bitness (e.g. 64-bit)", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "buildInfo", + }, + ApiMethod { + name: "shutdown", + description: None, + parameters: None, + return_type: None, + url: "shutdown", + }, + ApiMethod { + name: "preferences", + description: Some( + "Possible fields:\n\nPossible values of `scan_dirs`:\n\nPossible values of `scheduler_days`:\n\nPossible values of `encryption`:\n\nNB: the first options allows you to use both encrypted and unencrypted connections (this is the default); other options are mutually exclusive: e.g. by forcing encryption on you won't be able to use unencrypted connections and vice versa.\n\nPossible values of `proxy_type`:\n\nPossible values of `dyndns_service`:\n\nPossible values of `max_ratio_act`:\n\nPossible values of `bittorrent_protocol`:\n\nPossible values of `upload_choking_algorithm`:\n\nPossible values of `upload_slots_behavior`:\n\nPossible values of `utp_tcp_mixed_mode`:\n\nExample:\n\n```JSON\n{\n \"add_trackers\": \"\",\n \"add_trackers_enabled\": false,\n \"alt_dl_limit\": 10240,\n \"alt_up_limit\": 10240,\n \"alternative_webui_enabled\": false,\n \"alternative_webui_path\": \"/home/user/Documents/qbit-webui\",\n \"announce_ip\": \"\",\n \"announce_to_all_tiers\": true,\n \"announce_to_all_trackers\": false,\n \"anonymous_mode\": false,\n \"async_io_threads\": 4,\n \"auto_delete_mode\": 0,\n \"auto_tmm_enabled\": false,\n \"autorun_enabled\": false,\n \"autorun_program\": \"\",\n \"banned_IPs\": \"\",\n \"bittorrent_protocol\": 0,\n \"bypass_auth_subnet_whitelist\": \"\",\n \"bypass_auth_subnet_whitelist_enabled\": false,\n \"bypass_local_auth\": false,\n \"category_changed_tmm_enabled\": false,\n \"checking_memory_use\": 32,\n \"create_subfolder_enabled\": true,\n \"current_interface_address\": \"\",\n \"current_network_interface\": \"\",\n \"dht\": true,\n \"disk_cache\": -1,\n \"disk_cache_ttl\": 60,\n \"dl_limit\": 0,\n \"dont_count_slow_torrents\": false,\n \"dyndns_domain\": \"changeme.dyndns.org\",\n \"dyndns_enabled\": false,\n \"dyndns_password\": \"\",\n \"dyndns_service\": 0,\n \"dyndns_username\": \"\",\n \"embedded_tracker_port\": 9000,\n \"enable_coalesce_read_write\": false,\n \"enable_embedded_tracker\": false,\n \"enable_multi_connections_from_same_ip\": false,\n \"enable_os_cache\": true,\n \"enable_piece_extent_affinity\": false,\n \"enable_upload_suggestions\": false,\n \"encryption\": 0,\n \"export_dir\": \"/home/user/Downloads/all\",\n \"export_dir_fin\": \"/home/user/Downloads/completed\",\n \"file_pool_size\": 40,\n \"incomplete_files_ext\": false,\n \"ip_filter_enabled\": false,\n \"ip_filter_path\": \"\",\n \"ip_filter_trackers\": false,\n \"limit_lan_peers\": true,\n \"limit_tcp_overhead\": false,\n \"limit_utp_rate\": true,\n \"listen_port\": 58925,\n \"locale\": \"en\",\n \"lsd\": true,\n \"mail_notification_auth_enabled\": false,\n \"mail_notification_email\": \"\",\n \"mail_notification_enabled\": false,\n \"mail_notification_password\": \"\",\n \"mail_notification_sender\": \"qBittorrent_notification@example.com\",\n \"mail_notification_smtp\": \"smtp.changeme.com\",\n \"mail_notification_ssl_enabled\": false,\n \"mail_notification_username\": \"\",\n \"max_active_downloads\": 3,\n \"max_active_torrents\": 5,\n \"max_active_uploads\": 3,\n \"max_connec\": 500,\n \"max_connec_per_torrent\": 100,\n \"max_ratio\": -1,\n \"max_ratio_act\": 0,\n \"max_ratio_enabled\": false,\n \"max_seeding_time\": -1,\n \"max_seeding_time_enabled\": false,\n \"max_uploads\": -1,\n \"max_uploads_per_torrent\": -1,\n \"outgoing_ports_max\": 0,\n \"outgoing_ports_min\": 0,\n \"pex\": true,\n \"preallocate_all\": false,\n \"proxy_auth_enabled\": false,\n \"proxy_ip\": \"0.0.0.0\",\n \"proxy_password\": \"\",\n \"proxy_peer_connections\": false,\n \"proxy_port\": 8080,\n \"proxy_torrents_only\": false,\n \"proxy_type\": 0,\n \"proxy_username\": \"\",\n \"queueing_enabled\": false,\n \"random_port\": false,\n \"recheck_completed_torrents\": false,\n \"resolve_peer_countries\": true,\n \"rss_auto_downloading_enabled\":true,\n \"rss_download_repack_proper_episodes\":true,\n \"rss_max_articles_per_feed\":50,\n \"rss_processing_enabled\":true,\n \"rss_refresh_interval\":30,\n \"rss_smart_episode_filters\":\"s(\\\\d+)e(\\\\d+)\\n(\\\\d+)x(\\\\d+)\\n(\\\\d{4}[.\\\\-]\\\\d{1,2}[.\\\\-]\\\\d{1,2})\",\n \"save_path\": \"/home/user/Downloads/\",\n \"save_path_changed_tmm_enabled\": false,\n \"save_resume_data_interval\": 60,\n \"scan_dirs\":\n {\n \"/home/user/Downloads/incoming/games\": 0,\n \"/home/user/Downloads/incoming/movies\": 1,\n },\n \"schedule_from_hour\": 8,\n \"schedule_from_min\": 0,\n \"schedule_to_hour\": 20,\n \"schedule_to_min\": 0,\n \"scheduler_days\": 0,\n \"scheduler_enabled\": false,\n \"send_buffer_low_watermark\": 10,\n \"send_buffer_watermark\": 500,\n \"send_buffer_watermark_factor\": 50,\n \"slow_torrent_dl_rate_threshold\": 2,\n \"slow_torrent_inactive_timer\": 60,\n \"slow_torrent_ul_rate_threshold\": 2,\n \"socket_backlog_size\": 30,\n \"start_paused_enabled\": false,\n \"stop_tracker_timeout\": 1,\n \"temp_path\": \"/home/user/Downloads/temp\",\n \"temp_path_enabled\": false,\n \"torrent_changed_tmm_enabled\": true,\n \"up_limit\": 0,\n \"upload_choking_algorithm\": 1,\n \"upload_slots_behavior\": 0,\n \"upnp\": true,\n \"use_https\": false,\n \"utp_tcp_mixed_mode\": 0,\n \"web_ui_address\": \"*\",\n \"web_ui_ban_duration\": 3600,\n \"web_ui_clickjacking_protection_enabled\": true,\n \"web_ui_csrf_protection_enabled\": true,\n \"web_ui_custom_http_headers\": \"\",\n \"web_ui_domain_list\": \"*\",\n \"web_ui_host_header_validation_enabled\": true,\n \"web_ui_https_cert_path\": \"\",\n \"web_ui_https_key_path\": \"\",\n \"web_ui_max_auth_fail_count\": 5,\n \"web_ui_port\": 8080,\n \"web_ui_secure_cookie_enabled\": true,\n \"web_ui_session_timeout\": 3600,\n \"web_ui_upnp\": false,\n \"web_ui_use_custom_http_headers_enabled\": false,\n \"web_ui_username\": \"admin\"\n}\n```", + ), + parameters: None, + return_type: Some( + ReturnType { + is_list: false, + parameters: [ + ReturnTypeParameter { + name: "locale", + description: "Currently selected language (e.g. en_GB for English)", + return_type: String( + TypeInfo { + name: "locale", + is_optional: false, + is_list: false, + description: Some( + "Currently selected language (e.g. en_GB for English)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "create_subfolder_enabled", + description: "True if a subfolder should be created when adding a torrent", + return_type: Bool( + TypeInfo { + name: "create_subfolder_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if a subfolder should be created when adding a torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "start_paused_enabled", + description: "True if torrents should be added in a Paused state", + return_type: Bool( + TypeInfo { + name: "start_paused_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if torrents should be added in a Paused state", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "auto_delete_mode", + description: "TODO", + return_type: Number( + TypeInfo { + name: "auto_delete_mode", + is_optional: false, + is_list: false, + description: Some( + "TODO", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "preallocate_all", + description: "True if disk space should be pre-allocated for all files", + return_type: Bool( + TypeInfo { + name: "preallocate_all", + is_optional: false, + is_list: false, + description: Some( + "True if disk space should be pre-allocated for all files", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "incomplete_files_ext", + description: "True if \".!qB\" should be appended to incomplete files", + return_type: Bool( + TypeInfo { + name: "incomplete_files_ext", + is_optional: false, + is_list: false, + description: Some( + "True if \".!qB\" should be appended to incomplete files", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "auto_tmm_enabled", + description: "True if Automatic Torrent Management is enabled by default", + return_type: Bool( + TypeInfo { + name: "auto_tmm_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if Automatic Torrent Management is enabled by default", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "torrent_changed_tmm_enabled", + description: "True if torrent should be relocated when its Category changes", + return_type: Bool( + TypeInfo { + name: "torrent_changed_tmm_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if torrent should be relocated when its Category changes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "save_path_changed_tmm_enabled", + description: "True if torrent should be relocated when the default save path changes", + return_type: Bool( + TypeInfo { + name: "save_path_changed_tmm_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if torrent should be relocated when the default save path changes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "category_changed_tmm_enabled", + description: "True if torrent should be relocated when its Category's save path changes", + return_type: Bool( + TypeInfo { + name: "category_changed_tmm_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if torrent should be relocated when its Category's save path changes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "save_path", + description: "Default save path for torrents, separated by slashes", + return_type: String( + TypeInfo { + name: "save_path", + is_optional: false, + is_list: false, + description: Some( + "Default save path for torrents, separated by slashes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "temp_path_enabled", + description: "True if folder for incomplete torrents is enabled", + return_type: Bool( + TypeInfo { + name: "temp_path_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if folder for incomplete torrents is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "temp_path", + description: "Path for incomplete torrents, separated by slashes", + return_type: String( + TypeInfo { + name: "temp_path", + is_optional: false, + is_list: false, + description: Some( + "Path for incomplete torrents, separated by slashes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "scan_dirs", + description: "Property: 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", + return_type: Object( + TypeInfo { + name: "scan_dirs", + is_optional: false, + is_list: false, + description: Some( + "Property: 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", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Download to the monitored folder", + }, + TypeDescriptions { + value: "1", + description: "Download to the default save path", + }, + TypeDescriptions { + value: "\"/path/to/download/to\"", + description: "Download to this path", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "export_dir", + description: "Path to directory to copy .torrent files to. Slashes are used as path separators", + return_type: String( + TypeInfo { + name: "export_dir", + is_optional: false, + is_list: false, + description: Some( + "Path to directory to copy .torrent files to. Slashes are used as path separators", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "export_dir_fin", + description: "Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators", + return_type: String( + TypeInfo { + name: "export_dir_fin", + is_optional: false, + is_list: false, + description: Some( + "Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_enabled", + description: "True if e-mail notification should be enabled", + return_type: Bool( + TypeInfo { + name: "mail_notification_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if e-mail notification should be enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_sender", + description: "e-mail where notifications should originate from", + return_type: String( + TypeInfo { + name: "mail_notification_sender", + is_optional: false, + is_list: false, + description: Some( + "e-mail where notifications should originate from", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_email", + description: "e-mail to send notifications to", + return_type: String( + TypeInfo { + name: "mail_notification_email", + is_optional: false, + is_list: false, + description: Some( + "e-mail to send notifications to", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_smtp", + description: "smtp server for e-mail notifications", + return_type: String( + TypeInfo { + name: "mail_notification_smtp", + is_optional: false, + is_list: false, + description: Some( + "smtp server for e-mail notifications", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_ssl_enabled", + description: "True if smtp server requires SSL connection", + return_type: Bool( + TypeInfo { + name: "mail_notification_ssl_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if smtp server requires SSL connection", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_auth_enabled", + description: "True if smtp server requires authentication", + return_type: Bool( + TypeInfo { + name: "mail_notification_auth_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if smtp server requires authentication", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_username", + description: "Username for smtp authentication", + return_type: String( + TypeInfo { + name: "mail_notification_username", + is_optional: false, + is_list: false, + description: Some( + "Username for smtp authentication", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "mail_notification_password", + description: "Password for smtp authentication", + return_type: String( + TypeInfo { + name: "mail_notification_password", + is_optional: false, + is_list: false, + description: Some( + "Password for smtp authentication", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "autorun_enabled", + description: "True if external program should be run after torrent has finished downloading", + return_type: Bool( + TypeInfo { + name: "autorun_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if external program should be run after torrent has finished downloading", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "autorun_program", + description: "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", + return_type: String( + TypeInfo { + name: "autorun_program", + is_optional: false, + is_list: false, + description: Some( + "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", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "queueing_enabled", + description: "True if torrent queuing is enabled", + return_type: Bool( + TypeInfo { + name: "queueing_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if torrent queuing is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_active_downloads", + description: "Maximum number of active simultaneous downloads", + return_type: Number( + TypeInfo { + name: "max_active_downloads", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of active simultaneous downloads", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_active_torrents", + description: "Maximum number of active simultaneous downloads and uploads", + return_type: Number( + TypeInfo { + name: "max_active_torrents", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of active simultaneous downloads and uploads", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_active_uploads", + description: "Maximum number of active simultaneous uploads", + return_type: Number( + TypeInfo { + name: "max_active_uploads", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of active simultaneous uploads", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dont_count_slow_torrents", + description: "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", + return_type: Bool( + TypeInfo { + name: "dont_count_slow_torrents", + is_optional: false, + is_list: false, + description: Some( + "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", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "slow_torrent_dl_rate_threshold", + description: "Download rate in KiB/s for a torrent to be considered \"slow\"", + return_type: Number( + TypeInfo { + name: "slow_torrent_dl_rate_threshold", + is_optional: false, + is_list: false, + description: Some( + "Download rate in KiB/s for a torrent to be considered \"slow\"", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "slow_torrent_ul_rate_threshold", + description: "Upload rate in KiB/s for a torrent to be considered \"slow\"", + return_type: Number( + TypeInfo { + name: "slow_torrent_ul_rate_threshold", + is_optional: false, + is_list: false, + description: Some( + "Upload rate in KiB/s for a torrent to be considered \"slow\"", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "slow_torrent_inactive_timer", + description: "Seconds a torrent should be inactive before considered \"slow\"", + return_type: Number( + TypeInfo { + name: "slow_torrent_inactive_timer", + is_optional: false, + is_list: false, + description: Some( + "Seconds a torrent should be inactive before considered \"slow\"", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_ratio_enabled", + description: "True if share ratio limit is enabled", + return_type: Bool( + TypeInfo { + name: "max_ratio_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if share ratio limit is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_ratio", + description: "Get the global share ratio limit", + return_type: Float( + TypeInfo { + name: "max_ratio", + is_optional: false, + is_list: false, + description: Some( + "Get the global share ratio limit", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_ratio_act", + description: "Action performed when a torrent reaches the maximum share ratio. See list of possible values here below.", + return_type: Number( + TypeInfo { + name: "max_ratio_act", + is_optional: false, + is_list: false, + description: Some( + "Action performed when a torrent reaches the maximum share ratio. See list of possible values here below.", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Pause torrent", + }, + TypeDescriptions { + value: "1", + description: "Remove torrent", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "listen_port", + description: "Port for incoming connections", + return_type: Number( + TypeInfo { + name: "listen_port", + is_optional: false, + is_list: false, + description: Some( + "Port for incoming connections", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "upnp", + description: "True if UPnP/NAT-PMP is enabled", + return_type: Bool( + TypeInfo { + name: "upnp", + is_optional: false, + is_list: false, + description: Some( + "True if UPnP/NAT-PMP is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "random_port", + description: "True if the port is randomly selected", + return_type: Bool( + TypeInfo { + name: "random_port", + is_optional: false, + is_list: false, + description: Some( + "True if the port is randomly selected", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dl_limit", + description: "Global download speed limit in KiB/s; -1 means no limit is applied", + return_type: Number( + TypeInfo { + name: "dl_limit", + is_optional: false, + is_list: false, + description: Some( + "Global download speed limit in KiB/s; -1 means no limit is applied", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "up_limit", + description: "Global upload speed limit in KiB/s; -1 means no limit is applied", + return_type: Number( + TypeInfo { + name: "up_limit", + is_optional: false, + is_list: false, + description: Some( + "Global upload speed limit in KiB/s; -1 means no limit is applied", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_connec", + description: "Maximum global number of simultaneous connections", + return_type: Number( + TypeInfo { + name: "max_connec", + is_optional: false, + is_list: false, + description: Some( + "Maximum global number of simultaneous connections", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_connec_per_torrent", + description: "Maximum number of simultaneous connections per torrent", + return_type: Number( + TypeInfo { + name: "max_connec_per_torrent", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of simultaneous connections per torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_uploads", + description: "Maximum number of upload slots", + return_type: Number( + TypeInfo { + name: "max_uploads", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of upload slots", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_uploads_per_torrent", + description: "Maximum number of upload slots per torrent", + return_type: Number( + TypeInfo { + name: "max_uploads_per_torrent", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of upload slots per torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "stop_tracker_timeout", + description: "Timeout in seconds for a stopped announce request to trackers", + return_type: Number( + TypeInfo { + name: "stop_tracker_timeout", + is_optional: false, + is_list: false, + description: Some( + "Timeout in seconds for a stopped announce request to trackers", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_piece_extent_affinity", + description: "True if the advanced libtorrent option piece_extent_affinity is enabled", + return_type: Bool( + TypeInfo { + name: "enable_piece_extent_affinity", + is_optional: false, + is_list: false, + description: Some( + "True if the advanced libtorrent option piece_extent_affinity is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "bittorrent_protocol", + description: "Bittorrent Protocol to use (see list of possible values below)", + return_type: Number( + TypeInfo { + name: "bittorrent_protocol", + is_optional: false, + is_list: false, + description: Some( + "Bittorrent Protocol to use (see list of possible values below)", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "TCP and μTP", + }, + TypeDescriptions { + value: "1", + description: "TCP", + }, + TypeDescriptions { + value: "2", + description: "μTP", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "limit_utp_rate", + description: "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", + return_type: Bool( + TypeInfo { + name: "limit_utp_rate", + is_optional: false, + is_list: false, + description: Some( + "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", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "limit_tcp_overhead", + description: "True if [du]l_limit should be applied to estimated TCP overhead (service data: e.g. packet headers)", + return_type: Bool( + TypeInfo { + name: "limit_tcp_overhead", + is_optional: false, + is_list: false, + description: Some( + "True if [du]l_limit should be applied to estimated TCP overhead (service data: e.g. packet headers)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "limit_lan_peers", + description: "True if [du]l_limit should be applied to peers on the LAN", + return_type: Bool( + TypeInfo { + name: "limit_lan_peers", + is_optional: false, + is_list: false, + description: Some( + "True if [du]l_limit should be applied to peers on the LAN", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "alt_dl_limit", + description: "Alternative global download speed limit in KiB/s", + return_type: Number( + TypeInfo { + name: "alt_dl_limit", + is_optional: false, + is_list: false, + description: Some( + "Alternative global download speed limit in KiB/s", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "alt_up_limit", + description: "Alternative global upload speed limit in KiB/s", + return_type: Number( + TypeInfo { + name: "alt_up_limit", + is_optional: false, + is_list: false, + description: Some( + "Alternative global upload speed limit in KiB/s", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "scheduler_enabled", + description: "True if alternative limits should be applied according to schedule", + return_type: Bool( + TypeInfo { + name: "scheduler_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if alternative limits should be applied according to schedule", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "schedule_from_hour", + description: "Scheduler starting hour", + return_type: Number( + TypeInfo { + name: "schedule_from_hour", + is_optional: false, + is_list: false, + description: Some( + "Scheduler starting hour", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "schedule_from_min", + description: "Scheduler starting minute", + return_type: Number( + TypeInfo { + name: "schedule_from_min", + is_optional: false, + is_list: false, + description: Some( + "Scheduler starting minute", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "schedule_to_hour", + description: "Scheduler ending hour", + return_type: Number( + TypeInfo { + name: "schedule_to_hour", + is_optional: false, + is_list: false, + description: Some( + "Scheduler ending hour", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "schedule_to_min", + description: "Scheduler ending minute", + return_type: Number( + TypeInfo { + name: "schedule_to_min", + is_optional: false, + is_list: false, + description: Some( + "Scheduler ending minute", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "scheduler_days", + description: "Scheduler days. See possible values here below", + return_type: Number( + TypeInfo { + name: "scheduler_days", + is_optional: false, + is_list: false, + description: Some( + "Scheduler days. See possible values here below", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Every day", + }, + TypeDescriptions { + value: "1", + description: "Every weekday", + }, + TypeDescriptions { + value: "2", + description: "Every weekend", + }, + TypeDescriptions { + value: "3", + description: "Every Monday", + }, + TypeDescriptions { + value: "4", + description: "Every Tuesday", + }, + TypeDescriptions { + value: "5", + description: "Every Wednesday", + }, + TypeDescriptions { + value: "6", + description: "Every Thursday", + }, + TypeDescriptions { + value: "7", + description: "Every Friday", + }, + TypeDescriptions { + value: "8", + description: "Every Saturday", + }, + TypeDescriptions { + value: "9", + description: "Every Sunday", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "dht", + description: "True if DHT is enabled", + return_type: Bool( + TypeInfo { + name: "dht", + is_optional: false, + is_list: false, + description: Some( + "True if DHT is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "pex", + description: "True if PeX is enabled", + return_type: Bool( + TypeInfo { + name: "pex", + is_optional: false, + is_list: false, + description: Some( + "True if PeX is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "lsd", + description: "True if LSD is enabled", + return_type: Bool( + TypeInfo { + name: "lsd", + is_optional: false, + is_list: false, + description: Some( + "True if LSD is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "encryption", + description: "See list of possible values here below", + return_type: Number( + TypeInfo { + name: "encryption", + is_optional: false, + is_list: false, + description: Some( + "See list of possible values here below", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Prefer encryption", + }, + TypeDescriptions { + value: "1", + description: "Force encryption on", + }, + TypeDescriptions { + value: "2", + description: "Force encryption off", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "anonymous_mode", + description: "If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher", + return_type: Bool( + TypeInfo { + name: "anonymous_mode", + is_optional: false, + is_list: false, + description: Some( + "If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_type", + description: "See list of possible values here below", + return_type: Number( + TypeInfo { + name: "proxy_type", + is_optional: false, + is_list: false, + description: Some( + "See list of possible values here below", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "-1", + description: "Proxy is disabled", + }, + TypeDescriptions { + value: "1", + description: "HTTP proxy without authentication", + }, + TypeDescriptions { + value: "2", + description: "SOCKS5 proxy without authentication", + }, + TypeDescriptions { + value: "3", + description: "HTTP proxy with authentication", + }, + TypeDescriptions { + value: "4", + description: "SOCKS5 proxy with authentication", + }, + TypeDescriptions { + value: "5", + description: "SOCKS4 proxy without authentication", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "proxy_ip", + description: "Proxy IP address or domain name", + return_type: String( + TypeInfo { + name: "proxy_ip", + is_optional: false, + is_list: false, + description: Some( + "Proxy IP address or domain name", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_port", + description: "Proxy port", + return_type: Number( + TypeInfo { + name: "proxy_port", + is_optional: false, + is_list: false, + description: Some( + "Proxy port", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_peer_connections", + description: "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", + return_type: Bool( + TypeInfo { + name: "proxy_peer_connections", + is_optional: false, + is_list: false, + description: Some( + "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", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_auth_enabled", + description: "True proxy requires authentication; doesn't apply to SOCKS4 proxies", + return_type: Bool( + TypeInfo { + name: "proxy_auth_enabled", + is_optional: false, + is_list: false, + description: Some( + "True proxy requires authentication; doesn't apply to SOCKS4 proxies", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_username", + description: "Username for proxy authentication", + return_type: String( + TypeInfo { + name: "proxy_username", + is_optional: false, + is_list: false, + description: Some( + "Username for proxy authentication", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_password", + description: "Password for proxy authentication", + return_type: String( + TypeInfo { + name: "proxy_password", + is_optional: false, + is_list: false, + description: Some( + "Password for proxy authentication", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "proxy_torrents_only", + description: "True if proxy is only used for torrents", + return_type: Bool( + TypeInfo { + name: "proxy_torrents_only", + is_optional: false, + is_list: false, + description: Some( + "True if proxy is only used for torrents", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ip_filter_enabled", + description: "True if external IP filter should be enabled", + return_type: Bool( + TypeInfo { + name: "ip_filter_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if external IP filter should be enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ip_filter_path", + description: "Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes", + return_type: String( + TypeInfo { + name: "ip_filter_path", + is_optional: false, + is_list: false, + description: Some( + "Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ip_filter_trackers", + description: "True if IP filters are applied to trackers", + return_type: Bool( + TypeInfo { + name: "ip_filter_trackers", + is_optional: false, + is_list: false, + description: Some( + "True if IP filters are applied to trackers", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_domain_list", + description: "Comma-separated list of domains to accept when performing Host header validation", + return_type: String( + TypeInfo { + name: "web_ui_domain_list", + is_optional: false, + is_list: false, + description: Some( + "Comma-separated list of domains to accept when performing Host header validation", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_address", + description: "IP address to use for the WebUI", + return_type: String( + TypeInfo { + name: "web_ui_address", + is_optional: false, + is_list: false, + description: Some( + "IP address to use for the WebUI", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_port", + description: "WebUI port", + return_type: Number( + TypeInfo { + name: "web_ui_port", + is_optional: false, + is_list: false, + description: Some( + "WebUI port", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_upnp", + description: "True if UPnP is used for the WebUI port", + return_type: Bool( + TypeInfo { + name: "web_ui_upnp", + is_optional: false, + is_list: false, + description: Some( + "True if UPnP is used for the WebUI port", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_username", + description: "WebUI username", + return_type: String( + TypeInfo { + name: "web_ui_username", + is_optional: false, + is_list: false, + description: Some( + "WebUI username", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_password", + description: "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", + return_type: String( + TypeInfo { + name: "web_ui_password", + is_optional: false, + is_list: false, + description: Some( + "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", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_csrf_protection_enabled", + description: "True if WebUI CSRF protection is enabled", + return_type: Bool( + TypeInfo { + name: "web_ui_csrf_protection_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if WebUI CSRF protection is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_clickjacking_protection_enabled", + description: "True if WebUI clickjacking protection is enabled", + return_type: Bool( + TypeInfo { + name: "web_ui_clickjacking_protection_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if WebUI clickjacking protection is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_secure_cookie_enabled", + description: "True if WebUI cookie Secure flag is enabled", + return_type: Bool( + TypeInfo { + name: "web_ui_secure_cookie_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if WebUI cookie Secure flag is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_max_auth_fail_count", + description: "Maximum number of authentication failures before WebUI access ban", + return_type: Number( + TypeInfo { + name: "web_ui_max_auth_fail_count", + is_optional: false, + is_list: false, + description: Some( + "Maximum number of authentication failures before WebUI access ban", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_ban_duration", + description: "WebUI access ban duration in seconds", + return_type: Number( + TypeInfo { + name: "web_ui_ban_duration", + is_optional: false, + is_list: false, + description: Some( + "WebUI access ban duration in seconds", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_session_timeout", + description: "Seconds until WebUI is automatically signed off", + return_type: Number( + TypeInfo { + name: "web_ui_session_timeout", + is_optional: false, + is_list: false, + description: Some( + "Seconds until WebUI is automatically signed off", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_host_header_validation_enabled", + description: "True if WebUI host header validation is enabled", + return_type: Bool( + TypeInfo { + name: "web_ui_host_header_validation_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if WebUI host header validation is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "bypass_local_auth", + description: "True if authentication challenge for loopback address (127.0.0.1) should be disabled", + return_type: Bool( + TypeInfo { + name: "bypass_local_auth", + is_optional: false, + is_list: false, + description: Some( + "True if authentication challenge for loopback address (127.0.0.1) should be disabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "bypass_auth_subnet_whitelist_enabled", + description: "True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist", + return_type: Bool( + TypeInfo { + name: "bypass_auth_subnet_whitelist_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "bypass_auth_subnet_whitelist", + description: "(White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas", + return_type: String( + TypeInfo { + name: "bypass_auth_subnet_whitelist", + is_optional: false, + is_list: false, + description: Some( + "(White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "alternative_webui_enabled", + description: "True if an alternative WebUI should be used", + return_type: Bool( + TypeInfo { + name: "alternative_webui_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if an alternative WebUI should be used", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "alternative_webui_path", + description: "File path to the alternative WebUI", + return_type: String( + TypeInfo { + name: "alternative_webui_path", + is_optional: false, + is_list: false, + description: Some( + "File path to the alternative WebUI", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "use_https", + description: "True if WebUI HTTPS access is enabled", + return_type: Bool( + TypeInfo { + name: "use_https", + is_optional: false, + is_list: false, + description: Some( + "True if WebUI HTTPS access is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ssl_key", + description: "For API < v2.0.1: SSL keyfile contents (this is a not a path)", + return_type: String( + TypeInfo { + name: "ssl_key", + is_optional: false, + is_list: false, + description: Some( + "For API < v2.0.1: SSL keyfile contents (this is a not a path)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ssl_cert", + description: "For API < v2.0.1: SSL certificate contents (this is a not a path)", + return_type: String( + TypeInfo { + name: "ssl_cert", + is_optional: false, + is_list: false, + description: Some( + "For API < v2.0.1: SSL certificate contents (this is a not a path)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_https_key_path", + description: "For API ≥ v2.0.1: Path to SSL keyfile", + return_type: String( + TypeInfo { + name: "web_ui_https_key_path", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.0.1: Path to SSL keyfile", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_https_cert_path", + description: "For API ≥ v2.0.1: Path to SSL certificate", + return_type: String( + TypeInfo { + name: "web_ui_https_cert_path", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.0.1: Path to SSL certificate", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dyndns_enabled", + description: "True if server DNS should be updated dynamically", + return_type: Bool( + TypeInfo { + name: "dyndns_enabled", + is_optional: false, + is_list: false, + description: Some( + "True if server DNS should be updated dynamically", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dyndns_service", + description: "See list of possible values here below", + return_type: Number( + TypeInfo { + name: "dyndns_service", + is_optional: false, + is_list: false, + description: Some( + "See list of possible values here below", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Use DyDNS", + }, + TypeDescriptions { + value: "1", + description: "Use NOIP", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "dyndns_username", + description: "Username for DDNS service", + return_type: String( + TypeInfo { + name: "dyndns_username", + is_optional: false, + is_list: false, + description: Some( + "Username for DDNS service", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dyndns_password", + description: "Password for DDNS service", + return_type: String( + TypeInfo { + name: "dyndns_password", + is_optional: false, + is_list: false, + description: Some( + "Password for DDNS service", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dyndns_domain", + description: "Your DDNS domain name", + return_type: String( + TypeInfo { + name: "dyndns_domain", + is_optional: false, + is_list: false, + description: Some( + "Your DDNS domain name", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_refresh_interval", + description: "RSS refresh interval", + return_type: Number( + TypeInfo { + name: "rss_refresh_interval", + is_optional: false, + is_list: false, + description: Some( + "RSS refresh interval", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_max_articles_per_feed", + description: "Max stored articles per RSS feed", + return_type: Number( + TypeInfo { + name: "rss_max_articles_per_feed", + is_optional: false, + is_list: false, + description: Some( + "Max stored articles per RSS feed", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_processing_enabled", + description: "Enable processing of RSS feeds", + return_type: Bool( + TypeInfo { + name: "rss_processing_enabled", + is_optional: false, + is_list: false, + description: Some( + "Enable processing of RSS feeds", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_auto_downloading_enabled", + description: "Enable auto-downloading of torrents from the RSS feeds", + return_type: Bool( + TypeInfo { + name: "rss_auto_downloading_enabled", + is_optional: false, + is_list: false, + description: Some( + "Enable auto-downloading of torrents from the RSS feeds", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_download_repack_proper_episodes", + description: "For API ≥ v2.5.1: Enable downloading of repack/proper Episodes", + return_type: Bool( + TypeInfo { + name: "rss_download_repack_proper_episodes", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.5.1: Enable downloading of repack/proper Episodes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "rss_smart_episode_filters", + description: "For API ≥ v2.5.1: List of RSS Smart Episode Filters", + return_type: String( + TypeInfo { + name: "rss_smart_episode_filters", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.5.1: List of RSS Smart Episode Filters", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "add_trackers_enabled", + description: "Enable automatic adding of trackers to new torrents", + return_type: Bool( + TypeInfo { + name: "add_trackers_enabled", + is_optional: false, + is_list: false, + description: Some( + "Enable automatic adding of trackers to new torrents", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "add_trackers", + description: "List of trackers to add to new torrent", + return_type: String( + TypeInfo { + name: "add_trackers", + is_optional: false, + is_list: false, + description: Some( + "List of trackers to add to new torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_use_custom_http_headers_enabled", + description: "For API ≥ v2.5.1: Enable custom http headers", + return_type: Bool( + TypeInfo { + name: "web_ui_use_custom_http_headers_enabled", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.5.1: Enable custom http headers", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "web_ui_custom_http_headers", + description: "For API ≥ v2.5.1: List of custom http headers", + return_type: String( + TypeInfo { + name: "web_ui_custom_http_headers", + is_optional: false, + is_list: false, + description: Some( + "For API ≥ v2.5.1: List of custom http headers", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_seeding_time_enabled", + description: "True enables max seeding time", + return_type: Bool( + TypeInfo { + name: "max_seeding_time_enabled", + is_optional: false, + is_list: false, + description: Some( + "True enables max seeding time", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_seeding_time", + description: "Number of minutes to seed a torrent", + return_type: Number( + TypeInfo { + name: "max_seeding_time", + is_optional: false, + is_list: false, + description: Some( + "Number of minutes to seed a torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "announce_ip", + description: "TODO", + return_type: String( + TypeInfo { + name: "announce_ip", + is_optional: false, + is_list: false, + description: Some( + "TODO", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "announce_to_all_tiers", + description: "True always announce to all tiers", + return_type: Bool( + TypeInfo { + name: "announce_to_all_tiers", + is_optional: false, + is_list: false, + description: Some( + "True always announce to all tiers", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "announce_to_all_trackers", + description: "True always announce to all trackers in a tier", + return_type: Bool( + TypeInfo { + name: "announce_to_all_trackers", + is_optional: false, + is_list: false, + description: Some( + "True always announce to all trackers in a tier", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "async_io_threads", + description: "Number of asynchronous I/O threads", + return_type: Number( + TypeInfo { + name: "async_io_threads", + is_optional: false, + is_list: false, + description: Some( + "Number of asynchronous I/O threads", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "banned_IPs", + description: "List of banned IPs", + return_type: String( + TypeInfo { + name: "banned_IPs", + is_optional: false, + is_list: false, + description: Some( + "List of banned IPs", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "checking_memory_use", + description: "Outstanding memory when checking torrents in MiB", + return_type: Number( + TypeInfo { + name: "checking_memory_use", + is_optional: false, + is_list: false, + description: Some( + "Outstanding memory when checking torrents in MiB", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "current_interface_address", + description: "IP Address to bind to. Empty String means All addresses", + return_type: String( + TypeInfo { + name: "current_interface_address", + is_optional: false, + is_list: false, + description: Some( + "IP Address to bind to. Empty String means All addresses", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "current_network_interface", + description: "Network Interface used", + return_type: String( + TypeInfo { + name: "current_network_interface", + is_optional: false, + is_list: false, + description: Some( + "Network Interface used", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "disk_cache", + description: "Disk cache used in MiB", + return_type: Number( + TypeInfo { + name: "disk_cache", + is_optional: false, + is_list: false, + description: Some( + "Disk cache used in MiB", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "disk_cache_ttl", + description: "Disk cache expiry interval in seconds", + return_type: Number( + TypeInfo { + name: "disk_cache_ttl", + is_optional: false, + is_list: false, + description: Some( + "Disk cache expiry interval in seconds", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "embedded_tracker_port", + description: "Port used for embedded tracker", + return_type: Number( + TypeInfo { + name: "embedded_tracker_port", + is_optional: false, + is_list: false, + description: Some( + "Port used for embedded tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_coalesce_read_write", + description: "True enables coalesce reads & writes", + return_type: Bool( + TypeInfo { + name: "enable_coalesce_read_write", + is_optional: false, + is_list: false, + description: Some( + "True enables coalesce reads & writes", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_embedded_tracker", + description: "True enables embedded tracker", + return_type: Bool( + TypeInfo { + name: "enable_embedded_tracker", + is_optional: false, + is_list: false, + description: Some( + "True enables embedded tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_multi_connections_from_same_ip", + description: "True allows multiple connections from the same IP address", + return_type: Bool( + TypeInfo { + name: "enable_multi_connections_from_same_ip", + is_optional: false, + is_list: false, + description: Some( + "True allows multiple connections from the same IP address", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_os_cache", + description: "True enables os cache", + return_type: Bool( + TypeInfo { + name: "enable_os_cache", + is_optional: false, + is_list: false, + description: Some( + "True enables os cache", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "enable_upload_suggestions", + description: "True enables sending of upload piece suggestions", + return_type: Bool( + TypeInfo { + name: "enable_upload_suggestions", + is_optional: false, + is_list: false, + description: Some( + "True enables sending of upload piece suggestions", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "file_pool_size", + description: "File pool size", + return_type: Number( + TypeInfo { + name: "file_pool_size", + is_optional: false, + is_list: false, + description: Some( + "File pool size", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "outgoing_ports_max", + description: "Maximal outgoing port (0: Disabled)", + return_type: Number( + TypeInfo { + name: "outgoing_ports_max", + is_optional: false, + is_list: false, + description: Some( + "Maximal outgoing port (0: Disabled)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "outgoing_ports_min", + description: "Minimal outgoing port (0: Disabled)", + return_type: Number( + TypeInfo { + name: "outgoing_ports_min", + is_optional: false, + is_list: false, + description: Some( + "Minimal outgoing port (0: Disabled)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "recheck_completed_torrents", + description: "True rechecks torrents on completion", + return_type: Bool( + TypeInfo { + name: "recheck_completed_torrents", + is_optional: false, + is_list: false, + description: Some( + "True rechecks torrents on completion", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "resolve_peer_countries", + description: "True resolves peer countries", + return_type: Bool( + TypeInfo { + name: "resolve_peer_countries", + is_optional: false, + is_list: false, + description: Some( + "True resolves peer countries", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "save_resume_data_interval", + description: "Save resume data interval in min", + return_type: Number( + TypeInfo { + name: "save_resume_data_interval", + is_optional: false, + is_list: false, + description: Some( + "Save resume data interval in min", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "send_buffer_low_watermark", + description: "Send buffer low watermark in KiB", + return_type: Number( + TypeInfo { + name: "send_buffer_low_watermark", + is_optional: false, + is_list: false, + description: Some( + "Send buffer low watermark in KiB", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "send_buffer_watermark", + description: "Send buffer watermark in KiB", + return_type: Number( + TypeInfo { + name: "send_buffer_watermark", + is_optional: false, + is_list: false, + description: Some( + "Send buffer watermark in KiB", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "send_buffer_watermark_factor", + description: "Send buffer watermark factor in percent", + return_type: Number( + TypeInfo { + name: "send_buffer_watermark_factor", + is_optional: false, + is_list: false, + description: Some( + "Send buffer watermark factor in percent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "socket_backlog_size", + description: "Socket backlog size", + return_type: Number( + TypeInfo { + name: "socket_backlog_size", + is_optional: false, + is_list: false, + description: Some( + "Socket backlog size", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "upload_choking_algorithm", + description: "Upload choking algorithm used (see list of possible values below)", + return_type: Number( + TypeInfo { + name: "upload_choking_algorithm", + is_optional: false, + is_list: false, + description: Some( + "Upload choking algorithm used (see list of possible values below)", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Round-robin", + }, + TypeDescriptions { + value: "1", + description: "Fastest upload", + }, + TypeDescriptions { + value: "2", + description: "Anti-leech", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "upload_slots_behavior", + description: "Upload slots behavior used (see list of possible values below)", + return_type: Number( + TypeInfo { + name: "upload_slots_behavior", + is_optional: false, + is_list: false, + description: Some( + "Upload slots behavior used (see list of possible values below)", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Fixed slots", + }, + TypeDescriptions { + value: "1", + description: "Upload rate based", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "upnp_lease_duration", + description: "UPnP lease duration (0: Permanent lease)", + return_type: Number( + TypeInfo { + name: "upnp_lease_duration", + is_optional: false, + is_list: false, + description: Some( + "UPnP lease duration (0: Permanent lease)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "utp_tcp_mixed_mode", + description: "μTP-TCP mixed mode algorithm (see list of possible values below)", + return_type: Number( + TypeInfo { + name: "utp_tcp_mixed_mode", + is_optional: false, + is_list: false, + description: Some( + "μTP-TCP mixed mode algorithm (see list of possible values below)", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Prefer TCP", + }, + TypeDescriptions { + value: "1", + description: "Peer proportional", + }, + ], + }, + ), + }, + ), + }, + ], + }, + ), + url: "preferences", + }, + ApiMethod { + name: "setPreferences", + description: Some( + "1. There is no need to pass all possible preferences' `token:value` pairs if you only want to change one option\n 1. Paths in `scan_dirs` must exist, otherwise this option will have no effect\n 1. String values must be quoted; integer and boolean values must never be quoted\n\nFor a list of possible preference options see [Get application preferences](#get-application-preferences)", + ), + parameters: None, + return_type: None, + url: "setPreferences", + }, + ApiMethod { + name: "defaultSavePath", + description: None, + parameters: None, + return_type: None, + url: "defaultSavePath", + }, + ], + description: Some( + "All Application API methods are under \"app\", e.g.: `/api/v2/app/methodName`.", + ), + url: "app", + }, + ApiGroup { + name: "log", + methods: [ + ApiMethod { + name: "main", + description: Some( + "Each element of the array has the following properties:\n\nExample:\n\n```JSON\n[\n {\n \"id\":0,\n \"message\":\"qBittorrent v3.4.0 started\",\n \"timestamp\":1507969127860,\n \"type\":1\n },\n {\n \"id\":1,\n \"message\":\"qBittorrent is trying to listen on any interface port: 19036\",\n \"timestamp\":1507969127869,\n \"type\":2\n },\n {\n \"id\":2,\n \"message\":\"Peer ID: -qB3400-\",\n \"timestamp\":1507969127870,\n \"type\":1\n },\n {\n \"id\":3,\n \"message\":\"HTTP User-Agent is 'qBittorrent/3.4.0'\",\n \"timestamp\":1507969127870,\n \"type\":1\n },\n {\n \"id\":4,\n \"message\":\"DHT support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":5,\n \"message\":\"Local Peer Discovery support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":6,\n \"message\":\"PeX support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":7,\n \"message\":\"Anonymous mode [OFF]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":8,\n \"message\":\"Encryption support [ON]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":9,\n \"message\":\"Embedded Tracker [OFF]\",\n \"timestamp\":1507969127871,\n \"type\":2\n },\n {\n \"id\":10,\n \"message\":\"UPnP / NAT-PMP support [ON]\",\n \"timestamp\":1507969127873,\n \"type\":2\n },\n {\n \"id\":11,\n \"message\":\"Web UI: Now listening on port 8080\",\n \"timestamp\":1507969127883,\n \"type\":1\n },\n {\n \"id\":12,\n \"message\":\"Options were saved successfully.\",\n \"timestamp\":1507969128055,\n \"type\":1\n },\n {\n \"id\":13,\n \"message\":\"qBittorrent is successfully listening on interface :: port: TCP/19036\",\n \"timestamp\":1507969128270,\n \"type\":2\n },\n {\n \"id\":14,\n \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: TCP/19036\",\n \"timestamp\":1507969128271,\n \"type\":2\n },\n {\n \"id\":15,\n \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: UDP/19036\",\n \"timestamp\":1507969128272,\n \"type\":2\n }\n]\n```", + ), + parameters: Some( + [ + Bool( + TypeInfo { + name: "normal", + is_optional: true, + is_list: false, + description: Some( + "Include normal messages (default: true)", + ), + type_description: None, + }, + ), + Bool( + TypeInfo { + name: "info", + is_optional: true, + is_list: false, + description: Some( + "Include info messages (default: true)", + ), + type_description: None, + }, + ), + Bool( + TypeInfo { + name: "warning", + is_optional: true, + is_list: false, + description: Some( + "Include warning messages (default: true)", + ), + type_description: None, + }, + ), + Bool( + TypeInfo { + name: "critical", + is_optional: true, + is_list: false, + description: Some( + "Include critical messages (default: true)", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "last_known_id", + is_optional: true, + is_list: false, + description: Some( + "Exclude messages with \"message id\" <= last_known_id (default: -1)", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: true, + parameters: [ + ReturnTypeParameter { + name: "id", + description: "ID of the message", + return_type: Number( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "ID of the message", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "message", + description: "Text of the message", + return_type: String( + TypeInfo { + name: "message", + is_optional: false, + is_list: false, + description: Some( + "Text of the message", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "timestamp", + description: "Milliseconds since epoch", + return_type: Number( + TypeInfo { + name: "timestamp", + is_optional: false, + is_list: false, + description: Some( + "Milliseconds since epoch", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "type", + description: "Type of the message: Log::NORMAL: 1, Log::INFO: 2, Log::WARNING: 4, Log::CRITICAL: 8", + return_type: Number( + TypeInfo { + name: "type", + is_optional: false, + is_list: false, + description: Some( + "Type of the message: Log::NORMAL: 1, Log::INFO: 2, Log::WARNING: 4, Log::CRITICAL: 8", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "main", + }, + ApiMethod { + name: "peers", + description: None, + parameters: Some( + [ + Number( + TypeInfo { + name: "last_known_id", + is_optional: true, + is_list: false, + description: Some( + "Exclude messages with \"message id\" <= last_known_id (default: -1)", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "peers", + }, + ], + description: Some( + "All Log API methods are under \"log\", e.g.: `/api/v2/log/methodName`.", + ), + url: "log", + }, + ApiGroup { + name: "sync", + methods: [ + ApiMethod { + name: "maindata", + description: Some( + "Example:\n\n```JSON\n{\n \"rid\":15,\n \"torrents\":\n {\n \"8c212779b4abde7c6bc608063a0d008b7e40ce32\":\n {\n \"state\":\"pausedUP\"\n }\n }\n}\n```", + ), + parameters: Some( + [ + Number( + TypeInfo { + name: "rid", + is_optional: false, + is_list: false, + description: Some( + "Response ID. If not provided, rid=0 will be assumed. If the given rid is different from the one of last server reply, full_update will be true (see the server reply details for more info)", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: false, + parameters: [ + ReturnTypeParameter { + name: "rid", + description: "Response ID", + return_type: Number( + TypeInfo { + name: "rid", + is_optional: false, + is_list: false, + description: Some( + "Response ID", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "full_update", + description: "Whether the response contains all the data or partial data", + return_type: Bool( + TypeInfo { + name: "full_update", + is_optional: false, + is_list: false, + description: Some( + "Whether the response contains all the data or partial data", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "torrents", + description: "Property: torrent hash, value: same as [torrent list](#get-torrent-list)", + return_type: Object( + TypeInfo { + name: "torrents", + is_optional: false, + is_list: false, + description: Some( + "Property: torrent hash, value: same as [torrent list](#get-torrent-list)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "torrents_removed", + description: "List of hashes of torrents removed since last request", + return_type: StringArray( + TypeInfo { + name: "torrents_removed", + is_optional: false, + is_list: false, + description: Some( + "List of hashes of torrents removed since last request", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "categories", + description: "Info for categories added since last request", + return_type: Object( + TypeInfo { + name: "categories", + is_optional: false, + is_list: false, + description: Some( + "Info for categories added since last request", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "categories_removed", + description: "List of categories removed since last request", + return_type: StringArray( + TypeInfo { + name: "categories_removed", + is_optional: false, + is_list: false, + description: Some( + "List of categories removed since last request", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "tags", + description: "List of tags added since last request", + return_type: StringArray( + TypeInfo { + name: "tags", + is_optional: false, + is_list: false, + description: Some( + "List of tags added since last request", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "tags_removed", + description: "List of tags removed since last request", + return_type: StringArray( + TypeInfo { + name: "tags_removed", + is_optional: false, + is_list: false, + description: Some( + "List of tags removed since last request", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "server_state", + description: "Global transfer info", + return_type: Object( + TypeInfo { + name: "server_state", + is_optional: false, + is_list: false, + description: Some( + "Global transfer info", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "maindata", + }, + ApiMethod { + name: "torrentPeers", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "Torrent hash", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "rid", + is_optional: false, + is_list: false, + description: Some( + "Response ID. If not provided, rid=0 will be assumed. If the given rid is different from the one of last server reply, full_update will be true (see the server reply details for more info)", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "torrentPeers", + }, + ], + description: Some( + "Sync API implements requests for obtaining changes since the last request.\nAll Sync API methods are under \"sync\", e.g.: `/api/v2/sync/methodName`.", + ), + url: "sync", + }, + ApiGroup { + name: "transfer_info", + methods: [ + ApiMethod { + name: "info", + description: Some( + "In addition to the above in partial data requests (see [Get partial data](#get-partial-data) for more info):\n\nPossible values of `connection_status`:\n\nExample:\n\n```JSON\n{\n \"connection_status\":\"connected\",\n \"dht_nodes\":386,\n \"dl_info_data\":681521119,\n \"dl_info_speed\":0,\n \"dl_rate_limit\":0,\n \"up_info_data\":10747904,\n \"up_info_speed\":0,\n \"up_rate_limit\":1048576\n}\n```", + ), + parameters: None, + return_type: Some( + ReturnType { + is_list: false, + parameters: [ + ReturnTypeParameter { + name: "dl_info_speed", + description: "Global download rate (bytes/s)", + return_type: Number( + TypeInfo { + name: "dl_info_speed", + is_optional: false, + is_list: false, + description: Some( + "Global download rate (bytes/s)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dl_info_data", + description: "Data downloaded this session (bytes)", + return_type: Number( + TypeInfo { + name: "dl_info_data", + is_optional: false, + is_list: false, + description: Some( + "Data downloaded this session (bytes)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "up_info_speed", + description: "Global upload rate (bytes/s)", + return_type: Number( + TypeInfo { + name: "up_info_speed", + is_optional: false, + is_list: false, + description: Some( + "Global upload rate (bytes/s)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "up_info_data", + description: "Data uploaded this session (bytes)", + return_type: Number( + TypeInfo { + name: "up_info_data", + is_optional: false, + is_list: false, + description: Some( + "Data uploaded this session (bytes)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dl_rate_limit", + description: "Download rate limit (bytes/s)", + return_type: Number( + TypeInfo { + name: "dl_rate_limit", + is_optional: false, + is_list: false, + description: Some( + "Download rate limit (bytes/s)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "up_rate_limit", + description: "Upload rate limit (bytes/s)", + return_type: Number( + TypeInfo { + name: "up_rate_limit", + is_optional: false, + is_list: false, + description: Some( + "Upload rate limit (bytes/s)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dht_nodes", + description: "DHT nodes connected to", + return_type: Number( + TypeInfo { + name: "dht_nodes", + is_optional: false, + is_list: false, + description: Some( + "DHT nodes connected to", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "connection_status", + description: "Connection status. See possible values here below", + return_type: String( + TypeInfo { + name: "connection_status", + is_optional: false, + is_list: false, + description: Some( + "Connection status. See possible values here below", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "connected", + description: "", + }, + TypeDescriptions { + value: "firewalled", + description: "", + }, + TypeDescriptions { + value: "disconnected", + description: "", + }, + ], + }, + ), + }, + ), + }, + ], + }, + ), + url: "info", + }, + ApiMethod { + name: "speedLimitsMode", + description: None, + parameters: None, + return_type: None, + url: "speedLimitsMode", + }, + ApiMethod { + name: "toggleSpeedLimitsMode", + description: None, + parameters: None, + return_type: None, + url: "toggleSpeedLimitsMode", + }, + ApiMethod { + name: "downloadLimit", + description: None, + parameters: None, + return_type: None, + url: "downloadLimit", + }, + ApiMethod { + name: "setDownloadLimit", + description: None, + parameters: Some( + [ + Number( + TypeInfo { + name: "limit", + is_optional: false, + is_list: false, + description: Some( + "The global download speed limit to set in bytes/second", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "setDownloadLimit", + }, + ApiMethod { + name: "uploadLimit", + description: None, + parameters: None, + return_type: None, + url: "uploadLimit", + }, + ApiMethod { + name: "setUploadLimit", + description: None, + parameters: Some( + [ + Number( + TypeInfo { + name: "limit", + is_optional: false, + is_list: false, + description: Some( + "The global upload speed limit to set in bytes/second", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "setUploadLimit", + }, + ApiMethod { + name: "banPeers", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "peers", + is_optional: false, + is_list: false, + description: Some( + "The peer to ban, or multiple peers separated by a pipe \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "banPeers", + }, + ], + description: Some( + "All Transfer info API methods are under \"transfer\", e.g.: `/api/v2/transfer/methodName`.", + ), + url: "transfer", + }, + ApiGroup { + name: "torrent_management", + methods: [ + ApiMethod { + name: "info", + description: Some( + "Possible values of `state`:\n\nExample:\n\n```JSON\n[\n {\n \"dlspeed\":9681262,\n \"eta\":87,\n \"f_l_piece_prio\":false,\n \"force_start\":false,\n \"hash\":\"8c212779b4abde7c6bc608063a0d008b7e40ce32\",\n \"category\":\"\",\n \"tags\": \"\",\n \"name\":\"debian-8.1.0-amd64-CD-1.iso\",\n \"num_complete\":-1,\n \"num_incomplete\":-1,\n \"num_leechs\":2,\n \"num_seeds\":54,\n \"priority\":1,\n \"progress\":0.16108787059783936,\n \"ratio\":0,\n \"seq_dl\":false,\n \"size\":657457152,\n \"state\":\"downloading\",\n \"super_seeding\":false,\n \"upspeed\":0\n },\n {\n another_torrent_info\n }\n]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "filter", + is_optional: true, + is_list: false, + description: Some( + "Filter torrent list by state. Allowed state filters: all, downloading, seeding, completed, paused, active, inactive, resumed, stalled, stalled_uploading, stalled_downloading, errored", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "category", + is_optional: true, + is_list: false, + description: Some( + "Get torrents with the given category (empty string means \"without category\"; no \"category\" parameter means \"any category\" <- broken until [#11748](https://github.com/qbittorrent/qBittorrent/issues/11748) is resolved). Remember to URL-encode the category name. For example, My category becomes My%20category", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "tag", + is_optional: true, + is_list: false, + description: Some( + "Get torrents with the given tag (empty string means \"without tag\"; no \"tag\" parameter means \"any tag\". Remember to URL-encode the category name. For example, My tag becomes My%20tag", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "sort", + is_optional: true, + is_list: false, + description: Some( + "Sort torrents by given key. They can be sorted using any field of the response's JSON array (which are documented below) as the sort key.", + ), + type_description: None, + }, + ), + Bool( + TypeInfo { + name: "reverse", + is_optional: true, + is_list: false, + description: Some( + "Enable reverse sorting. Defaults to false", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "limit", + is_optional: true, + is_list: false, + description: Some( + "Limit the number of torrents returned", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "offset", + is_optional: true, + is_list: false, + description: Some( + "Set offset (if less than 0, offset from end)", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "hashes", + is_optional: true, + is_list: false, + description: Some( + "Filter by hashes. Can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: true, + parameters: [ + ReturnTypeParameter { + name: "added_on", + description: "Time (Unix Epoch) when the torrent was added to the client", + return_type: Number( + TypeInfo { + name: "added_on", + is_optional: false, + is_list: false, + description: Some( + "Time (Unix Epoch) when the torrent was added to the client", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "amount_left", + description: "Amount of data left to download (bytes)", + return_type: Number( + TypeInfo { + name: "amount_left", + is_optional: false, + is_list: false, + description: Some( + "Amount of data left to download (bytes)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "auto_tmm", + description: "Whether this torrent is managed by Automatic Torrent Management", + return_type: Bool( + TypeInfo { + name: "auto_tmm", + is_optional: false, + is_list: false, + description: Some( + "Whether this torrent is managed by Automatic Torrent Management", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "availability", + description: "Percentage of file pieces currently available", + return_type: Float( + TypeInfo { + name: "availability", + is_optional: false, + is_list: false, + description: Some( + "Percentage of file pieces currently available", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "category", + description: "Category of the torrent", + return_type: String( + TypeInfo { + name: "category", + is_optional: false, + is_list: false, + description: Some( + "Category of the torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "completed", + description: "Amount of transfer data completed (bytes)", + return_type: Number( + TypeInfo { + name: "completed", + is_optional: false, + is_list: false, + description: Some( + "Amount of transfer data completed (bytes)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "completion_on", + description: "Time (Unix Epoch) when the torrent completed", + return_type: Number( + TypeInfo { + name: "completion_on", + is_optional: false, + is_list: false, + description: Some( + "Time (Unix Epoch) when the torrent completed", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "content_path", + description: "Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)", + return_type: String( + TypeInfo { + name: "content_path", + is_optional: false, + is_list: false, + description: Some( + "Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dl_limit", + description: "Torrent download speed limit (bytes/s). -1 if ulimited.", + return_type: Number( + TypeInfo { + name: "dl_limit", + is_optional: false, + is_list: false, + description: Some( + "Torrent download speed limit (bytes/s). -1 if ulimited.", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "dlspeed", + description: "Torrent download speed (bytes/s)", + return_type: Number( + TypeInfo { + name: "dlspeed", + is_optional: false, + is_list: false, + description: Some( + "Torrent download speed (bytes/s)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "downloaded", + description: "Amount of data downloaded", + return_type: Number( + TypeInfo { + name: "downloaded", + is_optional: false, + is_list: false, + description: Some( + "Amount of data downloaded", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "downloaded_session", + description: "Amount of data downloaded this session", + return_type: Number( + TypeInfo { + name: "downloaded_session", + is_optional: false, + is_list: false, + description: Some( + "Amount of data downloaded this session", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "eta", + description: "Torrent ETA (seconds)", + return_type: Number( + TypeInfo { + name: "eta", + is_optional: false, + is_list: false, + description: Some( + "Torrent ETA (seconds)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "f_l_piece_prio", + description: "True if first last piece are prioritized", + return_type: Bool( + TypeInfo { + name: "f_l_piece_prio", + is_optional: false, + is_list: false, + description: Some( + "True if first last piece are prioritized", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "force_start", + description: "True if force start is enabled for this torrent", + return_type: Bool( + TypeInfo { + name: "force_start", + is_optional: false, + is_list: false, + description: Some( + "True if force start is enabled for this torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "hash", + description: "Torrent hash", + return_type: String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "Torrent hash", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "last_activity", + description: "Last time (Unix Epoch) when a chunk was downloaded/uploaded", + return_type: Number( + TypeInfo { + name: "last_activity", + is_optional: false, + is_list: false, + description: Some( + "Last time (Unix Epoch) when a chunk was downloaded/uploaded", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "magnet_uri", + description: "Magnet URI corresponding to this torrent", + return_type: String( + TypeInfo { + name: "magnet_uri", + is_optional: false, + is_list: false, + description: Some( + "Magnet URI corresponding to this torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_ratio", + description: "Maximum share ratio until torrent is stopped from seeding/uploading", + return_type: Float( + TypeInfo { + name: "max_ratio", + is_optional: false, + is_list: false, + description: Some( + "Maximum share ratio until torrent is stopped from seeding/uploading", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "max_seeding_time", + description: "Maximum seeding time (seconds) until torrent is stopped from seeding", + return_type: Number( + TypeInfo { + name: "max_seeding_time", + is_optional: false, + is_list: false, + description: Some( + "Maximum seeding time (seconds) until torrent is stopped from seeding", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "name", + description: "Torrent name", + return_type: String( + TypeInfo { + name: "name", + is_optional: false, + is_list: false, + description: Some( + "Torrent name", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_complete", + description: "Number of seeds in the swarm", + return_type: Number( + TypeInfo { + name: "num_complete", + is_optional: false, + is_list: false, + description: Some( + "Number of seeds in the swarm", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_incomplete", + description: "Number of leechers in the swarm", + return_type: Number( + TypeInfo { + name: "num_incomplete", + is_optional: false, + is_list: false, + description: Some( + "Number of leechers in the swarm", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_leechs", + description: "Number of leechers connected to", + return_type: Number( + TypeInfo { + name: "num_leechs", + is_optional: false, + is_list: false, + description: Some( + "Number of leechers connected to", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_seeds", + description: "Number of seeds connected to", + return_type: Number( + TypeInfo { + name: "num_seeds", + is_optional: false, + is_list: false, + description: Some( + "Number of seeds connected to", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "priority", + description: "Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode", + return_type: Number( + TypeInfo { + name: "priority", + is_optional: false, + is_list: false, + description: Some( + "Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "progress", + description: "Torrent progress (percentage/100)", + return_type: Float( + TypeInfo { + name: "progress", + is_optional: false, + is_list: false, + description: Some( + "Torrent progress (percentage/100)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ratio", + description: "Torrent share ratio. Max ratio value: 9999.", + return_type: Float( + TypeInfo { + name: "ratio", + is_optional: false, + is_list: false, + description: Some( + "Torrent share ratio. Max ratio value: 9999.", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "ratio_limit", + description: "TODO (what is different from max_ratio?)", + return_type: Float( + TypeInfo { + name: "ratio_limit", + is_optional: false, + is_list: false, + description: Some( + "TODO (what is different from max_ratio?)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "save_path", + description: "Path where this torrent's data is stored", + return_type: String( + TypeInfo { + name: "save_path", + is_optional: false, + is_list: false, + description: Some( + "Path where this torrent's data is stored", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "seeding_time", + description: "Torrent elapsed time while complete (seconds)", + return_type: Number( + TypeInfo { + name: "seeding_time", + is_optional: false, + is_list: false, + description: Some( + "Torrent elapsed time while complete (seconds)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "seeding_time_limit", + description: "TODO (what is different from max_seeding_time?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.", + return_type: Number( + TypeInfo { + name: "seeding_time_limit", + is_optional: false, + is_list: false, + description: Some( + "TODO (what is different from max_seeding_time?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "seen_complete", + description: "Time (Unix Epoch) when this torrent was last seen complete", + return_type: Number( + TypeInfo { + name: "seen_complete", + is_optional: false, + is_list: false, + description: Some( + "Time (Unix Epoch) when this torrent was last seen complete", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "seq_dl", + description: "True if sequential download is enabled", + return_type: Bool( + TypeInfo { + name: "seq_dl", + is_optional: false, + is_list: false, + description: Some( + "True if sequential download is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "size", + description: "Total size (bytes) of files selected for download", + return_type: Number( + TypeInfo { + name: "size", + is_optional: false, + is_list: false, + description: Some( + "Total size (bytes) of files selected for download", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "state", + description: "Torrent state. See table here below for the possible values", + return_type: String( + TypeInfo { + name: "state", + is_optional: false, + is_list: false, + description: Some( + "Torrent state. See table here below for the possible values", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "error", + description: "Some error occurred, applies to paused torrents", + }, + TypeDescriptions { + value: "missingFiles", + description: "Torrent data files is missing", + }, + TypeDescriptions { + value: "uploading", + description: "Torrent is being seeded and data is being transferred", + }, + TypeDescriptions { + value: "pausedUP", + description: "Torrent is paused and has finished downloading", + }, + TypeDescriptions { + value: "queuedUP", + description: "Queuing is enabled and torrent is queued for upload", + }, + TypeDescriptions { + value: "stalledUP", + description: "Torrent is being seeded, but no connection were made", + }, + TypeDescriptions { + value: "checkingUP", + description: "Torrent has finished downloading and is being checked", + }, + TypeDescriptions { + value: "forcedUP", + description: "Torrent is forced to uploading and ignore queue limit", + }, + TypeDescriptions { + value: "allocating", + description: "Torrent is allocating disk space for download", + }, + TypeDescriptions { + value: "downloading", + description: "Torrent is being downloaded and data is being transferred", + }, + TypeDescriptions { + value: "metaDL", + description: "Torrent has just started downloading and is fetching metadata", + }, + TypeDescriptions { + value: "pausedDL", + description: "Torrent is paused and has NOT finished downloading", + }, + TypeDescriptions { + value: "queuedDL", + description: "Queuing is enabled and torrent is queued for download", + }, + TypeDescriptions { + value: "stalledDL", + description: "Torrent is being downloaded, but no connection were made", + }, + TypeDescriptions { + value: "checkingDL", + description: "Same as checkingUP, but torrent has NOT finished downloading", + }, + TypeDescriptions { + value: "forcedDL", + description: "Torrent is forced to downloading to ignore queue limit", + }, + TypeDescriptions { + value: "checkingResumeData", + description: "Checking resume data on qBt startup", + }, + TypeDescriptions { + value: "moving", + description: "Torrent is moving to another location", + }, + TypeDescriptions { + value: "unknown", + description: "Unknown status", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "super_seeding", + description: "True if super seeding is enabled", + return_type: Bool( + TypeInfo { + name: "super_seeding", + is_optional: false, + is_list: false, + description: Some( + "True if super seeding is enabled", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "tags", + description: "Comma-concatenated tag list of the torrent", + return_type: String( + TypeInfo { + name: "tags", + is_optional: false, + is_list: false, + description: Some( + "Comma-concatenated tag list of the torrent", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "time_active", + description: "Total active time (seconds)", + return_type: Number( + TypeInfo { + name: "time_active", + is_optional: false, + is_list: false, + description: Some( + "Total active time (seconds)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "total_size", + description: "Total size (bytes) of all file in this torrent (including unselected ones)", + return_type: Number( + TypeInfo { + name: "total_size", + is_optional: false, + is_list: false, + description: Some( + "Total size (bytes) of all file in this torrent (including unselected ones)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "tracker", + description: "The first tracker with working status. Returns empty string if no tracker is working.", + return_type: String( + TypeInfo { + name: "tracker", + is_optional: false, + is_list: false, + description: Some( + "The first tracker with working status. Returns empty string if no tracker is working.", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "up_limit", + description: "Torrent upload speed limit (bytes/s). -1 if ulimited.", + return_type: Number( + TypeInfo { + name: "up_limit", + is_optional: false, + is_list: false, + description: Some( + "Torrent upload speed limit (bytes/s). -1 if ulimited.", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "uploaded", + description: "Amount of data uploaded", + return_type: Number( + TypeInfo { + name: "uploaded", + is_optional: false, + is_list: false, + description: Some( + "Amount of data uploaded", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "uploaded_session", + description: "Amount of data uploaded this session", + return_type: Number( + TypeInfo { + name: "uploaded_session", + is_optional: false, + is_list: false, + description: Some( + "Amount of data uploaded this session", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "upspeed", + description: "Torrent upload speed (bytes/s)", + return_type: Number( + TypeInfo { + name: "upspeed", + is_optional: false, + is_list: false, + description: Some( + "Torrent upload speed (bytes/s)", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "info", + }, + ApiMethod { + name: "properties", + description: Some( + "- empty, if the torrent hash is invalid\n- otherwise, a JSON object with the following fields\n\nNB: `-1` is returned if the type of the property is integer but its value is not known.\n\nExample:\n\n```JSON\n{\n \"addition_date\":1438429165,\n \"comment\":\"\\\"Debian CD from cdimage.debian.org\\\"\",\n \"completion_date\":1438429234,\n \"created_by\":\"\",\n \"creation_date\":1433605214,\n \"dl_limit\":-1,\n \"dl_speed\":0,\n \"dl_speed_avg\":9736015,\n \"eta\":8640000,\n \"last_seen\":1438430354,\n \"nb_connections\":3,\n \"nb_connections_limit\":250,\n \"peers\":1,\n \"peers_total\":89,\n \"piece_size\":524288,\n \"pieces_have\":1254,\n \"pieces_num\":1254,\n \"reannounce\":672,\n \"save_path\":\"/Downloads/debian-8.1.0-amd64-CD-1.iso\",\n \"seeding_time\":1128,\n \"seeds\":1,\n \"seeds_total\":254,\n \"share_ratio\":0.00072121022562178299,\n \"time_elapsed\":1197,\n \"total_downloaded\":681521119,\n \"total_downloaded_session\":681521119,\n \"total_size\":657457152,\n \"total_uploaded\":491520,\n \"total_uploaded_session\":491520,\n \"total_wasted\":23481724,\n \"up_limit\":-1,\n \"up_speed\":0,\n \"up_speed_avg\":410\n}\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the generic properties of", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "properties", + }, + ApiMethod { + name: "trackers", + description: Some( + "Possible values of `status`:\n\nExample:\n\n```JSON\n[\n {\n \"msg\":\"\",\n \"num_peers\":100,\n \"status\":2,\n \"url\":\"http://bttracker.debian.org:6969/announce\"\n },\n {\n another_tracker_info\n }\n]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the trackers of", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: true, + parameters: [ + ReturnTypeParameter { + name: "url", + description: "Tracker url", + return_type: String( + TypeInfo { + name: "url", + is_optional: false, + is_list: false, + description: Some( + "Tracker url", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "status", + description: "Tracker status. See the table below for possible values", + return_type: Number( + TypeInfo { + name: "status", + is_optional: false, + is_list: false, + description: Some( + "Tracker status. See the table below for possible values", + ), + type_description: Some( + TypeDescription { + values: [ + TypeDescriptions { + value: "0", + description: "Tracker is disabled (used for DHT, PeX, and LSD)", + }, + TypeDescriptions { + value: "1", + description: "Tracker has not been contacted yet", + }, + TypeDescriptions { + value: "2", + description: "Tracker has been contacted and is working", + }, + TypeDescriptions { + value: "3", + description: "Tracker is updating", + }, + TypeDescriptions { + value: "4", + description: "Tracker has been contacted, but it is not working (or doesn't send proper replies)", + }, + ], + }, + ), + }, + ), + }, + ReturnTypeParameter { + name: "tier", + description: "Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when >= 0, < 0 is used as placeholder when tier does not exist for special entries (such as DHT).", + return_type: Number( + TypeInfo { + name: "tier", + is_optional: false, + is_list: false, + description: Some( + "Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when >= 0, < 0 is used as placeholder when tier does not exist for special entries (such as DHT).", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_peers", + description: "Number of peers for current torrent, as reported by the tracker", + return_type: Number( + TypeInfo { + name: "num_peers", + is_optional: false, + is_list: false, + description: Some( + "Number of peers for current torrent, as reported by the tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_seeds", + description: "Number of seeds for current torrent, asreported by the tracker", + return_type: Number( + TypeInfo { + name: "num_seeds", + is_optional: false, + is_list: false, + description: Some( + "Number of seeds for current torrent, asreported by the tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_leeches", + description: "Number of leeches for current torrent, as reported by the tracker", + return_type: Number( + TypeInfo { + name: "num_leeches", + is_optional: false, + is_list: false, + description: Some( + "Number of leeches for current torrent, as reported by the tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "num_downloaded", + description: "Number of completed downlods for current torrent, as reported by the tracker", + return_type: Number( + TypeInfo { + name: "num_downloaded", + is_optional: false, + is_list: false, + description: Some( + "Number of completed downlods for current torrent, as reported by the tracker", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "msg", + description: "Tracker message (there is no way of knowing what this message is - it's up to tracker admins)", + return_type: String( + TypeInfo { + name: "msg", + is_optional: false, + is_list: false, + description: Some( + "Tracker message (there is no way of knowing what this message is - it's up to tracker admins)", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "trackers", + }, + ApiMethod { + name: "webseeds", + description: Some( + "Example:\n\n```JSON\n[\n {\n \"url\":\"http://some_url/\"\n },\n {\n \"url\":\"http://some_other_url/\"\n }\n]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the webseeds of", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: true, + parameters: [ + ReturnTypeParameter { + name: "url", + description: "URL of the web seed", + return_type: String( + TypeInfo { + name: "url", + is_optional: false, + is_list: false, + description: Some( + "URL of the web seed", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "webseeds", + }, + ApiMethod { + name: "files", + description: Some( + "- empty, if the torrent hash is invalid\n- otherwise, a JSON array, where each element contains info about one file, with the following fields\n\nPossible values of `priority`:\n\nExample:\n\n```JSON\n\n[\n {\n \"index\":0,\n \"is_seed\":false,\n \"name\":\"debian-8.1.0-amd64-CD-1.iso\",\n \"piece_range\":[0,1253],\n \"priority\":1,\n \"progress\":0,\n \"size\":657457152,\n \"availability\":0.5,\n }\n]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the contents of", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "indexes", + is_optional: true, + is_list: false, + description: Some( + "The indexes of the files you want to retrieve. indexes can contain multiple values separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "files", + }, + ApiMethod { + name: "pieceStates", + description: Some( + "- empty, if the torrent hash is invalid\n- otherwise, an array of states (integers) of all pieces (in order) of a specific torrent.\n\nValue meanings are defined as below:\n\nExample:\n\n```JSON\n[0,0,2,1,0,0,2,1]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the pieces' states of", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "pieceStates", + }, + ApiMethod { + name: "pieceHashes", + description: Some( + "- empty, if the torrent hash is invalid\n- otherwise, an array of hashes (strings) of all pieces (in order) of a specific torrent.\n\nExample:\n\n```JSON\n[\"54eddd830a5b58480a6143d616a97e3a6c23c439\",\"f8a99d225aa4241db100f88407fc3bdaead583ab\",\"928fb615b9bd4dd8f9e9022552c8f8f37ef76f58\"]\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent you want to get the pieces' hashes of", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "pieceHashes", + }, + ApiMethod { + name: "pause", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to pause. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "pause", + }, + ApiMethod { + name: "resume", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to resume. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "resume", + }, + ApiMethod { + name: "delete", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to delete. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "delete", + }, + ApiMethod { + name: "recheck", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to recheck. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "recheck", + }, + ApiMethod { + name: "reannounce", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to reannounce. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "reannounce", + }, + ApiMethod { + name: "add", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "urls", + is_optional: false, + is_list: false, + description: Some( + "URLs separated with newlines", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "savepath", + is_optional: true, + is_list: false, + description: Some( + "Download folder", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "cookie", + is_optional: true, + is_list: false, + description: Some( + "Cookie sent to download the .torrent file", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "category", + is_optional: true, + is_list: false, + description: Some( + "Category for the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "tags", + is_optional: true, + is_list: false, + description: Some( + "Tags for the torrent, split by ','", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "skip_checking", + is_optional: true, + is_list: false, + description: Some( + "Skip hash checking. Possible values are true, false (default)", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "paused", + is_optional: true, + is_list: false, + description: Some( + "Add torrents in the paused state. Possible values are true, false (default)", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "root_folder", + is_optional: true, + is_list: false, + description: Some( + "Create the root folder. Possible values are true, false, unset (default)", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "rename", + is_optional: true, + is_list: false, + description: Some( + "Rename torrent", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "upLimit", + is_optional: true, + is_list: false, + description: Some( + "Set torrent upload speed limit. Unit in bytes/second", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "dlLimit", + is_optional: true, + is_list: false, + description: Some( + "Set torrent download speed limit. Unit in bytes/second", + ), + type_description: None, + }, + ), + Float( + TypeInfo { + name: "ratioLimit", + is_optional: true, + is_list: false, + description: Some( + "Set torrent share ratio limit", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "seedingTimeLimit", + is_optional: true, + is_list: false, + description: Some( + "Set torrent seeding time limit. Unit in seconds", + ), + type_description: None, + }, + ), + Bool( + TypeInfo { + name: "autoTMM", + is_optional: true, + is_list: false, + description: Some( + "Whether Automatic Torrent Management should be used", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "sequentialDownload", + is_optional: true, + is_list: false, + description: Some( + "Enable sequential download. Possible values are true, false (default)", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "firstLastPiecePrio", + is_optional: true, + is_list: false, + description: Some( + "Prioritize download first last piece. Possible values are true, false (default)", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "add", + }, + ApiMethod { + name: "addTrackers", + description: None, + parameters: None, + return_type: None, + url: "addTrackers", + }, + ApiMethod { + name: "editTracker", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "origUrl", + is_optional: false, + is_list: false, + description: Some( + "The tracker URL you want to edit", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "newUrl", + is_optional: false, + is_list: false, + description: Some( + "The new URL to replace the origUrl", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "editTracker", + }, + ApiMethod { + name: "removeTrackers", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "urls", + is_optional: false, + is_list: false, + description: Some( + "URLs to remove, separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "removeTrackers", + }, + ApiMethod { + name: "addPeers", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent, or multiple hashes separated by a pipe \\", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "peers", + is_optional: false, + is_list: false, + description: Some( + "The peer to add, or multiple peers separated by a pipe \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "addPeers", + }, + ApiMethod { + name: "increasePrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to increase the priority of. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "increasePrio", + }, + ApiMethod { + name: "decreasePrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to decrease the priority of. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "decreasePrio", + }, + ApiMethod { + name: "topPrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to set to the maximum priority. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "topPrio", + }, + ApiMethod { + name: "bottomPrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to set to the minimum priority. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "bottomPrio", + }, + ApiMethod { + name: "filePrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "File ids, separated by \\", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "priority", + is_optional: false, + is_list: false, + description: Some( + "File priority to set (consult [torrent contents API](#get-torrent-contents) for possible values)", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "filePrio", + }, + ApiMethod { + name: "downloadLimit", + description: None, + parameters: None, + return_type: None, + url: "downloadLimit", + }, + ApiMethod { + name: "setShareLimits", + description: None, + parameters: None, + return_type: None, + url: "setShareLimits", + }, + ApiMethod { + name: "uploadLimit", + description: None, + parameters: None, + return_type: None, + url: "uploadLimit", + }, + ApiMethod { + name: "setUploadLimit", + description: None, + parameters: None, + return_type: None, + url: "setUploadLimit", + }, + ApiMethod { + name: "setLocation", + description: None, + parameters: None, + return_type: None, + url: "setLocation", + }, + ApiMethod { + name: "rename", + description: None, + parameters: None, + return_type: None, + url: "rename", + }, + ApiMethod { + name: "setCategory", + description: None, + parameters: None, + return_type: None, + url: "setCategory", + }, + ApiMethod { + name: "categories", + description: None, + parameters: None, + return_type: None, + url: "categories", + }, + ApiMethod { + name: "createCategory", + description: None, + parameters: None, + return_type: None, + url: "createCategory", + }, + ApiMethod { + name: "editCategory", + description: None, + parameters: None, + return_type: None, + url: "editCategory", + }, + ApiMethod { + name: "removeCategories", + description: None, + parameters: None, + return_type: None, + url: "removeCategories", + }, + ApiMethod { + name: "addTags", + description: None, + parameters: None, + return_type: None, + url: "addTags", + }, + ApiMethod { + name: "removeTags", + description: None, + parameters: None, + return_type: None, + url: "removeTags", + }, + ApiMethod { + name: "tags", + description: None, + parameters: None, + return_type: None, + url: "tags", + }, + ApiMethod { + name: "createTags", + description: None, + parameters: None, + return_type: None, + url: "createTags", + }, + ApiMethod { + name: "deleteTags", + description: None, + parameters: None, + return_type: None, + url: "deleteTags", + }, + ApiMethod { + name: "setAutoManagement", + description: None, + parameters: None, + return_type: None, + url: "setAutoManagement", + }, + ApiMethod { + name: "toggleSequentialDownload", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to toggle sequential download for. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "toggleSequentialDownload", + }, + ApiMethod { + name: "toggleFirstLastPiecePrio", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hashes", + is_optional: false, + is_list: false, + description: Some( + "The hashes of the torrents you want to toggle the first/last piece priority for. hashes can contain multiple hashes separated by \\", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "toggleFirstLastPiecePrio", + }, + ApiMethod { + name: "setForceStart", + description: None, + parameters: None, + return_type: None, + url: "setForceStart", + }, + ApiMethod { + name: "setSuperSeeding", + description: None, + parameters: None, + return_type: None, + url: "setSuperSeeding", + }, + ApiMethod { + name: "renameFile", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "oldPath", + is_optional: false, + is_list: false, + description: Some( + "The old path of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "newPath", + is_optional: false, + is_list: false, + description: Some( + "The new path to use for the file", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "renameFile", + }, + ApiMethod { + name: "renameFolder", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "hash", + is_optional: false, + is_list: false, + description: Some( + "The hash of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "oldPath", + is_optional: false, + is_list: false, + description: Some( + "The old path of the torrent", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "newPath", + is_optional: false, + is_list: false, + description: Some( + "The new path to use for the file", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "renameFolder", + }, + ], + description: Some( + "All Torrent management API methods are under \"torrents\", e.g.: `/api/v2/torrents/methodName`.", + ), + url: "torrents", + }, + ApiGroup { + name: "rss", + methods: [ + ApiMethod { + name: "addFolder", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "path", + is_optional: false, + is_list: false, + description: Some( + "Full path of added folder (e.g. \"The Pirate Bay\\Top100\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "addFolder", + }, + ApiMethod { + name: "addFeed", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "url", + is_optional: false, + is_list: false, + description: Some( + "URL of RSS feed (e.g. \"[http://thepiratebay.org/rss//top100/200](http://thepiratebay.org/rss//top100/200)\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "path", + is_optional: true, + is_list: false, + description: Some( + "Full path of added folder (e.g. \"The Pirate Bay\\Top100\\Video\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "addFeed", + }, + ApiMethod { + name: "removeItem", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "path", + is_optional: false, + is_list: false, + description: Some( + "Full path of removed item (e.g. \"The Pirate Bay\\Top100\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "removeItem", + }, + ApiMethod { + name: "moveItem", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "itemPath", + is_optional: false, + is_list: false, + description: Some( + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "destPath", + is_optional: false, + is_list: false, + description: Some( + "New full path of item (e.g. \"The Pirate Bay\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "moveItem", + }, + ApiMethod { + name: "items", + description: None, + parameters: Some( + [ + Bool( + TypeInfo { + name: "withData", + is_optional: true, + is_list: false, + description: Some( + "True if you need current feed articles", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "items", + }, + ApiMethod { + name: "markAsRead", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "itemPath", + is_optional: false, + is_list: false, + description: Some( + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "articleId", + is_optional: true, + is_list: false, + description: Some( + "ID of article", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "markAsRead", + }, + ApiMethod { + name: "refreshItem", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "itemPath", + is_optional: false, + is_list: false, + description: Some( + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "refreshItem", + }, + ApiMethod { + name: "setRule", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "ruleName", + is_optional: false, + is_list: false, + description: Some( + "Rule name (e.g. \"Punisher\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "ruleDef", + is_optional: false, + is_list: false, + description: Some( + "JSON encoded rule definition", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "setRule", + }, + ApiMethod { + name: "renameRule", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "ruleName", + is_optional: false, + is_list: false, + description: Some( + "Rule name (e.g. \"Punisher\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "newRuleName", + is_optional: false, + is_list: false, + description: Some( + "New rule name (e.g. \"The Punisher\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "renameRule", + }, + ApiMethod { + name: "removeRule", + description: None, + parameters: Some( + [ + String( + TypeInfo { + name: "ruleName", + is_optional: false, + is_list: false, + description: Some( + "Rule name (e.g. \"Punisher\")", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "removeRule", + }, + ApiMethod { + name: "rules", + description: None, + parameters: None, + return_type: None, + url: "rules", + }, + ApiMethod { + name: "matchingArticles", + description: None, + parameters: None, + return_type: None, + url: "matchingArticles", + }, + ], + description: Some( + "All RSS API methods are under \"rss\", e.g.: `/api/v2/rss/methodName`.", + ), + url: "rss", + }, + ApiGroup { + name: "search", + methods: [ + ApiMethod { + name: "start", + description: Some( + "Example:\n\n```JSON\n{\n \"id\": 12345\n}\n```", + ), + parameters: Some( + [ + String( + TypeInfo { + name: "pattern", + is_optional: false, + is_list: false, + description: Some( + "Pattern to search for (e.g. \"Ubuntu 18.04\")", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "plugins", + is_optional: false, + is_list: false, + description: Some( + "Plugins to use for searching (e.g. \"legittorrents\"). Supports multiple plugins separated by \\", + ), + type_description: None, + }, + ), + String( + TypeInfo { + name: "category", + is_optional: false, + is_list: false, + description: Some( + "Categories to limit your search to (e.g. \"legittorrents\"). Available categories depend on the specified plugins. Also supports all", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: false, + parameters: [ + ReturnTypeParameter { + name: "id", + description: "ID of the search job", + return_type: Number( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "ID of the search job", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "start", + }, + ApiMethod { + name: "stop", + description: None, + parameters: Some( + [ + Number( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "ID of the search job", + ), + type_description: None, + }, + ), + ], + ), + return_type: None, + url: "stop", + }, + ApiMethod { + name: "status", + description: Some( + "Example:\n\n```JSON\n[\n {\n \"id\": 12345,\n \"status\": \"Running\",\n \"total\": 170\n }\n]\n```", + ), + parameters: Some( + [ + Number( + TypeInfo { + name: "id", + is_optional: true, + is_list: false, + description: Some( + "ID of the search job. If not specified, all search jobs are returned", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: true, + parameters: [ + ReturnTypeParameter { + name: "id", + description: "ID of the search job", + return_type: Number( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "ID of the search job", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "status", + description: "Current status of the search job (either Running or Stopped)", + return_type: String( + TypeInfo { + name: "status", + is_optional: false, + is_list: false, + description: Some( + "Current status of the search job (either Running or Stopped)", + ), + type_description: None, + }, + ), + }, + ReturnTypeParameter { + name: "total", + description: "Total number of results. If the status is Running this number may contineu to increase", + return_type: Number( + TypeInfo { + name: "total", + is_optional: false, + is_list: false, + description: Some( + "Total number of results. If the status is Running this number may contineu to increase", + ), + type_description: None, + }, + ), + }, + ], + }, + ), + url: "status", + }, + ApiMethod { + name: "results", + description: None, + parameters: Some( + [ + Number( + TypeInfo { + name: "id", + is_optional: false, + is_list: false, + description: Some( + "ID of the search job", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "limit", + is_optional: true, + is_list: false, + description: Some( + "max number of results to return. 0 or negative means no limit", + ), + type_description: None, + }, + ), + Number( + TypeInfo { + name: "offset", + is_optional: true, + is_list: false, + description: Some( + "result to start at. A negative number means count backwards (e.g. -2 returns the 2 most recent results)", + ), + type_description: None, + }, + ), + ], + ), + return_type: Some( + ReturnType { + is_list: false, + parameters: [], + }, + ), + url: "results", + }, + ], + description: Some( + "All Search API methods are under \"search\", e.g.: `/api/v2/search/methodName`.", + ), + url: "search", + }, +] \ No newline at end of file diff --git a/parser/src/lib.rs b/qbittorrent-web-api-gen/src/parser/mod.rs similarity index 94% rename from parser/src/lib.rs rename to qbittorrent-web-api-gen/src/parser/mod.rs index e055ec8..9c4c0ae 100644 --- a/parser/src/lib.rs +++ b/qbittorrent-web-api-gen/src/parser/mod.rs @@ -4,9 +4,10 @@ pub mod types; mod util; use group_parser::parse_groups; -use md_parser::{self, TokenTree}; use types::Type; +use crate::md_parser::{self, TokenTree}; + #[derive(Debug)] pub struct ApiGroup { pub name: String, @@ -66,7 +67,7 @@ mod tests { use std::fs; fn parse() -> TokenTree { - let content = include_str!("api-4_1.md"); + let content = include_str!("../../api-4_1.md"); let md_tree = md_parser::TokenTreeFactory::create(content); let output = format!("{:#?}", md_tree); diff --git a/parser/src/object_types.rs b/qbittorrent-web-api-gen/src/parser/object_types.rs similarity index 92% rename from parser/src/object_types.rs rename to qbittorrent-web-api-gen/src/parser/object_types.rs index 841b539..a935c53 100644 --- a/parser/src/object_types.rs +++ b/qbittorrent-web-api-gen/src/parser/object_types.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; -use md_parser::MdContent; +use crate::{md_parser::MdContent, parser::types::TypeDescriptions}; -use crate::types::{TypeDescription, TypeDescriptions}; +use super::types::TypeDescription; pub fn get_object_types(content: &[MdContent]) -> HashMap { let mut output = HashMap::new(); diff --git a/parser/token_tree.txt b/qbittorrent-web-api-gen/src/parser/token_tree.txt similarity index 100% rename from parser/token_tree.txt rename to qbittorrent-web-api-gen/src/parser/token_tree.txt diff --git a/parser/src/types.rs b/qbittorrent-web-api-gen/src/parser/types.rs similarity index 100% rename from parser/src/types.rs rename to qbittorrent-web-api-gen/src/parser/types.rs diff --git a/parser/src/util.rs b/qbittorrent-web-api-gen/src/parser/util.rs similarity index 95% rename from parser/src/util.rs rename to qbittorrent-web-api-gen/src/parser/util.rs index c569b5b..8cd9b9d 100644 --- a/parser/src/util.rs +++ b/qbittorrent-web-api-gen/src/parser/util.rs @@ -1,4 +1,4 @@ -use md_parser::MdContent; +use crate::md_parser::MdContent; pub fn find_content_starts_with(content: &[MdContent], starts_with: &str) -> Option { content.iter().find_map(|row| match row { diff --git a/api-gen/src/skeleton.rs b/qbittorrent-web-api-gen/src/skeleton.rs similarity index 100% rename from api-gen/src/skeleton.rs rename to qbittorrent-web-api-gen/src/skeleton.rs diff --git a/api-gen/src/util.rs b/qbittorrent-web-api-gen/src/util.rs similarity index 100% rename from api-gen/src/util.rs rename to qbittorrent-web-api-gen/src/util.rs diff --git a/api-gen/tests/add_torrent.rs b/qbittorrent-web-api-gen/tests/add_torrent.rs similarity index 93% rename from api-gen/tests/add_torrent.rs rename to qbittorrent-web-api-gen/tests/add_torrent.rs index b493a0c..697fb63 100644 --- a/api-gen/tests/add_torrent.rs +++ b/qbittorrent-web-api-gen/tests/add_torrent.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/another_struct_name.rs b/qbittorrent-web-api-gen/tests/another_struct_name.rs similarity index 86% rename from api-gen/tests/another_struct_name.rs rename to qbittorrent-web-api-gen/tests/another_struct_name.rs index c7e8ccf..bca720b 100644 --- a/api-gen/tests/another_struct_name.rs +++ b/qbittorrent-web-api-gen/tests/another_struct_name.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/default_parameters.rs b/qbittorrent-web-api-gen/tests/default_parameters.rs similarity index 90% rename from api-gen/tests/default_parameters.rs rename to qbittorrent-web-api-gen/tests/default_parameters.rs index d6e7548..2617e95 100644 --- a/api-gen/tests/default_parameters.rs +++ b/qbittorrent-web-api-gen/tests/default_parameters.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/login.rs b/qbittorrent-web-api-gen/tests/login.rs similarity index 86% rename from api-gen/tests/login.rs rename to qbittorrent-web-api-gen/tests/login.rs index 0ab62fd..fb54bd4 100644 --- a/api-gen/tests/login.rs +++ b/qbittorrent-web-api-gen/tests/login.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/logout.rs b/qbittorrent-web-api-gen/tests/logout.rs similarity index 87% rename from api-gen/tests/logout.rs rename to qbittorrent-web-api-gen/tests/logout.rs index 664ceba..97bfeb9 100644 --- a/api-gen/tests/logout.rs +++ b/qbittorrent-web-api-gen/tests/logout.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/return_type.rs b/qbittorrent-web-api-gen/tests/return_type.rs similarity index 89% rename from api-gen/tests/return_type.rs rename to qbittorrent-web-api-gen/tests/return_type.rs index 8f54447..6c87cab 100644 --- a/api-gen/tests/return_type.rs +++ b/qbittorrent-web-api-gen/tests/return_type.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/api-gen/tests/return_type_enum.rs b/qbittorrent-web-api-gen/tests/return_type_enum.rs similarity index 95% rename from api-gen/tests/return_type_enum.rs rename to qbittorrent-web-api-gen/tests/return_type_enum.rs index f9c42b4..8b46529 100644 --- a/api-gen/tests/return_type_enum.rs +++ b/qbittorrent-web-api-gen/tests/return_type_enum.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; use tokio::time::{sleep, Duration}; const USERNAME: &str = "admin"; diff --git a/api-gen/tests/return_type_with_optional_params.rs b/qbittorrent-web-api-gen/tests/return_type_with_optional_params.rs similarity index 95% rename from api-gen/tests/return_type_with_optional_params.rs rename to qbittorrent-web-api-gen/tests/return_type_with_optional_params.rs index f9c42b4..8b46529 100644 --- a/api-gen/tests/return_type_with_optional_params.rs +++ b/qbittorrent-web-api-gen/tests/return_type_with_optional_params.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; use tokio::time::{sleep, Duration}; const USERNAME: &str = "admin"; diff --git a/api-gen/tests/tests.rs b/qbittorrent-web-api-gen/tests/tests.rs similarity index 100% rename from api-gen/tests/tests.rs rename to qbittorrent-web-api-gen/tests/tests.rs diff --git a/api-gen/tests/without_parameters.rs b/qbittorrent-web-api-gen/tests/without_parameters.rs similarity index 90% rename from api-gen/tests/without_parameters.rs rename to qbittorrent-web-api-gen/tests/without_parameters.rs index a97db3e..aa23d4f 100644 --- a/api-gen/tests/without_parameters.rs +++ b/qbittorrent-web-api-gen/tests/without_parameters.rs @@ -1,5 +1,5 @@ use anyhow::Result; -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; const USERNAME: &str = "admin"; const PASSWORD: &str = "adminadmin"; diff --git a/qbittorrent-web-api-gen/token_tree.txt b/qbittorrent-web-api-gen/token_tree.txt new file mode 100644 index 0000000..52bd36c --- /dev/null +++ b/qbittorrent-web-api-gen/token_tree.txt @@ -0,0 +1,13793 @@ +TokenTree { + title: None, + content: [ + Text( + "This WebUI API documentation applies to qBittorrent v4.1+. For other WebUI API versions, visit [WebUI API](https://github.com/qbittorrent/qBittorrent/wiki#WebUI-API).", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Table of Contents", + ), + content: [ + Text( + "", + ), + Text( + "1. [Changes](#changes)", + ), + Text( + " 1. [API v2.0](#api-v20)", + ), + Text( + " 1. [API v2.0.1](#api-v201)", + ), + Text( + " 1. [API v2.0.2](#api-v202)", + ), + Text( + " 1. [API v2.1.0](#api-v210)", + ), + Text( + " 1. [API v2.1.1](#api-v211)", + ), + Text( + " 1. [API v2.2.0](#api-v220)", + ), + Text( + " 1. [API v2.2.1](#api-v221)", + ), + Text( + " 1. [API v2.3.0](#api-v230)", + ), + Text( + " 1. [API v2.4.0](#api-v240)", + ), + Text( + " 1. [API v2.4.1](#api-v241)", + ), + Text( + " 1. [API v2.5.0](#api-v250)", + ), + Text( + " 1. [API v2.5.1](#api-v251)", + ), + Text( + " 1. [API v2.6.0](#api-v260)", + ), + Text( + " 1. [API v2.6.1](#api-v261)", + ), + Text( + " 1. [API v2.6.2](#api-v262)", + ), + Text( + " 1. [API v2.7.0](#api-v270)", + ), + Text( + " 1. [API v2.8.0](#api-v280)", + ), + Text( + " 1. [API v2.8.1](#api-v281)", + ), + Text( + " 1. [API v2.8.2](#api-v282)", + ), + Text( + " 1. [API v2.8.3](#api-v283)", + ), + Text( + "1. [General information](#general-information)", + ), + Text( + "1. [Authentication](#authentication)", + ), + Text( + " 1. [Login](#login)", + ), + Text( + " 1. [Logout](#logout)", + ), + Text( + "1. [Application](#application)", + ), + Text( + " 1. [Get application version](#get-application-version)", + ), + Text( + " 1. [Get API version](#get-api-version)", + ), + Text( + " 1. [Get build info](#get-build-info)", + ), + Text( + " 1. [Shutdown application](#shutdown-application)", + ), + Text( + " 1. [Get application preferences](#get-application-preferences)", + ), + Text( + " 1. [Set application preferences](#set-application-preferences)", + ), + Text( + " 1. [Get default save path](#get-default-save-path)", + ), + Text( + "1. [Log](#log)", + ), + Text( + " 1. [Get log](#get-log)", + ), + Text( + " 1. [Get peer log](#get-peer-log)", + ), + Text( + "1. [Sync](#sync)", + ), + Text( + " 1. [Get main data](#get-main-data)", + ), + Text( + " 1. [Get torrent peers data](#get-torrent-peers-data)", + ), + Text( + "1. [Transfer info](#transfer-info)", + ), + Text( + " 1. [Get global transfer info](#get-global-transfer-info)", + ), + Text( + " 1. [Get alternative speed limits state](#get-alternative-speed-limits-state)", + ), + Text( + " 1. [Toggle alternative speed limits](#toggle-alternative-speed-limits)", + ), + Text( + " 1. [Get global download limit](#get-global-download-limit)", + ), + Text( + " 1. [Set global download limit](#set-global-download-limit)", + ), + Text( + " 1. [Get global upload limit](#get-global-upload-limit)", + ), + Text( + " 1. [Set global upload limit](#set-global-upload-limit)", + ), + Text( + " 1. [Ban peers](#ban-peers)", + ), + Text( + "1. [Torrent management](#torrent-management)", + ), + Text( + " 1. [Get torrent list](#get-torrent-list)", + ), + Text( + " 1. [Get torrent generic properties](#get-torrent-generic-properties)", + ), + Text( + " 1. [Get torrent trackers](#get-torrent-trackers)", + ), + Text( + " 1. [Get torrent web seeds](#get-torrent-web-seeds)", + ), + Text( + " 1. [Get torrent contents](#get-torrent-contents)", + ), + Text( + " 1. [Get torrent pieces' states](#get-torrent-pieces-states)", + ), + Text( + " 1. [Get torrent pieces' hashes](#get-torrent-pieces-hashes)", + ), + Text( + " 1. [Pause torrents](#pause-torrents)", + ), + Text( + " 1. [Resume torrents](#resume-torrents)", + ), + Text( + " 1. [Delete torrents](#delete-torrents)", + ), + Text( + " 1. [Recheck torrents](#recheck-torrents)", + ), + Text( + " 1. [Reannounce torrents](#reannounce-torrents)", + ), + Text( + " 1. [Edit trackers](#edit-trackers)", + ), + Text( + " 1. [Remove trackers](#remove-trackers)", + ), + Text( + " 1. [Add peers](#add-peers)", + ), + Text( + " 1. [Add new torrent](#add-new-torrent)", + ), + Text( + " 1. [Add trackers to torrent](#add-trackers-to-torrent)", + ), + Text( + " 1. [Increase torrent priority](#increase-torrent-priority)", + ), + Text( + " 1. [Decrease torrent priority](#decrease-torrent-priority)", + ), + Text( + " 1. [Maximal torrent priority](#maximal-torrent-priority)", + ), + Text( + " 1. [Minimal torrent priority](#minimal-torrent-priority)", + ), + Text( + " 1. [Set file priority](#set-file-priority)", + ), + Text( + " 1. [Get torrent download limit](#get-torrent-download-limit)", + ), + Text( + " 1. [Set torrent download limit](#set-torrent-download-limit)", + ), + Text( + " 1. [Set torrent share limit](#set-torrent-share-limit)", + ), + Text( + " 1. [Get torrent upload limit](#get-torrent-upload-limit)", + ), + Text( + " 1. [Set torrent upload limit](#set-torrent-upload-limit)", + ), + Text( + " 1. [Set torrent location](#set-torrent-location)", + ), + Text( + " 1. [Set torrent name](#set-torrent-name)", + ), + Text( + " 1. [Set torrent category](#set-torrent-category)", + ), + Text( + " 1. [Get all categories](#get-all-categories)", + ), + Text( + " 1. [Add new category](#add-new-category)", + ), + Text( + " 1. [Edit category](#edit-category)", + ), + Text( + " 1. [Remove categories](#remove-categories)", + ), + Text( + " 1. [Add torrent tags](#add-torrent-tags)", + ), + Text( + " 1. [Remove torrent tags](#remove-torrent-tags)", + ), + Text( + " 1. [Get all tags](#get-all-tags)", + ), + Text( + " 1. [Create tags](#create-tags)", + ), + Text( + " 1. [Delete tags](#delete-tags)", + ), + Text( + " 1. [Set automatic torrent management](#set-automatic-torrent-management)", + ), + Text( + " 1. [Toggle sequential download](#toggle-sequential-download)", + ), + Text( + " 1. [Set first/last piece priority](#set-firstlast-piece-priority)", + ), + Text( + " 1. [Set force start](#set-force-start)", + ), + Text( + " 1. [Set super seeding](#set-super-seeding)", + ), + Text( + " 1. [Rename file](#rename-file)", + ), + Text( + " 1. [Rename folder](#rename-folder)", + ), + Text( + "1. [RSS (experimental)](#rss-experimental)", + ), + Text( + " 1. [Add folder](#add-folder)", + ), + Text( + " 1. [Add feed](#add-feed)", + ), + Text( + " 1. [Remove item](#remove-item)", + ), + Text( + " 1. [Move item](#move-item)", + ), + Text( + " 1. [Get all items](#get-all-items)", + ), + Text( + " 1. [Mark as read](#mark-as-read)", + ), + Text( + " 1. [Refresh item](#refresh-item)", + ), + Text( + " 1. [Set auto-downloading rule](#set-auto-downloading-rule)", + ), + Text( + " 1. [Rename auto-downloading rule](#rename-auto-downloading-rule)", + ), + Text( + " 1. [Remove auto-downloading rule](#remove-auto-downloading-rule)", + ), + Text( + " 1. [Get all auto-downloading rules](#get-all-auto-downloading-rules)", + ), + Text( + " 1. [Get all articles matching a rule](#get-all-articles-matching-a-rule)", + ), + Text( + "1. [Search](#search)", + ), + Text( + " 1. [Start search](#start-search)", + ), + Text( + " 1. [Stop search](#stop-search)", + ), + Text( + " 1. [Get search status](#get-search-status)", + ), + Text( + " 1. [Get search results](#get-search-results)", + ), + Text( + " 1. [Delete search](#delete-search)", + ), + Text( + " 1. [Get search plugins](#get-search-plugins)", + ), + Text( + " 1. [Install search plugin](#install-search-plugin)", + ), + Text( + " 1. [Uninstall search plugin](#uninstall-search-plugin)", + ), + Text( + " 1. [Enable search plugin](#enable-search-plugin)", + ), + Text( + " 1. [Update search plugins](#update-search-plugins)", + ), + Text( + "1. [WebAPI versioning](#webapi-versioning)", + ), + Text( + "", + ), + Asterix( + "", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Changes", + ), + content: [ + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "API v2.0", + ), + content: [ + Text( + "", + ), + Text( + "- New version naming scheme: X.Y.Z (where X - major version, Y - minor version, Z - release version)", + ), + Text( + "- New API paths. All API methods are under `api/vX/` (where X is API major version)", + ), + Text( + "- API methods are under new scopes", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.0.1", + ), + content: [ + Text( + "", + ), + Text( + "- Add `hashes` field to `/torrents/info` ([#8782](https://github.com/qbittorrent/qBittorrent/pull/8782))", + ), + Text( + "- Add `/torrents/setShareLimits/` method ([#8598](https://github.com/qbittorrent/qBittorrent/pull/8598))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.0.2", + ), + content: [ + Text( + "", + ), + Text( + "- Add `/torrents/reannounce` method ([#9229](https://github.com/qbittorrent/qBittorrent/pull/9229))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.1.0", + ), + content: [ + Text( + "", + ), + Text( + "- Change `/sync/maindata` `categories` field from `array` to `object` ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228))", + ), + Text( + "- Add `savePath` field to `/torrents/createCategory` ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228)). This method now requires the category to already exist and will not create new categories.", + ), + Text( + "- Add `/torrents/editCategory` method ([#9228](https://github.com/qbittorrent/qBittorrent/pull/9228))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.1.1", + ), + content: [ + Text( + "", + ), + Text( + "- Add `/torrents/categories` method ([#9586](https://github.com/qbittorrent/qBittorrent/pull/9586))", + ), + Text( + "- Add `/search/` methods ([#8584](https://github.com/qbittorrent/qBittorrent/pull/8584))", + ), + Text( + "- Add `free_space_on_disk` field to `/sync/maindata` ([#8217](https://github.com/qbittorrent/qBittorrent/pull/8217))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.2.0", + ), + content: [ + Text( + "", + ), + Text( + "- Add `/torrents/editTracker` and `/torrents/removeTracker` methods ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375))", + ), + Text( + "- Add `tier`, `num_seeds`, `num_leeches`, and `num_downloaded` fields to `/torrents/trackers` ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375))", + ), + Text( + "- Change `status` field from translated string to an integer for `/torrents/trackers` ([#9375](https://github.com/qbittorrent/qBittorrent/pull/9375))", + ), + Text( + "- Change `/torrents/filePrio` `id` field to accept multiple ids ([#9541](https://github.com/qbittorrent/qBittorrent/pull/9541))", + ), + Text( + "- Throw additional errors for failed requests to `/torrents/filePrio` ([#9541](https://github.com/qbittorrent/qBittorrent/pull/9541))", + ), + Text( + "- Add `autoTMM` field to `/torrents/add` ([#9752](https://github.com/qbittorrent/qBittorrent/pull/9752))", + ), + Text( + "- Add various fields to `/app/getPreferences` and `/app/setPreferences` (`create_subfolder_enabled`, `start_paused_enabled`, `auto_delete_mode`, `preallocate_all`, `incomplete_files_ext`, `auto_tmm_enabled`, `torrent_changed_tmm_enabled`, `save_path_changed_tmm_enabled`, `category_changed_tmm_enabled`, `mail_notification_sender`, `limit_lan_peers`, `slow_torrent_dl_rate_threshold`, `slow_torrent_ul_rate_threshold`, `slow_torrent_inactive_timer`, `alternative_webui_enabled`, `alternative_webui_path`) ([#9752](https://github.com/qbittorrent/qBittorrent/pull/9752))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.2.1", + ), + content: [ + Text( + "", + ), + Text( + "- Add `rss/refreshItem` ([#11067](https://github.com/qbittorrent/qBittorrent/pull/11067))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.3.0", + ), + content: [ + Text( + "", + ), + Text( + "- Remove `web_ui_password` field from `/app/preferences`, this field is still writable in `/app/setPreferences` method ([#9942](https://github.com/qbittorrent/qBittorrent/pull/9942))", + ), + Text( + "- Add `/app/buildInfo` method ([#10096](https://github.com/qbittorrent/qBittorrent/pull/10096))", + ), + Text( + "- Always use `/` as path separator in `/torrents/files` response ([#10153](https://github.com/qbittorrent/qBittorrent/pull/10153/))", + ), + Text( + "- Add `/torrents/addPeers` and `/transfer/banPeers` methods ([#10158](https://github.com/qbittorrent/qBittorrent/pull/10158))", + ), + Text( + "- Add `/torrents/addTags`, `/torrents/removeTags`, `/torrents/tags`, `/torrents/createTags`, `/torrents/deleteTags` methods ([#10527](https://github.com/qbittorrent/qBittorrent/pull/10527))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.4.0", + ), + content: [ + Text( + "", + ), + Text( + "- Add `/torrents/renameFile` method ([#11029](https://github.com/qbittorrent/qBittorrent/pull/11029))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.4.1", + ), + content: [ + Text( + "", + ), + Text( + "- Add `stalled`, `stalled_uploading` and `stalled_downloading` as possible values for the `filter` parameter in `/torrents/info` ([#11825](https://github.com/qbittorrent/qBittorrent/pull/11825))", + ), + Text( + "- Add various fields to `/app/preferences` and `/app/setPreferences` (`piece_extent_affinity`, `web_ui_secure_cookie_enabled`, `web_ui_max_auth_fail_count`, `web_ui_ban_duration`, `stop_tracker_timeout`) ([#11781](https://github.com/qbittorrent/qBittorrent/pull/11781), [#11726](https://github.com/qbittorrent/qBittorrent/pull/11726), [#12004](https://github.com/qbittorrent/qBittorrent/pull/12004), [#11834](https://github.com/qbittorrent/qBittorrent/pull/11834))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.5.0", + ), + content: [ + Text( + "- Removes `enable_super_seeding` as fields from `/app/preferences` and `/app/setPreferences` ([#12423](https://github.com/qbittorrent/qBittorrent/pull/12423))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.5.1", + ), + content: [ + Text( + "- Add `web_ui_use_custom_http_headers_enabled`, `web_ui_custom_http_headers`, `rss_download_repack_proper_episodes` and `rss_smart_episode_filters` as fields to `/app/preferences` and `/app/setPreferences` ([#12579](https://github.com/qbittorrent/qBittorrent/pull/12579), [#12549](https://github.com/qbittorrent/qBittorrent/pull/12549))", + ), + Text( + "- Add `/rss/markAsRead` and `/rss/matchingArticles` methods ([#12549](https://github.com/qbittorrent/qBittorrent/pull/12549))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.6.0", + ), + content: [ + Text( + "- Removed `/search/categories` method and modified `/search/plugins` method's response ([#12705](https://github.com/qbittorrent/qBittorrent/pull/12705))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.6.1", + ), + content: [ + Text( + "- Exposed `contentPath` via the `content_path` field in the response to `/torrents/info` ([#13625](https://github.com/qbittorrent/qBittorrent/pull/13625))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.6.2", + ), + content: [ + Text( + "- Added `tags` optional field to `/torrents/add` ([#13882](https://github.com/qbittorrent/qBittorrent/pull/13882))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.8.0", + ), + content: [ + Text( + "- Added `/torrents/renameFolder` method and modified `/torrents/renameFile` method's parameters ([#13995](https://github.com/qbittorrent/qBittorrent/pull/13995))", + ), + Text( + "", + ), + Text( + "Note that this change was released in qBittorrent v4.3.3, but the WebAPI version was incorrectly set to v2.7.0 (see [#14275](https://github.com/qbittorrent/qBittorrent/pull/14275#issuecomment-766310862) for details)", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.8.1", + ), + content: [ + Text( + "- Added `ratioLimit` and `seedingTimeLimit` optional fields to `/torrents/add` ([#14519](https://github.com/qbittorrent/qBittorrent/pull/14519))", + ), + Text( + "- Added `seeding_time` field to `/torrents/info` ([#14554](https://github.com/qbittorrent/qBittorrent/pull/14554))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.8.2", + ), + content: [ + Text( + "- Added `indexes` optional parameter to `/torrents/files` ([#14795](https://github.com/qbittorrent/qBittorrent/pull/14795))", + ), + Text( + "- Added `index` field to `/torrents/files` response ([#14795](https://github.com/qbittorrent/qBittorrent/pull/14795))", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "API v2.8.3", + ), + content: [ + Text( + "- Added `tag` optional parameter to `/torrents/info` ([#15152](https://github.com/qbittorrent/qBittorrent/pull/15152))", + ), + Text( + "", + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "General Information", + ), + content: [ + Text( + "", + ), + Text( + "- All API methods are under `/api/v2/APIName/methodName`, where `APIName` is a certain subgroup of API methods whose functionality is related.", + ), + Text( + "- Either `GET` or `POST` can be used as the request type for all API methods.", + ), + Text( + "- All API methods require [authentication](#authentication) (except the `/api/v2/auth/login` method itself, obviously).", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Authentication", + ), + content: [ + Text( + "", + ), + Text( + "All Authentication API methods are under \"auth\", e.g.: `/api/v2/auth/methodName`.", + ), + Text( + "", + ), + Text( + "qBittorrent uses cookie-based authentication.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Login", + ), + content: [ + Text( + "", + ), + Text( + "Name: `login`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`username` | string | Username used to access the WebUI", + columns: [ + "username", + "string", + "Username used to access the WebUI", + ], + }, + TableRow { + raw: "`password` | string | Password used to access the WebUI", + columns: [ + "password", + "string", + "Password used to access the WebUI", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "403 | User's IP is banned for too many failed login attempts", + columns: [ + "403", + "User's IP is banned for too many failed login attempts", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + Text( + "Upon success, the response will contain a cookie with your SID. You must supply the cookie whenever you want to perform an operation that requires authentication.", + ), + Text( + "", + ), + Text( + "Example showing how to login and execute a command that requires authentication using `curl`:", + ), + Text( + "", + ), + Text( + "```sh", + ), + Text( + "$ curl -i --header 'Referer: http://localhost:8080' --data 'username=admin&password=adminadmin' http://localhost:8080/api/v2/auth/login", + ), + Text( + "HTTP/1.1 200 OK", + ), + Text( + "Content-Encoding:", + ), + Text( + "Content-Length: 3", + ), + Text( + "Content-Type: text/plain; charset=UTF-8", + ), + Text( + "Set-Cookie: SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ; path=/", + ), + Text( + "$ curl http://localhost:8080/api/v2/torrents/info --cookie \"SID=hBc7TxF76ERhvIw0jQQ4LZ7Z1jQUV0tQ\"", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "Note: Set `Referer` or `Origin` header to the exact same domain and port as used in the HTTP query `Host` header.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Logout", + ), + content: [ + Text( + "", + ), + Text( + "Name: `logout`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Application", + ), + content: [ + Text( + "", + ), + Text( + "All Application API methods are under \"app\", e.g.: `/api/v2/app/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Get application version", + ), + content: [ + Text( + "", + ), + Text( + "Name: `version`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is a string with the application version, e.g. `v4.1.3`", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get API version", + ), + content: [ + Text( + "", + ), + Text( + "Name: `webapiVersion`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is a string with the WebAPI version, e.g. `2.0`", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get build info", + ), + content: [ + Text( + "", + ), + Text( + "Name: `buildInfo`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object containing the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "-------------|---------|------------", + rows: [ + TableRow { + raw: "`qt` | string | QT version", + columns: [ + "qt", + "string", + "QT version", + ], + }, + TableRow { + raw: "`libtorrent` | string | libtorrent version", + columns: [ + "libtorrent", + "string", + "libtorrent version", + ], + }, + TableRow { + raw: "`boost` | string | Boost version", + columns: [ + "boost", + "string", + "Boost version", + ], + }, + TableRow { + raw: "`openssl` | string | OpenSSL version", + columns: [ + "openssl", + "string", + "OpenSSL version", + ], + }, + TableRow { + raw: "`bitness` | int | Application bitness (e.g. 64-bit)", + columns: [ + "bitness", + "int", + "Application bitness (e.g. 64-bit)", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Shutdown application", + ), + content: [ + Text( + "", + ), + Text( + "Name: `shutdown`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get application preferences", + ), + content: [ + Text( + "", + ), + Text( + "Name: `preferences`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object with several fields (key-value) pairs representing the application's settings. The contents may vary depending on which settings are present in qBittorrent.ini.", + ), + Text( + "", + ), + Text( + "Possible fields:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "-----------------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`locale` | string | Currently selected language (e.g. en_GB for English)", + columns: [ + "locale", + "string", + "Currently selected language (e.g. en_GB for English)", + ], + }, + TableRow { + raw: "`create_subfolder_enabled` | bool | True if a subfolder should be created when adding a torrent", + columns: [ + "create_subfolder_enabled", + "bool", + "True if a subfolder should be created when adding a torrent", + ], + }, + TableRow { + raw: "`start_paused_enabled` | bool | True if torrents should be added in a Paused state", + columns: [ + "start_paused_enabled", + "bool", + "True if torrents should be added in a Paused state", + ], + }, + TableRow { + raw: "`auto_delete_mode` | integer | TODO", + columns: [ + "auto_delete_mode", + "integer", + "TODO", + ], + }, + TableRow { + raw: "`preallocate_all` | bool | True if disk space should be pre-allocated for all files", + columns: [ + "preallocate_all", + "bool", + "True if disk space should be pre-allocated for all files", + ], + }, + TableRow { + raw: "`incomplete_files_ext` | bool | True if \".!qB\" should be appended to incomplete files", + columns: [ + "incomplete_files_ext", + "bool", + "True if \".!qB\" should be appended to incomplete files", + ], + }, + TableRow { + raw: "`auto_tmm_enabled` | bool | True if Automatic Torrent Management is enabled by default", + columns: [ + "auto_tmm_enabled", + "bool", + "True if Automatic Torrent Management is enabled by default", + ], + }, + TableRow { + raw: "`torrent_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category changes", + columns: [ + "torrent_changed_tmm_enabled", + "bool", + "True if torrent should be relocated when its Category changes", + ], + }, + TableRow { + raw: "`save_path_changed_tmm_enabled` | bool | True if torrent should be relocated when the default save path changes", + columns: [ + "save_path_changed_tmm_enabled", + "bool", + "True if torrent should be relocated when the default save path changes", + ], + }, + TableRow { + raw: "`category_changed_tmm_enabled` | bool | True if torrent should be relocated when its Category's save path changes", + columns: [ + "category_changed_tmm_enabled", + "bool", + "True if torrent should be relocated when its Category's save path changes", + ], + }, + TableRow { + raw: "`save_path` | string | Default save path for torrents, separated by slashes", + columns: [ + "save_path", + "string", + "Default save path for torrents, separated by slashes", + ], + }, + TableRow { + raw: "`temp_path_enabled` | bool | True if folder for incomplete torrents is enabled", + columns: [ + "temp_path_enabled", + "bool", + "True if folder for incomplete torrents is enabled", + ], + }, + TableRow { + raw: "`temp_path` | string | Path for incomplete torrents, separated by slashes", + columns: [ + "temp_path", + "string", + "Path for incomplete torrents, separated by slashes", + ], + }, + TableRow { + raw: "`scan_dirs` | object | Property: 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", + columns: [ + "scan_dirs", + "object", + "Property: 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", + ], + }, + TableRow { + raw: "`export_dir` | string | Path to directory to copy .torrent files to. Slashes are used as path separators", + columns: [ + "export_dir", + "string", + "Path to directory to copy .torrent files to. Slashes are used as path separators", + ], + }, + TableRow { + raw: "`export_dir_fin` | string | Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators", + columns: [ + "export_dir_fin", + "string", + "Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators", + ], + }, + TableRow { + raw: "`mail_notification_enabled` | bool | True if e-mail notification should be enabled", + columns: [ + "mail_notification_enabled", + "bool", + "True if e-mail notification should be enabled", + ], + }, + TableRow { + raw: "`mail_notification_sender` | string | e-mail where notifications should originate from", + columns: [ + "mail_notification_sender", + "string", + "e-mail where notifications should originate from", + ], + }, + TableRow { + raw: "`mail_notification_email` | string | e-mail to send notifications to", + columns: [ + "mail_notification_email", + "string", + "e-mail to send notifications to", + ], + }, + TableRow { + raw: "`mail_notification_smtp` | string | smtp server for e-mail notifications", + columns: [ + "mail_notification_smtp", + "string", + "smtp server for e-mail notifications", + ], + }, + TableRow { + raw: "`mail_notification_ssl_enabled` | bool | True if smtp server requires SSL connection", + columns: [ + "mail_notification_ssl_enabled", + "bool", + "True if smtp server requires SSL connection", + ], + }, + TableRow { + raw: "`mail_notification_auth_enabled` | bool | True if smtp server requires authentication", + columns: [ + "mail_notification_auth_enabled", + "bool", + "True if smtp server requires authentication", + ], + }, + TableRow { + raw: "`mail_notification_username` | string | Username for smtp authentication", + columns: [ + "mail_notification_username", + "string", + "Username for smtp authentication", + ], + }, + TableRow { + raw: "`mail_notification_password` | string | Password for smtp authentication", + columns: [ + "mail_notification_password", + "string", + "Password for smtp authentication", + ], + }, + TableRow { + raw: "`autorun_enabled` | bool | True if external program should be run after torrent has finished downloading", + columns: [ + "autorun_enabled", + "bool", + "True if external program should be run after torrent has finished downloading", + ], + }, + TableRow { + raw: "`autorun_program` | string | 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", + columns: [ + "autorun_program", + "string", + "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", + ], + }, + TableRow { + raw: "`queueing_enabled` | bool | True if torrent queuing is enabled", + columns: [ + "queueing_enabled", + "bool", + "True if torrent queuing is enabled", + ], + }, + TableRow { + raw: "`max_active_downloads` | integer | Maximum number of active simultaneous downloads", + columns: [ + "max_active_downloads", + "integer", + "Maximum number of active simultaneous downloads", + ], + }, + TableRow { + raw: "`max_active_torrents` | integer | Maximum number of active simultaneous downloads and uploads", + columns: [ + "max_active_torrents", + "integer", + "Maximum number of active simultaneous downloads and uploads", + ], + }, + TableRow { + raw: "`max_active_uploads` | integer | Maximum number of active simultaneous uploads", + columns: [ + "max_active_uploads", + "integer", + "Maximum number of active simultaneous uploads", + ], + }, + TableRow { + raw: "`dont_count_slow_torrents` | bool | 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", + columns: [ + "dont_count_slow_torrents", + "bool", + "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", + ], + }, + TableRow { + raw: "`slow_torrent_dl_rate_threshold` | integer | Download rate in KiB/s for a torrent to be considered \"slow\"", + columns: [ + "slow_torrent_dl_rate_threshold", + "integer", + "Download rate in KiB/s for a torrent to be considered \"slow\"", + ], + }, + TableRow { + raw: "`slow_torrent_ul_rate_threshold` | integer | Upload rate in KiB/s for a torrent to be considered \"slow\"", + columns: [ + "slow_torrent_ul_rate_threshold", + "integer", + "Upload rate in KiB/s for a torrent to be considered \"slow\"", + ], + }, + TableRow { + raw: "`slow_torrent_inactive_timer` | integer | Seconds a torrent should be inactive before considered \"slow\"", + columns: [ + "slow_torrent_inactive_timer", + "integer", + "Seconds a torrent should be inactive before considered \"slow\"", + ], + }, + TableRow { + raw: "`max_ratio_enabled` | bool | True if share ratio limit is enabled", + columns: [ + "max_ratio_enabled", + "bool", + "True if share ratio limit is enabled", + ], + }, + TableRow { + raw: "`max_ratio` | float | Get the global share ratio limit", + columns: [ + "max_ratio", + "float", + "Get the global share ratio limit", + ], + }, + TableRow { + raw: "`max_ratio_act` | integer | Action performed when a torrent reaches the maximum share ratio. See list of possible values here below.", + columns: [ + "max_ratio_act", + "integer", + "Action performed when a torrent reaches the maximum share ratio. See list of possible values here below.", + ], + }, + TableRow { + raw: "`listen_port` | integer | Port for incoming connections", + columns: [ + "listen_port", + "integer", + "Port for incoming connections", + ], + }, + TableRow { + raw: "`upnp` | bool | True if UPnP/NAT-PMP is enabled", + columns: [ + "upnp", + "bool", + "True if UPnP/NAT-PMP is enabled", + ], + }, + TableRow { + raw: "`random_port` | bool | True if the port is randomly selected", + columns: [ + "random_port", + "bool", + "True if the port is randomly selected", + ], + }, + TableRow { + raw: "`dl_limit` | integer | Global download speed limit in KiB/s; `-1` means no limit is applied", + columns: [ + "dl_limit", + "integer", + "Global download speed limit in KiB/s; -1 means no limit is applied", + ], + }, + TableRow { + raw: "`up_limit` | integer | Global upload speed limit in KiB/s; `-1` means no limit is applied", + columns: [ + "up_limit", + "integer", + "Global upload speed limit in KiB/s; -1 means no limit is applied", + ], + }, + TableRow { + raw: "`max_connec` | integer | Maximum global number of simultaneous connections", + columns: [ + "max_connec", + "integer", + "Maximum global number of simultaneous connections", + ], + }, + TableRow { + raw: "`max_connec_per_torrent` | integer | Maximum number of simultaneous connections per torrent", + columns: [ + "max_connec_per_torrent", + "integer", + "Maximum number of simultaneous connections per torrent", + ], + }, + TableRow { + raw: "`max_uploads` | integer | Maximum number of upload slots", + columns: [ + "max_uploads", + "integer", + "Maximum number of upload slots", + ], + }, + TableRow { + raw: "`max_uploads_per_torrent` | integer | Maximum number of upload slots per torrent", + columns: [ + "max_uploads_per_torrent", + "integer", + "Maximum number of upload slots per torrent", + ], + }, + TableRow { + raw: "`stop_tracker_timeout` | integer | Timeout in seconds for a `stopped` announce request to trackers", + columns: [ + "stop_tracker_timeout", + "integer", + "Timeout in seconds for a stopped announce request to trackers", + ], + }, + TableRow { + raw: "`enable_piece_extent_affinity` | bool | True if the advanced libtorrent option `piece_extent_affinity` is enabled", + columns: [ + "enable_piece_extent_affinity", + "bool", + "True if the advanced libtorrent option piece_extent_affinity is enabled", + ], + }, + TableRow { + raw: "`bittorrent_protocol` | integer | Bittorrent Protocol to use (see list of possible values below)", + columns: [ + "bittorrent_protocol", + "integer", + "Bittorrent Protocol to use (see list of possible values below)", + ], + }, + TableRow { + raw: "`limit_utp_rate` | bool | 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", + columns: [ + "limit_utp_rate", + "bool", + "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", + ], + }, + TableRow { + raw: "`limit_tcp_overhead` | bool | True if `[du]l_limit` should be applied to estimated TCP overhead (service data: e.g. packet headers)", + columns: [ + "limit_tcp_overhead", + "bool", + "True if [du]l_limit should be applied to estimated TCP overhead (service data: e.g. packet headers)", + ], + }, + TableRow { + raw: "`limit_lan_peers` | bool | True if `[du]l_limit` should be applied to peers on the LAN", + columns: [ + "limit_lan_peers", + "bool", + "True if [du]l_limit should be applied to peers on the LAN", + ], + }, + TableRow { + raw: "`alt_dl_limit` | integer | Alternative global download speed limit in KiB/s", + columns: [ + "alt_dl_limit", + "integer", + "Alternative global download speed limit in KiB/s", + ], + }, + TableRow { + raw: "`alt_up_limit` | integer | Alternative global upload speed limit in KiB/s", + columns: [ + "alt_up_limit", + "integer", + "Alternative global upload speed limit in KiB/s", + ], + }, + TableRow { + raw: "`scheduler_enabled` | bool | True if alternative limits should be applied according to schedule", + columns: [ + "scheduler_enabled", + "bool", + "True if alternative limits should be applied according to schedule", + ], + }, + TableRow { + raw: "`schedule_from_hour` | integer | Scheduler starting hour", + columns: [ + "schedule_from_hour", + "integer", + "Scheduler starting hour", + ], + }, + TableRow { + raw: "`schedule_from_min` | integer | Scheduler starting minute", + columns: [ + "schedule_from_min", + "integer", + "Scheduler starting minute", + ], + }, + TableRow { + raw: "`schedule_to_hour` | integer | Scheduler ending hour", + columns: [ + "schedule_to_hour", + "integer", + "Scheduler ending hour", + ], + }, + TableRow { + raw: "`schedule_to_min` | integer | Scheduler ending minute", + columns: [ + "schedule_to_min", + "integer", + "Scheduler ending minute", + ], + }, + TableRow { + raw: "`scheduler_days` | integer | Scheduler days. See possible values here below", + columns: [ + "scheduler_days", + "integer", + "Scheduler days. See possible values here below", + ], + }, + TableRow { + raw: "`dht` | bool | True if DHT is enabled", + columns: [ + "dht", + "bool", + "True if DHT is enabled", + ], + }, + TableRow { + raw: "`pex` | bool | True if PeX is enabled", + columns: [ + "pex", + "bool", + "True if PeX is enabled", + ], + }, + TableRow { + raw: "`lsd` | bool | True if LSD is enabled", + columns: [ + "lsd", + "bool", + "True if LSD is enabled", + ], + }, + TableRow { + raw: "`encryption` | integer | See list of possible values here below", + columns: [ + "encryption", + "integer", + "See list of possible values here below", + ], + }, + TableRow { + raw: "`anonymous_mode` | bool | If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher", + columns: [ + "anonymous_mode", + "bool", + "If true anonymous mode will be enabled; read more [here](Anonymous-Mode); this option is only available in qBittorent built against libtorrent version 0.16.X and higher", + ], + }, + TableRow { + raw: "`proxy_type` | integer | See list of possible values here below", + columns: [ + "proxy_type", + "integer", + "See list of possible values here below", + ], + }, + TableRow { + raw: "`proxy_ip` | string | Proxy IP address or domain name", + columns: [ + "proxy_ip", + "string", + "Proxy IP address or domain name", + ], + }, + TableRow { + raw: "`proxy_port` | integer | Proxy port", + columns: [ + "proxy_port", + "integer", + "Proxy port", + ], + }, + TableRow { + raw: "`proxy_peer_connections` | bool | 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", + columns: [ + "proxy_peer_connections", + "bool", + "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", + ], + }, + TableRow { + raw: "`proxy_auth_enabled` | bool | True proxy requires authentication; doesn't apply to SOCKS4 proxies", + columns: [ + "proxy_auth_enabled", + "bool", + "True proxy requires authentication; doesn't apply to SOCKS4 proxies", + ], + }, + TableRow { + raw: "`proxy_username` | string | Username for proxy authentication", + columns: [ + "proxy_username", + "string", + "Username for proxy authentication", + ], + }, + TableRow { + raw: "`proxy_password` | string | Password for proxy authentication", + columns: [ + "proxy_password", + "string", + "Password for proxy authentication", + ], + }, + TableRow { + raw: "`proxy_torrents_only` | bool | True if proxy is only used for torrents", + columns: [ + "proxy_torrents_only", + "bool", + "True if proxy is only used for torrents", + ], + }, + TableRow { + raw: "`ip_filter_enabled` | bool | True if external IP filter should be enabled", + columns: [ + "ip_filter_enabled", + "bool", + "True if external IP filter should be enabled", + ], + }, + TableRow { + raw: "`ip_filter_path` | string | Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes", + columns: [ + "ip_filter_path", + "string", + "Path to IP filter file (.dat, .p2p, .p2b files are supported); path is separated by slashes", + ], + }, + TableRow { + raw: "`ip_filter_trackers` | bool | True if IP filters are applied to trackers", + columns: [ + "ip_filter_trackers", + "bool", + "True if IP filters are applied to trackers", + ], + }, + TableRow { + raw: "`web_ui_domain_list` | string | Comma-separated list of domains to accept when performing Host header validation", + columns: [ + "web_ui_domain_list", + "string", + "Comma-separated list of domains to accept when performing Host header validation", + ], + }, + TableRow { + raw: "`web_ui_address` | string | IP address to use for the WebUI", + columns: [ + "web_ui_address", + "string", + "IP address to use for the WebUI", + ], + }, + TableRow { + raw: "`web_ui_port` | integer | WebUI port", + columns: [ + "web_ui_port", + "integer", + "WebUI port", + ], + }, + TableRow { + raw: "`web_ui_upnp` | bool | True if UPnP is used for the WebUI port", + columns: [ + "web_ui_upnp", + "bool", + "True if UPnP is used for the WebUI port", + ], + }, + TableRow { + raw: "`web_ui_username` | string | WebUI username", + columns: [ + "web_ui_username", + "string", + "WebUI username", + ], + }, + TableRow { + raw: "`web_ui_password` | 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`", + columns: [ + "web_ui_password", + "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", + ], + }, + TableRow { + raw: "`web_ui_csrf_protection_enabled` | bool | True if WebUI CSRF protection is enabled", + columns: [ + "web_ui_csrf_protection_enabled", + "bool", + "True if WebUI CSRF protection is enabled", + ], + }, + TableRow { + raw: "`web_ui_clickjacking_protection_enabled` | bool | True if WebUI clickjacking protection is enabled", + columns: [ + "web_ui_clickjacking_protection_enabled", + "bool", + "True if WebUI clickjacking protection is enabled", + ], + }, + TableRow { + raw: "`web_ui_secure_cookie_enabled` | bool | True if WebUI cookie `Secure` flag is enabled", + columns: [ + "web_ui_secure_cookie_enabled", + "bool", + "True if WebUI cookie Secure flag is enabled", + ], + }, + TableRow { + raw: "`web_ui_max_auth_fail_count` | integer | Maximum number of authentication failures before WebUI access ban", + columns: [ + "web_ui_max_auth_fail_count", + "integer", + "Maximum number of authentication failures before WebUI access ban", + ], + }, + TableRow { + raw: "`web_ui_ban_duration` | integer | WebUI access ban duration in seconds", + columns: [ + "web_ui_ban_duration", + "integer", + "WebUI access ban duration in seconds", + ], + }, + TableRow { + raw: "`web_ui_session_timeout` | integer | Seconds until WebUI is automatically signed off", + columns: [ + "web_ui_session_timeout", + "integer", + "Seconds until WebUI is automatically signed off", + ], + }, + TableRow { + raw: "`web_ui_host_header_validation_enabled` | bool | True if WebUI host header validation is enabled", + columns: [ + "web_ui_host_header_validation_enabled", + "bool", + "True if WebUI host header validation is enabled", + ], + }, + TableRow { + raw: "`bypass_local_auth` | bool | True if authentication challenge for loopback address (127.0.0.1) should be disabled", + columns: [ + "bypass_local_auth", + "bool", + "True if authentication challenge for loopback address (127.0.0.1) should be disabled", + ], + }, + TableRow { + raw: "`bypass_auth_subnet_whitelist_enabled` | bool | True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist", + columns: [ + "bypass_auth_subnet_whitelist_enabled", + "bool", + "True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist", + ], + }, + TableRow { + raw: "`bypass_auth_subnet_whitelist` | string | (White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas", + columns: [ + "bypass_auth_subnet_whitelist", + "string", + "(White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas", + ], + }, + TableRow { + raw: "`alternative_webui_enabled` | bool | True if an alternative WebUI should be used", + columns: [ + "alternative_webui_enabled", + "bool", + "True if an alternative WebUI should be used", + ], + }, + TableRow { + raw: "`alternative_webui_path` | string | File path to the alternative WebUI", + columns: [ + "alternative_webui_path", + "string", + "File path to the alternative WebUI", + ], + }, + TableRow { + raw: "`use_https` | bool | True if WebUI HTTPS access is enabled", + columns: [ + "use_https", + "bool", + "True if WebUI HTTPS access is enabled", + ], + }, + TableRow { + raw: "`ssl_key` | string | For API < v2.0.1: SSL keyfile contents (this is a not a path)", + columns: [ + "ssl_key", + "string", + "For API < v2.0.1: SSL keyfile contents (this is a not a path)", + ], + }, + TableRow { + raw: "`ssl_cert` | string | For API < v2.0.1: SSL certificate contents (this is a not a path)", + columns: [ + "ssl_cert", + "string", + "For API < v2.0.1: SSL certificate contents (this is a not a path)", + ], + }, + TableRow { + raw: "`web_ui_https_key_path` | string | For API ≥ v2.0.1: Path to SSL keyfile", + columns: [ + "web_ui_https_key_path", + "string", + "For API ≥ v2.0.1: Path to SSL keyfile", + ], + }, + TableRow { + raw: "`web_ui_https_cert_path` | string | For API ≥ v2.0.1: Path to SSL certificate", + columns: [ + "web_ui_https_cert_path", + "string", + "For API ≥ v2.0.1: Path to SSL certificate", + ], + }, + TableRow { + raw: "`dyndns_enabled` | bool | True if server DNS should be updated dynamically", + columns: [ + "dyndns_enabled", + "bool", + "True if server DNS should be updated dynamically", + ], + }, + TableRow { + raw: "`dyndns_service` | integer | See list of possible values here below", + columns: [ + "dyndns_service", + "integer", + "See list of possible values here below", + ], + }, + TableRow { + raw: "`dyndns_username` | string | Username for DDNS service", + columns: [ + "dyndns_username", + "string", + "Username for DDNS service", + ], + }, + TableRow { + raw: "`dyndns_password` | string | Password for DDNS service", + columns: [ + "dyndns_password", + "string", + "Password for DDNS service", + ], + }, + TableRow { + raw: "`dyndns_domain` | string | Your DDNS domain name", + columns: [ + "dyndns_domain", + "string", + "Your DDNS domain name", + ], + }, + TableRow { + raw: "`rss_refresh_interval` | integer | RSS refresh interval", + columns: [ + "rss_refresh_interval", + "integer", + "RSS refresh interval", + ], + }, + TableRow { + raw: "`rss_max_articles_per_feed` | integer | Max stored articles per RSS feed", + columns: [ + "rss_max_articles_per_feed", + "integer", + "Max stored articles per RSS feed", + ], + }, + TableRow { + raw: "`rss_processing_enabled` | bool | Enable processing of RSS feeds", + columns: [ + "rss_processing_enabled", + "bool", + "Enable processing of RSS feeds", + ], + }, + TableRow { + raw: "`rss_auto_downloading_enabled` | bool | Enable auto-downloading of torrents from the RSS feeds", + columns: [ + "rss_auto_downloading_enabled", + "bool", + "Enable auto-downloading of torrents from the RSS feeds", + ], + }, + TableRow { + raw: "`rss_download_repack_proper_episodes` | bool | For API ≥ v2.5.1: Enable downloading of repack/proper Episodes", + columns: [ + "rss_download_repack_proper_episodes", + "bool", + "For API ≥ v2.5.1: Enable downloading of repack/proper Episodes", + ], + }, + TableRow { + raw: "`rss_smart_episode_filters` | string | For API ≥ v2.5.1: List of RSS Smart Episode Filters", + columns: [ + "rss_smart_episode_filters", + "string", + "For API ≥ v2.5.1: List of RSS Smart Episode Filters", + ], + }, + TableRow { + raw: "`add_trackers_enabled` | bool | Enable automatic adding of trackers to new torrents", + columns: [ + "add_trackers_enabled", + "bool", + "Enable automatic adding of trackers to new torrents", + ], + }, + TableRow { + raw: "`add_trackers` | string | List of trackers to add to new torrent", + columns: [ + "add_trackers", + "string", + "List of trackers to add to new torrent", + ], + }, + TableRow { + raw: "`web_ui_use_custom_http_headers_enabled` | bool | For API ≥ v2.5.1: Enable custom http headers", + columns: [ + "web_ui_use_custom_http_headers_enabled", + "bool", + "For API ≥ v2.5.1: Enable custom http headers", + ], + }, + TableRow { + raw: "`web_ui_custom_http_headers` | string | For API ≥ v2.5.1: List of custom http headers", + columns: [ + "web_ui_custom_http_headers", + "string", + "For API ≥ v2.5.1: List of custom http headers", + ], + }, + TableRow { + raw: "`max_seeding_time_enabled` | bool | True enables max seeding time ", + columns: [ + "max_seeding_time_enabled", + "bool", + "True enables max seeding time", + ], + }, + TableRow { + raw: "`max_seeding_time` | integer | Number of minutes to seed a torrent", + columns: [ + "max_seeding_time", + "integer", + "Number of minutes to seed a torrent", + ], + }, + TableRow { + raw: "`announce_ip` | string | TODO", + columns: [ + "announce_ip", + "string", + "TODO", + ], + }, + TableRow { + raw: "`announce_to_all_tiers` | bool | True always announce to all tiers", + columns: [ + "announce_to_all_tiers", + "bool", + "True always announce to all tiers", + ], + }, + TableRow { + raw: "`announce_to_all_trackers` | bool | True always announce to all trackers in a tier", + columns: [ + "announce_to_all_trackers", + "bool", + "True always announce to all trackers in a tier", + ], + }, + TableRow { + raw: "`async_io_threads` | integer | Number of asynchronous I/O threads", + columns: [ + "async_io_threads", + "integer", + "Number of asynchronous I/O threads", + ], + }, + TableRow { + raw: "`banned_IPs` | string | List of banned IPs", + columns: [ + "banned_IPs", + "string", + "List of banned IPs", + ], + }, + TableRow { + raw: "`checking_memory_use` | integer | Outstanding memory when checking torrents in MiB", + columns: [ + "checking_memory_use", + "integer", + "Outstanding memory when checking torrents in MiB", + ], + }, + TableRow { + raw: "`current_interface_address` | string | IP Address to bind to. Empty String means All addresses", + columns: [ + "current_interface_address", + "string", + "IP Address to bind to. Empty String means All addresses", + ], + }, + TableRow { + raw: "`current_network_interface` | string | Network Interface used", + columns: [ + "current_network_interface", + "string", + "Network Interface used", + ], + }, + TableRow { + raw: "`disk_cache` | integer | Disk cache used in MiB", + columns: [ + "disk_cache", + "integer", + "Disk cache used in MiB", + ], + }, + TableRow { + raw: "`disk_cache_ttl` | integer | Disk cache expiry interval in seconds", + columns: [ + "disk_cache_ttl", + "integer", + "Disk cache expiry interval in seconds", + ], + }, + TableRow { + raw: "`embedded_tracker_port` | integer | Port used for embedded tracker", + columns: [ + "embedded_tracker_port", + "integer", + "Port used for embedded tracker", + ], + }, + TableRow { + raw: "`enable_coalesce_read_write` | bool | True enables coalesce reads & writes", + columns: [ + "enable_coalesce_read_write", + "bool", + "True enables coalesce reads & writes", + ], + }, + TableRow { + raw: "`enable_embedded_tracker` | bool | True enables embedded tracker", + columns: [ + "enable_embedded_tracker", + "bool", + "True enables embedded tracker", + ], + }, + TableRow { + raw: "`enable_multi_connections_from_same_ip` | bool | True allows multiple connections from the same IP address", + columns: [ + "enable_multi_connections_from_same_ip", + "bool", + "True allows multiple connections from the same IP address", + ], + }, + TableRow { + raw: "`enable_os_cache` | bool | True enables os cache", + columns: [ + "enable_os_cache", + "bool", + "True enables os cache", + ], + }, + TableRow { + raw: "`enable_upload_suggestions` | bool | True enables sending of upload piece suggestions", + columns: [ + "enable_upload_suggestions", + "bool", + "True enables sending of upload piece suggestions", + ], + }, + TableRow { + raw: "`file_pool_size` | integer | File pool size", + columns: [ + "file_pool_size", + "integer", + "File pool size", + ], + }, + TableRow { + raw: "`outgoing_ports_max` | integer | Maximal outgoing port (0: Disabled)", + columns: [ + "outgoing_ports_max", + "integer", + "Maximal outgoing port (0: Disabled)", + ], + }, + TableRow { + raw: "`outgoing_ports_min` | integer | Minimal outgoing port (0: Disabled)", + columns: [ + "outgoing_ports_min", + "integer", + "Minimal outgoing port (0: Disabled)", + ], + }, + TableRow { + raw: "`recheck_completed_torrents` | bool | True rechecks torrents on completion", + columns: [ + "recheck_completed_torrents", + "bool", + "True rechecks torrents on completion", + ], + }, + TableRow { + raw: "`resolve_peer_countries` | bool | True resolves peer countries", + columns: [ + "resolve_peer_countries", + "bool", + "True resolves peer countries", + ], + }, + TableRow { + raw: "`save_resume_data_interval` | integer | Save resume data interval in min", + columns: [ + "save_resume_data_interval", + "integer", + "Save resume data interval in min", + ], + }, + TableRow { + raw: "`send_buffer_low_watermark` | integer | Send buffer low watermark in KiB", + columns: [ + "send_buffer_low_watermark", + "integer", + "Send buffer low watermark in KiB", + ], + }, + TableRow { + raw: "`send_buffer_watermark` | integer | Send buffer watermark in KiB", + columns: [ + "send_buffer_watermark", + "integer", + "Send buffer watermark in KiB", + ], + }, + TableRow { + raw: "`send_buffer_watermark_factor` | integer | Send buffer watermark factor in percent", + columns: [ + "send_buffer_watermark_factor", + "integer", + "Send buffer watermark factor in percent", + ], + }, + TableRow { + raw: "`socket_backlog_size` | integer | Socket backlog size", + columns: [ + "socket_backlog_size", + "integer", + "Socket backlog size", + ], + }, + TableRow { + raw: "`upload_choking_algorithm` | integer | Upload choking algorithm used (see list of possible values below)", + columns: [ + "upload_choking_algorithm", + "integer", + "Upload choking algorithm used (see list of possible values below)", + ], + }, + TableRow { + raw: "`upload_slots_behavior` | integer | Upload slots behavior used (see list of possible values below)", + columns: [ + "upload_slots_behavior", + "integer", + "Upload slots behavior used (see list of possible values below)", + ], + }, + TableRow { + raw: "`upnp_lease_duration` | integer | UPnP lease duration (0: Permanent lease)", + columns: [ + "upnp_lease_duration", + "integer", + "UPnP lease duration (0: Permanent lease)", + ], + }, + TableRow { + raw: "`utp_tcp_mixed_mode` | integer | μTP-TCP mixed mode algorithm (see list of possible values below)", + columns: [ + "utp_tcp_mixed_mode", + "integer", + "μTP-TCP mixed mode algorithm (see list of possible values below)", + ], + }, + ], + }, + ), + Text( + "Possible values of `scan_dirs`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "----------------------------|------------", + rows: [ + TableRow { + raw: "`0` | Download to the monitored folder", + columns: [ + "0", + "Download to the monitored folder", + ], + }, + TableRow { + raw: "`1` | Download to the default save path", + columns: [ + "1", + "Download to the default save path", + ], + }, + TableRow { + raw: "`\"/path/to/download/to\"` | Download to this path", + columns: [ + "\"/path/to/download/to\"", + "Download to this path", + ], + }, + ], + }, + ), + Text( + "Possible values of `scheduler_days`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Every day", + columns: [ + "0", + "Every day", + ], + }, + TableRow { + raw: "`1` | Every weekday", + columns: [ + "1", + "Every weekday", + ], + }, + TableRow { + raw: "`2` | Every weekend", + columns: [ + "2", + "Every weekend", + ], + }, + TableRow { + raw: "`3` | Every Monday", + columns: [ + "3", + "Every Monday", + ], + }, + TableRow { + raw: "`4` | Every Tuesday", + columns: [ + "4", + "Every Tuesday", + ], + }, + TableRow { + raw: "`5` | Every Wednesday", + columns: [ + "5", + "Every Wednesday", + ], + }, + TableRow { + raw: "`6` | Every Thursday", + columns: [ + "6", + "Every Thursday", + ], + }, + TableRow { + raw: "`7` | Every Friday", + columns: [ + "7", + "Every Friday", + ], + }, + TableRow { + raw: "`8` | Every Saturday", + columns: [ + "8", + "Every Saturday", + ], + }, + TableRow { + raw: "`9` | Every Sunday", + columns: [ + "9", + "Every Sunday", + ], + }, + ], + }, + ), + Text( + "Possible values of `encryption`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Prefer encryption", + columns: [ + "0", + "Prefer encryption", + ], + }, + TableRow { + raw: "`1` | Force encryption on", + columns: [ + "1", + "Force encryption on", + ], + }, + TableRow { + raw: "`2` | Force encryption off", + columns: [ + "2", + "Force encryption off", + ], + }, + ], + }, + ), + Text( + "NB: the first options allows you to use both encrypted and unencrypted connections (this is the default); other options are mutually exclusive: e.g. by forcing encryption on you won't be able to use unencrypted connections and vice versa.", + ), + Text( + "", + ), + Text( + "Possible values of `proxy_type`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "------|------------", + rows: [ + TableRow { + raw: "`-1` | Proxy is disabled", + columns: [ + "-1", + "Proxy is disabled", + ], + }, + TableRow { + raw: "`1` | HTTP proxy without authentication", + columns: [ + "1", + "HTTP proxy without authentication", + ], + }, + TableRow { + raw: "`2` | SOCKS5 proxy without authentication", + columns: [ + "2", + "SOCKS5 proxy without authentication", + ], + }, + TableRow { + raw: "`3` | HTTP proxy with authentication", + columns: [ + "3", + "HTTP proxy with authentication", + ], + }, + TableRow { + raw: "`4` | SOCKS5 proxy with authentication", + columns: [ + "4", + "SOCKS5 proxy with authentication", + ], + }, + TableRow { + raw: "`5` | SOCKS4 proxy without authentication", + columns: [ + "5", + "SOCKS4 proxy without authentication", + ], + }, + ], + }, + ), + Text( + "Possible values of `dyndns_service`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Use DyDNS", + columns: [ + "0", + "Use DyDNS", + ], + }, + TableRow { + raw: "`1` | Use NOIP", + columns: [ + "1", + "Use NOIP", + ], + }, + ], + }, + ), + Text( + "Possible values of `max_ratio_act`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "------|------------", + rows: [ + TableRow { + raw: "`0` | Pause torrent", + columns: [ + "0", + "Pause torrent", + ], + }, + TableRow { + raw: "`1` | Remove torrent", + columns: [ + "1", + "Remove torrent", + ], + }, + ], + }, + ), + Text( + "Possible values of `bittorrent_protocol`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | TCP and μTP", + columns: [ + "0", + "TCP and μTP", + ], + }, + TableRow { + raw: "`1` | TCP", + columns: [ + "1", + "TCP", + ], + }, + TableRow { + raw: "`2` | μTP", + columns: [ + "2", + "μTP", + ], + }, + ], + }, + ), + Text( + "Possible values of `upload_choking_algorithm`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Round-robin", + columns: [ + "0", + "Round-robin", + ], + }, + TableRow { + raw: "`1` | Fastest upload", + columns: [ + "1", + "Fastest upload", + ], + }, + TableRow { + raw: "`2` | Anti-leech", + columns: [ + "2", + "Anti-leech", + ], + }, + ], + }, + ), + Text( + "Possible values of `upload_slots_behavior`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Fixed slots", + columns: [ + "0", + "Fixed slots", + ], + }, + TableRow { + raw: "`1` | Upload rate based", + columns: [ + "1", + "Upload rate based", + ], + }, + ], + }, + ), + Text( + "Possible values of `utp_tcp_mixed_mode`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "`0` | Prefer TCP", + columns: [ + "0", + "Prefer TCP", + ], + }, + TableRow { + raw: "`1` | Peer proportional", + columns: [ + "1", + "Peer proportional", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"add_trackers\": \"\",", + ), + Text( + " \"add_trackers_enabled\": false,", + ), + Text( + " \"alt_dl_limit\": 10240,", + ), + Text( + " \"alt_up_limit\": 10240,", + ), + Text( + " \"alternative_webui_enabled\": false,", + ), + Text( + " \"alternative_webui_path\": \"/home/user/Documents/qbit-webui\",", + ), + Text( + " \"announce_ip\": \"\",", + ), + Text( + " \"announce_to_all_tiers\": true,", + ), + Text( + " \"announce_to_all_trackers\": false,", + ), + Text( + " \"anonymous_mode\": false,", + ), + Text( + " \"async_io_threads\": 4,", + ), + Text( + " \"auto_delete_mode\": 0,", + ), + Text( + " \"auto_tmm_enabled\": false,", + ), + Text( + " \"autorun_enabled\": false,", + ), + Text( + " \"autorun_program\": \"\",", + ), + Text( + " \"banned_IPs\": \"\",", + ), + Text( + " \"bittorrent_protocol\": 0,", + ), + Text( + " \"bypass_auth_subnet_whitelist\": \"\",", + ), + Text( + " \"bypass_auth_subnet_whitelist_enabled\": false,", + ), + Text( + " \"bypass_local_auth\": false,", + ), + Text( + " \"category_changed_tmm_enabled\": false,", + ), + Text( + " \"checking_memory_use\": 32,", + ), + Text( + " \"create_subfolder_enabled\": true,", + ), + Text( + " \"current_interface_address\": \"\",", + ), + Text( + " \"current_network_interface\": \"\",", + ), + Text( + " \"dht\": true,", + ), + Text( + " \"disk_cache\": -1,", + ), + Text( + " \"disk_cache_ttl\": 60,", + ), + Text( + " \"dl_limit\": 0,", + ), + Text( + " \"dont_count_slow_torrents\": false,", + ), + Text( + " \"dyndns_domain\": \"changeme.dyndns.org\",", + ), + Text( + " \"dyndns_enabled\": false,", + ), + Text( + " \"dyndns_password\": \"\",", + ), + Text( + " \"dyndns_service\": 0,", + ), + Text( + " \"dyndns_username\": \"\",", + ), + Text( + " \"embedded_tracker_port\": 9000,", + ), + Text( + " \"enable_coalesce_read_write\": false,", + ), + Text( + " \"enable_embedded_tracker\": false,", + ), + Text( + " \"enable_multi_connections_from_same_ip\": false,", + ), + Text( + " \"enable_os_cache\": true,", + ), + Text( + " \"enable_piece_extent_affinity\": false,", + ), + Text( + " \"enable_upload_suggestions\": false,", + ), + Text( + " \"encryption\": 0,", + ), + Text( + " \"export_dir\": \"/home/user/Downloads/all\",", + ), + Text( + " \"export_dir_fin\": \"/home/user/Downloads/completed\",", + ), + Text( + " \"file_pool_size\": 40,", + ), + Text( + " \"incomplete_files_ext\": false,", + ), + Text( + " \"ip_filter_enabled\": false,", + ), + Text( + " \"ip_filter_path\": \"\",", + ), + Text( + " \"ip_filter_trackers\": false,", + ), + Text( + " \"limit_lan_peers\": true,", + ), + Text( + " \"limit_tcp_overhead\": false,", + ), + Text( + " \"limit_utp_rate\": true,", + ), + Text( + " \"listen_port\": 58925,", + ), + Text( + " \"locale\": \"en\",", + ), + Text( + " \"lsd\": true,", + ), + Text( + " \"mail_notification_auth_enabled\": false,", + ), + Text( + " \"mail_notification_email\": \"\",", + ), + Text( + " \"mail_notification_enabled\": false,", + ), + Text( + " \"mail_notification_password\": \"\",", + ), + Text( + " \"mail_notification_sender\": \"qBittorrent_notification@example.com\",", + ), + Text( + " \"mail_notification_smtp\": \"smtp.changeme.com\",", + ), + Text( + " \"mail_notification_ssl_enabled\": false,", + ), + Text( + " \"mail_notification_username\": \"\",", + ), + Text( + " \"max_active_downloads\": 3,", + ), + Text( + " \"max_active_torrents\": 5,", + ), + Text( + " \"max_active_uploads\": 3,", + ), + Text( + " \"max_connec\": 500,", + ), + Text( + " \"max_connec_per_torrent\": 100,", + ), + Text( + " \"max_ratio\": -1,", + ), + Text( + " \"max_ratio_act\": 0,", + ), + Text( + " \"max_ratio_enabled\": false,", + ), + Text( + " \"max_seeding_time\": -1,", + ), + Text( + " \"max_seeding_time_enabled\": false,", + ), + Text( + " \"max_uploads\": -1,", + ), + Text( + " \"max_uploads_per_torrent\": -1,", + ), + Text( + " \"outgoing_ports_max\": 0,", + ), + Text( + " \"outgoing_ports_min\": 0,", + ), + Text( + " \"pex\": true,", + ), + Text( + " \"preallocate_all\": false,", + ), + Text( + " \"proxy_auth_enabled\": false,", + ), + Text( + " \"proxy_ip\": \"0.0.0.0\",", + ), + Text( + " \"proxy_password\": \"\",", + ), + Text( + " \"proxy_peer_connections\": false,", + ), + Text( + " \"proxy_port\": 8080,", + ), + Text( + " \"proxy_torrents_only\": false,", + ), + Text( + " \"proxy_type\": 0,", + ), + Text( + " \"proxy_username\": \"\",", + ), + Text( + " \"queueing_enabled\": false,", + ), + Text( + " \"random_port\": false,", + ), + Text( + " \"recheck_completed_torrents\": false,", + ), + Text( + " \"resolve_peer_countries\": true,", + ), + Text( + " \"rss_auto_downloading_enabled\":true,", + ), + Text( + " \"rss_download_repack_proper_episodes\":true,", + ), + Text( + " \"rss_max_articles_per_feed\":50,", + ), + Text( + " \"rss_processing_enabled\":true,", + ), + Text( + " \"rss_refresh_interval\":30,", + ), + Text( + " \"rss_smart_episode_filters\":\"s(\\\\d+)e(\\\\d+)\\n(\\\\d+)x(\\\\d+)\\n(\\\\d{4}[.\\\\-]\\\\d{1,2}[.\\\\-]\\\\d{1,2})\",", + ), + Text( + " \"save_path\": \"/home/user/Downloads/\",", + ), + Text( + " \"save_path_changed_tmm_enabled\": false,", + ), + Text( + " \"save_resume_data_interval\": 60,", + ), + Text( + " \"scan_dirs\":", + ), + Text( + " {", + ), + Text( + " \"/home/user/Downloads/incoming/games\": 0,", + ), + Text( + " \"/home/user/Downloads/incoming/movies\": 1,", + ), + Text( + " },", + ), + Text( + " \"schedule_from_hour\": 8,", + ), + Text( + " \"schedule_from_min\": 0,", + ), + Text( + " \"schedule_to_hour\": 20,", + ), + Text( + " \"schedule_to_min\": 0,", + ), + Text( + " \"scheduler_days\": 0,", + ), + Text( + " \"scheduler_enabled\": false,", + ), + Text( + " \"send_buffer_low_watermark\": 10,", + ), + Text( + " \"send_buffer_watermark\": 500,", + ), + Text( + " \"send_buffer_watermark_factor\": 50,", + ), + Text( + " \"slow_torrent_dl_rate_threshold\": 2,", + ), + Text( + " \"slow_torrent_inactive_timer\": 60,", + ), + Text( + " \"slow_torrent_ul_rate_threshold\": 2,", + ), + Text( + " \"socket_backlog_size\": 30,", + ), + Text( + " \"start_paused_enabled\": false,", + ), + Text( + " \"stop_tracker_timeout\": 1,", + ), + Text( + " \"temp_path\": \"/home/user/Downloads/temp\",", + ), + Text( + " \"temp_path_enabled\": false,", + ), + Text( + " \"torrent_changed_tmm_enabled\": true,", + ), + Text( + " \"up_limit\": 0,", + ), + Text( + " \"upload_choking_algorithm\": 1,", + ), + Text( + " \"upload_slots_behavior\": 0,", + ), + Text( + " \"upnp\": true,", + ), + Text( + " \"use_https\": false,", + ), + Text( + " \"utp_tcp_mixed_mode\": 0,", + ), + Text( + " \"web_ui_address\": \"*\",", + ), + Text( + " \"web_ui_ban_duration\": 3600,", + ), + Text( + " \"web_ui_clickjacking_protection_enabled\": true,", + ), + Text( + " \"web_ui_csrf_protection_enabled\": true,", + ), + Text( + " \"web_ui_custom_http_headers\": \"\",", + ), + Text( + " \"web_ui_domain_list\": \"*\",", + ), + Text( + " \"web_ui_host_header_validation_enabled\": true,", + ), + Text( + " \"web_ui_https_cert_path\": \"\",", + ), + Text( + " \"web_ui_https_key_path\": \"\",", + ), + Text( + " \"web_ui_max_auth_fail_count\": 5,", + ), + Text( + " \"web_ui_port\": 8080,", + ), + Text( + " \"web_ui_secure_cookie_enabled\": true,", + ), + Text( + " \"web_ui_session_timeout\": 3600,", + ), + Text( + " \"web_ui_upnp\": false,", + ), + Text( + " \"web_ui_use_custom_http_headers_enabled\": false,", + ), + Text( + " \"web_ui_username\": \"admin\"", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set application preferences", + ), + content: [ + Text( + "", + ), + Text( + "Name: `setPreferences`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "A json object with key-value pairs of the settings you want to change and their new values.", + ), + Text( + "", + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "json={\"save_path\":\"C:/Users/Dayman/Downloads\",\"queueing_enabled\":false,\"scan_dirs\":{\"C:/Games\": 0,\"D:/Downloads\": 1}}", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Asterix( + "Notes**:", + ), + Text( + "", + ), + Text( + " 1. There is no need to pass all possible preferences' `token:value` pairs if you only want to change one option", + ), + Text( + " 1. Paths in `scan_dirs` must exist, otherwise this option will have no effect", + ), + Text( + " 1. String values must be quoted; integer and boolean values must never be quoted", + ), + Text( + "", + ), + Text( + "For a list of possible preference options see [Get application preferences](#get-application-preferences)", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get default save path", + ), + content: [ + Text( + "", + ), + Text( + "Name: `defaultSavePath`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is a string with the default save path, e.g. `C:/Users/Dayman/Downloads`.", + ), + Text( + "", + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Log", + ), + content: [ + Text( + "", + ), + Text( + "All Log API methods are under \"log\", e.g.: `/api/v2/log/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Get log", + ), + content: [ + Text( + "", + ), + Text( + "Name: `main`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------|---------|------------", + rows: [ + TableRow { + raw: "`normal` | bool | Include normal messages (default: `true`)", + columns: [ + "normal", + "bool", + "Include normal messages (default: true)", + ], + }, + TableRow { + raw: "`info` | bool | Include info messages (default: `true`)", + columns: [ + "info", + "bool", + "Include info messages (default: true)", + ], + }, + TableRow { + raw: "`warning` | bool | Include warning messages (default: `true`)", + columns: [ + "warning", + "bool", + "Include warning messages (default: true)", + ], + }, + TableRow { + raw: "`critical` | bool | Include critical messages (default: `true`)", + columns: [ + "critical", + "bool", + "Include critical messages (default: true)", + ], + }, + TableRow { + raw: "`last_known_id` | integer | Exclude messages with \"message id\" <= `last_known_id` (default: `-1`)", + columns: [ + "last_known_id", + "integer", + "Exclude messages with \"message id\" <= last_known_id (default: -1)", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "/api/v2/log/main?normal=true&info=true&warning=true&critical=true&last_known_id=-1", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON array in which each element is an entry of the log.", + ), + Text( + "", + ), + Text( + "Each element of the array has the following properties:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | integer | ID of the message", + columns: [ + "id", + "integer", + "ID of the message", + ], + }, + TableRow { + raw: "`message` | string | Text of the message", + columns: [ + "message", + "string", + "Text of the message", + ], + }, + TableRow { + raw: "`timestamp` | integer | Milliseconds since epoch", + columns: [ + "timestamp", + "integer", + "Milliseconds since epoch", + ], + }, + TableRow { + raw: "`type` | integer | Type of the message: Log::NORMAL: `1`, Log::INFO: `2`, Log::WARNING: `4`, Log::CRITICAL: `8`", + columns: [ + "type", + "integer", + "Type of the message: Log::NORMAL: 1, Log::INFO: 2, Log::WARNING: 4, Log::CRITICAL: 8", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"id\":0,", + ), + Text( + " \"message\":\"qBittorrent v3.4.0 started\",", + ), + Text( + " \"timestamp\":1507969127860,", + ), + Text( + " \"type\":1", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":1,", + ), + Text( + " \"message\":\"qBittorrent is trying to listen on any interface port: 19036\",", + ), + Text( + " \"timestamp\":1507969127869,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":2,", + ), + Text( + " \"message\":\"Peer ID: -qB3400-\",", + ), + Text( + " \"timestamp\":1507969127870,", + ), + Text( + " \"type\":1", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":3,", + ), + Text( + " \"message\":\"HTTP User-Agent is 'qBittorrent/3.4.0'\",", + ), + Text( + " \"timestamp\":1507969127870,", + ), + Text( + " \"type\":1", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":4,", + ), + Text( + " \"message\":\"DHT support [ON]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":5,", + ), + Text( + " \"message\":\"Local Peer Discovery support [ON]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":6,", + ), + Text( + " \"message\":\"PeX support [ON]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":7,", + ), + Text( + " \"message\":\"Anonymous mode [OFF]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":8,", + ), + Text( + " \"message\":\"Encryption support [ON]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":9,", + ), + Text( + " \"message\":\"Embedded Tracker [OFF]\",", + ), + Text( + " \"timestamp\":1507969127871,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":10,", + ), + Text( + " \"message\":\"UPnP / NAT-PMP support [ON]\",", + ), + Text( + " \"timestamp\":1507969127873,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":11,", + ), + Text( + " \"message\":\"Web UI: Now listening on port 8080\",", + ), + Text( + " \"timestamp\":1507969127883,", + ), + Text( + " \"type\":1", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":12,", + ), + Text( + " \"message\":\"Options were saved successfully.\",", + ), + Text( + " \"timestamp\":1507969128055,", + ), + Text( + " \"type\":1", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":13,", + ), + Text( + " \"message\":\"qBittorrent is successfully listening on interface :: port: TCP/19036\",", + ), + Text( + " \"timestamp\":1507969128270,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":14,", + ), + Text( + " \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: TCP/19036\",", + ), + Text( + " \"timestamp\":1507969128271,", + ), + Text( + " \"type\":2", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"id\":15,", + ), + Text( + " \"message\":\"qBittorrent is successfully listening on interface 0.0.0.0 port: UDP/19036\",", + ), + Text( + " \"timestamp\":1507969128272,", + ), + Text( + " \"type\":2", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get peer log", + ), + content: [ + Text( + "", + ), + Text( + "Name: `peers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------|---------|------------", + rows: [ + TableRow { + raw: "`last_known_id` | integer | Exclude messages with \"message id\" <= `last_known_id` (default: `-1`)", + columns: [ + "last_known_id", + "integer", + "Exclude messages with \"message id\" <= last_known_id (default: -1)", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response a JSON array. Each element of the array of objects (each object is the information relative to a peer) containing the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | integer | ID of the peer", + columns: [ + "id", + "integer", + "ID of the peer", + ], + }, + TableRow { + raw: "`ip` | string | IP of the peer", + columns: [ + "ip", + "string", + "IP of the peer", + ], + }, + TableRow { + raw: "`timestamp` | integer | Milliseconds since epoch", + columns: [ + "timestamp", + "integer", + "Milliseconds since epoch", + ], + }, + TableRow { + raw: "`blocked` | boolean | Whether or not the peer was blocked", + columns: [ + "blocked", + "boolean", + "Whether or not the peer was blocked", + ], + }, + TableRow { + raw: "`reason` | string | Reason of the block", + columns: [ + "reason", + "string", + "Reason of the block", + ], + }, + ], + }, + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Sync", + ), + content: [ + Text( + "", + ), + Text( + "Sync API implements requests for obtaining changes since the last request.", + ), + Text( + "All Sync API methods are under \"sync\", e.g.: `/api/v2/sync/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Get main data", + ), + content: [ + Text( + "", + ), + Text( + "Name: `maindata`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|---------|------------", + rows: [ + TableRow { + raw: "`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info)", + columns: [ + "rid", + "integer", + "Response ID. If not provided, rid=0 will be assumed. If the given rid is different from the one of last server reply, full_update will be true (see the server reply details for more info)", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "/api/v2/sync/maindata?rid=14", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object with the following possible fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`rid` | integer | Response ID", + columns: [ + "rid", + "integer", + "Response ID", + ], + }, + TableRow { + raw: "`full_update` | bool | Whether the response contains all the data or partial data", + columns: [ + "full_update", + "bool", + "Whether the response contains all the data or partial data", + ], + }, + TableRow { + raw: "`torrents` | object | Property: torrent hash, value: same as [torrent list](#get-torrent-list)", + columns: [ + "torrents", + "object", + "Property: torrent hash, value: same as [torrent list](#get-torrent-list)", + ], + }, + TableRow { + raw: "`torrents_removed` | array | List of hashes of torrents removed since last request", + columns: [ + "torrents_removed", + "array", + "List of hashes of torrents removed since last request", + ], + }, + TableRow { + raw: "`categories` | object | Info for categories added since last request", + columns: [ + "categories", + "object", + "Info for categories added since last request", + ], + }, + TableRow { + raw: "`categories_removed` | array | List of categories removed since last request", + columns: [ + "categories_removed", + "array", + "List of categories removed since last request", + ], + }, + TableRow { + raw: "`tags` | array | List of tags added since last request", + columns: [ + "tags", + "array", + "List of tags added since last request", + ], + }, + TableRow { + raw: "`tags_removed` | array | List of tags removed since last request", + columns: [ + "tags_removed", + "array", + "List of tags removed since last request", + ], + }, + TableRow { + raw: "`server_state` | object | Global transfer info", + columns: [ + "server_state", + "object", + "Global transfer info", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"rid\":15,", + ), + Text( + " \"torrents\":", + ), + Text( + " {", + ), + Text( + " \"8c212779b4abde7c6bc608063a0d008b7e40ce32\":", + ), + Text( + " {", + ), + Text( + " \"state\":\"pausedUP\"", + ), + Text( + " }", + ), + Text( + " }", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent peers data", + ), + content: [ + Text( + "", + ), + Text( + "Name: `torrentPeers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|---------|------------", + rows: [ + TableRow { + raw: "`hash` | string | Torrent hash", + columns: [ + "hash", + "string", + "Torrent hash", + ], + }, + TableRow { + raw: "`rid` | integer | Response ID. If not provided, `rid=0` will be assumed. If the given `rid` is different from the one of last server reply, `full_update` will be `true` (see the server reply details for more info)", + columns: [ + "rid", + "integer", + "Response ID. If not provided, rid=0 will be assumed. If the given rid is different from the one of last server reply, full_update will be true (see the server reply details for more info)", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "/api/v2/sync/torrentPeers?hash=8c212779b4abde7c6bc608063a0d008b7e40ce32?rid=14", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is TODO", + ), + Text( + "", + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Transfer info", + ), + content: [ + Text( + "", + ), + Text( + "All Transfer info API methods are under \"transfer\", e.g.: `/api/v2/transfer/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Get global transfer info", + ), + content: [ + Text( + "", + ), + Text( + "This method returns info you usually see in qBt status bar.", + ), + Text( + "", + ), + Text( + "Name: `info`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "--------------------|---------|------------", + rows: [ + TableRow { + raw: "`dl_info_speed` | integer | Global download rate (bytes/s)", + columns: [ + "dl_info_speed", + "integer", + "Global download rate (bytes/s)", + ], + }, + TableRow { + raw: "`dl_info_data` | integer | Data downloaded this session (bytes)", + columns: [ + "dl_info_data", + "integer", + "Data downloaded this session (bytes)", + ], + }, + TableRow { + raw: "`up_info_speed` | integer | Global upload rate (bytes/s)", + columns: [ + "up_info_speed", + "integer", + "Global upload rate (bytes/s)", + ], + }, + TableRow { + raw: "`up_info_data` | integer | Data uploaded this session (bytes)", + columns: [ + "up_info_data", + "integer", + "Data uploaded this session (bytes)", + ], + }, + TableRow { + raw: "`dl_rate_limit` | integer | Download rate limit (bytes/s)", + columns: [ + "dl_rate_limit", + "integer", + "Download rate limit (bytes/s)", + ], + }, + TableRow { + raw: "`up_rate_limit` | integer | Upload rate limit (bytes/s)", + columns: [ + "up_rate_limit", + "integer", + "Upload rate limit (bytes/s)", + ], + }, + TableRow { + raw: "`dht_nodes` | integer | DHT nodes connected to", + columns: [ + "dht_nodes", + "integer", + "DHT nodes connected to", + ], + }, + TableRow { + raw: "`connection_status` | string | Connection status. See possible values here below", + columns: [ + "connection_status", + "string", + "Connection status. See possible values here below", + ], + }, + ], + }, + ), + Text( + "In addition to the above in partial data requests (see [Get partial data](#get-partial-data) for more info):", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "-----------------------|---------|------------", + rows: [ + TableRow { + raw: "`queueing` | bool | True if torrent queueing is enabled", + columns: [ + "queueing", + "bool", + "True if torrent queueing is enabled", + ], + }, + TableRow { + raw: "`use_alt_speed_limits` | bool | True if alternative speed limits are enabled", + columns: [ + "use_alt_speed_limits", + "bool", + "True if alternative speed limits are enabled", + ], + }, + TableRow { + raw: "`refresh_interval` | integer | Transfer list refresh interval (milliseconds)", + columns: [ + "refresh_interval", + "integer", + "Transfer list refresh interval (milliseconds)", + ], + }, + ], + }, + ), + Text( + "Possible values of `connection_status`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value |", + columns: [ + "Value", + "", + ], + }, + split: "--------------------|", + rows: [ + TableRow { + raw: "`connected` |", + columns: [ + "connected", + "", + ], + }, + TableRow { + raw: "`firewalled` |", + columns: [ + "firewalled", + "", + ], + }, + TableRow { + raw: "`disconnected` |", + columns: [ + "disconnected", + "", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"connection_status\":\"connected\",", + ), + Text( + " \"dht_nodes\":386,", + ), + Text( + " \"dl_info_data\":681521119,", + ), + Text( + " \"dl_info_speed\":0,", + ), + Text( + " \"dl_rate_limit\":0,", + ), + Text( + " \"up_info_data\":10747904,", + ), + Text( + " \"up_info_speed\":0,", + ), + Text( + " \"up_rate_limit\":1048576", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get alternative speed limits state", + ), + content: [ + Text( + "", + ), + Text( + "Name: `speedLimitsMode`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is `1` if alternative speed limits are enabled, `0` otherwise.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Toggle alternative speed limits", + ), + content: [ + Text( + "", + ), + Text( + "Name: `toggleSpeedLimitsMode`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get global download limit", + ), + content: [ + Text( + "", + ), + Text( + "Name: `downloadLimit`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is the value of current global download speed limit in bytes/second; this value will be zero if no limit is applied.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set global download limit", + ), + content: [ + Text( + "", + ), + Text( + "Name: `setDownloadLimit`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`limit` | integer | The global download speed limit to set in bytes/second", + columns: [ + "limit", + "integer", + "The global download speed limit to set in bytes/second", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get global upload limit", + ), + content: [ + Text( + "", + ), + Text( + "Name: `uploadLimit`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "The response is the value of current global upload speed limit in bytes/second; this value will be zero if no limit is applied.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set global upload limit", + ), + content: [ + Text( + "", + ), + Text( + "Name: `setUploadLimit`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`limit` | integer | The global upload speed limit to set in bytes/second", + columns: [ + "limit", + "integer", + "The global upload speed limit to set in bytes/second", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Ban peers", + ), + content: [ + Text( + "", + ), + Text( + "Name: `banPeers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`peers` | string | The peer to ban, or multiple peers separated by a pipe `\\|`. Each peer is a colon-separated `host:port`", + columns: [ + "peers", + "string", + "The peer to ban, or multiple peers separated by a pipe \\", + ". Each peer is a colon-separated host:port", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Torrent management", + ), + content: [ + Text( + "", + ), + Text( + "All Torrent management API methods are under \"torrents\", e.g.: `/api/v2/torrents/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Get torrent list", + ), + content: [ + Text( + "", + ), + Text( + "Name: `info`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------|---------|------------", + rows: [ + TableRow { + raw: "`filter` _optional_ | string | Filter torrent list by state. Allowed state filters: `all`, `downloading`, `seeding`, `completed`, `paused`, `active`, `inactive`, `resumed`, `stalled`, `stalled_uploading`, `stalled_downloading`, `errored`", + columns: [ + "filter _optional_", + "string", + "Filter torrent list by state. Allowed state filters: all, downloading, seeding, completed, paused, active, inactive, resumed, stalled, stalled_uploading, stalled_downloading, errored", + ], + }, + TableRow { + raw: "`category` _optional_ | string | Get torrents with the given category (empty string means \"without category\"; no \"category\" parameter means \"any category\" <- broken until [#11748](https://github.com/qbittorrent/qBittorrent/issues/11748) is resolved). Remember to URL-encode the category name. For example, `My category` becomes `My%20category`", + columns: [ + "category _optional_", + "string", + "Get torrents with the given category (empty string means \"without category\"; no \"category\" parameter means \"any category\" <- broken until [#11748](https://github.com/qbittorrent/qBittorrent/issues/11748) is resolved). Remember to URL-encode the category name. For example, My category becomes My%20category", + ], + }, + TableRow { + raw: "`tag` _optional_ since 2.8.3 | string | Get torrents with the given tag (empty string means \"without tag\"; no \"tag\" parameter means \"any tag\". Remember to URL-encode the category name. For example, `My tag` becomes `My%20tag`", + columns: [ + "tag _optional_ since 2.8.3", + "string", + "Get torrents with the given tag (empty string means \"without tag\"; no \"tag\" parameter means \"any tag\". Remember to URL-encode the category name. For example, My tag becomes My%20tag", + ], + }, + TableRow { + raw: "`sort` _optional_ | string | Sort torrents by given key. They can be sorted using any field of the response's JSON array (which are documented below) as the sort key.", + columns: [ + "sort _optional_", + "string", + "Sort torrents by given key. They can be sorted using any field of the response's JSON array (which are documented below) as the sort key.", + ], + }, + TableRow { + raw: "`reverse` _optional_ | bool | Enable reverse sorting. Defaults to `false`", + columns: [ + "reverse _optional_", + "bool", + "Enable reverse sorting. Defaults to false", + ], + }, + TableRow { + raw: "`limit` _optional_ | integer | Limit the number of torrents returned", + columns: [ + "limit _optional_", + "integer", + "Limit the number of torrents returned", + ], + }, + TableRow { + raw: "`offset` _optional_ | integer | Set offset (if less than 0, offset from end)", + columns: [ + "offset _optional_", + "integer", + "Set offset (if less than 0, offset from end)", + ], + }, + TableRow { + raw: "`hashes` _optional_ | string | Filter by hashes. Can contain multiple hashes separated by `\\|`", + columns: [ + "hashes _optional_", + "string", + "Filter by hashes. Can contain multiple hashes separated by \\", + "", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "/api/v2/torrents/info?filter=downloading&category=sample%20category&sort=ratio", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios- see JSON below", + columns: [ + "200", + "All scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON array with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "---------------------|---------|------------", + rows: [ + TableRow { + raw: "`added_on` | integer | Time (Unix Epoch) when the torrent was added to the client", + columns: [ + "added_on", + "integer", + "Time (Unix Epoch) when the torrent was added to the client", + ], + }, + TableRow { + raw: "`amount_left` | integer | Amount of data left to download (bytes)", + columns: [ + "amount_left", + "integer", + "Amount of data left to download (bytes)", + ], + }, + TableRow { + raw: "`auto_tmm` | bool | Whether this torrent is managed by Automatic Torrent Management", + columns: [ + "auto_tmm", + "bool", + "Whether this torrent is managed by Automatic Torrent Management", + ], + }, + TableRow { + raw: "`availability` | float | Percentage of file pieces currently available", + columns: [ + "availability", + "float", + "Percentage of file pieces currently available", + ], + }, + TableRow { + raw: "`category` | string | Category of the torrent", + columns: [ + "category", + "string", + "Category of the torrent", + ], + }, + TableRow { + raw: "`completed` | integer | Amount of transfer data completed (bytes)", + columns: [ + "completed", + "integer", + "Amount of transfer data completed (bytes)", + ], + }, + TableRow { + raw: "`completion_on` | integer | Time (Unix Epoch) when the torrent completed", + columns: [ + "completion_on", + "integer", + "Time (Unix Epoch) when the torrent completed", + ], + }, + TableRow { + raw: "`content_path` | string | Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)", + columns: [ + "content_path", + "string", + "Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents)", + ], + }, + TableRow { + raw: "`dl_limit` | integer | Torrent download speed limit (bytes/s). `-1` if ulimited.", + columns: [ + "dl_limit", + "integer", + "Torrent download speed limit (bytes/s). -1 if ulimited.", + ], + }, + TableRow { + raw: "`dlspeed` | integer | Torrent download speed (bytes/s)", + columns: [ + "dlspeed", + "integer", + "Torrent download speed (bytes/s)", + ], + }, + TableRow { + raw: "`downloaded` | integer | Amount of data downloaded", + columns: [ + "downloaded", + "integer", + "Amount of data downloaded", + ], + }, + TableRow { + raw: "`downloaded_session` | integer | Amount of data downloaded this session", + columns: [ + "downloaded_session", + "integer", + "Amount of data downloaded this session", + ], + }, + TableRow { + raw: "`eta` | integer | Torrent ETA (seconds)", + columns: [ + "eta", + "integer", + "Torrent ETA (seconds)", + ], + }, + TableRow { + raw: "`f_l_piece_prio` | bool | True if first last piece are prioritized", + columns: [ + "f_l_piece_prio", + "bool", + "True if first last piece are prioritized", + ], + }, + TableRow { + raw: "`force_start` | bool | True if force start is enabled for this torrent", + columns: [ + "force_start", + "bool", + "True if force start is enabled for this torrent", + ], + }, + TableRow { + raw: "`hash` | string | Torrent hash", + columns: [ + "hash", + "string", + "Torrent hash", + ], + }, + TableRow { + raw: "`last_activity` | integer | Last time (Unix Epoch) when a chunk was downloaded/uploaded", + columns: [ + "last_activity", + "integer", + "Last time (Unix Epoch) when a chunk was downloaded/uploaded", + ], + }, + TableRow { + raw: "`magnet_uri` | string | Magnet URI corresponding to this torrent", + columns: [ + "magnet_uri", + "string", + "Magnet URI corresponding to this torrent", + ], + }, + TableRow { + raw: "`max_ratio` | float | Maximum share ratio until torrent is stopped from seeding/uploading", + columns: [ + "max_ratio", + "float", + "Maximum share ratio until torrent is stopped from seeding/uploading", + ], + }, + TableRow { + raw: "`max_seeding_time` | integer | Maximum seeding time (seconds) until torrent is stopped from seeding", + columns: [ + "max_seeding_time", + "integer", + "Maximum seeding time (seconds) until torrent is stopped from seeding", + ], + }, + TableRow { + raw: "`name` | string | Torrent name", + columns: [ + "name", + "string", + "Torrent name", + ], + }, + TableRow { + raw: "`num_complete` | integer | Number of seeds in the swarm", + columns: [ + "num_complete", + "integer", + "Number of seeds in the swarm", + ], + }, + TableRow { + raw: "`num_incomplete` | integer | Number of leechers in the swarm", + columns: [ + "num_incomplete", + "integer", + "Number of leechers in the swarm", + ], + }, + TableRow { + raw: "`num_leechs` | integer | Number of leechers connected to", + columns: [ + "num_leechs", + "integer", + "Number of leechers connected to", + ], + }, + TableRow { + raw: "`num_seeds` | integer | Number of seeds connected to", + columns: [ + "num_seeds", + "integer", + "Number of seeds connected to", + ], + }, + TableRow { + raw: "`priority` | integer | Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode", + columns: [ + "priority", + "integer", + "Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode", + ], + }, + TableRow { + raw: "`progress` | float | Torrent progress (percentage/100)", + columns: [ + "progress", + "float", + "Torrent progress (percentage/100)", + ], + }, + TableRow { + raw: "`ratio` | float | Torrent share ratio. Max ratio value: 9999.", + columns: [ + "ratio", + "float", + "Torrent share ratio. Max ratio value: 9999.", + ], + }, + TableRow { + raw: "`ratio_limit` | float | TODO (what is different from `max_ratio`?)", + columns: [ + "ratio_limit", + "float", + "TODO (what is different from max_ratio?)", + ], + }, + TableRow { + raw: "`save_path` | string | Path where this torrent's data is stored", + columns: [ + "save_path", + "string", + "Path where this torrent's data is stored", + ], + }, + TableRow { + raw: "`seeding_time` | integer | Torrent elapsed time while complete (seconds)", + columns: [ + "seeding_time", + "integer", + "Torrent elapsed time while complete (seconds)", + ], + }, + TableRow { + raw: "`seeding_time_limit` | integer | TODO (what is different from `max_seeding_time`?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.", + columns: [ + "seeding_time_limit", + "integer", + "TODO (what is different from max_seeding_time?) seeding_time_limit is a per torrent setting, when Automatic Torrent Management is disabled, furthermore then max_seeding_time is set to seeding_time_limit for this torrent. If Automatic Torrent Management is enabled, the value is -2. And if max_seeding_time is unset it have a default value -1.", + ], + }, + TableRow { + raw: "`seen_complete` | integer | Time (Unix Epoch) when this torrent was last seen complete", + columns: [ + "seen_complete", + "integer", + "Time (Unix Epoch) when this torrent was last seen complete", + ], + }, + TableRow { + raw: "`seq_dl` | bool | True if sequential download is enabled", + columns: [ + "seq_dl", + "bool", + "True if sequential download is enabled", + ], + }, + TableRow { + raw: "`size` | integer | Total size (bytes) of files selected for download", + columns: [ + "size", + "integer", + "Total size (bytes) of files selected for download", + ], + }, + TableRow { + raw: "`state` | string | Torrent state. See table here below for the possible values", + columns: [ + "state", + "string", + "Torrent state. See table here below for the possible values", + ], + }, + TableRow { + raw: "`super_seeding` | bool | True if super seeding is enabled", + columns: [ + "super_seeding", + "bool", + "True if super seeding is enabled", + ], + }, + TableRow { + raw: "`tags` | string | Comma-concatenated tag list of the torrent", + columns: [ + "tags", + "string", + "Comma-concatenated tag list of the torrent", + ], + }, + TableRow { + raw: "`time_active` | integer | Total active time (seconds)", + columns: [ + "time_active", + "integer", + "Total active time (seconds)", + ], + }, + TableRow { + raw: "`total_size` | integer | Total size (bytes) of all file in this torrent (including unselected ones)", + columns: [ + "total_size", + "integer", + "Total size (bytes) of all file in this torrent (including unselected ones)", + ], + }, + TableRow { + raw: "`tracker` | string | The first tracker with working status. Returns empty string if no tracker is working.", + columns: [ + "tracker", + "string", + "The first tracker with working status. Returns empty string if no tracker is working.", + ], + }, + TableRow { + raw: "`up_limit` | integer | Torrent upload speed limit (bytes/s). `-1` if ulimited.", + columns: [ + "up_limit", + "integer", + "Torrent upload speed limit (bytes/s). -1 if ulimited.", + ], + }, + TableRow { + raw: "`uploaded` | integer | Amount of data uploaded", + columns: [ + "uploaded", + "integer", + "Amount of data uploaded", + ], + }, + TableRow { + raw: "`uploaded_session` | integer | Amount of data uploaded this session", + columns: [ + "uploaded_session", + "integer", + "Amount of data uploaded this session", + ], + }, + TableRow { + raw: "`upspeed` | integer | Torrent upload speed (bytes/s)", + columns: [ + "upspeed", + "integer", + "Torrent upload speed (bytes/s)", + ], + }, + ], + }, + ), + Text( + "Possible values of `state`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "--------------|------------", + rows: [ + TableRow { + raw: "`error` | Some error occurred, applies to paused torrents", + columns: [ + "error", + "Some error occurred, applies to paused torrents", + ], + }, + TableRow { + raw: "`missingFiles`| Torrent data files is missing", + columns: [ + "missingFiles", + "Torrent data files is missing", + ], + }, + TableRow { + raw: "`uploading` | Torrent is being seeded and data is being transferred", + columns: [ + "uploading", + "Torrent is being seeded and data is being transferred", + ], + }, + TableRow { + raw: "`pausedUP` | Torrent is paused and has finished downloading", + columns: [ + "pausedUP", + "Torrent is paused and has finished downloading", + ], + }, + TableRow { + raw: "`queuedUP` | Queuing is enabled and torrent is queued for upload", + columns: [ + "queuedUP", + "Queuing is enabled and torrent is queued for upload", + ], + }, + TableRow { + raw: "`stalledUP` | Torrent is being seeded, but no connection were made", + columns: [ + "stalledUP", + "Torrent is being seeded, but no connection were made", + ], + }, + TableRow { + raw: "`checkingUP` | Torrent has finished downloading and is being checked", + columns: [ + "checkingUP", + "Torrent has finished downloading and is being checked", + ], + }, + TableRow { + raw: "`forcedUP` | Torrent is forced to uploading and ignore queue limit", + columns: [ + "forcedUP", + "Torrent is forced to uploading and ignore queue limit", + ], + }, + TableRow { + raw: "`allocating` | Torrent is allocating disk space for download", + columns: [ + "allocating", + "Torrent is allocating disk space for download", + ], + }, + TableRow { + raw: "`downloading` | Torrent is being downloaded and data is being transferred", + columns: [ + "downloading", + "Torrent is being downloaded and data is being transferred", + ], + }, + TableRow { + raw: "`metaDL` | Torrent has just started downloading and is fetching metadata", + columns: [ + "metaDL", + "Torrent has just started downloading and is fetching metadata", + ], + }, + TableRow { + raw: "`pausedDL` | Torrent is paused and has NOT finished downloading", + columns: [ + "pausedDL", + "Torrent is paused and has NOT finished downloading", + ], + }, + TableRow { + raw: "`queuedDL` | Queuing is enabled and torrent is queued for download", + columns: [ + "queuedDL", + "Queuing is enabled and torrent is queued for download", + ], + }, + TableRow { + raw: "`stalledDL` | Torrent is being downloaded, but no connection were made", + columns: [ + "stalledDL", + "Torrent is being downloaded, but no connection were made", + ], + }, + TableRow { + raw: "`checkingDL` | Same as checkingUP, but torrent has NOT finished downloading", + columns: [ + "checkingDL", + "Same as checkingUP, but torrent has NOT finished downloading", + ], + }, + TableRow { + raw: "`forcedDL` | Torrent is forced to downloading to ignore queue limit", + columns: [ + "forcedDL", + "Torrent is forced to downloading to ignore queue limit", + ], + }, + TableRow { + raw: "`checkingResumeData`| Checking resume data on qBt startup", + columns: [ + "checkingResumeData", + "Checking resume data on qBt startup", + ], + }, + TableRow { + raw: "`moving` | Torrent is moving to another location", + columns: [ + "moving", + "Torrent is moving to another location", + ], + }, + TableRow { + raw: "`unknown` | Unknown status", + columns: [ + "unknown", + "Unknown status", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"dlspeed\":9681262,", + ), + Text( + " \"eta\":87,", + ), + Text( + " \"f_l_piece_prio\":false,", + ), + Text( + " \"force_start\":false,", + ), + Text( + " \"hash\":\"8c212779b4abde7c6bc608063a0d008b7e40ce32\",", + ), + Text( + " \"category\":\"\",", + ), + Text( + " \"tags\": \"\",", + ), + Text( + " \"name\":\"debian-8.1.0-amd64-CD-1.iso\",", + ), + Text( + " \"num_complete\":-1,", + ), + Text( + " \"num_incomplete\":-1,", + ), + Text( + " \"num_leechs\":2,", + ), + Text( + " \"num_seeds\":54,", + ), + Text( + " \"priority\":1,", + ), + Text( + " \"progress\":0.16108787059783936,", + ), + Text( + " \"ratio\":0,", + ), + Text( + " \"seq_dl\":false,", + ), + Text( + " \"size\":657457152,", + ), + Text( + " \"state\":\"downloading\",", + ), + Text( + " \"super_seeding\":false,", + ), + Text( + " \"upspeed\":0", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " another_torrent_info", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent generic properties", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `properties`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the generic properties of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the generic properties of", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is:", + ), + Text( + "", + ), + Text( + "- empty, if the torrent hash is invalid", + ), + Text( + "- otherwise, a JSON object with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "--------------------------|---------|------------", + rows: [ + TableRow { + raw: "`save_path` | string | Torrent save path", + columns: [ + "save_path", + "string", + "Torrent save path", + ], + }, + TableRow { + raw: "`creation_date` | integer | Torrent creation date (Unix timestamp)", + columns: [ + "creation_date", + "integer", + "Torrent creation date (Unix timestamp)", + ], + }, + TableRow { + raw: "`piece_size` | integer | Torrent piece size (bytes)", + columns: [ + "piece_size", + "integer", + "Torrent piece size (bytes)", + ], + }, + TableRow { + raw: "`comment` | string | Torrent comment", + columns: [ + "comment", + "string", + "Torrent comment", + ], + }, + TableRow { + raw: "`total_wasted` | integer | Total data wasted for torrent (bytes)", + columns: [ + "total_wasted", + "integer", + "Total data wasted for torrent (bytes)", + ], + }, + TableRow { + raw: "`total_uploaded` | integer | Total data uploaded for torrent (bytes)", + columns: [ + "total_uploaded", + "integer", + "Total data uploaded for torrent (bytes)", + ], + }, + TableRow { + raw: "`total_uploaded_session` | integer | Total data uploaded this session (bytes)", + columns: [ + "total_uploaded_session", + "integer", + "Total data uploaded this session (bytes)", + ], + }, + TableRow { + raw: "`total_downloaded` | integer | Total data downloaded for torrent (bytes)", + columns: [ + "total_downloaded", + "integer", + "Total data downloaded for torrent (bytes)", + ], + }, + TableRow { + raw: "`total_downloaded_session`| integer | Total data downloaded this session (bytes)", + columns: [ + "total_downloaded_session", + "integer", + "Total data downloaded this session (bytes)", + ], + }, + TableRow { + raw: "`up_limit` | integer | Torrent upload limit (bytes/s)", + columns: [ + "up_limit", + "integer", + "Torrent upload limit (bytes/s)", + ], + }, + TableRow { + raw: "`dl_limit` | integer | Torrent download limit (bytes/s)", + columns: [ + "dl_limit", + "integer", + "Torrent download limit (bytes/s)", + ], + }, + TableRow { + raw: "`time_elapsed` | integer | Torrent elapsed time (seconds)", + columns: [ + "time_elapsed", + "integer", + "Torrent elapsed time (seconds)", + ], + }, + TableRow { + raw: "`seeding_time` | integer | Torrent elapsed time while complete (seconds)", + columns: [ + "seeding_time", + "integer", + "Torrent elapsed time while complete (seconds)", + ], + }, + TableRow { + raw: "`nb_connections` | integer | Torrent connection count", + columns: [ + "nb_connections", + "integer", + "Torrent connection count", + ], + }, + TableRow { + raw: "`nb_connections_limit` | integer | Torrent connection count limit", + columns: [ + "nb_connections_limit", + "integer", + "Torrent connection count limit", + ], + }, + TableRow { + raw: "`share_ratio` | float | Torrent share ratio", + columns: [ + "share_ratio", + "float", + "Torrent share ratio", + ], + }, + TableRow { + raw: "`addition_date` | integer | When this torrent was added (unix timestamp)", + columns: [ + "addition_date", + "integer", + "When this torrent was added (unix timestamp)", + ], + }, + TableRow { + raw: "`completion_date` | integer | Torrent completion date (unix timestamp)", + columns: [ + "completion_date", + "integer", + "Torrent completion date (unix timestamp)", + ], + }, + TableRow { + raw: "`created_by` | string | Torrent creator", + columns: [ + "created_by", + "string", + "Torrent creator", + ], + }, + TableRow { + raw: "`dl_speed_avg` | integer | Torrent average download speed (bytes/second)", + columns: [ + "dl_speed_avg", + "integer", + "Torrent average download speed (bytes/second)", + ], + }, + TableRow { + raw: "`dl_speed` | integer | Torrent download speed (bytes/second)", + columns: [ + "dl_speed", + "integer", + "Torrent download speed (bytes/second)", + ], + }, + TableRow { + raw: "`eta` | integer | Torrent ETA (seconds)", + columns: [ + "eta", + "integer", + "Torrent ETA (seconds)", + ], + }, + TableRow { + raw: "`last_seen` | integer | Last seen complete date (unix timestamp)", + columns: [ + "last_seen", + "integer", + "Last seen complete date (unix timestamp)", + ], + }, + TableRow { + raw: "`peers` | integer | Number of peers connected to", + columns: [ + "peers", + "integer", + "Number of peers connected to", + ], + }, + TableRow { + raw: "`peers_total` | integer | Number of peers in the swarm", + columns: [ + "peers_total", + "integer", + "Number of peers in the swarm", + ], + }, + TableRow { + raw: "`pieces_have` | integer | Number of pieces owned", + columns: [ + "pieces_have", + "integer", + "Number of pieces owned", + ], + }, + TableRow { + raw: "`pieces_num` | integer | Number of pieces of the torrent", + columns: [ + "pieces_num", + "integer", + "Number of pieces of the torrent", + ], + }, + TableRow { + raw: "`reannounce` | integer | Number of seconds until the next announce", + columns: [ + "reannounce", + "integer", + "Number of seconds until the next announce", + ], + }, + TableRow { + raw: "`seeds` | integer | Number of seeds connected to", + columns: [ + "seeds", + "integer", + "Number of seeds connected to", + ], + }, + TableRow { + raw: "`seeds_total` | integer | Number of seeds in the swarm", + columns: [ + "seeds_total", + "integer", + "Number of seeds in the swarm", + ], + }, + TableRow { + raw: "`total_size` | integer | Torrent total size (bytes)", + columns: [ + "total_size", + "integer", + "Torrent total size (bytes)", + ], + }, + TableRow { + raw: "`up_speed_avg` | integer | Torrent average upload speed (bytes/second)", + columns: [ + "up_speed_avg", + "integer", + "Torrent average upload speed (bytes/second)", + ], + }, + TableRow { + raw: "`up_speed` | integer | Torrent upload speed (bytes/second)", + columns: [ + "up_speed", + "integer", + "Torrent upload speed (bytes/second)", + ], + }, + ], + }, + ), + Text( + "NB: `-1` is returned if the type of the property is integer but its value is not known.", + ), + Text( + "", + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"addition_date\":1438429165,", + ), + Text( + " \"comment\":\"\\\"Debian CD from cdimage.debian.org\\\"\",", + ), + Text( + " \"completion_date\":1438429234,", + ), + Text( + " \"created_by\":\"\",", + ), + Text( + " \"creation_date\":1433605214,", + ), + Text( + " \"dl_limit\":-1,", + ), + Text( + " \"dl_speed\":0,", + ), + Text( + " \"dl_speed_avg\":9736015,", + ), + Text( + " \"eta\":8640000,", + ), + Text( + " \"last_seen\":1438430354,", + ), + Text( + " \"nb_connections\":3,", + ), + Text( + " \"nb_connections_limit\":250,", + ), + Text( + " \"peers\":1,", + ), + Text( + " \"peers_total\":89,", + ), + Text( + " \"piece_size\":524288,", + ), + Text( + " \"pieces_have\":1254,", + ), + Text( + " \"pieces_num\":1254,", + ), + Text( + " \"reannounce\":672,", + ), + Text( + " \"save_path\":\"/Downloads/debian-8.1.0-amd64-CD-1.iso\",", + ), + Text( + " \"seeding_time\":1128,", + ), + Text( + " \"seeds\":1,", + ), + Text( + " \"seeds_total\":254,", + ), + Text( + " \"share_ratio\":0.00072121022562178299,", + ), + Text( + " \"time_elapsed\":1197,", + ), + Text( + " \"total_downloaded\":681521119,", + ), + Text( + " \"total_downloaded_session\":681521119,", + ), + Text( + " \"total_size\":657457152,", + ), + Text( + " \"total_uploaded\":491520,", + ), + Text( + " \"total_uploaded_session\":491520,", + ), + Text( + " \"total_wasted\":23481724,", + ), + Text( + " \"up_limit\":-1,", + ), + Text( + " \"up_speed\":0,", + ), + Text( + " \"up_speed_avg\":410", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent trackers", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `trackers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the trackers of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the trackers of", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON array, where each element contains info about one tracker, with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "-----------------|----------|-------------", + rows: [ + TableRow { + raw: "`url` | string | Tracker url", + columns: [ + "url", + "string", + "Tracker url", + ], + }, + TableRow { + raw: "`status` | integer | Tracker status. See the table below for possible values", + columns: [ + "status", + "integer", + "Tracker status. See the table below for possible values", + ], + }, + TableRow { + raw: "`tier` | integer | Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when `>= 0`, `< 0` is used as placeholder when `tier` does not exist for special entries (such as DHT).", + columns: [ + "tier", + "integer", + "Tracker priority tier. Lower tier trackers are tried before higher tiers. Tier numbers are valid when >= 0, < 0 is used as placeholder when tier does not exist for special entries (such as DHT).", + ], + }, + TableRow { + raw: "`num_peers` | integer | Number of peers for current torrent, as reported by the tracker", + columns: [ + "num_peers", + "integer", + "Number of peers for current torrent, as reported by the tracker", + ], + }, + TableRow { + raw: "`num_seeds` | integer | Number of seeds for current torrent, asreported by the tracker", + columns: [ + "num_seeds", + "integer", + "Number of seeds for current torrent, asreported by the tracker", + ], + }, + TableRow { + raw: "`num_leeches` | integer | Number of leeches for current torrent, as reported by the tracker", + columns: [ + "num_leeches", + "integer", + "Number of leeches for current torrent, as reported by the tracker", + ], + }, + TableRow { + raw: "`num_downloaded` | integer | Number of completed downlods for current torrent, as reported by the tracker", + columns: [ + "num_downloaded", + "integer", + "Number of completed downlods for current torrent, as reported by the tracker", + ], + }, + TableRow { + raw: "`msg` | string | Tracker message (there is no way of knowing what this message is - it's up to tracker admins)", + columns: [ + "msg", + "string", + "Tracker message (there is no way of knowing what this message is - it's up to tracker admins)", + ], + }, + ], + }, + ), + Text( + "Possible values of `status`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-------|------------", + rows: [ + TableRow { + raw: "0 | Tracker is disabled (used for DHT, PeX, and LSD)", + columns: [ + "0", + "Tracker is disabled (used for DHT, PeX, and LSD)", + ], + }, + TableRow { + raw: "1 | Tracker has not been contacted yet", + columns: [ + "1", + "Tracker has not been contacted yet", + ], + }, + TableRow { + raw: "2 | Tracker has been contacted and is working", + columns: [ + "2", + "Tracker has been contacted and is working", + ], + }, + TableRow { + raw: "3 | Tracker is updating", + columns: [ + "3", + "Tracker is updating", + ], + }, + TableRow { + raw: "4 | Tracker has been contacted, but it is not working (or doesn't send proper replies)", + columns: [ + "4", + "Tracker has been contacted, but it is not working (or doesn't send proper replies)", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"msg\":\"\",", + ), + Text( + " \"num_peers\":100,", + ), + Text( + " \"status\":2,", + ), + Text( + " \"url\":\"http://bttracker.debian.org:6969/announce\"", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " another_tracker_info", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent web seeds", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `webseeds`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the webseeds of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the webseeds of", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON array, where each element is information about one webseed, with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "--------------|----------|------------", + rows: [ + TableRow { + raw: "`url` | string | URL of the web seed", + columns: [ + "url", + "string", + "URL of the web seed", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"url\":\"http://some_url/\"", + ), + Text( + " },", + ), + Text( + " {", + ), + Text( + " \"url\":\"http://some_other_url/\"", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent contents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `files`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the contents of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the contents of", + ], + }, + TableRow { + raw: "`indexes` _optional_ since 2.8.2 | string | The indexes of the files you want to retrieve. `indexes` can contain multiple values separated by `\\|`.", + columns: [ + "indexes _optional_ since 2.8.2", + "string", + "The indexes of the files you want to retrieve. indexes can contain multiple values separated by \\", + ".", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is:", + ), + Text( + "", + ), + Text( + "- empty, if the torrent hash is invalid", + ), + Text( + "- otherwise, a JSON array, where each element contains info about one file, with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "---------------|---------------|-------------", + rows: [ + TableRow { + raw: "`index` since 2.8.2 | integer | File index", + columns: [ + "index since 2.8.2", + "integer", + "File index", + ], + }, + TableRow { + raw: "`name` | string | File name (including relative path)", + columns: [ + "name", + "string", + "File name (including relative path)", + ], + }, + TableRow { + raw: "`size` | integer | File size (bytes)", + columns: [ + "size", + "integer", + "File size (bytes)", + ], + }, + TableRow { + raw: "`progress` | float | File progress (percentage/100)", + columns: [ + "progress", + "float", + "File progress (percentage/100)", + ], + }, + TableRow { + raw: "`priority` | integer | File priority. See possible values here below", + columns: [ + "priority", + "integer", + "File priority. See possible values here below", + ], + }, + TableRow { + raw: "`is_seed` | bool | True if file is seeding/complete", + columns: [ + "is_seed", + "bool", + "True if file is seeding/complete", + ], + }, + TableRow { + raw: "`piece_range` | integer array | The first number is the starting piece index and the second number is the ending piece index (inclusive)", + columns: [ + "piece_range", + "integer array", + "The first number is the starting piece index and the second number is the ending piece index (inclusive)", + ], + }, + TableRow { + raw: "`availability` | float | Percentage of file pieces currently available (percentage/100)", + columns: [ + "availability", + "float", + "Percentage of file pieces currently available (percentage/100)", + ], + }, + ], + }, + ), + Text( + "Possible values of `priority`:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-----------|------------", + rows: [ + TableRow { + raw: "`0` | Do not download", + columns: [ + "0", + "Do not download", + ], + }, + TableRow { + raw: "`1` | Normal priority", + columns: [ + "1", + "Normal priority", + ], + }, + TableRow { + raw: "`6` | High priority", + columns: [ + "6", + "High priority", + ], + }, + TableRow { + raw: "`7` | Maximal priority", + columns: [ + "7", + "Maximal priority", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"index\":0,", + ), + Text( + " \"is_seed\":false,", + ), + Text( + " \"name\":\"debian-8.1.0-amd64-CD-1.iso\",", + ), + Text( + " \"piece_range\":[0,1253],", + ), + Text( + " \"priority\":1,", + ), + Text( + " \"progress\":0,", + ), + Text( + " \"size\":657457152,", + ), + Text( + " \"availability\":0.5,", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent pieces' states", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `pieceStates`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the pieces' states of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the pieces' states of", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is:", + ), + Text( + "", + ), + Text( + "- empty, if the torrent hash is invalid", + ), + Text( + "- otherwise, an array of states (integers) of all pieces (in order) of a specific torrent.", + ), + Text( + "", + ), + Text( + "Value meanings are defined as below:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Value | Description", + columns: [ + "Value", + "Description", + ], + }, + split: "-----------|------------", + rows: [ + TableRow { + raw: "`0` | Not downloaded yet", + columns: [ + "0", + "Not downloaded yet", + ], + }, + TableRow { + raw: "`1` | Now downloading", + columns: [ + "1", + "Now downloading", + ], + }, + TableRow { + raw: "`2` | Already downloaded", + columns: [ + "2", + "Already downloaded", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[0,0,2,1,0,0,2,1]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent pieces' hashes", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `pieceHashes`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------|--------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent you want to get the pieces' hashes of", + columns: [ + "hash", + "string", + "The hash of the torrent you want to get the pieces' hashes of", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is:", + ), + Text( + "", + ), + Text( + "- empty, if the torrent hash is invalid", + ), + Text( + "- otherwise, an array of hashes (strings) of all pieces (in order) of a specific torrent.", + ), + Text( + "", + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[\"54eddd830a5b58480a6143d616a97e3a6c23c439\",\"f8a99d225aa4241db100f88407fc3bdaead583ab\",\"928fb615b9bd4dd8f9e9022552c8f8f37ef76f58\"]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Pause torrents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `pause`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to pause. `hashes` can contain multiple hashes separated by `\\|`, to pause multiple torrents, or set to `all`, to pause all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to pause. hashes can contain multiple hashes separated by \\", + ", to pause multiple torrents, or set to all, to pause all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/pause?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/pause?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Resume torrents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `resume`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to resume. `hashes` can contain multiple hashes separated by `\\|`, to resume multiple torrents, or set to `all`, to resume all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to resume. hashes can contain multiple hashes separated by \\", + ", to resume multiple torrents, or set to all, to resume all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/resume?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/resume?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Delete torrents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `delete`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to delete. `hashes` can contain multiple hashes separated by `\\|`, to delete multiple torrents, or set to `all`, to delete all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to delete. hashes can contain multiple hashes separated by \\", + ", to delete multiple torrents, or set to all, to delete all torrents.", + ], + }, + TableRow { + raw: "`deleteFiles` | If set to `true`, the downloaded data will also be deleted, otherwise has no effect.", + columns: [ + "deleteFiles", + "If set to true, the downloaded data will also be deleted, otherwise has no effect.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "/api/v2/torrents/delete?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32&deleteFiles=false", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Recheck torrents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `recheck`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to recheck. `hashes` can contain multiple hashes separated by `\\|`, to recheck multiple torrents, or set to `all`, to recheck all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to recheck. hashes can contain multiple hashes separated by \\", + ", to recheck multiple torrents, or set to all, to recheck all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/recheck?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/recheck?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Reannounce torrents", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hashes. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `reannounce`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to reannounce. `hashes` can contain multiple hashes separated by `\\|`, to reannounce multiple torrents, or set to `all`, to reannounce all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to reannounce. hashes can contain multiple hashes separated by \\", + ", to reannounce multiple torrents, or set to all, to reannounce all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/reannounce?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/reannounce?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add new torrent", + ), + content: [ + Text( + "", + ), + Text( + "This method can add torrents from server local file or from URLs. `http://`, `https://`, `magnet:` and `bc://bt/` links are supported.", + ), + Text( + "", + ), + Text( + "Name: `add`", + ), + Text( + "", + ), + Text( + "Add torrent from URLs example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/add HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: multipart/form-data; boundary=---------------------------6688794727912", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"urls\"", + ), + Text( + "", + ), + Text( + "https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E7.torrent", + ), + Text( + "https://torcache.net/torrent/3B1A1469C180F447B77021074DBBCCAEF62611E8.torrent", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"savepath\"", + ), + Text( + "", + ), + Text( + "C:/Users/qBit/Downloads", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"cookie\"", + ), + Text( + "", + ), + Text( + "ui=28979218048197", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"category\"", + ), + Text( + "", + ), + Text( + "movies", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"skip_checking\"", + ), + Text( + "", + ), + Text( + "true", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"paused\"", + ), + Text( + "", + ), + Text( + "true", + ), + Text( + "-----------------------------6688794727912", + ), + Text( + "Content-Disposition: form-data; name=\"root_folder\"", + ), + Text( + "", + ), + Text( + "true", + ), + Text( + "-----------------------------6688794727912--", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "Add torrents from files example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/add HTTP/1.1", + ), + Text( + "Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "---------------------------acebdf13572468", + ), + Text( + "Content-Disposition: form-data; name=\"torrents\"; filename=\"8f18036b7a205c9347cb84a253975e12f7adddf2.torrent\"", + ), + Text( + "Content-Type: application/x-bittorrent", + ), + Text( + "", + ), + Text( + "file_binary_data_goes_here", + ), + Text( + "---------------------------acebdf13572468", + ), + Text( + "Content-Disposition: form-data; name=\"torrents\"; filename=\"UFS.torrent\"", + ), + Text( + "Content-Type: application/x-bittorrent", + ), + Text( + "", + ), + Text( + "file_binary_data_goes_here", + ), + Text( + "---------------------------acebdf13572468--", + ), + Text( + "", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "The above example will add two torrent files. `file_binary_data_goes_here` represents raw data of torrent file (basically a byte array).", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Property | Type | Description", + columns: [ + "Property", + "Type", + "Description", + ], + }, + split: "--------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`urls` | string | URLs separated with newlines", + columns: [ + "urls", + "string", + "URLs separated with newlines", + ], + }, + TableRow { + raw: "`torrents` | raw | Raw data of torrent file. `torrents` can be presented multiple times.", + columns: [ + "torrents", + "raw", + "Raw data of torrent file. torrents can be presented multiple times.", + ], + }, + TableRow { + raw: "`savepath` _optional_ | string | Download folder", + columns: [ + "savepath _optional_", + "string", + "Download folder", + ], + }, + TableRow { + raw: "`cookie` _optional_ | string | Cookie sent to download the .torrent file", + columns: [ + "cookie _optional_", + "string", + "Cookie sent to download the .torrent file", + ], + }, + TableRow { + raw: "`category` _optional_ | string | Category for the torrent", + columns: [ + "category _optional_", + "string", + "Category for the torrent", + ], + }, + TableRow { + raw: "`tags` _optional_ | string | Tags for the torrent, split by ','", + columns: [ + "tags _optional_", + "string", + "Tags for the torrent, split by ','", + ], + }, + TableRow { + raw: "`skip_checking` _optional_ | string | Skip hash checking. Possible values are `true`, `false` (default)", + columns: [ + "skip_checking _optional_", + "string", + "Skip hash checking. Possible values are true, false (default)", + ], + }, + TableRow { + raw: "`paused` _optional_ | string | Add torrents in the paused state. Possible values are `true`, `false` (default)", + columns: [ + "paused _optional_", + "string", + "Add torrents in the paused state. Possible values are true, false (default)", + ], + }, + TableRow { + raw: "`root_folder` _optional_ | string | Create the root folder. Possible values are `true`, `false`, unset (default)", + columns: [ + "root_folder _optional_", + "string", + "Create the root folder. Possible values are true, false, unset (default)", + ], + }, + TableRow { + raw: "`rename` _optional_ | string | Rename torrent", + columns: [ + "rename _optional_", + "string", + "Rename torrent", + ], + }, + TableRow { + raw: "`upLimit` _optional_ | integer | Set torrent upload speed limit. Unit in bytes/second", + columns: [ + "upLimit _optional_", + "integer", + "Set torrent upload speed limit. Unit in bytes/second", + ], + }, + TableRow { + raw: "`dlLimit` _optional_ | integer | Set torrent download speed limit. Unit in bytes/second", + columns: [ + "dlLimit _optional_", + "integer", + "Set torrent download speed limit. Unit in bytes/second", + ], + }, + TableRow { + raw: "`ratioLimit` _optional_ since 2.8.1 | float | Set torrent share ratio limit", + columns: [ + "ratioLimit _optional_ since 2.8.1", + "float", + "Set torrent share ratio limit", + ], + }, + TableRow { + raw: "`seedingTimeLimit` _optional_ since 2.8.1 | integer | Set torrent seeding time limit. Unit in seconds", + columns: [ + "seedingTimeLimit _optional_ since 2.8.1", + "integer", + "Set torrent seeding time limit. Unit in seconds", + ], + }, + TableRow { + raw: "`autoTMM` _optional_ | bool | Whether Automatic Torrent Management should be used", + columns: [ + "autoTMM _optional_", + "bool", + "Whether Automatic Torrent Management should be used", + ], + }, + TableRow { + raw: "`sequentialDownload` _optional_ | string | Enable sequential download. Possible values are `true`, `false` (default)", + columns: [ + "sequentialDownload _optional_", + "string", + "Enable sequential download. Possible values are true, false (default)", + ], + }, + TableRow { + raw: "`firstLastPiecePrio` _optional_ | string | Prioritize download first last piece. Possible values are `true`, `false` (default)", + columns: [ + "firstLastPiecePrio _optional_", + "string", + "Prioritize download first last piece. Possible values are true, false (default)", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "415 | Torrent file is not valid", + columns: [ + "415", + "Torrent file is not valid", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add trackers to torrent", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `addTrackers`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/addTrackers HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&urls=http://192.168.0.1/announce%0Audp://192.168.0.1:3333/dummyAnnounce", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "This adds two trackers to torrent with hash `8c212779b4abde7c6bc608063a0d008b7e40ce32`. Note `%0A` (aka LF newline) between trackers. Ampersand in tracker urls **MUST** be escaped.", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Edit trackers", + ), + content: [ + Text( + "", + ), + Text( + "Name: `editTracker`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent", + columns: [ + "hash", + "string", + "The hash of the torrent", + ], + }, + TableRow { + raw: "`origUrl` | string | The tracker URL you want to edit", + columns: [ + "origUrl", + "string", + "The tracker URL you want to edit", + ], + }, + TableRow { + raw: "`newUrl` | string | The new URL to replace the `origUrl`", + columns: [ + "newUrl", + "string", + "The new URL to replace the origUrl", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | `newUrl` is not a valid URL", + columns: [ + "400", + "newUrl is not a valid URL", + ], + }, + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "409 | `newUrl` already exists for the torrent", + columns: [ + "409", + "newUrl already exists for the torrent", + ], + }, + TableRow { + raw: "409 | `origUrl` was not found", + columns: [ + "409", + "origUrl was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Remove trackers", + ), + content: [ + Text( + "", + ), + Text( + "Name: `removeTrackers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent", + columns: [ + "hash", + "string", + "The hash of the torrent", + ], + }, + TableRow { + raw: "`urls` | string | URLs to remove, separated by `\\|`", + columns: [ + "urls", + "string", + "URLs to remove, separated by \\", + "", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "409 | All `urls` were not found", + columns: [ + "409", + "All urls were not found", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add peers", + ), + content: [ + Text( + "", + ), + Text( + "Name: `addPeers`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hash of the torrent, or multiple hashes separated by a pipe `\\|`", + columns: [ + "hashes", + "string", + "The hash of the torrent, or multiple hashes separated by a pipe \\", + "", + ], + }, + TableRow { + raw: "`peers` | string | The peer to add, or multiple peers separated by a pipe `\\|`. Each peer is a colon-separated `host:port`", + columns: [ + "peers", + "string", + "The peer to add, or multiple peers separated by a pipe \\", + ". Each peer is a colon-separated host:port", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | None of the supplied peers are valid", + columns: [ + "400", + "None of the supplied peers are valid", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Increase torrent priority", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `increasePrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to increase the priority of. `hashes` can contain multiple hashes separated by `\\|`, to increase the priority of multiple torrents, or set to `all`, to increase the priority of all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to increase the priority of. hashes can contain multiple hashes separated by \\", + ", to increase the priority of multiple torrents, or set to all, to increase the priority of all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/increasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/increasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Torrent queueing is not enabled", + columns: [ + "409", + "Torrent queueing is not enabled", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Decrease torrent priority", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `decreasePrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to decrease the priority of. `hashes` can contain multiple hashes separated by `\\|`, to decrease the priority of multiple torrents, or set to `all`, to decrease the priority of all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to decrease the priority of. hashes can contain multiple hashes separated by \\", + ", to decrease the priority of multiple torrents, or set to all, to decrease the priority of all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/decreasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/decreasePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Torrent queueing is not enabled", + columns: [ + "409", + "Torrent queueing is not enabled", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Maximal torrent priority", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `topPrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to set to the maximum priority. `hashes` can contain multiple hashes separated by `\\|`, to set multiple torrents to the maximum priority, or set to `all`, to set all torrents to the maximum priority.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to set to the maximum priority. hashes can contain multiple hashes separated by \\", + ", to set multiple torrents to the maximum priority, or set to all, to set all torrents to the maximum priority.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/topPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/topPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Torrent queueing is not enabled", + columns: [ + "409", + "Torrent queueing is not enabled", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Minimal torrent priority", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `bottomPrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to set to the minimum priority. `hashes` can contain multiple hashes separated by `\\|`, to set multiple torrents to the minimum priority, or set to `all`, to set all torrents to the minimum priority.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to set to the minimum priority. hashes can contain multiple hashes separated by \\", + ", to set multiple torrents to the minimum priority, or set to all, to set all torrents to the minimum priority.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/bottomPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/bottomPrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Torrent queueing is not enabled", + columns: [ + "409", + "Torrent queueing is not enabled", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set file priority", + ), + content: [ + Text( + "", + ), + Text( + "Name: `filePrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent", + columns: [ + "hash", + "string", + "The hash of the torrent", + ], + }, + TableRow { + raw: "`id` | string | File ids, separated by `\\|`", + columns: [ + "id", + "string", + "File ids, separated by \\", + "", + ], + }, + TableRow { + raw: "`priority` | number | File priority to set (consult [torrent contents API](#get-torrent-contents) for possible values)", + columns: [ + "priority", + "number", + "File priority to set (consult [torrent contents API](#get-torrent-contents) for possible values)", + ], + }, + ], + }, + ), + Text( + "`id` values correspond to file position inside the array returned by [torrent contents API](#get-torrent-contents), e.g. `id=0` for first file, `id=1` for second file, etc.", + ), + Text( + "", + ), + Text( + "Since 2.8.2 it is reccomended to use `index` field returned by [torrent contents API](#get-torrent-contents) (since the files can be filtered and the `index` value may differ from the position inside the response array).", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Priority is invalid", + columns: [ + "400", + "Priority is invalid", + ], + }, + TableRow { + raw: "400 | At least one file `id` is not a valid integer", + columns: [ + "400", + "At least one file id is not a valid integer", + ], + }, + TableRow { + raw: "404 | Torrent hash was not found", + columns: [ + "404", + "Torrent hash was not found", + ], + }, + TableRow { + raw: "409 | Torrent metadata hasn't downloaded yet", + columns: [ + "409", + "Torrent metadata hasn't downloaded yet", + ], + }, + TableRow { + raw: "409 | At least one file `id` was not found", + columns: [ + "409", + "At least one file id was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent download limit", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `downloadLimit`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/downloadLimit HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "", + rows: [], + }, + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "HTTP/1.1 200 OK", + ), + Text( + "content-type: application/json", + ), + Text( + "content-length: length", + ), + Text( + "", + ), + Text( + "{\"8c212779b4abde7c6bc608063a0d008b7e40ce32\":338944,\"284b83c9c7935002391129fd97f43db5d7cc2ba0\":123}", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent and `338944` its download speed limit in bytes per second; this value will be zero if no limit is applied.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent download limit", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setDownloadLimit HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`limit` is the download speed limit in bytes per second you want to set.", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent share limit", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setShareLimits`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setShareLimits HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&ratioLimit=1.0&seedingTimeLimit=60", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&ratioLimit=1.0&seedingTimeLimit=60", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`ratioLimit` is the max ratio the torrent should be seeded until. `-2` means the global limit should be used, `-1` means no limit.", + rows: [], + }, + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get torrent upload limit", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `uploadLimit`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/uploadLimit HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "", + rows: [], + }, + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "HTTP/1.1 200 OK", + ), + Text( + "content-type: application/json", + ), + Text( + "content-length: length", + ), + Text( + "", + ), + Text( + "{\"8c212779b4abde7c6bc608063a0d008b7e40ce32\":338944,\"284b83c9c7935002391129fd97f43db5d7cc2ba0\":123}", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "`8c212779b4abde7c6bc608063a0d008b7e40ce32` is the hash of the torrent in the request and `338944` its upload speed limit in bytes per second; this value will be zero if no limit is applied.", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent upload limit", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setUploadLimit`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setUploadLimit HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&limit=131072", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`limit` is the upload speed limit in bytes per second you want to set.", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent location", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setLocation`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setLocation HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&location=/mnt/nfs/media", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&location=/mnt/nfs/media", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`location` is the location to download the torrent to. If the location doesn't exist, the torrent's location is unchanged.", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Save path is empty", + columns: [ + "400", + "Save path is empty", + ], + }, + TableRow { + raw: "403 | User does not have write access to directory", + columns: [ + "403", + "User does not have write access to directory", + ], + }, + TableRow { + raw: "409 | Unable to create save path directory", + columns: [ + "409", + "Unable to create save path directory", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent name", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `rename`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/rename HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "hash=8c212779b4abde7c6bc608063a0d008b7e40ce32&name=This%20is%20a%20test", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Torrent hash is invalid", + columns: [ + "404", + "Torrent hash is invalid", + ], + }, + TableRow { + raw: "409 | Torrent name is empty", + columns: [ + "409", + "Torrent name is empty", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set torrent category", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setCategory`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setCategory HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&category=CategoryName", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&category=CategoryName", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "", + rows: [], + }, + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Category name does not exist", + columns: [ + "409", + "Category name does not exist", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get all categories", + ), + content: [ + Text( + "", + ), + Text( + "Name: `categories`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Text( + "Returns all categories in JSON format, e.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"Video\": {", + ), + Text( + " \"name\": \"Video\",", + ), + Text( + " \"savePath\": \"/home/user/torrents/video/\"", + ), + Text( + " },", + ), + Text( + " \"eBooks\": {", + ), + Text( + " \"name\": \"eBooks\",", + ), + Text( + " \"savePath\": \"/home/user/torrents/eBooks/\"", + ), + Text( + " }", + ), + Text( + "}", + ), + Text( + "```", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add new category", + ), + content: [ + Text( + "", + ), + Text( + "Name: `createCategory`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/createCategory HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "category=CategoryName&savePath=/path/to/dir", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "`category` is the category you want to create.", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Category name is empty", + columns: [ + "400", + "Category name is empty", + ], + }, + TableRow { + raw: "409 | Category name is invalid", + columns: [ + "409", + "Category name is invalid", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Edit category", + ), + content: [ + Text( + "", + ), + Text( + "Name: `editCategory`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/editCategory HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "category=CategoryName&savePath=/path/to/save/torrents/to", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Category name is empty", + columns: [ + "400", + "Category name is empty", + ], + }, + TableRow { + raw: "409 | Category editing failed", + columns: [ + "409", + "Category editing failed", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Remove categories", + ), + content: [ + Text( + "", + ), + Text( + "Name: `removeCategories`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/removeCategories HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "categories=Category1%0ACategory2", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "`categories` can contain multiple cateogies separated by `\\n` (%0A urlencoded)", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add torrent tags", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `addTags`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/addTags HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "", + rows: [], + }, + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Remove torrent tags", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `removeTags`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/removeTags HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&tags=TagName1,TagName2", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "", + rows: [], + }, + ), + Text( + "Empty list removes all tags from relevant torrents.", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get all tags", + ), + content: [ + Text( + "", + ), + Text( + "Name: `tags`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Text( + "None", + ), + Text( + "", + ), + Text( + "Returns all tags in JSON format, e.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " \"Tag 1\",", + ), + Text( + " \"Tag 2\"", + ), + Text( + "]", + ), + Text( + "```", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Create tags", + ), + content: [ + Text( + "", + ), + Text( + "Name: `createTags`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/createTags HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "tags=TagName1,TagName2", + ), + Text( + "```", + ), + Text( + "`tags` is a list of tags you want to create.", + ), + Text( + "Can contain multiple tags separated by `,`.", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Delete tags", + ), + content: [ + Text( + "", + ), + Text( + "Name: `deleteTags`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/deleteTags HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "tags=TagName1,TagName2", + ), + Text( + "```", + ), + Text( + "", + ), + Text( + "`tags` is a list of tags you want to delete.", + ), + Text( + "Can contain multiple tags separated by `,`.", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set automatic torrent management", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setAutoManagement`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setAutoManagement HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|284b83c9c7935002391129fd97f43db5d7cc2ba0&enable=true", + columns: [ + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "284b83c9c7935002391129fd97f43db5d7cc2ba0&enable=true", + ], + }, + split: "```", + rows: [], + }, + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`enable` is a boolean, affects the torrents listed in `hashes`, default is `false`", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Toggle sequential download", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `toggleSequentialDownload`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to toggle sequential download for. `hashes` can contain multiple hashes separated by `\\|`, to toggle sequential download for multiple torrents, or set to `all`, to toggle sequential download for all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to toggle sequential download for. hashes can contain multiple hashes separated by \\", + ", to toggle sequential download for multiple torrents, or set to all, to toggle sequential download for all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/toggleSequentialDownload?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/toggleSequentialDownload?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set first/last piece priority", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `toggleFirstLastPiecePrio`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "------------|----------|------------", + rows: [ + TableRow { + raw: "`hashes` | string | The hashes of the torrents you want to toggle the first/last piece priority for. `hashes` can contain multiple hashes separated by `\\|`, to toggle the first/last piece priority for multiple torrents, or set to `all`, to toggle the first/last piece priority for all torrents.", + columns: [ + "hashes", + "string", + "The hashes of the torrents you want to toggle the first/last piece priority for. hashes can contain multiple hashes separated by \\", + ", to toggle the first/last piece priority for multiple torrents, or set to all, to toggle the first/last piece priority for all torrents.", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```http", + ), + Table( + Table { + header: TableRow { + raw: "/api/v2/torrents/toggleFirstLastPiecePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32|54eddd830a5b58480a6143d616a97e3a6c23c439", + columns: [ + "/api/v2/torrents/toggleFirstLastPiecePrio?hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32", + "54eddd830a5b58480a6143d616a97e3a6c23c439", + ], + }, + split: "```", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set force start", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setForceStart`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setForceStart HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true", + ), + Text( + "```", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`value` is a boolean, affects the torrents listed in `hashes`, default is `false`", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set super seeding", + ), + content: [ + Text( + "", + ), + Text( + "Requires knowing the torrent hash. You can get it from [torrent list](#get-torrent-list).", + ), + Text( + "", + ), + Text( + "Name: `setSuperSeeding`", + ), + Text( + "", + ), + Text( + "```http", + ), + Text( + "POST /api/v2/torrents/setSuperSeeding HTTP/1.1", + ), + Text( + "User-Agent: Fiddler", + ), + Text( + "Host: 127.0.0.1", + ), + Text( + "Cookie: SID=your_sid", + ), + Text( + "Content-Type: application/x-www-form-urlencoded", + ), + Text( + "Content-Length: length", + ), + Text( + "", + ), + Text( + "hashes=8c212779b4abde7c6bc608063a0d008b7e40ce32?value=true", + ), + Text( + "```", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "`hashes` can contain multiple hashes separated by `|` or set to `all`", + columns: [ + "hashes can contain multiple hashes separated by", + "or set to all", + ], + }, + split: "`value` is a boolean, affects the torrents listed in `hashes`, default is `false`", + rows: [], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Rename file", + ), + content: [ + Text( + "", + ), + Text( + "Name: `renameFile`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|----------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent", + columns: [ + "hash", + "string", + "The hash of the torrent", + ], + }, + TableRow { + raw: "`oldPath` | string | The old path of the torrent", + columns: [ + "oldPath", + "string", + "The old path of the torrent", + ], + }, + TableRow { + raw: "`newPath` | string | The new path to use for the file", + columns: [ + "newPath", + "string", + "The new path to use for the file", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Missing `newPath` parameter", + columns: [ + "400", + "Missing newPath parameter", + ], + }, + TableRow { + raw: "409 | Invalid `newPath` or `oldPath`, or `newPath` already in use", + columns: [ + "409", + "Invalid newPath or oldPath, or newPath already in use", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Rename folder", + ), + content: [ + Text( + "", + ), + Text( + "Name: `renameFolder`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|----------|------------", + rows: [ + TableRow { + raw: "`hash` | string | The hash of the torrent", + columns: [ + "hash", + "string", + "The hash of the torrent", + ], + }, + TableRow { + raw: "`oldPath` | string | The old path of the torrent", + columns: [ + "oldPath", + "string", + "The old path of the torrent", + ], + }, + TableRow { + raw: "`newPath` | string | The new path to use for the file", + columns: [ + "newPath", + "string", + "The new path to use for the file", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "400 | Missing `newPath` parameter", + columns: [ + "400", + "Missing newPath parameter", + ], + }, + TableRow { + raw: "409 | Invalid `newPath` or `oldPath`, or `newPath` already in use", + columns: [ + "409", + "Invalid newPath or oldPath, or newPath already in use", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "RSS (experimental)", + ), + content: [ + Text( + "", + ), + Text( + "All RSS API methods are under \"rss\", e.g.: `/api/v2/rss/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Add folder", + ), + content: [ + Text( + "", + ), + Text( + "Name: `addFolder`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`path` | string | Full path of added folder (e.g. \"The Pirate Bay\\Top100\")", + columns: [ + "path", + "string", + "Full path of added folder (e.g. \"The Pirate Bay\\Top100\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Failure to add folder", + columns: [ + "409", + "Failure to add folder", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Add feed", + ), + content: [ + Text( + "", + ), + Text( + "Name: `addFeed`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`url` | string | URL of RSS feed (e.g. \"[http://thepiratebay.org/rss//top100/200](http://thepiratebay.org/rss//top100/200)\")", + columns: [ + "url", + "string", + "URL of RSS feed (e.g. \"[http://thepiratebay.org/rss//top100/200](http://thepiratebay.org/rss//top100/200)\")", + ], + }, + TableRow { + raw: "`path` _optional_ | string | Full path of added folder (e.g. \"The Pirate Bay\\Top100\\Video\")", + columns: [ + "path _optional_", + "string", + "Full path of added folder (e.g. \"The Pirate Bay\\Top100\\Video\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Failure to add feed", + columns: [ + "409", + "Failure to add feed", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Remove item", + ), + content: [ + Text( + "", + ), + Text( + "Removes folder or feed.", + ), + Text( + "", + ), + Text( + "Name: `removeItem`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`path` | string | Full path of removed item (e.g. \"The Pirate Bay\\Top100\")", + columns: [ + "path", + "string", + "Full path of removed item (e.g. \"The Pirate Bay\\Top100\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Failure to remove item", + columns: [ + "409", + "Failure to remove item", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Move item", + ), + content: [ + Text( + "", + ), + Text( + "Moves/renames folder or feed.", + ), + Text( + "", + ), + Text( + "Name: `moveItem`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`itemPath` | string | Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + columns: [ + "itemPath", + "string", + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ], + }, + TableRow { + raw: "`destPath` | string | New full path of item (e.g. \"The Pirate Bay\")", + columns: [ + "destPath", + "string", + "New full path of item (e.g. \"The Pirate Bay\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | Failure to move item", + columns: [ + "409", + "Failure to move item", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get all items", + ), + content: [ + Text( + "", + ), + Text( + "Name: `items`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`withData` _optional_ | bool | True if you need current feed articles", + columns: [ + "withData _optional_", + "bool", + "True if you need current feed articles", + ], + }, + ], + }, + ), + Text( + "Returns all RSS items in JSON format, e.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"HD-Torrents.org\": \"https://hd-torrents.org/rss.php\",", + ), + Text( + " \"PowerfulJRE\": \"https://www.youtube.com/feeds/videos.xml?channel_id=UCzQUP1qoWDoEbmsQxvdjxgQ\",", + ), + Text( + " \"The Pirate Bay\": {", + ), + Text( + " \"Audio\": \"https://thepiratebay.org/rss//top100/100\",", + ), + Text( + " \"Video\": \"https://thepiratebay.org/rss//top100/200\"", + ), + Text( + " }", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Mark as read", + ), + content: [ + Text( + "", + ), + Text( + "If `articleId` is provided only the article is marked as read otherwise the whole feed is going to be marked as read.", + ), + Text( + "", + ), + Text( + "Name: `markAsRead`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`itemPath` | string | Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + columns: [ + "itemPath", + "string", + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ], + }, + TableRow { + raw: "`articleId` _optional_ | string | ID of article", + columns: [ + "articleId _optional_", + "string", + "ID of article", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Refresh item", + ), + content: [ + Text( + "", + ), + Text( + "Refreshes folder or feed.", + ), + Text( + "", + ), + Text( + "Name: `refreshItem`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`itemPath` | string | Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + columns: [ + "itemPath", + "string", + "Current full path of item (e.g. \"The Pirate Bay\\Top100\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Set auto-downloading rule", + ), + content: [ + Text( + "", + ), + Text( + "Name: `setRule`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`ruleName` | string | Rule name (e.g. \"Punisher\")", + columns: [ + "ruleName", + "string", + "Rule name (e.g. \"Punisher\")", + ], + }, + TableRow { + raw: "`ruleDef` | string | JSON encoded rule definition", + columns: [ + "ruleDef", + "string", + "JSON encoded rule definition", + ], + }, + ], + }, + ), + Text( + "Rule definition is JSON encoded dictionary with the following fields:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Field | Type | Description", + columns: [ + "Field", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`enabled` | bool | Whether the rule is enabled", + columns: [ + "enabled", + "bool", + "Whether the rule is enabled", + ], + }, + TableRow { + raw: "`mustContain` | string | The substring that the torrent name must contain", + columns: [ + "mustContain", + "string", + "The substring that the torrent name must contain", + ], + }, + TableRow { + raw: "`mustNotContain` | string | The substring that the torrent name must not contain", + columns: [ + "mustNotContain", + "string", + "The substring that the torrent name must not contain", + ], + }, + TableRow { + raw: "`useRegex` | bool | Enable regex mode in \"mustContain\" and \"mustNotContain\"", + columns: [ + "useRegex", + "bool", + "Enable regex mode in \"mustContain\" and \"mustNotContain\"", + ], + }, + TableRow { + raw: "`episodeFilter` | string | Episode filter definition", + columns: [ + "episodeFilter", + "string", + "Episode filter definition", + ], + }, + TableRow { + raw: "`smartFilter` | bool | Enable smart episode filter", + columns: [ + "smartFilter", + "bool", + "Enable smart episode filter", + ], + }, + TableRow { + raw: "`previouslyMatchedEpisodes` | list | The list of episode IDs already matched by smart filter", + columns: [ + "previouslyMatchedEpisodes", + "list", + "The list of episode IDs already matched by smart filter", + ], + }, + TableRow { + raw: "`affectedFeeds` | list | The feed URLs the rule applied to", + columns: [ + "affectedFeeds", + "list", + "The feed URLs the rule applied to", + ], + }, + TableRow { + raw: "`ignoreDays` | number | Ignore sunsequent rule matches", + columns: [ + "ignoreDays", + "number", + "Ignore sunsequent rule matches", + ], + }, + TableRow { + raw: "`lastMatch` | string | The rule last match time", + columns: [ + "lastMatch", + "string", + "The rule last match time", + ], + }, + TableRow { + raw: "`addPaused` | bool | Add matched torrent in paused mode", + columns: [ + "addPaused", + "bool", + "Add matched torrent in paused mode", + ], + }, + TableRow { + raw: "`assignedCategory` | string | Assign category to the torrent", + columns: [ + "assignedCategory", + "string", + "Assign category to the torrent", + ], + }, + TableRow { + raw: "`savePath` | string | Save torrent to the given directory", + columns: [ + "savePath", + "string", + "Save torrent to the given directory", + ], + }, + ], + }, + ), + Text( + "E.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"enabled\": false,", + ), + Text( + " \"mustContain\": \"The *Punisher*\",", + ), + Text( + " \"mustNotContain\": \"\",", + ), + Text( + " \"useRegex\": false,", + ), + Text( + " \"episodeFilter\": \"1x01-;\",", + ), + Text( + " \"smartFilter\": false,", + ), + Text( + " \"previouslyMatchedEpisodes\": [", + ), + Text( + " ],", + ), + Text( + " \"affectedFeeds\": [", + ), + Text( + " \"http://showrss.info/user/134567.rss?magnets=true\"", + ), + Text( + " ],", + ), + Text( + " \"ignoreDays\": 0,", + ), + Text( + " \"lastMatch\": \"20 Nov 2017 09:05:11\",", + ), + Text( + " \"addPaused\": true,", + ), + Text( + " \"assignedCategory\": \"\",", + ), + Text( + " \"savePath\": \"C:/Users/JohnDoe/Downloads/Punisher\"", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Rename auto-downloading rule", + ), + content: [ + Text( + "", + ), + Text( + "Name: `renameRule`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`ruleName` | string | Rule name (e.g. \"Punisher\")", + columns: [ + "ruleName", + "string", + "Rule name (e.g. \"Punisher\")", + ], + }, + TableRow { + raw: "`newRuleName` | string | New rule name (e.g. \"The Punisher\")", + columns: [ + "newRuleName", + "string", + "New rule name (e.g. \"The Punisher\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Remove auto-downloading rule", + ), + content: [ + Text( + "", + ), + Text( + "Name: `removeRule`", + ), + Text( + "", + ), + Text( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`ruleName` | string | Rule name (e.g. \"Punisher\")", + columns: [ + "ruleName", + "string", + "Rule name (e.g. \"Punisher\")", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get all auto-downloading rules", + ), + content: [ + Text( + "", + ), + Text( + "Name: `rules`", + ), + Text( + "", + ), + Text( + "Returns all auto-downloading rules in JSON format, e.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"The Punisher\": {", + ), + Text( + " \"enabled\": false,", + ), + Text( + " \"mustContain\": \"The *Punisher*\",", + ), + Text( + " \"mustNotContain\": \"\",", + ), + Text( + " \"useRegex\": false,", + ), + Text( + " \"episodeFilter\": \"1x01-;\",", + ), + Text( + " \"smartFilter\": false,", + ), + Text( + " \"previouslyMatchedEpisodes\": [", + ), + Text( + " ],", + ), + Text( + " \"affectedFeeds\": [", + ), + Text( + " \"http://showrss.info/user/134567.rss?magnets=true\"", + ), + Text( + " ],", + ), + Text( + " \"ignoreDays\": 0,", + ), + Text( + " \"lastMatch\": \"20 Nov 2017 09:05:11\",", + ), + Text( + " \"addPaused\": true,", + ), + Text( + " \"assignedCategory\": \"\",", + ), + Text( + " \"savePath\": \"C:/Users/JohnDoe/Downloads/Punisher\"", + ), + Text( + " }", + ), + Text( + "}", + ), + Text( + "```", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get all articles matching a rule", + ), + content: [ + Text( + "", + ), + Text( + "Name: `matchingArticles`", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`ruleName` | string | Rule name (e.g. \"Linux\")", + columns: [ + "ruleName", + "string", + "Rule name (e.g. \"Linux\")", + ], + }, + ], + }, + ), + Text( + "", + ), + Text( + "Returns all articles that match a rule by feed name in JSON format, e.g.:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"DistroWatch\":[", + ), + Text( + " \"sparkylinux-5.11-i686-minimalgui.iso.torrent\",", + ), + Text( + " \"sparkylinux-5.11-x86_64-minimalgui.iso.torrent\",", + ), + Text( + " \"sparkylinux-5.11-i686-xfce.iso.torrent\",", + ), + Text( + " \"bluestar-linux-5.6.3-2020.04.09-x86_64.iso.torrent\",", + ), + Text( + " \"robolinux64-mate3d-v10.10.iso.torrent\",", + ), + Text( + " ],", + ), + Text( + " \"Linuxtracker\":[", + ), + Text( + " \"[Alpine Linux] alpine-extended-3.11.6\",", + ), + Text( + " \"[Alpine Linux] alpine-standard-3.11.6\",", + ), + Text( + " \"[Linuxfx] linuxfx10-wxs-lts-beta5.iso\",", + ), + Text( + " \"[Linux Lite] linux-lite-5.0-rc1-64bit.iso (MULTI)\",", + ), + Text( + " \"[Scientific Linux] SL-7.8-x86_64-Pack\",", + ), + Text( + " \"[NixOS] nixos-plasma5-20.03.1418.5272327b81e-x86_64-linux.iso\"", + ), + Text( + " ]", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "200 | All scenarios", + columns: [ + "200", + "All scenarios", + ], + }, + ], + }, + ), + Text( + "", + ), + ], + children: [], + }, + ], + }, + TokenTree { + title: Some( + "Search", + ), + content: [ + Text( + "", + ), + Text( + "All Search API methods are under \"search\", e.g.: `/api/v2/search/methodName`.", + ), + Text( + "", + ), + ], + children: [ + TokenTree { + title: Some( + "Start search", + ), + content: [ + Text( + "", + ), + Text( + "Name: `start`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`pattern` | string | Pattern to search for (e.g. \"Ubuntu 18.04\")", + columns: [ + "pattern", + "string", + "Pattern to search for (e.g. \"Ubuntu 18.04\")", + ], + }, + TableRow { + raw: "`plugins` | string | Plugins to use for searching (e.g. \"legittorrents\"). Supports multiple plugins separated by `\\|`. Also supports `all` and `enabled`", + columns: [ + "plugins", + "string", + "Plugins to use for searching (e.g. \"legittorrents\"). Supports multiple plugins separated by \\", + ". Also supports all and enabled", + ], + }, + TableRow { + raw: "`category` | string | Categories to limit your search to (e.g. \"legittorrents\"). Available categories depend on the specified `plugins`. Also supports `all`", + columns: [ + "category", + "string", + "Categories to limit your search to (e.g. \"legittorrents\"). Available categories depend on the specified plugins. Also supports all", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "409 | User has reached the limit of max `Running` searches (currently set to 5)", + columns: [ + "409", + "User has reached the limit of max Running searches (currently set to 5)", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Field | Type | Description", + columns: [ + "Field", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | number | ID of the search job", + columns: [ + "id", + "number", + "ID of the search job", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "{", + ), + Text( + " \"id\": 12345", + ), + Text( + "}", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Stop search", + ), + content: [ + Text( + "", + ), + Text( + "Name: `stop`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | number | ID of the search job", + columns: [ + "id", + "number", + "ID of the search job", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Search job was not found", + columns: [ + "404", + "Search job was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios", + columns: [ + "200", + "All other scenarios", + ], + }, + ], + }, + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get search status", + ), + content: [ + Text( + "", + ), + Text( + "Name: `status`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`id` _optional_ | number | ID of the search job. If not specified, all search jobs are returned", + columns: [ + "id _optional_", + "number", + "ID of the search job. If not specified, all search jobs are returned", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Search job was not found", + columns: [ + "404", + "Search job was not found", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON array of objects containing the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Field | Type | Description", + columns: [ + "Field", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | number | ID of the search job", + columns: [ + "id", + "number", + "ID of the search job", + ], + }, + TableRow { + raw: "`status` | string | Current status of the search job (either `Running` or `Stopped`)", + columns: [ + "status", + "string", + "Current status of the search job (either Running or Stopped)", + ], + }, + TableRow { + raw: "`total` | number | Total number of results. If the status is `Running` this number may contineu to increase", + columns: [ + "total", + "number", + "Total number of results. If the status is Running this number may contineu to increase", + ], + }, + ], + }, + ), + Text( + "Example:", + ), + Text( + "", + ), + Text( + "```JSON", + ), + Text( + "[", + ), + Text( + " {", + ), + Text( + " \"id\": 12345,", + ), + Text( + " \"status\": \"Running\",", + ), + Text( + " \"total\": 170", + ), + Text( + " }", + ), + Text( + "]", + ), + Text( + "```", + ), + Text( + "", + ), + ], + children: [], + }, + TokenTree { + title: Some( + "Get search results", + ), + content: [ + Text( + "", + ), + Text( + "Name: `results`", + ), + Text( + "", + ), + Asterix( + "Parameters:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Parameter | Type | Description", + columns: [ + "Parameter", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [ + TableRow { + raw: "`id` | number | ID of the search job", + columns: [ + "id", + "number", + "ID of the search job", + ], + }, + TableRow { + raw: "`limit` _optional_ | number | max number of results to return. 0 or negative means no limit", + columns: [ + "limit _optional_", + "number", + "max number of results to return. 0 or negative means no limit", + ], + }, + TableRow { + raw: "`offset` _optional_ | number | result to start at. A negative number means count backwards (e.g. `-2` returns the 2 most recent results)", + columns: [ + "offset _optional_", + "number", + "result to start at. A negative number means count backwards (e.g. -2 returns the 2 most recent results)", + ], + }, + ], + }, + ), + Asterix( + "Returns:", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "HTTP Status Code | Scenario", + columns: [ + "HTTP Status Code", + "Scenario", + ], + }, + split: "----------------------------------|---------------------", + rows: [ + TableRow { + raw: "404 | Search job was not found", + columns: [ + "404", + "Search job was not found", + ], + }, + TableRow { + raw: "409 | Offset is too large, or too small (e.g. absolute value of negative number is greater than # results)", + columns: [ + "409", + "Offset is too large, or too small (e.g. absolute value of negative number is greater than # results)", + ], + }, + TableRow { + raw: "200 | All other scenarios- see JSON below", + columns: [ + "200", + "All other scenarios- see JSON below", + ], + }, + ], + }, + ), + Text( + "The response is a JSON object with the following fields", + ), + Text( + "", + ), + Table( + Table { + header: TableRow { + raw: "Field | Type | Description", + columns: [ + "Field", + "Type", + "Description", + ], + }, + split: "----------------------------------|---------|------------", + rows: [], + }, + ), + ], + children: [], + }, + ], + }, + ], +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 5cac0f1..9b10725 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -use api_gen::QBittorrentApiGen; +use qbittorrent_web_api_gen::QBittorrentApiGen; #[derive(QBittorrentApiGen)] pub struct Api;