Add pwa support, allow pwa-ing sub-folders

Signed-off-by: Hendrik Wolff <hendrik.wolff@agdsn.me>
This commit is contained in:
Hendrik Wolff 2025-09-02 18:32:54 +02:00
parent 52438bcc0d
commit ea8e403d38
2 changed files with 23 additions and 0 deletions

View file

@ -1752,6 +1752,7 @@ def add_ui(ap, retry):
ap2.add_argument("--qdel", metavar="LVL", type=int, default=2, help="number of confirmations to show when deleting files (2/1/0)") ap2.add_argument("--qdel", metavar="LVL", type=int, default=2, help="number of confirmations to show when deleting files (2/1/0)")
ap2.add_argument("--unlist", metavar="REGEX", type=u, default="", help="don't show files/folders matching \033[33mREGEX\033[0m in file list. WARNING: Purely cosmetic! Does not affect API calls, just the browser. Example: [\033[32m\\.(js|css)$\033[0m] (volflag=unlist)") ap2.add_argument("--unlist", metavar="REGEX", type=u, default="", help="don't show files/folders matching \033[33mREGEX\033[0m in file list. WARNING: Purely cosmetic! Does not affect API calls, just the browser. Example: [\033[32m\\.(js|css)$\033[0m] (volflag=unlist)")
ap2.add_argument("--favico", metavar="TXT", type=u, default="c 000 none" if retry else "🎉 000 none", help="\033[33mfavicon-text\033[0m [ \033[33mforeground\033[0m [ \033[33mbackground\033[0m ] ], set blank to disable") ap2.add_argument("--favico", metavar="TXT", type=u, default="c 000 none" if retry else "🎉 000 none", help="\033[33mfavicon-text\033[0m [ \033[33mforeground\033[0m [ \033[33mbackground\033[0m ] ], set blank to disable")
ap2.add_argument("--pwa", action="store_true", help="announce webmanifest; use folders as PWA")
ap2.add_argument("--ext-th", metavar="E=VP", type=u, action="append", help="\033[34mREPEATABLE:\033[0m use thumbnail-image \033[33mVP\033[0m for file-extension \033[33mE\033[0m, example: [\033[32mexe=/.res/exe.png\033[0m] (volflag=ext_th)") ap2.add_argument("--ext-th", metavar="E=VP", type=u, action="append", help="\033[34mREPEATABLE:\033[0m use thumbnail-image \033[33mVP\033[0m for file-extension \033[33mE\033[0m, example: [\033[32mexe=/.res/exe.png\033[0m] (volflag=ext_th)")
ap2.add_argument("--mpmc", type=u, default="", help=argparse.SUPPRESS) ap2.add_argument("--mpmc", type=u, default="", help=argparse.SUPPRESS)
ap2.add_argument("--spinner", metavar="TXT", type=u, default="🌲", help="\033[33memoji\033[0m or \033[33memoji,css\033[0m Example: [\033[32m🥖,padding:0\033[0m]") ap2.add_argument("--spinner", metavar="TXT", type=u, default="🌲", help="\033[33memoji\033[0m or \033[33memoji,css\033[0m Example: [\033[32m🥖,padding:0\033[0m]")

View file

@ -757,6 +757,11 @@ class HttpCli(object):
self.html_head += META_NOBOTS self.html_head += META_NOBOTS
self.out_headers["X-Robots-Tag"] = "noindex, nofollow" self.out_headers["X-Robots-Tag"] = "noindex, nofollow"
if self.args.pwa:
proto = "https" if self.is_https else "http"
url = "{}://{}/{}".format(proto, self.host, self.vpath)
self.html_head += '<link rel="manifest" href="{}?pwa" />'.format(url)
try: try:
cors_k = self._cors() cors_k = self._cors()
if self.mode in ("GET", "HEAD"): if self.mode in ("GET", "HEAD"):
@ -1368,6 +1373,9 @@ class HttpCli(object):
if "rss" in self.uparam: if "rss" in self.uparam:
return self.tx_rss() return self.tx_rss()
if "pwa" in self.uparam:
return self.tx_pwa()
return self.tx_browser() return self.tx_browser()
def tx_rss(self) -> bool: def tx_rss(self) -> bool:
@ -1512,6 +1520,20 @@ class HttpCli(object):
self.log("rss: %d hits, %d bytes" % (len(hits), len(bret))) self.log("rss: %d hits, %d bytes" % (len(hits), len(bret)))
return True return True
def tx_pwa(self) -> bool:
proto = "https" if self.is_https else "http"
url = "{}://{}/{}".format(proto, self.host, self.vpath)
name = "{} {} {}".format(self.args.favico.split(" ")[0], self.args.name, self.vpath)
ret = {
"name": name, "short_name": name,
"start_url": "{}".format(url),
"theme_color": "#000000", "background_color": "#000000",
"display": "standalone"
}
zs = json.dumps(ret, separators=(",\n", ": "))
self.reply(zs.encode("utf-8", "replace"), mime="application/json")
return True
def handle_propfind(self) -> bool: def handle_propfind(self) -> bool:
if self.do_log: if self.do_log:
self.log("PFIND %s @%s" % (self.req, self.uname)) self.log("PFIND %s @%s" % (self.req, self.uname))