From 7352f6128a1bd52e863dea0cf8db6f53519e6c78 Mon Sep 17 00:00:00 2001 From: "joel@joellee.org" Date: Tue, 13 Dec 2022 18:45:02 +0530 Subject: [PATCH] fix: add transform options on public url and download --- storage3/_async/file_api.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/storage3/_async/file_api.py b/storage3/_async/file_api.py index ab4db266..04b2a304 100644 --- a/storage3/_async/file_api.py +++ b/storage3/_async/file_api.py @@ -1,4 +1,5 @@ from __future__ import annotations +import urllib.parse from dataclasses import dataclass, field from io import BufferedReader, FileIO @@ -8,7 +9,7 @@ from httpx import HTTPError, Response from ..constants import DEFAULT_FILE_OPTIONS, DEFAULT_SEARCH_OPTIONS -from ..types import BaseBucket, ListBucketFilesOptions, CreateSignedURLOptions, RequestMethod +from ..types import BaseBucket, ListBucketFilesOptions, CreateSignedURLOptions, TransformOptions, RequestMethod from ..utils import AsyncClient, StorageException __all__ = ["AsyncBucket"] @@ -75,15 +76,18 @@ async def create_signed_urls(self, paths: List[str], expires_in: int, options: d pass - async def get_public_url(self, path: str) -> str: + async def get_public_url(self, path: str, options: TransformOptions = {}) -> str: """ Parameters ---------- path file path, including the path and file name. For example `folder/image.png`. """ + render_path = 'render/image/authenticated' if options.get('transform') else 'object' + transformation_query = urllib.parse.urlencode(options) + query_string = f"?{transformation_query}" if transformation_query else '' _path = self._get_final_path(path) - return f"{self._client.base_url}object/public/{_path}" + return f"{self._client.base_url}{render_path}/public/{_path}/${query_string}" async def move(self, from_path: str, to_path: str) -> dict[str, str]: """ @@ -172,7 +176,7 @@ async def list( ) return response.json() - async def download(self, path: str) -> bytes: + async def download(self, path: str, options: TransformOptions={}) -> bytes: """ Downloads a file. @@ -181,10 +185,14 @@ async def download(self, path: str) -> bytes: path The file path to be downloaded, including the path and file name. For example `folder/image.png`. """ + render_path = 'render/image/authenticated' if options.get('transform') else 'object' + transformation_query = urllib.parse.urlencode(options) + query_string = f"?{transformation_query}" if transformation_query else '' + _path = self._get_final_path(path) response = await self._request( "GET", - f"/object/{_path}", + f"{render_path}/{_path}{query_string}", ) return response.content