ovdashboard/api/ovdashboard_api/dav_file.py

52 lines
1.2 KiB
Python
Raw Normal View History

2022-08-29 11:27:18 +00:00
import logging
2022-09-04 14:14:22 +00:00
from dataclasses import dataclass
2022-08-29 11:27:18 +00:00
from io import BytesIO
2022-09-04 17:12:01 +00:00
from typing import Any
2022-08-29 11:27:18 +00:00
2022-08-31 08:42:17 +00:00
from webdav3.client import Resource
2022-08-29 11:27:18 +00:00
2022-09-04 17:12:01 +00:00
from . import get_ttl_hash, run_in_executor, timed_alru_cache, webdav_resource
2022-08-29 11:27:18 +00:00
_logger = logging.getLogger(__name__)
2022-09-04 17:12:01 +00:00
@timed_alru_cache(maxsize=20)
async def _get_buffer(
remote_path: Any,
) -> BytesIO:
2022-09-04 17:29:11 +00:00
2022-09-03 15:40:46 +00:00
@run_in_executor
2022-09-04 17:29:11 +00:00
def _get_buffer_inner(resource: Resource) -> BytesIO:
_logger.info(f"updating {resource}")
print(f"updating {resource}")
buffer = BytesIO()
resource.write_to(buffer)
return buffer
2022-09-02 15:28:52 +00:00
resource = webdav_resource(remote_path)
2022-09-04 17:29:11 +00:00
return await _get_buffer_inner(resource)
2022-09-04 14:14:22 +00:00
@dataclass(frozen=True)
2022-08-29 11:27:18 +00:00
class DavFile:
2022-09-04 14:14:22 +00:00
remote_path: str
@property
async def __buffer(self) -> BytesIO:
return await _get_buffer(
2022-09-04 17:12:01 +00:00
ttl_hash=get_ttl_hash(),
2022-09-04 14:14:22 +00:00
remote_path=self.remote_path,
2022-08-31 01:29:44 +00:00
)
2022-08-29 11:27:18 +00:00
@property
async def bytes(self) -> bytes:
buffer = await self.__buffer
buffer.seek(0)
return buffer.read()
2022-08-29 11:27:18 +00:00
@property
async def string(self) -> str:
bytes = await self.bytes
return bytes.decode(encoding="utf-8")