Open-AutoTools 0.0.3rc3__py3-none-any.whl → 0.0.3rc4__py3-none-any.whl
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.
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/METADATA +65 -55
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/RECORD +7 -7
- autotools/autodownload/core.py +61 -15
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/LICENSE +0 -0
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/WHEEL +0 -0
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/entry_points.txt +0 -0
- {Open_AutoTools-0.0.3rc3.dist-info → Open_AutoTools-0.0.3rc4.dist-info}/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: Open-AutoTools
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.3rc4
|
|
4
4
|
Summary: A suite of automated tools accessible via CLI with a simple `autotools` command
|
|
5
5
|
Home-page: https://github.com/BabylooPro/Open-AutoTools
|
|
6
6
|
Author: BabylooPro
|
|
@@ -76,8 +76,9 @@ Dynamic: summary
|
|
|
76
76
|
[CHANGELOG_URL]: CHANGELOG.md
|
|
77
77
|
[TODO_BADGE]: https://img.shields.io/badge/TODO-purple.svg
|
|
78
78
|
[TODO_URL]: TODO.md
|
|
79
|
+
[TOTAL_STABILITY]: https://img.shields.io/badge/Total%20Stability-73%25-yellow
|
|
79
80
|
|
|
80
|
-
[![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL]
|
|
81
|
+
[![PyPI][PYPI_BADGE]][PYPI_URL] [![Python][PYTHON_BADGE]][PYTHON_URL] [![CHANGELOG][CHANGELOG_BADGE]][CHANGELOG_URL] [![TODO][TODO_BADGE]][TODO_URL] ![Total Stability][TOTAL_STABILITY]
|
|
81
82
|
|
|
82
83
|
Open-AutoTools is a comprehensive Python CLI toolkit that streamlines everyday developer tasks through a collection of powerful command-line utilities. Each tool is designed to enhance productivity directly from your terminal.
|
|
83
84
|
|
|
@@ -112,7 +113,7 @@ pip install -e .
|
|
|
112
113
|
|
|
113
114
|
## Key Features
|
|
114
115
|
|
|
115
|
-
### AutoCaps
|
|
116
|
+
### AutoCaps ![Stability][AUTOCAPS_EFF]
|
|
116
117
|
|
|
117
118
|
- **Description:** Converts any text entered by the user to uppercase.
|
|
118
119
|
- **Usage:**
|
|
@@ -124,7 +125,7 @@ pip install -e .
|
|
|
124
125
|
YOUR TEXT HERE.
|
|
125
126
|
```
|
|
126
127
|
|
|
127
|
-
### AutoLower
|
|
128
|
+
### AutoLower ![Stability][AUTOLOWER_EFF]
|
|
128
129
|
|
|
129
130
|
- **Description:** Converts any text entered by the user to lowercase.
|
|
130
131
|
- **Usage:**
|
|
@@ -136,7 +137,7 @@ pip install -e .
|
|
|
136
137
|
your text here.
|
|
137
138
|
```
|
|
138
139
|
|
|
139
|
-
### AutoPassword
|
|
140
|
+
### AutoPassword ![Stability][AUTOPASSWORD_EFF]
|
|
140
141
|
|
|
141
142
|
- **Description:** Generates secure random passwords and encryption keys with customizable options.
|
|
142
143
|
- **Usage:**
|
|
@@ -147,6 +148,7 @@ pip install -e .
|
|
|
147
148
|
~ ❯ autopassword --password-key "your-password" --analyze
|
|
148
149
|
```
|
|
149
150
|
- **Options:**
|
|
151
|
+
|
|
150
152
|
- `--length, -l`: Set password length (default: 12)
|
|
151
153
|
- `--no-uppercase, -u`: Exclude uppercase letters
|
|
152
154
|
- `--no-numbers, -n`: Exclude numbers
|
|
@@ -157,54 +159,7 @@ pip install -e .
|
|
|
157
159
|
- `--gen-key, -g`: Generate a random encryption key
|
|
158
160
|
- `--password-key, -p`: Generate an encryption key from password
|
|
159
161
|
|
|
160
|
-
###
|
|
161
|
-
|
|
162
|
-
- **Description:** Translates text between languages with automatic source language detection.
|
|
163
|
-
- **Usage:**
|
|
164
|
-
|
|
165
|
-
```
|
|
166
|
-
~ ❯ autotranslate "Bonjour le monde" --to en
|
|
167
|
-
Hello world
|
|
168
|
-
|
|
169
|
-
~ ❯ autotranslate "Hello world" --to fr --copy
|
|
170
|
-
Bonjour le monde
|
|
171
|
-
// Result also copied to clipboard
|
|
172
|
-
|
|
173
|
-
~ ❯ autotranslate "こんにちは" --to en --detect
|
|
174
|
-
[Detected: ja] Hello
|
|
175
|
-
|
|
176
|
-
~ ❯ autotranslate --list-languages
|
|
177
|
-
// Shows all supported languages
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
- **Options:**
|
|
181
|
-
- `--to`: Target language code (default: en)
|
|
182
|
-
- `--from`: Source language code (default: auto-detect)
|
|
183
|
-
- `--copy`: Copy translation to clipboard
|
|
184
|
-
- `--detect`: Show detected source language
|
|
185
|
-
- `--list-languages`: Show all supported language codes and names
|
|
186
|
-
- `--output, -o`: Save translation to file
|
|
187
|
-
|
|
188
|
-
### AutoSpell (unreleased)
|
|
189
|
-
|
|
190
|
-
- **Description:** Checks and corrects spelling in text with multi-language support.
|
|
191
|
-
- **Usage:**
|
|
192
|
-
```
|
|
193
|
-
~ ❯ autospell "Your text with misspellings"
|
|
194
|
-
~ ❯ autospell --lang fr "Votre texte avec des fautes"
|
|
195
|
-
~ ❯ autospell --fix "Text to autocorrect"
|
|
196
|
-
```
|
|
197
|
-
- **Options:**
|
|
198
|
-
- `--lang, -l`: Language code (default: auto)
|
|
199
|
-
- `--fix, -f`: Auto-fix text and copy to clipboard
|
|
200
|
-
- `--copy, -c`: Copy result to clipboard
|
|
201
|
-
- `--list-languages`: Show supported languages
|
|
202
|
-
- `--json, -j`: Output results as JSON
|
|
203
|
-
- `--ignore, -i`: Error types to ignore (spelling/grammar/style/punctuation)
|
|
204
|
-
- `--interactive, -n`: Interactive mode - confirm each correction
|
|
205
|
-
- `--output, -o`: Save corrections to file
|
|
206
|
-
|
|
207
|
-
### AutoDownload
|
|
162
|
+
### AutoDownload ![Stability][AUTODOWNLOAD_EFF]
|
|
208
163
|
|
|
209
164
|
- **Description:** Downloads videos from YouTube and files from other sources.
|
|
210
165
|
- **Usage:**
|
|
@@ -226,7 +181,7 @@ pip install -e .
|
|
|
226
181
|
- **Features:**
|
|
227
182
|
|
|
228
183
|
- Automatic bot detection bypass
|
|
229
|
-
- Mobile API integration for better
|
|
184
|
+
- Mobile API integration for better Stability
|
|
230
185
|
- Progress tracking with detailed status
|
|
231
186
|
- Multiple quality options
|
|
232
187
|
- MP3 audio extraction
|
|
@@ -245,7 +200,7 @@ pip install -e .
|
|
|
245
200
|
|
|
246
201
|
> **Note:** The tool uses YouTube's mobile API for better compatibility and reliability.
|
|
247
202
|
|
|
248
|
-
### AutoIP
|
|
203
|
+
### AutoIP ![Stability][AUTOIP_EFF]
|
|
249
204
|
|
|
250
205
|
- **Description:** Displays network information including IP addresses, connectivity tests, speed tests, and more.
|
|
251
206
|
- **Usage:**
|
|
@@ -278,6 +233,53 @@ pip install -e .
|
|
|
278
233
|
- DNS server information
|
|
279
234
|
- IP geolocation
|
|
280
235
|
|
|
236
|
+
### AutoTranslate ![Stability][AUTOTRANSLATE_EFF]
|
|
237
|
+
|
|
238
|
+
- **Description:** Translates text between languages with automatic source language detection.
|
|
239
|
+
- **Usage:**
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
~ ❯ autotranslate "Bonjour le monde" --to en
|
|
243
|
+
Hello world
|
|
244
|
+
|
|
245
|
+
~ ❯ autotranslate "Hello world" --to fr --copy
|
|
246
|
+
Bonjour le monde
|
|
247
|
+
// Result also copied to clipboard
|
|
248
|
+
|
|
249
|
+
~ ❯ autotranslate "こんにちは" --to en --detect
|
|
250
|
+
[Detected: ja] Hello
|
|
251
|
+
|
|
252
|
+
~ ❯ autotranslate --list-languages
|
|
253
|
+
// Shows all supported languages
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
- **Options:**
|
|
257
|
+
- `--to`: Target language code (default: en)
|
|
258
|
+
- `--from`: Source language code (default: auto-detect)
|
|
259
|
+
- `--copy`: Copy translation to clipboard
|
|
260
|
+
- `--detect`: Show detected source language
|
|
261
|
+
- `--list-languages`: Show all supported language codes and names
|
|
262
|
+
- `--output, -o`: Save translation to file
|
|
263
|
+
|
|
264
|
+
### AutoSpell (unreleased) ![Stability][AUTOSPELL_EFF]
|
|
265
|
+
|
|
266
|
+
- **Description:** Checks and corrects spelling in text with multi-language support.
|
|
267
|
+
- **Usage:**
|
|
268
|
+
```
|
|
269
|
+
~ ❯ autospell "Your text with misspellings"
|
|
270
|
+
~ ❯ autospell --lang fr "Votre texte avec des fautes"
|
|
271
|
+
~ ❯ autospell --fix "Text to autocorrect"
|
|
272
|
+
```
|
|
273
|
+
- **Options:**
|
|
274
|
+
- `--lang, -l`: Language code (default: auto)
|
|
275
|
+
- `--fix, -f`: Auto-fix text and copy to clipboard
|
|
276
|
+
- `--copy, -c`: Copy result to clipboard
|
|
277
|
+
- `--list-languages`: Show supported languages
|
|
278
|
+
- `--json, -j`: Output results as JSON
|
|
279
|
+
- `--ignore, -i`: Error types to ignore (spelling/grammar/style/punctuation)
|
|
280
|
+
- `--interactive, -n`: Interactive mode - confirm each correction
|
|
281
|
+
- `--output, -o`: Save corrections to file
|
|
282
|
+
|
|
281
283
|
### Test Suite (DEVELOPMENT ONLY)
|
|
282
284
|
|
|
283
285
|
- **Description:** Run the test suite for Open-AutoTools
|
|
@@ -296,3 +298,11 @@ pip install -e .
|
|
|
296
298
|
## License
|
|
297
299
|
|
|
298
300
|
This project is licensed under the MIT License. For more details, see the [LICENSE](LICENSE) file.
|
|
301
|
+
|
|
302
|
+
[AUTOCAPS_EFF]: https://img.shields.io/badge/Stability-99%25-success
|
|
303
|
+
[AUTOLOWER_EFF]: https://img.shields.io/badge/Stability-99%25-success
|
|
304
|
+
[AUTOPASSWORD_EFF]: https://img.shields.io/badge/Stability-90%25-success
|
|
305
|
+
[AUTOTRANSLATE_EFF]: https://img.shields.io/badge/Stability-25%25-red
|
|
306
|
+
[AUTOSPELL_EFF]: https://img.shields.io/badge/Stability-25%25-red
|
|
307
|
+
[AUTODOWNLOAD_EFF]: https://img.shields.io/badge/Stability-75%25-yellow
|
|
308
|
+
[AUTOIP_EFF]: https://img.shields.io/badge/Stability-95%25-success
|
|
@@ -8,7 +8,7 @@ autotools/autocaps/tests/test_autocaps_core.py,sha256=fzpci_sK7L1fSf_IJ1paJ__bmn
|
|
|
8
8
|
autotools/autocaps/tests/test_autocaps_integration.py,sha256=Qe2hzVEvzf0-INp14oTTrHi0RiRDCE2fxo9abVNcd_E,1435
|
|
9
9
|
autotools/autodownload/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
autotools/autodownload/commands.py,sha256=WBG4o5716zQ63t23k-qJLNv41L58RnL2XTvNl_TsK-w,1442
|
|
11
|
-
autotools/autodownload/core.py,sha256=
|
|
11
|
+
autotools/autodownload/core.py,sha256=hM7RzNhUlhWFjVhMI3e3PSnpzQN21wYUZmgM9mmLsyg,14429
|
|
12
12
|
autotools/autoip/__init__.py,sha256=T_5hz9G4reFPXDucdzRoMFPYlAKwTPt9TejOpkRPgn0,23
|
|
13
13
|
autotools/autoip/commands.py,sha256=c4s22yb7aharRAwOmD37Kgbj6rm05XNBtCVyxU7rc7M,1425
|
|
14
14
|
autotools/autoip/core.py,sha256=Q3dzLstZQruwYkSbCSlKQNmKVGCyNpo1DGst5VFtHLU,10123
|
|
@@ -36,9 +36,9 @@ autotools/utils/__init__.py,sha256=2uAirI6ZbOwSFPSg5wuEjA0gMWf1XBJ4yP_WcGeND7M,1
|
|
|
36
36
|
autotools/utils/loading.py,sha256=cRh8rvNLT4B2aVgWq7flg8bNpnp1XlNBV3_cvxjfm8E,439
|
|
37
37
|
autotools/utils/updates.py,sha256=ZGS8pAVxvy5ORuey_zrBWdA0_hKNmEcwzJ-6c22x4Yo,1140
|
|
38
38
|
autotools/utils/version.py,sha256=sHwkZ8MNTKQdTntV1B-8QInbMnMtR7Xr3DAY5-wf5-0,3027
|
|
39
|
-
Open_AutoTools-0.0.
|
|
40
|
-
Open_AutoTools-0.0.
|
|
41
|
-
Open_AutoTools-0.0.
|
|
42
|
-
Open_AutoTools-0.0.
|
|
43
|
-
Open_AutoTools-0.0.
|
|
44
|
-
Open_AutoTools-0.0.
|
|
39
|
+
Open_AutoTools-0.0.3rc4.dist-info/LICENSE,sha256=SpbSRxNWos2l0-geleCa6d0L9G_bOsZRkY4rB9OduJ0,1069
|
|
40
|
+
Open_AutoTools-0.0.3rc4.dist-info/METADATA,sha256=QspEAu8ipTWu606dWGmKdy1FYRxBTOp5nNH7JRZEemA,10086
|
|
41
|
+
Open_AutoTools-0.0.3rc4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
42
|
+
Open_AutoTools-0.0.3rc4.dist-info/entry_points.txt,sha256=QLIsUk6vHo0wAYDk1K74kIuYunJMwWe2xbwQhJXLoKo,312
|
|
43
|
+
Open_AutoTools-0.0.3rc4.dist-info/top_level.txt,sha256=x5ZRvdQw7DQnVmR0YDqVSAuuS94KTHDmk6uIeW7YOPw,10
|
|
44
|
+
Open_AutoTools-0.0.3rc4.dist-info/RECORD,,
|
autotools/autodownload/core.py
CHANGED
|
@@ -192,7 +192,7 @@ def download_youtube_video(url, format='mp4', quality='best'):
|
|
|
192
192
|
'quiet': True,
|
|
193
193
|
'no_warnings': True,
|
|
194
194
|
'extractor_args': {'youtube': {
|
|
195
|
-
'player_client': ['android'],
|
|
195
|
+
'player_client': ['web', 'android'],
|
|
196
196
|
'formats': ['missing_pot'] # ALLOW FORMATS WITHOUT PO TOKEN
|
|
197
197
|
}}
|
|
198
198
|
}) as ydl:
|
|
@@ -202,6 +202,39 @@ def download_youtube_video(url, format='mp4', quality='best'):
|
|
|
202
202
|
print("\n❌ No formats available for this video")
|
|
203
203
|
return False
|
|
204
204
|
|
|
205
|
+
# FIND BEST AVAILABLE QUALITY
|
|
206
|
+
best_height = 0
|
|
207
|
+
for f in formats:
|
|
208
|
+
height = f.get('height')
|
|
209
|
+
if height is not None and height > best_height:
|
|
210
|
+
best_height = height
|
|
211
|
+
|
|
212
|
+
# IF NO VALID HEIGHT FOUND, DEFAULT TO 1080P
|
|
213
|
+
if best_height == 0:
|
|
214
|
+
best_height = 1080
|
|
215
|
+
|
|
216
|
+
# IF QUALITY IS 'BEST', USE THE BEST AVAILABLE
|
|
217
|
+
if quality == 'best':
|
|
218
|
+
height = best_height
|
|
219
|
+
# ASK FOR CONFIRMATION IF 4K OR HIGHER (ONLY FOR MP4)
|
|
220
|
+
if format == 'mp4' and height >= 2160:
|
|
221
|
+
print(f"\n⚠️ This video is available in {height}p quality!")
|
|
222
|
+
while True:
|
|
223
|
+
response = input(f"Do you want to download in {height}p quality? (yes/no): ").lower()
|
|
224
|
+
if response in ['no', 'n']:
|
|
225
|
+
height = 1080
|
|
226
|
+
print("\nDowngrading to 1080p quality.")
|
|
227
|
+
break
|
|
228
|
+
elif response in ['yes', 'y']:
|
|
229
|
+
break
|
|
230
|
+
print("Please answer 'yes' or 'no'")
|
|
231
|
+
else:
|
|
232
|
+
# EXTRACT HEIGHT FROM QUALITY STRING
|
|
233
|
+
try:
|
|
234
|
+
height = int(quality.lower().replace('p', ''))
|
|
235
|
+
except ValueError:
|
|
236
|
+
height = 1080 # DEFAULT TO 1080P IF INVALID FORMAT
|
|
237
|
+
|
|
205
238
|
# CHECK IF FILE EXISTS AND GET REPLACEMENT CONSENT
|
|
206
239
|
force_download = check_existing_video(info, format)
|
|
207
240
|
if not force_download:
|
|
@@ -224,26 +257,40 @@ def download_youtube_video(url, format='mp4', quality='best'):
|
|
|
224
257
|
print("\n🔍 Starting download...")
|
|
225
258
|
|
|
226
259
|
print(f"\n🎥 Downloading video from: {url}")
|
|
227
|
-
|
|
260
|
+
if format == 'mp3':
|
|
261
|
+
print(f"📋 Format: {format}\n")
|
|
262
|
+
else:
|
|
263
|
+
print(f"📋 Format: {format}, Quality: {height}p\n")
|
|
228
264
|
|
|
229
265
|
# YT-DLP PERMISSION OPTIONS FOR DOWNLOADING YOUTUBE VIDEOS
|
|
230
266
|
ydl_opts = {
|
|
231
|
-
'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' if format == 'mp4' else 'bestaudio
|
|
267
|
+
'format': f'bestvideo[height={height}][ext=mp4]+bestaudio[ext=m4a]/bestvideo[height<={height}][ext=mp4]+bestaudio[ext=m4a]/best[height<={height}][ext=mp4]/best[ext=mp4]/best' if format == 'mp4' else 'bestaudio/best',
|
|
268
|
+
'postprocessors': [{
|
|
269
|
+
'key': 'FFmpegExtractAudio',
|
|
270
|
+
'preferredcodec': 'mp3',
|
|
271
|
+
'preferredquality': '192',
|
|
272
|
+
}] if format == 'mp3' else [],
|
|
232
273
|
'quiet': True,
|
|
233
274
|
'no_warnings': True,
|
|
234
275
|
'progress': True,
|
|
235
|
-
'progress_hooks': [lambda d:
|
|
276
|
+
'progress_hooks': [lambda d: update_progress(d)],
|
|
236
277
|
'extractor_args': {
|
|
237
278
|
'youtube': {
|
|
238
|
-
'player_client': ['android'],
|
|
239
|
-
'formats': ['missing_pot'] # ALLOW FORMATS WITHOUT PO TOKEN
|
|
279
|
+
'player_client': ['web', 'android'], # USE WEB CLIENT FIRST
|
|
280
|
+
'formats': ['missing_pot'], # ALLOW FORMATS WITHOUT PO TOKEN
|
|
281
|
+
'player_skip': ['configs', 'webpage'] # SKIP UNNECESSARY CONFIGS
|
|
240
282
|
}
|
|
241
283
|
},
|
|
242
284
|
'http_headers': {
|
|
243
|
-
'User-Agent': 'Mozilla/5.0 (
|
|
285
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
286
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
287
|
+
'Accept-Language': 'en-us,en;q=0.5',
|
|
288
|
+
'Sec-Fetch-Mode': 'navigate'
|
|
244
289
|
},
|
|
245
290
|
'outtmpl': str(download_dir / '%(title)s.%(ext)s'), # SET OUTPUT TEMPLATE
|
|
246
|
-
'overwrites': True # FORCE OVERWRITE IF USER CONSENTED
|
|
291
|
+
'overwrites': True, # FORCE OVERWRITE IF USER CONSENTED
|
|
292
|
+
'no_check_certificates': True, # SKIP CERTIFICATE VALIDATION
|
|
293
|
+
'cookiesfrombrowser': ('chrome',), # USE CHROME COOKIES IF AVAILABLE
|
|
247
294
|
}
|
|
248
295
|
|
|
249
296
|
try:
|
|
@@ -281,23 +328,22 @@ pbar = None # GLOBAL VARIABLE TO STORE PROGRESS BAR
|
|
|
281
328
|
|
|
282
329
|
|
|
283
330
|
# FUNCTION TO UPDATE PROGRESS BAR
|
|
284
|
-
def
|
|
331
|
+
def update_progress(d):
|
|
285
332
|
global pbar
|
|
286
|
-
|
|
287
333
|
if d['status'] == 'downloading':
|
|
288
334
|
total = d.get('total_bytes', 0)
|
|
289
335
|
downloaded = d.get('downloaded_bytes', 0)
|
|
290
336
|
|
|
291
337
|
if pbar is None:
|
|
292
|
-
pbar = tqdm(total=total, unit='B', unit_scale=True, desc="
|
|
338
|
+
pbar = tqdm(total=total, unit='B', unit_scale=True, desc="⏳ Downloading", leave=True, ncols=80, bar_format='{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{rate_fmt}]')
|
|
293
339
|
|
|
294
|
-
|
|
295
|
-
|
|
340
|
+
if total > 0:
|
|
341
|
+
pbar.n = downloaded
|
|
342
|
+
pbar.total = total
|
|
343
|
+
pbar.refresh()
|
|
296
344
|
|
|
297
345
|
elif d['status'] == 'finished' and pbar:
|
|
298
|
-
pbar.n = pbar.total
|
|
299
346
|
pbar.close()
|
|
300
|
-
print("Download completed")
|
|
301
347
|
pbar = None
|
|
302
348
|
|
|
303
349
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|