Delete movie from torrent client & Radarr #3782

Open
opened 2026-02-19 22:37:55 -05:00 by deekerman · 14 comments
Owner

Originally created by @dewey on GitHub (Dec 4, 2019).

Is your feature request related to a problem? Please describe.
I'm using Radarr with qBittorrent and my usual workflow is that I start a download through searching a movie in Radarr and then seed it as long as possible. From time to time I need to delete movies to make space on my server.

I do that through using these steps: "Edit Movie / Delete / Delete all files". This means that the hard link in "/media/Movie Name 2019" and the entry seen in Radarr get cleaned up as expected. This means that then I manually have to go into my torrent client, find the movie there and delete it from there too.

Describe the solution you'd like
As Radarr already is the single source of truth with a mapping of files to the entry in the torrent client it would be ideal if "Delete all files" would either also remove the torrent / files from the torrent client or that there's a second option to enable "Delete from Radarr also deletes from torrent client". I think would make the whole workflow easier as you don't have to manually keep track of what's still seeding and what's available in Radarr (and by extension then Plex which looks at the /media/ directory in my case)

Beautiful mockup:

Screenshot 2019-12-04 at 12 24 48

Additional context
I'm sure there's a reason for the current behaviour so I'm curious how other people deal with that. Do people just use the "delete when completed" option in Radarr? I'd prefer not to do that as I like to seed as long as possible (if space allows).

AB#881

Originally created by @dewey on GitHub (Dec 4, 2019). **Is your feature request related to a problem? Please describe.** I'm using Radarr with qBittorrent and my usual workflow is that I start a download through searching a movie in Radarr and then seed it as long as possible. From time to time I need to delete movies to make space on my server. I do that through using these steps: "Edit Movie / Delete / Delete all files". This means that the hard link in "/media/Movie Name 2019" and the entry seen in Radarr get cleaned up as expected. This means that then I manually have to go into my torrent client, find the movie there and delete it from there too. **Describe the solution you'd like** As Radarr already is the single source of truth with a mapping of files to the entry in the torrent client it would be ideal if "Delete all files" would either also remove the torrent / files from the torrent client or that there's a second option to enable "Delete from Radarr also deletes from torrent client". I think would make the whole workflow easier as you don't have to manually keep track of what's still seeding and what's available in Radarr (and by extension then Plex which looks at the /media/ directory in my case) Beautiful mockup: <img width="581" alt="Screenshot 2019-12-04 at 12 24 48" src="https://user-images.githubusercontent.com/790262/70139155-216c3f80-1692-11ea-96f8-869d869c65f1.png"> **Additional context** I'm sure there's a reason for the current behaviour so I'm curious how other people deal with that. Do people just use the "delete when completed" option in Radarr? I'd prefer not to do that as I like to seed as long as possible (if space allows). [AB#881](https://dev.azure.com/Servarr/7ab38f4e-5a57-4d70-84f4-94dd9bc5d6df/_workitems/edit/881)
Author
Owner

@issue-label-bot[bot] commented on GitHub (Dec 4, 2019):

Issue-Label Bot is automatically applying the label feature_request to this issue, with a confidence of 0.88. Please mark this comment with 👍 or 👎 to give our bot feedback!

Links: app homepage, dashboard and code for this bot.

@issue-label-bot[bot] commented on GitHub (Dec 4, 2019): Issue-Label Bot is automatically applying the label `feature_request` to this issue, with a confidence of 0.88. Please mark this comment with :thumbsup: or :thumbsdown: to give our bot feedback! Links: [app homepage](https://github.com/marketplace/issue-label-bot), [dashboard](https://mlbot.net/data/Radarr/Radarr) and [code](https://github.com/hamelsmu/MLapp) for this bot.
Author
Owner

@fryfrog commented on GitHub (Dec 4, 2019):

The closest you can get right now is to have your torrent client set your seed time/ratio goals appropriately. In the port of Sonarr's v3 -> Radarr, you can set this in Radarr. But it still doesn't quite meet your goal. My only real objection to your feature is that it'd be very easy to give yourself HnRs. Since you'd have your torrent client setup to pause when goals are met, the only thing this really saves is going to your torrent client and removing any appropriate paused torrents.

@fryfrog commented on GitHub (Dec 4, 2019): The closest you can get right now is to have your torrent client set your seed time/ratio goals appropriately. In the port of Sonarr's v3 -> Radarr, you can set this *in* Radarr. But it still doesn't quite meet your goal. My only real objection to your feature is that it'd be very easy to give yourself HnRs. Since you'd have your torrent client setup to *pause* when goals are met, the only thing this really saves is going to your torrent client and removing any appropriate paused torrents.
Author
Owner

@chkuendig commented on GitHub (Sep 14, 2020):

I think a nice alternative would be to at least show these torrents again in the queue as unmapped so I could decide to delete them from there.

@chkuendig commented on GitHub (Sep 14, 2020): I think a nice alternative would be to at least show these torrents again in the queue as unmapped so I could decide to delete them from there.
Author
Owner

@douglas24 commented on GitHub (Dec 1, 2020):

I'd like to +1 this option because it would be useful to delete a torrent from a download client when deleting a movie added by a list. Having a toggle option would mean only have to do actions within radarr instead of duplicating the task in the download client. Isn't removal semi-added already since things can be deleted from the download client on the queue page? And radarr already knows which torrents were added for which movies (history section for each movie).

@douglas24 commented on GitHub (Dec 1, 2020): I'd like to +1 this option because it would be useful to delete a torrent from a download client when deleting a movie added by a list. Having a toggle option would mean only have to do actions within radarr instead of duplicating the task in the download client. Isn't removal semi-added already since things can be deleted from the download client on the queue page? And radarr already knows which torrents were added for which movies (history section for each movie).
Author
Owner

@voarsh2 commented on GitHub (Oct 14, 2022):

+1 for this.
I assumed originally that deleted a movie. or movie files from files tab would in fact remove the torrent from the download client. Now I probably have A LOT of torrents taking up space, but I've deleted the copy elsewhere (hardlinks).

@voarsh2 commented on GitHub (Oct 14, 2022): +1 for this. I assumed originally that deleted a movie. or movie files from files tab would in fact remove the torrent from the download client. Now I probably have A LOT of torrents taking up space, but I've deleted the copy elsewhere (hardlinks).
Author
Owner

@btTeddy commented on GitHub (Jan 13, 2023):

+1

It would be extremely handy to have the option to delete PAUSED torrents.

This would prevent accidental removal

@btTeddy commented on GitHub (Jan 13, 2023): +1 It would be extremely handy to have the option to delete PAUSED torrents. This would prevent accidental removal
Author
Owner

@bakerboy448 commented on GitHub (Aug 1, 2023):

For those using Qbit - qbitmanage's nohardlink functionality can plug this gap

@bakerboy448 commented on GitHub (Aug 1, 2023): For those using Qbit - [qbitmanage's](https://github.com/StuffAnThings/qbit_manage) nohardlink functionality can plug this gap
Author
Owner

@ManiMatter commented on GitHub (Aug 1, 2023):

There are 4 related tickets to this ticket (https://github.com/Radarr/Radarr/issues/3918):

What all of these feature requests have in common is that removing of a movie should also remove the pending downloads.

The difference to this ticket here is that above 4 tickets want the pending downloads automatically be removed, while in this ticket here asks for a possibility for the user to chose to delete the pending downloads.

My take is that with the automatic removal, the "choice" that is being requested by this ticket would probably not be required anymore.

Looking at the number of independent requests filed for this, and the comments in the tickets, it feels like there's quite a number of people looking for this feature.

@ManiMatter commented on GitHub (Aug 1, 2023): There are 4 related tickets to this ticket (https://github.com/Radarr/Radarr/issues/3918): - https://github.com/Radarr/Radarr/issues/4219 - https://github.com/Radarr/Radarr/issues/5462 - https://github.com/Radarr/Radarr/issues/6432 - https://github.com/Radarr/Radarr/issues/8911 What all of these feature requests have in common is that removing of a movie should also remove the pending downloads. The difference to this ticket here is that above 4 tickets want the pending downloads automatically be removed, while in this ticket here asks for a possibility for the user to chose to delete the pending downloads. My take is that with the automatic removal, the "choice" that is being requested by this ticket would probably not be required anymore. Looking at the number of independent requests filed for this, and the comments in the tickets, it feels like there's quite a number of people looking for this feature.
Author
Owner

@ManiMatter commented on GitHub (Aug 1, 2023):

I cannot think of a reason why once a movie was deleted from Radarr any user would want a ongoing download to be completed.
Given the download activity is directly linked with the movie that was deleted, I would think that also deleting the activity should - from a programmatic standpoint - be relatively simple to implement.

As it stands, radarr creates "orphans", since a ongoing download will complete, and then be an orphan since the movie that triggered the download was removed.

@bakerboy448 : You labelled this as "Maybe One Day" and "Low Priority", eventhough people asked for this feature again and again since 2019. Could you explain the reason for having chosen to do so?

@ManiMatter commented on GitHub (Aug 1, 2023): I cannot think of a reason why once a movie was deleted from Radarr any user would want a ongoing download to be completed. Given the download activity is directly linked with the movie that was deleted, I would think that also deleting the activity should - from a programmatic standpoint - be relatively simple to implement. As it stands, radarr creates "orphans", since a ongoing download will complete, and then be an orphan since the movie that triggered the download was removed. @bakerboy448 : You labelled this as "Maybe One Day" and "Low Priority", eventhough people asked for this feature again and again since 2019. Could you explain the reason for having chosen to do so?
Author
Owner

@bakerboy448 commented on GitHub (Aug 1, 2023):

Hit and Runs would be the primary reason.

Because it is maybe one day and not ruled out, nor fully committed to.

Given not a single person from the community has stepped up to work with the devs to implement this feature (ideally upstream in Sonarr first), it must not be something the community wants as a priority.

There's effectively 1-2 devs working on Radarr, Readarr, Lidarr, Prowlarr, Whisparr, associated metadata and servers, and contributing back to Sonarr in their free time.

There's hundreds of other features and bugs that are more impactful than this feature and numerous features or bugs with significantly more interest or user requests than this one.

This can be implemented by users already via a custom script triggered on delete and interacting with their download client. Additionally, other tools - such as QbitManage - can already handle torrents that are no longer hardlinked.

Thus low priority.

Regarding automatic removal, that's what this exact feature would implement....the user directs radarr to automatically remove the torrent.

@bakerboy448 commented on GitHub (Aug 1, 2023): Hit and Runs would be the primary reason. Because it is maybe one day and not ruled out, nor fully committed to. Given not a single person from the community has stepped up to work with the devs to implement this feature (ideally upstream in Sonarr first), it must not be something the community wants as a priority. There's effectively 1-2 devs working on Radarr, Readarr, Lidarr, Prowlarr, Whisparr, associated metadata and servers, and contributing back to Sonarr in their free time. There's hundreds of other features and bugs that are more impactful than this feature and numerous features or bugs with significantly more interest or user requests than this one. This can be implemented by users already via a custom script triggered on delete and interacting with their download client. Additionally, other tools - such as QbitManage - can already handle torrents that are no longer hardlinked. Thus low priority. Regarding automatic removal, that's what this exact feature would implement....the user directs radarr to automatically remove the torrent.
Author
Owner

@AndresPineros commented on GitHub (Sep 9, 2023):

@bakerboy448 Totally understandable. Does Radarr have a way to run scripts after a delete, or did you mean something external like inotify? If Radarr has a mechanism that provides all the information needed to the script, like the ID of the torrent for the recently removed movie, that'd be great. If not, then inotify can tell me the inode of the hardlink, then I could get the paths of the files, figure out the torrent id with the file paths somehow, and delete the torrent.

@AndresPineros commented on GitHub (Sep 9, 2023): @bakerboy448 Totally understandable. Does Radarr have a way to run scripts after a delete, or did you mean something external like inotify? If Radarr has a mechanism that provides all the information needed to the script, like the ID of the torrent for the recently removed movie, that'd be great. If not, then inotify can tell me the inode of the hardlink, then I could get the paths of the files, figure out the torrent id with the file paths somehow, and delete the torrent.
Author
Owner

@bakerboy448 commented on GitHub (Sep 9, 2023):

Ionotify should work depending on your system/ setup

Otherwise connections => custom script On Delete. Wiki has the variables provided by radarr.

Please use Discord for support/questions.

@bakerboy448 commented on GitHub (Sep 9, 2023): Ionotify should work depending on your system/ setup Otherwise connections => custom script On Delete. Wiki has the variables provided by radarr. Please use [Discord](https://radarr.video/discord) for support/questions.
Author
Owner

@AndresPineros commented on GitHub (Sep 11, 2023):

Couldn't do this just with the events provided by Radarr because of the information they contain and the moments they are triggered. There was always some missing link. For example, whenever you grab something from an indexer, only the "Grab" event (which contains the torrent-id) is triggered, but the "Download" event which contains the information telling how Radarr imported the file isn't. "Download" is only triggered whenever you manually import a movie, not when it is grabbed from an indexer.

Anyways, this was my result. It has some kind of persistence using the filesystem (mappings folder), so it won't work for movies that already exist. Also, I never do upgrades for movies, so I don't know what will happen then.

On add:

  • Detects when a movie is added to the library.
  • Uses the inodes to figure out which torrent folder it came from.
  • Uses the torrent folder to find the torrent hash using the qbittorrent api. (oh, yeha, this is for qbittorrent...)
  • Saves a mapping file that links a movie file to the torrent hash.

On delete:

  • Checks for the filename that was deleted.
  • Checks if there's a mapping file that matches the filename
  • If so, gets the torrent id
  • Deletes the torrent using the qbittorrent API.

Very ugly... Anyways, it was a pain trying to figure out the least awful solution. If anyone comes with a better approach, please let me know.

import os
import inotify.adapters
import subprocess
from qbittorrent import Client # python-qbittorrent
import errno
import logging

# Folder paths
library_folder = os.environ.get('MANAGER_LIBRARY_FOLDER', "/media/libraries/movies") 
download_folder = os.environ.get('MANAGER_DOWNLOAD_FOLDER', "/media/torrents/movies")
mappings_folder = os.environ.get('MANAGER_MAPPINGS_FOLDER', "/mappings")
qbittorrent_host = os.environ.get('MANAGER_TORRENT_HOST', "qbittorrent")
qbittorrent_port = os.environ.get('MANAGER_TORRENT_PORT', "8080")
qbittorrent_username = os.environ.get('MANAGER_TORRENT_USER', "admin")
qbittorrent_password = os.environ.get('MANAGER_TORRENT_PASS', "adminadmin")

logging.basicConfig(level=logging.INFO)

def find_matching_file_by_inode(inode):
    try:
        result = subprocess.check_output(
            ["find", download_folder, "-type", "f", "-inum", str(inode)], universal_newlines=True).strip()
        return result.split("\n")[0] if result else None
    except subprocess.CalledProcessError:
        return None

def is_hardlink(file_path):
    try:
        link_count = os.stat(file_path).st_nlink
        return link_count > 1
    except OSError:
        return False

def get_qbittorrent_client():
    qb = Client(f"http://{qbittorrent_host}:{qbittorrent_port}")
    qb.login(qbittorrent_username, qbittorrent_password)
    return qb

def get_torrent_hash_from_download_folder(torrent_folder):
    qb = get_qbittorrent_client()
    torrents = qb.torrents()

    for torrent in torrents:
        if torrent['name'] == torrent_folder:
            return torrent['hash']
    return None

def handle_create_event(event_file):
    event_base_file = os.path.basename(event_file)

    if not event_file.lower().endswith((".mkv", ".mp4", ".avi")):
        logging.warning(f"File has no video format: {event_file}")
        return
    
    if not is_hardlink(event_file):
        logging.warning(f"File is not a hardlink: {event_file}")
        return

    inode = os.stat(event_file).st_ino
    matching_file = find_matching_file_by_inode(inode)

    if matching_file is None:
        logging.warning(f"No hardlink matching file in downloads folder: {event_file}")
        return
    else:
        logging.info(f"Matching file by inode: {matching_file}")

    parent_folder = os.path.basename(os.path.dirname(matching_file))
    logging.info(f"Matching file parent folder: {parent_folder}")

    torrent_hash = get_torrent_hash_from_download_folder(parent_folder)
    if torrent_hash:
        logging.info(f"Found torrent hash: {torrent_hash}")
        with open(os.path.join(mappings_folder, event_base_file), "w") as mapping_file:
            mapping_file.write(torrent_hash)
    else:
        logging.warning(f"Couldn't find torrent hash: {event_base_file}")

def handle_delete_event(event_file):
    event_base_file = os.path.basename(event_file)

    if not event_base_file.lower().endswith((".mkv", ".mp4", ".avi")):
        logging.warning(f"File has no video format: {event_file}")
        return

    mapping_file_path = os.path.join(mappings_folder, event_base_file)
    if not os.path.exists(mapping_file_path):
        logging.warning(f"No mapping file-torrent file for file: {event_file}")
        return

    with open(mapping_file_path, "r") as mapping_file:
        torrent_hash = mapping_file.readline().strip()

    qb = get_qbittorrent_client()
    qb.delete_permanently(torrent_hash)

    try:
        os.remove(mapping_file_path)
        logging.info(f"File {mapping_file_path} removed successfully.")
    except OSError as e:
        if e.errno == errno.ENOENT:
            logging.warning(f"File {mapping_file_path} does not exist.")
        else:
            raise e

    logging.info(f"Deleted torrent with ID: {torrent_hash}")

def main():
    i = inotify.adapters.InotifyTree(library_folder,
        mask=inotify.constants.IN_CREATE | inotify.constants.IN_DELETE)

    try:
        logging.info(f"Starting file listener...")
        for event in i.event_gen(yield_nones=False):
            (_, event_type, event_path, event_file) = event
            event_path_file = os.path.join(event_path, event_file)

            if "IN_CREATE" in event_type:
                logging.info("Handling create event...")
                handle_create_event(event_path_file)
            elif "IN_DELETE" in event_type:
                logging.info("Handling delete event...")
                handle_delete_event(event_path_file)

    except KeyboardInterrupt:
        logging.info("Exiting...")
    
if __name__ == "__main__":
    main()
from python:3-slim

COPY event-manager.py /event-manager.py

RUN pip3 install python-qbittorrent inotify && \
    chmod 555 /event-manager.py

CMD ["python3", "-u", "/event-manager.py"]
version: "2"
services:
  radarr_delete_helper:
    build: ./images/radarr_delete_helper
    container_name: radarr_delete_helper
    user: "${PUID}:${PGID}"
    volumes:
      - ./data/radarr_delete_helper:/mappings
      - ./media:/media
    deploy:
      resources:
        limits:
          cpus: '0.1'
          memory: 50M
    environment:
      - MANAGER_TORRENT_USER=${MANAGER_TORRENT_USER}
      - MANAGER_TORRENT_PASS=${MANAGER_TORRENT_PASS}
      - MANAGER_LIBRARY_FOLDER=${MANAGER_LIBRARY_FOLDER}
      - MANAGER_DOWNLOAD_FOLDER=${MANAGER_DOWNLOAD_FOLDER}
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
      - SYS_MODULE
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped
@AndresPineros commented on GitHub (Sep 11, 2023): Couldn't do this just with the events provided by Radarr because of the information they contain and the moments they are triggered. There was always some missing link. For example, whenever you grab something from an indexer, only the "Grab" event (which contains the torrent-id) is triggered, but the "Download" event which contains the information telling how Radarr imported the file isn't. "Download" is only triggered whenever you manually import a movie, not when it is grabbed from an indexer. Anyways, this was my result. It has some kind of persistence using the filesystem (mappings folder), so it won't work for movies that already exist. Also, I never do upgrades for movies, so I don't know what will happen then. On add: - Detects when a movie is added to the library. - Uses the inodes to figure out which torrent folder it came from. - Uses the torrent folder to find the torrent hash using the qbittorrent api. (oh, yeha, this is for qbittorrent...) - Saves a mapping file that links a movie file to the torrent hash. On delete: - Checks for the filename that was deleted. - Checks if there's a mapping file that matches the filename - If so, gets the torrent id - Deletes the torrent using the qbittorrent API. Very ugly... Anyways, it was a pain trying to figure out the least awful solution. If anyone comes with a better approach, please let me know. ``` import os import inotify.adapters import subprocess from qbittorrent import Client # python-qbittorrent import errno import logging # Folder paths library_folder = os.environ.get('MANAGER_LIBRARY_FOLDER', "/media/libraries/movies") download_folder = os.environ.get('MANAGER_DOWNLOAD_FOLDER', "/media/torrents/movies") mappings_folder = os.environ.get('MANAGER_MAPPINGS_FOLDER', "/mappings") qbittorrent_host = os.environ.get('MANAGER_TORRENT_HOST', "qbittorrent") qbittorrent_port = os.environ.get('MANAGER_TORRENT_PORT', "8080") qbittorrent_username = os.environ.get('MANAGER_TORRENT_USER', "admin") qbittorrent_password = os.environ.get('MANAGER_TORRENT_PASS', "adminadmin") logging.basicConfig(level=logging.INFO) def find_matching_file_by_inode(inode): try: result = subprocess.check_output( ["find", download_folder, "-type", "f", "-inum", str(inode)], universal_newlines=True).strip() return result.split("\n")[0] if result else None except subprocess.CalledProcessError: return None def is_hardlink(file_path): try: link_count = os.stat(file_path).st_nlink return link_count > 1 except OSError: return False def get_qbittorrent_client(): qb = Client(f"http://{qbittorrent_host}:{qbittorrent_port}") qb.login(qbittorrent_username, qbittorrent_password) return qb def get_torrent_hash_from_download_folder(torrent_folder): qb = get_qbittorrent_client() torrents = qb.torrents() for torrent in torrents: if torrent['name'] == torrent_folder: return torrent['hash'] return None def handle_create_event(event_file): event_base_file = os.path.basename(event_file) if not event_file.lower().endswith((".mkv", ".mp4", ".avi")): logging.warning(f"File has no video format: {event_file}") return if not is_hardlink(event_file): logging.warning(f"File is not a hardlink: {event_file}") return inode = os.stat(event_file).st_ino matching_file = find_matching_file_by_inode(inode) if matching_file is None: logging.warning(f"No hardlink matching file in downloads folder: {event_file}") return else: logging.info(f"Matching file by inode: {matching_file}") parent_folder = os.path.basename(os.path.dirname(matching_file)) logging.info(f"Matching file parent folder: {parent_folder}") torrent_hash = get_torrent_hash_from_download_folder(parent_folder) if torrent_hash: logging.info(f"Found torrent hash: {torrent_hash}") with open(os.path.join(mappings_folder, event_base_file), "w") as mapping_file: mapping_file.write(torrent_hash) else: logging.warning(f"Couldn't find torrent hash: {event_base_file}") def handle_delete_event(event_file): event_base_file = os.path.basename(event_file) if not event_base_file.lower().endswith((".mkv", ".mp4", ".avi")): logging.warning(f"File has no video format: {event_file}") return mapping_file_path = os.path.join(mappings_folder, event_base_file) if not os.path.exists(mapping_file_path): logging.warning(f"No mapping file-torrent file for file: {event_file}") return with open(mapping_file_path, "r") as mapping_file: torrent_hash = mapping_file.readline().strip() qb = get_qbittorrent_client() qb.delete_permanently(torrent_hash) try: os.remove(mapping_file_path) logging.info(f"File {mapping_file_path} removed successfully.") except OSError as e: if e.errno == errno.ENOENT: logging.warning(f"File {mapping_file_path} does not exist.") else: raise e logging.info(f"Deleted torrent with ID: {torrent_hash}") def main(): i = inotify.adapters.InotifyTree(library_folder, mask=inotify.constants.IN_CREATE | inotify.constants.IN_DELETE) try: logging.info(f"Starting file listener...") for event in i.event_gen(yield_nones=False): (_, event_type, event_path, event_file) = event event_path_file = os.path.join(event_path, event_file) if "IN_CREATE" in event_type: logging.info("Handling create event...") handle_create_event(event_path_file) elif "IN_DELETE" in event_type: logging.info("Handling delete event...") handle_delete_event(event_path_file) except KeyboardInterrupt: logging.info("Exiting...") if __name__ == "__main__": main() ``` ``` from python:3-slim COPY event-manager.py /event-manager.py RUN pip3 install python-qbittorrent inotify && \ chmod 555 /event-manager.py CMD ["python3", "-u", "/event-manager.py"] ``` ``` version: "2" services: radarr_delete_helper: build: ./images/radarr_delete_helper container_name: radarr_delete_helper user: "${PUID}:${PGID}" volumes: - ./data/radarr_delete_helper:/mappings - ./media:/media deploy: resources: limits: cpus: '0.1' memory: 50M environment: - MANAGER_TORRENT_USER=${MANAGER_TORRENT_USER} - MANAGER_TORRENT_PASS=${MANAGER_TORRENT_PASS} - MANAGER_LIBRARY_FOLDER=${MANAGER_LIBRARY_FOLDER} - MANAGER_DOWNLOAD_FOLDER=${MANAGER_DOWNLOAD_FOLDER} cap_drop: - NET_ADMIN - SYS_ADMIN - SYS_MODULE security_opt: - no-new-privileges:true restart: unless-stopped ```
Author
Owner

@tazzuu commented on GitHub (Jul 22, 2025):

Thanks for all the discussion on this topic, I think this is a pretty important functionality for Radarr to have. Example; an Import List adds 10,000 movies to your download queue, you decide you dont want to download those 10,000 movies, you can remove them relatively easily from Radarr (because you set the Import List to include a Tag to identify the registered movies) but its not nearly as easy to remove them from the download client that has already queue'd them up. Because the activity/queue page only shows a max of 200 items per page, so you have to page through 50 pages of items to try to communicate to your download client which items to delete, without disturbing the download clients' other ongoing downloads that you dont want to cancel.

What I find strange, is how the discussion here is focused only on torrent clients, and only certain specific torrent clients at that. I found this GitHub issue from https://github.com/Radarr/Radarr/issues/8911 and a basic Google search for "radarr if you delete a movie that is in downloading status it does not remove it from the download client". But in reality this has nothing to do with "torrent" clients, it has to do with all download clients. examples;

Hit and Runs would be the primary reason.

Hit and Runs dont exist if you are not using torrents, because;

Radarr is a movie collection manager for Usenet and BitTorrent users.

also this is a pretty bizarre statement;

Given not a single person from the community has stepped up to work with the devs to implement this feature (ideally upstream in Sonarr first), it must not be something the community wants as a priority.

I would love to contribute, but sorry I dont know C# which the majority of the codebase seems to be written in. I am also not seeing very many commits from @bakerboy448 here either https://github.com/Radarr/Radarr/graphs/contributors so I am not sure where this attitude is coming from.

With all due respect and appreciation for the project, the idea that this feature (which has been requested for years) would be disregarded out of concerns that some people might accidentally Hit and Run their torrents and that "no one has stepped up to code it themselves" seems like a lot of red herrings. Its fine if the devs just dont have time and want to prioritize other high impact features. But I think there's no need to cast shade or negative sentiment on the userbase for not "stepping up". We all love Radarr and there is nothing wrong with users putting in feature requests and highlighting their issues.

(gonna be real with y'all, if you wanted community participation in development that badly, you know you should have chosen a framework that was not written in C#)

Best regards, thanks for the Radarr project, and I hope this feature can get implemented eventually. ❤️

@tazzuu commented on GitHub (Jul 22, 2025): Thanks for all the discussion on this topic, I think this is a pretty important functionality for Radarr to have. Example; an Import List adds 10,000 movies to your download queue, you decide you dont want to download those 10,000 movies, you can remove them relatively easily from Radarr (because you set the Import List to include a Tag to identify the registered movies) but its not nearly as easy to remove them from the download client that has already queue'd them up. Because the `activity/queue` page only shows a max of 200 items per page, so you have to page through 50 pages of items to try to communicate to your download client which items to delete, without disturbing the download clients' other ongoing downloads that you dont want to cancel. What I find strange, is how the discussion here is focused only on torrent clients, and only certain specific torrent clients at that. I found this GitHub issue from https://github.com/Radarr/Radarr/issues/8911 and a basic Google search for "radarr if you delete a movie that is in downloading status it does not remove it from the download client". But in reality this has nothing to do with "torrent" clients, it has to do with all download clients. examples; > Hit and Runs would be the primary reason. Hit and Runs dont exist if you are not using torrents, because; > Radarr is a movie collection manager for **Usenet** and BitTorrent users. also this is a pretty bizarre statement; > Given not a single person from the community has stepped up to work with the devs to implement this feature (ideally upstream in Sonarr first), it must not be something the community wants as a priority. I would love to contribute, but sorry I dont know C# which the majority of the codebase seems to be written in. I am also not seeing very many commits from @bakerboy448 here either https://github.com/Radarr/Radarr/graphs/contributors so I am not sure where this attitude is coming from. With all due respect and appreciation for the project, the idea that this feature (which has been requested for years) would be disregarded out of concerns that some people might accidentally Hit and Run their torrents and that "no one has stepped up to code it themselves" seems like a lot of red herrings. Its fine if the devs just dont have time and want to prioritize other high impact features. But I think there's no need to cast shade or negative sentiment on the userbase for not "stepping up". We all love Radarr and there is nothing wrong with users putting in feature requests and highlighting their issues. (gonna be real with y'all, if you wanted community participation in development that badly, you know you should have chosen a framework that was not written in C#) Best regards, thanks for the Radarr project, and I hope this feature can get implemented eventually. ❤️
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/Radarr#3782
No description provided.