copied from private repo
This commit is contained in:
commit
ef21adc132
19
README.md
Normal file
19
README.md
Normal file
@ -0,0 +1,19 @@
|
||||
# qbit-maid
|
||||
|
||||
The objective is to filter torrents based on the following criteria:
|
||||
- tracker domain name
|
||||
- age
|
||||
- ratio
|
||||
- state
|
||||
|
||||
The first file shall contain an client to the qbit api and the processing of the torrents.
|
||||
qbit-clean.py
|
||||
|
||||
The second file shall contain functions to build out a list of torrents.
|
||||
qlist.py
|
||||
|
||||
The third file shall contain logging and email communication.
|
||||
qlogging.py
|
||||
|
||||
The fourth file shall be logic to process torrents.
|
||||
qprocess.py
|
9
config.json.example
Normal file
9
config.json.example
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"host": "192.168.1.1",
|
||||
"port": 8080,
|
||||
"username": "admin",
|
||||
"password": "admin",
|
||||
"loglevel": "INFO",
|
||||
"logpath": "./qc.log",
|
||||
"age": 2630000
|
||||
}
|
52
qbit-maid.py
Normal file
52
qbit-maid.py
Normal file
@ -0,0 +1,52 @@
|
||||
#The first file shall contain an client to the qbit api and the processing of the torrents.
|
||||
import qbittorrentapi
|
||||
from json import load
|
||||
from qlist import *
|
||||
from qlogging import *
|
||||
from qprocess import *
|
||||
import time
|
||||
import logging
|
||||
|
||||
class Qbt:
|
||||
def __init__(self):
|
||||
"""Main object, should be calling functions from qlist.py, qlogging.py and qprocess.py"""
|
||||
# Open the config. Needs a json file with the data in config.json.example
|
||||
c = open('./config.json')
|
||||
self.config = load(c)
|
||||
# Create the api object
|
||||
self.qbt_client = qbittorrentapi.Client(
|
||||
host=self.config["host"],
|
||||
port=self.config["port"],
|
||||
username=self.config["username"],
|
||||
password=self.config["password"],
|
||||
)
|
||||
# Create the logging object
|
||||
self.tl = logging
|
||||
# Variables torlog uses from config.json
|
||||
self.logpath=self.config["logpath"]
|
||||
self.loglevel=self.config["loglevel"]
|
||||
torlog(self)
|
||||
self.t = time
|
||||
f = open('./tracker-whitelist.json')
|
||||
self.tracker_whitelist = load(f)
|
||||
self.tracker_protected_list = []
|
||||
self.tracker_nonprotected_list = []
|
||||
self.tracker_protected_tag = 'ipt'
|
||||
self.tracker_non_protected_tag = 'public'
|
||||
self.torrent_hash_delete_list = []
|
||||
self.tl.debug(self.tracker_whitelist)
|
||||
try:
|
||||
self.tl.info('Connecting to host.')
|
||||
self.qbt_client.auth_log_in()
|
||||
self.tl.info('Connected.')
|
||||
except qbittorrentapi.LoginFailed as e:
|
||||
self.tl.exception(e)
|
||||
self.torrentlist = {}
|
||||
self.torrentlist = self.qbt_client.torrents_info()
|
||||
buildtorlist(self)
|
||||
torprocessor(self)
|
||||
printprocessor(self)
|
||||
#tordelete(self)
|
||||
|
||||
if __name__== "__main__":
|
||||
Qbt()
|
44
qlist.py
Normal file
44
qlist.py
Normal file
@ -0,0 +1,44 @@
|
||||
#The second file shall contain functions to build out a list of torrents.
|
||||
def buildtorlist(self):
|
||||
self.protected_count = 0
|
||||
self.nonprotected_count = 0
|
||||
while self.torrentlist:
|
||||
torrent = self.torrentlist.pop()
|
||||
self.tl.debug(torrent['tracker'])
|
||||
if self.tracker_whitelist['iptorrents-empirehost'] in torrent['tracker']:
|
||||
self.tl.debug(f'Protected torrent tracker: {torrent["tracker"]}hash: {torrent["hash"]}')
|
||||
self.protected_count += 1
|
||||
self.qbt_client.torrents_add_tags(self.tracker_protected_tag,torrent['hash'])
|
||||
self.tracker_protected_list.append(torrent)
|
||||
elif self.tracker_whitelist["iptorrents-stackoverflow"] in torrent['tracker']:
|
||||
self.tl.debug(f'Protected torrent tracker: {torrent["tracker"]}hash: {torrent["hash"]}')
|
||||
self.protected_count += 1
|
||||
self.qbt_client.torrents_add_tags(self.tracker_protected_tag,torrent['hash'])
|
||||
self.tracker_protected_list.append(torrent)
|
||||
elif self.tracker_whitelist["iptorrents-bgp"] in torrent['tracker']:
|
||||
self.tl.debug(f'Protected torrent tracker: {torrent["tracker"]}hash: {torrent["hash"]}')
|
||||
self.protected_count += 1
|
||||
self.qbt_client.torrents_add_tags(self.tracker_protected_tag,torrent['hash'])
|
||||
self.tracker_protected_list.append(torrent)
|
||||
else:
|
||||
self.tl.debug(f'Non-protected tracker: {torrent["tracker"]}hash: {torrent["hash"]}')
|
||||
self.nonprotected_count += 1
|
||||
self.qbt_client.torrents_add_tags(self.tracker_non_protected_tag,torrent['hash'])
|
||||
self.tracker_nonprotected_list.append(torrent)
|
||||
|
||||
def writetor(self, filepath='./torrentinfo.txt'):
|
||||
with open(filepath, 'w') as fp:
|
||||
fp.write(str(self.torrentlist))
|
||||
|
||||
def listfirsttor(self, index=0):
|
||||
torrent = self.torrentlist[index]
|
||||
for k,v in torrent.items():
|
||||
self.tl.debug(f'{k}: {v}')
|
||||
|
||||
def listqbitapiinfo(self):
|
||||
self.tl.info(f'qBittorrent: {self.qbt_client.app.version}')
|
||||
self.tl.info(f'qBittorrent Web API: {self.qbt_client.app.web_api_version}')
|
||||
|
||||
def torrentcount(self):
|
||||
self.tl.debug(f'torrents that are protected {self.protected_count}')
|
||||
self.tl.debug(f"torrents that aren't protected {self.nonprotected_count}")
|
14
qlogging.py
Normal file
14
qlogging.py
Normal file
@ -0,0 +1,14 @@
|
||||
#The third file shall contain logging and email communication.
|
||||
|
||||
def torlog(self):
|
||||
|
||||
if self.loglevel == 'DEBUG':
|
||||
self.tl.basicConfig(filename=self.logpath, format='%(asctime)s:%(levelname)s:%(message)s', encoding='utf-8', datefmt='%m/%d/%Y %I:%M:%S %p',level=self.tl.DEBUG)
|
||||
if self.loglevel == 'INFO':
|
||||
self.tl.basicConfig(filename=self.logpath, format='%(asctime)s:%(levelname)s:%(message)s', encoding='utf-8', datefmt='%m/%d/%Y %I:%M:%S %p',level=self.tl.INFO)
|
||||
def toremail(self):
|
||||
pass
|
||||
|
||||
def getunixtimestamp(self):
|
||||
self.uts = self.t.time()
|
||||
self.tl.info(self.uts)
|
38
qprocess.py
Normal file
38
qprocess.py
Normal file
@ -0,0 +1,38 @@
|
||||
#The fourth file shall be logic to process torrents.
|
||||
def torprocessor(self):
|
||||
for canidate in self.tracker_nonprotected_list:
|
||||
if 'ipt' in canidate['tags']:
|
||||
self.tl.warning(f'{canidate["name"]} was in non-protected list.')
|
||||
break
|
||||
if canidate['state'] == 'downloading':
|
||||
self.tl.info(f'{canidate["name"]} is still downloading and will be skipped.')
|
||||
break
|
||||
else:
|
||||
self.torrent_hash_delete_list.append(canidate['infohash_v1'])
|
||||
self.tl.info(f'Submitted {canidate["name"]} for deletion.')
|
||||
for canidate in self.tracker_protected_list:
|
||||
if canidate['state'] == 'downloading':
|
||||
self.tl.warning(f'{canidate["name"]} is still downloading and will be skipped.')
|
||||
break
|
||||
if canidate['ratio'] < float(1.05):
|
||||
self.tl.debug(f'{canidate["name"]} is below a 1.05 ratio({canidate["ratio"]})')
|
||||
if canidate['added_on'] + self.config["age"] <= self.t.time():
|
||||
self.tl.debug(f'Calculation: {canidate["added_on"] + self.config["age"]}')
|
||||
self.tl.debug(f'Comparison: {self.t.time()}')
|
||||
self.torrent_hash_delete_list.append(canidate['infohash_v1'])
|
||||
self.tl.info(f'Submitted {canidate["name"]} for deletion from the protected list.')
|
||||
if canidate['ratio'] >= float(1.05):
|
||||
self.tl.debug(f'{canidate["name"]} is above a 1.05 ratio({canidate["ratio"]}).')
|
||||
self.torrent_hash_delete_list.append(canidate['infohash_v1'])
|
||||
self.tl.info(f'Submitted {canidate["name"]} for deletion from the protected list.')
|
||||
else:
|
||||
pass
|
||||
|
||||
def printprocessor(self):
|
||||
self.tl.info(f'Protected torrents: {len(self.tracker_protected_list)}')
|
||||
self.tl.info(f'Non-protected torrents: {len(self.tracker_nonprotected_list)}')
|
||||
self.tl.info(f'Total torrents set for deletion: {len(self.torrent_hash_delete_list)}')
|
||||
|
||||
def tordelete(self):
|
||||
self.tl.debug(self.torrent_hash_delete_list)
|
||||
self.qbt_client.torrents_delete(True, self.torrent_hash_delete_list)
|
5
tracker-whitelist.json
Normal file
5
tracker-whitelist.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"iptorrents-empirehost": "ssl.empirehost.me",
|
||||
"iptorrents-stackoverflow": "localhost.stackoverflow.tech",
|
||||
"iptorrents-bgp": "routing.bgp.technology"
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user