nirob 2.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.
- nirob-2.0.0/PKG-INFO +56 -0
- nirob-2.0.0/README.md +34 -0
- nirob-2.0.0/nirob/__init__.py +4 -0
- nirob-2.0.0/nirob/main.py +483 -0
- nirob-2.0.0/nirob.egg-info/PKG-INFO +56 -0
- nirob-2.0.0/nirob.egg-info/SOURCES.txt +9 -0
- nirob-2.0.0/nirob.egg-info/dependency_links.txt +1 -0
- nirob-2.0.0/nirob.egg-info/entry_points.txt +2 -0
- nirob-2.0.0/nirob.egg-info/top_level.txt +1 -0
- nirob-2.0.0/setup.cfg +4 -0
- nirob-2.0.0/setup.py +25 -0
nirob-2.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nirob
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: NIROB PIP — Auto install all essential Python packages with VIP Cyberpunk UI
|
|
5
|
+
Home-page: https://t.me/MT_0G
|
|
6
|
+
Author: NIROB
|
|
7
|
+
Author-email: your@email.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Topic :: Utilities
|
|
12
|
+
Requires-Python: >=3.6
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# NIROB PIP
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
███╗ ██╗██╗██████╗ ██████╗ ██████╗
|
|
27
|
+
████╗ ██║██║██╔══██╗██╔═══██╗██╔══██╗
|
|
28
|
+
██╔██╗ ██║██║██████╔╝██║ ██║██████╔╝
|
|
29
|
+
██║╚██╗██║██║██╔══██╗██║ ██║██╔══██╗
|
|
30
|
+
██║ ╚████║██║██║ ██║╚██████╔╝██████╔╝
|
|
31
|
+
╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═════╝
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**⚡ Powered By: NIROB | 📱 Telegram: @MT_0G | 🔖 v2.0.0**
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install nirob
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
nirob
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Automatically installs **47 essential Python packages** with a beautiful **VIP Cyberpunk terminal UI** — glitch animations, matrix rain, live progress bars, and more.
|
|
49
|
+
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- 🎨 Cyberpunk VIP terminal UI with glitch & matrix effects
|
|
53
|
+
- ⚡ Live animated progress bars with spinner
|
|
54
|
+
- 🔁 Auto-retry with alternative package names
|
|
55
|
+
- ✅ Full summary report with success/fail count
|
|
56
|
+
- 🐍 Works on Termux (Android), Linux, Windows, macOS
|
nirob-2.0.0/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# NIROB PIP
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
███╗ ██╗██╗██████╗ ██████╗ ██████╗
|
|
5
|
+
████╗ ██║██║██╔══██╗██╔═══██╗██╔══██╗
|
|
6
|
+
██╔██╗ ██║██║██████╔╝██║ ██║██████╔╝
|
|
7
|
+
██║╚██╗██║██║██╔══██╗██║ ██║██╔══██╗
|
|
8
|
+
██║ ╚████║██║██║ ██║╚██████╔╝██████╔╝
|
|
9
|
+
╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═════╝
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**⚡ Powered By: NIROB | 📱 Telegram: @MT_0G | 🔖 v2.0.0**
|
|
13
|
+
|
|
14
|
+
## Install
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install nirob
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
nirob
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Automatically installs **47 essential Python packages** with a beautiful **VIP Cyberpunk terminal UI** — glitch animations, matrix rain, live progress bars, and more.
|
|
27
|
+
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
- 🎨 Cyberpunk VIP terminal UI with glitch & matrix effects
|
|
31
|
+
- ⚡ Live animated progress bars with spinner
|
|
32
|
+
- 🔁 Auto-retry with alternative package names
|
|
33
|
+
- ✅ Full summary report with success/fail count
|
|
34
|
+
- 🐍 Works on Termux (Android), Linux, Windows, macOS
|
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import time
|
|
3
|
+
import subprocess
|
|
4
|
+
import random
|
|
5
|
+
import os
|
|
6
|
+
import shutil
|
|
7
|
+
|
|
8
|
+
VERSION = "v2.0.0"
|
|
9
|
+
TELEGRAM = "@MT_0G"
|
|
10
|
+
POWERED_BY = "NIROB"
|
|
11
|
+
|
|
12
|
+
# ═══════════════════════════════════════════════
|
|
13
|
+
# COLOR PALETTE — VIP Neon Cyberpunk
|
|
14
|
+
# ═══════════════════════════════════════════════
|
|
15
|
+
# Standard
|
|
16
|
+
BD = "\033[1m" # bold
|
|
17
|
+
DM = "\033[2m" # dim
|
|
18
|
+
RS = "\033[0m" # reset
|
|
19
|
+
W = "\033[97m" # white
|
|
20
|
+
|
|
21
|
+
# Neon palette
|
|
22
|
+
C = "\033[96m" # bright cyan — general text
|
|
23
|
+
TC = "\033[36m" # teal — dim fills
|
|
24
|
+
PR = "\033[95m" # hot magenta — accents / PIP logo
|
|
25
|
+
GD = "\033[93m" # gold/yellow — borders, brackets
|
|
26
|
+
OR = "\033[33m" # orange — bar fill (in-progress)
|
|
27
|
+
BL = "\033[94m" # electric blue — info labels
|
|
28
|
+
LB = "\033[96m" # light blue-cyan — info values
|
|
29
|
+
GR = "\033[92m" # neon green — success
|
|
30
|
+
RD = "\033[91m" # hot red — fail
|
|
31
|
+
YL = "\033[93m" # yellow — warnings / version
|
|
32
|
+
PK = "\033[35m" # deep purple/pink — NIROB logo shadow rows
|
|
33
|
+
|
|
34
|
+
# 256-color extras (safe on most modern terminals / Termux)
|
|
35
|
+
GOLD = "\033[38;5;220m" # vivid gold
|
|
36
|
+
PINK = "\033[38;5;213m" # neon pink
|
|
37
|
+
LIME = "\033[38;5;154m" # neon lime
|
|
38
|
+
ORANGE = "\033[38;5;208m" # neon orange
|
|
39
|
+
VIOLET = "\033[38;5;129m" # deep violet
|
|
40
|
+
|
|
41
|
+
# ═══════════════════════════════════════════════
|
|
42
|
+
# TERMINAL WIDTH helper
|
|
43
|
+
# ═══════════════════════════════════════════════
|
|
44
|
+
def tw():
|
|
45
|
+
return min(shutil.get_terminal_size((80, 24)).columns, 80)
|
|
46
|
+
|
|
47
|
+
# ═══════════════════════════════════════════════
|
|
48
|
+
# ANIMATIONS
|
|
49
|
+
# ═══════════════════════════════════════════════
|
|
50
|
+
|
|
51
|
+
GLITCH_CHARS = list("█▓▒░▄▀■□◆◇▲▼◈⣿⢿⡿⣾⣽⣻⢿⡿⣷")
|
|
52
|
+
|
|
53
|
+
def glitch_text(text, cycles=4, delay=0.04):
|
|
54
|
+
"""Flicker a line with random glitch chars before revealing."""
|
|
55
|
+
glitch_colors = [PINK, ORANGE, GOLD, LIME, VIOLET, RD]
|
|
56
|
+
for _ in range(cycles):
|
|
57
|
+
glitched = ""
|
|
58
|
+
col = random.choice(glitch_colors)
|
|
59
|
+
for ch in text:
|
|
60
|
+
if ch != " " and random.random() < 0.38:
|
|
61
|
+
glitched += random.choice(GLITCH_CHARS)
|
|
62
|
+
else:
|
|
63
|
+
glitched += ch
|
|
64
|
+
sys.stdout.write(f"\r{col}{BD}{glitched}{RS}")
|
|
65
|
+
sys.stdout.flush()
|
|
66
|
+
time.sleep(delay)
|
|
67
|
+
sys.stdout.write(f"\r{PINK}{BD}{text}{RS}\n")
|
|
68
|
+
sys.stdout.flush()
|
|
69
|
+
|
|
70
|
+
def type_print(text, color=None, delay=0.018, newline=True):
|
|
71
|
+
"""Typewriter effect."""
|
|
72
|
+
color = color or C
|
|
73
|
+
for ch in text:
|
|
74
|
+
sys.stdout.write(f"{color}{BD}{ch}{RS}")
|
|
75
|
+
sys.stdout.flush()
|
|
76
|
+
time.sleep(delay)
|
|
77
|
+
if newline:
|
|
78
|
+
print()
|
|
79
|
+
|
|
80
|
+
def pulse_line(text, color=C, times=3, delay=0.12):
|
|
81
|
+
"""Dim→bright pulse on a single line."""
|
|
82
|
+
for _ in range(times):
|
|
83
|
+
sys.stdout.write(f"\r{DM}{color}{text}{RS}")
|
|
84
|
+
sys.stdout.flush()
|
|
85
|
+
time.sleep(delay)
|
|
86
|
+
sys.stdout.write(f"\r{BD}{color}{text}{RS}")
|
|
87
|
+
sys.stdout.flush()
|
|
88
|
+
time.sleep(delay)
|
|
89
|
+
print()
|
|
90
|
+
|
|
91
|
+
def scan_effect(lines, delay=0.025):
|
|
92
|
+
"""Print lines with a fast scan feel."""
|
|
93
|
+
for line in lines:
|
|
94
|
+
print(line)
|
|
95
|
+
time.sleep(delay)
|
|
96
|
+
|
|
97
|
+
def matrix_rain(rows=5, delay=0.04):
|
|
98
|
+
"""Quick matrix-style rain before banner."""
|
|
99
|
+
width = min(tw(), 60)
|
|
100
|
+
chars = list("ニロブ01アイウエオ█▓░NIROB◈⚡★")
|
|
101
|
+
rain_colors = [LIME, PINK, GOLD, C, GR, ORANGE]
|
|
102
|
+
for _ in range(rows):
|
|
103
|
+
rain = ""
|
|
104
|
+
for _ in range(width):
|
|
105
|
+
if random.random() > 0.45:
|
|
106
|
+
rain += DM + random.choice(rain_colors) + random.choice(chars)
|
|
107
|
+
else:
|
|
108
|
+
rain += " "
|
|
109
|
+
print(f" {rain}{RS}")
|
|
110
|
+
time.sleep(delay)
|
|
111
|
+
print()
|
|
112
|
+
|
|
113
|
+
def loading_dots(msg, count=5, delay=0.18):
|
|
114
|
+
for i in range(count):
|
|
115
|
+
dots = "." * ((i % 3) + 1) + " "
|
|
116
|
+
sys.stdout.write(f"\r {C}{BD}{msg}{dots}{RS}")
|
|
117
|
+
sys.stdout.flush()
|
|
118
|
+
time.sleep(delay)
|
|
119
|
+
print()
|
|
120
|
+
|
|
121
|
+
# ═══════════════════════════════════════════════
|
|
122
|
+
# BANNER
|
|
123
|
+
# ═══════════════════════════════════════════════
|
|
124
|
+
|
|
125
|
+
LOGO = [
|
|
126
|
+
r" ███╗ ██╗██╗██████╗ ██████╗ ██████╗ ",
|
|
127
|
+
r" ████╗ ██║██║██╔══██╗██╔═══██╗██╔══██╗",
|
|
128
|
+
r" ██╔██╗ ██║██║██████╔╝██║ ██║██████╔╝",
|
|
129
|
+
r" ██║╚██╗██║██║██╔══██╗██║ ██║██╔══██╗",
|
|
130
|
+
r" ██║ ╚████║██║██║ ██║╚██████╔╝██████╔╝",
|
|
131
|
+
r" ╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═════╝ ",
|
|
132
|
+
]
|
|
133
|
+
|
|
134
|
+
PIP_LOGO = [
|
|
135
|
+
r" ██████╗ ██╗██████╗ ",
|
|
136
|
+
r" ██╔══██╗██║██╔══██╗",
|
|
137
|
+
r" ██████╔╝██║██████╔╝",
|
|
138
|
+
r" ██╔═══╝ ██║██╔═══╝ ",
|
|
139
|
+
r" ██║ ██║██║ ",
|
|
140
|
+
r" ╚═╝ ╚═╝╚═╝ ",
|
|
141
|
+
]
|
|
142
|
+
|
|
143
|
+
def border_line(char="═", width=None):
|
|
144
|
+
w = width or min(tw() - 2, 54)
|
|
145
|
+
return C + "╔" + char * w + "╗" + RS
|
|
146
|
+
|
|
147
|
+
def banner():
|
|
148
|
+
os.system("clear")
|
|
149
|
+
|
|
150
|
+
# Matrix rain intro
|
|
151
|
+
matrix_rain(rows=4, delay=0.03)
|
|
152
|
+
|
|
153
|
+
# Top animated border — gold
|
|
154
|
+
w = min(tw() - 2, 54)
|
|
155
|
+
anim_border = list("═" * w)
|
|
156
|
+
for i in range(0, w, 3):
|
|
157
|
+
anim_border[i] = "▓"
|
|
158
|
+
sys.stdout.write(f"\r {VIOLET}╔{''.join(anim_border)}╗{RS}")
|
|
159
|
+
sys.stdout.flush()
|
|
160
|
+
time.sleep(0.012)
|
|
161
|
+
sys.stdout.write(f"\r {GOLD}╔{'═'*w}╗{RS}\n")
|
|
162
|
+
sys.stdout.flush()
|
|
163
|
+
|
|
164
|
+
# NIROB logo — gradient colors row by row
|
|
165
|
+
LOGO_COLORS = [PINK, PR, ORANGE, GOLD, LIME, C]
|
|
166
|
+
for i, (line, col) in enumerate(zip(LOGO, LOGO_COLORS)):
|
|
167
|
+
if i == 0 or i == 5:
|
|
168
|
+
# override glitch reveal color per row
|
|
169
|
+
sys.stdout.write(f"\r{col}{BD}{line}{RS}\n")
|
|
170
|
+
sys.stdout.flush()
|
|
171
|
+
# do a quick glitch
|
|
172
|
+
for _ in range(3):
|
|
173
|
+
glitched = "".join(
|
|
174
|
+
random.choice(GLITCH_CHARS) if ch != " " and random.random() < 0.3 else ch
|
|
175
|
+
for ch in line
|
|
176
|
+
)
|
|
177
|
+
sys.stdout.write(f"\r{random.choice([PINK,ORANGE,VIOLET])}{BD}{glitched}{RS}")
|
|
178
|
+
sys.stdout.flush()
|
|
179
|
+
time.sleep(0.03)
|
|
180
|
+
sys.stdout.write(f"\r{col}{BD}{line}{RS}\n")
|
|
181
|
+
sys.stdout.flush()
|
|
182
|
+
else:
|
|
183
|
+
print(f"{col}{BD}{line}{RS}")
|
|
184
|
+
time.sleep(0.025)
|
|
185
|
+
|
|
186
|
+
print()
|
|
187
|
+
|
|
188
|
+
# PIP logo — electric gold
|
|
189
|
+
PIP_COLORS = [GOLD, GOLD, ORANGE, ORANGE, GD, GD]
|
|
190
|
+
for line, col in zip(PIP_LOGO, PIP_COLORS):
|
|
191
|
+
print(f"{col}{BD}{line}{RS}")
|
|
192
|
+
time.sleep(0.022)
|
|
193
|
+
|
|
194
|
+
print()
|
|
195
|
+
|
|
196
|
+
# Bottom border pulse — violet → gold
|
|
197
|
+
for col in [VIOLET, GOLD, VIOLET, GOLD]:
|
|
198
|
+
sys.stdout.write(f"\r {col}{BD}╚{'═'*w}╝{RS}")
|
|
199
|
+
sys.stdout.flush()
|
|
200
|
+
time.sleep(0.09)
|
|
201
|
+
print()
|
|
202
|
+
print()
|
|
203
|
+
|
|
204
|
+
# Info box — multicolor
|
|
205
|
+
info_w = 52
|
|
206
|
+
print(f" {GOLD}╔{'═'*info_w}╗{RS}")
|
|
207
|
+
|
|
208
|
+
def info_row(icon, label, lc, value, vc):
|
|
209
|
+
plain_len = len(f" {icon} {label:<12}: {value} ")
|
|
210
|
+
pad = max(info_w - plain_len, 0)
|
|
211
|
+
print(
|
|
212
|
+
f" {GOLD}║{RS} "
|
|
213
|
+
f"{icon} "
|
|
214
|
+
f"{lc}{BD}{label:<12}{RS}"
|
|
215
|
+
f"{W}:{RS} "
|
|
216
|
+
f"{vc}{BD}{value}{RS}"
|
|
217
|
+
f"{' '*pad}"
|
|
218
|
+
f" {GOLD}║{RS}"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
info_row("⚡", "Powered By", PINK, POWERED_BY, PINK)
|
|
222
|
+
info_row("📱", "Telegram", PR, TELEGRAM, C)
|
|
223
|
+
info_row("🔖", "Version", GOLD, VERSION, GOLD)
|
|
224
|
+
info_row("🐍", "Python", LIME, sys.version.split()[0], LIME)
|
|
225
|
+
print(f" {GOLD}╚{'═'*info_w}╝{RS}")
|
|
226
|
+
print()
|
|
227
|
+
|
|
228
|
+
# Welcome — pulse gold border, pink typing
|
|
229
|
+
pulse_line(" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━", GOLD, times=2, delay=0.09)
|
|
230
|
+
type_print(" ★ Welcome To NIROB PIP INSTALLER ★", PINK, delay=0.022)
|
|
231
|
+
pulse_line(" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━", GOLD, times=2, delay=0.09)
|
|
232
|
+
print()
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
# ═══════════════════════════════════════════════
|
|
236
|
+
# PACKAGES
|
|
237
|
+
# ═══════════════════════════════════════════════
|
|
238
|
+
PACKAGES = [
|
|
239
|
+
("requests", "requests"),
|
|
240
|
+
("httpx", "httpx"),
|
|
241
|
+
("aiohttp", "aiohttp"),
|
|
242
|
+
("urllib3", "urllib3"),
|
|
243
|
+
("websocket-client", "websocket-client"),
|
|
244
|
+
("beautifulsoup4", "beautifulsoup4"),
|
|
245
|
+
("lxml", "lxml"),
|
|
246
|
+
("flask", "flask"),
|
|
247
|
+
("fastapi", "fastapi"),
|
|
248
|
+
("django", "django"),
|
|
249
|
+
("uvicorn", "uvicorn"),
|
|
250
|
+
("gunicorn", "gunicorn"),
|
|
251
|
+
("numpy", "numpy"),
|
|
252
|
+
("pandas", "pandas"),
|
|
253
|
+
("matplotlib", "matplotlib"),
|
|
254
|
+
("scipy", "scipy"),
|
|
255
|
+
("scikit-learn", "scikit-learn"),
|
|
256
|
+
("pillow", "Pillow"),
|
|
257
|
+
("opencv-python", "opencv-python"),
|
|
258
|
+
("colorama", "colorama"),
|
|
259
|
+
("rich", "rich"),
|
|
260
|
+
("click", "click"),
|
|
261
|
+
("tqdm", "tqdm"),
|
|
262
|
+
("python-dotenv", "python-dotenv"),
|
|
263
|
+
("cryptography", "cryptography"),
|
|
264
|
+
("pycryptodome", "pycryptodome"),
|
|
265
|
+
("paramiko", "paramiko"),
|
|
266
|
+
("psutil", "psutil"),
|
|
267
|
+
("schedule", "schedule"),
|
|
268
|
+
("apscheduler", "APScheduler"),
|
|
269
|
+
("sqlalchemy", "SQLAlchemy"),
|
|
270
|
+
("pymongo", "pymongo"),
|
|
271
|
+
("redis", "redis"),
|
|
272
|
+
("pymysql", "PyMySQL"),
|
|
273
|
+
("pytest", "pytest"),
|
|
274
|
+
("black", "black"),
|
|
275
|
+
("flake8", "flake8"),
|
|
276
|
+
("setuptools", "setuptools"),
|
|
277
|
+
("wheel", "wheel"),
|
|
278
|
+
("twine", "twine"),
|
|
279
|
+
("python-telegram-bot", "python-telegram-bot"),
|
|
280
|
+
("pydantic", "pydantic"),
|
|
281
|
+
("jinja2", "Jinja2"),
|
|
282
|
+
("pytz", "pytz"),
|
|
283
|
+
("arrow", "arrow"),
|
|
284
|
+
("faker", "Faker"),
|
|
285
|
+
("loguru", "loguru"),
|
|
286
|
+
]
|
|
287
|
+
|
|
288
|
+
ALT_NAMES = {
|
|
289
|
+
"pillow": ["Pillow", "pillow"],
|
|
290
|
+
"opencv-python": ["opencv-python", "opencv-python-headless"],
|
|
291
|
+
"pycryptodome": ["pycryptodome", "pycryptodomex"],
|
|
292
|
+
"sqlalchemy": ["SQLAlchemy", "sqlalchemy"],
|
|
293
|
+
"apscheduler": ["APScheduler", "apscheduler"],
|
|
294
|
+
"pymysql": ["PyMySQL", "pymysql"],
|
|
295
|
+
"scikit-learn": ["scikit-learn", "sklearn"],
|
|
296
|
+
"jinja2": ["Jinja2", "jinja2"],
|
|
297
|
+
"faker": ["Faker", "faker"],
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
# ═══════════════════════════════════════════════
|
|
302
|
+
# PROGRESS BAR + SPINNER
|
|
303
|
+
# ═══════════════════════════════════════════════
|
|
304
|
+
|
|
305
|
+
SPINNER_FRAMES = [
|
|
306
|
+
PINK+"⣾"+RS, ORANGE+"⣽"+RS, GOLD+"⣻"+RS, LIME+"⢿"+RS,
|
|
307
|
+
C+"⡿"+RS, PINK+"⣟"+RS, ORANGE+"⣯"+RS, GOLD+"⣷"+RS,
|
|
308
|
+
]
|
|
309
|
+
CYBER_FRAMES = [
|
|
310
|
+
GOLD+"◢"+RS, ORANGE+"◣"+RS, PINK+"◤"+RS, VIOLET+"◥"+RS,
|
|
311
|
+
LIME+"◈"+RS, C+"◉"+RS, GOLD+"◈"+RS, PINK+"◈"+RS,
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
def draw_bar(percent, width=28, done=False, fail=False):
|
|
315
|
+
filled = int(width * percent / 100)
|
|
316
|
+
empty = width - filled
|
|
317
|
+
if done:
|
|
318
|
+
# green gradient fill
|
|
319
|
+
bar = LIME + "█" * filled + DM + TC + "░" * empty + RS
|
|
320
|
+
elif fail:
|
|
321
|
+
bar = RD + "█" * filled + DM + "░" * empty + RS
|
|
322
|
+
else:
|
|
323
|
+
# orange fill with pink tip
|
|
324
|
+
tip = PINK + "▓" + RS if filled > 0 else ""
|
|
325
|
+
bar = ORANGE + "█" * max(filled - 1, 0) + tip + DM + TC + "░" * empty + RS
|
|
326
|
+
return bar
|
|
327
|
+
|
|
328
|
+
def animate_install(label, pkg_index):
|
|
329
|
+
"""Animated spinner while installing."""
|
|
330
|
+
frames = CYBER_FRAMES if pkg_index % 2 == 0 else SPINNER_FRAMES
|
|
331
|
+
for p in range(0, 91, 3):
|
|
332
|
+
sp = frames[(p // 6) % len(frames)]
|
|
333
|
+
bar = draw_bar(p)
|
|
334
|
+
sys.stdout.write(
|
|
335
|
+
f"\r {sp} {GOLD}{BD}{label:<28}{RS} "
|
|
336
|
+
f"{VIOLET}[{RS}{bar}{VIOLET}]{RS} "
|
|
337
|
+
f"{ORANGE}{BD}{p:>3}%{RS} "
|
|
338
|
+
)
|
|
339
|
+
sys.stdout.flush()
|
|
340
|
+
time.sleep(0.016)
|
|
341
|
+
|
|
342
|
+
def finish_bar(label, percent, status):
|
|
343
|
+
if status == "done":
|
|
344
|
+
icon = LIME + BD + "✔" + RS
|
|
345
|
+
bar = draw_bar(percent, done=True)
|
|
346
|
+
pct_col = LIME
|
|
347
|
+
else:
|
|
348
|
+
icon = RD + BD + "✘" + RS
|
|
349
|
+
bar = draw_bar(percent, fail=True)
|
|
350
|
+
pct_col = RD
|
|
351
|
+
sys.stdout.write(
|
|
352
|
+
f"\r {icon} {GOLD}{BD}{label:<28}{RS} "
|
|
353
|
+
f"{VIOLET}[{RS}{bar}{VIOLET}]{RS} "
|
|
354
|
+
f"{pct_col}{BD}{percent:>3}%{RS} "
|
|
355
|
+
)
|
|
356
|
+
sys.stdout.flush()
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
# ═══════════════════════════════════════════════
|
|
360
|
+
# INSTALL LOGIC
|
|
361
|
+
# ═══════════════════════════════════════════════
|
|
362
|
+
|
|
363
|
+
def try_install(pkg_key, pypi_name):
|
|
364
|
+
candidates = ALT_NAMES.get(pkg_key, [pypi_name])
|
|
365
|
+
if pypi_name not in candidates:
|
|
366
|
+
candidates = [pypi_name] + candidates
|
|
367
|
+
for attempt, name in enumerate(candidates):
|
|
368
|
+
try:
|
|
369
|
+
result = subprocess.run(
|
|
370
|
+
[sys.executable, "-m", "pip", "install", name,
|
|
371
|
+
"-q", "--disable-pip-version-check"],
|
|
372
|
+
capture_output=True, text=True, timeout=120
|
|
373
|
+
)
|
|
374
|
+
if result.returncode == 0:
|
|
375
|
+
return True, name, attempt
|
|
376
|
+
except subprocess.TimeoutExpired:
|
|
377
|
+
pass
|
|
378
|
+
return False, pypi_name, len(candidates)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
def install_all():
|
|
382
|
+
total = len(PACKAGES)
|
|
383
|
+
success = []
|
|
384
|
+
failed = []
|
|
385
|
+
|
|
386
|
+
# Header
|
|
387
|
+
print(f" {GOLD}{BD}► Total packages : {LIME}{total}{RS}")
|
|
388
|
+
print(f" {GOLD}{BD}► Installing...{RS}")
|
|
389
|
+
print()
|
|
390
|
+
time.sleep(0.4)
|
|
391
|
+
|
|
392
|
+
for i, (pkg_key, pypi_name) in enumerate(PACKAGES, 1):
|
|
393
|
+
label = f"[{i:>2}/{total}] {pypi_name}"
|
|
394
|
+
|
|
395
|
+
animate_install(label, i)
|
|
396
|
+
ok, used_name, attempts = try_install(pkg_key, pypi_name)
|
|
397
|
+
|
|
398
|
+
if ok:
|
|
399
|
+
finish_bar(label, 100, "done")
|
|
400
|
+
retry_note = f" {YL}↳ alt: {used_name}{RS}" if attempts > 0 else ""
|
|
401
|
+
print(
|
|
402
|
+
f"\n {LIME}╔══ ✔ INSTALLED{RS} "
|
|
403
|
+
f"{GOLD}{BD}{pypi_name}{RS}"
|
|
404
|
+
f"{retry_note}"
|
|
405
|
+
)
|
|
406
|
+
print(f" {ORANGE}╚{'─'*38}◈{RS}")
|
|
407
|
+
success.append(pypi_name)
|
|
408
|
+
else:
|
|
409
|
+
finish_bar(label, 100, "fail")
|
|
410
|
+
print(
|
|
411
|
+
f"\n {RD}╔══ ✘ FAILED {RS} "
|
|
412
|
+
f"{GOLD}{BD}{pypi_name}{RS}"
|
|
413
|
+
)
|
|
414
|
+
print(f" {ORANGE}╚{'─'*38}◈{RS}")
|
|
415
|
+
failed.append(pypi_name)
|
|
416
|
+
|
|
417
|
+
sys.stdout.flush()
|
|
418
|
+
time.sleep(0.06)
|
|
419
|
+
|
|
420
|
+
# ── SUMMARY ─────────────────────────────────────────
|
|
421
|
+
print()
|
|
422
|
+
loading_dots(" Generating report", count=6, delay=0.12)
|
|
423
|
+
|
|
424
|
+
sw = 50
|
|
425
|
+
print(f" {GOLD}╔{'═'*sw}╗{RS}")
|
|
426
|
+
|
|
427
|
+
# Glitch title then final
|
|
428
|
+
title = " ◈ INSTALLATION COMPLETE ◈ "
|
|
429
|
+
for _ in range(4):
|
|
430
|
+
g = "".join(
|
|
431
|
+
random.choice(GLITCH_CHARS) if ch != " " and random.random() < 0.35 else ch
|
|
432
|
+
for ch in title.center(sw)
|
|
433
|
+
)
|
|
434
|
+
sys.stdout.write(f"\r {GOLD}║{random.choice([PINK,ORANGE,LIME])}{BD}{g}{RS}{GOLD}║{RS}")
|
|
435
|
+
sys.stdout.flush()
|
|
436
|
+
time.sleep(0.04)
|
|
437
|
+
print(f"\r {GOLD}║{PINK}{BD}{title.center(sw)}{RS}{GOLD}║{RS}")
|
|
438
|
+
|
|
439
|
+
print(f" {GOLD}╠{'═'*sw}╣{RS}")
|
|
440
|
+
|
|
441
|
+
def srow(icon, lc, label, vc, val):
|
|
442
|
+
plain = f" {icon} {label:<12}: {val}"
|
|
443
|
+
pad = sw - len(plain) - 1
|
|
444
|
+
print(
|
|
445
|
+
f" {GOLD}║{RS} "
|
|
446
|
+
f"{icon} "
|
|
447
|
+
f"{lc}{BD}{label:<12}{RS}"
|
|
448
|
+
f"{W}:{RS} "
|
|
449
|
+
f"{vc}{BD}{val}{RS}"
|
|
450
|
+
f"{' '*max(pad,0)}"
|
|
451
|
+
f"{GOLD}║{RS}"
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
srow("✔", LIME, "Success", LIME, len(success))
|
|
455
|
+
srow("✘", RD, "Failed", RD, len(failed))
|
|
456
|
+
srow("◈", C, "Total", GOLD, total)
|
|
457
|
+
srow("🐍", ORANGE, "Python", ORANGE, sys.version.split()[0])
|
|
458
|
+
|
|
459
|
+
print(f" {GOLD}╚{'═'*sw}╝{RS}")
|
|
460
|
+
print()
|
|
461
|
+
|
|
462
|
+
if failed:
|
|
463
|
+
print(f" {RD}{BD}Failed packages:{RS}")
|
|
464
|
+
for f in failed:
|
|
465
|
+
print(f" {RD}•{RS} {GOLD}{f}{RS}")
|
|
466
|
+
print()
|
|
467
|
+
|
|
468
|
+
# Done animation
|
|
469
|
+
pulse_line(" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━", GOLD, times=3, delay=0.08)
|
|
470
|
+
type_print(f" ⚡ Done! Powered By: {POWERED_BY} | {TELEGRAM}", PINK, delay=0.025)
|
|
471
|
+
pulse_line(" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━", GOLD, times=3, delay=0.08)
|
|
472
|
+
print()
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
# ═══════════════════════════════════════════════
|
|
476
|
+
# ENTRY POINT
|
|
477
|
+
# ═══════════════════════════════════════════════
|
|
478
|
+
def main():
|
|
479
|
+
banner()
|
|
480
|
+
install_all()
|
|
481
|
+
|
|
482
|
+
if __name__ == "__main__":
|
|
483
|
+
main()
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nirob
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: NIROB PIP — Auto install all essential Python packages with VIP Cyberpunk UI
|
|
5
|
+
Home-page: https://t.me/MT_0G
|
|
6
|
+
Author: NIROB
|
|
7
|
+
Author-email: your@email.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Topic :: Utilities
|
|
12
|
+
Requires-Python: >=3.6
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# NIROB PIP
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
███╗ ██╗██╗██████╗ ██████╗ ██████╗
|
|
27
|
+
████╗ ██║██║██╔══██╗██╔═══██╗██╔══██╗
|
|
28
|
+
██╔██╗ ██║██║██████╔╝██║ ██║██████╔╝
|
|
29
|
+
██║╚██╗██║██║██╔══██╗██║ ██║██╔══██╗
|
|
30
|
+
██║ ╚████║██║██║ ██║╚██████╔╝██████╔╝
|
|
31
|
+
╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ ╚═════╝╚═════╝
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**⚡ Powered By: NIROB | 📱 Telegram: @MT_0G | 🔖 v2.0.0**
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pip install nirob
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
nirob
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Automatically installs **47 essential Python packages** with a beautiful **VIP Cyberpunk terminal UI** — glitch animations, matrix rain, live progress bars, and more.
|
|
49
|
+
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- 🎨 Cyberpunk VIP terminal UI with glitch & matrix effects
|
|
53
|
+
- ⚡ Live animated progress bars with spinner
|
|
54
|
+
- 🔁 Auto-retry with alternative package names
|
|
55
|
+
- ✅ Full summary report with success/fail count
|
|
56
|
+
- 🐍 Works on Termux (Android), Linux, Windows, macOS
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
nirob
|
nirob-2.0.0/setup.cfg
ADDED
nirob-2.0.0/setup.py
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
setup(
|
|
4
|
+
name="nirob",
|
|
5
|
+
version="2.0.0",
|
|
6
|
+
author="NIROB",
|
|
7
|
+
author_email="your@email.com",
|
|
8
|
+
description="NIROB PIP — Auto install all essential Python packages with VIP Cyberpunk UI",
|
|
9
|
+
long_description=open("README.md", encoding="utf-8").read(),
|
|
10
|
+
long_description_content_type="text/markdown",
|
|
11
|
+
url="https://t.me/MT_0G",
|
|
12
|
+
packages=find_packages(),
|
|
13
|
+
python_requires=">=3.6",
|
|
14
|
+
entry_points={
|
|
15
|
+
"console_scripts": [
|
|
16
|
+
"nirob=nirob.main:main",
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
classifiers=[
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Environment :: Console",
|
|
23
|
+
"Topic :: Utilities",
|
|
24
|
+
],
|
|
25
|
+
)
|