diff --git a/.drone.yml b/.drone.yml index 9ca72bf..afae4a7 100644 --- a/.drone.yml +++ b/.drone.yml @@ -39,7 +39,7 @@ steps: image: git.jonb.io/jblu/qbit-maid:latest commands: - python test_qbitmaid.py - - python test_dragnet.py + - python test_write_csv.py when: branch: - main @@ -50,7 +50,7 @@ steps: image: git.jonb.io/jblu/qbit-maid:dev commands: - python test_qbitmaid.py - - python test_dragnet.py + - python test_write_csv.py when: branch: - dev* diff --git a/config.toml.example b/config.toml.example index 2d0b079..59a5eee 100755 --- a/config.toml.example +++ b/config.toml.example @@ -14,8 +14,8 @@ protected_tag = "ipt" non_protected_tag = "public" [torrent] -age = 2419200 -minimum_age = 432000 +max_age = 2419200 +min_age = 432000 delete_torrents = false [pushover] diff --git a/qbit-maid.py b/qbit-maid.py index 82f6c86..6c5dbd1 100755 --- a/qbit-maid.py +++ b/qbit-maid.py @@ -55,8 +55,8 @@ class Qbt: #torrent self.delete_torrents = self.config["torrent"]["delete_torrents"] - self.minimum_age = self.config["torrent"]["minimum_age"] - self.age = self.config["torrent"]["age"] + self.min_age = self.config["torrent"]["min_age"] + self.max_age = self.config["torrent"]["max_age"] #pushover self.use_pushover = self.config["pushover"]["use_pushover"] @@ -73,6 +73,10 @@ class Qbt: self.enable_dragnet = self.config["dragnet"]["enable_dragnet"] self.dragnet_outfile = self.config["dragnet"]["dragnet_outfile"] + #telemetry + self.enable_telemetry = self.config["telemetry"]["enable_telemetry"] + self.telemetry_outfile = self.config["telemetry"]["telemetry_outfile"] + #ignored_categories self.cat_whitelist = self.config["ignored_categories"] @@ -112,6 +116,7 @@ class Qbt: if self.use_log: list_qbit_api_info(self) list_first_tor(self) + debug_torrent_list(self) build_tor_list(self) process_counts(self) if self.use_log: diff --git a/qlist.py b/qlist.py index b3b3f76..2b445a9 100755 --- a/qlist.py +++ b/qlist.py @@ -12,7 +12,7 @@ def build_tor_list(self): # Need a way to tag when the tracker is blank if is_tracker_blank(torrent['tracker']): if self.use_log: - self.tl.warning(f'Torrent doesn\'t have a tracker ["{torrent["name"][0:20]}..."] [{torrent["tracker"]}]hash: {torrent["hash"]}') + self.tl.warning(f'Torrent doesn\'t have a tracker ["{torrent["name"][0:20]}..."] hash: {torrent["hash"]}') self.ignored_counter += 1 continue elif is_cat_ignored(torrent['category'], self.cat_whitelist.values()): @@ -32,9 +32,9 @@ def build_tor_list(self): self.qbt_client.torrents_add_tags(self.tracker_protected_tag,torrent['hash']) elif is_not_protected_tracker(torrent['tracker'], self.tracker_whitelist.values()): self.qbt_client.torrents_add_tags(self.tracker_non_protected_tag,torrent['hash']) - if is_preme(torrent['added_on'], self.minimum_age, self.t.time()): + if is_preme(torrent['seeding_time'], self.min_age): self.preme_tor_counter += 1 - self.tl.debug(f'Premature torrent: ["{torrent["name"][0:20]}..."] hash: {torrent["hash"]}') + self.tl.debug(f'Premature torrent: ["{torrent["name"][0:20]}..."] Seconds Seeded: [{torrent["seeding_time"]}] hash: {torrent["hash"]}') continue elif is_protected_tracker(torrent['tracker'], self.tracker_whitelist.values()): if is_tag_blank(torrent['tags']): @@ -50,8 +50,8 @@ def build_tor_list(self): self.tracker_list.append(torrent) -def is_preme(added, minage, time): - if added + minage >= time: +def is_preme(seeding_time, minage): + if seeding_time <= minage: return True def is_cat_ignored(cat, catlist): diff --git a/qlogging.py b/qlogging.py index f1aa323..9c6d0ba 100755 --- a/qlogging.py +++ b/qlogging.py @@ -90,4 +90,7 @@ def send_ping(self, req_obj, healthcheck_url): try: req_obj.get(healthcheck_url, timeout=10) except req_obj.RequestException as e: - self.tl.info(f"Ping failed: {e}") \ No newline at end of file + self.tl.info(f"Ping failed: {e}") + +def debug_torrent_list(self): + self.tl.debug(self.torrent_list) \ No newline at end of file diff --git a/qprocess.py b/qprocess.py index 38cd649..6f375d3 100755 --- a/qprocess.py +++ b/qprocess.py @@ -3,6 +3,10 @@ def tor_processor(self): If torrent meets criteria for deletion, its infohash_v1 will be appended to self.torrent_hash_delete_list """ for canidate in self.tracker_list: + if self.enable_telemetry: + header = ['state','ratio','tags','added','hash','name','tracker'] + row = [canidate['state'],canidate['ratio'],canidate["tags"],canidate['added_on'],canidate['infohash_v1'],canidate["name"][0:20],canidate['tracker']] + write_csv(self.cv,self.telemetry_outfile,header,row) if self.use_log: self.tl.debug(f'---Reviewing canidate: ["{canidate["name"][0:20]}..."] {canidate["infohash_v1"]}---') if is_downloading(canidate['state']): @@ -12,9 +16,9 @@ def tor_processor(self): elif is_protected_under_ratio(canidate['ratio'], 1.05, self.tracker_protected_tag, canidate["tags"]): if self.use_log: self.tl.debug(f'["{canidate["name"][0:20]}..."] is below a 1.05 ratio({canidate["ratio"]})') - if is_old_tor(canidate['added_on'], self.age, self.t.time()): + if is_old_tor(canidate['time_active'], self.max_age): if self.use_log: - self.tl.debug(f'["{canidate["name"][0:20]}..."] Seconds old: {self.t.time() - self.age - canidate["added_on"]}') + self.tl.debug(f'["{canidate["name"][0:20]}..."] Seconds old: {canidate["time_active"]} Delta: {canidate["time_active"] - self.max_age}') self.torrent_hash_delete_list.append(canidate['infohash_v1']) if self.use_log: self.tl.info(f'Submitted ["{canidate["name"][0:20]}..."] for deletion from the protected list.') @@ -30,7 +34,9 @@ def tor_processor(self): self.tl.info(f'Submitted ["{canidate["name"][0:20]}..."] for deletion.') else: if self.enable_dragnet: - dragnet(self.cv,self.dragnet_outfile,canidate['state'],canidate['ratio'],canidate["tags"],canidate['added_on'],self.age,self.t.time(),canidate['infohash_v1'],canidate["name"][0:20],canidate['tracker']) + header = ['state','ratio','tags','added','thash','tname','trname'] + row = [canidate['state'],canidate['ratio'],canidate["tags"],canidate['added_on'],canidate['infohash_v1'],canidate["name"][0:20],canidate['tracker']] + write_csv(self.cv,self.dragnet_outfile,header,row) self.tl.info(f'["{canidate["name"][0:20]}..."] is orphaned.') self.up_tor_counter += 1 continue @@ -56,8 +62,8 @@ def is_protected_under_ratio(torratio, setratio, settag, tortag): if torratio < float(setratio) and settag in tortag: return True -def is_old_tor(toradd, setage, currenttime): - if toradd + setage <= currenttime: +def is_old_tor(realage, maxage): + if realage >= maxage: return True def is_protected_over_ratio(torratio, setratio, settag, tortag): @@ -68,9 +74,7 @@ def is_not_protected_tor(setnonprotectedtag, tortags): if setnonprotectedtag in tortags: return True -def dragnet(csv_obj,outfile,state,ratio,tags,added,age,time,thash,tname,trname): - header = ['state','ratio','tags','added','age','time','thash','tname','trname'] - row = [state,ratio,tags,added,age,time,thash,tname,trname] +def write_csv(csv_obj,outfile,header,row): with open(outfile, 'a+', encoding='UTF8', newline='') as f: writer = csv_obj.writer(f) if f.tell() == 0: diff --git a/test_dragnet.py b/test_dragnet.py deleted file mode 100755 index a1fca29..0000000 --- a/test_dragnet.py +++ /dev/null @@ -1,21 +0,0 @@ -from qprocess import dragnet -import csv -import unittest - -class TestDragnet(unittest.TestCase): - def test_dragnet_sanity(self): - self.cv = csv - outfile = './test_outfile.csv' - state = 'downloading' - ratio = 1.05 - tags = 'ipt' - added = 1 - age = 240000 - time = 123456 - thash = 'asfasdf23412adfqwer' - tname = 'thisismynamehahahah' - trname = 'https://localhost.stackoverflow.tech/317332f1c125bc9c1b9b14fb8e054908/announce' - dragnet(self.cv,outfile,state,ratio,tags,added,age,time,thash,tname,trname) - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/test_qbitmaid.py b/test_qbitmaid.py index 2c599f2..36e20c4 100755 --- a/test_qbitmaid.py +++ b/test_qbitmaid.py @@ -4,8 +4,9 @@ from qprocess import is_downloading,is_protected_under_ratio,is_old_tor,is_prote class TestQbitmaid(unittest.TestCase): def test_ispreme_sanity(self): - self.assertTrue(is_preme(1,1,1)) - self.assertFalse(is_preme(1,1,3)) + self.assertTrue(is_preme(1,1)) + self.assertTrue(is_preme(1,2)) + self.assertFalse(is_preme(2,1)) def test_ispreme(self): pass @@ -68,12 +69,12 @@ class TestQbitmaid(unittest.TestCase): pass def test_isoldtor_sanity(self): - self.assertTrue(is_old_tor(1,2,4)) + self.assertFalse(is_old_tor(1,2)) def test_isoldtor(self): - self.assertFalse(is_old_tor(1661150664,2419200,1662049004.2101078)) - self.assertFalse(is_old_tor(1661150664,2419200,1662049004)) - self.assertFalse(is_old_tor(1661150664.000000,2419200.0000000,1662049004.2101078)) + self.assertTrue(is_old_tor(1,1)) + self.assertTrue(is_old_tor(2,1)) + self.assertFalse(is_old_tor(1,2)) def test_isprotectedoverratio_sanity(self): self.assertTrue(is_protected_over_ratio(2,1,'a','a,b,c')) diff --git a/test_write_csv.py b/test_write_csv.py new file mode 100644 index 0000000..4a2b195 --- /dev/null +++ b/test_write_csv.py @@ -0,0 +1,41 @@ +from qprocess import write_csv +import csv +import unittest +import os +# Torrent Items needed for testing +# canidate['state'] {canidate["ratio"]} {torrent["tags"]} torrent["seeding_time"] {torrent["category"]} {torrent["name"][0:20]} {canidate["time_active"]} +class TestWriteCSV(unittest.TestCase): + def test_write_csv_dragnet(self): + self.cv = csv + outfile = './test_dragnet_outfile.csv' + state = 'downloading' + ratio = 1.05 + tags = 'ipt' + added = 1 + age = 240000 + time = 123456 + thash = 'asfasdf23412adfqwer' + tname = 'thisismynamehahahah' + trname = 'https://localhost.stackoverflow.tech/317332f1c125bc9c1b9b14fb8e054908/announce' + header = ['state','ratio','tags','added','age','time','thash','tname','trname'] + row = [state,ratio,tags,added,age,time,thash,tname,trname] + write_csv(self.cv,outfile,header,row) + self.assertTrue(os.path.exists(outfile)) + + def test_write_csv_telemetry(self): + self.cv = csv + outfile = './test_telemetry_outfile.csv' + state = 'downloading' + ratio = 1.05 + tags = 'ipt' + added = 1 + thash = 'asfasdf23412adfqwer' + tname = 'thisismynamehahahah' + trname = 'https://localhost.stackoverflow.tech/317332f1c125bc9c1b9b14fb8e054908/announce' + header = ['state','ratio','tags','added','hash','name','tracker'] + row = [state,ratio,tags,added,thash,tname,trname] + write_csv(self.cv,outfile,header,row) + self.assertTrue(os.path.exists(outfile)) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file