diff --git a/jd-webgui/app.py b/jd-webgui/app.py
index 390826d..4fc2064 100644
--- a/jd-webgui/app.py
+++ b/jd-webgui/app.py
@@ -321,6 +321,50 @@ def sanitize_name(name: str) -> str:
out = "".join("_" if c in bad else c for c in name).strip()
return re.sub(r"\s+", " ", out)
+def format_proxy_lines(raw: str, scheme: str) -> str:
+ """
+ Takes raw lines (ip:port or scheme://ip:port) and outputs normalized lines:
+ scheme://ip:port (one per line). Ignores empty lines and comments.
+ """
+ scheme = scheme.strip().lower()
+ if scheme not in {"socks5", "socks4", "http"}:
+ raise ValueError("Unsupported proxy scheme")
+
+ out = []
+ for line in (raw or "").splitlines():
+ s = line.strip()
+ if not s or s.startswith("#"):
+ continue
+
+ if "://" in s:
+ s = s.split("://", 1)[1].strip()
+
+ if ":" not in s:
+ continue
+
+ host, port = s.rsplit(":", 1)
+ host = host.strip()
+ port = port.strip()
+
+ if not host or not port.isdigit():
+ continue
+
+ out.append(f"{scheme}://{host}:{port}")
+
+ seen = set()
+ dedup = []
+ for x in out:
+ if x not in seen:
+ seen.add(x)
+ dedup.append(x)
+
+ return "\n".join(dedup)
+
+def fetch_proxy_list(url: str) -> str:
+ req = urllib.request.Request(url)
+ with urllib.request.urlopen(req, timeout=20) as resp:
+ return resp.read().decode("utf-8", "replace")
+
def pick_library_target(library_choice: str, filename: str, package_name: str) -> str:
if library_choice not in {"movies", "series", "auto"}:
library_choice = "auto"
@@ -733,6 +777,7 @@ def render_page(error: str = "") -> str:
JD → Jellyfin
+ {render_nav("downloads")}
{err_html}
+
+
JDownloader Import-Liste
+
Format: socks5://IP:PORT, socks4://IP:PORT, http://IP:PORT. Keine Prüfung/Validierung.