Photo Management
Example¶
Imagine a typical scenario where you have thousands of vacation photos. Here's how LDP helps:
import os
from datetime import datetime
from local_data_platform.storage_base import StorageBase
# Assuming you'd implement a concrete FileSystemStorage or similar
from local_data_platform.in_memory_storage import InMemoryStorage # Or a new FileSystemStorage
from local_data_platform.photo_processing import PhotoCompressor, PhotoOrganizer # Hypothetical modules/classes
from local_data_platform.local_server import LocalFileShareServer # Hypothetical module/class
# 1. Define your local photo storage
# In a real scenario, this would likely be a FileSystemStorage
# For demonstration, let's use a dummy in-memory one or assume a setup
class FileSystemStorage(StorageBase):
def __init__(self, base_path: str):
self.base_path = base_path
os.makedirs(base_path, exist_ok=True)
self._data = {} # Simulating file paths/content for example
def put(self, key: str, value: bytes):
# In real-world, save binary 'value' to 'os.path.join(self.base_path, key)'
self._data[key] = value
print(f"Stored: {key}")
def get(self, key: str, default=None):
# In real-world, read binary from 'os.path.join(self.base_path, key)'
return self._data.get(key, default)
# Setup a specific storage path for photos
photo_storage = FileSystemStorage(base_path="./my_photo_vault")
# 2. Process your raw photos
photo_compressor = PhotoCompressor(quality=80, output_format="webp")
photo_organizer = PhotoOrganizer(storage_backend=photo_storage)
raw_photo_paths = ["./vacation/img_001.jpg", "./vacation/img_002.png"] # Paths to your original photos
# Simulate loading and processing photos
processed_photos_info = []
for path in raw_photo_paths:
# In reality, read image data from 'path'
image_data_raw = b"..." # Dummy binary data
# Apply compression
compressed_data = photo_compressor.compress(image_data_raw)
# Generate a new key/path for storage (e.g., based on hash or metadata)
photo_id = f"compressed_vacation_{os.path.basename(path).split('.')[0]}.webp"
# Store the compressed photo
photo_storage.put(photo_id, compressed_data)
# Extract metadata and organize
metadata = {"date": datetime.now().isoformat(), "tags": ["vacation", "beach"]}
photo_organizer.organize(photo_id, metadata)
processed_photos_info.append({"id": photo_id, "path": os.path.join(photo_storage.base_path, photo_id)})
print("\nPhotos processed and stored locally.")
# 3. Share a selection of photos easily and privately
photos_to_share_ids = [processed_photos_info[0]['id']] # Just sharing the first one for example
# The LocalFileShareServer would temporarily serve these files
share_server = LocalFileShareServer(
storage_backend=photo_storage,
allowed_ids=photos_to_share_ids,
expiration_minutes=60
)
# This would start a simple web server in a background thread or process
# and provide a URL that others on the same network can access.
print("\nStarting local sharing server...")
share_url = share_server.start_sharing()
print(f"Share these photos via: {share_url}")
print("Server will automatically stop after 60 minutes or when you close the application.")
# In a real application, you'd keep the script running for the server to serve,
# or integrate it into a long-running LDP daemon/UI.
# For this example, we'll just print the URL and simulate stopping.
share_server.stop_sharing()
print("Sharing server stopped.")