Last active
July 23, 2026 04:58
-
-
Save cmj/64d82d39b0f1b7521d84a02fb6795561 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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
