added min tor time, large performance improvement #12

Merged
jonbranan merged 1 commits from minimum_tor_time into main 2022-07-23 15:47:12 -05:00
6 changed files with 60 additions and 48 deletions

View File

@ -65,7 +65,9 @@ You will need a category-whitelist.json in the root directory. This will ignore
| non_protected_tag | we don't care about these torrents | | non_protected_tag | we don't care about these torrents |
| logpath | will write a log in root directory if left as is other wise specify other path using forward slashes | | logpath | will write a log in root directory if left as is other wise specify other path using forward slashes |
| age | number, seconds for how long we keep torrents from IPTORRENTS | | age | number, seconds for how long we keep torrents from IPTORRENTS |
| minimum_age | age in seconds torrents should reached before they are removed |
| use_pushover | true or false to enable or disable pushover notification summary | | use_pushover | true or false to enable or disable pushover notification summary |
| use_log | true or false to enable or disable writing to alog file | | use_log | true or false to enable or disable writing to alog file |
| po_key | pushover key | | po_key | pushover key |
| po_token | pushover api token | | po_token | pushover api token |
| delete_torrents | true or false to enable or disable deletion. Useful for dry-runs |

View File

@ -8,8 +8,10 @@
"protected_tag": "ipt", "protected_tag": "ipt",
"non_protected_tag": "public", "non_protected_tag": "public",
"age": 2419200, "age": 2419200,
"minimum_age": 432000,
"use_pushover": true, "use_pushover": true,
"use_log": true, "use_log": true,
"po_key": "", "po_key": "",
"po_token": "" "po_token": "",
"delete_torrents": false
} }

View File

@ -37,6 +37,8 @@ class Qbt:
self.loglevel = self.config["loglevel"] self.loglevel = self.config["loglevel"]
self.tracker_protected_tag = self.config["protected_tag"] self.tracker_protected_tag = self.config["protected_tag"]
self.tracker_non_protected_tag = self.config["non_protected_tag"] self.tracker_non_protected_tag = self.config["non_protected_tag"]
self.minimum_age = self.config["minimum_age"]
self.age = self.config["age"]
# Calling log and notify functions # Calling log and notify functions
torlog(self) torlog(self)
tornotify(self) tornotify(self)
@ -46,6 +48,7 @@ class Qbt:
self.tracker_whitelist = load(f) self.tracker_whitelist = load(f)
self.tracker_list = [] self.tracker_list = []
self.up_tor_counter = 0 self.up_tor_counter = 0
self.preme_tor_counter = 0
self.torrent_hash_delete_list = [] self.torrent_hash_delete_list = []
if self.use_log: if self.use_log:
self.tl.debug(self.tracker_whitelist) self.tl.debug(self.tracker_whitelist)

View File

@ -9,6 +9,9 @@ def buildtorlist(self):
torrent = self.torrentlist.pop() torrent = self.torrentlist.pop()
if self.use_log: if self.use_log:
self.tl.debug(f'["{torrent["name"][0:20]}..."] {torrent["infohash_v1"]}') self.tl.debug(f'["{torrent["name"][0:20]}..."] {torrent["infohash_v1"]}')
if torrent['added_on'] + self.minimum_age <= self.t.time():
self.preme_tor_counter += 1
continue
if torrent['category'] in self.cat_whitelist.values(): if torrent['category'] in self.cat_whitelist.values():
self.tl.info(f'Ignored torrent:["{torrent["name"][0:20]}..."]') self.tl.info(f'Ignored torrent:["{torrent["name"][0:20]}..."]')
continue continue
@ -27,36 +30,4 @@ def buildtorlist(self):
self.tl.debug(f'Non-protected torrent: {torrent["tracker"]}hash: {torrent["hash"]}') self.tl.debug(f'Non-protected torrent: {torrent["tracker"]}hash: {torrent["hash"]}')
if torrent['tags'] == '': if torrent['tags'] == '':
self.qbt_client.torrents_add_tags(self.tracker_non_protected_tag,torrent['hash']) self.qbt_client.torrents_add_tags(self.tracker_non_protected_tag,torrent['hash'])
self.tracker_list.append(torrent) self.tracker_list.append(torrent)
def writetor(self, filepath='./torrentinfo.txt'):
"""Write all torrent data to a file.
Useful for development of new features.
"""
with open(filepath, 'w') as fp:
fp.write(str(self.torrentlist))
def listfirsttor(self, index=0):
"""Only lists the first torrent"""
self.tl.debug('First torrent in the list:')
torrent = self.torrentlist[index]
for k,v in torrent.items():
self.tl.debug(f'{k}: {v}')
self.tl.debug('\n')
def listqbitapiinfo(self):
"""Writes torrent info to log file"""
self.tl.debug(f'qBittorrent: {self.qbt_client.app.version}')
self.tl.debug(f'qBittorrent Web API: {self.qbt_client.app.web_api_version}')
def torrentcount(self):
"""write torrent counts to log file"""
self.tl.debug(f'torrents that are protected {self.tracker_list.count("ipt")}')
self.tl.debug(f'torrents that aren\'t protected {self.tracker_list.count("public")}')
def tordeletetags(self):
tag_list = [self.tracker_protected_tag, self.tracker_non_protected_tag]
self.qbt_client.torrents_delete_tags(tag_list)
def torlisttags(self):
pass

View File

@ -19,12 +19,53 @@ def tornotifytest(self):
def tornotifysummary(self): def tornotifysummary(self):
"""Main notification method when the app is used in an automated fashion""" """Main notification method when the app is used in an automated fashion"""
self.poc.send_message(f" Total: {self.total_torrents}\n\ self.poc.send_message(f" Total: {self.total_torrents}\n\
Premature: {self.preme_tor_counter}\n\
Protected: {self.c[self.tracker_protected_tag]}\n\ Protected: {self.c[self.tracker_protected_tag]}\n\
Non-protected: {self.c[self.tracker_non_protected_tag]}\n\ Non-protected: {self.c[self.tracker_non_protected_tag]}\n\
Marked for deletion: {len(self.torrent_hash_delete_list)}\n\ Marked for deletion: {len(self.torrent_hash_delete_list)}\n\
Orphaned: {self.up_tor_counter}", title="--- qbit-maid summary ---") Orphaned: {self.up_tor_counter}", title="--- qbit-maid summary ---")
def printprocessor(self):
"""Print summary of torrents"""
self.c = self.ct()
for item in self.tracker_list:
self.c[item["tags"]] += 1
self.tl.info(f'Total: {self.total_torrents}')
self.tl.info(f'Premature: {self.preme_tor_counter}')
self.tl.info(f'Protected: {self.c[self.tracker_protected_tag]}')
self.tl.info(f'Non-protected: {self.c[self.tracker_non_protected_tag]}')
self.tl.info(f'Orphaned: {self.up_tor_counter}')
self.tl.info(f'Marked for deletion: {len(self.torrent_hash_delete_list)}')
def getunixtimestamp(self): def getunixtimestamp(self):
"""Used for debuging and development related to unixtimestamps, not used in main script but useful""" """Used for debuging and development related to unixtimestamps, not used in main script but useful"""
self.uts = self.t.time() self.uts = self.t.time()
self.tl.info(self.uts) self.tl.info(self.uts)
def writetor(self, filepath='./torrentinfo.txt'):
"""Write all torrent data to a file.
Useful for development of new features.
"""
with open(filepath, 'w') as fp:
fp.write(str(self.torrentlist))
def listfirsttor(self, index=0):
"""Only lists the first torrent"""
self.tl.debug('First torrent in the list:')
torrent = self.torrentlist[index]
for k,v in torrent.items():
self.tl.debug(f'{k}: {v}')
self.tl.debug('\n')
def listqbitapiinfo(self):
"""Writes torrent info to log file"""
self.tl.debug(f'qBittorrent: {self.qbt_client.app.version}')
self.tl.debug(f'qBittorrent Web API: {self.qbt_client.app.web_api_version}')
def torrentcount(self):
"""write torrent counts to log file"""
self.tl.debug(f'torrents that are protected {self.tracker_list.count("ipt")}')
self.tl.debug(f'torrents that aren\'t protected {self.tracker_list.count("public")}')
def torlisttags(self):
pass

View File

@ -10,9 +10,9 @@ def torprocessor(self):
elif canidate['ratio'] < float(1.05) and self.tracker_protected_tag in canidate["tags"]: elif canidate['ratio'] < float(1.05) and self.tracker_protected_tag in canidate["tags"]:
if self.use_log: if self.use_log:
self.tl.debug(f'["{canidate["name"][0:20]}..."] is below a 1.05 ratio({canidate["ratio"]})') self.tl.debug(f'["{canidate["name"][0:20]}..."] is below a 1.05 ratio({canidate["ratio"]})')
if canidate['added_on'] + self.config["age"] <= self.t.time(): if canidate['added_on'] + self.age <= self.t.time():
if self.use_log: if self.use_log:
self.tl.debug(f'["{canidate["name"][0:20]}..."] Seconds old: {self.t.time() - self.config["age"] - canidate["added_on"]}') self.tl.debug(f'["{canidate["name"][0:20]}..."] Seconds old: {self.t.time() - self.age - canidate["added_on"]}')
self.torrent_hash_delete_list.append(canidate['infohash_v1']) self.torrent_hash_delete_list.append(canidate['infohash_v1'])
if self.use_log: if self.use_log:
self.tl.info(f'Submitted ["{canidate["name"][0:20]}..."] for deletion from the protected list.') self.tl.info(f'Submitted ["{canidate["name"][0:20]}..."] for deletion from the protected list.')
@ -31,16 +31,9 @@ def torprocessor(self):
self.up_tor_counter += 1 self.up_tor_counter += 1
continue continue
def printprocessor(self): def tordeletetags(self):
"""Print summary of torrents""" tag_list = [self.tracker_protected_tag, self.tracker_non_protected_tag]
self.c = self.ct() self.qbt_client.torrents_delete_tags(tag_list)
for item in self.tracker_list:
self.c[item["tags"]] += 1
self.tl.info(f'Total: {self.total_torrents}')
self.tl.info(f'Protected: {self.c[self.tracker_protected_tag]}')
self.tl.info(f'Non-protected: {self.c[self.tracker_non_protected_tag]}')
self.tl.info(f'Orphaned: {self.up_tor_counter}')
self.tl.info(f'Marked for deletion: {len(self.torrent_hash_delete_list)}')
def tordelete(self): def tordelete(self):
"""Remove torrents, will also delete files, this keeps the filesystem clean. """Remove torrents, will also delete files, this keeps the filesystem clean.