"""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.""" ...