From f021ffba50274cf711576f8a46a79b3f1ffdbdbb Mon Sep 17 00:00:00 2001 From: xy952666680 Date: Fri, 31 Jul 2026 08:57:38 +0800 Subject: [PATCH 1/3] Create javbus.py --- scrapers/JavBusPython/javbus.py | 89 +++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 scrapers/JavBusPython/javbus.py diff --git a/scrapers/JavBusPython/javbus.py b/scrapers/JavBusPython/javbus.py new file mode 100644 index 000000000..186cb6100 --- /dev/null +++ b/scrapers/JavBusPython/javbus.py @@ -0,0 +1,89 @@ +import json, re, sys, urllib.request, ssl +ctx = ssl._create_unverified_context() +H = {"User-Agent": "Mozilla/5.0","Accept-Language": "zh-CN","Cookie": "over18=18; existmag=mag"} +D = "https://www.javbus.com" + +def fetch(url): + try: + return urllib.request.urlopen(urllib.request.Request(url, headers=H), timeout=15, context=ctx).read().decode("utf-8", errors="replace") + except: + return None + +def ec(t): + m = re.search(r"([A-Za-z0-9]{2,12})[-_ ]?(\d{2,5})", t, re.IGNORECASE) + return f"{m.group(1).upper()}-{m.group(2)}" if m else None + +def ps(h): + p = ']*>(.*?)
\\s*(.*?)' + r = [] + for u, b, i in re.findall(p, h, re.DOTALL): + mt = re.search(r'^([^<]+)(?:(.*?)', i) + code = cd[0] if len(cd) > 0 else "" + date = cd[1] if len(cd) > 1 else "" + if title: + display = f"{code} - {title}" if code else title + result = {"title": display, "url": u} + if code: + result["code"] = code + if date: + result["date"] = date + mi = re.search(r']*src="([^"]+)"', b) + if mi: + img = mi.group(1) + result["image"] = f"https://www.javbus.com{img}" if img.startswith("/") else img + r.append(result) + return r + +def search(c): + for p in [f"{D}/search/{c}", f"{D}/uncensored/search/{c}"]: + h = fetch(p) + if h: + r = ps(h) + if r: + return r + return [] + +def ss(u): + h = fetch(u) + if not h: + return {} + r = {} + m = re.search(r"

(.*?)

", h) + raw = m.group(1).strip() if m else "" + r["title"] = re.sub(r'^[A-Za-z0-9]+-[A-Za-z0-9]+\s+', '', raw) + m = re.search("識別碼[\\s:]*\\s*]*>([^<]+)", h) + r["code"] = m.group(1).strip() if m else "" + m = re.search("發行日期[^<]*\\s*([^<\\n]+)", h) + r["date"] = m.group(1).strip() if m else "" + m = re.search("長度[^<]*\\s*([^<\\n]+)", h) + dv = re.search(r"\d+", m.group(1)) if m else None + r["duration"] = int(dv.group()) if dv else 0 + m = re.search("導演[^<]*[^>]*]*>([^<]+)", h) + r["director"] = m.group(1).strip() if m else "" + m = re.search("發行商[^<]*\\s*]*>([^<]+)", h) + if not m: + m = re.search("製作商[^<]*\\s*]*>([^<]+)", h) + r["studio"] = {"name": m.group(1).strip()} if m else {} + r["tags"] = [{"name": t} for t in re.findall('class="genre">.*?]*>([^<]+)', h, re.DOTALL)] + r["performers"] = [{"name": p} for p in re.findall('class="star-name"[^>]*>]*>([^<]+)', h, re.DOTALL)] + m = re.search('class="bigImage"[^>]*>]*src="([^"]+)"', h) + if m: + s = m.group(1) + r["image"] = f"{D}{s}" if s.startswith("/") else s + return r + +f = json.loads(sys.stdin.read()) +n = f.get("name", "") +u = f.get("url", "") +c = ec(n or u) + +if len(sys.argv) > 1 and sys.argv[1] == "searchName": + print(json.dumps(search(c) if c else [])) +elif u: + print(json.dumps(ss(u))) +elif c: + print(json.dumps(search(c))) +else: + print(json.dumps([])) From b8d7a728d0e67d7d247d0d4a978aadcbcbf45d8c Mon Sep 17 00:00:00 2001 From: xy952666680 Date: Fri, 31 Jul 2026 09:00:20 +0800 Subject: [PATCH 2/3] Create JavBusPython.yml --- scrapers/JavBusPython/JavBusPython.yml | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 scrapers/JavBusPython/JavBusPython.yml diff --git a/scrapers/JavBusPython/JavBusPython.yml b/scrapers/JavBusPython/JavBusPython.yml new file mode 100644 index 000000000..c436f4e6f --- /dev/null +++ b/scrapers/JavBusPython/JavBusPython.yml @@ -0,0 +1,30 @@ +name: "JavBus Python" +sceneByFragment: + action: script + script: + - python3 + - javbus.py +sceneByName: + action: script + script: + - python3 + - javbus.py + - searchName +sceneByQueryFragment: + action: script + script: + - python3 + - javbus.py + - validSearch +sceneByURL: + - action: script + url: + - https://www.javbus.com + - https://www.seejav.bid + - https://www.cdnbus.lol + - https://www.dmmbus.lol + - https://www.seedmm.cfd + script: + - python3 + - javbus.py + - validSearch From 4e07ee91cde93ad3e44db92deed51ef43317a981 Mon Sep 17 00:00:00 2001 From: xy952666680 Date: Sat, 1 Aug 2026 00:02:01 +0800 Subject: [PATCH 3/3] fix(JavBus Python): harden scraper after review + live testing - dispatch: read code/title/urls fields (Stash fragment has no 'name'); fragment paths return a single scene object, not a list; prefer exact-code match over first search hit - duration: convert minutes to seconds (x60), omit key when absent - ec(): strip CD/DVD/DISC/PART/JAV junk tokens; support alphanumeric prefixes (s2mbd-055 -> S2MBD-055); keep dashless normalization (DDT246 -> DDT-246) and date-immune matching - tags: anchor regex to