1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
#!/usr/bin/python3
# encoding=utf-8
#
# Copyright © 2024 Sébastien Noel
# SPDX-License-Identifier: GPL-2.0-or-later
import configparser
import json
import os
import sys
import zipfile
from contextlib import suppress
from typing import Any
from game_data_packager.data import Package
from game_data_packager.game import load_games
from game_data_packager.games.scummvm_common import ScummvmGameData
from game_data_packager.packaging import (
PackagingSystem,
get_native_packaging_system,
)
from game_data_packager.util import mkdir_p
def write_desktop_file(
pgm: str,
game: ScummvmGameData,
package: Package,
packaging: PackagingSystem,
desktop_subdir: str,
) -> None:
gdp_launcher = '$assets/game-data-packager-runtime/gdp-launcher'
gdp_launcher = packaging.substitute(gdp_launcher, package.name)
desktop = configparser.RawConfigParser()
desktop.optionxform = lambda option: option # type: ignore
desktop['Desktop Entry'] = {}
entry = desktop['Desktop Entry']
entry['Name'] = package.longname or game.longname
assert type(game.genre) is str
entry['GenericName'] = game.genre + ' Game'
entry['TryExec'] = 'scummvm'
entry['Exec'] = '%s --id %s' % (gdp_launcher, pgm)
entry['Icon'] = pgm
entry['Terminal'] = 'false'
entry['Type'] = 'Application'
entry['Categories'] = (
'Game;%sGame;' % game.genre.replace(' ', '')
)
with open(
os.path.join(desktop_subdir, '%s.desktop' % pgm),
'w', encoding='utf-8',
) as output:
desktop.write(output, space_around_delimiters=False)
def main(vfs_zip: str, outfile: str, desktop_subdir: str) -> None:
with suppress(FileNotFoundError):
os.unlink(outfile)
mkdir_p(desktop_subdir)
packaging = get_native_packaging_system()
games = load_games(use_vfs=vfs_zip)
with zipfile.ZipFile(outfile, mode="w") as archive:
for g_name, game in games.items():
if not isinstance(game, ScummvmGameData):
continue
for p_name, package in game.packages.items():
if package.section != 'games':
continue
if package.data_type != 'data':
continue
if package.name.endswith('-music'):
continue
if package.name.endswith('-video'):
continue
assert package.name.endswith('-data'), package.name
pgm = package.name[0:len(package.name)-len('-data')]
write_desktop_file(pgm, game, package,
packaging, desktop_subdir)
gameid = game.gameid
if package.gameid is not None:
gameid = package.gameid
langs = package.langs
launcher_path = 'launch-%s.json' % pgm
launcher: dict[str, Any] = {}
launcher['argv'] = 'scummvm -p %s %s' % \
(package.install_to, gameid)
launcher['argv'] = packaging.substitute(
launcher['argv'],
package.name,
)
if len(langs) > 1 and gameid != 'nippon':
launcher['languages'] = {'choices': langs, 'arg': '-q'}
info = zipfile.ZipInfo(launcher_path)
archive.writestr(
info,
json.dumps(launcher),
compress_type=zipfile.ZIP_DEFLATED,
compresslevel=9,
)
if __name__ == '__main__':
main(*sys.argv[1:])
|