fix: change click and load package name
This commit is contained in:
@@ -9,6 +9,7 @@ Implements the Click'n'Load protocol:
|
|||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
import base64
|
import base64
|
||||||
|
import html
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
@@ -24,6 +25,87 @@ def log(msg):
|
|||||||
print(f"[CNL] {msg}", flush=True)
|
print(f"[CNL] {msg}", flush=True)
|
||||||
|
|
||||||
|
|
||||||
|
def fetch_package_name(url):
|
||||||
|
"""Fetch package name from source page by extracting <h2> tag (like JDownloader)."""
|
||||||
|
if not url or not url.startswith("http"):
|
||||||
|
return None
|
||||||
|
|
||||||
|
try:
|
||||||
|
log(f"Fetching package name from {url}")
|
||||||
|
req = urllib.request.Request(
|
||||||
|
url,
|
||||||
|
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
|
||||||
|
)
|
||||||
|
with urllib.request.urlopen(req, timeout=10) as resp:
|
||||||
|
content = resp.read().decode("utf-8", errors="ignore")
|
||||||
|
|
||||||
|
# Extract <h2> content like JDownloader does
|
||||||
|
match = re.search(r'<h2[^>]*>([^<]+)<', content)
|
||||||
|
if match:
|
||||||
|
name = html.unescape(match.group(1)).strip()
|
||||||
|
log(f"Extracted package name: {name}")
|
||||||
|
return name
|
||||||
|
|
||||||
|
log("No <h2> tag found on page")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
log(f"Failed to fetch package name: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def extract_package_name_from_links(links):
|
||||||
|
"""Extract package name from common prefix of link filenames."""
|
||||||
|
if not links:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Extract filenames from URLs
|
||||||
|
filenames = []
|
||||||
|
for link in links:
|
||||||
|
parsed = urllib.parse.urlparse(link)
|
||||||
|
path = urllib.parse.unquote(parsed.path)
|
||||||
|
filename = path.split("/")[-1] if path else ""
|
||||||
|
# Remove extension
|
||||||
|
if "." in filename:
|
||||||
|
filename = filename.rsplit(".", 1)[0]
|
||||||
|
if filename:
|
||||||
|
filenames.append(filename)
|
||||||
|
|
||||||
|
if not filenames:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if len(filenames) == 1:
|
||||||
|
# Single file - use its name
|
||||||
|
name = filenames[0]
|
||||||
|
log(f"Single file, using name: {name}")
|
||||||
|
return name
|
||||||
|
|
||||||
|
# Find common prefix among all filenames
|
||||||
|
prefix = filenames[0]
|
||||||
|
for filename in filenames[1:]:
|
||||||
|
while prefix and not filename.startswith(prefix):
|
||||||
|
# Remove last character or segment
|
||||||
|
if "." in prefix:
|
||||||
|
prefix = prefix.rsplit(".", 1)[0]
|
||||||
|
elif "-" in prefix:
|
||||||
|
prefix = prefix.rsplit("-", 1)[0]
|
||||||
|
elif "_" in prefix:
|
||||||
|
prefix = prefix.rsplit("_", 1)[0]
|
||||||
|
else:
|
||||||
|
prefix = prefix[:-1]
|
||||||
|
|
||||||
|
# Clean up trailing separators
|
||||||
|
prefix = prefix.rstrip(".-_ ")
|
||||||
|
|
||||||
|
if prefix and len(prefix) >= 3:
|
||||||
|
log(f"Common prefix from {len(filenames)} files: {prefix}")
|
||||||
|
return prefix
|
||||||
|
|
||||||
|
# Fallback: use first filename
|
||||||
|
name = filenames[0]
|
||||||
|
log(f"No common prefix, using first filename: {name}")
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
class ClickNLoadHandler(BaseHTTPRequestHandler):
|
class ClickNLoadHandler(BaseHTTPRequestHandler):
|
||||||
pyload_url = None
|
pyload_url = None
|
||||||
pyload_user = None
|
pyload_user = None
|
||||||
@@ -66,12 +148,22 @@ class ClickNLoadHandler(BaseHTTPRequestHandler):
|
|||||||
crypted = params.get("crypted", [""])[0]
|
crypted = params.get("crypted", [""])[0]
|
||||||
source = params.get("source", ["Click'n'Load"])[0]
|
source = params.get("source", ["Click'n'Load"])[0]
|
||||||
|
|
||||||
log(f"Received addcrypted2: source={source}, jk_len={len(jk)}, crypted_len={len(crypted)}")
|
# Get actual page URL from Referer header
|
||||||
|
referer = self.headers.get("Referer", "")
|
||||||
|
|
||||||
|
log(f"Received addcrypted2: source={source}, referer={referer}")
|
||||||
|
log(f" jk_len={len(jk)}, crypted_len={len(crypted)}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
links = self.decrypt_links(jk, crypted)
|
links = self.decrypt_links(jk, crypted)
|
||||||
if links:
|
if links:
|
||||||
self.add_to_pyload(links, source)
|
# Try to get package name: referer page -> link filenames -> source
|
||||||
|
package_name = (
|
||||||
|
fetch_package_name(referer) or
|
||||||
|
extract_package_name_from_links(links) or
|
||||||
|
source
|
||||||
|
)
|
||||||
|
self.add_to_pyload(links, package_name)
|
||||||
self.send_response(200)
|
self.send_response(200)
|
||||||
self.send_cors_headers()
|
self.send_cors_headers()
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
|
|||||||
Reference in New Issue
Block a user