Gemini Mailing List viewer

Artifact [15062e5d40]
Login

Artifact [15062e5d40]

Artifact 15062e5d40223542e7a0cdac10ae0a964bccbc94fb07253954e25a439dc82bf5:


#!/usr/bin/python3
import sys
import os
import mailbox
from urllib.parse import unquote, urlencode
import re
from email.header import Header, decode_header, make_header
import gemini

def gen_summary(filename, message_id=None):
    mbox = mailbox.mbox(filename)
    path = os.environ['SCRIPT_NAME'] if 'SCRIPT_NAME' in os.environ else ""

    # reverse the order of messages in the main list
    main_list = message_id == None or len(message_id) == 0
    msgs = mbox
    if main_list:
        msgs = []
        for m in mbox:
          msgs.insert(0, m)
    else:
       print("=>", path, "Back to topic list", "\n")

    replies = [ message_id ]
    for message in msgs:
       try:
          subject = str(make_header(decode_header(message['subject'])))
       except:
          subject = message['subject']

       # display the main message list (main topics)
       if main_list and 'in-reply-to' not in message and 'references' not in message:
          id = urlencode({"id": message['message-id']})
          print("=>", path + "?" + id, subject)

       # display the message thread if a message_id is specified
       references = message['references'] if message['references'] else ""
       if not main_list and (message['in-reply-to'] in replies or references.find(message_id) >= 0 or message['message-id'] == message_id):
          replies.append(message['message-id'])

          if message['message-id'] == message_id:
              print("##", subject)

          print("###", message['date'], str(make_header(decode_header(message['from']))))
          print("\n")
          cleanr = re.compile('\>.*\n')
          body = re.sub(cleanr, '.', message.get_payload())
          body = gemini.escapeGemini(body)
          body = gemini.linkify(body)
          print(body)
          print("\n=> mailto:gemini@lists.orbitalfox.eu?" + urlencode({"Subject:": subject}) + "&" + urlencode({"In-Reply-To": message['message-id']}), " Reply to post")

print("20 text/gemini")

if "QUERY_STRING" in os.environ and len(os.environ['QUERY_STRING']) > 0:
   gen_summary("/var/gemini/2021.txt", unquote(os.environ['QUERY_STRING'])[3:])
else:
   print("# Gemini mailing list archive, 2021", "\n")
   print("________________________________________\n")
   print("Updated once a day")
   print("=> https://lists.orbitalfox.eu/archives/gemini/ Original mailing list archive")
   print("=> gemini://rawtext.club/~sloum/geminilist/ Another viewer of Gemini mailing list", "\n")
   print("________________________________________\n")

   print("\n=> mailto:gemini@lists.orbitalfox.eu Post new topic\n")
   gen_summary("/var/gemini/2021.txt")