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); }