qbit_manage/modules/core/recheck.py
bobokun c70d230fa6
4.4.0 (#845)
# Requirements Updated
- requests==2.32.4
- ruamel.yaml==0.18.14

# New Updates
- Added Web API server feature for running commands via HTTP requests
  - New `--web-server` flag to start the API server
  - API requests during scheduled runs are automatically queued
  - Queued requests are processed after the scheduled run completes
- See
[docs/Web-API.md](https://github.com/StuffAnThings/qbit_manage/wiki/Web-API)
for usage instructions
- Renamed `last_active` to `min_last_active`
- Added `max_last_active` to `share_limits` (Closes #774)
- Added new
[restore_torrents.py](https://github.com/StuffAnThings/qbit_manage/blob/develop/scripts/restore_torrents.py)
script for restoring deleted files+torrents in RecycleBin

## Bug Fixes
- (fix): don't reapply tags every run when torrent (#824) (Thanks to
@xx4h)
- Fix share limits always re-applying when using global Limit (-2)
(Closes #831) (Thanks to @chrisfosterelli)

**Full Changelog**:
https://github.com/StuffAnThings/qbit_manage/compare/v4.3.0...v4.4.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Actionbot <actions@github.com>
Co-authored-by: bakerboy448 <55419169+bakerboy448@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Gerald Lau <glau@bitdefender.com>
Co-authored-by: Patchy3767 <birabinowitz+github@gmail.com>
Co-authored-by: Fabian Sylvester <xx4h@xx4h.de>
Co-authored-by: ineednewpajamas <73252768+ineednewpajamas@users.noreply.github.com>
Co-authored-by: Chris Foster <chris.james.foster@gmail.com>
2025-06-22 07:41:55 -04:00

138 lines
7.4 KiB
Python

from datetime import timedelta
from modules import util
logger = util.logger
class ReCheck:
def __init__(self, qbit_manager, hashes: list[str] = None):
self.qbt = qbit_manager
self.config = qbit_manager.config
self.hashes = hashes
self.client = qbit_manager.client
self.stats_resumed = 0
self.stats_rechecked = 0
self.torrents_updated_recheck = [] # List of torrents updated
# List of single torrent attributes to send to notifiarr
self.notify_attr_recheck = []
self.torrents_updated_resume = [] # List of torrents updated
self.notify_attr_resume = [] # List of single torrent attributes to send to notifiarr
self.recheck()
self.config.webhooks_factory.notify(self.torrents_updated_resume, self.notify_attr_resume, group_by="tag")
self.config.webhooks_factory.notify(self.torrents_updated_recheck, self.notify_attr_recheck, group_by="tag")
def recheck(self):
"""Function used to recheck paused torrents sorted by size and resume torrents that are completed"""
if self.config.commands["recheck"]:
logger.separator("Rechecking Paused Torrents", space=False, border=False)
# sort by size and paused
torrent_list_filter = {"status_filter": "paused", "sort": "size"}
if self.hashes:
torrent_list_filter["torrent_hashes"] = self.hashes
torrent_list = self.qbt.get_torrents(torrent_list_filter)
if torrent_list:
for torrent in torrent_list:
tracker = self.qbt.get_tags(self.qbt.get_tracker_urls(torrent.trackers))
t_name = torrent.name
t_category = torrent.category
# Resume torrent if completed
if torrent.progress == 1:
if torrent.ratio_limit < 0 and torrent.seeding_time_limit < 0:
self.stats_resumed += 1
body = logger.print_line(
f"{'Not Resuming' if self.config.dry_run else 'Resuming'} [{tracker['tag']}] - {t_name}",
self.config.loglevel,
)
attr = {
"function": "recheck",
"title": "Resuming Torrent",
"body": body,
"torrents": [t_name],
"torrent_tag": ", ".join(tracker["tag"]),
"torrent_category": t_category,
"torrent_tracker": tracker["url"],
"notifiarr_indexer": tracker["notifiarr"],
}
self.torrents_updated_resume.append(t_name)
self.notify_attr_resume.append(attr)
if not self.config.dry_run:
torrent.resume()
else:
# Check to see if torrent meets AutoTorrentManagement criteria
logger.debug("DEBUG: Torrent to see if torrent meets AutoTorrentManagement Criteria")
logger.debug(logger.insert_space(f"- Torrent Name: {t_name}", 2))
logger.debug(
logger.insert_space(f"-- Ratio vs Max Ratio: {torrent.ratio:.2f} vs {torrent.ratio_limit:.2f}", 4)
)
logger.debug(
logger.insert_space(
f"-- Seeding Time vs Max Seed Time: {str(timedelta(seconds=torrent.seeding_time))} vs "
f"{str(timedelta(minutes=torrent.seeding_time_limit))}",
4,
)
)
if (
(
torrent.ratio_limit >= 0
and torrent.ratio < torrent.ratio_limit
and torrent.seeding_time_limit < 0
)
or (
torrent.seeding_time_limit >= 0
and (torrent.seeding_time < (torrent.seeding_time_limit * 60))
and torrent.ratio_limit < 0
)
or (
torrent.ratio_limit >= 0
and torrent.seeding_time_limit >= 0
and torrent.ratio < torrent.ratio_limit
and (torrent.seeding_time < (torrent.seeding_time_limit * 60))
)
):
self.stats_resumed += 1
body = logger.print_line(
f"{'Not Resuming' if self.config.dry_run else 'Resuming'} [{tracker['tag']}] - {t_name}",
self.config.loglevel,
)
attr = {
"function": "recheck",
"title": "Resuming Torrent",
"body": body,
"torrents": [t_name],
"torrent_tag": ", ".join(tracker["tag"]),
"torrent_category": t_category,
"torrent_tracker": tracker["url"],
"notifiarr_indexer": tracker["notifiarr"],
}
self.torrents_updated_resume.append(t_name)
self.notify_attr_resume.append(attr)
if not self.config.dry_run:
torrent.resume()
# Recheck
elif (
torrent.progress == 0
and self.qbt.torrentinfo[t_name]["is_complete"]
and not torrent.state_enum.is_checking
):
self.stats_rechecked += 1
body = logger.print_line(
f"{'Not Rechecking' if self.config.dry_run else 'Rechecking'} [{tracker['tag']}] - {t_name}",
self.config.loglevel,
)
attr = {
"function": "recheck",
"title": "Rechecking Torrent",
"body": body,
"torrents": [t_name],
"torrent_tag": ", ".join(tracker["tag"]),
"torrent_category": t_category,
"torrent_tracker": tracker["url"],
"notifiarr_indexer": tracker["notifiarr"],
}
self.torrents_updated_recheck.append(t_name)
self.notify_attr_recheck.append(attr)
if not self.config.dry_run:
torrent.recheck()