diff --git a/.github/workflows/flatpak-build.yml b/.github/workflows/flatpak-build.yml
index fc46a646..2dd4d2c9 100644
--- a/.github/workflows/flatpak-build.yml
+++ b/.github/workflows/flatpak-build.yml
@@ -25,6 +25,9 @@ jobs:
with:
submodules: true
+ - name: Generate PSL list
+ run: curl -fsSL https://publicsuffix.org/list/public_suffix_list.dat -o src/common/public_suffix_list.dat
+
- name: Build Flatpak
id: flatpak_builder
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj
index 287c159c..468e4fe1 100644
--- a/src/common/common.vcxproj
+++ b/src/common/common.vcxproj
@@ -29,6 +29,7 @@
+
@@ -109,6 +110,7 @@
Header Files
+
+ Header Files
+
Header Files
diff --git a/src/common/gen-public-suffix.py b/src/common/gen-public-suffix.py
new file mode 100644
index 00000000..cd3a96e6
--- /dev/null
+++ b/src/common/gen-public-suffix.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+import sys
+import urllib.request
+from pathlib import Path
+
+URLS = (
+ "https://raw.githubusercontent.com/publicsuffix/list/main/public_suffix_list.dat",
+ "https://publicsuffix.org/list/public_suffix_list.dat",
+)
+
+
+def parse_rules(text: str):
+ rules = []
+ for raw in text.splitlines():
+ line = raw.strip()
+ if not line or line.startswith("//"):
+ continue
+ if " " in line or "\t" in line:
+ line = line.split()[0]
+ rules.append(line.lower())
+ return sorted(set(rules))
+
+
+def emit_header(path: str, rules):
+ with open(path, "w", encoding="utf-8", newline="\n") as out:
+ out.write("#pragma once\n")
+ out.write("static const char * const public_suffix_rules[] = {\n")
+ for rule in rules:
+ escaped = rule.replace("\\", "\\\\").replace('"', '\\"')
+ out.write(f'\t"{escaped}",\n')
+ out.write("};\n")
+ out.write(
+ "static const unsigned int public_suffix_rules_len = sizeof(public_suffix_rules) / sizeof(public_suffix_rules[0]);\n"
+ )
+
+
+def main():
+ if len(sys.argv) not in (2, 3):
+ raise SystemExit("usage: gen-public-suffix.py