Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- #
- # A rough Python script to build an HTML mod list for ArmA 3 under Linux.
- # The launcher locks up when using the built in export feature.
- # Twitter: @Kerbo_
- import os, sys, getopt, glob
- import xml.etree.ElementTree as ET
- import requests
- from html.parser import HTMLParser
- # avoid broken pipe
- from signal import signal, SIGPIPE, SIG_DFL
- signal(SIGPIPE,SIG_DFL)
- verbose = 0
- class colors:
- RED="\033[91m"
- GREEN="\033[92m"
- NC="\033[0m"
- def usage():
- print("Usage: " + os.path.basename(__file__) + " [options]\n")
- print("Options:")
- print(" -s Steam presets directory")
- print(" -l list presets")
- print(" -e export preset")
- print("")
- print(" -h show this output")
- print(" -v be verbose")
- def error(msg):
- sys.stderr.write(colors.RED + "Error: " +colors.NC + str(msg) + "\n")
- def debug(msg):
- global verbose
- if verbose == 1:
- sys.stderr.write(colors.RED + "DEBUG: " +colors.NC + str(msg) + "\n")
- def main(argv):
- global verbose
- steamPresetDir = None
- listMode = None
- exportName = None
- workshopURLBase = "https://steamcommunity.com/sharedfiles/filedetails/?id="
- # <div class="workshopItemTitle">Antistasi - The Mod</div>
- class WorkshopParser(HTMLParser):
- def __init__(self):
- super().__init__()
- self.in_name_tag = False
- self.name = ""
- def handle_starttag(self, tag, attrs):
- attrs = dict(attrs)
- if tag == 'div' and attrs.get('class') == 'workshopItemTitle':
- self.in_name_tag = True
- def handle_data(self, data):
- if self.in_name_tag:
- self.name = data
- self.in_name_tag = False
- try:
- opts, args = getopt.getopt(argv, "hvs:le:")
- except getopt.GetoptError:
- usage()
- sys.exit(2)
- for opt, arg in opts:
- if opt == '-s':
- steamPresetDir = arg
- if opt == '-l':
- listMode = True
- if opt == '-e':
- exportName = arg
- if opt == "-h":
- usage()
- sys.exit()
- if opt == "-v":
- verbose = 1
- if steamPresetDir is None:
- error("-s is required")
- usage()
- sys.exit(1)
- if exportName is None and not listMode:
- error("-e or -l is required")
- usage()
- sys.exit(1)
- if exportName is not None and listMode:
- error("-l and -e are mutually exclusive")
- usage()
- sys.exit(1)
- if listMode:
- if not os.path.isdir(steamPresetDir):
- error(f"Directory {steamPresetDir} doesn't exist")
- sys.exit(1)
- os.chdir(steamPresetDir)
- for file in glob.glob("*.preset2"):
- print(os.path.splitext(file)[0])
- else:
- presetFileName = f"{steamPresetDir}/{exportName}.preset2"
- if not os.path.isfile(presetFileName):
- error(f"Preset {presetFileName} not found")
- sys.exit(1)
- debug(f"Parsing {presetFileName}")
- tree = ET.parse(presetFileName)
- root = tree.getroot()
- pids = root.find('published-ids')
- ids = []
- for pid in pids.findall('id'):
- source,steamid = pid.text.split(':')
- if source == 'steam':
- ids.append(steamid)
- idnames = {}
- for id in ids:
- debug(f"Fetching page for {id}")
- response = requests.get(f"{workshopURLBase}{id}")
- if response.ok:
- parser = WorkshopParser()
- parser.feed(response.text)
- name = parser.name
- debug(f"Found {id} {name}")
- idnames[id] = name
- html = "<html><head><title>ArmA 3</title></head><body><table>\n"
- sorted_items = sorted(idnames.items(), key=lambda kv: (kv[1], [kv[0]]))
- for item in sorted_items:
- id = item[0]
- name = item[1]
- html += f"<tr><td>{name}</td><td><a href=\"{workshopURLBase}{id}\">{workshopURLBase}{id}</a>\n"
- html += "</table></body></html>"
- print(html)
- sys.exit()
- if __name__ == "__main__":
- main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment