Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config.ini.example
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
;frontend="emulationstation"
;emulator=""
;launch=""
;fanarts="false"
;manuals="false"
;videos="false"
;videoSizeLimit="42"
Expand Down
8 changes: 8 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ humans](https://keepachangelog.com).

### Version 3.18.0 (2025-TBA)

- Added: Support for [Batocera gamelists](FRONTENDS.md#batocera) incl. fanart
output
- Added: Support for fanart gamelist output for some [EmulationStation
variants](CONFIGINI.md#gamelistvariants)
- Added: Fanart scraping with Screenscraper-, TGDB- and Import-scraper. See flag
and config option [`fanarts`](CLIHELP.md#fanarts)
- Added: Allow more relaxed extension syntax in config options. In addition to
`'*.ext'` also allow `'.ext'` and `'ext'`
- Added: Accept also singular for media flags, e.g. `--flags video` additionally
to `--flags videos`. However, in the config file accept only plural as before.
- Updated: macOS installation instructions to use Qt6
- Updated: Docker uses Ubuntu 24.04 and Qt6
- Updated: Documentation, added usage level for configuration options. See
Expand Down
6 changes: 3 additions & 3 deletions docs/CLIHELP.md
Original file line number Diff line number Diff line change
Expand Up @@ -448,9 +448,9 @@ From Skyscraper 3.5.0 all command-line options that change the scraping behaviou

To enable multiple flags separate them by commas (eg. `--flags FLAG1,FLAG2`) or apply `--flags` option multiple times.

#### fanart
#### fanarts

By default Skyscraper doesn't scrape and cache game fanart resources because not all scraping sites provide this data and also only some frontends support fanart display. You can enable it by using this flag. Consider setting this in [`config.ini`](CONFIGINI.md#fanart) instead.
By default Skyscraper doesn't scrape and cache game fanart resources because not all scraping sites provide this data and also only some frontends support fanart display. You can enable it by using this flag. Consider setting this in [`config.ini`](CONFIGINI.md#fanarts) instead.

#### forcefilename

Expand Down Expand Up @@ -544,7 +544,7 @@ Only relevant when generating an EmulationStation, a Retrobat or a Pegasus game

When generating gamelists, skip processing covers that already exist in the media output folder.

#### skipexistingfanart
#### skipexistingfanarts

When generating gamelists, skip copying fanart files that already exist in the media output folder.

Expand Down
4 changes: 2 additions & 2 deletions docs/CONFIGINI.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ This is an alphabetical index of all configuration options their usage level and
| [excludeFrom](CONFIGINI.md#excludefrom) | Advanced | Y | Y | | |
| [excludePattern](CONFIGINI.md#excludepattern) | Advanced | Y | Y | Y | |
| [extensions](CONFIGINI.md#extensions) | Expert | | Y | | |
| [fanart](CONFIGINI.md#fanart) | Basic | Y | | | |
| [fanarts](CONFIGINI.md#fanarts) | Basic | Y | | | |
| [forceFilename](CONFIGINI.md#forcefilename) | Advanced | Y | Y | Y | |
| [frontend](CONFIGINI.md#frontend) | Basic | Y | | | |
| [gameBaseFile](CONFIGINI.md#gamebasefile) | Expert | | Y | | |
Expand Down Expand Up @@ -1069,7 +1069,7 @@ Allowed in sections: Only for frontends `[emulationstation]`, `[esde]` or `[retr

---

#### fanart
#### fanarts

By default Skyscraper doesn't scrape and cache game fanart resources because not
all scraping sites provide this data and also only some frontends support fanart
Expand Down
4 changes: 2 additions & 2 deletions docs/FRONTENDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ the textual scraping elements are still the same. Most notably Batocera
EmulationStation stores a lot of additional information in the gamelist, and the
set of information may differ for each game.
Skyscraper aims to cover the most frequent used elements for scraping, currently
fanart, manuals and videos. See the [scraping
fanarts, manuals and videos. See the [scraping
modules](SCRAPINGMODULES.md#capabilities-of-scrapers) for support of these
mediafiles.

Expand Down Expand Up @@ -185,7 +185,7 @@ Windows desktop users can use SMB shares and can adapt the following steps.
3. Then run on your Desktop system to scrape data from screenscraper and put it
into the Skyscraper cache on your Desktop system:
```bash
Skyscraper -s screenscraper -p snes --flags fanart,manuals,videos -i "$(pwd)"
Skyscraper -s screenscraper -p snes --flags fanarts,manuals,videos -i "$(pwd)"
-g "$(pwd)" -o "$(pwd)"
```
You can also set the values for [input-](CONFIGINI.md#inputfolder) (`-i`),
Expand Down
4 changes: 2 additions & 2 deletions docs/IMPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ The following describes how to import your own custom textual, artwork and / or

Be sure to also check the [`--cache edit` option](CLIHELP.md#-cache-editnewtype).

### Images, Videos, Fanart and Game Manuals
### Images, Videos, Fanarts and Game Manuals

To import videos or images into the resource cache, use the following procedure:

- Name your image or video file with the _exact_ base name of the rom you wish to connect it to. Example: `Bubble Bobble.nes` will import images with a filename of `Bubble Bobble.jpg` or `Bubble Bobble.png` or other well-known image formats. As long as the base name is an _exact_ match. Same goes for video files. I recommend only making use of well-known video formats since Skyscraper imports them directly without conversion (unless you [convert them](CONFIGINI.md#videoconvertcommand)), so they need to be supported directly by the frontend you plan to use.
- Game manuals are expected to use PDF format and have the extension `.pdf`. The base name must match the ROM file, thus the game manual of the example is `Bubble Bobble.pdf`.
- Place all of your images, fanart, videos or game manuals in the `/home/<USER>/.skyscraper/import/<PLATFORM>/screenshots`, `covers`, `wheels`, `marquees`, `fanarts`, `videos` or `manuals` folders.
- Place all of your images, fanarts, videos or game manuals in the `/home/<USER>/.skyscraper/import/<PLATFORM>/screenshots`, `covers`, `wheels`, `marquees`, `fanarts`, `videos` or `manuals` folders.
- Now run Skyscraper with `Skyscraper -p <PLATFORM> -s import`. If you named your files correctly, they will now be imported. Look for the green 'YES' in the output at the rom(s) you've placed files for. This will tell you if it succeeded or not.
- The data is now imported into the resource cache. To make use of it read the section [How to actually use the data?](#how-to-actually-use-the-data) below.

Expand Down
2 changes: 1 addition & 1 deletion src/batocera.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class Batocera : public EmulationStation {
private:
static QPair<QString, QString> getFilenameParams(QString k) {
QMap<QString, QPair<QString, QString>> cacheResFn = {
// "binary type in cache", <"-postfix", ".ext">
// key: "binary type in cache", value: <"-postfix", ".ext">
{"cover", QPair<QString, QString>("boxart", "jpg")},
{"fanart", QPair<QString, QString>("fanart", "jpg")},
{"manual", QPair<QString, QString>("manual", "pdf")},
Expand Down
6 changes: 3 additions & 3 deletions src/cli.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ void Cli::createParser(QCommandLineParser *parser, QString platforms) {
"The frontend you wish to generate a gamelist for. Remember to leave "
"out the '-s' option when using this in order to enable Skyscraper's "
"gamelist generation mode.\nCurrently supports 'emulationstation', "
"'esde', 'retrobat', 'attractmode' and 'pegasus'. Default: "
"'esde', 'batocera', 'retrobat', 'attractmode' and 'pegasus'. Default: "
"'emulationstation'",
"FRONTEND", "");
QCommandLineOption eOption(
Expand Down Expand Up @@ -419,7 +419,7 @@ QMap<QString, QString> Cli::getSubCommandOpts(const QString subCmd) {
{"skipexistingmanuals",
"When generating gamelists, skip processing manuals that already "
"exist in the media output folder."},
{"skipexistingfanart",
{"skipexistingfanarts",
"When generating gamelists, skip processing of fanart that "
"already exist in the media output folder."},
{"skipexistingmarquees",
Expand Down Expand Up @@ -465,7 +465,7 @@ QMap<QString, QString> Cli::getSubCommandOpts(const QString subCmd) {
{"manuals",
"Enables scraping and caching of manuals for the scraping modules "
"that support them."},
{"fanart",
{"fanarts",
"Enables scraping and caching of fanart for the scraping modules "
"that support them."},
};
Expand Down
3 changes: 2 additions & 1 deletion src/esgamelist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ void ESGameList::getGameData(GameEntry &game) {
loadVideoData(game, gameNode.firstChildElement("video").text());
}
if (config->fanart) {
loadVideoData(game, gameNode.firstChildElement("fanart").text());
game.fanartData =
loadBinaryData(gameNode.firstChildElement("fanart").text());
}
}

Expand Down
32 changes: 27 additions & 5 deletions src/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,7 @@ void RuntimeCfg::applyConfigIni(CfgType type, QSettings *settings,
config->manuals = v;
continue;
}
if (k == "fanart") {
if (k == "fanarts") {
config->fanart = v;
continue;
}
Expand Down Expand Up @@ -709,7 +709,7 @@ void RuntimeCfg::setFlag(const QString flag) {
config->skipExistingCovers = true;
} else if (flag == "skipexistingmanuals") {
config->skipExistingManuals = true;
} else if (flag == "skipexistingfanart") {
} else if (flag == "skipexistingfanarts") {
config->skipExistingFanart = true;
} else if (flag == "skipexistingmarquees") {
config->skipExistingMarquees = true;
Expand Down Expand Up @@ -737,7 +737,7 @@ void RuntimeCfg::setFlag(const QString flag) {
config->videos = true;
} else if (flag == "manuals") {
config->manuals = true;
} else if (flag == "fanart") {
} else if (flag == "fanarts") {
config->fanart = true;
} else if (flag == "notidydesc") {
config->tidyDesc = false;
Expand All @@ -761,14 +761,36 @@ QSet<QString> RuntimeCfg::getKeys(CfgType type) {
}

QStringList RuntimeCfg::parseFlags() {
QStringList _flags{};
QStringList retFlags;
if (parser->isSet("flags")) {
QStringList _flags;
QStringList flagsCli = parser->values("flags");
for (QString f : flagsCli) {
_flags << f.replace(" ", "").split(",");
}
// pluralize
QStringList plFlags = {"nocover",
"nomarquee",
"noscreenshot",
"notexture",
"nowheel",
"skipexistingcover",
"skipexistingmarquee",
"skipexistingscreenshot",
"skipexistingtexture",
"skipexistingwheel",
"skipexistingfanart",
"skipexistingvideo",
"skipexistingmanual",
"fanart",
"video",
"manual"};
for (QString f : _flags) {
retFlags << (plFlags.contains(f) ? f % "s" : f);
}
}
return _flags;
qDebug() << "Flags:" << retFlags;
return retFlags;
}

bool RuntimeCfg::validateFrontend(const QString &providedFrontend) {
Expand Down
2 changes: 1 addition & 1 deletion src/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ class RuntimeCfg : public QObject {
{"excludeFrom", QPair<QString, int>("str", CfgType::MAIN | CfgType::PLATFORM )},
{"excludePattern", QPair<QString, int>("str", CfgType::MAIN | CfgType::PLATFORM | CfgType::FRONTEND )},
{"extensions", QPair<QString, int>("str", CfgType::PLATFORM )},
{"fanart", QPair<QString, int>("bool", CfgType::MAIN )},
{"fanarts", QPair<QString, int>("bool", CfgType::MAIN )},
{"forceFilename", QPair<QString, int>("bool", CfgType::MAIN | CfgType::PLATFORM | CfgType::FRONTEND )},
{"frontend", QPair<QString, int>("str", CfgType::MAIN )},
{"gameBaseFile", QPair<QString, int>("str", CfgType::PLATFORM )},
Expand Down
Loading