# -*- coding: utf-8 -*- # 官网: https://hanime1.me import sys,re,json from urllib.parse import quote sys.path.append('..') try: from base.spider import Spider as _B except ImportError: class _B: def fetch(self,u,h=None,**k): import requests as rq;k.pop('timeout',None) r=rq.get(u,headers=h,timeout=15,**k);r.encoding='utf-8';return r import requests as R H=bytes([104, 116, 116, 112, 115, 58, 47, 47, 104, 97, 110, 105, 109, 101, 49, 46, 99, 111, 109]).decode() U="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" class Spider(_B): def init(self,e=""): self._s=R.Session() self._s.headers.update({"User-Agent":U,"Accept-Language":"zh-TW,zh;q=0.9"}) def getName(self):return"Hanime1" def isVideoFormat(self,u):return".mp4"in u def manualVideoCheck(self):return False def _get(self,u,timeout=15): if not u.startswith("http"):u=H+u try: r=self._s.get(u,timeout=timeout);r.raise_for_status() r.encoding='utf-8';return r.text except Exception as e:print(f"[H1]{u[:60]}->{e}");return"" def _cards(self,h): v=[] for m in re.finditer( r'
]*class="video-item-container[^"]*">' r'.*?]*class="video-link"' r'.*?]*src="([^"]+)"', h,re.DOTALL): vid=re.search(r'v=(\d+)',m.group(2)) v.append({ "vod_id":m.group(2) if m.group(2).startswith("http")else H+m.group(2), "vod_name":m.group(1), "vod_pic":m.group(3), "vod_remarks":"", }) return v def _tags(self): """动态抓取搜索页全部标签""" h=self._get(H+"/search") tags=re.findall(r'(.*?)',h) title=tm.group(1).split(" - ")[0].strip()if tm else"" pm=re.search(r'poster="([^"]+)"',h) pic=pm.group(1)if pm else"" sources=re.findall(r']*size="([^"]+)"',h) pf=[];pu=[] for src,sz in sources: pf.append(f"{sz}p") pu.append(f"{sz}p${src}") if not sources: mp4s=re.findall(r'https?://[^\s"<>]+\.mp4[^\s"<>]*',h) for i,mp in enumerate(mp4s): pf.append(f"线路{i+1}") pu.append(f"线路{i+1}${mp}") return{"list":[{"vod_id":url,"vod_name":title,"vod_pic":pic, "type_name":"","vod_year":"","vod_area":"","vod_remarks":"", "vod_actor":"","vod_director":"","vod_content":"", "vod_play_from":"$$$".join(pf),"vod_play_url":"$$$".join(pu)}]} def playerContent(self,flag,id,vipFlags=None): if id and".mp4"in id: return{"url":id,"header":json.dumps({"User-Agent":U,"Referer":H+"/"})} d=self.detailContent([id]) if d and d.get("list"): us=d["list"][0].get("vod_play_url","").split("$$$") if us: f=us[0];url=f.split("$",1)[1]if"$"in f else f return{"url":url,"header":json.dumps({"User-Agent":U,"Referer":H+"/"})} return{"url":""} def searchContent(self,key,quick=False,pg=1): try: pn=max(int(str(pg)),1) h=self._get(f"{H}/search?search={quote(key)}&page={pn}") if not h:return{"list":[]} v=self._cards(h) pages=re.findall(r'page=(\d+)',h) pc=max(int(p)for p in pages)if pages else pn return{"list":v,"page":pn,"pagecount":pc,"limit":len(v),"total":pc*len(v)if v else 0} except Exception as e:print(f"[H1]search:{e}");return{"list":[]} def localProxy(self,param):pass