This document explains the configuration options found in data/example-config.py.
Upload Assistant loads configuration from data/config.py.
- Generate a config interactively:
- Run
python config-generator.pyfrom the repo root.
- Run
- Or create your config manually:
- Copy
data/example-config.pytodata/config.py - Edit
data/config.pywith your own values
- Copy
The config is a Python dict named config with these top-level sections:
DEFAULT: global behavior, metadata, screenshots, tool settings.IMAGES: static icon URLs used in some descriptions.TRACKERS: which trackers to upload to + per-tracker credentials/options.TORRENT_CLIENTS: qBittorrent/ruTorrent/etc client configuration.DISCORD: optional Discord bot integration.
Notes:
- Many numeric values are stored as strings (e.g.
"4","14000"). Keep the same type unless you know a specific option is numeric. - Tracker lists are usually a comma-separated string (e.g.
"MTV, BHD").
Upload Assistant is structured around a runtime meta dict.
At a high level:
data/config.pyis imported and read across the codebase.src/prep.pybuilds and normalizesmetafrom the input path + CLI args +configdefaults.- Tracker metadata is fetched via
src/get_tracker_data.py/src/trackermeta.pyand individual tracker modules undersrc/trackers/. - Screenshots are captured/optimized via
src/takescreens.py. - Descriptions are assembled via
src/get_desc.py(plus tracker-specific formatting overrides). - Torrents are created via
src/torrentcreate.pyand optionally injected into your client viasrc/clients.py.
Important gotchas:
- Some options are read at module import time (notably in
src/takescreens.py). If you editdata/config.pywhile Upload Assistant is running, you may need to restart the process for changes to take effect. - Many
DEFAULTvalues are copied intometaduring preparation, and later code readsmetarather than readingconfigagain. - Several settings can be overridden by CLI flags (or by
user-args.jsonoverrides when enabled).
update_notification(bool): Print a notice when an update is available.verbose_notification(bool): Print the changelog when an update is available.
tmdb_api(str, required): TMDb API key. Get it from https://www.themoviedb.org/settings/apibtn_api(str): BTN API key (used to fetch BTN details).
Order matters: img_host_1 is primary, later hosts are fallbacks.
img_host_1..img_host_5(str): Image host names. Valid examples includeimgbb,ptpimg,imgbox,pixhost,lensdump,ptscreens,onlyimage,dalexni,zipline,passtheimage,seedpool_cdn,utppm.
imgbb_api(str): API key for imgbb.ptpimg_api(str): API key for ptpimg.lensdump_api(str): API key for lensdump.ptscreens_api(str): API key for ptscreens.onlyimage_api(str): API key for onlyimage.dalexni_api(str): API key for dalexni.passtheima_ge_api(str): API key for passtheimage.zipline_url(str): Base URL for a Zipline instance.zipline_api_key(str): Zipline API key.seedpool_cdn_api(str): Seedpool CDN API key.
add_logo(bool): Add a TMDb logo image at the top of the description.logo_size(str): Logo size (example default:"300").logo_language(str): ISO 639-1 language code for logo selection (fallback to English).episode_overview(bool): Add episode overview text to description.
Implementation notes:
- These are primarily consumed by the description builders (for many trackers via
src/get_desc.py, and for some trackers via tracker-specific modules insrc/trackers/). logo_languageinfluences which TMDb logo is requested; if not available, English is used.add_logois a per-tracker overridable setting.episode_overviewis a per-tracker overridable setting.
screens(str): Number of screenshots to capture.cutoff_screens(str): If at least this many screenshots already exist (e.g. pulled from a description), skip capturing/uploading more.thumbnail_size(str): Thumbnail width for hosts that support[img=WIDTH](default"350").screens_per_row(str): Screenshots per row in description (only for some trackers).frame_overlay(bool): Overlay frame number/type and “Tonemapped” (if applicable) on screenshots.overlay_text_size(str): Overlay text size (scales with resolution).
Implementation notes:
- Screenshot capture/reuse logic is in
src/takescreens.py. In particular,cutoff_screensis used to decide whether existing images inmeta['image_list']are “enough” to skip taking new screenshots. thumbnail_sizeandscreens_per_rowaffect how screenshot BBCode is rendered in descriptions (seesrc/get_desc.py).frame_overlaytriggers extra probing work to collect frame information (slower), and can affect which tonemapping pipeline is used.
tone_map(bool): Tonemap HDR/DV+HDR screenshots.use_libplacebo(bool): Use libplacebo-based tonemapping when available.ffmpeg_is_good(bool): Skip compatibility check (assume your ffmpeg supports libplacebo).ffmpeg_warmup(bool): Skip “warming up” libplacebo.ffmpeg_compression(str): ffmpeg screenshot compression level (0–9).algorithm(str): Tonemap algorithm (e.g.mobius).desat(str): Tonemap desaturation value.tonemapped_header(str): BBCode header inserted above screenshots when tonemapping occurred.
Implementation notes:
- Tonemapping decisions happen in
src/takescreens.pybased onmeta['hdr']andtone_map. algorithm/desatare used for the non-libplacebo tonemap filter path.tonemapped_headeris inserted bysrc/get_desc.py(and is a per-tracker overridable setting).
process_limit(str): Max number of screenshot optimization processes.threads(str): Thread limit per process during image optimization.ffmpeg_limit(bool): Limit CPU usage when running ffmpeg.
Implementation notes:
- These are most visible during screenshot capture/optimization (
src/takescreens.py). Lower them on shared/limited systems.
multiScreens(str): Screenshots per disc/episode when uploading packs to supported sites.pack_thumb_size(str): Thumbnail width for pack screenshots.charLimit(str): UNIT3D season-pack description character limit cutoff.fileLimit(str): Files to include before grouping additional files into spoiler blocks.processLimit(str): Absolute limit on processed files in packs.
Implementation notes:
- Pack description assembly and character limits are enforced in
src/get_desc.py. charLimitexists because some UNIT3D sites have strict description length limits.
These can be overridden per-tracker by adding the same key inside that tracker’s config block.
custom_description_header(str): BBCode header added at top of description section.screenshot_header(str): BBCode header added above screenshots.disc_menu_header(str): BBCode header added above disc menu screenshots (discs only).custom_signature(str): BBCode signature appended at bottom of description.
default_torrent_client(str): Name of the client config to use (matches a key underTORRENT_CLIENTS, e.g."qbittorrent").skip_auto_torrent(bool): Skip automated torrent searching in your qBitTorrent client.
Implementation notes:
- Client injection/search behavior is centralized in
src/clients.py. skip_auto_torrentaffects whether Upload Assistant tries to find matching torrents in your client for reuse/dupe checking.
sfx_on_prompt(bool): Play a bell sound effect when asking for confirmation.tracker_pass_checks(str): Minimum number of trackers that must pass checks to continue upload.use_largest_playlist(bool): Always use the largest Blu-ray playlist without prompting.keep_images(bool): If false, do not pull images from tracker descriptions.only_id(bool): Only grab IDs from trackers (skip description parsing).
Implementation notes:
tracker_pass_checksis used to determine how many trackers must pass early validation before continuing (seeupload.py).only_idandkeep_imagesinfluence how much another tracker description is scraped/merged. The optons are independent.
-
use_sonarr(bool): Enable Sonarr searching. -
sonarr_url(str): Sonarr base URL. -
sonarr_api_key(str): Sonarr API key. -
sonarr_url_1/sonarr_api_key_1(str): Optional second Sonarr instance. -
use_radarr(bool): Enable Radarr searching. -
radarr_url(str): Radarr base URL. -
radarr_api_key(str): Radarr API key. -
radarr_url_1/radarr_api_key_1(str): Optional second Radarr instance.
mkbrr(bool): Use mkbrr for torrent creation.mkbrr_threads(str): Worker thread count for hashing ("0" = auto).
Implementation notes:
mkbrr/mkbrr_threadsare copied intometaduring prep (src/prep.py) and applied during torrent creation (src/torrentcreate.py).- If mkbrr fails, Upload Assistant falls back to the internal
torftorrent builder.
user_overrides(bool): Use argument overrides fromdata/templates/user-args.json.
Implementation notes:
- When enabled, overrides are loaded and applied in
src/apply_overrides.py. - Overrides are matched primarily by TMDb ID (and optionally by “other IDs” like IMDb/TVDb), then translated into the same internal
metaflags used by CLI args. - Read the notes at the top of the example overrides.
ping_unit3d(bool): Try to infer region/distributor IDs from existing torrents and Unit3D sites.get_bluray_info(bool): Fetch disc metadata from bluray.com (requires IMDb ID).add_bluray_link(bool): Add bluray.com link to description (requiresget_bluray_info).use_bluray_images(bool): Add bluray.com cover/back/slip images to description (requiresget_bluray_info).bluray_image_size(str): Width for bluray.com cover images.bluray_score(float): Minimum score to consider bluray.com release a match.bluray_single_score(float): Relaxed score threshold if only one bluray.com release exists.
Implementation notes:
ping_unit3dis used for BDMV discs insrc/prep.pyand callsping_unit3dinsrc/get_tracker_data.pyto try and fill in missing region/distributor details.- bluray.com integration is orchestrated from
src/prep.pyand implemented insrc/bluray_com.py;bluray_scorethresholds decide whether an auto-match is accepted.
keep_meta(bool): Do not delete existingmeta.jsonbefore running (NOT recommended).show_upload_duration(bool): Print how long each tracker upload took.print_tracker_messages(bool): Print tracker API messages returned during upload.print_tracker_links(bool): Print direct torrent links after upload.inject_delay(int): Delay (in seconds) before injecting the torrent to allow the tracker to register the hash and avoid 'unregistered torrent' errors.
Implementation notes:
inject_delayis a per-tracker overridable setting.
emby_dir(str | None): Directory for Emby movie linking (enables linking when set).emby_tv_dir(str | None): Directory for Emby TV linking.
Implementation notes:
- Emby NFO/link behavior is implemented in
src/nfo_link.py. - These options are only used when Emby mode is enabled (via CLI flags); setting these paths alone does not automatically enable Emby mode.
search_requests(bool): Search for matching requests on supported trackers.check_predb(bool): Also search predb for scene releases.prefer_max_16_torrent(bool): Prefer torrents with piece size <= 16 MiB when searching existing torrents.cross_seeding(bool): Enable cross-seed suitable torrents found during dupe checking.cross_seed_check_everything(bool): Cross-seed check all configured trackers even if not selected.
Implementation notes:
- Request searching is implemented per-tracker (for example, several tracker modules check
search_requestsbefore running request queries). check_predbis used by the scene-name logic (src/is_scene.py) as a fallback when SRRDB does not find a match.prefer_max_16_torrentaffects how existing torrents are chosen from your client (src/clients.py).
Static icon images used in some description layouts (notably AR DB link icons):
imdb_75,tmdb_75,tvdb_75,tvmaze_75,mal_75
A comma-separated list of tracker acronyms to upload to by default.
Example:
"default_trackers": "MTV, BHD, AITHER"Each tracker acronym (e.g. "AITHER", "BLU") contains a dict of settings.
Common keys you will see:
link_dir_name(str): Custom folder name used when linking content (instead of the acronym).useAPI(bool): Enable tracker API usage for automatic ID searching/description parsing (some trackers only).api_key(str): Tracker API key (UNIT3D-style trackers commonly use this).announce_url(str): Tracker announce URL (often contains<PASSKEY>placeholders).anon(bool): Upload anonymously when supported.modq(bool): Send uploads to moderator queue when supported.draft/draft_default(bool/str): Save to drafts when supported.
Implementation notes:
- If the exmaple-config does not contain the option for a tracker, then the tracker does not support that specific config option.
Some trackers authenticate via cookies instead of an API key.
If comments in example-config.py mention cookies, they are typically expected as a Netscape cookie file in:
data/cookies/<TRACKER>.txt
filebrowser(str): If set, use your own Filebrowser link instead of uploading a file to uguu.se for manual uploads.
This section defines one or more torrent clients. The name of each client block is referenced elsewhere (for example by DEFAULT.default_torrent_client).
- "qbittorrent" is an example of a torrent client name.
- IMPORTANT: do not change the torrent_client attribute, for example
"torrent_client": "rtorrent",or"torrent_client": "qbit",
Security note: these settings can allow the app (and the Web UI) to interact with your torrent client. Do not expose your client’s Web UI to the public internet.
Typical keys:
qui_proxy_url(str): Optional. QUI reverse proxy URL for qBittorrent. Create a Client Proxy API Key in QUI (Settings → Client Proxy Keys): name the client (e.g. "Upload Assistant"), choose the qBittorrent instance, then copy the generated proxy URL. Use the full URL, e.g.http://localhost:7476/proxy/<client-api-key>. The instance is fixed by the key you create. When set,qbit_url/qbit_port/qbit_user/qbit_passare not used.enable_search(bool): Search client for existing torrents to reuse hashes. NOTE: independant of auto_torrent_searchingqbit_url/qbit_port(str): Web UI host/port.qbit_user/qbit_pass(str): Credentials.super_seed_trackers(list[str]): Trackers to enable super-seeding on.use_tracker_as_tag(bool): Tag torrents with tracker acronym.qbit_tag/qbit_cat(str): Tag/category for uploaded torrents.qbit_cross_tag/qbit_cross_cat(str): Tag/category for cross-seed torrents.content_layout(str): Layout hint (example default"Original").linking(str):"symlink","hardlink", or empty to disable.allow_fallback(bool): Fallback to original path injection if linking fails.linked_folder(list[str]): Destination folder(s) for linked content. This is the top level directory that will contain the linked content.local_path/remote_path(list[str]): Local/remote path mapping (docker/seedbox), case-sensitive. Local path is how UA sees the content, remote path is how the client sees the content.torrent_storage_dir(str, optional): Only needed if API searching doesn’t work. Falls back to search the client storage directory for existing torrents.
rtorrent_url(str): ruTorrent HTTPRPC endpoint URL (often includes credentials).torrent_storage_dir(str): Session folder path.rtorrent_label(str): Optional label.linking,allow_fallback,linked_folder,local_path,remote_path: similar meaning as qBittorrent.
deluge_url,deluge_port,deluge_user,deluge_passtorrent_storage_dirlocal_path/remote_path
transmission_protocol(str):httporhttpstransmission_username/transmission_passwordtransmission_host/transmission_porttransmission_path(str): RPC path (default example:/transmission/rpc)torrent_storage_dir,transmission_labellocal_path/remote_path
watch_folder(str): Path to a watch folder where.torrentfiles should be dropped.
Enables an optional Discord bot.
use_discord(bool): Enable Discord bot.only_unattended(bool): Only run the bot in unattended mode.send_upload_links(bool): Send tracker torrent URLs.discord_bot_token(str): Bot token.discord_channel_id(str): Target channel.discord_bot_description(str): Bot description.command_prefix(str): Command prefix (example!).- See https://github.com/Audionut/Upload-Assistant/wiki/Discord-Bot
Tracker overridable settings are settings that you can add inside each tracker config dictionary; these settings override the values inside the DEFAULT config. In order for this to work, you must edit the config file, locate the tracker by name, and add your custom value.
Example:
config = {
"DEFAULT": {
"custom_signature": "This is my signature for ALL trackers",
},
"TRACKERS": {
"AITHER": {
"custom_signature": "This is my signature ONLY for AITHER",
},
},
}