sane-bt-search: include non-magnet results

This commit is contained in:
Colin 2023-06-08 01:32:19 +00:00
parent ecaab07bce
commit 86b15d381f
2 changed files with 38 additions and 7 deletions

View File

@ -54,7 +54,6 @@
- all orientations *except* upside down are supported - all orientations *except* upside down are supported
- sxmo: launch with auto-rotation enabled - sxmo: launch with auto-rotation enabled
- sane-bt-search: show details like 5.1 vs stereo, h264 vs h265 - sane-bt-search: show details like 5.1 vs stereo, h264 vs h265
- sane-bt-search: include .torrent results (rewrite the URL?)
### perf ### perf
- why does nixos-rebuild switch take 5 minutes when net is flakey? - why does nixos-rebuild switch take 5 minutes when net is flakey?

View File

@ -10,6 +10,7 @@ returns select results and magnet links
from dataclasses import dataclass from dataclasses import dataclass
from datetime import datetime from datetime import datetime
import logging
import json import json
import natsort import natsort
import requests import requests
@ -23,6 +24,8 @@ ENDPOINTS = dict(
epoch = datetime(1970, 1, 1) epoch = datetime(1970, 1, 1)
logger = logging.getLogger(__name__)
def try_parse_time(t: str): def try_parse_time(t: str):
try: try:
return datetime.fromisoformat(t) return datetime.fromisoformat(t)
@ -44,10 +47,15 @@ class Torrent:
size: int size: int
tracker: str tracker: str
title: str title: str
magnet: str magnet: "Optional[str]"
http_dl_uri: "Optional[str]" # probably a .torrent file but it COULD be a referral to a magnet:// URI
def __str__(self) -> str: def __str__(self) -> str:
return f"{self.seeders}[S]\t{self.pub_date}\t{self.mib}M\t{self.tracker}\t{self.title}\t{self.magnet}" return f"{self.seeders}[S]\t{self.pub_date}\t{self.mib}M\t{self.tracker}\t{self.title}\t{self.dl_uri}"
@property
def dl_uri(self) -> str:
return self.magnet or self.http_dl_uri
@property @property
def mib(self) -> int: def mib(self) -> int:
@ -55,15 +63,32 @@ class Torrent:
@staticmethod @staticmethod
def from_dict(d: dict) -> 'Torrent': def from_dict(d: dict) -> 'Torrent':
logger.debug(f"Torrent.from_dict: fields: { ' '.join(d.keys()) }")
for k, v in d.items():
if k not in ("Seeders", "PublishDate", "Size", "Tracker", "Title", "MagnetUri", "Guid", "Link") and \
v != None and v != "" and v != [] and v != {}:
logger.debug(f" {k} = {v}")
seeders = d.get("Seeders") seeders = d.get("Seeders")
pub_date = d.get("PublishDate") pub_date = d.get("PublishDate")
size = d.get("Size") size = d.get("Size")
tracker = d.get("Tracker") tracker = d.get("Tracker")
title = d.get("Title") title = d.get("Title")
magnet = d.get("MagnetUri") magnet = d.get("MagnetUri") or d.get("Guid")
if seeders is not None and pub_date is not None and title is not None and magnet is not None: http_dl_uri = d.get("Link")
if magnet and not magnet.startswith("magnet:"):
logger.info(f"invalid magnet: {magnet}")
magnet = None
# jackett returns bad DL URIs because it doesn't know its public URI
firewalled_host = "http://10.0.1.6:9117/"
if http_dl_uri and http_dl_uri.startswith(firewalled_host):
http_dl_uri = SERVICE + "/" + http_dl_uri[len(firewalled_host):]
if seeders is not None and pub_date is not None and title is not None and (magnet is not None or http_dl_uri is not None):
pub_date = parse_time(pub_date) pub_date = parse_time(pub_date)
return Torrent(seeders, pub_date, size, tracker, title, magnet) return Torrent(seeders, pub_date, size, tracker, title, magnet, http_dl_uri)
def to_dict(self) -> dict: def to_dict(self) -> dict:
return dict( return dict(
@ -99,9 +124,11 @@ class Client:
def parse_args(args: list) -> dict: def parse_args(args: list) -> dict:
options = dict( options = dict(
top="5",
full=False, full=False,
query="", query="",
json=False, json=False,
verbose=False,
) )
while args: while args:
arg = args[0] arg = args[0]
@ -119,9 +146,14 @@ def parse_args(args: list) -> dict:
return options return options
def main(args: list): def main(args: list):
logging.basicConfig()
options = parse_args(args) options = parse_args(args)
if options["verbose"]:
logging.getLogger().setLevel(logging.DEBUG)
query = options["query"] query = options["query"]
num_listings = 100 if options["full"] else 5 num_listings = 1000 if options["full"] else int(options["top"])
client = Client() client = Client()
res = client.query(query) res = client.query(query)
if options["json"]: if options["json"]: