chore: fix utility typo, remove Dual Screen category, more improvements to the add-app script

This commit is contained in:
Richard Macias
2026-01-11 19:39:26 -06:00
parent 415c70ccc6
commit 975f608b88
10 changed files with 144 additions and 72 deletions

View File

@@ -39,17 +39,17 @@ DEFAULT_ADDITIONAL_SETTINGS = {
CATEGORIES = [
"Emulator",
"Frontend",
"Utility",
"Utilities",
"Dual Screen",
"PC Emulation",
"Streaming",
]
VARIANT_OPTIONS = [
"Both", # Include in both standard and dual-screen
"Both", # Include in both standard and dual-screen
"Standard only", # Include in standard only
"Dual-screen only", # Include in dual-screen only
"README only", # Exclude from export, show in table only
"README only", # Exclude from export, show in table only
]
SOURCE_DETECTION = {
@@ -100,9 +100,10 @@ def select_menu(title: str, choices: list[str], default: int = 0) -> str:
# Only use curses if we have a real terminal
if not sys.stdin.isatty():
return _select_menu_fallback(title, choices, default)
try:
import curses
return _select_menu_curses(title, choices, default)
except Exception:
# Fallback to simple input if curses fails
@@ -111,15 +112,16 @@ def select_menu(title: str, choices: list[str], default: int = 0) -> str:
def _select_menu_curses(title: str, choices: list[str], default: int = 0) -> str:
"""Curses-based interactive menu."""
def menu(stdscr):
curses.curs_set(0) # Hide cursor
current = default
while True:
stdscr.clear()
stdscr.addstr(0, 0, title)
stdscr.addstr(1, 0, "(Use arrow keys, Enter to select)")
for i, choice in enumerate(choices):
y = i + 3
if i == current:
@@ -128,10 +130,10 @@ def _select_menu_curses(title: str, choices: list[str], default: int = 0) -> str
stdscr.attroff(curses.A_REVERSE)
else:
stdscr.addstr(y, 2, f" {choice} ")
stdscr.refresh()
key = stdscr.getch()
if key == curses.KEY_UP and current > 0:
current -= 1
elif key == curses.KEY_DOWN and current < len(choices) - 1:
@@ -140,8 +142,9 @@ def _select_menu_curses(title: str, choices: list[str], default: int = 0) -> str
return choices[current]
elif key == 27: # ESC
return choices[default]
import curses
return curses.wrapper(menu)
@@ -151,7 +154,7 @@ def _select_menu_fallback(title: str, choices: list[str], default: int = 0) -> s
for i, choice in enumerate(choices):
marker = ">" if i == default else " "
print(f" {marker} {i + 1}. {choice}")
while True:
result = input(f"Enter number [{default + 1}]: ").strip()
if not result:
@@ -173,19 +176,27 @@ def generate_app_entry(
categories: list[str],
source: str,
variant: str,
name_override: str | None = None,
include_prereleases: bool = False,
verify_latest_tag: bool = False,
app_name_override: str | None = None,
url_override: str | None = None,
) -> dict:
"""Generate a complete app entry."""
settings = DEFAULT_ADDITIONAL_SETTINGS.copy()
if include_prereleases:
settings["includePrereleases"] = True
if verify_latest_tag:
settings["verifyLatestTag"] = True
if app_name_override:
settings["appName"] = app_name_override
app = {
"id": app_id,
"url": url,
"author": author,
"name": name,
"preferredApkIndex": 0,
"additionalSettings": json.dumps(
DEFAULT_ADDITIONAL_SETTINGS, separators=(",", ":")
),
"additionalSettings": json.dumps(settings, separators=(",", ":")),
"categories": categories,
"overrideSource": source,
}
@@ -200,8 +211,8 @@ def generate_app_entry(
meta["excludeFromExport"] = True
# "Both" = no meta needed (default behavior)
if name_override:
meta["nameOverride"] = name_override
if app_name_override:
meta["nameOverride"] = app_name_override
if url_override:
meta["urlOverride"] = url_override
@@ -259,15 +270,23 @@ def main() -> int:
variant = select_menu("Include in which release(s):", VARIANT_OPTIONS)
print(f" Selected: {variant}")
# Pre-releases
include_prereleases = prompt_yes_no("Include pre-releases?", False)
print(f" Include pre-releases: {'Yes' if include_prereleases else 'No'}")
# Verify latest tag
verify_latest_tag = prompt_yes_no("Verify latest tag?", False)
print(f" Verify latest tag: {'Yes' if verify_latest_tag else 'No'}")
# Optional overrides
print("")
name_override = ""
if prompt_yes_no("Override display name in README table?", False):
name_override = prompt("Display name override")
app_name_override = input(
"App name override - leave blank to skip (sets display name in both Obtainium & README): "
).strip()
if app_name_override:
print(f" Will set additionalSettings.appName and meta.nameOverride")
url_override = ""
if prompt_yes_no("Override homepage URL in README table?", False):
url_override = prompt("Homepage URL override")
url_override = input("Homepage URL override - leave blank to skip: ").strip()
# Generate the entry
app_entry = generate_app_entry(
@@ -278,7 +297,9 @@ def main() -> int:
categories=[category],
source=source,
variant=variant,
name_override=name_override or None,
include_prereleases=include_prereleases,
verify_latest_tag=verify_latest_tag,
app_name_override=app_name_override or None,
url_override=url_override or None,
)