Welcome to autoremove-torrents’s documentation!

Introduction

This program is a tool that can help you remove torrents automatically. Now, you don’t need to worry about your disk space anymore - according to your strategies, the program will check each torrent if it satisfies the remove condition; If so, delete it automatically.

Let’s start here. By reading this documentation, we can learn how to install, config and run this tool.

Supported Clients

Until now, this program supports qBittorrent/Transmission/μTorrent/Deluge. rTorrent is on my planning list.

Client Support
qBittorrent Yes
Transmission Yes
μTorrent Yes
Deluge Yes
rTorrent On Planning

Supported Properties

✓ = Supported ✗ = Unsupported

Properties/Clients Deluge qBittorrent Transmission μTorrent
Average Download Speed 2.0 or later
Average Upload Speed
Category Requires Label plugin 3.00+ or later
Connected Leecher
Connected Seeder
Create Time
Download Speed
Downloaded Size
Free Space
Last Activity 2.0 or later v3.0 or later
Leecher
Progress
Ratio
Seeder
Seeding Time
Size
Stall Status
Status
Tracker
Upload Ratio
Upload Speed
Uploaded Size

Install and Run

Install

There are two ways to install autoremove-torrents, but I highly recommend installing from pip.

Install from pip

pip install autoremove-torrents

Install from GitHub

git clone https://github.com/jerrymakesjelly/autoremove-torrents.git
cd autoremove-torrents
python3 setup.py install

Run

Just type the following command line in your terminal:

autoremove-torrents

autoremove-torrents will look for the config.yml in the current working directory. For more command line arguments, please see the table below.

Arguments List

Note

When you are using the full name of the arguments, you need to lead the values of the arguments with a equal sign. But if you are using the abbreviation, you only need a space to lead the argument values.

Arugments Argument Abbreviations Description
–view -v Run and see which torrents will be removed, but don’t really remove them.
–conf -c Specify the path of the configuration file.
–task -t Run a specific task only. The argument value is the task name.
–log -l Sepcify the path of the log file.
–debug -d Enable debug mode and output more logs.

For example:

autoremove-torrents --view --conf=/home/myserver/autoremove-torrents/config.yml

Also, it equals to:

autoremove-torrents -v -c /home/myserver/autoremove-torrents/config.yml

Uninstall

Uninstall from pip

If your autoremove-torrents was installed via pip, you can simply uninstall it by using pip:

pip uninstall autoremove-torrents

Uninstall manually

However, if it was installed by setup.py, you need to remove all the files manually.

Step1
cd autoremove-torrents
Step2

Reinstall the program and record which files were copied:

python3 setup.py install --record files.txt
Step3

Use xargs to remove each file:

cat files.txt | xargs rm -rf

Or if you’re running Windows, use Powershell:

Get-Content files.txt | ForEach-Object {Remove-Item $_ -Recurse -Force}

Reference: https://stackoverflow.com/questions/1550226/python-setup-py-uninstall

Configuration

Before we run autoremove-torrents, we need to create a config.yml to save our configurations.

Warning

In order to avoid the torrents being mistakenly deleted, we highly recommend you to run autoremove-torrents --view once to preview the results after modifying the configuration file.

The script uses the YAML language as the language of the configuration file. The YAML language has a clear structure, so I think it’s more friendly than the JSON and easy to learn.

Look at the example please, the task block can be divided into 3 parts.

# A task block
my_task:          # Part 1: Task Name
  # Part 2: Login Information
  client: qbittorrent
  host: http://127.0.0.1:9091
  username: admin
  password: adminadmin
  # Part 3: Strategies Block (Remove Conditions)
  strategies:
    strategy1:    # Part I: Strategy Name
      # Part II: Filters
      categories:
        - IPT
      # Part III: Remove Condition
      ratio: 1
      seeding_time: 1209600
    strategy2:
      all_categories: true
      excluded_categories:
        - IPT
      seeding_time: 259200
    # Add more strategies here...
  # Part 4: Decide whether to remove and delete data (optional)
  delete_data: true

# Add more tasks here...

Centainly, the configuration file can contain more than one task blocks, and a task block can contain more than one strategy blocks. Each task block represents a BT client, and each strategy block represents a kind of torrents.

Part 1: Task Name

Just name your task.

Note

No spaces are allowed before the task name.

Part 2: Login Information

This part is your login inforamtion.

For qBittorrent, Transmission or μTorrent

For qBittorrent/Transmission/μTorrent, this program works with your client’s WebUI.

  • client: Your client name. It’s case-insensitive.
  • host: The URL of your client’s WebUI, and the URL must have a scheme (http:// or https://).
  • username: The username of the WebUI.
  • password: The password of the WebUI.

For Deluge

This program accesses Deluge via its RPC protocol.

  • client: Your client name. Here is Deluge.
  • host: The IP address (or domain name) and the port number of your Deluge Daemon, for example, 127.0.0.1:58846.
  • username: The username of the Deluge Daemon.
  • password: The password of the Deluge Daemon.

Example:

my_task:
  client: deluge
  host: 127.0.0.1:58846
  username: localclient
  password: 357a0d23f09b9f303f58846e41986b36fef2ac88

Note

  1. Don’t write any schemes in host field. The program uses neither HTTP protocol nor HTTPS protocol to access Deluge.
  2. The port number is the port number of the Deluge Daemon, not the WebUI. You can find it in the Connection Manager of your WebUI.
  3. When you are running the autoremove-torrents and the Deluge on different computers, please make sure that your Deluge accepts remote connections. You can modify this setting at Preferences -> Daemon -> Allow Remote Connections.

Note

Generally, you can find the username and password in ~/.config/deluge/auth. Also, you can create a new user by adding a new line to the end of the file.

For more information of the authentication, please visit https://dev.deluge-torrent.org/wiki/UserGuide/Authentication.

Part 3: Strategy Block

This part contains strategy blocks. Each strategy block can be divided into 3 parts, too.

Part I: Strategy Name

Just name your strategy like the task name.

Part II: Filters

The removing condtions are only available for the torrents you chosen. There are 9 filters available.

  • all_trackers/all_categories/all_status: Choose all the trackers/categories/status.
  • categories: Choose torrents in these categories.
  • excluded_categories: Don’t choose torrents in these categories.
  • trackers: Choose torrents in these trackers.
  • excluded_trackers: Don’t choose torrents in these trackers.
  • status: Choose torrents in these status. Available status is as follows:
Status Remarks
Downloading /
Uploading /
Checking /
Queued /
Paused Transmission doesn’t have this status.
Stopped qBittorrent doesn’t have this status.
Error /
StalledUpload μTorrent doesn’t have this status.
StalledDownload μTorrent doesn’t have this status.
  • excluded_status: Don’t choose these torrents in these status. Available status is shown in the table above.

The result of each filter is a set of torrents.

Note

When two or three of categories, trackers and status filter are specificed, the program will take the intersection of these sets, and subtracts set excluded_categories, excluded_trackers and excluded_status.

Note

  1. Don’t write sockets in trackers. The trackers field only needs hostname, for example, just fill tracker.site1.com for https://tracker.site1.com.
  2. In 1.4.4 and later version, if there’s only one item in categories, trackers or status, it’s not necessary to use list structure. A single-line text is enough, for example:
categories: cata1
status: uploading
  1. The StalledUp and StalledDown is the new status in version 1.4.5. In this program, Uploading inlcudes the torrents in StalledUpload status, and Downloading includes the torrents in StalledDownload status.

Let’s see some examples. Select those torrents whose categories are Movies or Games:

my_task:
  client: xxx
  host: xxx
  username: xxx
  password: xxx
  strategies:
    my_strategy:
      categories:
        - Movies
        - Games
      # Removing conditions are here
      # ...

Select those torrents whose hostnames of tracker are tracker.aaa.com or x.bbb.com:

my_task:
  client: xxx
  host: xxx
  username: xxx
  password: xxx
  strategies:
    my_strategy:
      trackers:
        - tracker.aaa.com
        - x.bbb.com
      # Removing conditons are here
      # ...

Select torrents whose categories are Movies or Games, but exclude those torrents whose tracker is tracker.yyy.com:

my_task:
  client: xxx
  host: xxx
  username: xxx
  password: xxx
  strategies:
    my_strategy:
      categories:
        - Movies
        - Games
      excluded_trackers:
        - tracker.yyy.com
      # Removing conditions are here
      # ...

Select those torrents whose categories is Movies and status is uploading:

my_task:
  client: xxx
  host: xxx
  username: xxx
  password: xxx
  strategies:
    my_strategy:
      categories:
        - Movies
      status:
        - Uploading
      # Removing conditions are here
      # ...

Part III: Remove Condition

There are 2 ways to set removing condition.

2. Use remove Keyword (Advanced)

Use the remove keyword. The remove keyword is a new keyword in version 1.4.0, which supports the complex removing condition. The remove keyword is followed by an expression, which consists of the following syntax:

  1. <Parameter> <Comparison Operator> <Value>

    Parameter: Available parameters are as follows, and they are case-insensitive.

    Note

    Some properties can only be used in specific status. The torrents not in available status will not be removed.

    Parameter Unit Available Status Description
    average_downloadspeed KiB/s All Average download speed.
    average_uploadspeed KiB/s All Average upload speed.
    connected_leecher / Downloading or Uploading The number of connected leecher.
    connected_seeder / Downloading or Uploading The number of connected seeder.
    create_time Second All The elapsed time since the torrent was added to the client.
    download GiB All Downloaded Size
    download_speed KiB/s Downloading Download speed.
    downloading_time Second All Downloading time.
    last_activity Second All The elapsed time since the torrent has stopped being active (without uploading or downloading).
    leecher / All The number of leechers.
    progress % All The download progress.
    ratio / All Ratio
    seeder / All The number of seeders.
    seeding_time Second All Seeding time.
    size GiB All The torrent size.
    upload GiB All Uploaded Size
    upload_ratio / All uploaded size / size
    upload_speed KiB/s Downloading or Uploading Upload Speed

    Comparison Operator: Available operators are as follows.

    Comparison Operator Description
    < Less Than
    > Greater Than
    = Equals

    Value: Specify a numeric value. Supports integers and floats.

    This syntax selects the eligible torrents directly, and removes them directly or works with the following compound expressions. Here is an example, it removes the torrents which seeding time is greater than 259200 seconds:

    my_task:
      client: xxx
      host: xxx
      username: xxx
      password: xxx
      strategies:
        my_strategy:
          remove: seeding_time > 259200
    
  2. <Expression 1> and <Expression 2> and <Expression 1> or <Expression 2>

    This syntax is a compound expression.

    • and: Select torrents that meet both the Expression 1 and Expression 2 (intersection).
    • or: Select torrents that meet one or both of the Expression 1 and Expression 2 (Union).

    Here is an example. For all torrents, it removes those torrents which ratio is greater than 2 and seeding time is more than 60000 seconds:

    my_task:
      client: xxx
      host: xxx
      username: xxx
      password: xxx
      strategies:
        my_strategy:
          remove: ratio > 2 and seeding_time > 60000
    

    Here is another example. For all torrents, it removes those torrents which ratio is less than 1 or seeding time is more than 60000:

    my_task:
      client: xxx
      host: xxx
      username: xxx
      password: xxx
      strategies:
        my_strategy:
          remove: ratio < 1 or seeding_time > 60000
    
  3. (<Expression>)

    When an expression is enclosed in parentheses, it is still an expression. Using parentheses can change the priority. And you can use multiple parentheses for nesting.

    Here is an example. For all torrents, it removes those torrents which seeding time is more than 60000 seconds, or those torrents which ratio is greater than 3 and added time is more than 1400000 seconds:

    my_task:
      client: xxx
      host: xxx
      username: xxx
      password: xxx
      strategies:
        my_strategy:
          remove: seeding_time > 60000 or (ratio > 3 and create_time > 1400000)
    

Part 4: Delete data

Determine whether to delete data at the same time. If this field isn’t specificed, the default value is false.

The Last Step…

Remember to check your configuration file and make sure it works as you think. Use the following command line to see the torrents that will be removed (but not really remove them).

autoremove-torrents --view

ChangeLog

Version 1.5.4

Release Date: Sunday, 19 June 2022

Changes

  • Remove outgoing port status info. (#101) (#135)
    • We have confirmed a bug, which is, the outgoing port status checker will fail and report ‘portTested: http error 400: Bad Request’ when we are using Transmission and check the outgoing port status in IPv6 network.
    • Since there are no configurations relying on this status, we remove it.
  • Change last_activity’s behaviour. (#93) (#98) (#109)
    • By default, it won’t remove those torrents that have never been active anymore.
    • These torrents that have never been active can be removed by the following configuration:
      • last_activity: never or last_activity: none for last_activity condition.
      • last_activity = never or last_activity = none for remove expression.

Features

  • Add remove-slow-upload-seeds and remove-fast-upload-seeds actions to keyword action. (#127) Thanks to @vincent906!
  • Support equality (=) comparison in remove expression.
  • Add downloading_time condition. (#88) Thanks to @dantebarba!

Fix

  • Fix a bug that Downloaded/Uploaded Size conditions and free_space/remote_free_space cannot handle decimals correctly. (#133) Thanks to @sfwn!
  • Fix a bug that last_activity condition doesn’t work in Deluge 2.0.3 and above. (#119)

Version 1.5.3

Release Date: Thursday, 27 August 2020

Features

  • Enable to output debug logs by specifying --debug or -d argument. (#76)
  • Add uploaded size and downloaded size conditions. (#79)

Fix

  • Fix psutil’s compatibility in Synology (use to check the free spaces). (#61)
  • Fix API imcompatibility issue caused by the trailing / in host URL. (#81)

Version 1.5.2

Release Date: Friday, 27 March 2020

Change

  • Set the client names to be case-insensitive.

Features

  • Support Deluge. (#8)
  • Use batch delete to improve efficiency.

Fix

  • Fix multi-language support in config file. (#69)

Version 1.5.1

Release Date: Saturday, 29 February 2020

Fix

  • Fix missing status StalledUpload and StalledDownload in version 1.5.0. (#66)

Version 1.5.0

Release Date: Friday, 28 February 2020

Features

  • Add new status Error to filter status.
  • Add support for Transmission labels. (#24)
  • Add removing conditions: Maximum Download Speed max_downloadspeed and Minimum Upload Speed min_uploadspeed.
  • Add removing conditions: Maximum Average Download Speed max_average_downloadspeed and Minimum Average Upload Speed min_average_uploadspeed. (#49)
  • Add removing conditions: Maximum Torrent Size max_size. (#21)
  • Add removing conditions: Maximum Number of Seeders max_seeder and Minimum Number of Leechers min_leecher. (#62)
  • Add removing conditions: Maximum Number of Connected Seeders max_connected_seeder and Minimum Number of Connected Leechers min_connected_leecher.
  • Add a removing condition: Last Activity last_activity, which removes torrents without upload or download speed for a period of time. (#1) (#9)
  • Add a removing condition: Maximum Download Progress max_progress.
  • Add actions: add remove-active-seeds and remove-inactive-seeds to free_space, maximum_number and seed_size in order to try to remove active or inactive torrents based on the last active time. (#9)
  • Add a removing condition: Upload Ratio upload_ratio, which can remove torrents based on the ratio of uploaded size to torrent size. (#55)

Fix

  • Fix a problem: cannot login to client with numeric username or password. (#64)
  • Fix a problem: tasks could not be executed in a Transmission without label properties.
  • Fix a problem: removing conditions may not work for unlabeled and trackerless torrents.
  • Fix a problem: missing status Queued in μTorrent.

Documents Migration

Date: Monday, 3 February 2020

  • Migrate documents to Read the Docs.

Version 1.4.9

Release Date: Sunday, 26 January 2020

Feature

  • Add free_space condition. Thanks to @drawwon!

Version 1.4.8

Release Date: Tuesday, 7 January 2020

Fix

  • Fix bug that cannot delete torrents in qBittorrent v4.2.1+. Sorry for any inconvenience. (#53)

Version 1.4.7

Release Date: Monday, 6 January 2020

Feature

  • Add support for new API in qBittorrent 4.2.1. (#46)

Note

Note: This version has a bug. Please upgrade to v1.4.8 or higher.

Version 1.4.6

Release Date: Tuesday, 17 September 2019

Fix

  • Fix problem that the tracker filter needs to specific ports when the tracker URL includes port number. (#38)

Version 1.4.5

Release Date: Thursday, 6 June 2019

Feature

  • Added status StalledUpload and StalledDownload. (#34)

Version 1.4.4

Release Date: Wednesday, 22 May 2019

Feature

  • New feature: if the content of filter has only one line, now it is allowed to write down directly without using list.

Fix

  • Fixed a bug that when condition seed_size / maximum_number is used together with condtion ratio / create_time / seeding_time, the task will fail. (#33)

Version 1.4.3

Release Date: Sunday, 19 May 2019

Changes

  • Supported Python 2.7. (#29)
  • Stopped supporting Python 3.4. (kennethreitz/requests#5092)

Version 1.4.2

Release Date: Monday, 13 May 2019

Fix

  • Fixed missing parser files. (#32)
  • Fixed association of operators. (#32) Now the operator and and or are guaranteed to be left-associative.

Version 1.4.1

Release Date: Monday, 6 May 2019

Fix

  • Fixed missing dependency: ply.
  • Fixed the warning of duplicate definition in condition remove.

Wiki Update

Date: Monday, 6 May 2019

  • Added the description of remove condition into Simplified-Chinese Wiki.

Version 1.4.0

Release Date: Wednesday, 1 May 2019

Changes

  • Removed torrent status restriction in seeding_time and ratio condition (#19).
    • Before this version, seeding_time and ratio condition will only remove those torrents whose status are seeding. We set this restriction to provide a method for users to avoid a torrent being removed by changing its status (e.g. pause seeding).
    • But now we have a status filter, this restriction becomes unnecessary, and its behavior may be different from users expectation.

Features

  • Supported custom remove expressions (#15).
    • Now we can write the condition that we want directly and clearly, e.g. remove: ratio > 1.
    • Composite condition expressions are also supported, e.g. remove: (seeding_time < 86400 and ratio > 1) or (seeding_time > 86400 and ratio > 3). Visit Wiki to learn more.
    • The old remove conditions are still available.

Version 1.3.0

Release Date: Wednesday, 17 April 2019

Changes

  • Log system was updated:
    • Log path can be specified (Use --log argument, e.g. --log=/home/jerrymakesjelly/logs) (#23).
    • Logs are stored in different files by day (Format: autoremove.%Y-%m-%d.log).
  • Changed the word seed to torrent (#25).
  • Removed uncessary debug messages.

Fix

  • Fixed bug: Program gets stuck when there are a lot of torrents in qBittorrent client (#22).
  • Fixed bug: Duplicated logging in status filter.

Version 1.2.5

Release Date: Monday, 10 January 2019

Fix

  • Fixed bug: Incorrect number of torrents in multiple strategies (#10). Thanks to @momokoo!
  • Fixed bug: Incorrect number of torrents in qBittorrent (#13).

Version 1.2.4

Release Date: Thursday, 31 May 2018

Fix

  • Fixed startup failure.

Version 1.2.3

Release Date: Wednesday, 30 May 2018

Change

  • Now the program won’t quit directly when a task goes failed.

Features

  • Allowed to use environment variables to specify host, username and password.
  • Allowed username and password to be empty (or one of them is empty) to log in a WebUI without username and/or password.

Version 1.2.2

Release Date: Sunday, 27 May 2018

Features

  • Added new filter: Torrent Status
  • Added new condition: Maximum number of torrents

Version 1.2.1

Release Date: Saturday, 26 May 2018

Fix

  • Fixed issue in setup.py.

Version 1.2.0

Release Date: Saturday, 26 May 2018

  • Published to PyPI!
  • Refactoring was completed.
    • New features will be added soon.
    • Now we can install it via pip.

Version 1.1.0

Release Date: Monday, 14 May 2018

  • Created setup.py.
    • You can now use the autoremove-torrents command directly instead of python3 main.py.

Correct Document

Date: Wednesday, 28 March 2018

  • The delete_data field shouldn’t be indented.

FIRST VERSION

Release Date: Thursday, 22 March 2018

  • First version :bowtie:

Indices and tables