diff --git a/js/appysv1.js b/js/appysv1.js
new file mode 100644
index 0000000..e0243f6
--- /dev/null
+++ b/js/appysv1.js
@@ -0,0 +1,894 @@
+import { Crypto, _ } from 'assets://js/lib/cat.js'
+
+let host = '';
+let header = {
+ 'User-Agent': 'okhttp/3.12.11'
+};
+let siteKey = '';
+let siteType = '';
+let siteJx = '';
+
+const urlPattern1 = /api\.php\/.*?\/vod/;
+const urlPattern2 = /api\.php\/.+?\.vod/;
+const parsePattern = /\/.+\\?.+=/;
+const parsePattern1 = /.*(url|v|vid|php\?id)=/;
+const parsePattern2 = /https?:\/\/[^\/]*/;
+
+const htmlVideoKeyMatch = [
+ /player=new/,
+ /
0) {
+ const result = await getFinalVideo(flag, parseUrls, id);
+ if (result !== null) {
+ return JSON.stringify(result);
+ }
+ }
+
+ if (isVideo(id)) {
+ const result = {
+ parse: 0,
+ playUrl: "",
+ url: id
+ };
+ return JSON.stringify(result);
+ } else {
+ const result = {
+ parse: 1,
+ jx: "1",
+ url: id
+ };
+ return JSON.stringify(result);
+ }
+ } catch (e) {
+ // Handle any error here
+ }
+ return "";
+}
+
+async function search(key, quick) {
+ try {
+ const apiUrl = host;
+ const url = getSearchUrl(apiUrl, encodeURIComponent(key));
+ const json = await request(url, getHeaders(url));
+ const obj = JSON.parse(json);
+ let jsonArray = null;
+ const videos = [];
+
+ if (obj.list instanceof Array) {
+ jsonArray = obj.list;
+ } else if (obj.data instanceof Object && obj.data.list instanceof Array) {
+ jsonArray = obj.data.list;
+ } else if (obj.data instanceof Array) {
+ jsonArray = obj.data;
+ }
+
+ if (jsonArray !== null) {
+ for (const vObj of jsonArray) {
+ if (vObj.vod_id) {
+ const v = {
+ vod_id: vObj.vod_id,
+ vod_name: vObj.vod_name,
+ vod_pic: vObj.vod_pic,
+ vod_remarks: vObj.vod_remarks
+ };
+ videos.push(v);
+ } else {
+ const v = {
+ vod_id: vObj.nextlink,
+ vod_name: vObj.title,
+ vod_pic: vObj.pic,
+ vod_remarks: vObj.state
+ };
+ videos.push(v);
+ }
+ }
+ }
+
+ const result = { list: videos };
+ return JSON.stringify(result);
+ } catch (error) {
+
+ }
+ return "";
+}
+
+
+
+async function getFinalVideo(flag, parseUrls, url) {
+ let htmlPlayUrl = "";
+ for (const parseUrl of parseUrls) {
+ if (parseUrl === "" || parseUrl === "null") {
+ continue;
+ }
+ const playUrl = parseUrl + url;
+ const content = await request(playUrl, null, 10000); // 10秒请求,能更好过滤webjx
+ let tryJson = null;
+ try {
+ tryJson = jsonParse(url, content);
+ } catch (error) { }
+
+ if (tryJson !== null && tryJson.hasOwnProperty("url") && tryJson.hasOwnProperty("header")) {
+ tryJson.header = JSON.stringify(tryJson.header);
+ return tryJson;
+ }
+
+ if (content.includes(" 0) {
+ headers["User-Agent"] = " " + ua;
+ }
+
+ let referer = "";
+ if (jsonPlayData.hasOwnProperty("referer")) {
+ referer = jsonPlayData.referer;
+ } else if (jsonPlayData.hasOwnProperty("Referer")) {
+ referer = jsonPlayData.Referer;
+ }
+ if (referer.trim().length > 0) {
+ headers["Referer"] = " " + referer;
+ }
+
+ headers = fixJsonVodHeader(headers, input, url);
+
+ const taskResult = {
+ header: headers,
+ url: url,
+ parse: "0"
+ };
+
+ return taskResult;
+ } catch (error) {
+
+ }
+ return null;
+}
+
+function isVip(url) {
+ try {
+ let isVip = false;
+ const host = new URL(url).hostname;
+ const vipWebsites = ["iqiyi.com", "v.qq.com", "youku.com", "le.com", "tudou.com", "mgtv.com", "sohu.com", "acfun.cn", "bilibili.com", "baofeng.com", "pptv.com"];
+ for (let b = 0; b < vipWebsites.length; b++) {
+ if (host.includes(vipWebsites[b])) {
+ if (vipWebsites[b] === "iqiyi.com") {
+ // 爱奇艺需要特殊处理
+ if (url.includes("iqiyi.com/a_") || url.includes("iqiyi.com/w_") || url.includes("iqiyi.com/v_")) {
+ isVip = true;
+ break;
+ }
+ } else {
+ isVip = true;
+ break;
+ }
+ }
+ }
+ return isVip;
+ } catch (e) {
+ }
+ return false;
+}
+
+
+function isBlackVodUrl(input, url) {
+ return url.includes("973973.xyz") || url.includes(".fit:");
+}
+
+
+function fixJsonVodHeader(headers, input, url) {
+ if (headers === null) {
+ headers = {};
+ }
+
+ if (input.includes("www.mgtv.com")) {
+ headers["Referer"] = " ";
+ headers["User-Agent"] = " Mozilla/5.0";
+ } else if (url.includes("titan.mgtv")) {
+ headers["Referer"] = " ";
+ headers["User-Agent"] = " Mozilla/5.0";
+ } else if (input.includes("bilibili")) {
+ headers["Referer"] = " https://www.bilibili.com/";
+ headers["User-Agent"] = " " + Misc.UaWinChrome;
+ }
+
+ return headers;
+}
+
+
+
+
+
+const snifferMatch = /http((?!http).){26,}?\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)\?.*|http((?!http).){26,}\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg)|http((?!http).){26,}\/m3u8\?pt=m3u8.*|http((?!http).)*?default\.ixigua\.com\/.*|http((?!http).)*?cdn-tos[^\?]*|http((?!http).)*?\/obj\/tos[^\?]*|http.*?\/player\/m3u8play\.php\?url=.*|http.*?\/player\/.*?[pP]lay\.php\?url=.*|http.*?\/playlist\/m3u8\/\?vid=.*|http.*?\.php\?type=m3u8&.*|http.*?\/download.aspx\?.*|http.*?\/api\/up_api.php\?.*|https.*?\.66yk\.cn.*|http((?!http).)*?netease\.com\/file\/.*/;
+
+function isVideoFormat(url) {
+ if (snifferMatch.test(url)) {
+ return !url.includes("cdn-tos") || !url.includes(".js");
+ }
+ return false;
+
+}
+
+function isVideo(url) {
+ if (!url.includes(".mp4") || !url.includes(".m3u8")) {
+ return true;
+ }
+ return false;
+}
+
+
+
+
+function UA(url) {
+ if (url.includes(".vod")) {
+ return "okhttp/4.1.0";
+ }
+}
+
+function getCateUrl(URL) {
+ if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return URL + "nav?token=";
+ } else if (URL.includes(".vod")) {
+ return URL + "/types";
+ } else {
+ return "";
+ }
+}
+
+function getPlayUrlPrefix(URL) {
+ if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return URL + "video_detail?id=";
+ } else if (URL.includes(".vod")) {
+ return URL + "/detail?vod_id=";
+ } else {
+ return "";
+ }
+}
+
+function getRecommendUrl(URL) {
+ if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return URL + "index_video?token=";
+ } else if (URL.includes(".vod")) {
+ return URL + "/vodPhbAll";
+ } else {
+ return "";
+ }
+}
+
+function getFilterTypes(URL, typeExtend) {
+ let str = "";
+
+ if (typeExtend !== null) {
+ for (let key in typeExtend) {
+ if (key === "class" || key === "area" || key === "lang" || key === "year") {
+ try {
+
+ str += "筛选" + key + "+全部=+" + typeExtend[key].replace(/,/g, "+") + "\n";
+ } catch (e) { }
+ }
+ }
+ }
+
+ if (URL.includes(".vod")) {
+ str += "\n" + "排序+全部=+最新=time+最热=hits+评分=score";
+ } else if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ // Do nothing, leave the string as it is.
+ } else {
+ str = "分类+全部=+电影=movie+连续剧=tvplay+综艺=tvshow+动漫=comic+4K=movie_4k+体育=tiyu\n筛选class+全部=+喜剧+爱情+恐怖+动作+科幻+剧情+战争+警匪+犯罪+动画+奇幻+武侠+冒险+枪战+恐怖+悬疑+惊悚+经典+青春+文艺+微电影+古装+历史+运动+农村+惊悚+惊悚+伦理+情色+福利+三级+儿童+网络电影\n筛选area+全部=+大陆+香港+台湾+美国+英国+法国+日本+韩国+德国+泰国+印度+西班牙+加拿大+其他\n筛选year+全部=+2023+2022+2021+2020+2019+2018+2017+2016+2015+2014+2013+2012+2011+2010+2009+2008+2007+2006+2005+2004+2003+2002+2001+2000";
+ }
+
+ return str;
+}
+
+function getCateFilterUrlSuffix(URL) {
+ if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&limit=18&pg=#PN#";
+ } else if (URL.includes(".vod")) {
+ return "&class=筛选class&area=筛选area&lang=筛选lang&year=筛选year&by=排序&limit=18&page=#PN#";
+ } else {
+ return "&page=#PN#&area=筛选area&type=筛选class&start=筛选year";
+ }
+}
+
+function getCateFilterUrlPrefix(URL) {
+ if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return URL + "video?tid=";
+ } else if (URL.includes(".vod")) {
+ return URL + "?type=";
+ } else {
+ return URL + "?ac=list&class=";
+ }
+}
+
+function isBan(key) {
+ return key === "伦理" || key === "情色" || key === "福利";
+}
+
+function getSearchUrl(URL, KEY) {
+ if (URL.includes(".vod")) {
+ return URL + "?wd=" + KEY + "&page=";
+ } else if (URL.includes("api.php/app") || URL.includes("xgapp")) {
+ return URL + "search?text=" + KEY + "&pg=";
+ } else if (urlPattern1.test(URL)) {
+ return URL + "?ac=list&zm=" + KEY + "&page=";
+ }
+ return "";
+}
+
+function findJsonArray(obj, match, result) {
+ Object.keys(obj).forEach((k) => {
+ try {
+ const o = obj[k];
+ if (k === match && Array.isArray(o)) {
+ result.push(o);
+ }
+ if (typeof o === "object" && o !== null) {
+ if (Array.isArray(o)) {
+ o.forEach((item) => {
+ if (typeof item === "object" && item !== null) {
+ findJsonArray(item, match, result);
+ }
+ });
+ } else {
+ findJsonArray(o, match, result);
+ }
+ }
+ } catch (e) {
+ }
+ });
+}
+
+function jsonArr2Str(array) {
+ const strings = [];
+ for (let i = 0; i < array.length; i++) {
+ try {
+ strings.push(array[i]);
+ } catch (e) {
+ }
+ }
+ return strings.join(",");
+}
+
+function getHeaders(URL) {
+ const headers = {};
+ headers["User-Agent"] = UA(URL);
+ return headers;
+}
+
+function isJsonString(str) {
+ try {
+ JSON.parse(str);
+ } catch (e) {
+ return false;
+ }
+ return true;
+}
+
+
+
+
+export function __jsEvalReturn() {
+ return {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ };
+}
+