Media Aggregation and Sorting System
A React Native/Expo application that aggregates photos and videos from multiple sources (Google Photos, iCloud, and Network-Attached Storage) into a unified photo library.
Features
Core Functionality
-
User Authentication: Local account creation and login with SQLite database storage
-
Multi-Service Integration:
- 🔵 Google Photos: OAuth2 integration for Google Photos API
- 🍎 iCloud Photos: Apple iCloud account support (placeholder)
- 💾 NAS Storage: SFTP connection to Ubuntu servers for photo/video access
-
Onboarding Flow:
- Service selection (enable 1-3 services)
- Service configuration with credentials
- Default service selection for uploads
-
Photo Gallery:
- Unified photo library view combining all services
- Google Photos-styled grid layout
- Modal image viewer with metadata display
- Support for photos and videos
Architecture
Database Schema
- users: User account storage (username, email, password)
- linked_accounts: External service credentials and configurations
- media: Photo/video metadata from all sources
- sync_logs: Sync operation history and status
Authentication Services
All authentication services follow the AuthServiceBase interface for easy interchangeability:
- GoogleAUTH: OAuth2 authentication with Google Photos API
- IOSAUTH: Apple iCloud authentication (currently placeholder)
- NASAUTH: SFTP connection to Ubuntu servers via SSH2
Navigation Flow
Login/Register → Onboarding (Service Setup) → Home (Photo Gallery)
Project Structure
Media-Aggregation-and-Sorting-System/
├── src/
│ ├── AUTH/
│ │ ├── AuthServiceBase.js # Abstract auth service interface
│ │ ├── GoogleAUTH.js # Google Photos authentication
│ │ ├── IOSAUTH.js # iCloud authentication
│ │ └── NASAUTH.js # NAS SFTP authentication
│ ├── screens/
│ │ ├── LoginScreen.js # Login form
│ │ ├── RegisterScreen.js # Registration form
│ │ ├── OnboardingScreen.js # Service setup wizard
│ │ └── HomeScreen.js # Main photo gallery
│ ├── services/
│ │ └── DatabaseService.js # SQLite database operations
│ ├── components/
│ └── API/
├── App.js # Navigation setup
├── app.json # Expo configuration
├── package.json # Dependencies
└── README.md
Installation
Prerequisites
- Node.js and npm
- Expo CLI:
npm install -g expo-cli - iOS Simulator or Android Emulator (or physical device with Expo Go)
Setup Steps
-
Clone and Install Dependencies
cd Media-Aggregation-and-Sorting-System npm install -
Start the Development Server
npm start -
Run on Device/Emulator
- iOS: Press
iin the terminal - Android: Press
ain the terminal - Physical Device: Scan QR code with Expo Go app
- iOS: Press
Usage
Creating an Account
- Open the app → Select "Register here"
- Enter username, email, and password (min 6 characters)
- Confirm password and create account
Login
- Enter registered email and password
- Click "Login"
Onboarding (Service Configuration)
Step 1: Select Services
- Toggle which services to enable (1-3 maximum)
- Google Photos, iCloud, and/or NAS
Step 2: Configure Services
- Google Photos: Tap to authenticate with Google (OAuth flow)
- iCloud: Tap to authenticate with Apple (OAuth flow)
- NAS: Enter connection details:
- Server address (IP or hostname)
- SSH port (default: 22)
- Username
- Password
- Photos folder path
- Test connection before proceeding
Step 3: Choose Default Service
- Select which service to use by default for uploads
Photo Gallery
- View all photos/videos from connected services
- Service badges at top show connected accounts
- ★ indicates the default service
- Tap any photo to view in enlarged modal
- Modal shows metadata: title, description, source, type, date
API Integration (TODO)
Google Photos Implementation
- Replace placeholder
authenticate()with actual Google Sign-In - Implement OAuth2 token exchange
- Add
/photoslibrary/v1/mediaItems:searchAPI calls - Handle pagination and filtering
iCloud Implementation
- Integrate Apple Sign-In
- Implement CloudKit API for photo access
- Handle iCloud authentication
NAS Implementation
- Replace SSH2 placeholders with actual library implementation
- Implement SFTP file listing and download
- Add file upload functionality
- Handle directory navigation
Configuration
Environment Variables (Optional)
Create a .env file for sensitive configuration:
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
NAS_DEFAULT_PORT=22
Database
- SQLite database is automatically created on first run
- Location: Device's app-specific directory
- Filename:
PhotosApp.db
Authentication Service Pattern
Each service implements the same interface:
class AuthService extends AuthServiceBase {
async authenticate(credentials) { }
async getAccessToken() { }
async refreshToken() { }
async revokeAccess() { }
async getUserInfo() { }
// Service-specific methods
}
Easy Interchangeability
To swap or extend authentication:
- Create new class extending
AuthServiceBase - Implement all abstract methods
- Update the service type in
DatabaseService.linkAccount() - Update
OnboardingScreenUI if needed
Data Flow
Login/Register
↓
Authentication → Save to SQLite
↓
Onboarding → Service Selection
↓
Service Auth → Store Credentials
↓
Home Screen → Fetch from Services
↓
Display in Gallery
Security Considerations
⚠️ Current Implementation Warnings:
- Passwords stored in plain text in SQLite (development only)
- NAS passwords stored in plain text (development only)
- OAuth tokens not persisted securely
For Production:
- Use secure storage (Keychain/Keystore)
- Encrypt sensitive data in database
- Implement token refresh and expiration
- Use OAuth for all services
- Never store plain-text passwords
Dependencies
Core
react: 19.1.0react-native: 0.81.5expo: ~54.0.31
Navigation
@react-navigation/native: ^6.1.17@react-navigation/native-stack: ^6.9.26react-native-screens: ^3.31.1react-native-safe-area-context: ^4.10.5react-native-gesture-handler: ^2.16.1
Database & Storage
react-native-sqlite-storage: ^6.0.0expo-file-system: ~17.0.1expo-media-library: ~15.9.0
Network
ssh2: ^1.15.0react-native-ssh2: ^1.0.0
Media
expo-image-picker: ~14.7.1
Troubleshooting
Database Initialization Error
Solution: Clear app cache/reinstall
npx expo prebuild --clean
npm start
Navigation Issues
Ensure all screens are properly exported and imported in App.js
Service Connection Failures
- Check network connectivity
- Verify API credentials
- Check NAS server accessibility (port 22 open)
- Review console logs for detailed error messages
Future Enhancements
- Implement actual Google Photos API integration
- Implement actual iCloud Photos integration
- Complete SFTP functionality for NAS
- Photo upload to default service
- Photo search and filtering
- Album management
- Automatic sync scheduling
- Cloud backup
- Photo sharing features
- Advanced metadata editing
- Duplicate detection
- Smart album creation
- Facial recognition (optional)
Contributing
This is a personal project. Feel free to fork and extend!
License
MIT License - Feel free to use for personal or commercial projects.
Support
For issues or questions, please check the code comments and inline TODOs for implementation guidance.