From 73d3abe667dd83dd618ed47b331811ab6ddfc0bb Mon Sep 17 00:00:00 2001
From: Gemba
Date: Mon, 3 Aug 2026 22:21:39 +0200
Subject: [PATCH 01/14] update testcase pathtools
---
src/pathtools.cpp | 2 ++
test/Makefile | 3 ++-
test/abstractscraper/test_abstractscraper.pro | 2 ++
test/pathtools/test_pathtools.cpp | 3 +++
4 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/pathtools.cpp b/src/pathtools.cpp
index 13bfcf1b..13bf7678 100644
--- a/src/pathtools.cpp
+++ b/src/pathtools.cpp
@@ -40,6 +40,8 @@ QString PathTools::concatPath(QString path, QString subPath) {
}
if (subPath == "." || subPath.isEmpty())
return path;
+ while (subPath.right(1) == "/")
+ subPath.chop(1);
if (!path.isEmpty() && path.right(1) != "/") {
return path % "/" % subPath;
}
diff --git a/test/Makefile b/test/Makefile
index 6b114336..bad12d2c 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -3,13 +3,14 @@ QMAKE = qmake6
tests:
$(foreach subdir, $(SUBDIRS), \
- echo "\n[*] Making all in test/$(subdir) ..."; \
+ echo "\n[*] Making 'all' in test/$(subdir) ..."; \
cd $(subdir) && $(QMAKE); \
$(MAKE) -j$(shell nproc) all || exit 1; \
./test_$(subdir) || exit 1; \
echo "[*] ... done tests in test/$(subdir).\n"; \
cd .. ; \
)
+ @echo "[+] All tests passed: $(SUBDIRS).\n";
clean:
$(foreach subdir, $(SUBDIRS), \
diff --git a/test/abstractscraper/test_abstractscraper.pro b/test/abstractscraper/test_abstractscraper.pro
index d4b8b273..8839abf0 100644
--- a/test/abstractscraper/test_abstractscraper.pro
+++ b/test/abstractscraper/test_abstractscraper.pro
@@ -25,6 +25,7 @@ HEADERS += \
../../src/netcomm.h \
../../src/netmanager.h \
../../src/nocolor.h \
+ ../../src/pathtools.h \
../../src/platform.h \
../../src/strtools.h
@@ -36,6 +37,7 @@ SOURCES += test_abstractscraper.cpp \
../../src/netcomm.cpp \
../../src/netmanager.cpp \
../../src/nocolor.cpp \
+ ../../src/pathtools.cpp \
../../src/platform.cpp \
../../src/strtools.cpp
diff --git a/test/pathtools/test_pathtools.cpp b/test/pathtools/test_pathtools.cpp
index 55bc6798..fe62a7bc 100644
--- a/test/pathtools/test_pathtools.cpp
+++ b/test/pathtools/test_pathtools.cpp
@@ -61,6 +61,9 @@ private slots:
actual = PathTools::makeAbsolutePath("/yadda/meh///", "wuff");
QCOMPARE(actual, "/yadda/meh/wuff");
+
+ actual = PathTools::makeAbsolutePath("/path/to/app/bin", "wuff/");
+ QCOMPARE(actual, "/path/to/app/bin/wuff");
}
void testlexicalRel() {
From aadf345b38b5a98479cf375ea6e472e2d7a8b20d Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 8 Aug 2026 18:48:05 +0200
Subject: [PATCH 02/14] change header of mameMap.csv
---
mameMap.csv | 2 +-
supplementary/scraperdata/mame_map_update_csv.py | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/mameMap.csv b/mameMap.csv
index 75c1ccf9..98ed13c3 100644
--- a/mameMap.csv
+++ b/mameMap.csv
@@ -1,4 +1,4 @@
-# Generated on 2026-01-31,from "MAME 0.284 (arcade).dat", "fbneo.dat", "mame2003-plus.xml"
+# Generated 2026-01-31, sources: "MAME 0.284 (arcade).dat", "fbneo.dat", "mame2003-plus.xml"
# yarked from: https://raw.githubusercontent.com/RetroPie/EmulationStation/master/resources/mamenames.xml
rom_filename_stem;rom_title
"005";"005"
diff --git a/supplementary/scraperdata/mame_map_update_csv.py b/supplementary/scraperdata/mame_map_update_csv.py
index bf33bbc4..de1c7285 100644
--- a/supplementary/scraperdata/mame_map_update_csv.py
+++ b/supplementary/scraperdata/mame_map_update_csv.py
@@ -25,6 +25,8 @@
req = requests.get(URL)
lines = req.text.split("\n")
hdr = lines[0].replace("", "").strip()
+hdr = hdr.replace(" on ", " ")
+hdr = hdr.replace(",from", ", sources:")
print(f"[+] File info: {hdr}")
prev_hdr = ""
From e4ae03f03e363ce0a129339ae37a5dc1a5ff2f2a Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sun, 9 Aug 2026 14:20:00 +0200
Subject: [PATCH 03/14] Update changelog and docs for upcoming 3.21
---
README.md | 16 ++++++++++++++--
docs/CHANGELOG.md | 17 +++++++++++++++++
docs/CLIHELP.md | 14 ++++++++++++++
docs/FRONTENDS.md | 21 +++++++++++++--------
docs/INSTALLATION.md | 2 ++
5 files changed, 60 insertions(+), 10 deletions(-)
diff --git a/README.md b/README.md
index 496e8724..30caa82e 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
- Installation (Linux|NixOS|macOS|Docker|Windows) •
+ Installation (Linux|NixOS|macOS|Install without root|Docker|Windows) •
Quick Usage •
User Manual •
Changelog
@@ -55,7 +55,7 @@ You can configure and add platforms without having the needs to edit the code so
- [peas.json](peas.json): Describes now the supported platforms and recognized gamefile extensions by Skyscraper. See all details in the [platforms documentation](https://gemba.github.io/skyscraper/PLATFORMS/).
- [platforms_idmap.csv](platforms_idmap.csv): Maps the local platform name to the platform ID of screenscraper.fr, Mobygames or The Games DB web API, this yields more accurate hits.
-These files are copied into the folder `/home/pi/.skyscraper` on RetroPie (or `/usr/local/etc/skyscraper/` in general) at the first run of the program.
+These files are copied into the folder `$HOME/.skyscraper` on Linux (or `$XDG_CONFIG_HOME/skyscraper/` with XDG) at the first run of the program.
## 🕹 Frontends Supported (set with '-f'):
@@ -64,6 +64,7 @@ These files are copied into the folder `/home/pi/.skyscraper` on RetroPie (or `/
* Batocera
* AttractMode
* Pegasus
+* RetroArch
* RetroBat
More details in the [frontends documentation](https://gemba.github.io/skyscraper/FRONTENDS/)
@@ -141,6 +142,17 @@ $ brew install qt
```
You may also need a recent installation of [XCode](https://xcodereleases.com/) for the development tools. Then proceed to the default installation instructions in the "Download, compile and install" section. It will give you a working installation of Skyscraper.
+### User Level Install
+
+Linux users may use the provided AppImages (see [Release
+Assets](https://github.com/Gemba/skyscraper/releases)). Pick the image which
+fits your architecture and system configuration (with XDG or without).
+
+After building the binary Linux users (and most likely macOS and Windows users),
+can use the single binary Skyscraper and put it somewhere in the `$PATH` lookup.
+Consider to review the output of `--configinfo` to see which file is sourced from
+which location.
+
#### Docker
Two Docker setups exist: One general in the `docker/` folder. The other resides in the `.devcontainer/` and its use is for [MS Dev Containers](https://microsoft.github.io/code-with-engineering-playbook/developer-experience/devcontainers/).
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 733c3542..be76d9b0 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -3,6 +3,23 @@
This page summarizes the changes of each Skyscraper release, a [changlog for
humans](https://keepachangelog.com).
+### Version 3.21.0 (2026-TBA)
+
+- Added: AppImage support for PC (x64) and ARM (aarch64) architectures (with or
+ without XDG support), find the AppImages in the release section of this repo.
+ Thanks to @goldug for the providing the write-up, which got things rolling
+- Added: Support for running Skyscraper natively on Batocera, via AppImage. See
+ [Batocera usage](FRONTENDS.md#usage-of-skyscraper-for-batocera)
+- Added: Ability to run Skyscraper binary as single binary. You only have to
+ provide your `config.ini`, if needed. Useful for user-level installations (no
+ root/elevated privileges needed) like using it with XDG from path
+ `$HOME/.local/bin` or calling Skyscraper from other tools like Scrappy or
+ EmulationStation-X
+- Added: Option [`--configinfo`](CLIHELP.md#-confginfo) shows config files and
+ their source. Comes in handy when using Skyscraper single binary installs.
+- Fixed: Regression when copying media files on RetroPie (shipped with 3.20.2)
+- Fixed: XDG `resources/` file loading
+
### Version 3.20.0 (2026-06-04)
- Added: TheGamesDB does provide videos since a few weeks, thus scraping of
diff --git a/docs/CLIHELP.md b/docs/CLIHELP.md
index 9948565a..4677f0a9 100644
--- a/docs/CLIHELP.md
+++ b/docs/CLIHELP.md
@@ -251,6 +251,20 @@ Skyscraper -p snes -s thegamesdb --addext '.ext1 ext2'
Show the build configuration and runtime environment of Skyscraper and exits. Use this info when reporting an issue. Thanks!
+### --confginfo
+
+Provides information on how Skyscraper sources the essential configuration
+files. The output is limited to the mandatory configuration files of Skyscraper.
+Whenever you provide one of the listed configfiles at the appropiate location,
+the built-in version is ignored. The configinfo option will show the used source
+location in that case. This commmand is especially useful if you run Skyscraper
+as single binary, thus you did not install it for
+every users (did not run `make install`).
+
+!!! info
+
+ You may notice differences in output between the very first usage of Skyscraper and after running some scraping or gamelist creation: Skyscraper puts some files from its built-in file storage to the filesystem, because most likely you will want to modify these config files.
+
### --cache
This is the cache master option. It contains several subcommands that allows you to manipulate the cached data for the selected platform.
diff --git a/docs/FRONTENDS.md b/docs/FRONTENDS.md
index ba961227..dd5baab2 100644
--- a/docs/FRONTENDS.md
+++ b/docs/FRONTENDS.md
@@ -174,13 +174,18 @@ adds those on occasion) like: `cheevosHash`, `cheevosId`, `scrap`, ...
#### Usage of Skyscraper for Batocera
-It is possible to compile Skyscraper on Batocera supported systems but you will
-need the build-toolchain (at least GCC, make and Qt). Additionally, the
-configuration files must be installed in a defined location (see the `PREFIX`
-option in the top-level `README.md`, if you are keen to compile Skyscraper on
-Batocera).
-
-A more convienient way is to use Skyscraper from you Desktop system: Below you
+Preferably you should use the regular aach64/x64 AppImage (i.e., without XDG) and deploy it to
+your Batocera setup. Then login via SSH to Batocera (see their documentation for
+hints). Or, when you have a keyboard attached to your Batocera host: From the
+settings menu in batocera you can choose (command line) applications, from the
+file manager then started pick a terminal.
+
+In both cases run the AppImage (maybe do `chmod a+x *AppImage*`). Either set the
+`frontend=` to `batocera` or provide `-f batocera` on every Skyscraper call.
+Why? This will ensure that the default file locations for ROMs (input folder),
+gamelist output (gamelist folder) and media files (media folder) are applied.
+
+An alternative way is to use Skyscraper from you Desktop system: Below you
can find a step-by-step guide for Linux systems, macOS should be similar.
Windows desktop users can use SMB shares and can adapt the following steps.
@@ -377,4 +382,4 @@ skip existing entries, Skyscraper will use the old game list as a reference.
playlist compression in RetroArch and save the playlist from RetroArch as
plain JSON.
5. The settings of "scan_content_dir" in an existing playlist are not yet
- preserved.
\ No newline at end of file
+ preserved.
diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md
index 12ce2f7e..a98d60c5 100644
--- a/docs/INSTALLATION.md
+++ b/docs/INSTALLATION.md
@@ -7,6 +7,8 @@ You can find detailled installation instructions in the respective section in th
- Linux distros with Debian package system (Ubuntu, RaspiOS, aso.), [without
RetroPie](https://github.com/Gemba/skyscraper/blob/master/README.md#linux)
+ - Linux distros may also use AppImage builds. Provided for PC and ARM (each
+ 64 Bit) and with or without XDG support. See Releases section on the GitHub repo.
- For other Linux distributions assure the [package
dependencies](https://github.com/Gemba/skyscraper/blob/master/README.md#linux)
are met for your distro
From fb0306fb700308fe3a77e1bf95b1d83d202caf24 Mon Sep 17 00:00:00 2001
From: obiwanxshinobi
Date: Thu, 13 Aug 2026 21:41:11 +0300
Subject: [PATCH 04/14] Fix ArcadeDB scraper: use https baseUrl (#262)
adb.arcadeitalia.net 301-redirects http -> https. Qt5's
QNetworkAccessManager does not follow redirects by default, so every
ArcadeDB query returns the redirect body instead of JSON and all
lookups report 'not found'.
Co-authored-by: obiwanxshinobi
---
src/arcadedb.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/arcadedb.cpp b/src/arcadedb.cpp
index 4d1422d1..43e523e6 100644
--- a/src/arcadedb.cpp
+++ b/src/arcadedb.cpp
@@ -40,7 +40,7 @@ static const QRegularExpression MATCH_COPYRIGHT = QRegularExpression(
ArcadeDB::ArcadeDB(Settings *config, QSharedPointer manager)
: AbstractScraper(config, manager, MatchType::MATCH_ONE) {
- baseUrl = "http://adb.arcadeitalia.net";
+ baseUrl = "https://adb.arcadeitalia.net";
searchUrlPre =
baseUrl +
From c6fb749267e07f7f8f87dfd053da218841301923 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Mon, 10 Aug 2026 21:07:50 +0200
Subject: [PATCH 05/14] updates to AppImage build (smaller size, plus XDG)
---
VERSION.ini | 2 +-
skyscraper.pro | 2 +-
supplementary/workflows/appimage | 129 +++++++++++++++++++------------
3 files changed, 83 insertions(+), 50 deletions(-)
diff --git a/VERSION.ini b/VERSION.ini
index 36032678..5ad8bef0 100644
--- a/VERSION.ini
+++ b/VERSION.ini
@@ -1 +1 @@
-VERSION="3.20.2"
+VERSION="3.20.3"
diff --git a/skyscraper.pro b/skyscraper.pro
index 77d0a0a6..bc8c1618 100644
--- a/skyscraper.pro
+++ b/skyscraper.pro
@@ -4,7 +4,7 @@ DEPENDPATH += .
INCLUDEPATH += .
CONFIG += release
# enable for XDG directory layout - see also Skyscraper docs
-#DEFINES+=XDG
+#DEFINES += XDG
# set std-C++17 for clang and gcc
CONFIG += c++1z
QT += core network sql xml
diff --git a/supplementary/workflows/appimage b/supplementary/workflows/appimage
index 33e04a33..151c3efe 100644
--- a/supplementary/workflows/appimage
+++ b/supplementary/workflows/appimage
@@ -10,30 +10,34 @@ app_dir="$SKYSCRAPER_HOME/AppDir"
pushd "$SKYSCRAPER_HOME"
ld_bins=(
- "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$ARCH.AppImage"
- "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-$ARCH.AppImage"
- "https://github.com/darealshinji/linuxdeploy-plugin-checkrt/releases/download/continuous/linuxdeploy-plugin-checkrt.sh"
+ "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-$ARCH.AppImage"
+ "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-$ARCH.AppImage"
+ "https://github.com/darealshinji/linuxdeploy-plugin-checkrt/releases/download/continuous/linuxdeploy-plugin-checkrt.sh"
)
for l in "${ld_bins[@]}"; do
- if [[ ! -f "$(basename "$l")" ]]; then
- wget --quiet "$l"
- chmod a+x "$(basename "$l")"
- fi
+ if [[ ! -f "$(basename "$l")" ]]; then
+ wget --quiet "$l"
+ chmod a+x "$(basename "$l")"
+ fi
done
-make --ignore-errors distclean || true
-#sed -i "0,/CONFIG += /{s/CONFIG.*/CONFIG += debug/}" skyscraper.pro
-PREFIX=/usr SYSCONFDIR=/etc qmake6 skyscraper.pro
-jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)
-rm -rf "$app_dir" || true
-make "-j$jobs" install INSTALL_ROOT="$app_dir"
+function build_appimage() {
+ local _xdg="${1:-}"
+ make --ignore-errors distclean || true
+ #sed -i "0,/CONFIG += /{s/CONFIG.*/CONFIG += debug/}" skyscraper.pro
+ [[ -n "$_xdg" ]] && sed -i "0,/.+DEFINES += XDG/{s/.*DEFINES/DEFINES/}" skyscraper.pro
+ [[ -z "$_xdg" ]] && sed -i "0,/DEFINES += XDG/{s/.*DEFINES/#DEFINES/}" skyscraper.pro
+ PREFIX=/usr SYSCONFDIR=/etc qmake6 skyscraper.pro
+ jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)
+ rm -rf "$app_dir" || true
+ make "-j$jobs" install INSTALL_ROOT="$app_dir"
-rm "$app_dir"/usr/bin/*.py
-rm "$app_dir/usr/bin/README-Skyscraper-Scripts.md"
-rm "$app_dir/usr/bin/mdb2sqlite.sh"
+ rm "$app_dir"/usr/bin/*.py
+ rm "$app_dir/usr/bin/README-Skyscraper-Scripts.md"
+ rm "$app_dir/usr/bin/mdb2sqlite.sh"
-cat >skyscraper.desktop <skyscraper.desktop <
Date: Thu, 13 Aug 2026 20:57:03 +0200
Subject: [PATCH 06/14] update on actions
- use qt6 on macOS and android
- run mkdocs only on doc change
- run tests only on changes src/** and test/**
- macOS build testdrive
- udpate conditions on codeQL action
---
.github/workflows/ci.yml | 5 ++++-
.github/workflows/codeql.yml | 6 +++++-
.github/workflows/dispatch.yml | 39 ++++++++++++++++++++++++++++++++++
.github/workflows/mkdocs.yml | 6 ++++--
src/batocera.h | 2 +-
supplementary/workflows/deps | 6 +++---
6 files changed, 56 insertions(+), 8 deletions(-)
create mode 100644 .github/workflows/dispatch.yml
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 12ddbf8e..b535cef0 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,6 +1,9 @@
name: Tests
-on: [push]
+on:
+ push:
+ branches: '*'
+ paths: ['src/**','test/**']
jobs:
Build:
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 3d637ddf..caf089a9 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -14,8 +14,12 @@ name: "CodeQL"
on:
push:
branches: [ "master" ]
+ paths:
+ - 'src/**'
pull_request:
branches: [ "master" ]
+ paths:
+ - 'src/**'
schedule:
- cron: '18 15 * * 1'
@@ -48,7 +52,7 @@ jobs:
modules: ""
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@master
- name: Install Qt
uses: jurplel/install-qt-action@v3
diff --git a/.github/workflows/dispatch.yml b/.github/workflows/dispatch.yml
new file mode 100644
index 00000000..0e93bf3f
--- /dev/null
+++ b/.github/workflows/dispatch.yml
@@ -0,0 +1,39 @@
+name: Testbed
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build-macos:
+ name: Build macOS
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [macos-latest, macos-26-intel]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v4
+ - name: Install Qt6
+ run: |
+ brew install qt@6
+ echo "$(brew --prefix qt@6)/bin" >> $GITHUB_PATH
+ - name: Build
+ run: |
+ qmake
+ make -j$(sysctl -n hw.ncpu)
+ - name: Tarball
+ run: |
+ mkdir -p package/usr/local/bin
+ mkdir -p package/usr/local/etc/skyscraper
+ mkdir -p package/usr/local/etc/skyscraper/cache
+ mkdir -p package/usr/local/etc/skyscraper/import
+ mkdir -p package/usr/local/etc/skyscraper/resources
+ cp Skyscraper.app/Contents/MacOS/Skyscraper package/usr/local/bin/
+ cd package
+ tar -czf ../skyscraper-${{ needs.create-release.outputs.version }}-macos-$(uname -m).tar.gz *
+ cd ..
+ - name: Smoketest
+ run: bash ./Skyscraper.app/Contents/MacOS/Skyscraper --buildinfo && ./Skyscraper.app/Contents/MacOS/Skyscraper --configinfo
+
+
diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml
index 630099d6..aab16229 100644
--- a/.github/workflows/mkdocs.yml
+++ b/.github/workflows/mkdocs.yml
@@ -3,12 +3,14 @@ on:
push:
branches:
- master
+ paths:
+ - 'docs/**'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - uses: actions/checkout@vmaster
+ - uses: actions/setup-python@master
with:
python-version: 3.x
- run: pip install mkdocs mkdocs-material
diff --git a/src/batocera.h b/src/batocera.h
index 351dd5e6..5e69d48a 100644
--- a/src/batocera.h
+++ b/src/batocera.h
@@ -61,7 +61,7 @@ class Batocera : public EmulationStation {
protected:
QStringList createEsVariantXml(const GameEntry &entry) override;
void preserveVariants(const GameEntry &oldEntry, GameEntry &entry) override;
- bool addEmptyElement() { return false; };
+ bool addEmptyElement() override { return false; }
QString openingElement(GameEntry &entry) override;
QString getTargetFileName(GameEntry::Types t,
const QString &basename) override;
diff --git a/supplementary/workflows/deps b/supplementary/workflows/deps
index 8b215373..8bddbf95 100644
--- a/supplementary/workflows/deps
+++ b/supplementary/workflows/deps
@@ -66,11 +66,11 @@ main() {
case "$PLATFORM" in
"osx")
- _install brew qt5
- brew link qt5 --force || true
+ _install brew qt@6
+ brew link qt@6 --force || true
;;
"termux")
- _install x11-repo qt5-qtbase
+ _install x11-repo qt6-qtbase
;;
"linux")
_install build-essential qtbase5-dev qt5-qmake qtbase5-dev-tools
From b782462062cd9d918cbb872c5ccc01aae362f329 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 15 Aug 2026 15:03:25 +0200
Subject: [PATCH 07/14] Fix appimage glibc base (#265)
* fix Appimages for Ubuntu 22.04 and Debian 12 target hosts
---
.github/workflows/appimage.yml | 6 ++++--
supplementary/workflows/appimage | 6 ++++++
2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml
index b1d91e89..3deac0b2 100644
--- a/.github/workflows/appimage.yml
+++ b/.github/workflows/appimage.yml
@@ -3,13 +3,15 @@ name: Create AppImage
on:
release:
types: [published]
+ workflow_dispatch:
+
jobs:
AppImage:
strategy:
fail-fast: false
matrix:
- os: [ubuntu-latest, ubuntu-24.04-arm]
+ os: [ubuntu-22.04-arm, ubuntu-22.04-arm]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout sources
@@ -20,6 +22,6 @@ jobs:
run: bash ./supplementary/workflows/appimage
- name: Release
uses: softprops/action-gh-release@v3
- #if: github.ref_type == 'tag'
+ if: "${{ github.event_name != 'workflow_dispatch' }}"
with:
files: Skyscraper-*.AppImage
diff --git a/supplementary/workflows/appimage b/supplementary/workflows/appimage
index 151c3efe..d48f705e 100644
--- a/supplementary/workflows/appimage
+++ b/supplementary/workflows/appimage
@@ -37,6 +37,12 @@ function build_appimage() {
rm "$app_dir/usr/bin/README-Skyscraper-Scripts.md"
rm "$app_dir/usr/bin/mdb2sqlite.sh"
+ # GLIBC baseline for target hosts
+ GLIBC_BASE="2.35" # Ubuntu 22.04 / Debian Bookworm (12)
+ #GLIBC_BASE="2.38" # Ubuntu 24.04 / Debian Trixie (13)
+ build_host_glibc=$(readelf -V "$app_dir"/usr/bin/Skyscraper 2>/dev/null | grep -o 'GLIBC_[0-9.]*' | sort -V | tail -1| cut -d _ -f2)
+ dpkg --compare-versions "$build_host_glibc" eq $GLIBC_BASE
+
cat >skyscraper.desktop <
Date: Sat, 15 Aug 2026 15:05:26 +0200
Subject: [PATCH 08/14] use https by default
---
src/screenscraper.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/screenscraper.cpp b/src/screenscraper.cpp
index 9ade7b20..cff00df2 100644
--- a/src/screenscraper.cpp
+++ b/src/screenscraper.cpp
@@ -63,7 +63,7 @@ ScreenScraper::ScreenScraper(Settings *config,
}
});
- baseUrl = "http://www.screenscraper.fr";
+ baseUrl = "https://www.screenscraper.fr";
fetchOrder.append(GameEntry::Elem::PUBLISHER);
fetchOrder.append(GameEntry::Elem::DEVELOPER);
From d03bfd2de4d3babf494ebc91dcba788d98e07d33 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 15 Aug 2026 15:24:47 +0200
Subject: [PATCH 09/14] adjust glibc version match
---
supplementary/workflows/appimage | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/supplementary/workflows/appimage b/supplementary/workflows/appimage
index d48f705e..58cb8302 100644
--- a/supplementary/workflows/appimage
+++ b/supplementary/workflows/appimage
@@ -39,9 +39,9 @@ function build_appimage() {
# GLIBC baseline for target hosts
GLIBC_BASE="2.35" # Ubuntu 22.04 / Debian Bookworm (12)
- #GLIBC_BASE="2.38" # Ubuntu 24.04 / Debian Trixie (13)
+ #GLIBC_BASE="2.39" # Ubuntu 24.04 / Debian Trixie (13)
build_host_glibc=$(readelf -V "$app_dir"/usr/bin/Skyscraper 2>/dev/null | grep -o 'GLIBC_[0-9.]*' | sort -V | tail -1| cut -d _ -f2)
- dpkg --compare-versions "$build_host_glibc" eq $GLIBC_BASE
+ dpkg --compare-versions "$build_host_glibc" le $GLIBC_BASE
cat >skyscraper.desktop <
Date: Sat, 15 Aug 2026 15:33:04 +0200
Subject: [PATCH 10/14] Version 3.20.4
---
VERSION.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/VERSION.ini b/VERSION.ini
index 5ad8bef0..be373bf6 100644
--- a/VERSION.ini
+++ b/VERSION.ini
@@ -1 +1 @@
-VERSION="3.20.3"
+VERSION="3.20.4"
From 1e73a994265dfba9c04c39b901956f45501f2368 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 15 Aug 2026 15:47:36 +0200
Subject: [PATCH 11/14] Update appimage.yml
---
.github/workflows/appimage.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml
index 3deac0b2..001e392d 100644
--- a/.github/workflows/appimage.yml
+++ b/.github/workflows/appimage.yml
@@ -11,7 +11,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- os: [ubuntu-22.04-arm, ubuntu-22.04-arm]
+ os: [ubuntu-22.04, ubuntu-22.04-arm]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout sources
From b6dad2587044848898a175839f5191c92e5922e7 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 15 Aug 2026 18:04:02 +0200
Subject: [PATCH 12/14] revert some size optimizations
---
supplementary/workflows/appimage | 3 ---
1 file changed, 3 deletions(-)
diff --git a/supplementary/workflows/appimage b/supplementary/workflows/appimage
index 58cb8302..c75f972e 100644
--- a/supplementary/workflows/appimage
+++ b/supplementary/workflows/appimage
@@ -82,9 +82,6 @@ EOF
libaom.so
libdav1d.so
libgav1.so
- libicudata.so
- libicui18n.so
- libicuuc.so
libQt6PrintSupport.so
libQt6Widgets.so
librav1e.so
From 296e4d556a42ddc253d79ec0165c67ec7003e934 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Sat, 15 Aug 2026 18:51:10 +0200
Subject: [PATCH 13/14] idempotence set/unset of XDG build flag
---
supplementary/workflows/appimage | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/supplementary/workflows/appimage b/supplementary/workflows/appimage
index c75f972e..08f57173 100644
--- a/supplementary/workflows/appimage
+++ b/supplementary/workflows/appimage
@@ -26,8 +26,11 @@ function build_appimage() {
local _xdg="${1:-}"
make --ignore-errors distclean || true
#sed -i "0,/CONFIG += /{s/CONFIG.*/CONFIG += debug/}" skyscraper.pro
- [[ -n "$_xdg" ]] && sed -i "0,/.+DEFINES += XDG/{s/.*DEFINES/DEFINES/}" skyscraper.pro
- [[ -z "$_xdg" ]] && sed -i "0,/DEFINES += XDG/{s/.*DEFINES/#DEFINES/}" skyscraper.pro
+ #sed '/claudio/{s//claudia/;:p;n;bp}'
+ # set XDG
+ [[ -n "$_xdg" ]] && sed -i "/DEFINES += XDG/{s/#DEFINES/DEFINES/}" skyscraper.pro
+ # unset XDG
+ [[ -z "$_xdg" ]] && sed -i "/#*DEFINES += XDG/{s//#DEFINES += XDG/}" skyscraper.pro
PREFIX=/usr SYSCONFDIR=/etc qmake6 skyscraper.pro
jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null || sysctl -n hw.ncpu)
rm -rf "$app_dir" || true
From e93228954f3c860e2d896a507edae5fe2e6bb660 Mon Sep 17 00:00:00 2001
From: Gemba
Date: Thu, 10 Sep 2026 19:37:58 +0200
Subject: [PATCH 14/14] minor fixes and enhancements
- rename member function
- fixed mkdocs action
- fixed return codes on Ctrl-C
---
.github/workflows/mkdocs.yml | 2 +-
src/compositor.cpp | 4 ++--
src/compositor.h | 3 +--
src/main.cpp | 6 +++---
src/scraperworker.cpp | 2 +-
5 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml
index aab16229..7284c2f3 100644
--- a/.github/workflows/mkdocs.yml
+++ b/.github/workflows/mkdocs.yml
@@ -9,7 +9,7 @@ jobs:
deploy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@vmaster
+ - uses: actions/checkout@master
- uses: actions/setup-python@master
with:
python-version: 3.x
diff --git a/src/compositor.cpp b/src/compositor.cpp
index 477b9453..8c6fe209 100644
--- a/src/compositor.cpp
+++ b/src/compositor.cpp
@@ -294,7 +294,7 @@ GameEntry::Types Compositor::saveAll(GameEntry &game, QString completeBaseName,
bool esdeMiximage) {
bool createSubfolder = false;
QString fn = "/" % completeBaseName;
- QString subPath = getSubpath(game.path);
+ QString subPath = getMediaSubpath(game.path);
if (subPath != ".") {
fn.prepend("/" % subPath);
createSubfolder = true;
@@ -581,7 +581,7 @@ void Compositor::processChildLayers(GameEntry &game, Layer &layer) {
}
}
-QString Compositor::getSubpath(const QString &absPath) {
+QString Compositor::getMediaSubpath(const QString &absPath) {
QString subPath = ".";
if (config->frontend == "esde") {
// ES-DE expects media files in same subpath (tree structure) as
diff --git a/src/compositor.h b/src/compositor.h
index 441e8c04..8ea32854 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -42,8 +42,7 @@ class Compositor : public QObject {
void processXml();
GameEntry::Types saveAll(GameEntry &game, QString completeBaseName,
bool isEsde);
- // TODO: check, does member fit in here?
- QString getSubpath(const QString &absPath);
+ QString getMediaSubpath(const QString &absPath);
private:
void addChildLayers(Layer &layer, QXmlStreamReader &xml);
diff --git a/src/main.cpp b/src/main.cpp
index ff5b2848..c9ddc61a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -101,7 +101,7 @@ BOOL WINAPI ConsoleHandler(DWORD dwType) {
if (skyscraper != nullptr) {
if (skyscraper->state == Skyscraper::OpMode::SINGLE) {
// Nothing important going on, just exit
- exit(1);
+ exit(2);
} else if (skyscraper->state == Skyscraper::OpMode::NO_INTR) {
// Ignore signal, something important is going on
// that needs to finish!
@@ -119,12 +119,12 @@ BOOL WINAPI ConsoleHandler(DWORD dwType) {
skyscraper->queue->clearAll();
}
} else {
- exit(1);
+ exit(2);
}
} else {
ncprintf("\033[1;31mUser REALLY wants to quit NOW, forcing "
"unclean exit...\033[0m\n");
- exit(1);
+ exit(2);
}
}
#if defined(Q_OS_WIN)
diff --git a/src/scraperworker.cpp b/src/scraperworker.cpp
index 8ef8ce92..e7d5cf6e 100644
--- a/src/scraperworker.cpp
+++ b/src/scraperworker.cpp
@@ -335,7 +335,7 @@ void ScraperWorker::run() {
}
// copy extra media files (not part of compositor/artwork)
const QString baseName = info.completeBaseName();
- const QString subPath = compositor.getSubpath(game.path);
+ const QString subPath = compositor.getMediaSubpath(game.path);
frontend->copyMedia(mediaSaved, baseName, subPath, game);
}