File: make-runtime-scummvm-data.py

package info (click to toggle)
game-data-packager 87
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid
  • size: 33,392 kB
  • sloc: python: 15,387; sh: 704; ansic: 95; makefile: 50
file content (115 lines) | stat: -rw-r--r-- 3,749 bytes parent folder | download | duplicates (2)
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:])