\s+(.*?)\s+')
+ bofang = bofang.replace('$$$', '#')
+
+ videos.append({
+ "vod_id": did,
+ "vod_actor": '😸拾光',
+ "vod_director": '😸拾光',
+ "vod_content": content,
+ "vod_play_from": '😸拾光专线',
+ "vod_play_url": bofang
+ })
+
+ result['list'] = videos
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+ parts = id.split("http")
+ xiutan = 0
+ if xiutan == 0:
+ if len(parts) > 1:
+ before_https, after_https = parts[0], 'http' + parts[1]
+ res = requests.get(url=after_https, headers=headerx)
+ res = res.text
+
+ url = self.extract_middle_text(res, '},"url":"', '"', 0).replace('\\', '')
+
+ result = {}
+ result["parse"] = xiutan
+ result["playUrl"] = ''
+ result["url"] = url
+ result["header"] = headerx
+ return result
+
+ def searchContentPage(self, key, quick, page):
+ result = {}
+ videos = []
+ if not page:
+ page = '1'
+ if page == '1':
+ url = f'{xurl}/vodsearch/-------------.html?wd={key}'
+
+ else:
+ url = f'{xurl}/vodsearch/{key}----------{str(page)}---.html'
+
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="MTagBookList_tagBookItem")
+
+ for vod in soups:
+ names = vod.find('a', class_="MTagBookList_bookName")
+ name = names.text.strip()
+
+ ids = vod.find('a', class_="MTagBookList_bookName")
+ id = ids['href']
+
+ pics = vod.find('a', class_="image_imageScaleBox")
+ pic = pics.find('img')['src']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remarks = vod.find('a', class_="image_imageScaleBox")
+ remark = remarks.find('img')['alt']
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": '拾光推荐📽️' + remark
+ }
+ videos.append(video)
+
+ result['list'] = videos
+ result['page'] = page
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def searchContent(self, key, quick):
+ return self.searchContentPage(key, quick, '1')
+
+ def localProxy(self, params):
+ if params['type'] == "m3u8":
+ return self.proxyM3u8(params)
+ elif params['type'] == "media":
+ return self.proxyMedia(params)
+ elif params['type'] == "ts":
+ return self.proxyTs(params)
+ return None
+
+
+
+
+
diff --git a/py/光速.py b/py/光速.py
new file mode 100644
index 0000000..005919c
--- /dev/null
+++ b/py/光速.py
@@ -0,0 +1,193 @@
+# coding=utf-8
+# !/usr/bin/python
+# by嗷呜
+import re
+import sys
+from urllib.parse import quote
+from Crypto.Hash import MD5
+sys.path.append("..")
+from Crypto.Cipher import AES
+from Crypto.Util.Padding import pad, unpad
+from base64 import b64encode, b64decode
+import json
+import time
+from base.spider import Spider
+
+
+class Spider(Spider):
+
+ def getName(self):
+ return "光速"
+
+ def init(self, extend=""):
+ self.host = self.gethost()
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def action(self, action):
+ pass
+
+ def destroy(self):
+ pass
+
+ def homeContent(self, filter):
+ data = self.getdata("/api.php/getappapi.index/initV119")
+ dy = {"class": "类型", "area": "地区", "lang": "语言", "year": "年份", "letter": "字母", "by": "排序",
+ "sort": "排序", }
+ filters = {}
+ classes = []
+ json_data = data["type_list"]
+ homedata = data["banner_list"]
+ for item in json_data:
+ if item["type_name"] == "全部":
+ continue
+ has_non_empty_field = False
+ jsontype_extend = json.loads(item["type_extend"])
+ homedata.extend(item["recommend_list"])
+ jsontype_extend["sort"] = "最新,最热,最赞"
+ classes.append({"type_name": item["type_name"], "type_id": item["type_id"]})
+ for key in dy:
+ if key in jsontype_extend and jsontype_extend[key].strip() != "":
+ has_non_empty_field = True
+ break
+ if has_non_empty_field:
+ filters[str(item["type_id"])] = []
+ for dkey in jsontype_extend:
+ if dkey in dy and jsontype_extend[dkey].strip() != "":
+ values = jsontype_extend[dkey].split(",")
+ value_array = [{"n": value.strip(), "v": value.strip()} for value in values if
+ value.strip() != ""]
+ filters[str(item["type_id"])].append({"key": dkey, "name": dy[dkey], "value": value_array})
+ result = {}
+ result["class"] = classes
+ result["filters"] = filters
+ result["list"] = homedata
+ return result
+
+ def homeVideoContent(self):
+ pass
+
+ def categoryContent(self, tid, pg, filter, extend):
+ body = {"area": extend.get('area', '全部'), "year": extend.get('year', '全部'), "type_id": tid, "page": pg,
+ "sort": extend.get('sort', '最新'), "lang": extend.get('lang', '全部'),
+ "class": extend.get('class', '全部')}
+ result = {}
+ data = self.getdata("/api.php/getappapi.index/typeFilterVodList", body)
+ result["list"] = data["recommend_list"]
+ result["page"] = pg
+ result["pagecount"] = 9999
+ result["limit"] = 90
+ result["total"] = 999999
+ return result
+
+ def detailContent(self, ids):
+ body = f"vod_id={ids[0]}"
+ data = self.getdata("/api.php/getappapi.index/vodDetail", body)
+ vod = data["vod"]
+
+ play = []
+ names = []
+ for itt in data["vod_play_list"]:
+ a = []
+ names.append(itt["player_info"]["show"])
+ parse = itt["player_info"]["parse"]
+ ua = ''
+ if itt["player_info"].get("user_agent", ''):
+ ua = b64encode(itt["player_info"]["user_agent"].encode('utf-8')).decode('utf-8')
+ for it in itt["urls"]:
+ url = it["url"]
+ if not re.search(r'\.m3u8|\.mp4', url):
+ url = parse + '@@' + url
+ url = b64encode(url.encode('utf-8')).decode('utf-8')
+ a.append(f"{it['name']}${url}|||{ua}|||{it['token']}")
+ play.append("#".join(a))
+ vod["vod_play_from"] = "$$$".join(names)
+ vod["vod_play_url"] = "$$$".join(play)
+ result = {"list": [vod]}
+ return result
+
+ def searchContent(self, key, quick, pg="1"):
+ body = f"keywords={key}&type_id=0&page={pg}"
+ data = self.getdata("/api.php/getappapi.index/searchList", body)
+ result = {"list": data["search_list"], "page": pg}
+ return result
+
+ phend = {
+ 'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 11; M2012K10C Build/RP1A.200720.011)'}
+
+ def playerContent(self, flag, id, vipFlags):
+ ids = id.split("|||")
+ if ids[1]: self.phend['User-Agent'] = b64decode(ids[1]).decode('utf-8')
+ url = b64decode(ids[0]).decode('utf-8')
+ if not re.search(r'\.m3u8|\.mp4', url):
+ a = url.split("@@")
+ body = f"parse_api={a[0]}&url={quote(self.aes('encrypt', a[1]))}&token={ids[-1]}"
+ jd = self.getdata("/api.php/getappapi.index/vodParse", body)['json']
+ url = json.loads(jd)['url']
+ # if '.mp4' not in url:
+ # l=self.fetch(url, headers=self.phend,allow_redirects=False)
+ # if l.status_code == 200 and l.headers.get('Location',''):
+ # url=l.headers['Location']
+ if '.jpg' in url or '.png' in url or '.jpeg' in url:
+ url = self.getProxyUrl() + "&url=" + b64encode(url.encode('utf-8')).decode('utf-8') + "&type=m3u8"
+ result = {}
+ result["parse"] = 0
+ result["url"] = url
+ result["header"] = self.phend
+ return result
+
+ def localProxy(self, param):
+ url = b64decode(param["url"]).decode('utf-8')
+ durl = url[:url.rfind('/')]
+ data = self.fetch(url, headers=self.phend).content.decode("utf-8")
+ inde = None
+ pd = True
+ lines = data.strip().split('\n')
+ for index, string in enumerate(lines):
+ # if '#EXT-X-DISCONTINUITY' in string and pd:
+ # pd = False
+ # inde = index
+ if '#EXT' not in string and 'http' not in string:
+ lines[index] = durl + ('' if string.startswith('/') else '/') + string
+ if inde:
+ del lines[inde:inde + 4]
+ data = '\n'.join(lines)
+ return [200, "application/vnd.apple.mpegur", data]
+
+ def gethost(self):
+ host = self.fetch('https://jingyu-1312635929.cos.ap-nanjing.myqcloud.com/1.json').text.strip()
+ return host
+
+ def aes(self, operation, text):
+ key = "4d83b87c4c5ea111".encode("utf-8")
+ iv = key
+ if operation == "encrypt":
+ cipher = AES.new(key, AES.MODE_CBC, iv)
+ ct_bytes = cipher.encrypt(pad(text.encode("utf-8"), AES.block_size))
+ ct = b64encode(ct_bytes).decode("utf-8")
+ return ct
+ elif operation == "decrypt":
+ cipher = AES.new(key, AES.MODE_CBC, iv)
+ pt = unpad(cipher.decrypt(b64decode(text)), AES.block_size)
+ return pt.decode("utf-8")
+
+ def header(self):
+ t = str(int(time.time()))
+ md5_hash = MD5.new()
+ md5_hash.update(t.encode('utf-8'))
+ signature_md5 = md5_hash.hexdigest()
+ header = {"User-Agent": "okhttp/3.14.9", "app-version-code": "300", "app-ui-mode": "light",
+ "app-user-device-id": signature_md5, "app-api-verify-time": t,
+ "app-api-verify-sign": self.aes("encrypt", t), "Content-Type": "application/x-www-form-urlencoded"}
+ return header
+
+ def getdata(self, path, data=None):
+ # data = self.post(self.host + path, headers=self.header(), data=data).text
+ data = self.post(self.host + path, headers=self.header(), data=data, verify=False).json()["data"]
+ data1 = self.aes("decrypt", data)
+ return json.loads(data1)
diff --git a/py/奈飞影视.py b/py/奈飞影视.py
new file mode 100644
index 0000000..d91d7f2
--- /dev/null
+++ b/py/奈飞影视.py
@@ -0,0 +1,377 @@
+"""
+
+作者 凯悦宾馆 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
+ ====================kaiyuebinguan====================
+
+"""
+
+import requests
+from bs4 import BeautifulSoup
+import re
+from base.spider import Spider
+import sys
+import json
+import base64
+import urllib.parse
+
+sys.path.append('..')
+
+xurl = "https://www.netfly.tv"
+
+headerx = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
+ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
+
+pm = ''
+
+
+class Spider(Spider):
+ global xurl
+ global headerx
+
+ def getName(self):
+ return "首页"
+
+ def init(self, extend):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
+ if pl == 3:
+ plx = []
+ while True:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ break
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ break
+ middle_text = text[start_index + len(start_str):end_index]
+ plx.append(middle_text)
+ text = text.replace(start_str + middle_text + end_str, '')
+ if len(plx) > 0:
+ purl = ''
+ for i in range(len(plx)):
+ matches = re.findall(start_index1, plx[i])
+ output = ""
+ for match in matches:
+ match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
+ if match3:
+ number = match3.group(1)
+ else:
+ number = 0
+ if 'http' not in match[0]:
+ output += f"#{'📽️丢丢👉' + match[1]}${number}{xurl}{match[0]}"
+ else:
+ output += f"#{'📽️丢丢👉' + match[1]}${number}{match[0]}"
+ output = output[1:]
+ purl = purl + output + "$$$"
+ purl = purl[:-3]
+ return purl
+ else:
+ return ""
+ else:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ return ""
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ return ""
+
+ if pl == 0:
+ middle_text = text[start_index + len(start_str):end_index]
+ return middle_text.replace("\\", "")
+
+ if pl == 1:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ jg = ' '.join(matches)
+ return jg
+
+ if pl == 2:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ new_list = [f'✨丢丢👉{item}' for item in matches]
+ jg = '$$$'.join(new_list)
+ return jg
+
+ def homeContent(self, filter):
+ result = {}
+ result = {"class": [{"type_id": "/vod/show/1", "type_name": "丢丢电影🌠"},
+ {"type_id": "/vod/show/2", "type_name": "丢丢剧集🌠"},
+ {"type_id": "/vod/show/3", "type_name": "丢丢综艺🌠"},
+ {"type_id": "/vod/show/4", "type_name": "丢丢动漫🌠"},
+ {"type_id": "/vod/show/5", "type_name": "丢丢其他🌠"}],
+
+ "list": [],
+ "filters": {"/vod/show/1": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": ""},
+ {"n": "2024", "v": "2024"},
+ {"n": "2023", "v": "2023"},
+ {"n": "2022", "v": "2022"},
+ {"n": "2021", "v": "2021"},
+ {"n": "2020", "v": "2020"},
+ {"n": "2019", "v": "2019"},
+ {"n": "2018", "v": "2018"}]}],
+ "/vod/show/2": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": ""},
+ {"n": "2024", "v": "2024"},
+ {"n": "2023", "v": "2023"},
+ {"n": "2022", "v": "2022"},
+ {"n": "2021", "v": "2021"},
+ {"n": "2020", "v": "2020"},
+ {"n": "2019", "v": "2019"},
+ {"n": "2018", "v": "2018"}]}],
+ "/vod/show/3": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": ""},
+ {"n": "2024", "v": "2024"},
+ {"n": "2023", "v": "2023"},
+ {"n": "2022", "v": "2022"},
+ {"n": "2021", "v": "2021"},
+ {"n": "2020", "v": "2020"},
+ {"n": "2019", "v": "2019"},
+ {"n": "2018", "v": "2018"}]}],
+ "/vod/show/4": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": ""},
+ {"n": "2024", "v": "2024"},
+ {"n": "2023", "v": "2023"},
+ {"n": "2022", "v": "2022"},
+ {"n": "2021", "v": "2021"},
+ {"n": "2020", "v": "2020"},
+ {"n": "2019", "v": "2019"},
+ {"n": "2018", "v": "2018"}]}],
+ "/vod/show/5": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": ""},
+ {"n": "2024", "v": "2024"},
+ {"n": "2023", "v": "2023"},
+ {"n": "2022", "v": "2022"},
+ {"n": "2021", "v": "2021"},
+ {"n": "2020", "v": "2020"},
+ {"n": "2019", "v": "2019"},
+ {"n": "2018", "v": "2018"}]}]}}
+
+ return result
+
+ def homeVideoContent(self):
+ videos = []
+ try:
+ detail = requests.get(url=xurl, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ res = self.extract_middle_text(res, '
', '专题片单', 0)
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="module-items")
+
+ for soup in soups:
+ vods = soup.find_all('a')
+
+ for vod in vods:
+
+ name = vod['title']
+
+ id = vod['href']
+
+ pics = vod.find('div', class_="module-item-pic")
+ pic = pics.find('img')['data-original']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'module-item-note">', '
', 0)
+
+ video = {
+ "vod_id": id,
+ "vod_name": '丢丢📽️' + name,
+ "vod_pic": pic,
+ "vod_remarks": '丢丢▶️' + remark
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ return result
+ except:
+ pass
+
+ def categoryContent(self, cid, pg, filter, ext):
+ result = {}
+ if pg:
+ page = int(pg)
+ else:
+ page = 1
+ page = int(pg)
+ videos = []
+
+ if '年代' in ext.keys():
+ NdType = ext['年代']
+ else:
+ NdType = ''
+
+ if page == '1':
+ url = f'{xurl}{cid}-----------.html'
+
+ else:
+ url = f'{xurl}{cid}--------{str(page)}---{NdType}.html'
+
+ try:
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ res = self.extract_middle_text(res, '按评分排序', '
', 0)
+ doc = BeautifulSoup(res, "lxml")
+
+ for soup in doc:
+ vods = soup.find_all('a')
+
+ for vod in vods:
+
+ name = vod['title']
+
+ id = vod['href']
+
+ pics = vod.find('div', class_="module-item-pic")
+ pic = pics.find('img')['data-original']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'module-item-note">', '
', 0)
+
+ video = {
+ "vod_id": id,
+ "vod_name": '丢丢📽️' + name,
+ "vod_pic": pic,
+ "vod_remarks": '丢丢▶️' + remark
+ }
+ videos.append(video)
+
+ except:
+ pass
+ result = {'list': videos}
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ global pm
+ did = ids[0]
+ result = {}
+ videos = []
+ playurl = ''
+ if 'http' not in did:
+ did = xurl + did
+ res1 = requests.get(url=did, headers=headerx)
+ res1.encoding = "utf-8"
+ res = res1.text
+
+ content = '😸丢丢🎉为您介绍剧情📢本资源来源于网络🚓侵权请联系删除👉' + self.extract_middle_text(res,'20px;">','', 0)
+ content = content.replace('\u3000', '').replace(' ', '').replace('
', '').replace('\n', '')
+
+ xianlu = self.extract_middle_text(res, '
',2, 'data-dropdown-value=".*?">
(.*?)')
+
+ bofang = self.extract_middle_text(res, '
(.*?)')
+
+ videos.append({
+ "vod_id": did,
+ "vod_actor": '😸皮皮 😸灰灰',
+ "vod_director": '😸丢丢',
+ "vod_content": content,
+ "vod_play_from": xianlu,
+ "vod_play_url": bofang
+ })
+
+ result['list'] = videos
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+ parts = id.split("http")
+ xiutan = 0
+ if xiutan == 0:
+ if len(parts) > 1:
+ before_https, after_https = parts[0], 'http' + parts[1]
+ res = requests.get(url=after_https, headers=headerx)
+
+ url = self.extract_middle_text(res.text, '},"url":"', '"', 0).replace('\\', '')
+
+ result = {}
+ result["parse"] = xiutan
+ result["playUrl"] = ''
+ result["url"] = url
+ result["header"] = headerx
+ return result
+
+
+ def searchContentPage(self, key, quick, page):
+ result = {}
+ videos = []
+ if not page:
+ page = '1'
+ if page == '1':
+ url = f'{xurl}/vod/search/-------------.html?wd={key}'
+
+ else:
+ url = f'{xurl}/vod/search/{key}----------{str(page)}---.html'
+
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="module-card-item")
+
+ for vod in soups:
+ names = vod.find('div', class_="module-item-pic")
+ name = names.find('img')['alt']
+
+ ids = vod.find('div', class_="module-card-item-title")
+ id = ids.find('a')['href']
+
+ pics = vod.find('div', class_="module-item-pic")
+ pic = pics.find('img')['data-original']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'module-item-note">', '
', 0)
+
+ video = {
+ "vod_id": id,
+ "vod_name": '丢丢📽️' + name,
+ "vod_pic": pic,
+ "vod_remarks": '丢丢▶️' + remark
+ }
+ videos.append(video)
+
+ result['list'] = videos
+ result['page'] = page
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def searchContent(self, key, quick):
+ return self.searchContentPage(key, quick, '1')
+
+ def localProxy(self, params):
+ if params['type'] == "m3u8":
+ return self.proxyM3u8(params)
+ elif params['type'] == "media":
+ return self.proxyMedia(params)
+ elif params['type'] == "ts":
+ return self.proxyTs(params)
+ return None
+
+
diff --git a/py/新视觉.py b/py/新视觉.py
new file mode 100644
index 0000000..168a0b9
--- /dev/null
+++ b/py/新视觉.py
@@ -0,0 +1,238 @@
+# coding=utf-8
+# !/usr/bin/python
+# by嗷呜
+import sys
+sys.path.append("..")
+import re
+import os
+from Crypto.Cipher import AES
+from Crypto.Util.Padding import pad, unpad
+from base64 import b64encode, b64decode
+import json
+from base.spider import Spider
+from urllib.parse import quote
+
+
+class Spider(Spider):
+
+ def getName(self):
+ return "视觉"
+
+ def init(self, extend=""):
+ self.host = self.host()
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def action(self, action):
+ pass
+
+ def destroy(self):
+ pass
+
+ def homeContent(self, filter):
+ data = self.fetch(
+ f"{self.host}/api/v3/drama/getCategory?orderBy=type_id",
+ headers=self.headers,
+ ).json()
+ dy = {
+ "class": "类型",
+ "area": "地区",
+ "lang": "语言",
+ "year": "年份",
+ "letter": "字母",
+ "by": "排序",
+ "sort": "排序",
+ }
+ filters = {}
+ classes = []
+ for item in data["data"]:
+ has_non_empty_field = False
+ jsontype_extend = json.loads(item["converUrl"])
+ classes.append({"type_name": item["name"], "type_id": str(item["id"])})
+ for key in dy:
+ if key in jsontype_extend and jsontype_extend[key].strip() != "":
+ has_non_empty_field = True
+ break
+ if has_non_empty_field:
+ filters[str(item["id"])] = []
+ for dkey in jsontype_extend:
+ if dkey in dy and jsontype_extend[dkey].strip() != "":
+ values = jsontype_extend[dkey].split(",")
+ value_array = [
+ {"n": value.strip(), "v": value.strip()}
+ for value in values
+ if value.strip() != ""
+ ]
+ filters[str(item["id"])].append(
+ {"key": dkey, "name": dy[dkey], "value": value_array}
+ )
+ result = {}
+ result["class"] = classes
+ result["filters"] = filters
+ return result
+
+ def homeVideoContent(self):
+ data = self.fetch(f"{self.host}/api/ex/v3/security/tag/list", headers=self.headers).json()["data"]
+ data1 = self.aes(self.aes(data, self.key[0]), self.key[1], 'decrypt', True)
+ list = []
+ for item in data1[0]['carousels']:
+ id = item['link'].split("id=")[1]
+ list.append({
+ "vod_id": id,
+ 'vod_name': item.get("title"),
+ 'vod_pic': item.get("cover"),
+ 'vod_remarks': item.get("sort"),
+ })
+ result = {"list": list}
+ return result
+
+ def categoryContent(self, tid, pg, filter, extend):
+ params = []
+ if extend.get('area'):
+ params.append(f"vodArea={extend['area']}")
+ if extend.get('classs'):
+ params.append(f"vodClass={extend['class']}")
+ params.append("pagesize=20")
+ params.append(f"typeId1={tid}")
+ params.append(f"page={pg}")
+ if extend.get('year'):
+ params.append(f"vodYear={extend['year']}")
+ body = '&'.join(params)
+ path = self.aes(self.aes(body, self.key[1], 'encrypt'), self.key[0], 'encrypt', True)
+ data = self.fetch(f"{self.host}/api/ex/v3/security/drama/list?query={path}", headers=self.headers).json()[
+ "data"]
+ data = self.aes(self.aes(data, self.key[0]), self.key[1], 'decrypt', True)['list']
+ list = []
+ for item in data:
+ list.append({
+ 'vod_id': item.get("id"),
+ 'vod_pic': item["coverImage"].get("path"),
+ 'vod_name': item.get("name"),
+ 'vod_year': item.get("year"),
+ 'vod_remarks': item.get("remark")
+ })
+ result = {}
+ result["list"] = list
+ result["page"] = pg
+ result["pagecount"] = 9999
+ result["limit"] = 90
+ result["total"] = 999999
+ return result
+
+ def detailContent(self, ids):
+ url = f"{self.host}/api/v3/drama/getDetail?id={ids[0]}"
+ data = self.fetch(url, headers=self.headers).json()["data"]
+ vod = {
+ 'vod_name': data.get("name"),
+ 'vod_area': data.get("area"),
+ 'type_name': data.get("clazz"),
+ 'vod_actor': data.get("actor"),
+ 'vod_director': data.get("director"),
+ 'vod_content': data.get("brief").strip(),
+ }
+ play = []
+ names = []
+ plays = {}
+ for itt in data["videos"]:
+ if itt["sourceCn"] not in names:
+ plays[itt["source"]] = []
+ names.append(itt["sourceCn"])
+ url = f"vodPlayFrom={itt['source']}&playUrl={itt['path']}"
+ if re.search(r"\.(mp4|m3u8|flv)$", itt["path"]):
+ url = itt["path"]
+ plays[itt["source"]].append(f"{itt['titleOld']}${url}")
+ for it in plays:
+ play.append("#".join(plays[it]))
+ vod["vod_play_from"] = "$$$".join(names)
+ vod["vod_play_url"] = "$$$".join(play)
+ result = {"list": [vod]}
+ return result
+
+ def searchContent(self, key, quick, pg=1):
+ body = f"pagesize=20&page={pg}&searchKeys={key}"
+ path = self.aes(self.aes(body, self.key[1], 'encrypt'), self.key[0], 'encrypt', True)
+ data = self.fetch(f"{self.host}/api/ex/v3/security/drama/list?query={path}", headers=self.headers).json()[
+ "data"]
+ data = self.aes(self.aes(data, self.key[0]), self.key[1], 'decrypt', True)['list']
+ list = []
+ for item in data:
+ list.append({
+ 'vod_id': item.get("id"),
+ 'vod_pic': item["coverImage"].get("path"),
+ 'vod_name': item.get("name"),
+ 'vod_year': item.get("year"),
+ 'vod_remarks': item.get("remark")
+ })
+ result = {"list": list, "page": pg}
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+ url = id
+ if "vodPlayFrom" in url:
+ try:
+ path = self.aes(self.aes(id, self.key[1], 'encrypt'), self.key[0], 'encrypt', True)
+ data = self.fetch(f"{self.host}/api/ex/v3/security/videoUsableUrl?query={path}", headers=self.headers).json()[
+ "data"]
+ url = self.aes(self.aes(data, self.key[0]), self.key[1], 'decrypt', True)['playUrl']
+ # try:
+ # url1 = self.fetch(url, headers=self.headers, timeout=5, allow_redirects=False).headers['Location']
+ # if "http" in url1 and url1:
+ # url = url1
+ # except:
+ # pass
+ except Exception as e:
+ pass
+ if '.jpg' in url or '.jpeg' in url or '.png' in url:
+ url = self.getProxyUrl() + "&url=" + b64encode(url.encode('utf-8')).decode('utf-8') + "&type=m3u8"
+ result = {}
+ result["parse"] = 0
+ result["url"] = url
+ result["header"] = {'User-Agent': 'okhttp/3.12.1'}
+ return result
+
+ def localProxy(self, param):
+ url = b64decode(param["url"]).decode('utf-8')
+ durl = url[:url.rfind('/')]
+ data = self.fetch(url, headers=self.headers).content.decode("utf-8")
+ lines = data.strip().split('\n')
+ for index, string in enumerate(lines):
+ if '#EXT' not in string and 'http' not in string:
+ lines[index] = durl + ('' if string.startswith('/') else '/') + string
+ data = '\n'.join(lines)
+ return [200, "application/vnd.apple.mpegur", data]
+
+ def host(self):
+ try:
+ url = self.fetch('https://www.shijue.pro/token.txt', headers=self.headers).json()['domain']
+ return url
+ except:
+ return "http://118.25.18.217:6632"
+
+ headers = {
+ 'User-Agent': 'okhttp/3.12.1',
+ 'Content-Type': 'application/json;'
+ }
+ key = ['TFLYWVJ5EG5YB1PLZLVVMGVLBGRIDCSW', 'nj6E5K4yYYT5W4ScJ3J3rJ2zrzcJkpTk']
+
+ def aes(self, word, key, mode='decrypt', bool=False):
+ key = key.encode('utf-8')
+ if mode == 'decrypt':
+ word = b64decode(word)
+ cipher = AES.new(key, AES.MODE_ECB)
+ decrypted = cipher.decrypt(word)
+ word = unpad(decrypted, AES.block_size).decode('utf-8')
+ if bool:
+ word = json.loads(word)
+ elif mode == 'encrypt':
+ cipher = AES.new(key, AES.MODE_ECB)
+ padded = pad(word.encode('utf-8'), AES.block_size)
+ encrypted = cipher.encrypt(padded)
+ word = b64encode(encrypted).decode('utf-8')
+ if bool:
+ word = quote(word)
+ return word
diff --git a/py/映播.py b/py/映播.py
new file mode 100644
index 0000000..eda2481
--- /dev/null
+++ b/py/映播.py
@@ -0,0 +1,411 @@
+"""
+
+作者 凯悦推荐 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
+ ====================kaiyuebinguan====================
+
+"""
+
+from Crypto.Util.Padding import unpad
+from urllib.parse import unquote
+from Crypto.Cipher import ARC4
+from base.spider import Spider
+from bs4 import BeautifulSoup
+import urllib.request
+import urllib.parse
+import binascii
+import requests
+import base64
+import json
+import time
+import sys
+import re
+import os
+
+sys.path.append('..')
+
+xurl = "https://www.ingbo.tv"
+
+headerx = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36'
+ }
+
+pm = ''
+
+class Spider(Spider):
+ global xurl
+ global headerx
+
+ def getName(self):
+ return "首页"
+
+ def init(self, extend):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
+ if pl == 3:
+ plx = []
+ while True:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ break
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ break
+ middle_text = text[start_index + len(start_str):end_index]
+ plx.append(middle_text)
+ text = text.replace(start_str + middle_text + end_str, '')
+ if len(plx) > 0:
+ purl = ''
+ for i in range(len(plx)):
+ matches = re.findall(start_index1, plx[i])
+ output = ""
+ for match in matches:
+ match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
+ if match3:
+ number = match3.group(1)
+ else:
+ number = 0
+ if 'http' not in match[0]:
+ output += f"#{'📽️集多👉' + match[1]}${number}{xurl}{match[0]}"
+ else:
+ output += f"#{'📽️集多👉' + match[1]}${number}{match[0]}"
+ output = output[1:]
+ purl = purl + output + "$$$"
+ purl = purl[:-3]
+ return purl
+ else:
+ return ""
+ else:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ return ""
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ return ""
+
+ if pl == 0:
+ middle_text = text[start_index + len(start_str):end_index]
+ return middle_text.replace("\\", "")
+
+ if pl == 1:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ jg = ' '.join(matches)
+ return jg
+
+ if pl == 2:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ new_list = [f'✨集多👉{item}' for item in matches]
+ jg = '$$$'.join(new_list)
+ return jg
+
+ def homeContent(self, filter):
+ result = {}
+ result = {"class": [{"type_id": "1", "type_name": "集多电影🌠"},
+ {"type_id": "2", "type_name": "集多剧集🌠"},
+ {"type_id": "4", "type_name": "集多动漫🌠"},
+ {"type_id": "40", "type_name": "集多短剧🌠"},
+ {"type_id": "3", "type_name": "集多综艺🌠"}],
+
+ "list": [],
+ "filters": {"1": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "2024", "v": "3"},
+ {"n": "2023", "v": "4"},
+ {"n": "2022", "v": "5"},
+ {"n": "2021", "v": "6"},
+ {"n": "2020", "v": "7"},
+ {"n": "2019", "v": "8"},
+ {"n": "2018", "v": "9"}]}],
+ "2": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "2024", "v": "3"},
+ {"n": "2023", "v": "4"},
+ {"n": "2022", "v": "5"},
+ {"n": "2021", "v": "6"},
+ {"n": "2020", "v": "7"},
+ {"n": "2019", "v": "8"},
+ {"n": "2018", "v": "9"}]}],
+ "3": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "2024", "v": "3"},
+ {"n": "2023", "v": "4"},
+ {"n": "2022", "v": "5"},
+ {"n": "2021", "v": "6"},
+ {"n": "2020", "v": "7"},
+ {"n": "2019", "v": "8"},
+ {"n": "2018", "v": "9"}]}],
+ "40": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "2024", "v": "3"},
+ {"n": "2023", "v": "4"},
+ {"n": "2022", "v": "5"},
+ {"n": "2021", "v": "6"},
+ {"n": "2020", "v": "7"},
+ {"n": "2019", "v": "8"},
+ {"n": "2018", "v": "9"}]}],
+ "4": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "2024", "v": "3"},
+ {"n": "2023", "v": "4"},
+ {"n": "2022", "v": "5"},
+ {"n": "2021", "v": "6"},
+ {"n": "2020", "v": "7"},
+ {"n": "2019", "v": "8"},
+ {"n": "2018", "v": "9"}]}]}}
+
+ return result
+
+ def homeVideoContent(self):
+ videos = []
+
+ try:
+
+ detail = requests.get(url=xurl, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ res = self.extract_middle_text(res, '
热门电影', '
推荐明星', 0)
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="swiper-wrapper cms-list-swiper")
+
+ for soup in soups:
+ vods = soup.find_all('div', class_="public-list-box")
+
+ for vod in vods:
+ names = vod.find('div', class_="public-list-div")
+ name = names.find('a')['title']
+
+ ids = vod.find('div', class_="public-list-div")
+ id = ids.find('a')['href']
+
+ pics = vod.find('a', class_="public-list-exp")
+ pic = pics.find('img')['src']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'hide ft2">', '', 0)
+ remark = remark.replace('\n', '').replace(' ', '')
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": '集多▶️' + remark
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ return result
+ except:
+ pass
+
+ def categoryContent(self, cid, pg, filter, ext):
+ result = {}
+ videos = []
+
+ if pg:
+ page = int(pg)
+ else:
+ page = 1
+
+ if '年代' in ext.keys():
+ NdType = ext['年代']
+ else:
+ NdType = ''
+
+ if page == '1':
+ url = f'{xurl}/vod/1/{cid}/0/0/0/0/0/0'
+
+ else:
+ url = f'{xurl}/vod/list/{str(page)}/{cid}/0/{NdType}/0/0/0/0'
+
+ try:
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="public-pic-b")
+
+ for vod in soups:
+ names = vod.find('a', class_="public-list-exp")
+ name = names.find('img')['alt']
+
+ ids = vod.find('div', class_="public-list-div")
+ id = ids.find('a')['href']
+
+ pics = vod.find('a', class_="public-list-exp")
+ pic = pics.find('img')['data-original']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'hide ft2">', '', 0)
+ remark = remark.replace('\n', '').replace(' ', '')
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": '集多▶️' + remark
+ }
+ videos.append(video)
+
+ except:
+ pass
+ result = {'list': videos}
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ global pm
+ did = ids[0]
+ result = {}
+ videos = []
+
+ if 'http' not in did:
+ did = xurl + did
+
+ res1 = requests.get(url=did, headers=headerx)
+ res1.encoding = "utf-8"
+ res = res1.text
+
+ url = 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1732707176882/jiduo.txt'
+ response = requests.get(url)
+ response.encoding = 'utf-8'
+ code = response.text
+ name = self.extract_middle_text(code, "s1='", "'", 0)
+ Jumps = self.extract_middle_text(code, "s2='", "'", 0)
+
+ content = '😸集多🎉为您介绍剧情📢本资源来源于网络🚓侵权请联系删除👉' + self.extract_middle_text(res,'描述:','
', 0)
+ content = content.replace('\n', '').replace(' ', '')
+
+ if name not in content:
+ bofang = Jumps
+ else:
+ bofang = self.extract_middle_text(res, '
', 3,'href="(.*?)" class="hide">\s+(.*?)\s+')
+
+ xianlu = self.extract_middle_text(res, '
','
',2, 'href=".*?" title=".*?">(.*?)')
+
+ videos.append({
+ "vod_id": did,
+ "vod_actor": '集多和他的朋友们',
+ "vod_director": '集多',
+ "vod_content": content,
+ "vod_play_from": xianlu,
+ "vod_play_url": bofang
+ })
+
+ result['list'] = videos
+ return result
+
+ def playerContent(self, flag, id, vipFlags):
+ parts = id.split("http")
+
+ xiutan = 0
+
+ if xiutan == 0:
+ if len(parts) > 1:
+ before_https, after_https = parts[0], 'http' + parts[1]
+
+ if '/tp/jd.m3u8' in after_https:
+ url = after_https
+ else:
+ res = requests.get(url=after_https, headers=headerx)
+ res = res.text
+
+ url = self.extract_middle_text(res, 'u0026url=', "'", 0).replace('\\', '')
+
+ result = {}
+ result["parse"] = xiutan
+ result["playUrl"] = ''
+ result["url"] = url
+ result["header"] = headerx
+ return result
+
+ def searchContentPage(self, key, quick, page):
+ result = {}
+ videos = []
+
+ if not page:
+ page = '1'
+ if page == '1':
+ url = f'{xurl}/public/auto/search1.html?keyword={key}'
+
+ else:
+ url = f'{xurl}/public/auto/search1.html?keyword={key}&page={str(page)}'
+
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="public-list-box")
+
+ for vod in soups:
+ names = vod.find('a', class_="public-list-exp")
+ name = names.find('img')['alt']
+
+ ids = vod.find('div', class_="public-list-div")
+ id = ids.find('a')['href']
+
+ pics = vod.find('a', class_="public-list-exp")
+ pic = pics.find('img')['data-original']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remark = self.extract_middle_text(str(vod), 'hide ft2">', '', 0)
+ remark = remark.replace('\n', '').replace(' ', '')
+
+ video = {
+ "vod_id": id,
+ "vod_name": name,
+ "vod_pic": pic,
+ "vod_remarks": '集多▶️' + remark
+ }
+ videos.append(video)
+
+ result['list'] = videos
+ result['page'] = page
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def searchContent(self, key, quick):
+ return self.searchContentPage(key, quick, '1')
+
+ def localProxy(self, params):
+ if params['type'] == "m3u8":
+ return self.proxyM3u8(params)
+ elif params['type'] == "media":
+ return self.proxyMedia(params)
+ elif params['type'] == "ts":
+ return self.proxyTs(params)
+ return None
+
+
+
+
+
+
diff --git a/py/策驰影院.py b/py/策驰影院.py
new file mode 100644
index 0000000..db08806
--- /dev/null
+++ b/py/策驰影院.py
@@ -0,0 +1,377 @@
+"""
+
+作者 凯悦宾馆 🚓 内容均从互联网收集而来 仅供交流学习使用 版权归原创者所有 如侵犯了您的权益 请通知作者 将及时删除侵权内容
+ ====================kaiyuebinguan====================
+
+"""
+
+from Crypto.Util.Padding import unpad
+from urllib.parse import unquote
+from Crypto.Cipher import ARC4
+from base.spider import Spider
+from bs4 import BeautifulSoup
+import urllib.request
+import urllib.parse
+import binascii
+import requests
+import base64
+import json
+import time
+import sys
+import re
+import os
+
+sys.path.append('..')
+
+xurl = "https://www.ccy1.com"
+
+headerx = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36'
+ }
+
+pm = ''
+
+class Spider(Spider):
+ global xurl
+ global headerx
+
+ def getName(self):
+ return "首页"
+
+ def init(self, extend):
+ pass
+
+ def isVideoFormat(self, url):
+ pass
+
+ def manualVideoCheck(self):
+ pass
+
+ def extract_middle_text(self, text, start_str, end_str, pl, start_index1: str = '', end_index2: str = ''):
+ if pl == 3:
+ plx = []
+ while True:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ break
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ break
+ middle_text = text[start_index + len(start_str):end_index]
+ plx.append(middle_text)
+ text = text.replace(start_str + middle_text + end_str, '')
+ if len(plx) > 0:
+ purl = ''
+ for i in range(len(plx)):
+ matches = re.findall(start_index1, plx[i])
+ output = ""
+ for match in matches:
+ match3 = re.search(r'(?:^|[^0-9])(\d+)(?:[^0-9]|$)', match[1])
+ if match3:
+ number = match3.group(1)
+ else:
+ number = 0
+ if 'http' not in match[0]:
+ output += f"#{'📽️丢丢👉' + match[1]}${number}{xurl}{match[0]}"
+ else:
+ output += f"#{'📽️丢丢👉' + match[1]}${number}{match[0]}"
+ output = output[1:]
+ purl = purl + output + "$$$"
+ purl = purl[:-3]
+ return purl
+ else:
+ return ""
+ else:
+ start_index = text.find(start_str)
+ if start_index == -1:
+ return ""
+ end_index = text.find(end_str, start_index + len(start_str))
+ if end_index == -1:
+ return ""
+
+ if pl == 0:
+ middle_text = text[start_index + len(start_str):end_index]
+ return middle_text.replace("\\", "")
+
+ if pl == 1:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ jg = ' '.join(matches)
+ return jg
+
+ if pl == 2:
+ middle_text = text[start_index + len(start_str):end_index]
+ matches = re.findall(start_index1, middle_text)
+ if matches:
+ new_list = [f'✨丢丢👉{item}' for item in matches]
+ jg = '$$$'.join(new_list)
+ return jg
+
+ def homeContent(self, filter):
+ result = {}
+ result = {"class": [{"type_id": "77", "type_name": "丢丢电影🌠"},
+ {"type_id": "78", "type_name": "丢丢剧集🌠"},
+ {"type_id": "80", "type_name": "丢丢动漫🌠"},
+ {"type_id": "164", "type_name": "丢丢4K🌠"},
+ {"type_id": "79", "type_name": "丢丢综艺🌠"},
+ {"type_id": "166", "type_name": "丢丢体育🌠"},
+ {"type_id": "170", "type_name": "丢丢演唱会🌠"},
+ {"type_id": "165", "type_name": "丢丢短剧🌠"}],
+
+ "list": [],
+ "filters": {"77": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "78": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "80": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "164": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "79": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "166": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "170": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}],
+ "165": [{"key": "年代",
+ "name": "年代",
+ "value": [{"n": "全部", "v": "0"},
+ {"n": "80年代", "v": "42"},
+ {"n": "90年代", "v": "43"},
+ {"n": "00年代", "v": "44"},
+ {"n": "10年代", "v": "45"},
+ {"n": "20年代", "v": "46"}]}]}}
+
+ return result
+
+ def homeVideoContent(self):
+ videos = []
+
+ try:
+ detail = requests.get(url=xurl, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="hide-b-20")
+
+ if soups and len(soups) > 1:
+ soups = soups[1]
+ vods = soups.find_all('div', class_="public-list-box")
+
+ for vod in vods:
+ names = vod.find('div', class_="public-list-div")
+ name = names.find('a')['title']
+
+ id = names.find('a')['href']
+
+ pic = vod.find('img')['data-src']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remarks = vod.find('span', class_="public-list-prb hide")
+ remark = remarks.text.strip()
+
+ video = {
+ "vod_id": id,
+ "vod_name": '丢丢📽️' + name,
+ "vod_pic": pic,
+ "vod_remarks": '丢丢▶️' + remark
+ }
+ videos.append(video)
+
+ result = {'list': videos}
+ return result
+ except:
+ pass
+
+ def categoryContent(self, cid, pg, filter, ext):
+ result = {}
+ videos = []
+
+ if pg:
+ page = int(pg)
+ else:
+ page = 1
+
+ if '年代' in ext.keys():
+ NdType = ext['年代']
+ else:
+ NdType = ''
+
+ if page == '1':
+ url = f'{xurl}/vod/list/1/{cid}/0/0/0/0/0/0'
+
+ else:
+ url = f'{xurl}/vod/list/{str(page)}/{cid}/0/{NdType}/0/0/0/0'
+
+ try:
+ detail = requests.get(url=url, headers=headerx)
+ detail.encoding = "utf-8"
+ res = detail.text
+ doc = BeautifulSoup(res, "lxml")
+
+ soups = doc.find_all('div', class_="border-box")
+
+ for soup in soups:
+ vods = soup.find_all('div', class_="public-list-box")
+
+ for vod in vods:
+
+ name = vod.find('img')['alt']
+
+ ids = vod.find('a', class_="public-list-exp")
+ id = ids['href']
+
+ pic = vod.find('img')['src']
+
+ if 'http' not in pic:
+ pic = xurl + pic
+
+ remarks = vod.find('span', class_="public-list-prb")
+ remark = remarks.text.strip()
+
+ video = {
+ "vod_id": id,
+ "vod_name": '丢丢📽️' + name,
+ "vod_pic": pic,
+ "vod_remarks": '丢丢▶️' + remark
+ }
+ videos.append(video)
+
+ except:
+ pass
+ result = {'list': videos}
+ result['page'] = pg
+ result['pagecount'] = 9999
+ result['limit'] = 90
+ result['total'] = 999999
+ return result
+
+ def detailContent(self, ids):
+ global pm
+ did = ids[0]
+ result = {}
+ videos = []
+
+ if 'http' not in did:
+ did = xurl + did
+
+ res1 = requests.get(url=did, headers=headerx)
+ res1.encoding = "utf-8"
+ res = res1.text
+
+ url = 'https://fs-im-kefu.7moor-fs1.com/ly/4d2c3f00-7d4c-11e5-af15-41bf63ae4ea0/1732697392729/didiu.txt'
+ response = requests.get(url)
+ response.encoding = 'utf-8'
+ code = response.text
+ name = self.extract_middle_text(code, "s1='", "'", 0)
+ Jumps = self.extract_middle_text(code, "s2='", "'", 0)
+
+ content = '😸丢丢🎉为您介绍剧情📢本资源来源于网络🚓侵权请联系删除👉' + self.extract_middle_text(res,'class="text cor3" >','
', 0)
+
+ if name not in content:
+ bofang = Jumps
+ else:
+ bofang = self.extract_middle_text(res, '