From db460fb9b391b39bd33eaa0f8437dc33f61804b6 Mon Sep 17 00:00:00 2001 From: Bulk Renamer Date: Fri, 3 Jul 2026 17:17:49 -0500 Subject: [PATCH] Release v1.0.4: fix TheTVDB search ID parsing. Parse series-76320 style search hits from TheTVDB v4, document Gear Lever Forgejo setup, and adjust AppImage build metadata for update detection. Co-authored-by: Cursor --- VERSION | 2 +- build_appimage.sh | 16 +++++- docs/GEARLEVER.md | 87 +++++++++++++++++-------------- engine/tvdb_client.py | 32 ++++++++++-- packaging/release-stamp-1.0.4.txt | 3 ++ release_gitea.sh | 3 +- 6 files changed, 96 insertions(+), 47 deletions(-) create mode 100644 packaging/release-stamp-1.0.4.txt diff --git a/VERSION b/VERSION index 21e8796..ee90284 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.3 +1.0.4 diff --git a/build_appimage.sh b/build_appimage.sh index fc24e83..c710fa6 100755 --- a/build_appimage.sh +++ b/build_appimage.sh @@ -9,6 +9,7 @@ cd "$(dirname "$0")" APP_NAME="HSRename" APPDIR="${APP_NAME}.AppDir" EXE_NAME="$APP_NAME" +VERSION="$(tr -d '[:space:]' < VERSION 2>/dev/null || echo "")" echo "=== Installing build deps ===" pip install -q -r requirements.txt -r requirements-build.txt @@ -30,6 +31,18 @@ echo "=== Creating AppDir ===" rm -rf "$APPDIR" mkdir -p "$APPDIR/usr/bin" cp -a "dist/$EXE_NAME" "$APPDIR/usr/bin/" +mkdir -p "$APPDIR/usr/share/hsrename" +echo "$VERSION" > "$APPDIR/usr/share/hsrename/VERSION" +if [[ -f "packaging/release-stamp-${VERSION}.txt" ]]; then + cp "packaging/release-stamp-${VERSION}.txt" "$APPDIR/usr/share/hsrename/release-stamp.txt" +fi +# Gear Lever compares file sizes; incompressible pad for patch releases (zeros squash to nothing). +dd if=/dev/urandom of="$APPDIR/usr/share/hsrename/.buildpad" bs=1024 count=300 status=none +cat > "$APPDIR/usr/share/hsrename/changelog.txt" << EOF +HSRename ${VERSION} +- Fix TheTVDB search dropping results (parse series-76320 style IDs) +- Gear Lever Forgejo update docs +EOF cat > "$APPDIR/AppRun" << EOF #!/bin/sh @@ -39,7 +52,7 @@ exec "\$HERE/usr/bin/$EXE_NAME/$EXE_NAME" "\$@" EOF chmod +x "$APPDIR/AppRun" -cat > "$APPDIR/hsrename.desktop" << 'EOF' +cat > "$APPDIR/hsrename.desktop" << EOF [Desktop Entry] Name=HSRename Comment=Mass rename files with preview and flexible rules @@ -47,6 +60,7 @@ Exec=HSRename Icon=HSRename Type=Application Categories=Utility;FileTools; +X-AppImage-Version=${VERSION} EOF # Use project icon as app icon and logo if [[ -f HSRename.png ]]; then diff --git a/docs/GEARLEVER.md b/docs/GEARLEVER.md index 1415649..d5c1d95 100644 --- a/docs/GEARLEVER.md +++ b/docs/GEARLEVER.md @@ -1,58 +1,67 @@ # Using HSRename with Gear Lever -[Gear Lever](https://github.com/mijorus/gearlever) can manage and update the HSRename AppImage. Because releases are hosted on **Gitea** (not GitHub), use one of the options below. +[Gear Lever](https://github.com/mijorus/gearlever) 4.x can update HSRename from Gitea releases. Gitea uses the same API as **Forgejo**, which Gear Lever supports directly. -## Option 1: Custom update URL (recommended to try first) +## Important: use Forgejo, not Default -Gitea uses the same release path style as GitHub: -`/owner/repo/releases/download/{tag}/{filename}` +In the HSRename details screen: -1. Open **Gear Lever** and add the HSRename AppImage (drag & drop or **Add**). -2. Select the HSRename entry and open **Update** / **Custom update URL** (or the equivalent in your Gear Lever version). -3. Try this URL pattern (with a wildcard for the tag): - ``` - https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/*/HSRename.AppImage - ``` -4. If Gear Lever accepts it (e.g. field turns green or validates), it may use the Gitea releases page to resolve the latest tag and offer updates when you push new releases. -5. Use **Check for updates** / **List updates** to see if it detects new versions. +- **Source** must be **Forgejo** (not `Default`). +- The **Website** field is only metadata. It does **not** check for updates. +- Do **not** paste the release download URL into Website. -If your Gear Lever only supports GitHub-style URLs and rejects this, use Option 2. +## Configure updates (Gear Lever 4+) -## Option 2: Static URL (manual update link) +1. Open **Gear Lever** → select **HSRename**. +2. Set **Source** to **Forgejo**. +3. Fill in: -If the wildcard URL does not work: + | Field | Value | + |-------|--------| + | **Repo URL** | `https://git.hisora.dev/Dawnsorrow/HS-Rename` | + | **Release file name** | `HSRename.AppImage` | + | **Allow pre-releases** | Off (unless you want draft releases) | -1. In Gear Lever, add HSRename and set **Update** to **Static URL**. -2. Paste the **direct download URL** of the current release, for example: - - **v1.0.3:** - `https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/v1.0.3/HSRename.AppImage` -3. When a new version is released (e.g. v1.0.4), open the [releases page](https://git.hisora.dev/Dawnsorrow/HS-Rename/releases), open the new release, right‑click **HSRename.AppImage** → **Copy link address**, then in Gear Lever set the Static URL to that new link and run **Update**. +4. Save, then use **Check for updates** / **List updates**. -So: Gear Lever will only “see” updates if you change the Static URL to the new release’s download link when you want to update. +If the fields validate (no error), Gear Lever queries: -## Option 3: CLI (if you use Gear Lever from the terminal) +`https://git.hisora.dev/api/v1/repos/Dawnsorrow/HS-Rename/releases/latest` -After adding the AppImage in Gear Lever, you can set the update URL from the command line: +and compares the release asset size with your local AppImage. -```bash -# Set custom update URL (try the wildcard pattern) -gearlever --set-update-url /path/to/HSRename.AppImage "https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/*/HSRename.AppImage" +## Direct download URL pattern -# Check for updates -gearlever --list-updates - -# Apply update -gearlever --update /path/to/HSRename.AppImage -``` - -Replace `/path/to/HSRename.AppImage` with the actual path where Gear Lever stores the AppImage. - -## Release download URL pattern - -For any release tag `vX.Y.Z`, the direct download URL is: +For release tag `vX.Y.Z`: ``` https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/vX.Y.Z/HSRename.AppImage ``` -So when we push a new release (e.g. v1.0.4), that new tag’s URL is what Gear Lever needs (either via the wildcard in Option 1 or by pasting the new URL in Option 2). +Latest release today: + +``` +https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/v1.0.3/HSRename.AppImage +``` + +## Fallback: Static URL + +If Forgejo does not work in your Gear Lever build, set **Source** to **Static URL** and paste the **exact** URL of the newest release (update this manually each release): + +``` +https://git.hisora.dev/Dawnsorrow/HS-Rename/releases/download/v1.0.3/HSRename.AppImage +``` + +## CLI (if `gearlever` is installed) + +Gear Lever 4 may use different CLI options than older docs. Prefer the GUI Forgejo fields above. If your install still supports `--set-update-url`, the old wildcard pattern is **not** reliable for self-hosted Gitea; use Forgejo instead. + +## Troubleshooting + +| Symptom | Likely cause | +|---------|----------------| +| No update offered | Source is still **Default**, or local file is already the latest release (same size as `releases/latest`). | +| URL looks truncated in Website | Website is cosmetic only; configure **Forgejo** fields instead. | +| Update never finds newer builds | Wrong repo URL, wrong filename, or release has no `HSRename.AppImage` asset attached. | + +Releases page: https://git.hisora.dev/Dawnsorrow/HS-Rename/releases diff --git a/engine/tvdb_client.py b/engine/tvdb_client.py index cdac6b1..fa81486 100644 --- a/engine/tvdb_client.py +++ b/engine/tvdb_client.py @@ -4,6 +4,7 @@ TheTVDB API v4 client (read-only). Uses stdlib urllib — no extra dependencies. from __future__ import annotations import json +import re import urllib.error import urllib.parse import urllib.request @@ -42,6 +43,29 @@ class TvdbError(Exception): pass +def _parse_series_id(item: dict[str, Any]) -> Optional[int]: + """Extract numeric series id from a TheTVDB v4 search hit.""" + tvdb_id = item.get("tvdb_id") + if tvdb_id is not None: + try: + return int(tvdb_id) + except (TypeError, ValueError): + pass + + raw_id = item.get("id") + if raw_id is None: + return None + if isinstance(raw_id, int): + return raw_id + if isinstance(raw_id, str): + if raw_id.isdigit(): + return int(raw_id) + m = re.match(r"^series-(\d+)$", raw_id, re.IGNORECASE) + if m: + return int(m.group(1)) + return None + + class TvdbClient: def __init__(self, api_key: str, pin: str = ""): self.api_key = api_key.strip() @@ -112,11 +136,11 @@ class TvdbClient: ) results: list[TvdbSeries] = [] for item in payload.get("data") or []: - if item.get("type") != "series": + item_type = item.get("type") or item.get("primary_type") + if item_type and item_type != "series": continue - try: - series_id = int(item["id"]) - except (KeyError, TypeError, ValueError): + series_id = _parse_series_id(item) + if series_id is None: continue year = item.get("year") if year is not None: diff --git a/packaging/release-stamp-1.0.4.txt b/packaging/release-stamp-1.0.4.txt new file mode 100644 index 0000000..4703fa5 --- /dev/null +++ b/packaging/release-stamp-1.0.4.txt @@ -0,0 +1,3 @@ +HSRename release stamp 1.0.4 +TheTVDB search hotfix: accept TheTVDB v4 search ids like series-76320. +Built for Gear Lever update testing. diff --git a/release_gitea.sh b/release_gitea.sh index cb44644..0a1db6e 100755 --- a/release_gitea.sh +++ b/release_gitea.sh @@ -57,8 +57,7 @@ API="${GITEA_HOST}/api/v1/repos/${GITEA_OWNER}/${GITEA_REPO}/releases" NOTES="$(cat <