https://github.com/ecomgraduates/cloudapp-downloader
CloudApp Video Downloader is a simple Node.js command-line tool to download videos from loom.com. It retrieves the video download link based on the video ID in the URL and saves the video with a specified filename or, by default, the video ID.
https://github.com/ecomgraduates/cloudapp-downloader
bulk bulkdownload cloudapp download downloader zight
Last synced: 8 days ago
JSON representation
CloudApp Video Downloader is a simple Node.js command-line tool to download videos from loom.com. It retrieves the video download link based on the video ID in the URL and saves the video with a specified filename or, by default, the video ID.
- Host: GitHub
- URL: https://github.com/ecomgraduates/cloudapp-downloader
- Owner: EcomGraduates
- License: mit
- Created: 2023-11-05T20:18:57.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2025-12-22T20:53:03.000Z (6 months ago)
- Last Synced: 2025-12-23T10:04:30.224Z (6 months ago)
- Topics: bulk, bulkdownload, cloudapp, download, downloader, zight
- Language: JavaScript
- Homepage:
- Size: 130 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# CloudApp/Zight Downloader
A powerful Node.js package to download, upload, and manage files on Zight (formerly CloudApp). Use it as a **CLI tool** or as a **programmatic library** in your Node.js projects.
## Features
- ✨ **Dual Mode** - Use as CLI tool or import as a library in your projects
- 📂 **List Drops** - View and browse your files with pagination
- 📊 **Export to CSV** - Export your entire library metadata to a CSV file
- ⬇️ **Flexible Downloads** - Download by ID, URL, from a list file, or bulk from your account
- ⬆️ **Upload Files** - Upload single files or entire directories
- 🗑️ **Delete & Trash** - Delete files, view trash, restore items, or permanently delete
- 🎬 **Video Filtering** - Option to download only video files
- 📹 **Video Requests** - Create, list, edit, and delete video request links
- 📁 **Collections** - View your collections
- 🔔 **Notifications** - View and manage notifications
- 🔄 **Auto Session Refresh** - Sessions auto-refresh when expired
- 🔐 **Secure Config** - Credentials stored securely in your OS config directory
- ⏱️ **Rate Limiting** - Built-in delays between requests to avoid being blocked
## Installation
### Via NPM (Recommended)
```bash
npm install -g cloudapp-dl
```
### From Source
```bash
git clone https://github.com/EcomGraduates/cloudapp-downloader.git
cd cloudapp-downloader
npm install
npm link # Makes 'cloudapp-dl' available globally
```
---
## Using as a Library
You can import and use `cloudapp-dl` as a programmatic library in your Node.js projects.
### Quick Start (ESM)
```javascript
import { ZightClient } from 'cloudapp-dl';
// Create client with email/password
const client = new ZightClient({
email: 'your@email.com',
password: 'your-password'
});
// Login
await client.login();
// Use the API
const account = await client.getAccountDetails();
console.log('Logged in as:', account.data.user.attributes.email);
```
### Quick Start (CommonJS)
```javascript
const { ZightClient } = require('cloudapp-dl');
async function main() {
const client = new ZightClient({
email: 'your@email.com',
password: 'your-password'
});
await client.login();
const account = await client.getAccountDetails();
console.log('Logged in as:', account.data.user.attributes.email);
}
main();
```
### Authentication Options
```javascript
// Option 1: Email/Password (will call login() to authenticate)
const client = new ZightClient({
email: process.env.ZIGHT_EMAIL,
password: process.env.ZIGHT_PASSWORD
});
await client.login();
// Option 2: Existing Session ID (skip login if you already have a session)
const client = new ZightClient({
sessionId: 'your-existing-session-id'
});
```
### Debug Mode
Enable debug logging to see what's happening under the hood:
```javascript
const client = new ZightClient({
email: 'your@email.com',
password: 'your-password',
debug: true // Enables debug logging
});
```
### Available Methods
#### Account & Info
```javascript
// Get account details
const account = await client.getAccountDetails();
// Get organization details
const org = await client.getOrganization();
// Check authentication status
console.log('Authenticated:', client.isAuthenticated);
console.log('Session ID:', client.sessionId);
```
#### Files & Items
```javascript
// List items (paginated)
const items = await client.getItemsFromDashboard({ page: 1, perPage: 24 });
// Get all items
const allItems = await client.getAllItems();
// Get a specific item
const item = await client.getItem('itemId');
// Search items
const results = await client.searchDrops('search query');
// Get drops (files)
const drops = await client.getDrops({ page: 1, perPage: 20 });
```
#### Upload & Download
```javascript
// Upload a file
const result = await client.uploadFile('./screenshot.png');
console.log('Share URL:', result.share_url);
// Upload with progress callback
const result = await client.uploadFile('./video.mp4', (progress) => {
const percent = Math.round((progress.loaded / progress.total) * 100);
console.log(`Upload progress: ${percent}%`);
});
// Get download URL for an item
const item = await client.getItem('itemId');
console.log('Download URL:', item.download_url);
```
#### Delete & Trash
```javascript
// Delete an item (move to trash)
await client.deleteItem('itemId');
// Permanently delete an item
await client.deleteItem('itemId', true);
// List items in trash
const trashItems = await client.getTrashItems();
// Restore an item from trash
await client.restoreItem('itemId');
// Empty trash
await client.emptyTrash();
```
#### Video Requests
```javascript
// Create a video request link
const request = await client.createVideoRequest({
name: 'Help me with this bug',
message: 'Please record your screen showing the issue'
});
console.log('Share link:', request.data.request_content.links.request_link);
// List all video requests
const requests = await client.getVideoRequests();
// Get a specific request
const req = await client.getVideoRequest('requestId');
// Update a request
await client.updateVideoRequest('requestId', {
name: 'Updated Title',
message: 'Updated instructions'
});
// Delete a request
await client.deleteVideoRequest('requestId');
```
#### Collections
```javascript
// List collections
const collections = await client.getCollections();
// Get all collections
const allCollections = await client.getAllCollections();
```
#### Notifications
```javascript
// Get notifications
const notifications = await client.getNotifications({ limit: 10 });
// Get unread notifications
const unread = await client.getNotifications({ viewed: 'no', limit: 20 });
// Mark a notification as read
await client.markNotificationViewed('notificationId');
// Mark all notifications as read
await client.markAllNotificationsViewed();
```
### Full Example
```javascript
import { ZightClient } from 'cloudapp-dl';
async function main() {
// Initialize client
const client = new ZightClient({
email: process.env.ZIGHT_EMAIL,
password: process.env.ZIGHT_PASSWORD,
debug: false
});
// Login
await client.login();
console.log('Logged in successfully!');
// Get account info
const account = await client.getAccountDetails();
const user = account.data.user;
console.log(`Welcome, ${user.attributes.name}!`);
console.log(`You have ${user.attributes.item_count} items.`);
// Upload a file
const uploadResult = await client.uploadFile('./screenshot.png');
console.log('Uploaded:', uploadResult.share_url);
// Create a video request
const request = await client.createVideoRequest({
name: 'Support Request',
message: 'Please record your screen showing the issue'
});
console.log('Request link:', request.data.request_content.links.request_link);
// List recent items
const items = await client.getItemsFromDashboard({ page: 1, perPage: 12 });
console.log(`Recent items: ${items.items.length}`);
// Get notifications
const notifications = await client.getNotifications({ limit: 5 });
console.log(`Notifications: ${notifications.data.client_notifications.length}`);
}
main().catch(console.error);
```
### Demo Scripts
Check out the `demo/` directory for example scripts:
```bash
cd demo
cp env.example .env
# Edit .env with your credentials
npm install dotenv
node demo.js # Run all demos
node demo.js upload ./file.png
node demo.js create-request
node demo.js notifications
```
---
## CLI Usage
## Commands Overview
```
cloudapp-dl login Login to your Zight account
cloudapp-dl logout Logout and clear session
cloudapp-dl account Display your Zight account details
cloudapp-dl whoami Show current login status
cloudapp-dl config View or manage configuration
cloudapp-dl list List your drops/files from Zight
cloudapp-dl export Export items to CSV file
cloudapp-dl collections List your collections
cloudapp-dl get Download a single file by ID
cloudapp-dl download Download a single file by URL
cloudapp-dl download-list Download multiple files from a URL list
cloudapp-dl bulk-download Bulk download files from your account
cloudapp-dl upload Upload a file to Zight
cloudapp-dl bulk-upload Upload multiple files from a directory
cloudapp-dl delete Delete a file (move to trash)
cloudapp-dl trash List items in trash
cloudapp-dl restore Restore a file from trash
cloudapp-dl empty-trash Permanently delete all trash items
cloudapp-dl request Create a video request (interactive)
cloudapp-dl request-quick Instantly create a video request
cloudapp-dl requests List your video requests
cloudapp-dl request-details View request details and submitted items
cloudapp-dl request-download Download all items from a request
cloudapp-dl request-edit Edit a video request
cloudapp-dl request-delete Delete a video request
cloudapp-dl help Show help information
```
## Account Commands
### Login to Your Account
```bash
cloudapp-dl login
```
You'll be prompted for your email and password. Credentials are stored locally for future sessions.
You can also provide credentials directly:
```bash
cloudapp-dl login --email your@email.com --password yourpassword
```
### View Account Details
```bash
cloudapp-dl account
```
Displays your account information including name, email, item count, and plan details.
### Check Login Status
```bash
cloudapp-dl whoami
```
Quick check of your current login status and session validity.
### Logout
```bash
cloudapp-dl logout
```
Clears your session (credentials remain stored for easy re-login).
### Configuration
View your current configuration:
```bash
cloudapp-dl config
```
Show config file path:
```bash
cloudapp-dl config --path
```
Clear all configuration data:
```bash
cloudapp-dl config --clear
```
## Listing & Exporting
### List Your Drops
```bash
cloudapp-dl list
```
Lists your drops/files from Zight. Supports pagination:
```bash
cloudapp-dl list --page 2 --per-page 48
```
### List Your Collections
```bash
cloudapp-dl collections
```
Displays all your collections with their IDs, names, item counts, and view counts.
### Export to CSV
Export all your items to a CSV file:
```bash
cloudapp-dl export
```
Export specific pages:
```bash
cloudapp-dl export --start-page 1 --end-page 10
```
Export to a specific file:
```bash
cloudapp-dl export --out my-export.csv
```
**CSV Columns:**
- `#` - Row number
- `ID` - Zight file ID
- `Title` - File name/title
- `Type` - File extension (.mp4, .png, .zip, etc.)
- `Views` - View count
- `Date` - Creation date
- `URL` - Share URL
- `Is Video` - Yes/No
- `Thumbnail` - Thumbnail URL
## Downloading Files
### Download by ID
Download a file using its Zight ID:
```bash
cloudapp-dl get WnuPyJR5
```
Download to specific directory:
```bash
cloudapp-dl get WnuPyJR5 --out ./downloads
```
Use ID as filename instead of title:
```bash
cloudapp-dl get WnuPyJR5 --no-title
```
### Download by URL
Download a file using its full URL:
```bash
cloudapp-dl download https://share.zight.com/WnuPyJR5
```
Download to specific directory:
```bash
cloudapp-dl download https://share.zight.com/WnuPyJR5 --out ./downloads
```
### Download from URL List
Create a text file with one URL per line (`urls.txt`):
```
https://share.zight.com/ABC123
https://share.zight.com/DEF456
https://share.zight.com/GHI789
```
Then download all of them:
```bash
cloudapp-dl download-list urls.txt
```
With options:
```bash
cloudapp-dl download-list urls.txt --out ./videos --prefix video --timeout 5000
```
### Bulk Download from Account
Download ALL files from your logged-in account:
```bash
cloudapp-dl bulk-download
```
With options:
```bash
cloudapp-dl bulk-download --out ./my-files --limit 50 --videos-only
```
Download specific pages:
```bash
cloudapp-dl bulk-download --start-page 1 --end-page 10
```
## Uploading Files
### Upload a Single File
```bash
cloudapp-dl upload ./video.mp4
```
```bash
cloudapp-dl upload ~/Desktop/screenshot.png
```
### Bulk Upload from Directory
Upload all files in a directory:
```bash
cloudapp-dl bulk-upload ./screenshots/
```
With custom delay between uploads:
```bash
cloudapp-dl bulk-upload ./videos/ --timeout 3000
```
### Supported File Types
The uploader automatically detects MIME types:
| Category | Extensions |
|----------|------------|
| **Video** | .mp4, .mov, .avi, .webm, .mkv, .m4v |
| **Images** | .png, .jpg, .jpeg, .gif, .webp, .svg, .bmp |
| **Audio** | .mp3, .wav, .ogg, .m4a |
| **Documents** | .pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .txt, .csv |
| **Archives** | .zip, .rar, .7z, .tar, .gz |
## Deleting Files & Trash
### Delete a File (Move to Trash)
Delete a file by moving it to trash (recoverable for 30 days):
```bash
cloudapp-dl delete WnuPyJR5
```
Skip confirmation:
```bash
cloudapp-dl delete WnuPyJR5 --yes
```
### Permanently Delete
Permanently delete a file (no recovery):
```bash
cloudapp-dl delete WnuPyJR5 --permanent
```
⚠️ **Warning:** Permanent deletion cannot be undone!
### View Trash
List all items in your trash:
```bash
cloudapp-dl trash
```
Shows item ID, name, created date, and deleted date.
### Restore from Trash
Restore a file from trash:
```bash
cloudapp-dl restore WnuPyJR5
```
### Empty Trash
Permanently delete ALL items in trash:
```bash
cloudapp-dl empty-trash
```
Skip confirmation:
```bash
cloudapp-dl empty-trash --yes
```
## Video Requests
Create shareable links that allow others to record videos for you. The recordings will automatically appear in your Zight account.
### Create Request (Interactive)
```bash
cloudapp-dl request
```
This will guide you through:
1. Title for the request
2. Message/instructions for the recorder
3. Optional custom ID
4. Optional expiration date
5. Optional collection to save recordings to
### Create Request (Quick)
Instantly create a request with defaults:
```bash
cloudapp-dl request-quick
```
With options:
```bash
cloudapp-dl request-quick -t "Help me debug" --custom-id "TICKET-123"
```
### Create Request (With Options)
```bash
cloudapp-dl request \
--title "Bug Report" \
--message "Record your screen showing the bug" \
--custom-id "TICKET-123" \
--expires "12/31/2025 5:00pm" \
--collection Y2foRdo
```
### List All Requests
```bash
cloudapp-dl requests
```
Show with full links:
```bash
cloudapp-dl requests --verbose
```
### View Request Details & Items
View a request and all items submitted to it:
```bash
cloudapp-dl request-details wgsX51
```
With download URLs:
```bash
cloudapp-dl request-details wgsX51 --verbose
```
### Download Items from a Request
Download all videos/files submitted to a request:
```bash
cloudapp-dl request-download wgsX51
```
With options:
```bash
cloudapp-dl request-download wgsX51 --out ./submissions --timeout 3000
```
### Edit a Request
```bash
cloudapp-dl request-edit ABC123 --title "New Title"
```
Edit multiple fields:
```bash
cloudapp-dl request-edit ABC123 \
--title "Updated Title" \
--message "New instructions" \
--expires "12/31/2025 5:00pm"
```
Remove expiration:
```bash
cloudapp-dl request-edit ABC123 --expires never
```
Change collection:
```bash
cloudapp-dl request-edit ABC123 --collection Y2foRdo
```
### Delete a Request
```bash
cloudapp-dl request-delete ABC123
```
Skip confirmation:
```bash
cloudapp-dl request-delete ABC123 --yes
```
### Date Format for Expiration
The expiration date accepts multiple formats:
- `12/31/2025 5:00pm`
- `12/31/2025 17:00`
- `2025-12-31 5:00pm`
- `12/31/2025` (expires at end of day)
## Options Reference
### Global Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--help` | `-h` | Show help |
| `--version` | `-v` | Show version |
### List Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--page` | | Page number (default: 1) |
| `--per-page` | | Items per page - multiples of 12 (default: 12) |
### Export Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--out` | `-o` | Output CSV file path |
| `--start-page` | | Start from this page |
| `--end-page` | | End at this page |
### Download Options (get, download)
| Option | Alias | Description |
|--------|-------|-------------|
| `--out` | `-o` | Output path/directory |
| `--no-title` | | Use file ID as filename instead of title |
### Download List Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--out` | `-o` | Output directory |
| `--prefix` | `-p` | Filename prefix (e.g., "video" → video-1.mp4) |
| `--timeout` | `-t` | Delay between downloads in ms (default: 2000) |
### Bulk Download Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--out` | `-o` | Output directory (default: ./downloads) |
| `--start-page` | | Start from this page |
| `--end-page` | | End at this page |
| `--limit` | | Maximum number of files to download |
| `--videos-only` | | Only download video files |
| `--timeout` | `-t` | Delay between downloads in ms (default: 2000) |
| `--no-title` | | Use file IDs as filenames instead of titles |
### Upload Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--timeout` | `-t` | Delay between uploads in ms (default: 2000) - bulk-upload only |
### Delete Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--permanent` | | Permanently delete (no recovery) |
| `--yes` | `-y` | Skip confirmation prompt |
### Empty Trash Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--yes` | `-y` | Skip confirmation prompt |
### Request Options (request, request-quick)
| Option | Alias | Description |
|--------|-------|-------------|
| `--title` | `-t` | Title for the request |
| `--message` | `-m` | Message/instructions for the recorder |
| `--custom-id` | | Custom identifier for tracking |
| `--expires` | `-e` | Expiration date (e.g., "12/31/2025 5:00pm") |
| `--collection` | `-c` | Collection ID to save recordings to |
### Request Edit Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--title` | `-t` | New title |
| `--message` | `-m` | New message |
| `--custom-id` | | New custom identifier |
| `--expires` | `-e` | New expiration date (or "never" to remove) |
| `--collection` | `-c` | New collection ID (empty to remove) |
### Request Delete Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--yes` | `-y` | Skip confirmation prompt |
### Request Details Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--verbose` | `-v` | Show download URLs for each item |
### Request Download Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--out` | `-o` | Output directory (default: .) |
| `--timeout` | `-t` | Delay between downloads in ms (default: 2000) |
### Requests List Options
| Option | Alias | Description |
|--------|-------|-------------|
| `--verbose` | `-v` | Show full request links |
## Config File Location
Your configuration is stored at:
- **macOS/Linux**: `~/.config/cloudapp-dl/config.json`
- **Windows**: `%APPDATA%\cloudapp-dl\config.json`
## Session Management
The CLI automatically manages your session:
1. On login, your session ID and expiry are stored
2. Before each API request, the session validity is checked
3. If expired, the CLI automatically re-authenticates using stored credentials
4. Each API response updates the session cookie, keeping it fresh
## Quick Examples
```bash
# Login to your account
cloudapp-dl login
# List your files
cloudapp-dl list --per-page 24
# Export everything to CSV
cloudapp-dl export
# Download a single file by ID
cloudapp-dl get WnuPyJR5
# Download a single file by URL
cloudapp-dl download https://share.zight.com/ABC123
# Download from a list of URLs
cloudapp-dl download-list urls.txt --out ./videos
# Bulk download all videos from your account
cloudapp-dl bulk-download --videos-only --out ./my-videos
# Upload a file
cloudapp-dl upload ./screenshot.png
# Bulk upload a directory
cloudapp-dl bulk-upload ./screenshots/
# Create a video request link
cloudapp-dl request -t "Support" -m "Record your screen showing the issue"
# Create a quick video request
cloudapp-dl request-quick
# List all video requests
cloudapp-dl requests
# View request details and submitted items
cloudapp-dl request-details wgsX51
# Download all items from a request
cloudapp-dl request-download wgsX51 --out ./submissions
# Edit a request
cloudapp-dl request-edit ABC123 --title "New Title" --expires "12/31/2025"
# Delete a request
cloudapp-dl request-delete ABC123 --yes
# Delete a file (move to trash)
cloudapp-dl delete WnuPyJR5
# Permanently delete a file
cloudapp-dl delete WnuPyJR5 --permanent --yes
# View trash
cloudapp-dl trash
# Restore a file from trash
cloudapp-dl restore WnuPyJR5
# Empty trash
cloudapp-dl empty-trash --yes
# List your collections
cloudapp-dl collections
```
## Dependencies
- `axios` - HTTP client
- `cheerio` - HTML parsing
- `form-data` - Multipart form data for uploads
- `yargs` - CLI argument parsing
## Requirements
- Node.js >= 16.0.0
## Troubleshooting
### Session Expired
If you see session expired errors, simply run `cloudapp-dl login` again. The CLI will automatically re-authenticate using your stored credentials.
### Rate Limiting
If downloads/uploads are failing, try increasing the timeout between requests:
```bash
cloudapp-dl bulk-download --timeout 5000 # 5 second delay
cloudapp-dl bulk-upload ./files/ --timeout 5000
```
### File Already Exists
The bulk download and download-list commands automatically skip files that already exist in the output directory.
### Upload Failed
Make sure you're logged in and have permission to upload files to your Zight account. Check your account's storage limits.
## Contributing
Pull requests are welcome. For major changes, please open an issue first.
## License
[MIT](https://choosealicense.com/licenses/mit/)
---
Made with ❤️ by [ECOMGRADUATES LLC](https://ecomgraduates.com)