pCloud SDK for Python

A modern Python SDK for the pCloud API with automatic token management and real-time progress tracking.
🚀 Quick Start
from pcloud_sdk import PCloudSDK
sdk = PCloudSDK()
sdk.login("your_email@example.com", "your_password")
print(f"Connected: {sdk.user.get_user_email()}")
def progress(bytes_transferred, total_bytes, percentage, speed, **kwargs):
print(f"📤 {percentage:.1f}% ({speed/1024/1024:.1f} MB/s)")
sdk.file.upload("/path/to/file.txt", progress_callback=progress)
📊 Real-time Progress Tracking
The SDK includes a comprehensive callback system for tracking upload and download progress:
from pcloud_sdk.progress_utils import create_progress_bar, create_detailed_progress
progress_bar = create_progress_bar("My Upload")
sdk.file.upload("file.txt", progress_callback=progress_bar)
detailed = create_detailed_progress(log_file="transfers.log")
sdk.file.download(file_id, "./downloads/", progress_callback=detailed)
def my_callback(bytes_transferred, total_bytes, percentage, speed, **kwargs):
if percentage % 25 == 0:
print(f"🎯 {kwargs['operation']}: {percentage:.0f}% complete")
sdk.file.upload("large_file.zip", progress_callback=my_callback)
🛠️ Installation
pip install pcloud-sdk-python
The SDK only requires the requests
library as an external dependency.
✨ Key Features
🔑 Integrated Token Manager - No more manual reconnection!
🇪🇺 EU Server by Default - Optimized for European users
🔐 Direct Authentication by Default - Simpler to use
💾 Automatic Credential Saving - Persistent sessions
📊 Real-time Progress Callbacks - Track uploads/downloads
🎨 Ready-to-use Progress Trackers - 4 different display styles
🏁 Getting Started
1. Create a pCloud Application (Optional for direct login)
- Go to pCloud Developer Console
- Create a new application
- Note your Client ID (App Key) and Client Secret (App Secret)
- Configure your Redirect URI
Note: For direct login with email/password, you don't need to create an application.
2. Authentication - Three Methods Available
Method 1: Direct Login with Token Manager (Recommended)
from pcloud_sdk import PCloudSDK, PCloudException
sdk = PCloudSDK()
try:
login_info = sdk.login("your_email@example.com", "your_password")
print(f"Connected: {login_info['email']}")
except PCloudException as e:
print(f"Error: {e}")
Method 2: OAuth2 Flow (For third-party applications)
from pcloud_sdk import PCloudSDK, PCloudException
sdk = PCloudSDK(
app_key="your_client_id",
app_secret="your_client_secret",
auth_type="oauth2"
)
auth_url = sdk.get_auth_url("http://localhost:8000/callback")
print(f"Visit this URL: {auth_url}")
try:
token_info = sdk.authenticate("code_from_callback")
print(f"Access token: {token_info['access_token']}")
except PCloudException as e:
print(f"Authentication error: {e}")
Method 3: Existing Token
sdk = PCloudSDK(
access_token="your_existing_token",
auth_type="direct",
token_manager=False
)
🔑 Automatic Token Management
The SDK includes an integrated token manager to avoid frequent reconnections.
Automatic Features:
- ✅ Automatic saving of tokens after connection
- ✅ Automatic loading of saved tokens
- ✅ Validity testing before use
- ✅ Transparent reconnection if token expires
- ✅ Multi-account management with separate files
Basic Usage:
sdk = PCloudSDK()
sdk.login("email@example.com", "password")
sdk = PCloudSDK()
sdk.login()
Advanced Configuration:
sdk = PCloudSDK(token_file=".my_pcloud_session")
sdk.login("email", "password", force_login=True)
sdk = PCloudSDK(token_manager=False)
sdk.logout()
info = sdk.get_credentials_info()
print(f"Connected for {info['age_days']:.1f} days")
Security:
- 🔒 Encrypted tokens in credentials file
- ⏰ Automatic expiration after 30 days
- 🚫 No passwords saved (only tokens)
- 🧹 Automatic cleanup of invalid tokens
📖 Usage Examples
User Information
user_info = sdk.user.get_user_info()
print(f"Email: {sdk.user.get_user_email()}")
print(f"Used quota: {sdk.user.get_used_quota()} bytes")
print(f"Total quota: {sdk.user.get_quota()} bytes")
Folder Management
root_contents = sdk.folder.list_root()
print("Root contents:", root_contents)
folder_id = sdk.folder.create("My New Folder", parent=0)
print(f"Created folder ID: {folder_id}")
contents = sdk.folder.get_content(folder_id)
print("Folder contents:", contents)
sdk.folder.rename(folder_id, "New Name")
sdk.folder.move(folder_id, new_parent=0)
sdk.folder.delete(folder_id)
sdk.folder.delete_recursive(folder_id)
File Management
upload_result = sdk.file.upload(
file_path="/path/to/file.txt",
folder_id=0,
filename="uploaded_file.txt"
)
file_id = upload_result['metadata'][0]['fileid']
print(f"File uploaded with ID: {file_id}")
file_info = sdk.file.get_info(file_id)
print("File info:", file_info)
download_link = sdk.file.get_link(file_id)
print(f"Download link: {download_link}")
sdk.file.download(file_id, destination="/download/path/")
sdk.file.rename(file_id, "new_name.txt")
sdk.file.move(file_id, folder_id=new_folder_id)
sdk.file.copy(file_id, folder_id=destination_folder_id)
delete_result = sdk.file.delete(file_id)
print("File deleted:", delete_result)
Progress Tracking
from pcloud_sdk.progress_utils import (
create_progress_bar, create_detailed_progress,
create_minimal_progress, create_silent_progress
)
progress_bar = create_progress_bar("Upload Progress")
sdk.file.upload("file.txt", progress_callback=progress_bar)
detailed = create_detailed_progress(log_file="transfer.log")
sdk.file.download(file_id, "./downloads/", progress_callback=detailed)
minimal = create_minimal_progress()
sdk.file.upload("file.txt", progress_callback=minimal)
silent = create_silent_progress("transfer.csv")
sdk.file.upload("file.txt", progress_callback=silent)
def custom_progress(bytes_transferred, total_bytes, percentage, speed, **kwargs):
operation = kwargs.get('operation', 'transfer')
filename = kwargs.get('filename', 'file')
if percentage % 10 == 0:
print(f"{operation} {filename}: {percentage:.0f}% at {speed/1024/1024:.1f} MB/s")
sdk.file.upload("file.txt", progress_callback=custom_progress)
Error Handling
try:
result = sdk.file.upload("/nonexistent/file.txt")
except PCloudException as e:
print(f"pCloud error: {e}")
print(f"Error code: {e.code}")
except Exception as e:
print(f"General error: {e}")
🖥️ Command Line Interface
The SDK includes a powerful CLI:
pcloud-sdk-python login --email user@example.com
pcloud-sdk-python info
pcloud-sdk-python list
pcloud-sdk-python upload --file /path/to/file.txt --folder-id 0
pcloud-sdk-python download --file-id 123456 --destination ./downloads/
pcloud-sdk-python delete --file-id 123456
pcloud-sdk-python logout
🌍 Server Locations
location_id=2
: EU servers (default) 🇪🇺
location_id=1
: US servers 🇺🇸
sdk = PCloudSDK()
sdk = PCloudSDK(location_id=1)
🔧 Advanced Usage
Direct Class Usage
from pcloud_sdk import App, User, File, Folder
app = App()
app.set_app_key("your_client_id")
app.set_app_secret("your_client_secret")
app.set_access_token("your_token")
app.set_location_id(2)
user = User(app)
folder = Folder(app)
file_manager = File(app)
Timeout Configuration
app.set_curl_execution_timeout(1800)
Large File Uploads
The SDK automatically handles large file uploads in 10MB chunks:
result = sdk.file.upload("/path/to/large_file.zip", folder_id=0)
🧪 Testing and Development
pip install -r requirements/dev.txt
python tools/test_runner.py
python tools/lint.py
python tools/benchmark.py
python -m build
📋 Migration from v1.0
The SDK offers optimized defaults:
location_id | 1 (US) | 2 (EU) | Better latency for Europe |
auth_type | "oauth2" | "direct" | Simpler to use |
token_manager | Not available | True | Avoid reconnections |
Migration Example:
sdk = PCloudSDK("", "")
sdk.login("email", "password", location_id=2)
sdk = PCloudSDK()
sdk.login("email", "password")
🤝 Contributing
We welcome contributions! Please see our Contributing Guidelines for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
)
- Commit your changes (
git commit -m 'Add amazing feature'
)
- Push to the branch (
git push origin feature/amazing-feature
)
- Open a Pull Request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🔗 Links
✨ Features
✅ Implemented
- OAuth2 and direct authentication (email/password)
- Automatic token manager 🆕
- Real-time progress callbacks for upload/download 🆕
- Ready-to-use progress utilities 🆕
- User management
- Folder management (create, delete, rename, move)
- File management (upload, download, delete, rename, move, copy)
- Chunked uploads for large files
- Automatic request retry
- Multi-region support (US/EU) with EU default 🆕
- Error handling
- Automatic reconnection 🆕
- Persistent session storage 🆕
🆕 Key Features
- Integrated Token Manager: No more manual reconnection!
- Progress Callbacks: Real-time transfer tracking
- Progress Utilities: Progress bars, logs, detailed displays
- EU Server Default: Optimized for European users
- Direct Authentication Default: Simpler to use
- Auto-save Credentials: Persistent sessions
- Minimal Configuration:
PCloudSDK()
is enough!
🔄 Differences from PHP SDK
- Uses
requests
instead of cURL
- Native Python exception handling
- Type hints for better documentation
PCloudSDK
wrapper class for simplicity
- Automatic token manager (not in PHP SDK)
- Real-time progress callbacks (not in PHP SDK)
📦 Dependencies
- Python 3.7+
- requests >= 2.25.0
This SDK is a modern Python implementation inspired by the official pCloud PHP SDK, with additional features for better Python integration and user experience.