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
- sxmo: launch with auto-rotation enabled
- sane-bt-search: show details like 5.1 vs stereo, h264 vs h265
- sane-bt-search: include .torrent results (rewrite the URL?)
### perf
- 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 datetime import datetime
import logging
import json
import natsort
import requests
@ -23,6 +24,8 @@ ENDPOINTS = dict(
epoch = datetime(1970, 1, 1)
logger = logging.getLogger(__name__)
def try_parse_time(t: str):
try:
return datetime.fromisoformat(t)
@ -44,10 +47,15 @@ class Torrent:
size: int
tracker: 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:
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
def mib(self) -> int:
@ -55,15 +63,32 @@ class Torrent:
@staticmethod
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")
pub_date = d.get("PublishDate")
size = d.get("Size")
tracker = d.get("Tracker")
title = d.get("Title")
magnet = d.get("MagnetUri")
if seeders is not None and pub_date is not None and title is not None and magnet is not None:
magnet = d.get("MagnetUri") or d.get("Guid")
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)
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:
return dict(
@ -99,9 +124,11 @@ class Client:
def parse_args(args: list) -> dict:
options = dict(
top="5",
full=False,
query="",
json=False,
verbose=False,
)
while args:
arg = args[0]
@ -119,9 +146,14 @@ def parse_args(args: list) -> dict:
return options
def main(args: list):
logging.basicConfig()
options = parse_args(args)
if options["verbose"]:
logging.getLogger().setLevel(logging.DEBUG)
query = options["query"]
num_listings = 100 if options["full"] else 5
num_listings = 1000 if options["full"] else int(options["top"])
client = Client()
res = client.query(query)
if options["json"]: