max-cli 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- max_cli-0.2.0/LICENSE +21 -0
- max_cli-0.2.0/PKG-INFO +632 -0
- max_cli-0.2.0/README.md +603 -0
- max_cli-0.2.0/pyproject.toml +42 -0
- max_cli-0.2.0/setup.cfg +4 -0
- max_cli-0.2.0/src/max_cli/__init__.py +0 -0
- max_cli-0.2.0/src/max_cli/common/cache.py +145 -0
- max_cli-0.2.0/src/max_cli/common/concurrent.py +83 -0
- max_cli-0.2.0/src/max_cli/common/exceptions.py +40 -0
- max_cli-0.2.0/src/max_cli/common/logger.py +22 -0
- max_cli-0.2.0/src/max_cli/common/logging.py +24 -0
- max_cli-0.2.0/src/max_cli/common/retry.py +51 -0
- max_cli-0.2.0/src/max_cli/common/utils.py +40 -0
- max_cli-0.2.0/src/max_cli/config.py +43 -0
- max_cli-0.2.0/src/max_cli/core/ai_engine.py +541 -0
- max_cli-0.2.0/src/max_cli/core/file_organizer.py +254 -0
- max_cli-0.2.0/src/max_cli/core/image_processor.py +139 -0
- max_cli-0.2.0/src/max_cli/core/media_engine.py +681 -0
- max_cli-0.2.0/src/max_cli/core/network_engine.py +103 -0
- max_cli-0.2.0/src/max_cli/core/pdf_engine.py +520 -0
- max_cli-0.2.0/src/max_cli/core/system_engine.py +57 -0
- max_cli-0.2.0/src/max_cli/interface/cli_ai.py +376 -0
- max_cli-0.2.0/src/max_cli/interface/cli_config.py +363 -0
- max_cli-0.2.0/src/max_cli/interface/cli_files.py +388 -0
- max_cli-0.2.0/src/max_cli/interface/cli_images.py +176 -0
- max_cli-0.2.0/src/max_cli/interface/cli_media.py +558 -0
- max_cli-0.2.0/src/max_cli/interface/cli_network.py +174 -0
- max_cli-0.2.0/src/max_cli/interface/cli_pdf.py +651 -0
- max_cli-0.2.0/src/max_cli/interface/cli_tools.py +60 -0
- max_cli-0.2.0/src/max_cli/main.py +91 -0
- max_cli-0.2.0/src/max_cli/plugins/__init__.py +4 -0
- max_cli-0.2.0/src/max_cli/plugins/base.py +39 -0
- max_cli-0.2.0/src/max_cli/plugins/manager.py +81 -0
- max_cli-0.2.0/src/max_cli.egg-info/PKG-INFO +632 -0
- max_cli-0.2.0/src/max_cli.egg-info/SOURCES.txt +44 -0
- max_cli-0.2.0/src/max_cli.egg-info/dependency_links.txt +1 -0
- max_cli-0.2.0/src/max_cli.egg-info/entry_points.txt +2 -0
- max_cli-0.2.0/src/max_cli.egg-info/requires.txt +21 -0
- max_cli-0.2.0/src/max_cli.egg-info/top_level.txt +1 -0
- max_cli-0.2.0/tests/test_cli_images.py +68 -0
- max_cli-0.2.0/tests/test_core_ai.py +203 -0
- max_cli-0.2.0/tests/test_core_file_organizer.py +110 -0
- max_cli-0.2.0/tests/test_core_images.py +42 -0
- max_cli-0.2.0/tests/test_core_media.py +171 -0
- max_cli-0.2.0/tests/test_core_network.py +134 -0
- max_cli-0.2.0/tests/test_core_pdf.py +140 -0
max_cli-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Abubakr Alsheikh
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
max_cli-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: max-cli
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: The Local, Fast, & Lazy Terminal Assistant for high-performance tasks.
|
|
5
|
+
Author-email: Abubakr Alsheikh <abubakralsheikh@outlook.com>
|
|
6
|
+
Requires-Python: >=3.9
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: typer>=0.12.0
|
|
10
|
+
Requires-Dist: rich>=13.0.0
|
|
11
|
+
Requires-Dist: shellingham>=1.5.0
|
|
12
|
+
Requires-Dist: pillow>=10.0.0
|
|
13
|
+
Requires-Dist: pymupdf>=1.22.0
|
|
14
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
15
|
+
Requires-Dist: openai>=1.0.0
|
|
16
|
+
Requires-Dist: requests>=2.31.0
|
|
17
|
+
Requires-Dist: yt-dlp>=2023.0.0
|
|
18
|
+
Requires-Dist: segno>=1.5.0
|
|
19
|
+
Requires-Dist: pyperclip>=1.8.0
|
|
20
|
+
Provides-Extra: dev
|
|
21
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
22
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
23
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
24
|
+
Requires-Dist: mkdocs>=1.5.0; extra == "dev"
|
|
25
|
+
Requires-Dist: mkdocs-material>=9.0.0; extra == "dev"
|
|
26
|
+
Provides-Extra: ocr
|
|
27
|
+
Requires-Dist: pytesseract>=0.3.10; extra == "ocr"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# Max CLI β‘
|
|
31
|
+
|
|
32
|
+
[](https://pypi.org/project/max-cli/)
|
|
33
|
+
[](https://pypi.org/project/max-cli/)
|
|
34
|
+
[](https://github.com/Abubakr-Alsheikh/max-cli/blob/main/LICENSE)
|
|
35
|
+
[](https://github.com/Abubakr-Alsheikh/max-cli/actions)
|
|
36
|
+
[](https://Abubakr-Alsheikh.github.io/max-cli/)
|
|
37
|
+
|
|
38
|
+
> **Your Lazy, Fast Terminal Assistant That Does the Work for You.**
|
|
39
|
+
|
|
40
|
+
Max transforms complex tasksβlike compressing videos, merging PDFs, or downloading from YouTubeβinto simple commands you can actually remember. Whether you're a casual user or a seasoned developer, Max speaks your language.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## π Documentation
|
|
45
|
+
|
|
46
|
+
**Full docs:** https://Abubakr-Alsheikh.github.io/max-cli/
|
|
47
|
+
|
|
48
|
+
**Quick links:**
|
|
49
|
+
- [Installation](https://Abubakr-Alsheikh.github.io/max-cli/installation/)
|
|
50
|
+
- [Usage](https://Abubakr-Alsheikh.github.io/max-cli/usage/)
|
|
51
|
+
- [Commands](https://Abubakr-Alsheikh.github.io/max-cli/commands/)
|
|
52
|
+
- [API Reference](https://Abubakr-Alsheikh.github.io/max-cli/api/)
|
|
53
|
+
- [Contributing](https://Abubakr-Alsheikh.github.io/max-cli/contributing/)
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## π€ What Can Max Do?
|
|
58
|
+
|
|
59
|
+
| Task | Max Command | Example |
|
|
60
|
+
|------|-------------|---------|
|
|
61
|
+
| **Compress videos** | `max video compress` | `max video compress movie.mp4` |
|
|
62
|
+
| **Convert video to audio** | `max video to-audio` | `max video to-audio podcast.mp4` |
|
|
63
|
+
| **Download videos/music** | `max grab` | `max grab "youtube.com/..."` |
|
|
64
|
+
| **Merge PDFs** | `max pdf bundle` | `max pdf bundle contracts/` |
|
|
65
|
+
| **Compress images** | `max img compress` | `max img compress photos/` |
|
|
66
|
+
| **Resize images** | `max img resize` | `max img resize logo.png --width 800` |
|
|
67
|
+
| **Ask AI anything** | `max ai ask` | `max ai ask "Merge and Compress those pdf files"` |
|
|
68
|
+
| **Generate images** | `max ai create` | `max ai create "A cat on a bike"` |
|
|
69
|
+
| **Organize files** | `max files smart-sort` | `max files smart-sort downloads/` |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## π Quick Start (5 Minutes)
|
|
74
|
+
|
|
75
|
+
### Step 1: Install Python
|
|
76
|
+
|
|
77
|
+
Max runs on Python. If you don't have it:
|
|
78
|
+
|
|
79
|
+
- **Windows:** Download from [python.org](https://python.org) (check "Add to PATH")
|
|
80
|
+
- **Mac:** Open Terminal and run: `brew install python`
|
|
81
|
+
- **Linux:** `sudo apt install python3`
|
|
82
|
+
|
|
83
|
+
### Step 2: Install FFmpeg (For Video/Audio)
|
|
84
|
+
|
|
85
|
+
Max needs FFmpeg to process videos. Don't worry, it's easy:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Mac
|
|
89
|
+
brew install ffmpeg
|
|
90
|
+
|
|
91
|
+
# Windows (run in PowerShell or Command Prompt)
|
|
92
|
+
winget install Gyan.FFmpeg
|
|
93
|
+
|
|
94
|
+
# Linux
|
|
95
|
+
sudo apt install ffmpeg
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Step 3: Install Max
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
# Clone and install
|
|
102
|
+
git clone https://github.com/Abubakr-Alsheikh/max-cli.git
|
|
103
|
+
cd max-cli
|
|
104
|
+
pip install -e .
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Step 4: Configure AI (Optional but Recommended)
|
|
108
|
+
|
|
109
|
+
Max's AI features need an API key. The easiest setup:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
max config setup
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
This wizard will guide you through:
|
|
116
|
+
|
|
117
|
+
- Choosing your AI provider (Google Gemini, OpenAI, or custom)
|
|
118
|
+
- Entering your API key
|
|
119
|
+
- Setting preferences
|
|
120
|
+
|
|
121
|
+
**Get a free API key:**
|
|
122
|
+
|
|
123
|
+
- [Google AI Studio](https://aistudio.google.com/app/apikey) - Free tier available
|
|
124
|
+
- [OpenAI](https://platform.openai.com/api-keys) - Pay-as-you-go
|
|
125
|
+
|
|
126
|
+
### Step 5: Start Using Max
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# See all available commands
|
|
130
|
+
max --help
|
|
131
|
+
|
|
132
|
+
# Download a video
|
|
133
|
+
max grab "https://youtube.com/watch?v=..."
|
|
134
|
+
|
|
135
|
+
# Compress a video
|
|
136
|
+
max video compress mymovie.mp4
|
|
137
|
+
|
|
138
|
+
# Compress images in a folder
|
|
139
|
+
max img compress ./photos
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## π User Guide
|
|
145
|
+
|
|
146
|
+
### π₯ Video & Audio
|
|
147
|
+
|
|
148
|
+
#### Compress Video (Shrink File Size)
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Simple compression
|
|
152
|
+
max video compress video.mp4
|
|
153
|
+
|
|
154
|
+
# High quality compression
|
|
155
|
+
max video compress video.mp4 --preset high
|
|
156
|
+
|
|
157
|
+
# Specific quality (1-100)
|
|
158
|
+
max video compress video.mp4 -q 75
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### Convert Video to Audio
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# To MP3 (default, high quality)
|
|
165
|
+
max video to-audio lecture.mp4
|
|
166
|
+
|
|
167
|
+
# To WAV (lossless, for editing)
|
|
168
|
+
max video to-audio lecture.mp4 --format wav
|
|
169
|
+
|
|
170
|
+
# To MP3 320kbps
|
|
171
|
+
max video to-audio lecture.mp4 -q x
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
#### Trim/Cut Video
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
# Cut from 0:30 to 1:00
|
|
178
|
+
max video cut movie.mp4 --start 0:30 --end 1:00
|
|
179
|
+
|
|
180
|
+
# First 30 seconds only
|
|
181
|
+
max video cut movie.mp4 --duration 30
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### Other Video Commands
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
max video gif clip.mp4 # Convert to GIF
|
|
188
|
+
max video louder audio.mp4 --db 10 # Boost volume by 10dB
|
|
189
|
+
max video snap video.mp4 --time 1:30 # Take screenshot at 1:30
|
|
190
|
+
max video mute video.mp4 # Remove audio track
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
### π PDF Documents
|
|
196
|
+
|
|
197
|
+
#### Merge PDFs
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
# Merge all PDFs in a folder
|
|
201
|
+
max pdf bundle mydocs/
|
|
202
|
+
|
|
203
|
+
# Merge specific files
|
|
204
|
+
max pdf bundle file1.pdf file2.pdf
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
#### Split PDF
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Extract pages 1-5 and page 8
|
|
211
|
+
max pdf split document.pdf -p 1-5,8
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
#### Compress PDF
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
max pdf compress large.pdf
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
#### Add Watermark
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
max pdf stamp document.pdf "CONFIDENTIAL"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
#### Password Protect
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
max pdf lock document.pdf
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
### π₯ Downloading (YouTube, Spotify, etc.)
|
|
235
|
+
|
|
236
|
+
Download from almost any website:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Download video (best quality)
|
|
240
|
+
max grab "https://youtube.com/watch?v=..."
|
|
241
|
+
|
|
242
|
+
# Download audio only (MP3)
|
|
243
|
+
max grab "https://youtube.com/watch?v=..." -a
|
|
244
|
+
|
|
245
|
+
# Choose quality: s=480p, m=720p, h=1080p, x=4K
|
|
246
|
+
max grab "..." -q h
|
|
247
|
+
|
|
248
|
+
# Download a playlist
|
|
249
|
+
max grab "https://youtube.com/playlist?list=..."
|
|
250
|
+
|
|
251
|
+
# Download specific video from playlist
|
|
252
|
+
max grab "..." -i 3
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
#### Quality Presets Explained
|
|
256
|
+
|
|
257
|
+
| Flag | Video Quality | Audio Quality | Best For |
|
|
258
|
+
|------|---------------|---------------|----------|
|
|
259
|
+
| `-q s` | 480p | 64kbps | Saving data |
|
|
260
|
+
| `-q m` | 720p | 128kbps | Phone viewing |
|
|
261
|
+
| `-q h` | 1080p | 192kbps | Desktop viewing |
|
|
262
|
+
| `-q x` | 4K | 320kbps | Best quality |
|
|
263
|
+
|
|
264
|
+
#### Save Your Download Preferences
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# Set your defaults once
|
|
268
|
+
max config grab
|
|
269
|
+
|
|
270
|
+
# Now just run:
|
|
271
|
+
max grab "url" # Uses your saved preferences
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### πΌ Images
|
|
277
|
+
|
|
278
|
+
#### Compress Images
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
# Compress all images in folder (75% quality)
|
|
282
|
+
max img compress ./photos
|
|
283
|
+
|
|
284
|
+
# Compress single image
|
|
285
|
+
max img compress photo.jpg
|
|
286
|
+
|
|
287
|
+
# Force JPEG output
|
|
288
|
+
max img compress ./photos --jpeg
|
|
289
|
+
|
|
290
|
+
# Limit max dimension to 1080px
|
|
291
|
+
max img compress ./photos --max 1080
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
#### Resize Images
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# Resize to specific width
|
|
298
|
+
max img resize image.png --width 800
|
|
299
|
+
|
|
300
|
+
# Resize to specific height
|
|
301
|
+
max img resize image.png --height 600
|
|
302
|
+
|
|
303
|
+
# Scale down by percentage
|
|
304
|
+
max img resize image.png --scale 50
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
#### Convert Format
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Convert to WebP (modern, smaller)
|
|
311
|
+
max img convert photo.jpg --to webp
|
|
312
|
+
|
|
313
|
+
# Convert to PNG
|
|
314
|
+
max img convert photo.png --to png
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
#### Remove Metadata (Privacy)
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# Strip EXIF data (GPS, camera info, etc)
|
|
321
|
+
max img strip ./photos
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
### π€ AI Assistant
|
|
327
|
+
|
|
328
|
+
Max has a smart AI that understands what you want.
|
|
329
|
+
|
|
330
|
+
#### Ask Anything
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
# Get help with a task
|
|
334
|
+
max ai ask "How do I compress this video?"
|
|
335
|
+
|
|
336
|
+
# In a folder with a file, just describe what you want
|
|
337
|
+
max ai ask "Make this image smaller"
|
|
338
|
+
# Max figures out which file you mean!
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### Analyze Images
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
# Analyze a screenshot
|
|
345
|
+
max ai analyze screenshot.png -p "What error is shown?"
|
|
346
|
+
|
|
347
|
+
# Extract data from receipt
|
|
348
|
+
max ai analyze receipt.jpg -p "What is the total amount?"
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
#### Generate Images
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
# Create from text description
|
|
355
|
+
max ai create "A cute cat sitting on a beach" -o cat.png
|
|
356
|
+
|
|
357
|
+
# Edit existing image
|
|
358
|
+
max ai edit photo.jpg "Add a sunset background" -o new_photo.jpg
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
#### Chat Mode
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
# Start an interactive conversation
|
|
365
|
+
max ai chat
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
### π File Management
|
|
371
|
+
|
|
372
|
+
#### Smart Sort (AI Organizer)
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# Automatically organize files into categories
|
|
376
|
+
max files smart-sort ./downloads
|
|
377
|
+
|
|
378
|
+
# Max reads filenames and sorts them into folders like:
|
|
379
|
+
# Invoices/, Images/, Documents/, etc.
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
#### Rename Sequentially
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# Rename to 1_file, 2_file, etc.
|
|
386
|
+
max files order ./photos
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
### π§ System Tools
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
# Generate QR code from URL
|
|
395
|
+
max share "https://example.com"
|
|
396
|
+
|
|
397
|
+
# Copy file contents to clipboard
|
|
398
|
+
max copy file.txt
|
|
399
|
+
|
|
400
|
+
# Save clipboard image to file
|
|
401
|
+
max paste screenshot.png
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## βοΈ Configuration
|
|
407
|
+
|
|
408
|
+
### Setting Up Your API Key
|
|
409
|
+
|
|
410
|
+
The easiest way:
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
max config setup
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Manual Configuration
|
|
417
|
+
|
|
418
|
+
Create a `.env` file in your project folder:
|
|
419
|
+
|
|
420
|
+
```ini
|
|
421
|
+
# For Google Gemini (recommended - has free tier)
|
|
422
|
+
OPENAI_API_KEY=your_api_key_here
|
|
423
|
+
OPENAI_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai/
|
|
424
|
+
AI_MODEL=gemini-1.5-flash
|
|
425
|
+
AI_IMAGE_MODEL=gemini-2.0-flash-exp
|
|
426
|
+
|
|
427
|
+
# For OpenAI
|
|
428
|
+
OPENAI_API_KEY=sk-...
|
|
429
|
+
OPENAI_BASE_URL=https://api.openai.com/v1
|
|
430
|
+
AI_MODEL=gpt-4o-mini
|
|
431
|
+
|
|
432
|
+
# Default settings
|
|
433
|
+
DEFAULT_QUALITY=80
|
|
434
|
+
GRAB_QUALITY=h
|
|
435
|
+
GRAB_AUDIO_FORMAT=mp3
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Configuration Locations
|
|
439
|
+
|
|
440
|
+
- **Global:** `~/.max_config.env` - Applied everywhere
|
|
441
|
+
- **Local:** `.env` - Applied to current folder
|
|
442
|
+
|
|
443
|
+
Local settings override global settings.
|
|
444
|
+
|
|
445
|
+
### Other Config Commands
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
max config show # View current configuration
|
|
449
|
+
max config grab # Configure downloader defaults
|
|
450
|
+
max config save # Save local settings as global defaults
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## π‘ Tips & Tricks
|
|
456
|
+
|
|
457
|
+
### Working with Folders
|
|
458
|
+
|
|
459
|
+
Most commands work on folders too:
|
|
460
|
+
|
|
461
|
+
```bash
|
|
462
|
+
# Compress ALL images in a folder
|
|
463
|
+
max img compress ./videos
|
|
464
|
+
|
|
465
|
+
# Merge ALL PDFs in a folder
|
|
466
|
+
max pdf bundle ./documents
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### Default Directory
|
|
470
|
+
|
|
471
|
+
If you don't specify a path, Max uses the current folder:
|
|
472
|
+
|
|
473
|
+
```bash
|
|
474
|
+
cd ./myphotos
|
|
475
|
+
max img compress # Compresses everything in myphotos
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
### Chain Commands
|
|
479
|
+
|
|
480
|
+
You can run multiple commands:
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
# Merge PDFs then compress
|
|
484
|
+
max pdf bundle ./docs && max pdf compress merged.pdf
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Get Help
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
# See all commands
|
|
491
|
+
max --help
|
|
492
|
+
|
|
493
|
+
# See help for specific command
|
|
494
|
+
max video --help
|
|
495
|
+
max img --help
|
|
496
|
+
max pdf --help
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## π Troubleshooting
|
|
502
|
+
|
|
503
|
+
### "FFmpeg not found"
|
|
504
|
+
|
|
505
|
+
Install FFmpeg (see Step 2 above) and restart your terminal.
|
|
506
|
+
|
|
507
|
+
### "API key not found"
|
|
508
|
+
|
|
509
|
+
Run `max config setup` to configure your AI provider.
|
|
510
|
+
|
|
511
|
+
### "Permission denied" (Windows)
|
|
512
|
+
|
|
513
|
+
Run Command Prompt as Administrator, or use a virtual environment.
|
|
514
|
+
|
|
515
|
+
### Something else not working?
|
|
516
|
+
|
|
517
|
+
- Check: `max --version`
|
|
518
|
+
- Get help: `max --help`
|
|
519
|
+
- Report issues: [GitHub Issues](https://github.com/Abubakr-Alsheikh/max-cli/issues)
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
## π§ For Developers
|
|
524
|
+
|
|
525
|
+
### Installation (Development Mode)
|
|
526
|
+
|
|
527
|
+
```bash
|
|
528
|
+
# Clone
|
|
529
|
+
git clone https://github.com/Abubakr-Alsheikh/max-cli.git
|
|
530
|
+
cd max-cli
|
|
531
|
+
|
|
532
|
+
# Install with dev dependencies
|
|
533
|
+
pip install -e .[dev]
|
|
534
|
+
|
|
535
|
+
# Run tests
|
|
536
|
+
pytest tests/
|
|
537
|
+
|
|
538
|
+
# Lint code
|
|
539
|
+
ruff check .
|
|
540
|
+
ruff format .
|
|
541
|
+
|
|
542
|
+
# Type check
|
|
543
|
+
mypy src/
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Documentation
|
|
547
|
+
|
|
548
|
+
Full documentation is available at: https://Abubakr-Alsheikh.github.io/max-cli/
|
|
549
|
+
|
|
550
|
+
Local documentation development:
|
|
551
|
+
|
|
552
|
+
```bash
|
|
553
|
+
# Install mkdocs
|
|
554
|
+
pip install mkdocs mkdocs-material
|
|
555
|
+
|
|
556
|
+
# Serve locally
|
|
557
|
+
mkdocs serve
|
|
558
|
+
|
|
559
|
+
# Build for production
|
|
560
|
+
mkdocs build
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### Plugin System
|
|
564
|
+
|
|
565
|
+
Max CLI supports plugins for extensibility. Plugins are stored in:
|
|
566
|
+
- `~/.max_cli/plugins/` (user-level)
|
|
567
|
+
- `./plugins/` (project-level)
|
|
568
|
+
|
|
569
|
+
Example plugin structure:
|
|
570
|
+
|
|
571
|
+
```python
|
|
572
|
+
from max_cli.plugins.base import CLIPlugin
|
|
573
|
+
import typer
|
|
574
|
+
|
|
575
|
+
class MyPlugin(CLIPlugin):
|
|
576
|
+
@property
|
|
577
|
+
def name(self) -> str:
|
|
578
|
+
return "my-plugin"
|
|
579
|
+
|
|
580
|
+
@property
|
|
581
|
+
def version(self) -> str:
|
|
582
|
+
return "1.0.0"
|
|
583
|
+
|
|
584
|
+
@property
|
|
585
|
+
def description(self) -> str:
|
|
586
|
+
return "My custom plugin"
|
|
587
|
+
|
|
588
|
+
def register(self, app: typer.Typer) -> None:
|
|
589
|
+
@app.command("my-command")
|
|
590
|
+
def my_command():
|
|
591
|
+
typer.echo("Hello from my plugin!")
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### Architecture
|
|
595
|
+
|
|
596
|
+
```
|
|
597
|
+
src/max_cli/
|
|
598
|
+
βββ core/ # Business logic (engines)
|
|
599
|
+
βββ interface/ # CLI commands (Typer)
|
|
600
|
+
βββ common/ # Shared utilities
|
|
601
|
+
βββ __init__.py # Package exports
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## π€ Contributing
|
|
607
|
+
|
|
608
|
+
Found a bug or have a feature request?
|
|
609
|
+
|
|
610
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.
|
|
611
|
+
|
|
612
|
+
1. Open an issue: [GitHub Issues](https://github.com/Abubakr-Alsheikh/max-cli/issues)
|
|
613
|
+
2. Fork the repo
|
|
614
|
+
3. Submit a PR
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## π License
|
|
619
|
+
|
|
620
|
+
MIT License - Free to use, modify, and distribute.
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## π Thank You
|
|
625
|
+
|
|
626
|
+
Max was built to make your life easier. If you find it useful, star the repo and share it with others!
|
|
627
|
+
|
|
628
|
+
Questions? Reach out or open an issue.
|
|
629
|
+
|
|
630
|
+
<div style="text-align: center;">
|
|
631
|
+
Build with π to make life easier
|
|
632
|
+
</div>
|