nekitdev / gd.py

An API Wrapper for Geometry Dash written in Python.
https://nekitdev.github.io/gd.py
MIT License
121 stars 14 forks source link

Uncaught UnicodeDecodeError in search_levels #88

Closed QuasiStellar closed 9 months ago

QuasiStellar commented 11 months ago

Retrieve info about a level whose song contains characters that utf-8 can not decode results in an uncaught exception:

Traceback (most recent call last):
  File "/MyVenv/lib/python3.11/site-packages/IPython/core/interactiveshell.py", line 3526, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-2-6525e70c27b8>", line 1, in <module>
    runfile('/MyCodebase/main.py', wdir='/MyCodebase')
  File "/MyPyCharm/Contents/plugins/python/helpers/pydev/_pydev_bundle/pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/MyPyCharm/Contents/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "/MyCodebase/main.py", line 12, in <module>
    asyncio.run(main())
  File "/MyVenv/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/MyCodebase/main.py", line 8, in main
    async for result in levels:
  File "/MyVenv/lib/python3.11/site-packages/iters/async_iters.py", line 984, in __anext__
    return await async_next_unchecked(self.iterator)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/site-packages/iters/async_utils.py", line 669, in async_next_unchecked
    return await standard_async_next(iterator)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/site-packages/async_extensions/standard.py", line 36, in async_next
    return await async_iterator.__anext__()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/run_iterables.py", line 29, in run_iterables
    raise error
  File "/MyVenv/lib/python3.11/site-packages/async_extensions/collect.py", line 36, in append_tagged_result
    result = Ok(await awaitable)
                ^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/site-packages/iters/async_utils.py", line 549, in async_list
    return [item async for item in async_iter(iterable)]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/site-packages/iters/async_utils.py", line 549, in <listcomp>
    return [item async for item in async_iter(iterable)]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/client.py", line 715, in search_levels_on_page
    response_model = await self.session.search_levels_on_page(
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/session.py", line 264, in search_levels_on_page
    response = await self.http.search_levels_on_page(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/http.py", line 1337, in search_levels_on_page
    response = await self.request_route(route, data=payload, error_codes=error_codes)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/http.py", line 696, in request_route
    return await self.request(  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/GdPyCodebase/gd/http.py", line 825, in request
    response_data = await response.text()
                    ^^^^^^^^^^^^^^^^^^^^^
  File "/MyVenv/lib/python3.11/site-packages/aiohttp/client_reqrep.py", line 1148, in text
    return self._body.decode(  # type: ignore[no-any-return,union-attr]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xab in position 3625: invalid start byte

GD just ignores the error and displays an empty string. image

nekitdev commented 9 months ago

This has been resolved on the v2 branch.

You can now set GD_ENCODING_ERRORS environment variable.

nekit@nitro:~/projects/gd.py$ GD_ENCODING_ERRORS=ignore poetry run python
>>> import gd
>>> client = gd.Client()
>>> query = gd.query("Secrets")
>>> await client.search_levels_on_page(query)
[...]