Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot export file with mimetype PDF #83

Closed
montessoriforall opened this issue Dec 13, 2021 · 6 comments
Closed

Cannot export file with mimetype PDF #83

montessoriforall opened this issue Dec 13, 2021 · 6 comments
Labels
question Further information is requested

Comments

@montessoriforall
Copy link

Hello! Here is a simple GDoc. The following code should allow one to export said GDoc from GDrive:

file_id = "1Mu179wAYfOgRc4SEvO1KTOZt78a24USLGIj3FpbAwxQ"
drive_v3 = await aiogoogle.discover("drive", "v3")

# this works
mimetype = "text/html"
response = await aiogoogle.as_user(drive_v3.files.export(fileId=file_id, mimeType=mime_type))
# response is str of html file

# this fails
mimetype = "application/pdf"
response = await aiogoogle.as_user(drive_v3.files.export(fileId=file_id, mimeType=mime_type))
# raises error

However, the lower code -- attempting to export a GDoc as a PDF file -- raises an error: ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: application/pdf'

Here's the full error:

Traceback (most recent call last):
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 60, in resolve_response
    json = await response.json()
  File "reportcards/venv/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 1103, in json
    raise ContentTypeError(
aiohttp.client_exceptions.ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: application/pdf', url=URL('https://www.googleapis.com/drive/v3/files/1h5nHoJDqaYQyJu6MU28H7PS3ZYJ9gZ4kufgum46KgwY/export?mimeType=application/pdf')
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/contextlib.py", line 131, in __exit__
    self.gen.throw(type, value, traceback)
  File "Library/Application Support/JetBrains/PyCharmCE2021.3/plugins/evaluate-async-code/_pydevd_async_debug.py", line 116, in manage_run
    yield
  File "Library/Application Support/JetBrains/PyCharmCE2021.3/plugins/evaluate-async-code/_pydevd_async_debug.py", line 70, in run_until_complete
    return f.result()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/futures.py", line 178, in result
    raise self._exception
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/tasks.py", line 282, in __step
    result = coro.throw(exc)
  File "reportcards/_aiogoogle.py", line 50, in aiogDocExport
    response = await aiogoogle.as_user(drive_v3.files.export(fileId=file_id, mimeType=mime_type))
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/client.py", line 243, in as_user
    return await self.send(
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/client.py", line 387, in send
    return await self.active_session.send(*args, **kwargs)
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 172, in send
    results = await schedule_tasks()
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 164, in schedule_tasks
    return await asyncio.gather(*tasks, return_exceptions=False)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/tasks.py", line 349, in __wakeup
    future.result()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/asyncio/tasks.py", line 280, in __step
    result = coro.send(None)
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 150, in get_content
    response = await get_response(request)
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 144, in get_response
    response = await resolve_response(request, response)
  File "reportcards/venv/lib/python3.8/site-packages/aiogoogle/sessions/aiohttp_session.py", line 63, in resolve_response
    data = await response.text()
  File "reportcards/venv/lib/python3.8/site-packages/aiohttp/client_reqrep.py", line 1085, in text
    return self._body.decode(  # type: ignore[no-any-return,union-attr]
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 10: invalid continuation byte

Is there another way to export files from aiogoogle as PDF that I am unaware from?

@omarryhan
Copy link
Owner

Hey, yes, you need to specify the download_file argument, because without it, Aiogoogle assumes what you're fetching is JSON.

download_file="/home/foo/Downloads" will download the file in /home/foo/Downloads

@omarryhan omarryhan added the question Further information is requested label Dec 13, 2021
@montessoriforall
Copy link
Author

Hey Omar:

Thank you so much! This perfectly solves my problem, though I will protest that the error message is a bit cryptic. Thanks for your excellent work on this package! :)

@omarryhan
Copy link
Owner

Thank you @montessoriforall! :)
Agreed, it's a bit confusing. Maybe we can make it clearer in the docs how to download/upload files?

We currently only have examples e.g.: https://aiogoogle.readthedocs.io/en/latest/#download-a-file-from-google-drive.

Documenting the file upload & download feature outside of the examples section might be the correct thing to do.

@peyafaguerre
Copy link

Hey @omarryhan, how are you?
Is it possible to get the file (in my case is an image) and keep it in memory as an array of bytes for example?

I just tried to do it but Im keeping short :(

        async with aiogoogle:
            drive_v3 = await aiogoogle.discover('drive', 'v3')

            res = await aiogoogle.as_service_account(
                drive_v3.files.get(fileId=file_id, download_file='/image.png', alt='media')
            )  

I tested the sync way and it worked perfectly, but I would like to do the same async.

Thanks :)

@omarryhan
Copy link
Owner

Hey @peyafaguerre

Have you tried using the pipe_to parameter?

You can find some usage examples here #98

@peyafaguerre
Copy link

Thanks @omarryhan!
It works perfectly!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

3 participants