savehub-cli 1.0.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.
- savehub_cli-1.0.0/LICENSE +21 -0
- savehub_cli-1.0.0/PKG-INFO +126 -0
- savehub_cli-1.0.0/README.md +95 -0
- savehub_cli-1.0.0/pyproject.toml +50 -0
- savehub_cli-1.0.0/setup.cfg +4 -0
- savehub_cli-1.0.0/src/savehub_cli/__init__.py +8 -0
- savehub_cli-1.0.0/src/savehub_cli/config.py +25 -0
- savehub_cli-1.0.0/src/savehub_cli/main.py +73 -0
- savehub_cli-1.0.0/src/savehub_cli/modules/__init__.py +12 -0
- savehub_cli-1.0.0/src/savehub_cli/modules/downloader.py +415 -0
- savehub_cli-1.0.0/src/savehub_cli/modules/menu.py +348 -0
- savehub_cli-1.0.0/src/savehub_cli/modules/utils.py +85 -0
- savehub_cli-1.0.0/src/savehub_cli/translations.py +119 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/PKG-INFO +126 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/SOURCES.txt +17 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/dependency_links.txt +1 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/entry_points.txt +3 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/requires.txt +5 -0
- savehub_cli-1.0.0/src/savehub_cli.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Sadiq Musayev
|
|
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.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: savehub-cli
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Multilingual CLI tool to download videos, audio and images from social media platforms
|
|
5
|
+
Author: Sadiq Musayev
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Sadiq-Musayev/SaveHub-CLI
|
|
8
|
+
Project-URL: Repository, https://github.com/Sadiq-Musayev/SaveHub-CLI
|
|
9
|
+
Project-URL: Issues, https://github.com/Sadiq-Musayev/SaveHub-CLI/issues
|
|
10
|
+
Keywords: youtube,instagram,downloader,cli,mp3,mp4,social-media
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Topic :: Multimedia :: Video
|
|
21
|
+
Classifier: Topic :: Utilities
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: yt-dlp>=2024.1.0
|
|
26
|
+
Requires-Dist: questionary>=2.0.0
|
|
27
|
+
Requires-Dist: colorama>=0.4.6
|
|
28
|
+
Requires-Dist: requests>=2.31.0
|
|
29
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# SaveHub CLI
|
|
33
|
+
|
|
34
|
+
**Multilingual social media downloader — MP4 · MP3 · Silent Video**
|
|
35
|
+
|
|
36
|
+
> Supports: 🇦🇿 Azərbaycanca · 🇬🇧 English · 🇹🇷 Türkçe
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Install
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
pip install savehub-cli
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> **Requires Python 3.10+** and [FFmpeg](https://ffmpeg.org/download.html) (for MP3 conversion).
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Usage
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
savehub-cli
|
|
54
|
+
# or
|
|
55
|
+
savehub
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
1. Select your language
|
|
59
|
+
2. Choose **Start Download Tool**
|
|
60
|
+
3. Paste any supported URL
|
|
61
|
+
4. Select format: **MP4 · MP3 · Silent Video**
|
|
62
|
+
5. Files are saved to the `downloads/` folder
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Supported Platforms
|
|
67
|
+
|
|
68
|
+
| Platform | Video | Audio | Photo |
|
|
69
|
+
|-------------|:-----:|:-----:|:-----:|
|
|
70
|
+
| YouTube | ✅ | ✅ | — |
|
|
71
|
+
| Instagram | ✅ | ✅ | ✅ |
|
|
72
|
+
| Facebook | ✅ | — | — |
|
|
73
|
+
| X (Twitter) | ✅ | — | — |
|
|
74
|
+
| LinkedIn | ✅ | — | — |
|
|
75
|
+
| Snapchat | ✅ | — | — |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Download Formats
|
|
80
|
+
|
|
81
|
+
| Format | Description |
|
|
82
|
+
|--------------|------------------------------|
|
|
83
|
+
| MP4 | Video + Audio (best quality) |
|
|
84
|
+
| MP3 | Audio only (192kbps) |
|
|
85
|
+
| Silent Video | Video only, no audio |
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Controls During Download
|
|
90
|
+
|
|
91
|
+
| Key | Action |
|
|
92
|
+
|-----|----------------|
|
|
93
|
+
| `S` | Pause / Resume |
|
|
94
|
+
| `C` | Cancel |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Requirements
|
|
99
|
+
|
|
100
|
+
- Python ≥ 3.10
|
|
101
|
+
- FFmpeg (for MP3 export) — [Download here](https://ffmpeg.org/download.html)
|
|
102
|
+
- Dependencies: `yt-dlp`, `questionary`, `colorama`, `requests`, `python-dotenv`
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Logs
|
|
107
|
+
|
|
108
|
+
All download events are saved in `logs/YYYY-MM-DD.log`.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Contributing
|
|
113
|
+
|
|
114
|
+
1. Fork the repo
|
|
115
|
+
2. Create your branch: `git checkout -b feature/my-feature`
|
|
116
|
+
3. Commit: `git commit -m "Add my feature"`
|
|
117
|
+
4. Push: `git push origin feature/my-feature`
|
|
118
|
+
5. Open a Pull Request
|
|
119
|
+
|
|
120
|
+
Bug reports and feature requests → [GitHub Issues](https://github.com/Sadiq-Musayev/SaveHub-CLI/issues)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
[MIT](LICENSE) © 2025 Sadiq Musayev
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# SaveHub CLI
|
|
2
|
+
|
|
3
|
+
**Multilingual social media downloader — MP4 · MP3 · Silent Video**
|
|
4
|
+
|
|
5
|
+
> Supports: 🇦🇿 Azərbaycanca · 🇬🇧 English · 🇹🇷 Türkçe
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install savehub-cli
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
> **Requires Python 3.10+** and [FFmpeg](https://ffmpeg.org/download.html) (for MP3 conversion).
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
savehub-cli
|
|
23
|
+
# or
|
|
24
|
+
savehub
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
1. Select your language
|
|
28
|
+
2. Choose **Start Download Tool**
|
|
29
|
+
3. Paste any supported URL
|
|
30
|
+
4. Select format: **MP4 · MP3 · Silent Video**
|
|
31
|
+
5. Files are saved to the `downloads/` folder
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Supported Platforms
|
|
36
|
+
|
|
37
|
+
| Platform | Video | Audio | Photo |
|
|
38
|
+
|-------------|:-----:|:-----:|:-----:|
|
|
39
|
+
| YouTube | ✅ | ✅ | — |
|
|
40
|
+
| Instagram | ✅ | ✅ | ✅ |
|
|
41
|
+
| Facebook | ✅ | — | — |
|
|
42
|
+
| X (Twitter) | ✅ | — | — |
|
|
43
|
+
| LinkedIn | ✅ | — | — |
|
|
44
|
+
| Snapchat | ✅ | — | — |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Download Formats
|
|
49
|
+
|
|
50
|
+
| Format | Description |
|
|
51
|
+
|--------------|------------------------------|
|
|
52
|
+
| MP4 | Video + Audio (best quality) |
|
|
53
|
+
| MP3 | Audio only (192kbps) |
|
|
54
|
+
| Silent Video | Video only, no audio |
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Controls During Download
|
|
59
|
+
|
|
60
|
+
| Key | Action |
|
|
61
|
+
|-----|----------------|
|
|
62
|
+
| `S` | Pause / Resume |
|
|
63
|
+
| `C` | Cancel |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Requirements
|
|
68
|
+
|
|
69
|
+
- Python ≥ 3.10
|
|
70
|
+
- FFmpeg (for MP3 export) — [Download here](https://ffmpeg.org/download.html)
|
|
71
|
+
- Dependencies: `yt-dlp`, `questionary`, `colorama`, `requests`, `python-dotenv`
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Logs
|
|
76
|
+
|
|
77
|
+
All download events are saved in `logs/YYYY-MM-DD.log`.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Contributing
|
|
82
|
+
|
|
83
|
+
1. Fork the repo
|
|
84
|
+
2. Create your branch: `git checkout -b feature/my-feature`
|
|
85
|
+
3. Commit: `git commit -m "Add my feature"`
|
|
86
|
+
4. Push: `git push origin feature/my-feature`
|
|
87
|
+
5. Open a Pull Request
|
|
88
|
+
|
|
89
|
+
Bug reports and feature requests → [GitHub Issues](https://github.com/Sadiq-Musayev/SaveHub-CLI/issues)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## License
|
|
94
|
+
|
|
95
|
+
[MIT](LICENSE) © 2025 Sadiq Musayev
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "savehub-cli"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Multilingual CLI tool to download videos, audio and images from social media platforms"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Sadiq Musayev" }
|
|
14
|
+
]
|
|
15
|
+
keywords = ["youtube", "instagram", "downloader", "cli", "mp3", "mp4", "social-media"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 5 - Production/Stable",
|
|
18
|
+
"Environment :: Console",
|
|
19
|
+
"Intended Audience :: End Users/Desktop",
|
|
20
|
+
"License :: OSI Approved :: MIT License",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Topic :: Multimedia :: Video",
|
|
27
|
+
"Topic :: Utilities",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"yt-dlp>=2024.1.0",
|
|
31
|
+
"questionary>=2.0.0",
|
|
32
|
+
"colorama>=0.4.6",
|
|
33
|
+
"requests>=2.31.0",
|
|
34
|
+
"python-dotenv>=1.0.0",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
[project.scripts]
|
|
38
|
+
savehub-cli = "savehub_cli.main:main"
|
|
39
|
+
savehub = "savehub_cli.main:main"
|
|
40
|
+
|
|
41
|
+
[project.urls]
|
|
42
|
+
Homepage = "https://github.com/Sadiq-Musayev/SaveHub-CLI"
|
|
43
|
+
Repository = "https://github.com/Sadiq-Musayev/SaveHub-CLI"
|
|
44
|
+
Issues = "https://github.com/Sadiq-Musayev/SaveHub-CLI/issues"
|
|
45
|
+
|
|
46
|
+
[tool.setuptools.packages.find]
|
|
47
|
+
where = ["src"]
|
|
48
|
+
|
|
49
|
+
[tool.setuptools.package-data]
|
|
50
|
+
"savehub_cli" = ["py.typed"]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# SaveHub CLI - Configuration
|
|
2
|
+
|
|
3
|
+
LANGUAGES = ['AZ', 'EN', 'TR']
|
|
4
|
+
|
|
5
|
+
PLATFORM_CONFIG = {
|
|
6
|
+
'YouTube': {'patterns': ['youtube.com', 'youtu.be'], 'supports': ['video', 'playlist', 'audio']},
|
|
7
|
+
'Instagram': {'patterns': ['instagram.com'], 'supports': ['video', 'photo']},
|
|
8
|
+
'Facebook': {'patterns': ['facebook.com', 'fb.watch'], 'supports': ['video']},
|
|
9
|
+
'Twitter/X': {'patterns': ['twitter.com', 'x.com'], 'supports': ['video', 'gif']},
|
|
10
|
+
'LinkedIn': {'patterns': ['linkedin.com'], 'supports': ['video']},
|
|
11
|
+
'Snapchat': {'patterns': ['snapchat.com'], 'supports': ['video']},
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
FORMAT_SETTINGS = {
|
|
15
|
+
'date_format': '%Y-%m-%d',
|
|
16
|
+
'time_format': '%H:%M:%S',
|
|
17
|
+
'log_filename_format': '%Y-%m-%d',
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
DOWNLOAD_SETTINGS = {
|
|
21
|
+
'output_dir': 'downloads',
|
|
22
|
+
'log_dir': 'logs',
|
|
23
|
+
'mp3_quality': '192',
|
|
24
|
+
'default_format': 'mp4',
|
|
25
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
SaveHub CLI - Main Entry Point
|
|
3
|
+
Multilingual Multimedia Downloader
|
|
4
|
+
Supports: Azərbaycanca (AZ), English (EN), Türkçe (TR)
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import sys
|
|
8
|
+
import os
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
"""Main application entry point — called by pip-installed console script."""
|
|
14
|
+
|
|
15
|
+
# Ensure working directories exist in user's CWD (not package dir)
|
|
16
|
+
Path('downloads').mkdir(exist_ok=True)
|
|
17
|
+
Path('logs').mkdir(exist_ok=True)
|
|
18
|
+
|
|
19
|
+
from savehub_cli.modules.menu import select_language, show_main_menu, display_header
|
|
20
|
+
from savehub_cli.modules.menu import show_documentation, show_terms, show_feedback
|
|
21
|
+
from savehub_cli.modules.downloader import start_download
|
|
22
|
+
from savehub_cli.translations import get_text
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
language = select_language()
|
|
26
|
+
|
|
27
|
+
while True:
|
|
28
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
29
|
+
display_header(language)
|
|
30
|
+
|
|
31
|
+
choice = show_main_menu(language)
|
|
32
|
+
|
|
33
|
+
if choice == 'option_docs':
|
|
34
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
35
|
+
show_documentation(language)
|
|
36
|
+
input(f"\n{get_text('press_enter', language)}")
|
|
37
|
+
|
|
38
|
+
elif choice == 'option_terms':
|
|
39
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
40
|
+
show_terms(language)
|
|
41
|
+
input(f"\n{get_text('press_enter', language)}")
|
|
42
|
+
|
|
43
|
+
elif choice == 'option_feedback':
|
|
44
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
45
|
+
show_feedback(language)
|
|
46
|
+
input(f"\n{get_text('press_enter', language)}")
|
|
47
|
+
|
|
48
|
+
elif choice == 'option_start':
|
|
49
|
+
start_download(language)
|
|
50
|
+
|
|
51
|
+
elif choice == 'option_exit':
|
|
52
|
+
os.system('cls' if os.name == 'nt' else 'clear')
|
|
53
|
+
print(f"\n{get_text('goodbye', language)}")
|
|
54
|
+
print(f"{get_text('see_you', language)}\n")
|
|
55
|
+
break
|
|
56
|
+
|
|
57
|
+
except (KeyboardInterrupt, EOFError):
|
|
58
|
+
print("\n\n👋 Goodbye!")
|
|
59
|
+
sys.exit(0)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
import traceback
|
|
62
|
+
log_msg = traceback.format_exc()
|
|
63
|
+
try:
|
|
64
|
+
from savehub_cli.modules.utils import log_event
|
|
65
|
+
log_event(f"Unhandled exception: {log_msg}", 'ERROR')
|
|
66
|
+
except Exception:
|
|
67
|
+
pass
|
|
68
|
+
print("\n❌ Unexpected error occurred. Check logs for details.")
|
|
69
|
+
sys.exit(1)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if __name__ == "__main__":
|
|
73
|
+
main()
|