diff --git a/videodb/_constants.py b/videodb/_constants.py index 9acfa22..173c825 100644 --- a/videodb/_constants.py +++ b/videodb/_constants.py @@ -1,4 +1,5 @@ """Constants used in the videodb package.""" + from typing import Union from dataclasses import dataclass diff --git a/videodb/audio.py b/videodb/audio.py index 1e2df60..21c250c 100644 --- a/videodb/audio.py +++ b/videodb/audio.py @@ -4,7 +4,17 @@ class Audio: - def __init__(self, _connection, id: str, collection_id: str, **kwargs) -> None: + """Audio class to interact with the Audio + + :ivar str id: Unique identifier for the audio + :ivar str collection_id: ID of the collection this audio belongs to + :ivar str name: Name of the audio file + :ivar float length: Duration of the audio in seconds + """ + + def __init__( + self, _connection, id: str, collection_id: str, **kwargs + ) -> None: self._connection = _connection self.id = id self.collection_id = collection_id @@ -21,6 +31,12 @@ def __repr__(self) -> str: ) def generate_url(self) -> str: + """Generate the signed url of the audio. + + :raises InvalidRequestError: If the get_url fails + :return: The signed url of the audio + :rtype: str + """ url_data = self._connection.post( path=f"{ApiPath.audio}/{self.id}/{ApiPath.generate_url}", params={"collection_id": self.collection_id}, @@ -28,4 +44,10 @@ def generate_url(self) -> str: return url_data.get("signed_url", None) def delete(self) -> None: + """Delete the audio. + + :raises InvalidRequestError: If the delete fails + :return: None if the delete is successful + :rtype: None + """ self._connection.delete(f"{ApiPath.audio}/{self.id}") diff --git a/videodb/client.py b/videodb/client.py index 3fbee06..f47df97 100644 --- a/videodb/client.py +++ b/videodb/client.py @@ -24,13 +24,32 @@ class Connection(HttpClient): - def __init__(self, api_key: str, base_url: str) -> None: + """Connection class to interact with the VideoDB""" + + def __init__(self, api_key: str, base_url: str) -> "Connection": + """Initializes a new instance of the Connection class with specified API credentials. + + Note: Users should not initialize this class directly. + Instead use :meth:`videodb.connect() ` + + :param str api_key: API key for authentication + :param str base_url: Base URL of the VideoDB API + :raise ValueError: If the API key is not provided + :return: :class:`Connection ` object, to interact with the VideoDB + :rtype: :class:`videodb.client.Connection` + """ self.api_key = api_key self.base_url = base_url self.collection_id = "default" super().__init__(api_key=api_key, base_url=base_url, version=__version__) def get_collection(self, collection_id: Optional[str] = "default") -> Collection: + """Get a collection object by its ID. + + :param str collection_id: ID of the collection (optional, default: "default") + :return: :class:`Collection ` object + :rtype: :class:`videodb.collection.Collection` + """ collection_data = self.get(path=f"{ApiPath.collection}/{collection_id}") self.collection_id = collection_data.get("id", "default") return Collection( @@ -42,6 +61,11 @@ def get_collection(self, collection_id: Optional[str] = "default") -> Collection ) def get_collections(self) -> List[Collection]: + """Get a list of all collections. + + :return: List of :class:`Collection ` objects + :rtype: list[:class:`videodb.collection.Collection`] + """ collections_data = self.get(path=ApiPath.collection) return [ Collection( @@ -57,6 +81,14 @@ def get_collections(self) -> List[Collection]: def create_collection( self, name: str, description: str, is_public: bool = False ) -> Collection: + """Create a new collection. + + :param str name: Name of the collection + :param str description: Description of the collection + :param bool is_public: Make collection public (optional, default: False) + :return: :class:`Collection ` object + :rtype: :class:`videodb.collection.Collection` + """ collection_data = self.post( path=ApiPath.collection, data={ @@ -75,6 +107,14 @@ def create_collection( ) def update_collection(self, id: str, name: str, description: str) -> Collection: + """Update an existing collection. + + :param str id: ID of the collection + :param str name: Name of the collection + :param str description: Description of the collection + :return: :class:`Collection ` object + :rtype: :class:`videodb.collection.Collection` + """ collection_data = self.patch( path=f"{ApiPath.collection}/{id}", data={ @@ -92,12 +132,29 @@ def update_collection(self, id: str, name: str, description: str) -> Collection: ) def check_usage(self) -> dict: + """Check the usage. + + :return: Usage data + :rtype: dict + """ return self.get(path=f"{ApiPath.billing}/{ApiPath.usage}") def get_invoices(self) -> List[dict]: + """Get a list of all invoices. + + :return: List of invoices + :rtype: list[dict] + """ return self.get(path=f"{ApiPath.billing}/{ApiPath.invoices}") def download(self, stream_link: str, name: str) -> dict: + """Download a file from a stream link. + + :param stream_link: URL of the stream to download + :param name: Name to save the downloaded file as + :return: Download response data + :rtype: dict + """ return self.post( path=f"{ApiPath.download}", data={ @@ -115,6 +172,17 @@ def upload( description: Optional[str] = None, callback_url: Optional[str] = None, ) -> Union[Video, Audio, Image, None]: + """Upload a file. + + :param str file_path: Path to the file to upload (optional) + :param str url: URL of the file to upload (optional) + :param MediaType media_type: MediaType object (optional) + :param str name: Name of the file (optional) + :param str description: Description of the file (optional) + :param str callback_url: URL to receive the callback (optional) + :return: :class:`Video