DDownloader 0.3.7__tar.gz → 0.3.8__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.3.8/DDownloader/modules/__init__.py +1 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/modules/banners.py +1 -1
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/modules/downloader.py +3 -2
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/modules/helper.py +63 -26
- {ddownloader-0.3.7 → ddownloader-0.3.8}/PKG-INFO +1 -1
- {ddownloader-0.3.7 → ddownloader-0.3.8}/pyproject.toml +2 -2
- ddownloader-0.3.7/DDownloader/modules/__init__.py +0 -1
- ddownloader-0.3.7/DDownloader/modules/__pycache__/__init__.cpython-310.pyc +0 -0
- ddownloader-0.3.7/DDownloader/modules/__pycache__/args_parser.cpython-310.pyc +0 -0
- ddownloader-0.3.7/DDownloader/modules/__pycache__/banners.cpython-310.pyc +0 -0
- ddownloader-0.3.7/DDownloader/modules/__pycache__/dash_downloader.cpython-310.pyc +0 -0
- ddownloader-0.3.7/DDownloader/modules/__pycache__/helper.cpython-310.pyc +0 -0
- ddownloader-0.3.7/DDownloader/modules/__pycache__/hls_downloader.cpython-310.pyc +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/__init__.py +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/N_m3u8DL-RE.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/aria2c.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/ffmpeg.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/mkvmerge.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/mp4decrypt.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/shaka-packager.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/bin/yt-dlp.exe +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/main.py +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/modules/args_parser.py +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/DDownloader/modules/streamlink.py +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/LICENSE +0 -0
- {ddownloader-0.3.7 → ddownloader-0.3.8}/README.md +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "0.3.8"
|
@@ -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.3.
|
26
|
+
print(f"{Fore.YELLOW}[DDownloader] - {Fore.GREEN}A DRM-Protected & Non-Protected Content Downloader - {Fore.RED}[V0.3.8] \n{Fore.RESET}")
|
27
27
|
|
28
28
|
# =========================================================================================================== #
|
29
29
|
|
@@ -61,15 +61,16 @@ class DOWNLOADER:
|
|
61
61
|
# =========================================================================================================== #
|
62
62
|
|
63
63
|
def _build_command(self):
|
64
|
-
self.binary_path = self._get_binary_path("N_m3u8DL-RE")
|
65
64
|
command = [
|
66
|
-
self.
|
65
|
+
self._get_binary_path("N_m3u8DL-RE"),
|
67
66
|
f'"{self.manifest_url}"',
|
68
67
|
'-mt',
|
69
68
|
'-M', 'format=mp4',
|
70
69
|
'--save-dir', '"downloads"',
|
71
70
|
'--tmp-dir', '"downloads"',
|
72
71
|
'--del-after-done',
|
72
|
+
'--decryption-engine', '"FFMPEG"',
|
73
|
+
'--decryption-binary-path', f'"{self._get_binary_path("ffmpeg")}"',
|
73
74
|
'--save-name', f'"{self.output_name}"'
|
74
75
|
]
|
75
76
|
|
@@ -92,52 +92,89 @@ def detect_platform():
|
|
92
92
|
|
93
93
|
def get_media_info(file_path):
|
94
94
|
try:
|
95
|
-
logger.info(f"Parsing media file: {file_path}")
|
95
|
+
logger.info(f"📂 Parsing media file: {file_path}")
|
96
96
|
media_info = MediaInfo.parse(file_path)
|
97
|
-
|
97
|
+
|
98
|
+
result = {
|
99
|
+
"file_path": file_path,
|
100
|
+
"tracks": [],
|
101
|
+
"container": None,
|
102
|
+
"file_size": None,
|
103
|
+
"duration": None,
|
104
|
+
"bit_rate": None,
|
105
|
+
}
|
98
106
|
|
99
107
|
for track in media_info.tracks:
|
100
108
|
track_info = {"track_type": track.track_type}
|
101
109
|
|
102
|
-
if track.track_type == "
|
110
|
+
if track.track_type == "General":
|
111
|
+
result.update({
|
112
|
+
"container": getattr(track, "format", None),
|
113
|
+
"file_size": getattr(track, "file_size", None),
|
114
|
+
"duration": getattr(track, "duration", None),
|
115
|
+
"bit_rate": getattr(track, "overall_bit_rate", None),
|
116
|
+
"title": getattr(track, "title", None),
|
117
|
+
"encoded_application": getattr(track, "encoded_application", None),
|
118
|
+
"encoded_library": getattr(track, "encoded_library", None),
|
119
|
+
"writing_library": getattr(track, "writing_library", None),
|
120
|
+
"file_creation_date": getattr(track, "file_created_date", None),
|
121
|
+
})
|
122
|
+
|
123
|
+
elif track.track_type == "Video":
|
103
124
|
track_info.update({
|
104
|
-
"codec": track
|
105
|
-
"
|
106
|
-
"
|
107
|
-
"
|
108
|
-
"
|
109
|
-
"
|
110
|
-
"
|
125
|
+
"codec": getattr(track, "codec_id", getattr(track, "format", None)),
|
126
|
+
"codec_profile": getattr(track, "format_profile", None),
|
127
|
+
"width": getattr(track, "width", None),
|
128
|
+
"height": getattr(track, "height", None),
|
129
|
+
"frame_rate": getattr(track, "frame_rate", None),
|
130
|
+
"bit_rate": getattr(track, "bit_rate", None),
|
131
|
+
"duration": getattr(track, "duration", None),
|
132
|
+
"aspect_ratio": getattr(track, "display_aspect_ratio", None),
|
133
|
+
"hdr_format": getattr(track, "hdr_format", None),
|
134
|
+
"bit_depth": getattr(track, "bit_depth", None),
|
135
|
+
"color_space": getattr(track, "colour_primaries", None),
|
136
|
+
"color_range": getattr(track, "colour_range", None),
|
137
|
+
"color_transfer": getattr(track, "transfer_characteristics", None),
|
138
|
+
"chroma_subsampling": getattr(track, "chroma_subsampling", None),
|
111
139
|
})
|
140
|
+
|
112
141
|
elif track.track_type == "Audio":
|
113
142
|
track_info.update({
|
114
|
-
"codec": track
|
115
|
-
"
|
116
|
-
"
|
117
|
-
"
|
118
|
-
"
|
119
|
-
"
|
143
|
+
"codec": getattr(track, "codec_id", getattr(track, "format", None)),
|
144
|
+
"codec_profile": getattr(track, "format_profile", None),
|
145
|
+
"channels": getattr(track, "channel_s", None),
|
146
|
+
"sample_rate": getattr(track, "sampling_rate", None),
|
147
|
+
"bit_rate": getattr(track, "bit_rate", None),
|
148
|
+
"duration": getattr(track, "duration", None),
|
149
|
+
"language": getattr(track, "language", "Unknown"),
|
150
|
+
"compression_mode": getattr(track, "compression_mode", None),
|
151
|
+
"bit_depth": getattr(track, "bit_depth", None),
|
120
152
|
})
|
153
|
+
|
121
154
|
elif track.track_type == "Text":
|
122
155
|
track_info.update({
|
123
|
-
"
|
124
|
-
"
|
156
|
+
"format": getattr(track, "format", None),
|
157
|
+
"language": getattr(track, "language", "Unknown"),
|
158
|
+
"default": getattr(track, "default", None),
|
159
|
+
"forced": getattr(track, "forced", None),
|
160
|
+
"format_profile": getattr(track, "format_profile", None),
|
125
161
|
})
|
126
|
-
|
162
|
+
|
163
|
+
elif track.track_type == "Chapters":
|
127
164
|
track_info.update({
|
128
|
-
"
|
129
|
-
"
|
130
|
-
"duration": track.duration,
|
131
|
-
"overall_bit_rate": track.overall_bit_rate,
|
165
|
+
"title": getattr(track, "title", None),
|
166
|
+
"chapter_count": getattr(track, "part_count", None),
|
132
167
|
})
|
133
168
|
|
134
|
-
|
169
|
+
if any(value is not None for value in track_info.values()): # Avoid empty entries
|
170
|
+
result["tracks"].append(track_info)
|
135
171
|
|
136
|
-
logger.info(f"Successfully extracted media
|
172
|
+
logger.info(f"✅ Successfully extracted media info for: {file_path}")
|
137
173
|
return result
|
138
174
|
|
139
175
|
except Exception as e:
|
140
|
-
logger.error(f"Error
|
176
|
+
logger.error(f"❌ Error parsing media file '{file_path}': {e}")
|
141
177
|
return None
|
178
|
+
|
142
179
|
|
143
180
|
# =========================================================================================================== #
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "DDownloader"
|
7
|
-
version = "0.3.
|
7
|
+
version = "0.3.8"
|
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.3.
|
28
|
+
version = "0.3.8"
|
29
29
|
description = "A downloader for DRM-protected & Non DRM-protected content."
|
30
30
|
authors = ["ThatNotEasy <apidotmy@proton.me>"]
|
31
31
|
license = "MIT"
|
@@ -1 +0,0 @@
|
|
1
|
-
__version__ = "0.3.7"
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|