Adding a script to automate getting the newest version

This commit is contained in:
David Kruger 2025-05-30 10:27:57 -07:00
parent 8df9031d27
commit 99c2b8bea3
2 changed files with 101 additions and 0 deletions

View File

@ -6,3 +6,5 @@ Given the main JS file URL, the source code can be downloaded and mapped using:
```
~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js
```
For convenience you can run `python update.py`

99
update.py Executable file
View File

@ -0,0 +1,99 @@
#!/usr/bin/env python3
import argparse
import gzip
import html.parser
import logging
import re
import subprocess
import urllib.request
## The URL of a dndbeyond character which won't be deleted
DND_BEYOND_CHARACTER_URL = "https://www.dndbeyond.com/characters/147022047"
## Regex to find the matching JS file
MAIN_JS_RE = re.compile(r"https://media\.dndbeyond\.com\/character-app.*main.*\.js")
## Path to sourcemapper bin
SOURCEMAPPER_BIN = "/home/prometheus/go/bin/sourcemapper"
def main():
parser = argparse.ArgumentParser(
description="Utility for scanning and converting videos."
)
parser.add_argument(
"-u",
"--character-url",
default=DND_BEYOND_CHARACTER_URL,
help="URL of the dndbeyond character to grab the source from.",
)
parser.add_argument(
"-v", "--verbose", action="store_true", help="Enable verbose logging"
)
parser.add_argument(
"-q", "--quiet", action="store_true", help="Only display errors"
)
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
elif args.quiet:
logging.basicConfig(level=logging.ERROR)
else:
logging.basicConfig(level=logging.INFO)
char_data = download_character()
parser = MainJSExtractor()
parser.feed(char_data.decode("utf-8"))
print(f"Found URL: {parser.js_url}")
subprocess.check_call(
[
SOURCEMAPPER_BIN,
"-output",
"ddb_main",
"-jsurl",
parser.js_url,
]
)
def download_character() -> bytes:
try:
req = urllib.request.Request(
DND_BEYOND_CHARACTER_URL,
headers={
"user-agent": "Mozilla/5.0",
"authority": "www.dndbeyond.com",
"cache-control": "max-age=0",
"upgrade-insecure-requests": "1",
"sec-fetch-user": "?1",
"accept": "text/json",
"sec-fetch-site": "none",
"sec-fetch-mode": "navigate",
"accept-encoding": "gzip, deflate, br",
"accept-language": "en-US,en;q=0.9",
},
)
with urllib.request.urlopen(req) as resp:
if resp.info().get("Content-Encoding") == "gzip":
return gzip.decompress(resp.read())
else:
return resp.read()
except Exception:
logging.exception(f"Failed to load the character")
class MainJSExtractor(html.parser.HTMLParser):
def __init__(self):
super().__init__()
self.js_url = None
def handle_starttag(self, tag, attrs):
if tag == "script":
for attr_name, attr_val in attrs:
if attr_name == "src":
m = MAIN_JS_RE.match(attr_val)
if m is not None:
self.js_url = attr_val
if __name__ == "__main__":
main()