gaze.user.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. // ==UserScript==
  2. // @name gaze
  3. // @namespace gmspider
  4. // @version 2024.12.01
  5. // @description gaze GMSpider
  6. // @author Luomo
  7. // @match https://gaze.run/*
  8. // @require https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.slim.min.js
  9. // @require https://cdn.jsdelivr.net/npm/ajax-hook@3.0.3/dist/ajaxhook.umd.min.js
  10. // @require https://cdn.jsdelivr.net/npm/blob-util@2.0.2/dist/blob-util.min.js
  11. // @grant unsafeWindow
  12. // @run-at document-end
  13. // ==/UserScript==
  14. console.log(JSON.stringify(GM_info));
  15. (function () {
  16. Object.defineProperty(Object.prototype, '_detectLoopStopped', {
  17. set: function () {
  18. return true;
  19. },
  20. get: function () {
  21. console.log("devtools-detector disabled");
  22. return false;
  23. }
  24. });
  25. })();
  26. (function () {
  27. const GMSpiderArgs = {};
  28. if (typeof GmSpiderInject !== 'undefined') {
  29. let args = JSON.parse(GmSpiderInject.GetSpiderArgs());
  30. GMSpiderArgs.fName = args.shift();
  31. GMSpiderArgs.fArgs = args;
  32. } else {
  33. GMSpiderArgs.fName = "detailContent";
  34. GMSpiderArgs.fArgs = [true];
  35. }
  36. Object.freeze(GMSpiderArgs);
  37. let _gotData = function (data) {
  38. console.log("_gotData hook failed", data)
  39. };
  40. let hookRequestUrl = "";
  41. const {unProxy, originXhr} = proxy({
  42. onRequest: (config, handler) => {
  43. let params = {};
  44. switch (GMSpiderArgs.fName) {
  45. case "categoryContent":
  46. let filter = GMSpiderArgs.fArgs[3];
  47. params = {
  48. mform: GMSpiderArgs.fArgs[0],
  49. mcountry: filter?.mcountry ?? "all",
  50. "tag_arr[]": filter?.mtag ?? "all",
  51. page: GMSpiderArgs.fArgs[1],
  52. sort: filter?.sort ?? "updatetime",
  53. album: "all",
  54. title: "",
  55. years: filter?.years ?? "all",
  56. };
  57. break;
  58. case "searchContent":
  59. let title = GMSpiderArgs.fArgs[0];
  60. params = {
  61. mform: "all",
  62. mcountry: "all",
  63. "tag_arr[]": "all",
  64. page: GMSpiderArgs.fArgs[2],
  65. sort: "updatetime",
  66. album: "all",
  67. title: GMSpiderArgs.fArgs[0],
  68. years: "all",
  69. };
  70. break;
  71. }
  72. if (config.url.includes("filter_movielist")) {
  73. if (!$.isEmptyObject(params)) {
  74. config.body = $.param(params)
  75. }
  76. }
  77. handler.next(config);
  78. },
  79. onResponse: (response, handler) => {
  80. if (response.config.url.includes("filter_movielist")) {
  81. let data = JSON.parse(response.response);
  82. _gotData(data);
  83. }
  84. handler.next(response);
  85. }
  86. }, unsafeWindow)
  87. let _gotSrc = function (src) {
  88. console.log("_gotSrc hook failed", data)
  89. };
  90. let _player;
  91. Object.defineProperty(unsafeWindow, 'player', {
  92. configurable: true,
  93. get: () => _player,
  94. set: (player) => {
  95. _player = new Proxy(player, {
  96. get(target, prop) {
  97. if (prop === "src") {
  98. // console.log("src", src);
  99. return new Proxy(target[prop], {
  100. apply: (target, thisArg, argumentsList) => {
  101. _gotSrc(argumentsList[0]);
  102. // return false;
  103. return Reflect.apply(target, thisArg, argumentsList);
  104. }
  105. });
  106. } else {
  107. return Reflect.get(target, prop);
  108. }
  109. }
  110. })
  111. },
  112. });
  113. const GmSpider = (function () {
  114. function listVideos(result) {
  115. return new Promise(function (resolve) {
  116. _gotData = resolve;
  117. }).then(async (movieList) => {
  118. console.log("movelist", movieList);
  119. movieList.mlist.forEach(function (item) {
  120. result.list.push({
  121. vod_id: item.mid,
  122. vod_name: item.title,
  123. vod_pic: item.cover_img,
  124. vod_remarks: "豆瓣 " + item.grade,
  125. vod_year: item.definition
  126. })
  127. })
  128. result.pagecount = movieList.pages;
  129. return result;
  130. });
  131. }
  132. async function getPlay(src) {
  133. let playData = {};
  134. if (src.startsWith("blob:")) {
  135. let blob = await fetch(src).then(r => r.blob());
  136. await blobUtil.blobToBinaryString(blob).then(function (fileData) {
  137. fileData = fileData.replaceAll(' ', "");
  138. playData = {
  139. type: "file",
  140. ext: {
  141. header: {
  142. "User-Agent": window.navigator.userAgent,
  143. "Referer": window.location.href
  144. },
  145. file: fileData
  146. }
  147. }
  148. });
  149. } else {
  150. playData = {
  151. type: "match"
  152. }
  153. }
  154. return playData;
  155. }
  156. return {
  157. homeContent: function (filter) {
  158. const defaultFilters = [{
  159. key: "mcountry",
  160. name: "地区",
  161. value: []
  162. }, {
  163. key: "mtag",
  164. name: "类型",
  165. value: []
  166. }, {
  167. key: "sort",
  168. name: "排序",
  169. value: []
  170. }];
  171. defaultFilters.forEach((item) => {
  172. $(`.${item.key} .filter-item a`).each(function () {
  173. item.value.push({
  174. n: $(this).text(),
  175. v: $(this).data("filter")
  176. });
  177. })
  178. })
  179. let yearFilter = [{
  180. n: "全部年份",
  181. v: "all"
  182. }];
  183. let thisYear = new Date().getFullYear();
  184. for (let i = 0; i <= 20; i++) {
  185. yearFilter.push({
  186. n: thisYear - i,
  187. v: thisYear - i,
  188. })
  189. }
  190. defaultFilters.push({
  191. key: "years",
  192. name: "年份",
  193. value: yearFilter
  194. })
  195. const result = {
  196. class: [
  197. {type_id: "1", type_name: "电影"},
  198. {type_id: "2", type_name: "电视剧"},
  199. {type_id: "bangumi", type_name: "番剧"},
  200. {type_id: "chinese_cartoon", type_name: "国漫"},
  201. ],
  202. filters: {
  203. "1": defaultFilters,
  204. "2": defaultFilters,
  205. "bangumi": defaultFilters,
  206. "chinese_cartoon": defaultFilters,
  207. },
  208. list: []
  209. };
  210. return listVideos(result);
  211. },
  212. categoryContent: function (tid, pg, filter, extend) {
  213. console.log(tid, pg, filter, JSON.stringify(extend));
  214. let result = {
  215. list: [],
  216. limit: 24,
  217. pagecount: 0
  218. };
  219. return listVideos(result);
  220. },
  221. detailContent: function (ids) {
  222. let media = [];
  223. $("#btngroup .playbtn").each(function () {
  224. media.push({
  225. name: $(this).text().trim(),
  226. type: "webview",
  227. ext: {
  228. replace: {
  229. mcid: unsafeWindow.mcid,
  230. path: $(this).data("path")
  231. }
  232. }
  233. })
  234. })
  235. return {
  236. vod_id: ids[0],
  237. vod_name: $(".d-flex .grade:first").text().trim(),
  238. vod_pic: $(".d-flex .pimgs").attr("src"),
  239. vod_remarks: $(".d-flex .grade:eq(1)").text().trim(),
  240. vod_content: $(".d-flex p").text().trim(),
  241. vod_play_data: [{
  242. from: "注视影视",
  243. media: media
  244. }]
  245. };
  246. },
  247. playerContent: function (flag, id, vipFlags) {
  248. console.log(flag, id, unsafeWindow.mid);
  249. localStorage.setItem('mobj' + unsafeWindow.mid, JSON.stringify({
  250. video_index: window.location.hash.split("#").at(1),
  251. video_time: 1
  252. }));
  253. return new Promise(function (resolve) {
  254. _gotSrc = resolve;
  255. }).then(async (playerSrc) => {
  256. return await getPlay(playerSrc.src);
  257. });
  258. },
  259. searchContent: function (key, quick, pg) {
  260. const result = {
  261. list: [],
  262. page: pg,
  263. pagecount: 0
  264. };
  265. return listVideos(result);
  266. }
  267. };
  268. })();
  269. $(unsafeWindow).on("load", async function () {
  270. if (document.readyState === 'complete') {
  271. const result = await GmSpider[GMSpiderArgs.fName](...GMSpiderArgs.fArgs);
  272. console.log(GMSpiderArgs.fName, JSON.stringify(result));
  273. if (typeof GmSpiderInject !== 'undefined') {
  274. GmSpiderInject.SetSpiderResult(JSON.stringify(result));
  275. }
  276. }
  277. });
  278. })();