40 lines
1.2 KiB
Python
Executable File
40 lines
1.2 KiB
Python
Executable File
"""Storage abstraction. Default impl is Nextcloud/WebDAV; swap for S3, local FS, etc."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Protocol
|
|
|
|
|
|
class FileMetadata:
|
|
def __init__(self, path: str, etag: str, size: int, content_type: str) -> None:
|
|
self.path = path
|
|
self.etag = etag
|
|
self.size = size
|
|
self.content_type = content_type
|
|
|
|
|
|
class StorageClient(Protocol):
|
|
async def create_folder(self, path: str) -> None:
|
|
"""Create a folder (and parents) at the given path."""
|
|
...
|
|
|
|
async def get_file_metadata(self, path: str) -> FileMetadata:
|
|
"""Return metadata for the file at path."""
|
|
...
|
|
|
|
async def list_folder(self, path: str) -> list[FileMetadata]:
|
|
"""List immediate children of the folder at path."""
|
|
...
|
|
|
|
async def download(self, path: str) -> bytes:
|
|
"""Download and return the raw bytes of the file at path."""
|
|
...
|
|
|
|
async def get_direct_url(self, path: str) -> str:
|
|
"""Return a URL for direct access to the file (used for HLS streaming)."""
|
|
...
|
|
|
|
async def delete(self, path: str) -> None:
|
|
"""Delete a file or folder at path."""
|
|
...
|