💾 Archived View for gemini.zachdecook.com › zachwalk › zachwalk.py captured on 2022-04-28 at 18:14:11.

View Raw

More Information

⬅️ Previous capture (2021-12-03)

➡️ Next capture (2023-01-29)

🚧 View Differences

-=-=-=-=-=-=-

#!/usr/bin/env python3
"""load links from a gemini file and output the latest date for each one"""
__author__ = "Zach DeCook"
__email__ = "zachdecook@librem.one"
__copyright__ = "Copyright (C) 2021 Zach DeCook"
__license__ = "AGPL"
__version__ = "3"

import sys
import socket
import ssl
import fileinput
from dateutil.parser import parse

DEFAULT = parse('1970-01-01').date()

def getnewestdate(url):
    """load the url, and find the newest date listed in a link"""
    # TODO: outsource to pre-installed cli program?
    hostname = url.split('/')[2]
    try:
     s = socket.create_connection((hostname, 1965),timeout=2)
     context = ssl.SSLContext()
     context.check_hostname = False
     context.verify_mode = ssl.CERT_NONE
     s = context.wrap_socket(s, server_hostname = hostname)
     s.sendall((url + '\r\n').encode("UTF-8"))
     fp = s.makefile("rb")
    except:
     return DEFAULT
    header = fp.readline()
    header = header.decode("UTF-8").strip()
    # TODO: something special if status is not 2x
    return gnd(fp)
def gnd(fp):
    nd = DEFAULT
    for line in fp:
     if type(line) != str:
       line=line.decode('UTF-8')
     if line.strip()[0:2] == '=>':
      desc =getdesc(line)
      try:
        date = parse(desc[0:10],fuzzy=True).date()
        if date > nd:
          nd = date
      except:
        try:
          date = parse(desc,fuzzy=True).date()
          if date > nd:
            nd = date
        except:
          pass
        pass
    return nd

def replaceDateIfNewer(desc, newestdate):
    try:
     tup = parse(desc, fuzzy_with_tokens=True)
     date = tup[0].date()
    except:
        return f'{newestdate} - {desc}'
    if newestdate > date:
        return str(newestdate) + ' '.join(tup[1])
    return desc

def main():
    for line in fileinput.input(): #stdin or file from argv
        if line[0:2] == '=>':
          # don't use tabs
          url = line[2:].strip().split(' ')[0]
          if isAbsGeminiUrl(url):
            desc = getdesc(line)
            olddate = gnd(url)
            newestdate = getnewestdate(url)
            desc = replaceDateIfNewer(desc, newestdate)
            print(f'=> {url} {desc}')
            continue
        print(line.rstrip())

def isAbsGeminiUrl(url):
    return url[0:9] == 'gemini://'

def getdesc(line):
  return ' '.join(line[2:].strip().replace('	',' ').split(' ')[1:]).lstrip()

if __name__ == '__main__':
  main()