initial commit
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
import logging
|
||||
import random
|
||||
import subprocess
|
||||
import httpx
|
||||
from pathlib import Path
|
||||
import torf
|
||||
import time
|
||||
|
||||
class Deluge:
|
||||
def __init__(self, session: httpx.Client) -> None:
|
||||
self.session = session
|
||||
|
||||
@classmethod
|
||||
def new(cls) -> 'Deluge':
|
||||
logging.debug("Connecting to Deluge")
|
||||
session = httpx.Client(base_url="https://t.zzzp.win/", timeout=10, auth=httpx.BasicAuth('abdus', 'xAsametk50'))
|
||||
res = session.post("/json", json={"method": "auth.login", "params": ["xAsametk50"], "id": cls.make_id()})
|
||||
res.raise_for_status()
|
||||
|
||||
# find first available host
|
||||
res = session.post("/json", json={"method": "web.get_hosts", "params": [], "id": cls.make_id()})
|
||||
res.raise_for_status()
|
||||
host_id = res.json()["result"][0][0]
|
||||
|
||||
# connect to a host
|
||||
res = session.post("/json", json={"method": "web.connect", "params": [host_id], "id": cls.make_id()})
|
||||
res.raise_for_status()
|
||||
|
||||
return cls(session)
|
||||
|
||||
@classmethod
|
||||
def make_id(cls) -> int:
|
||||
return time.time_ns()
|
||||
|
||||
def add(self, torrent_path: Path, download_path: Path, paused: bool = True, skip_check: bool = True):
|
||||
# upload torrent
|
||||
logging.debug("Uploading torrent file")
|
||||
with torrent_path.open("rb") as f:
|
||||
res = self.session.post("/upload", files={"file": f})
|
||||
res.raise_for_status()
|
||||
remote_path: str = res.json()["files"][0]
|
||||
|
||||
# add torrent
|
||||
logging.debug("Adding torrent file")
|
||||
res = self.session.post(
|
||||
"/json",
|
||||
timeout=1,
|
||||
json={
|
||||
"method": "web.add_torrents",
|
||||
"params": [
|
||||
[
|
||||
{
|
||||
"path": remote_path,
|
||||
"options": {
|
||||
"file_priorities": [1],
|
||||
"add_paused": paused,
|
||||
"sequential_download": False,
|
||||
"pre_allocate_storage": False,
|
||||
"download_location": str(download_path),
|
||||
# "move_completed": False,
|
||||
# "move_completed_path": "/root/Downloads",
|
||||
# "prioritize_first_last_pieces": True,
|
||||
"seed_mode": skip_check,
|
||||
# "super_seeding": False,
|
||||
},
|
||||
}
|
||||
]
|
||||
],
|
||||
"id": self.make_id(),
|
||||
},
|
||||
)
|
||||
|
||||
res.raise_for_status()
|
||||
|
||||
|
||||
def find_torrents() -> list[Path]:
|
||||
files = list(Path('/tmp/deluge/config/state').glob('*.torrent'))
|
||||
random.shuffle(files)
|
||||
return files
|
||||
|
||||
def find_existing_torrents() -> dict[str, Path]:
|
||||
lines = subprocess.check_output(['ssh', 'klein', '--', 'find', '/mnt/box/files/_torrents', '-maxdepth', '1']).decode()
|
||||
existing = {}
|
||||
lines = lines.strip().splitlines(keepends=False)
|
||||
for line in lines:
|
||||
if line.startswith('.'):
|
||||
continue
|
||||
p = Path(line)
|
||||
existing[p.name] = p
|
||||
return existing
|
||||
|
||||
|
||||
def main():
|
||||
existing = find_existing_torrents()
|
||||
d = Deluge.new()
|
||||
done = set()
|
||||
for torrent_path in find_torrents():
|
||||
if torrent_path in done:
|
||||
continue
|
||||
if len(done) == len(existing):
|
||||
return
|
||||
with torrent_path.open('rb') as f:
|
||||
t = torf.Torrent.read_stream(f)
|
||||
if '.PRT' in t.name:
|
||||
continue
|
||||
if et := existing.get(t.name):
|
||||
logging.debug(f'adding {t.name}')
|
||||
download_path = Path("/dl")
|
||||
try:
|
||||
d.add(torrent_path, download_path=download_path)
|
||||
torrent_path.unlink()
|
||||
done.add(torrent_path)
|
||||
logging.info(f'added: {t.name}')
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(level=logging.INFO, format=f'%(asctime)s {logging.BASIC_FORMAT}')
|
||||
main()
|
||||
Reference in New Issue
Block a user