Skip to content

Instantly share code, notes, and snippets.

@cmj
Last active July 23, 2026 04:58
Show Gist options
  • Select an option

  • Save cmj/64d82d39b0f1b7521d84a02fb6795561 to your computer and use it in GitHub Desktop.

Select an option

Save cmj/64d82d39b0f1b7521d84a02fb6795561 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import argparse
import shutil
import subprocess
from datetime import datetime
from pathlib import Path
from playwright.sync_api import sync_playwright
# loc = coordinates,zoomlevel - oCS = legend - c colorScheme (1-3?) - o = opacity - sm = smoothing
URL = "https://www.rainviewer.com/map.html?loc=45.5061,-122.6668,10&oCS=3&c=2&o=43&lm=3&layer=radar&sm=1&sn=1"
parser = argparse.ArgumentParser()
parser.add_argument("--headed", action="store_true", help="Open a browser window instead of headless")
parser.add_argument("--view", action="store_true", help="Open the screenshot after saving (uses xdg-open unless --viewer is set)")
parser.add_argument("--viewer", help="Command to open the screenshot with instead of xdg-open (implies --view)")
parser.add_argument(
"--latest",
action="store_true",
help="Save a copy to rainviewer-latest.png (single updated file for KDE media frame widget)",
)
parser.add_argument("-q", "--quiet", action="store_true", help="Suppress print output")
parser.add_argument(
"--dir", "--savedir",
dest="savedir",
default=".",
help="Directory to save screenshots to (default: current directory)",
)
args = parser.parse_args()
savedir = Path(args.savedir).expanduser()
savedir.mkdir(parents=True, exist_ok=True)
with sync_playwright() as p:
browser = p.chromium.launch(headless=not args.headed)
page = browser.new_page(viewport={"width": 1600, "height": 900})
#page = browser.new_page(viewport={"width": 1600, "height": 723})
page.goto(URL)
page.evaluate("document.documentElement.setAttribute('data-theme', 'dark')")
canvas = page.locator(".maplibregl-canvas")
canvas.wait_for(state="visible")
# long wait for overlays
page.wait_for_timeout(4000)
# remove everything except timestamp
page.evaluate("""
document.querySelectorAll('.map-button-double.map-buttons-play-center').forEach(el => el.remove());
document.getElementById('menu-bar')?.remove();
document.querySelectorAll('.map-buttons-right').forEach(el => el.remove());
document.querySelectorAll('span:nth-of-type(3)').forEach(el => el.remove());
""")
page.evaluate("window.dispatchEvent(new Event('resize'))")
page.wait_for_timeout(1000)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = savedir / f"rainviewer_map_{timestamp}.png"
canvas.screenshot(path=str(filename))
if not args.quiet:
print(f"Screenshot saved {filename}")
if args.latest:
latest_filename = savedir / "rainviewer-latest.png"
shutil.copyfile(filename, latest_filename)
if not args.quiet:
print(f"Screenshot saved {latest_filename}")
if args.headed:
input("Screenshot saved. Browser is open for inspection - press Enter to close...")
browser.close()
if args.view or args.viewer:
opener = args.viewer.split() if args.viewer else ["xdg-open"]
subprocess.Popen(opener + [str(filename)])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment