diff --git a/scrapers/JavBusPython/JavBusPython.yml b/scrapers/JavBusPython/JavBusPython.yml new file mode 100644 index 000000000..d0aad03d7 --- /dev/null +++ b/scrapers/JavBusPython/JavBusPython.yml @@ -0,0 +1,28 @@ +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 +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 diff --git a/scrapers/JavBusPython/javbus.py b/scrapers/JavBusPython/javbus.py new file mode 100644 index 000000000..394cfc259 --- /dev/null +++ b/scrapers/JavBusPython/javbus.py @@ -0,0 +1,94 @@ +import json, re, sys, urllib.request, ssl +ctx = ssl.create_default_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): + t = re.sub(r"(?i)\b(CD|DVD|DISC|PART|JAV)[-_ ]?\d{1,3}\b", " ", t or "") + m = re.search(r"^.*?([A-Za-z][A-Za-z0-9]*?[A-Za-z])[-_ ]*(\d{2,5}).*$", t) + 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 + if dv: + r["duration"] = int(dv.group()) * 60 + 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">