AlistGo/alist · error

failed to delete qbittorrent task

Error message

failed to delete qbittorrent task

What it means

POSTing to /api/v2/torrents/delete with the torrent hash and deleteFiles flag returned a non-200 status. The torrent removal itself failed before tag cleanup is attempted.

Source

Thrown at pkg/qbittorrent/client.go:353

	}

	info, err := c.GetInfo(id)
	if err != nil {
		return err
	}
	v := url.Values{}
	v.Set("hashes", info.Hash)
	if deleteFiles {
		v.Set("deleteFiles", "true")
	} else {
		v.Set("deleteFiles", "false")
	}
	response, err := c.post("/api/v2/torrents/delete", v)
	if err != nil {
		return err
	}
	if response.StatusCode != 200 {
		return errors.New("failed to delete qbittorrent task")
	}

	v = url.Values{}
	v.Set("tags", "alist-"+id)
	response, err = c.post("/api/v2/torrents/deleteTags", v)
	if err != nil {
		return err
	}
	if response.StatusCode != 200 {
		return errors.New("failed to delete qbittorrent tag")
	}
	return nil
}

View on GitHub (pinned to 843d9dc814)

Solutions

  1. Treat an already-deleted torrent as success (idempotent delete) by listing hashes first and skipping missing ones
  2. Check authorization by re-logging in if status is 403
  3. Inspect qBittorrent logs for file-deletion permission failures when deleteFiles=true

Example fix

// before
if err := c.DeleteTorrent(info, true, id); err != nil { return err }

// after
if err := c.DeleteTorrent(info, true, id); err != nil {
    if strings.Contains(err.Error(), "failed to delete qBittorrent task") {
        // verify whether it still exists; treat missing as success
        if !c.TorrentExists(info.Hash) { return nil }
    }
    return err
}
Defensive patterns

Strategy: try-catch

Validate before calling

hashes, _ := c.ListTorrentHashes()
if !sliceContains(hashes, info.Hash) {
	return nil // already gone; nothing to do
}

Try / catch

err := c.DeleteTorrent(info, deleteFiles, id)
if err != nil && strings.Contains(err.Error(), "failed to delete qbittorrent task") {
	if !c.TorrentExists(info.Hash) { return nil } // idempotent
	return err
}

Prevention

When it happens

Trigger: Calling DeleteTorrent with a stale/already-removed hash, an unauthorized session (403), or when qBittorrent cannot delete files from disk (permission error surfaces as non-200).

Common situations: Torrent was manually deleted from qBittorrent between listing and deleting; qBittorrent restarted (session reset); the alist tag "alist-<id>" already removed.

Related errors


AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15). Data as JSON: /api/errors/905e39c96aa2cccd. Report an issue: GitHub.