Official Python SDK for myCloud - your personal cloud storage
Project description
myCloud Python SDK
The official Python SDK for myCloud by mySphere. This SDK provides a robust, fully-featured, and type-safe interface to interact with your myCloud storage, including both synchronous and highly concurrent asynchronous APIs.
Features
- Dual API: Both blocking (
MyCloud) and non-blocking (AsyncMyCloud) clients available out of the box. - Zero-Configuration: Automatically detects and reads credentials generated by the myCloud CLI (
~/.mycloud/credentials.json). - Comprehensive: Full support for file lifecycles, folder management, sharing, batch operations, stash, search, and private storage nodes.
- Type-Safe: Written with complete type hints for seamless IDE integration and autocomplete.
- Graceful Error Handling: Automatically catches and parses server validation errors, mapping them to typed Python exceptions.
Installation
Install via pip:
pip install mycloud-sdk
Configuration
By default, the SDK uses the production myCloud API at https://cloud.mysphere.co.in.
You can configure the server and authentication token in three ways:
- Auto-Discovery (Recommended): If you use the myCloud CLI and have run
mycloud login, the SDK will automatically read your~/.mycloud/credentials.jsonfile. - Environment Variables: Set
MYCLOUD_URLto point to a custom server. - Explicit Initialization: Pass them directly to the client:
cloud = MyCloud(server="https://custom-cloud.domain.com", token="your_api_token")
Quick Start
Synchronous Usage
from pathlib import Path
from mycloud import MyCloud
# Initialize the client (automatically uses ~/.mycloud/credentials.json if available)
cloud = MyCloud()
# 1. Login manually (if not using the CLI's auto-config)
cloud.auth.login("your_username", "your_password")
# 2. List your root files and folders
files = cloud.files.list()
for f in files:
print(f"Found file: {f.name} ({f.size} bytes)")
# 3. Upload a new file
my_file = Path("important_document.pdf")
uploaded_file = cloud.files.upload(my_file)
print(f"Uploaded successfully! ID: {uploaded_file.id}")
# 4. Download a file
cloud.files.download(uploaded_file.id, dest="downloads/important_document.pdf")
Asynchronous Usage (For high concurrency)
For applications requiring high throughput, use AsyncMyCloud. It supports asynchronous context managers (async with) for proper resource cleanup.
import asyncio
from pathlib import Path
from mycloud import AsyncMyCloud
async def main():
async with AsyncMyCloud() as cloud:
# Concurrently upload multiple files
paths = [Path(f"data_{i}.csv") for i in range(10)]
# asyncio.gather fires all uploads in parallel
upload_tasks = [cloud.files.upload(p) for p in paths]
uploaded_files = await asyncio.gather(*upload_tasks)
for f in uploaded_files:
print(f"Uploaded: {f.name}")
asyncio.run(main())
Core Modules Overview
The SDK exposes 13 distinct modules.
cloud.files
upload(path: Union[str, Path], folder_id: Optional[int], node: str, stash: bool): Upload a file.download(file_id: int, dest: Union[str, Path]): Download a file.list(folder_id: Optional[int], node: str, favorites: bool): List files in a directory.read(file_id: int): Read the raw text contents of a file.info(file_id: int): Get detailed metadata.rename(file_id: int, new_name: str): Rename a file.move(file_id: int, folder_id: int): Move a file to a new folder.delete(file_id: int): Delete a file permanently.favorite(file_id: int): Toggle a file's favorite status.
cloud.folders
create(name: str, parent_id: Optional[int]): Create a new directory.list(folder_id: Optional[int]): List sub-directories.rename(folder_id: int, new_name: str): Rename a directory.move(folder_id: int, new_parent_id: int): Move a folder.delete(folder_id: int): Delete a folder.favorite(folder_id: int): Toggle a folder's favorite status.
cloud.stash
add(file_id: int, days: int): Secure an existing file in your stash (recycle bin style).restore(stash_id: int): Restore a file from the stash.list(): List all stashed items.empty(): Permanently delete all stashed files.
cloud.batch (Bulk Operations)
delete(file_ids: List[int]): Delete multiple files.move(file_ids: List[int], folder_id: int): Move multiple files.stash(file_ids: List[int], days: int): Stash multiple files.share(file_ids: List[int], user: str): Share multiple files at once.link(file_ids: List[int]): Generate a public link for a bundle of files.
cloud.share
create(item_id: int, user: str, permission: str, item_type: str): Share a file/folder with a user.link(item_id: int, item_type: str): Create a public shareable URL.info(item_id: int, item_type: str): Get sharing metadata.disable_link(item_id: int): Revoke access to a public link.
cloud.search
query(q: str, filter_type: str, filter_date: str): Search files and folders globally.
cloud.favorites
list_files(): List all favorited files.list_folders(): List all favorited folders.toggle_file(file_id: int): Toggle a file's favorite status.toggle_folder(folder_id: int): Toggle a folder's favorite status.
cloud.servers
list(): List all registered private node servers.add(): Generate a new API key for a private node.delete(node_id: int): Remove a private node from your account.
cloud.profile & cloud.auth
- Manage your account, upload avatars, enable 2FA, register, reset passwords, and login.
cloud.storage, cloud.notifications, cloud.prefs, cloud.batch_share
- Monitor storage stats, manage email preferences, handle share invites, and manage named batch shares.
Exception Handling
The SDK provides specific exceptions directly from the mycloud package.
from mycloud import MyCloud
from mycloud import AuthError, NotFoundError, ValidationError
cloud = MyCloud()
try:
cloud.files.download(9999999, dest=".")
except NotFoundError:
print("The requested file does not exist!")
except AuthError:
print("Your session has expired. Please login again.")
except ValidationError as e:
print(f"Invalid input: {e}")
Known Server API Limitations
The SDK is designed to be highly resilient. However, please note that certain backend functionalities currently have documented limitations:
- Share Disabling: The server API expects a
share_idfor revoking public links, but the endpoints provideitem_id. - Private Node Key Generation: The node generation endpoint currently returns an HTML redirect instead of a JSON payload on success. The SDK gracefully catches this limitation as a standard Python Exception.
- Upload Filename Synchronization: When deleting and recreating identical filenames quickly, the auto-increment tracker on the server may desync from
MAX(id).
All known limitations are safely caught by the SDK to prevent hard application crashes.
License
This project is licensed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mycloud_sdk-0.1.1.tar.gz.
File metadata
- Download URL: mycloud_sdk-0.1.1.tar.gz
- Upload date:
- Size: 29.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a619a721461875e900aeea43aa28c18ff6641399d773c9dc6eef7363acf83b66
|
|
| MD5 |
440ca5477a78365b902b3b73cb0e3074
|
|
| BLAKE2b-256 |
c3692314e14550c5fd473aee7c07b6059de60c49a47f02634faee8aba53fcf43
|
File details
Details for the file mycloud_sdk-0.1.1-py3-none-any.whl.
File metadata
- Download URL: mycloud_sdk-0.1.1-py3-none-any.whl
- Upload date:
- Size: 35.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
400915f14f996da365368523c1d5c41c31a90e549ff6a7111bde000903c38660
|
|
| MD5 |
5659f071a8ac58a60083001e9dc3349f
|
|
| BLAKE2b-256 |
6314d147f292e57b6f7c93fcdc5e0fa2c1562b551f4eb28d59c1807c5abac714
|