DDownloader 0.4.1__tar.gz → 0.4.3__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.
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/yt-dlp.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/main.py +14 -1
- ddownloader-0.4.3/DDownloader/modules/__init__.py +1 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/modules/args_parser.py +1 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/modules/banners.py +2 -1
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/modules/downloader.py +70 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/modules/helper.py +4 -3
- {ddownloader-0.4.1 → ddownloader-0.4.3}/PKG-INFO +4 -2
- {ddownloader-0.4.1 → ddownloader-0.4.3}/pyproject.toml +3 -2
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_06-23-57-591.log +0 -10996
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_10-40-22-275.log +0 -10979
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_10-47-26-730.log +0 -108
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_11-10-51-275.log +0 -11317
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_11-38-34-609.log +0 -82
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_11-40-04-799.log +0 -10978
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-22_12-20-28-623.log +0 -115
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-38-30-721.log +0 -19
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-38-52-028.log +0 -19
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-39-01-077.log +0 -17
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-39-17-503.log +0 -20
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-39-34-955.log +0 -29
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-39-55-379.log +0 -18
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-40-41-293.log +0 -74
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-02-28_01-42-15-463.log +0 -60
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-04_07-09-17-079.log +0 -119
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-06_02-58-30-968.log +0 -99
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-06_03-05-58-847.log +0 -25
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-08_00-06-25-965.log +0 -98
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-09_08-25-37-490.log +0 -73
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-09_08-30-17-945.log +0 -83
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-09_08-30-46-741.log +0 -85
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-09_08-35-00-461.log +0 -77
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-09_08-47-42-424.log +0 -81
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-12_07-53-39-189.log +0 -61
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-14_18-55-10-031.log +0 -100
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-17_02-16-55-723.log +0 -10
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-17_02-18-48-738.log +0 -9
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-17_02-55-02-627.log +0 -29
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-17_02-56-50-289.log +0 -31
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-09-50-038.log +0 -31
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-10-15-122.log +0 -15
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-10-32-099.log +0 -15
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-12-53-637.log +0 -16
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-13-21-065.log +0 -53
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-03-22_03-14-51-221.log +0 -843
- ddownloader-0.4.1/DDownloader/bin/Logs/2025-04-15_00-26-16-899.log +0 -85
- ddownloader-0.4.1/DDownloader/modules/__init__.py +0 -1
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/__init__.py +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/N_m3u8DL-RE.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/aria2c.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/ffmpeg.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/mkvmerge.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/mp4decrypt.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/bin/shaka-packager.exe +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/DDownloader/modules/streamlink.py +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/LICENSE +0 -0
- {ddownloader-0.4.1 → ddownloader-0.4.3}/README.md +0 -0
Binary file
|
@@ -89,6 +89,7 @@ def main():
|
|
89
89
|
logger.info("YouTube URL detected. Initializing YouTube downloader...")
|
90
90
|
print(Fore.RED + "═" * 100 + Fore.RESET)
|
91
91
|
is_playlist = "list=" in args.url
|
92
|
+
downloader.cookies = args.cookies
|
92
93
|
downloader.youtube_downloader(
|
93
94
|
url=args.url,
|
94
95
|
output_file=os.path.join(downloads_dir, args.output),
|
@@ -96,8 +97,20 @@ def main():
|
|
96
97
|
playlist=is_playlist
|
97
98
|
)
|
98
99
|
exit(0)
|
100
|
+
elif re.search(r"iq\.com", args.url, re.IGNORECASE):
|
101
|
+
logger.info("IQ.com URL detected. Initializing IQ.com downloader...")
|
102
|
+
print(Fore.RED + "═" * 100 + Fore.RESET)
|
103
|
+
# Set default output name if not provided
|
104
|
+
output_name = args.output if args.output else "iq_video"
|
105
|
+
downloader.cookies = args.cookies
|
106
|
+
downloader.iq_downloader(
|
107
|
+
url=args.url,
|
108
|
+
output_file=os.path.join(downloads_dir, output_name),
|
109
|
+
download_type="mp4"
|
110
|
+
)
|
111
|
+
exit(0)
|
99
112
|
else:
|
100
|
-
logger.error("Unsupported URL format. Please provide a valid DASH (.mpd), HLS (.m3u8), ISM (.ism), or
|
113
|
+
logger.error("Unsupported URL format. Please provide a valid DASH (.mpd), HLS (.m3u8), ISM (.ism), YouTube, or IQ.com URL.")
|
101
114
|
exit(1)
|
102
115
|
|
103
116
|
downloader.manifest_url = args.url
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.4.3"
|
@@ -15,6 +15,7 @@ def parse_arguments():
|
|
15
15
|
parser.add_argument("-o", "--output", help=argparse.SUPPRESS)
|
16
16
|
parser.add_argument("-k", "--key", action="append", help=argparse.SUPPRESS)
|
17
17
|
parser.add_argument("-H", "--header", action="append", help=argparse.SUPPRESS)
|
18
|
+
parser.add_argument("-c", "--cookies", help=argparse.SUPPRESS)
|
18
19
|
parser.add_argument("-i", "--input", help=argparse.SUPPRESS)
|
19
20
|
parser.add_argument("-q", "--quality", help=argparse.SUPPRESS)
|
20
21
|
parser.add_argument("--auto-select",
|
@@ -23,7 +23,7 @@ def banners():
|
|
23
23
|
stdout.write(""+Fore.YELLOW +"╔════════════════════════════════════════════════════════════════════════════╝\n")
|
24
24
|
stdout.write(""+Fore.YELLOW +"║ \x1b[38;2;255;20;147m• "+Fore.GREEN+"GITHUB "+Fore.RED+" |"+Fore.LIGHTWHITE_EX+" GITHUB.COM/THATNOTEASY "+Fore.YELLOW+"║\n")
|
25
25
|
stdout.write(""+Fore.YELLOW +"╚════════════════════════════════════════════════════════════════════════════╝\n")
|
26
|
-
print(f"{Fore.YELLOW}[DDownloader] - {Fore.GREEN}A DRM-Protected & Non-Protected Content Downloader - {Fore.RED}[V0.4.
|
26
|
+
print(f"{Fore.YELLOW}[DDownloader] - {Fore.GREEN}A DRM-Protected & Non-Protected Content Downloader - {Fore.RED}[V0.4.3] \n{Fore.RESET}")
|
27
27
|
|
28
28
|
# =========================================================================================================== #
|
29
29
|
|
@@ -45,6 +45,7 @@ def display_help():
|
|
45
45
|
f" {Fore.GREEN}-o, --output{' ' * 19}{Style.RESET_ALL}Name of the output file 💾\n"
|
46
46
|
f" {Fore.GREEN}-k, --key{' ' * 22}{Style.RESET_ALL}Decryption key in KID:KEY format 🔑\n"
|
47
47
|
f" {Fore.GREEN}-H, --header{' ' * 19}{Style.RESET_ALL}Custom HTTP headers (e.g., User-Agent: value) 📋\n"
|
48
|
+
f" {Fore.GREEN}-c, --cookies{' ' * 19}{Style.RESET_ALL}Cookies file (e.g., netscape/json formatter) 📋\n"
|
48
49
|
f"{Fore.RED}.++" + "═" * 100 + f"++.{Style.RESET_ALL}\n"
|
49
50
|
f" {Fore.GREEN}-i, --input{' ' * 20}{Style.RESET_ALL}Input file for re-encoding. 📂\n"
|
50
51
|
f" {Fore.GREEN}-q, --quality{' ' * 18}{Style.RESET_ALL}Target quality: HD, FHD, UHD. 🎥\n"
|
@@ -16,6 +16,7 @@ class DOWNLOADER:
|
|
16
16
|
self.proxy = None
|
17
17
|
self.decryption_keys = []
|
18
18
|
self.headers = []
|
19
|
+
self.cookies = None
|
19
20
|
self.binary_path = None
|
20
21
|
self.auto_select = False
|
21
22
|
|
@@ -120,6 +121,71 @@ class DOWNLOADER:
|
|
120
121
|
except Exception as e:
|
121
122
|
logger.error(Fore.RED + f"An unexpected error occurred: {e}" + Fore.RESET)
|
122
123
|
|
124
|
+
# =========================================================================================================== #
|
125
|
+
|
126
|
+
def iq_downloader(self, url, output_file, download_type="mp4"):
|
127
|
+
"""
|
128
|
+
Download a video from IQ.com using yt-dlp.
|
129
|
+
|
130
|
+
Args:
|
131
|
+
url (str): The IQ.com video URL.
|
132
|
+
output_file (str): The output file path to save the video.
|
133
|
+
download_type (str): The type of download ("mp4" for video, "mp3" for audio).
|
134
|
+
"""
|
135
|
+
try:
|
136
|
+
# Get the yt-dlp binary path
|
137
|
+
yt_dlp_path = self._get_binary_path("yt-dlp")
|
138
|
+
|
139
|
+
# Determine the output file extension based on download type
|
140
|
+
if download_type == "mp3":
|
141
|
+
output_file = os.path.splitext(output_file)[0] + ".mp3"
|
142
|
+
elif download_type == "mp4":
|
143
|
+
output_file = os.path.splitext(output_file)[0] + ".mp4"
|
144
|
+
else:
|
145
|
+
logger.error(Fore.RED + f"Invalid download type: {download_type}. Use 'mp4' or 'mp3'." + Fore.RESET)
|
146
|
+
return
|
147
|
+
|
148
|
+
# Build the yt-dlp command for IQ.com
|
149
|
+
command = [
|
150
|
+
yt_dlp_path,
|
151
|
+
"-o", f"\"{output_file}\"", # Output file
|
152
|
+
]
|
153
|
+
|
154
|
+
# Add cookies if provided
|
155
|
+
if self.cookies:
|
156
|
+
command.extend(["--cookies", f"\"{self.cookies}\""])
|
157
|
+
|
158
|
+
# Add audio extraction options if downloading MP3
|
159
|
+
if download_type == "mp3":
|
160
|
+
command.extend([
|
161
|
+
"--extract-audio", # Extract audio
|
162
|
+
"--audio-format", "mp3", # Convert to MP3
|
163
|
+
"--audio-quality", "0", # Best quality
|
164
|
+
])
|
165
|
+
else:
|
166
|
+
# For MP4, download the best video and audio formats and merge them
|
167
|
+
command.extend([
|
168
|
+
"-f", "bv*+ba/b", # Download best video + best audio, or fallback to best combined format
|
169
|
+
"--merge-output-format", "mp4", # Merge into MP4
|
170
|
+
])
|
171
|
+
|
172
|
+
# Add the IQ.com URL
|
173
|
+
command.append(url)
|
174
|
+
|
175
|
+
# Execute the command
|
176
|
+
self._execute_command(command)
|
177
|
+
|
178
|
+
# Check if output file exists to confirm success
|
179
|
+
if os.path.isfile(output_file):
|
180
|
+
logger.info(f"Download from IQ.com completed successfully. Output saved to: {output_file}")
|
181
|
+
return output_file
|
182
|
+
else:
|
183
|
+
logger.error(f"Download from IQ.com failed. Output file not created: {output_file}")
|
184
|
+
return None
|
185
|
+
|
186
|
+
except Exception as e:
|
187
|
+
logger.error(Fore.RED + f"An unexpected error occurred: {e}" + Fore.RESET)
|
188
|
+
|
123
189
|
# =========================================================================================================== #
|
124
190
|
|
125
191
|
def re_encode_content(self, input_file, quality, codec="libx265", crf=23, preset="superfast", audio_bitrate="256k", fps=60):
|
@@ -256,6 +322,10 @@ class DOWNLOADER:
|
|
256
322
|
"--ignore-errors", # Ignore errors and continue downloading
|
257
323
|
]
|
258
324
|
|
325
|
+
# Add cookies if provided
|
326
|
+
if self.cookies:
|
327
|
+
command.extend(["--cookies", f"\"{self.cookies}\""])
|
328
|
+
|
259
329
|
# Add playlist-specific options if the URL is a playlist
|
260
330
|
if playlist:
|
261
331
|
command.extend([
|
@@ -21,11 +21,12 @@ binaries = {
|
|
21
21
|
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/aria2c.exe",
|
22
22
|
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/mp4decrypt.exe",
|
23
23
|
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/shaka-packager.exe",
|
24
|
-
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/
|
25
|
-
"https://github.com/
|
24
|
+
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/mkvmerge.exe",
|
25
|
+
"https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp.exe"
|
26
26
|
],
|
27
27
|
"Linux": [
|
28
|
-
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/N_m3u8DL-RE"
|
28
|
+
"https://github.com/ThatNotEasy/DDownloader/raw/refs/heads/main/DDownloader/bin/N_m3u8DL-RE",
|
29
|
+
"https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp"
|
29
30
|
]
|
30
31
|
}
|
31
32
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: DDownloader
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.3
|
4
4
|
Summary: A downloader for DRM-protected & Non DRM-protected content.
|
5
5
|
License: MIT License
|
6
6
|
|
@@ -23,6 +23,7 @@ License: MIT License
|
|
23
23
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
24
24
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
25
25
|
IN THE SOFTWARE.
|
26
|
+
License-File: LICENSE
|
26
27
|
Author: ThatNotEasy
|
27
28
|
Author-email: apidotmy@proton.me
|
28
29
|
Requires-Python: >=3.7
|
@@ -40,6 +41,7 @@ Requires-Dist: loguru (>=0.6.0)
|
|
40
41
|
Requires-Dist: pymediainfo (>=6.1.0,<7.0.0)
|
41
42
|
Requires-Dist: requests (>=2.26.0)
|
42
43
|
Requires-Dist: tqdm (>=4.64.0)
|
44
|
+
Requires-Dist: yt-dlp (>=2025.10.11.232807.dev0,<2026.0.0.0)
|
43
45
|
Project-URL: Homepage, https://github.com/ThatNotEasy/DDownloader
|
44
46
|
Description-Content-Type: text/markdown
|
45
47
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "DDownloader"
|
7
|
-
version = "0.4.
|
7
|
+
version = "0.4.3"
|
8
8
|
description = "A downloader for DRM-protected & Non DRM-protected content."
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
10
10
|
authors = [
|
@@ -25,7 +25,7 @@ classifiers = [
|
|
25
25
|
|
26
26
|
[tool.poetry]
|
27
27
|
name = "DDownloader"
|
28
|
-
version = "0.4.
|
28
|
+
version = "0.4.3"
|
29
29
|
description = "A downloader for DRM-protected & Non DRM-protected content."
|
30
30
|
authors = ["ThatNotEasy <apidotmy@proton.me>"]
|
31
31
|
license = "MIT"
|
@@ -40,6 +40,7 @@ tqdm = ">=4.64.0"
|
|
40
40
|
colorama = ">=0.4.5"
|
41
41
|
loguru = ">=0.6.0"
|
42
42
|
pymediainfo = "^6.1.0"
|
43
|
+
yt-dlp = "^2025.10.11.232807.dev0"
|
43
44
|
|
44
45
|
[tool.poetry.scripts]
|
45
46
|
DDownloader = "DDownloader.main:main"
|