// ==UserScript== // @name gaze // @namespace gmspider // @version 2024.12.01 // @description gaze GMSpider // @author Luomo // @match https://gaze.run/* // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.slim.min.js // @require https://cdn.jsdelivr.net/gh/CatVodSpider-GM/Spiders-Lib@main/lib/ajaxhook-3.0.3.min.js // @require https://unpkg.com/blob-util/dist/blob-util.min.js // @grant unsafeWindow // @run-at document-end // ==/UserScript== console.log(JSON.stringify(GM_info)); (function () { Object.defineProperty(Object.prototype, '_detectLoopStopped', { set: function () { return true; }, get: function () { console.log("devtools-detector disabled"); return false; } }); })(); (function () { const GMSpiderArgs = {}; if (typeof GmSpiderInject !== 'undefined') { let args = JSON.parse(GmSpiderInject.GetSpiderArgs()); GMSpiderArgs.fName = args.shift(); GMSpiderArgs.fArgs = args; } else { GMSpiderArgs.fName = "detailContent"; GMSpiderArgs.fArgs = [true]; } Object.freeze(GMSpiderArgs); let _gotData = function (data) { console.log("_gotData hook failed", data) }; let hookRequestUrl = ""; const {unProxy, originXhr} = proxy({ onRequest: (config, handler) => { let params = {}; switch (GMSpiderArgs.fName) { case "categoryContent": let filter = GMSpiderArgs.fArgs[3]; params = { mform: GMSpiderArgs.fArgs[0], mcountry: filter?.mcountry ?? "all", "tag_arr[]": filter?.mtag ?? "all", page: GMSpiderArgs.fArgs[1], sort: filter?.sort ?? "updatetime", album: "all", title: "", years: filter?.years ?? "all", }; break; case "searchContent": let title = GMSpiderArgs.fArgs[0]; params = { mform: "all", mcountry: "all", "tag_arr[]": "all", page: GMSpiderArgs.fArgs[2], sort: "updatetime", album: "all", title: GMSpiderArgs.fArgs[0], years: "all", }; break; } if (config.url.includes("filter_movielist")) { if (!$.isEmptyObject(params)) { config.body = $.param(params) } } handler.next(config); }, onResponse: (response, handler) => { if (response.config.url.includes("filter_movielist")) { let data = JSON.parse(response.response); _gotData(data); } handler.next(response); } }, unsafeWindow) let _gotSrc = function (src) { console.log("_gotSrc hook failed", data) }; let _player; Object.defineProperty(unsafeWindow, 'player', { configurable: true, get: () => _player, set: (player) => { _player = new Proxy(player, { get(target, prop) { if (prop === "src") { // console.log("src", src); return new Proxy(target[prop], { apply: (target, thisArg, argumentsList) => { _gotSrc(argumentsList[0]); // return false; return Reflect.apply(target, thisArg, argumentsList); } }); } else { return Reflect.get(target, prop); } } }) }, }); const GmSpider = (function () { function listVideos(result) { return new Promise(function (resolve) { _gotData = resolve; }).then(async (movieList) => { console.log("movelist", movieList); movieList.mlist.forEach(function (item) { result.list.push({ vod_id: item.mid, vod_name: item.title, vod_pic: item.cover_img, vod_remarks: "豆瓣 " + item.grade, vod_year: item.definition }) }) result.pagecount = movieList.pages; return result; }); } async function getPlay(src) { let playData = {}; if (src.startsWith("blob:")) { let blob = await fetch(src).then(r => r.blob()); await blobUtil.blobToBinaryString(blob).then(function (fileData) { fileData = fileData.replaceAll(' ', ""); playData = { type: "file", data: { header: { "User-Agent": window.navigator.userAgent, "Referer": window.location.href }, file: fileData } } }); } else { playData = { type: "match", data: { url: src } } } console.log(playData); return playData; } return { homeContent: function (filter) { const defaultFilters = [{ key: "mcountry", name: "地区", value: [] }, { key: "mtag", name: "类型", value: [] }, { key: "sort", name: "排序", value: [] }]; defaultFilters.forEach((item) => { $(`.${item.key} .filter-item a`).each(function () { item.value.push({ n: $(this).text(), v: $(this).data("filter") }); }) }) let yearFilter = [{ n: "全部年份", v: "all" }]; let thisYear = new Date().getFullYear(); for (let i = 0; i <= 20; i++) { yearFilter.push({ n: thisYear - i, v: thisYear - i, }) } defaultFilters.push({ key: "years", name: "年份", value: yearFilter }) const result = { class: [ {type_id: "1", type_name: "电影"}, {type_id: "2", type_name: "电视剧"}, {type_id: "bangumi", type_name: "番剧"}, {type_id: "chinese_cartoon", type_name: "国漫"}, ], filters: { "1": defaultFilters, "2": defaultFilters, "bangumi": defaultFilters, "chinese_cartoon": defaultFilters, }, list: [] }; return listVideos(result); }, categoryContent: function (tid, pg, filter, extend) { console.log(tid, pg, filter, JSON.stringify(extend)); let result = { list: [], limit: 24, pagecount: 0 }; return listVideos(result); }, detailContent: function (ids) { console.log(ids); return new Promise(function (resolve) { _gotSrc = resolve; }).then(async (playerSrc) => { console.log("playerSrc", playerSrc) let playUrl = []; let playValue = await getPlay(playerSrc.src); playUrl.push({ name: $("#btngroup .playbtn").first().text().trim(), value: playValue }) $("#btngroup .playbtn:gt(0)").each(function () { playUrl.push({ name: $(this).text().trim(), value: { type: "webview", data: { replace: { mcid: unsafeWindow.mcid, path: $(this).data("path") } } } }) }) return { vod_id: ids[0], vod_name: $(".d-flex .grade:first").text().trim(), vod_pic: $(".d-flex .pimgs").attr("src"), vod_remarks: $(".d-flex .grade:eq(1)").text().trim(), vod_content: $(".d-flex p").text().trim(), vod_play_data: [{ from: "注视影视", url: playUrl }] }; }); }, playerContent: function (flag, id, vipFlags) { console.log(flag, id, unsafeWindow.mid); localStorage.setItem('mobj' + unsafeWindow.mid, JSON.stringify({ video_index: window.location.hash.split("#").at(1), video_time: 1 })); return new Promise(function (resolve) { _gotSrc = resolve; }).then(async (playerSrc) => { return await getPlay(playerSrc.src); }); }, searchContent: function (key, quick, pg) { const result = { list: [], page: pg, pagecount: 0 }; return listVideos(result); } }; })(); $(unsafeWindow).on("load", async function () { if (document.readyState === 'complete') { const result = await GmSpider[GMSpiderArgs.fName](...GMSpiderArgs.fArgs); console.log(GMSpiderArgs.fName, JSON.stringify(result)); if (typeof GmSpiderInject !== 'undefined') { GmSpiderInject.SetSpiderResult(JSON.stringify(result)); } } }); })();