From d1c26fffa685a72bfc0916c7d1c300624b98246c Mon Sep 17 00:00:00 2001 From: bobokun Date: Sat, 1 Apr 2023 11:25:01 -0400 Subject: [PATCH] adds support for custom noHL tag #210 --- config/config.yml.sample | 1 + modules/config.py | 7 ++++++- modules/qbittorrent.py | 45 +++++++++++++++++++++++----------------- qbit_manage.py | 8 +++---- 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/config/config.yml.sample b/config/config.yml.sample index a26b6e3..6895056 100755 --- a/config/config.yml.sample +++ b/config/config.yml.sample @@ -25,6 +25,7 @@ qbt: settings: force_auto_tmm: False # Will force qBittorrent to enable Automatic Torrent Management for each torrent. tracker_error_tag: issue # Will set the tag of any torrents that do not have a working tracker. + nohardlinks_tag: noHL # Will set the tag of any torrents with no hardlinks. ignoreTags_OnUpdate: # When running tag-update function, it will update torrent tags for a given torrent even if the torrent has at least one or more of the tags defined here. Otherwise torrents will not be tagged if tags exist. - noHL - issue diff --git a/modules/config.py b/modules/config.py index 5030b5d..5d51c0f 100755 --- a/modules/config.py +++ b/modules/config.py @@ -146,8 +146,13 @@ class Config: "tracker_error_tag": self.util.check_for_attribute( self.data, "tracker_error_tag", parent="settings", default="issue" ), + "nohardlinks_tag": self.util.check_for_attribute(self.data, "nohardlinks_tag", parent="settings", default="noHL"), } - default_ignore_tags = ["noHL", self.settings["tracker_error_tag"], "cross-seed"] + + self.tracker_error_tag = self.settings["tracker_error_tag"] + self.nohardlinks_tag = self.settings["nohardlinks_tag"] + + default_ignore_tags = [self.nohardlinks_tag, self.tracker_error_tag, "cross-seed"] self.settings["ignoreTags_OnUpdate"] = self.util.check_for_attribute( self.data, "ignoreTags_OnUpdate", parent="settings", default=default_ignore_tags, var_type="list" ) diff --git a/modules/qbittorrent.py b/modules/qbittorrent.py index 7fe4361..5b1ab10 100755 --- a/modules/qbittorrent.py +++ b/modules/qbittorrent.py @@ -402,6 +402,8 @@ class Qbt: def _has_reached_min_seeding_time_limit(): print_log = [] if torrent.seeding_time >= min_seeding_time * 60: + if "MinSeedTimeNotReached" in torrent.tags: + torrent.remove_tags(tags="MinSeedTimeNotReached") return True else: print_log += logger.print_line(logger.insert_space(f"Torrent Name: {torrent.name}", 3), self.config.loglevel) @@ -468,12 +470,12 @@ class Qbt: num_untag = 0 # counter for number of torrents that previously had no hardlinks but now have hardlinks def add_tag_no_hl(add_tag=True): - """Add tag noHL to torrents with no hardlinks""" + """Add tag nohardlinks_tag to torrents with no hardlinks""" nonlocal num_tags, torrent, tracker, nohardlinks, category, max_ratio, max_seeding_time body = [] body.append(logger.insert_space(f"Torrent Name: {torrent.name}", 3)) if add_tag: - body.append(logger.insert_space("Added Tag: noHL", 6)) + body.append(logger.insert_space(f"Added Tag: {self.config.nohardlinks_tag}", 6)) title = "Tagging Torrents with No Hardlinks" else: title = "Changing Share Ratio of Torrents with No Hardlinks" @@ -483,13 +485,13 @@ class Qbt: max_ratio, max_seeding_time, nohardlinks[category]["limit_upload_speed"], - tags="noHL", + tags=self.config.nohardlinks_tag, do_print=False, ) if body_tags_and_limits or add_tag: num_tags += 1 # Resume torrent if it was paused now that the share limit has changed - if torrent.state == "pausedUP" and nohardlinks[category]["resume_torrent_after_untagging_noHL"]: + if torrent.state_enum.is_complete and nohardlinks[category]["resume_torrent_after_untagging_noHL"]: if not self.config.dry_run: torrent.resume() body.extend(body_tags_and_limits) @@ -501,7 +503,7 @@ class Qbt: "body": "\n".join(body), "torrent_name": torrent.name, "torrent_category": torrent.category, - "torrent_tag": "noHL", + "torrent_tag": self.config.nohardlinks_tag, "torrent_tracker": tracker["url"], "notifiarr_indexer": tracker["notifiarr"], "torrent_max_ratio": max_ratio, @@ -535,7 +537,7 @@ class Qbt: continue else: # Checks for any hardlinks and not already tagged - # Cleans up previously tagged noHL torrents that no longer have hardlinks + # Cleans up previously tagged nohardlinks_tag torrents that no longer have hardlinks if has_nohardlinks: tracker = self.config.get_tags(torrent.trackers) # Determine min_seeding_time. @@ -575,8 +577,8 @@ class Qbt: elif nohardlinks[category]["max_seeding_time"]: max_seeding_time = nohardlinks[category]["max_seeding_time"] - # Will only tag new torrents that don't have noHL tag - if "noHL" not in torrent.tags: + # Will only tag new torrents that don't have nohardlinks_tag tag + if self.config.nohardlinks_tag not in torrent.tags: add_tag_no_hl(add_tag=True) # Deletes torrent with data if cleanup is set to true and meets the ratio/seeding requirements @@ -599,16 +601,20 @@ class Qbt: else: # Updates torrent to see if "MinSeedTimeNotReached" tag has been added torrent = self.get_torrents({"torrent_hashes": [torrent.hash]}).data[0] - # Checks to see if previously noHL share limits have changed. + # Checks to see if previously nohardlinks_tag share limits have changed. add_tag_no_hl(add_tag=False) - # Checks to see if previous noHL tagged torrents now have hardlinks. - if not (has_nohardlinks) and ("noHL" in torrent.tags): + # Checks to see if previous nohardlinks_tag tagged torrents now have hardlinks. + if not (has_nohardlinks) and (self.config.nohardlinks_tag in torrent.tags): num_untag += 1 body = [] body += logger.print_line( - f"Previous Tagged noHL Torrent Name: {torrent.name} has hardlinks found now.", self.config.loglevel + f"Previous Tagged {self.config.nohardlinks_tag} " + f"Torrent Name: {torrent.name} has hardlinks found now.", + self.config.loglevel, + ) + body += logger.print_line( + logger.insert_space(f"Removed Tag: {self.config.nohardlinks_tag}", 6), self.config.loglevel ) - body += logger.print_line(logger.insert_space("Removed Tag: noHL", 6), self.config.loglevel) body += logger.print_line(logger.insert_space(f'Tracker: {tracker["url"]}', 8), self.config.loglevel) body += logger.print_line( f"{'Not Reverting' if self.config.dry_run else 'Reverting'} to tracker or Global share limits.", @@ -624,13 +630,13 @@ class Qbt: if restore_limit_upload_speed is None: restore_limit_upload_speed = -1 if not self.config.dry_run: - torrent.remove_tags(tags="noHL") + torrent.remove_tags(tags=self.config.nohardlinks_tag) body.extend( self.set_tags_and_limits( torrent, restore_max_ratio, restore_max_seeding_time, restore_limit_upload_speed, restore=True ) ) - if torrent.state == "pausedUP" and nohardlinks[category]["resume_torrent_after_untagging_noHL"]: + if torrent.state_enum.is_complete and nohardlinks[category]["resume_torrent_after_untagging_noHL"]: torrent.resume() attr = { "function": "untag_nohardlinks", @@ -638,7 +644,7 @@ class Qbt: "body": "\n".join(body), "torrent_name": torrent.name, "torrent_category": torrent.category, - "torrent_tag": "noHL", + "torrent_tag": self.config.nohardlinks_tag, "torrent_tracker": tracker["url"], "notifiarr_indexer": tracker["notifiarr"], "torrent_max_ratio": restore_max_ratio, @@ -652,7 +658,7 @@ class Qbt: for torrent in torrent_list: t_name = torrent.name t_hash = torrent.hash - if t_hash in tdel_dict and "noHL" in torrent.tags: + if t_hash in tdel_dict and self.config.nohardlinks_tag in torrent.tags: t_count = self.torrentinfo[t_name]["count"] t_msg = self.torrentinfo[t_name]["msg"] t_status = self.torrentinfo[t_name]["status"] @@ -718,7 +724,8 @@ class Qbt: logger.print_line("No torrents to tag with no hardlinks.", self.config.loglevel) if num_untag >= 1: logger.print_line( - f"{'Did not delete' if self.config.dry_run else 'Deleted'} noHL tags / share limits for {num_untag} " + f"{'Did not delete' if self.config.dry_run else 'Deleted'} " + f"{self.config.nohardlinks_tag} tags / share limits for {num_untag} " f".torrent{'s.' if num_untag > 1 else '.'}", self.config.loglevel, ) @@ -743,7 +750,7 @@ class Qbt: num_tor_error = 0 num_untag = 0 tor_error_summary = "" - tag_error = self.config.settings["tracker_error_tag"] + tag_error = self.config.tracker_error_tag cfg_rem_unregistered = self.config.commands["rem_unregistered"] cfg_tag_error = self.config.commands["tag_tracker_error"] diff --git a/qbit_manage.py b/qbit_manage.py index 9b24705..c2c6742 100755 --- a/qbit_manage.py +++ b/qbit_manage.py @@ -434,9 +434,9 @@ def start(): if stats["rem_unreg"] > 0: stats_summary.append(f"Total Unregistered Torrents Removed: {stats['rem_unreg']}") if stats["tagged_tracker_error"] > 0: - stats_summary.append(f"Total {cfg.settings['tracker_error_tag']} Torrents Tagged: {stats['tagged_tracker_error']}") + stats_summary.append(f"Total {cfg.tracker_error_tag} Torrents Tagged: {stats['tagged_tracker_error']}") if stats["untagged_tracker_error"] > 0: - stats_summary.append(f"Total {cfg.settings['tracker_error_tag']} Torrents untagged: {stats['untagged_tracker_error']}") + stats_summary.append(f"Total {cfg.tracker_error_tag} Torrents untagged: {stats['untagged_tracker_error']}") if stats["added"] > 0: stats_summary.append(f"Total Torrents Added: {stats['added']}") if stats["resumed"] > 0: @@ -450,9 +450,9 @@ def start(): if stats["orphaned"] > 0: stats_summary.append(f"Total Orphaned Files: {stats['orphaned']}") if stats["tagged_noHL"] > 0: - stats_summary.append(f"Total noHL Torrents Tagged: {stats['tagged_noHL']}") + stats_summary.append(f"Total {cfg.nohardlinks_tag} Torrents Tagged: {stats['tagged_noHL']}") if stats["untagged_noHL"] > 0: - stats_summary.append(f"Total noHL Torrents untagged: {stats['untagged_noHL']}") + stats_summary.append(f"Total {cfg.nohardlinks_tag} Torrents untagged: {stats['untagged_noHL']}") if stats["recycle_emptied"] > 0: stats_summary.append(f"Total Files Deleted from Recycle Bin: {stats['recycle_emptied']}") if stats["orphaned_emptied"] > 0: