It seems that you're using an outdated browser. Some things may not work as they should (or don't work at all).
We suggest you upgrade newer and better browser like: Chrome, Firefox, Internet Explorer or Opera

×
avatar
KoЯni: I think that save_manifest function is missing dryrun as one of the arguments passed or its value shouldn't be checked in line 582.

Another bug: function save_manifest_core_worker cannot handle situation where gog-resume-manifest.dat doesn't exist yet and needs to be created, resulting in error "FileNotFoundError: [Errno 2] No such file or directory: 'gog-resume-manifest.dat'"
Please let me know if this: https://www.dropbox.com/scl/fi/svron3kuguuuy0xzelz7v/gogrepoc.py?rlkey=uf5xcay6rh7h3qv0j0126stq3&dl=0

Fixes the issues. I'll roll to main as a hotfix if it does.
avatar
KoЯni: I think that save_manifest function is missing dryrun as one of the arguments passed or its value shouldn't be checked in line 582.

Another bug: function save_manifest_core_worker cannot handle situation where gog-resume-manifest.dat doesn't exist yet and needs to be created, resulting in error "FileNotFoundError: [Errno 2] No such file or directory: 'gog-resume-manifest.dat'"
avatar
Kalanyr: Please let me know if this: https://www.dropbox.com/scl/fi/svron3kuguuuy0xzelz7v/gogrepoc.py?rlkey=uf5xcay6rh7h3qv0j0126stq3&dl=0

Fixes the issues. I'll roll to main as a hotfix if it does.
I ran into another error with this version and the one in master:
sudo python3 gogrepoc.py download -skipfiles *_demo_* *_demo/* *_prologue_* -skipos mac -lang en de -nolog
23:01:44 | loading token...
23:01:44 | loading local manifest...
23:01:49 | skipping files that match: {'*_demo_*', '*_demo/*', '*_prologue_*'}
23:01:49 | scanning manifest for renames...
23:01:49 | fatal...
Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 395, in __getattr__
return self[key]
~~~~^^^^^
KeyError: 'downloads'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 4252, in <module>
main(process_argv(sys.argv))
File "/mnt/z/GOG Repository/gogrepoc.py", line 4008, in main
cmd_download(args.savedir, args.skipextras, args.skipids, args.dryrun, args.ids,args.os,args.lang,args.skipgalaxy,args.skipstandalone,args.skipshared, args.skipfiles,args.covers,args.backgrounds,args.skippreallocation,not args.nocleanimages,args.downloadlimit)
File "/mnt/z/GOG Repository/gogrepoc.py", line 2506, in cmd_download
handle_game_renames(savedir,items,dryrun)
File "/mnt/z/GOG Repository/gogrepoc.py", line 868, in handle_game_renames
for item in game.downloads+game.galaxyDownloads+game.sharedDownloads+game.extras:
^^^^^^^^^^^^^^
File "/mnt/z/GOG Repository/gogrepoc.py", line 397, in __getattr__
raise AttributeError(key)
AttributeError: downloads
----
This happens after an succesful update with download and verify. Any ideas?
avatar
Kalanyr: Please let me know if this: https://www.dropbox.com/scl/fi/svron3kuguuuy0xzelz7v/gogrepoc.py?rlkey=uf5xcay6rh7h3qv0j0126stq3&amp;dl=0

Fixes the issues. I'll roll to main as a hotfix if it does.
avatar
chalice: I ran into another error with this version and the one in master:
sudo python3 gogrepoc.py download -skipfiles *_demo_* *_demo/* *_prologue_* -skipos mac -lang en de -nolog
23:01:44 | loading token...
23:01:44 | loading local manifest...
23:01:49 | skipping files that match: {'*_demo_*', '*_demo/*', '*_prologue_*'}
23:01:49 | scanning manifest for renames...
23:01:49 | fatal...
Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 395, in __getattr__
return self[key]
~~~~^^^^^
KeyError: 'downloads'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 4252, in <module>
main(process_argv(sys.argv))
File "/mnt/z/GOG Repository/gogrepoc.py", line 4008, in main
cmd_download(args.savedir, args.skipextras, args.skipids, args.dryrun, args.ids,args.os,args.lang,args.skipgalaxy,args.skipstandalone,args.skipshared, args.skipfiles,args.covers,args.backgrounds,args.skippreallocation,not args.nocleanimages,args.downloadlimit)
File "/mnt/z/GOG Repository/gogrepoc.py", line 2506, in cmd_download
handle_game_renames(savedir,items,dryrun)
File "/mnt/z/GOG Repository/gogrepoc.py", line 868, in handle_game_renames
for item in game.downloads+game.galaxyDownloads+game.sharedDownloads+game.extras:
^^^^^^^^^^^^^^
File "/mnt/z/GOG Repository/gogrepoc.py", line 397, in __getattr__
raise AttributeError(key)
AttributeError: downloads
----
This happens after an succesful update with download and verify. Any ideas?
You have a game item without a downloads entry present, which I don't think should be possible under normal circumstances. Could you email your manifest to my user name @gmail.com please ?
avatar
chalice: I ran into another error with this version and the one in master:
sudo python3 gogrepoc.py download -skipfiles *_demo_* *_demo/* *_prologue_* -skipos mac -lang en de -nolog
23:01:44 | loading token...
23:01:44 | loading local manifest...
23:01:49 | skipping files that match: {'*_demo_*', '*_demo/*', '*_prologue_*'}
23:01:49 | scanning manifest for renames...
23:01:49 | fatal...
Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 395, in __getattr__
return self[key]
~~~~^^^^^
KeyError: 'downloads'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/mnt/z/GOG Repository/gogrepoc.py", line 4252, in <module>
main(process_argv(sys.argv))
File "/mnt/z/GOG Repository/gogrepoc.py", line 4008, in main
cmd_download(args.savedir, args.skipextras, args.skipids, args.dryrun, args.ids,args.os,args.lang,args.skipgalaxy,args.skipstandalone,args.skipshared, args.skipfiles,args.covers,args.backgrounds,args.skippreallocation,not args.nocleanimages,args.downloadlimit)
File "/mnt/z/GOG Repository/gogrepoc.py", line 2506, in cmd_download
handle_game_renames(savedir,items,dryrun)
File "/mnt/z/GOG Repository/gogrepoc.py", line 868, in handle_game_renames
for item in game.downloads+game.galaxyDownloads+game.sharedDownloads+game.extras:
^^^^^^^^^^^^^^
File "/mnt/z/GOG Repository/gogrepoc.py", line 397, in __getattr__
raise AttributeError(key)
AttributeError: downloads
----
This happens after an succesful update with download and verify. Any ideas?
avatar
Kalanyr: You have a game item without a downloads entry present, which I don't think should be possible under normal circumstances. Could you email your manifest to my user name @gmail.com please ?
Found the culprit, A Bird Story is empty:

'_long_title_mirror': 'A Bird Story',
'_title_mirror': 'a_bird_story',
'availability': {'isAvailable': True, 'isAvailableInAccount': True},
'category': 'Abenteuer',
'dlcCount': 0,
'extraInfo': [],
'folder_name': 'a_bird_story',
'galaxyDownloads': [],
'genre': 'Abenteuer',
'gog_data': {'title': 'A Bird Story'},
'has_updates': False,
'id': 1207666783,
'image': '//images-4.gog-statics.com/e0d58db9850a43fe73b057a13f0ea2d5f8be7f996d6a3f2a4a81647758a3bcaf',
'image_url': '//images-4.gog-statics.com/e0d58db9850a43fe73b057a13f0ea2d5f8be7f996d6a3f2a4a81647758a3bcaf',
'isBaseProductMissing': False,
'isComingSoon': False,
'isGalaxyCompatible': True,
'isGame': True,
'isHidden': False,
'isHidingDisabled': False,
'isInDevelopment': False,
'isMovie': False,
'isNew': False,
'long_title': 'A Bird Story',
'media_type': '1',
'old_title': None,
'rating': 36,
'releaseDate': {'date': '2014-11-07 00:00:00.000000', 'timezone': 'Europe/Nicosia', 'timezone_type': 3},
'sharedDownloads': [],
'slug': 'a_bird_story',
'store_url': '/de/game/a_bird_story',
'tags': ['158160074'],
'title': 'a_bird_story',
'updates': 0,
'url': '/de/game/a_bird_story',
'worksOn': {'Linux': True, 'Mac': True, 'Windows': True}},
{'_id_mirror': 1207659150,

Deleted the entry and ran update again. Fixed. Thanks a lot!
Post edited March 27, 2025 by chalice
i've been trying to get this running on my new machine, and keep hitting new walls. This last one I can't seem to overcome with just general searching

Python is version 3.x up to date as of last night (I forget the actual number, but it was whichever was a stable download).
I think I have the required extra packages I need (html5lib, requests, pyutil, dateutil, pytz, and html2text).

I also had the no such file errors that the above posters seemed to have, but I tried just making a dummy *.dat file for both manifest and resume manifest before I read through this thread, and that seemed to work.

Now I'm getting the following error

(I feel like I'm missing something stupidly obvious, but meh)

(insert file location here)> python.exe gogrepoc.py update -os windows -lang en
19:48:17 | loading local manifest...
19:48:17 | fatal...
Traceback (most recent call last):
File "D:\GOGBackup\gogrepoc.py", line 4251, in <module>
main(process_argv(sys.argv))
~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\GOGBackup\gogrepoc.py", line 3984, in main
cmd_update(args.os, args.lang, args.skipknown, args.updateonly, not args.full, args.ids, args.skipids,args.skiphidden,args.installers,args.resumemode,args.strictverify,args.strictdupe,args.lenientdow nloadsupdate,args.strictextrasupdate,args.md5xmls,args.nochangelogs)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\GOGBackup\gogrepoc.py", line 1905, in cmd_update
gamesdb = load_manifest()
File "D:\GOGBackup\gogrepoc.py", line 555, in load_manifest
db = eval(ad)
File "<string>", line 0
Post edited March 30, 2025 by molerat
avatar
molerat: i've been trying to get this running on my new machine, and keep hitting new walls. This last one I can't seem to overcome with just general searching

Python is version 3.x up to date as of last night (I forget the actual number, but it was whichever was a stable download).
I think I have the required extra packages I need (html5lib, requests, pyutil, dateutil, pytz, and html2text).

I also had the no such file errors that the above posters seemed to have, but I tried just making a dummy *.dat file for both manifest and resume manifest before I read through this thread, and that seemed to work.

Now I'm getting the following error

(I feel like I'm missing something stupidly obvious, but meh)

(insert file location here)> python.exe gogrepoc.py update -os windows -lang en
19:48:17 | loading local manifest...
19:48:17 | fatal...
Traceback (most recent call last):
File "D:\GOGBackup\gogrepoc.py", line 4251, in <module>
main(process_argv(sys.argv))
~~~~^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\GOGBackup\gogrepoc.py", line 3984, in main
cmd_update(args.os, args.lang, args.skipknown, args.updateonly, not args.full, args.ids, args.skipids,args.skiphidden,args.installers,args.resumemode,args.strictverify,args.strictdupe,args.lenientdow nloadsupdate,args.strictextrasupdate,args.md5xmls,args.nochangelogs)
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "D:\GOGBackup\gogrepoc.py", line 1905, in cmd_update
gamesdb = load_manifest()
File "D:\GOGBackup\gogrepoc.py", line 555, in load_manifest
db = eval(ad)
File "<string>", line 0
At a guess it looks like your manifest is corrupted, try renaming moving gog-manifest.dat somewhere else and rerunning.
Hello,

I'm using an older Debain here with Python 2.7.16.

When building the repository for the 1st time, I got an error message, because the file "gog-resume-manifest.dat" didn't exist yet. Creating an empty file with that name solved this. However, the same error occured later on when it was trying to write to "gog-manifest.dat" for the 1st time; the same approach did not work here: it failed immediately because it was now trying to interpret the current contents of that file before doing anything else, of course failing due to the file being empty. I could solve this as well by removing the empty file, starting the programme again, and re-creating the file quickly while the script was fetching data from GOG.

Expected behaviour: the script should create those files on its own whenever they are missing.

Another problem:

There's no "systemd" here, thus I had to comment out all "wakelock" calls at the end of the script, with those being present it complains:
--8<---------------------------------------------
15:28:59 | Could not initialise the systemd session inhibitor: QDBusReply value is invalid
15:28:59 | fatal...
Traceback (most recent call last):
File "/usr/local/src/games/gogrepoc/gogrepoc.py", line 4250, in <module>
wakelock.take_wakelock()
File "/usr/local/src/games/gogrepoc/gogrepoc.py", line 4162, in take_wakelock
self.inhibitor.inhibit()
AttributeError: 'NoneType' object has no attribute 'inhibit'
--8<---------------------------------------------

Regards, and thank you for the script, Christoph
Hello,

another issue:

You should add a "shebang" line as the first line of the script:

--8<---------------------------
#!/usr/bin/env python
--8<---------------------------

Without this, it is interpreted by the current shell when called directly as:

/path/to/gogrepoc.py

instead of:

python /path/to/gogrepoc.py

This resulted in the creation of various files in the current directory here,
named after words occuring in the script.

Explanation: it started "import" from the Imagemagick package,
which is a programme to record screen captures from X server windows.

Unix like systems will NOT use an application "connected" to the file extension,
this behaviour is Windows-only.

Linux will try to determine the file type by looking at its contents at the start of the file,
regardless of any "extension", which is just seen as part of the name, nothing special.

In this special case, it guesses wrong:
--8<---------------------------
file /usr/local/src/games/gogrepoc/gogrepoc.py
/usr/local/src/games/gogrepoc/gogrepoc.py: Objective-C source, ASCII text, with very long lines
--8<---------------------------

The "shebang" instructs it to use the correct interpreter.
avatar
ChFra: Hello,

I'm using an older Debain here with Python 2.7.16.

When building the repository for the 1st time, I got an error message, because the file "gog-resume-manifest.dat" didn't exist yet. Creating an empty file with that name solved this. However, the same error occured later on when it was trying to write to "gog-manifest.dat" for the 1st time; the same approach did not work here: it failed immediately because it was now trying to interpret the current contents of that file before doing anything else, of course failing due to the file being empty. I could solve this as well by removing the empty file, starting the programme again, and re-creating the file quickly while the script was fetching data from GOG.

Expected behaviour: the script should create those files on its own whenever they are missing.

Another problem:

There's no "systemd" here, thus I had to comment out all "wakelock" calls at the end of the script, with those being present it complains:
--8<---------------------------------------------
15:28:59 | Could not initialise the systemd session inhibitor: QDBusReply value is invalid
15:28:59 | fatal...
Traceback (most recent call last):
File "/usr/local/src/games/gogrepoc/gogrepoc.py", line 4250, in <module>
wakelock.take_wakelock()
File "/usr/local/src/games/gogrepoc/gogrepoc.py", line 4162, in take_wakelock
self.inhibitor.inhibit()
AttributeError: 'NoneType' object has no attribute 'inhibit'
--8<---------------------------------------------

Regards, and thank you for the script, Christoph
The gog-manifest not existing has been reported and I have a preliminary fix but I'm waiting to hear back from the reporter about if it works, if you'd like to try the fix: https://www.dropbox.com/scl/fi/svron3kuguuuy0xzelz7v/gogrepoc.py?rlkey=uf5xcay6rh7h3qv0j0126stq3&amp;dl=0

Let me know if it works.

Regarding the wakelock, you're not kidding about using an older version of Debian (the current LTS release is 3 versions newer than the one where systemd became the default) , I'll wrap the wakelock so that it doesn't crash in the case that systemd doesn't exist.
avatar
ChFra: Hello,

another issue:

You should add a "shebang" line as the first line of the script:

--8<---------------------------
#!/usr/bin/env python
--8<---------------------------

Without this, it is interpreted by the current shell when called directly as:

/path/to/gogrepoc.py

instead of:

python /path/to/gogrepoc.py

This resulted in the creation of various files in the current directory here,
named after words occuring in the script.

Explanation: it started "import" from the Imagemagick package,
which is a programme to record screen captures from X server windows.

Unix like systems will NOT use an application "connected" to the file extension,
this behaviour is Windows-only.

Linux will try to determine the file type by looking at its contents at the start of the file,
regardless of any "extension", which is just seen as part of the name, nothing special.

In this special case, it guesses wrong:
--8<---------------------------
file /usr/local/src/games/gogrepoc/gogrepoc.py
/usr/local/src/games/gogrepoc/gogrepoc.py: Objective-C source, ASCII text, with very long lines
--8<---------------------------

The "shebang" instructs it to use the correct interpreter.
This is not possible, starting the file with a shebang interferes with the mechanism for python version selection on Windows. *hmm* I wonder if there's someway I can have the file error out if it's executed as a shell script that doesn't interfere with Python behaviour.
Post edited March 30, 2025 by Kalanyr
avatar
Kalanyr: The gog-manifest not existing has been reported
Sorry for not checking the issues first, my software being old also results in Github's web interface failing.
avatar
Kalanyr: and I have a preliminary fix but I'm waiting to hear back from the reporter about if it works, if you'd like to try the fix:
[…]
Let me know if it works.
Works perfectly, I moved all manifest files out of the way, and called "python gogrepoc.py update" again: new files have been written. The only change I had to make before was commenting out the 3 "wakelock" lines and adding "sys.exit(1)" in place of the last (don't know much about python, so didn't test if "finally" can be safely removed).
avatar
Kalanyr: Regarding the wakelock, you're not kidding about using an older version of Debian (the current LTS release is 3 versions newer than the one where systemd became the default) , I'll wrap the wakelock so that it doesn't crash in the case that systemd doesn't exist.
Sure, I reported this nonetheless, because there are distributions without systemd out there, for desktop machines most notably Devuan, which is essentially Debian with systemd removed.
avatar
ChFra: You should add a "shebang" line as the first line of the script:

--8<---------------------------
#!/usr/bin/env python
--8<---------------------------
avatar
Kalanyr: This is not possible, starting the file with a shebang interferes with the mechanism for python version selection on Windows. *hmm* I wonder if there's someway I can have the file error out if it's executed as a shell script that doesn't interfere with Python behaviour.
Well, I can tell you exactly what it does (LANG=de_DE.UTF-8):
--8<---------------------------
from: too many arguments
from: too many arguments
from: too many arguments
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 7: __appname__: Kommando nicht gefunden.
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 8: __author__: Kommando nicht gefunden.
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 9: __version__: Kommando nicht gefunden.
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 10: __url__: Kommando nicht gefunden.
from: too many arguments
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 44: minPy2: Kommando nicht gefunden.
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 45: minPy3: Kommando nicht gefunden.
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 49: Syntaxfehler beim unerwarteten Symbol »"Your Python version is not supported, please update to 2.7+"«
/usr/local/src/games/gogrepoc/gogrepoc.py: Zeile 49: ` print("Your Python version is not supported, please update to 2.7+" )'
--8<---------------------------

Comments # are ignored by the shell, the lines beginning with "from" as the first word give "too many arguments", the other lines result in "command not found" errors, because no executable files or shell aliases of those names exist. Those errors are non-fatal, the shell keeps executing.

If Imagemagick or Graphicsmagick are installed, however, /usr/bin/import exists and interprets the to-be-imported functions as file names to write an image to, in the current directory where the script is called from. "import" changes the mouse cursor into some cross-hair style thing, whenever you select something on-screen, a file with the selected screen contents is written, and the next instance of "import" ist started with the next name until it reaches the "if" statement.

On Bourne/Korn style shells, which are the default almost everywhere, the "if" statement requires a "then" on the next line, or after a ";" behind the "test statement". This missing "then" causes a fatal error, the shell exits out of the script.

I'm not a python programmer, so don't know if that's possible, but having a "fake if" doing effectively nothing in python right at the beginning of the file would cause any "normal" shell to quit with a fatal error.
An


if False:
pass


You'll need to indent the pass by 4 spaces , I forgot the GOG forums don't have a code block.

might work then , could you try and insert that at the beginning and see if it aborts the shell script exection and that Python still executes ?
Post edited March 31, 2025 by Kalanyr
avatar
Kalanyr: if False:
pass
Works well!
Must be inserted below of the 3 "from" lines, if I put it on the second line, python complains about a syntax error.

Called as a shell script:
---8<--------------------------------
$ LANG=C /usr/local/games/gogrepoc.py
---8<--------------------------------
/usr/local/games/gogrepoc.py: line 2: $'\r': command not found
from: too many arguments
from: too many arguments
from: too many arguments
/usr/local/games/gogrepoc.py: line 6: $'\r': command not found
/usr/local/games/gogrepoc.py: line 52: syntax error near unexpected token `"Your Python version is not supported, please update to 2.7+"'
'usr/local/games/gogrepoc.py: line 52: ` print("Your Python version is not supported, please update to 2.7+" )
---8<--------------------------------

As you can see, the error messages are really misleading. I'm convinced that this can be improved. I'm thinking about inserting a second if statement directly below yours, doing nothing in python, while tricking the shell into printing out a useful text instructing the user to call it as "python gogrepoc.py". I'm intending to experiment a bit. The goal is to move the "unexpected token" to the beginning of the file, which is skipped by the python interpreter.
I suggest the following change:
---------8<---------------------------------------------------------
# -*- coding: utf-8 -*-

from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals

# The following code block between #START# and #END#
# generates an error message if this script is called as a shell script.
# Using a "shebang" instead would fail on Windows.
#START#
if False:
print("Please start this script with a python interpreter: python /path/to/gogrepoc.py")
#END#

__appname__ = 'gogrepoc.py'
__author__ = 'eddie3,kalaynr'
__version__ = '0.4.0-a.CHF'
__url__ = 'https://github.com/kalanyr/gogrepoc'

# imports
---------8<---------------------------------------------------------

Output when called from the Ash shell:
---------8<---------------------------------------------------------
/usr/local/games/gogrepoc.py: line 2: $'\r': command not found
from: too many arguments
from: too many arguments
from: too many arguments
/usr/local/games/gogrepoc.py: line 6: $'\r': command not found
/usr/local/games/gogrepoc.py: line 12: syntax error near unexpected token `"Please start this script with a python interpreter: python /path/to/gogrepoc.py"'
'usr/local/games/gogrepoc.py: line 12: ` print("Please start this script with a python interpreter: python /path/to/gogrepoc.py")
---------8<---------------------------------------------------------

Output when called as:
python gogrepoc.py update -standard
---------8<---------------------------------------------------------
06:08:44 | loading local manifest...
06:08:47 | loading token...
06:08:47 | loading local resume manifest...
06:08:47 | fetching game product data (page 1)...
06:08:47 | refreshing token
06:08:47 | saving token...
06:08:47 | saved token
06:08:47 | refreshed token
06:08:48 | fetching game product data (page 2 / 4)...
06:08:48 | fetching game product data (page 3 / 4)...
06:08:49 | fetching game product data (page 4 / 4)...
06:08:49 | no new game or updates found.
06:08:49 | --
06:08:49 | total time: 0:00:05.862839
06:08:49 | exiting...
---------8<---------------------------------------------------------
Couldn't the script just check if python is installed? Like in windows:
python --version 3>NUL

Also, remember you can shorten it to: py
Just for the sake of consistency does your suggestion still work if it's altered too:

if False:
#Please start this script with a python interpreter: python /path/to/gogrepoc.py
pass

It just feels cleaner to avoid having a functional python call inside a code path that's explicitly not to be executed.