AGE动漫
https://m.agedm.io/#/
分享者: mengluo9960 (14501)发布时间: 08/21 14:44
//梦不觉 //2826.07.25制
{
"articleStyle": 4,
"cacheFirst": false,
"customOrder": 4,
"enableJs": true,
"enabled": true,
"enabledCookieJar": false,
"lastUpdateTime": 1787294368229,
"loadWithBaseUrl": true,
"preload": false,
"ruleArticles": "$..videos[*]",
"ruleContent": "@js:\n(function(){\n try {\n var data = JSON.parse(result);\n var videoId = data.video.id; \n var videoName = data.video.name;\n var playlists = data.video.playlists;\n var labels = data.player_label_arr;\n var cover = data.video.cover;\n var jxUrl = \"https:\/\/jx.ejtsyc.com:8443\/m3u8\/?url=\";\n\n \/\/ 详情字段\n var year = data.video.year || '';\n var area = data.video.area || '';\n var status = data.video.status || '';\n var type = data.video.type || '';\n var tags = data.video.tags || '';\n var writer = data.video.writer || '';\n var company = data.video.company || '';\n var intro = data.video.intro_clean || data.video.intro || '暂无简介';\n\n function esc(s) {\n return String(s).replace(\/&\/g, '&').replace(\/<\/g, '<').replace(\/>\/g, '>').replace(\/\"\/g, '"').replace(\/'\/g, ''');\n }\n\n \/\/ 默认播放链接\n var defaultPlayUrl = \"\";\n for (var k in playlists) {\n if (playlists[k] && playlists[k].length > 0) {\n defaultPlayUrl = jxUrl + playlists[k][0][1];\n break;\n }\n }\n\n \/\/ 构建 HTML\n var html = '<!DOCTYPE html><html><head>';\n html += '<meta charset=\"UTF-8\">';\n html += '<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">';\n html += '<meta name=\"referrer\" content=\"never\">';\n html += '<title>' + esc(videoName) + '<\/title>';\n html += '<\/head><body style=\"margin:0; padding:8px; font-family: sans-serif;\">';\n html += '<div style=\"width:100%;\">';\n\n \/\/ 播放器(包裹一层div以便全屏)\n html += '<div id=\"player-wrapper\" style=\"position:relative; width:100%;\">';\n if (defaultPlayUrl !== \"\") {\n html += '<iframe name=\"ageplayer\" id=\"ageplayer\" src=\"' + defaultPlayUrl + '\" width=\"100%\" height=\"240px\" frameborder=\"0\" allowfullscreen=\"true\" style=\"border-radius:8px; background:#000;\"><\/iframe>';\n } else {\n html += '<img src=\"' + esc(cover) + '\" style=\"width:100%; border-radius:8px;\"\/>';\n }\n html += '<\/div>';\n\n \/\/ 详情卡片(播放器下方)\n html += '<div style=\"display:flex; gap:10px; margin:12px 0; align-items:flex-start;\">';\n html += '<img src=\"' + esc(cover) + '\" style=\"width:80px; height:112px; object-fit:cover; border-radius:8px; flex-shrink:0;\" onerror=\"this.style.display=\\'none\\'\">';\n html += '<div style=\"flex:1; min-width:0;\">';\n html += '<div style=\"font-weight:bold; font-size:16px; margin-bottom:4px;\">' + esc(videoName) + '<\/div>';\n var detailArr = [];\n if (year) detailArr.push('年份:' + year);\n if (area) detailArr.push('地区:' + area);\n if (status) detailArr.push('状态:' + status);\n if (type) detailArr.push('类型:' + type);\n if (tags) detailArr.push('标签:' + tags);\n if (detailArr.length) html += '<div style=\"font-size:13px; color:#666; margin-bottom:2px;\">' + esc(detailArr.join(' ')) + '<\/div>';\n if (writer) html += '<div style=\"font-size:13px; color:#666;\">编剧:' + esc(writer) + '<\/div>';\n if (company) html += '<div style=\"font-size:13px; color:#666;\">制作:' + esc(company) + '<\/div>';\n html += '<div style=\"font-size:13px; color:#888; margin-top:6px; line-height:1.5; max-height:90px; overflow:auto;\">' + esc(intro) + '<\/div>';\n html += '<\/div><\/div>';\n\n \/\/ 历史提示 + 清除按钮\n html += '<div style=\"display:flex; justify-content:space-between; align-items:center; margin-top:12px;\">';\n html += '<p id=\"history-text\" style=\"color:#f60; font-size:14px; font-weight:bold; text-align:center; flex:1; margin:0;\">读取进度中...<\/p>';\n html += '<button onclick=\"clearHistory()\" style=\"background:none; border:1px solid #ddd; padding:4px 10px; border-radius:6px; color:#999; font-size:12px;\">清除历史<\/button>';\n html += '<\/div>';\n\n \/\/ 线路 tabs 和剧集容器\n var tabsHtml = '<div style=\"display:flex; overflow-x:auto; gap:15px; border-bottom:1px solid #eee; padding-bottom:8px; margin-top:10px; white-space:nowrap; -webkit-overflow-scrolling: touch;\">';\n var epsHtml = '<div style=\"margin-top:15px;\">';\n var tabIndex = 0;\n var firstTabId = \"\";\n var firstLineName = \"\";\n var firstEpName = \"\";\n\n for (var key in playlists) {\n var lineName = labels[key] ? labels[key] : key;\n var tId = \"line_\" + tabIndex;\n var episodes = playlists[key];\n if (tabIndex === 0) {\n firstTabId = tId;\n firstLineName = lineName;\n if (episodes.length > 0) firstEpName = episodes[0][0];\n }\n tabsHtml += '<div id=\"tab_' + tId + '\" class=\"line-tab\" onclick=\"switchTab(\\'' + tId + '\\')\" style=\"padding:4px 8px; color:#666; font-size:15px; cursor:pointer; transition:all 0.2s;\">' + lineName + '<\/div>';\n epsHtml += '<div id=\"container_' + tId + '\" class=\"ep-container\" style=\"display:none; flex-wrap:wrap; gap:10px;\">';\n for (var i = 0; i < episodes.length; i++) {\n var epName = episodes[i][0];\n var epCode = episodes[i][1];\n var playUrl = jxUrl + epCode;\n epsHtml += '<a href=\"' + playUrl + '\" target=\"ageplayer\" class=\"ep-btn\" onclick=\"savePlayHistory(this, \\'' + playUrl + '\\', \\'' + lineName + '\\', \\'' + epName + '\\', \\'' + tId + '\\', ' + tabIndex + ', ' + i + ')\" style=\"padding:6px 12px; background:#f0f2f5; text-decoration:none; color:#333; border-radius:6px; font-size:14px; border:1px solid #e4e6eb; text-align:center; transition: all 0.2s;\">' + epName + '<\/a>';\n }\n epsHtml += '<\/div>';\n tabIndex++;\n }\n tabsHtml += '<\/div>';\n epsHtml += '<\/div>';\n\n html += tabsHtml;\n html += epsHtml;\n html += '<\/div><\/body>';\n\n \/\/ 注入 JS\n html += '<script>';\n html += 'var storageKey = \"age_history_\" + ' + JSON.stringify(videoId || encodeURIComponent(videoName)) + ';';\n html += 'function switchTab(tId) {';\n html += ' var eps = document.querySelectorAll(\".ep-container\");';\n html += ' for(var i=0; i<eps.length; i++) eps[i].style.display = \"none\";'; \n html += ' var tabs = document.querySelectorAll(\".line-tab\");';\n html += ' for(var i=0; i<tabs.length; i++) { tabs[i].style.color = \"#666\"; tabs[i].style.borderBottom = \"none\"; tabs[i].style.fontWeight = \"normal\"; }'; \n html += ' document.getElementById(\"container_\" + tId).style.display = \"flex\";'; \n html += ' var activeTab = document.getElementById(\"tab_\" + tId);';\n html += ' if(activeTab) { activeTab.style.color = \"#f60\"; activeTab.style.borderBottom = \"2px solid #f60\"; activeTab.style.fontWeight = \"bold\"; }'; \n html += '}';\n\n html += 'function savePlayHistory(btnElem, url, lineName, epName, tId, lineIndex, epIndex) {';\n html += ' var histText = lineName + \" - \" + epName;';\n html += ' var saveData = {';\n html += ' url: url,';\n html += ' lineName: lineName,';\n html += ' epName: epName,';\n html += ' tabId: tId,';\n html += ' lineIndex: lineIndex,';\n html += ' epIndex: epIndex,';\n html += ' timestamp: Date.now()';\n html += ' };';\n html += ' localStorage.setItem(storageKey, JSON.stringify(saveData));';\n html += ' var timeStr = new Date(saveData.timestamp).toLocaleString(\"zh-CN\", {hour12:false});';\n html += ' document.getElementById(\"history-text\").innerText = \"上次观看:\" + histText + \"(\" + timeStr + \")\";';\n html += ' var btns = document.querySelectorAll(\".ep-btn\");';\n html += ' for(var i=0; i<btns.length; i++){ btns[i].style.background=\"#f0f2f5\"; btns[i].style.color=\"#333\"; btns[i].style.borderColor=\"#e4e6eb\"; }';\n html += ' btnElem.style.background=\"#f60\"; btnElem.style.color=\"#fff\"; btnElem.style.borderColor=\"#f60\";';\n html += '}';\n\n html += 'function clearHistory() {';\n html += ' localStorage.removeItem(storageKey);';\n html += ' var player = document.getElementById(\"ageplayer\");';\n html += ' if(player) player.src = \"' + defaultPlayUrl + '\";';\n html += ' switchTab(\"' + firstTabId + '\");';\n html += ' document.getElementById(\"history-text\").innerText = \"已清除历史,请重新选择剧集\";';\n html += ' var btns = document.querySelectorAll(\".ep-btn\");';\n html += ' for(var i=0; i<btns.length; i++){ btns[i].style.background=\"#f0f2f5\"; btns[i].style.color=\"#333\"; btns[i].style.borderColor=\"#e4e6eb\"; }';\n html += ' var firstBtn = document.querySelector(\"#container_' + firstTabId + ' .ep-btn\");';\n html += ' if(firstBtn) { firstBtn.style.background=\"#f60\"; firstBtn.style.color=\"#fff\"; firstBtn.style.borderColor=\"#f60\"; }';\n html += '}';\n\n html += 'window.onload = function() {';\n html += ' var savedStr = localStorage.getItem(storageKey);';\n html += ' if (savedStr) {';\n html += ' try {';\n html += ' var savedData = JSON.parse(savedStr);';\n html += ' var targetBtn = null;';\n html += ' if (savedData.lineIndex !== undefined && savedData.epIndex !== undefined) {';\n html += ' var container = document.getElementById(\"container_line_\" + savedData.lineIndex);';\n html += ' if (container) {';\n html += ' var allBtns = container.querySelectorAll(\".ep-btn\");';\n html += ' if (savedData.epIndex < allBtns.length) targetBtn = allBtns[savedData.epIndex];';\n html += ' }';\n html += ' }';\n html += ' if (!targetBtn && savedData.url) {';\n html += ' var btns = document.querySelectorAll(\".ep-btn\");';\n html += ' for(var i=0; i<btns.length; i++){';\n html += ' if(btns[i].getAttribute(\"href\") === savedData.url) { targetBtn = btns[i]; break; }';\n html += ' }';\n html += ' }';\n html += ' if (targetBtn) {';\n html += ' if (savedData.tabId) switchTab(savedData.tabId);';\n html += ' document.getElementById(\"ageplayer\").src = targetBtn.getAttribute(\"href\");';\n html += ' var timeStr = savedData.timestamp ? new Date(savedData.timestamp).toLocaleString(\"zh-CN\", {hour12:false}) : \"\";';\n html += ' var histText = savedData.lineName + \" - \" + savedData.epName;';\n html += ' document.getElementById(\"history-text\").innerText = \"上次观看:\" + histText + (timeStr ? \"(\" + timeStr + \")\" : \"\");';\n html += ' var allBtns = document.querySelectorAll(\".ep-btn\");';\n html += ' for(var i=0; i<allBtns.length; i++){ allBtns[i].style.background=\"#f0f2f5\"; allBtns[i].style.color=\"#333\"; allBtns[i].style.borderColor=\"#e4e6eb\"; }';\n html += ' targetBtn.style.background=\"#f60\"; targetBtn.style.color=\"#fff\"; targetBtn.style.borderColor=\"#f60\";';\n html += ' } else {';\n html += ' switchTab(\"' + firstTabId + '\");';\n html += ' document.getElementById(\"history-text\").innerText = \"您当前已观看到:' + firstLineName + ' - ' + firstEpName + '\";';\n html += ' var firstBtn = document.querySelector(\"#container_' + firstTabId + ' .ep-btn\");';\n html += ' if(firstBtn) { firstBtn.style.background=\"#f60\"; firstBtn.style.color=\"#fff\"; firstBtn.style.borderColor=\"#f60\"; }';\n html += ' }';\n html += ' } catch(e) {';\n html += ' switchTab(\"' + firstTabId + '\");';\n html += ' document.getElementById(\"history-text\").innerText = \"您当前已观看到:' + firstLineName + ' - ' + firstEpName + '\";';\n html += ' var firstBtn = document.querySelector(\"#container_' + firstTabId + ' .ep-btn\");';\n html += ' if(firstBtn) { firstBtn.style.background=\"#f60\"; firstBtn.style.color=\"#fff\"; firstBtn.style.borderColor=\"#f60\"; }';\n html += ' }';\n html += ' } else {';\n html += ' switchTab(\"' + firstTabId + '\");';\n html += ' document.getElementById(\"history-text\").innerText = \"您当前已观看到:' + firstLineName + ' - ' + firstEpName + '\";';\n html += ' var firstBtn = document.querySelector(\"#container_' + firstTabId + ' .ep-btn\");';\n html += ' if(firstBtn) { firstBtn.style.background=\"#f60\"; firstBtn.style.color=\"#fff\"; firstBtn.style.borderColor=\"#f60\"; }';\n html += ' }';\n html += '};';\n\n \/\/ ===== 新增:全屏自动横屏 =====\n html += 'function lockLandscape(){if(screen.orientation&&screen.orientation.lock){screen.orientation.lock(\"landscape\").catch(function(){});}}';\n html += 'function unlockOrientation(){if(screen.orientation&&screen.orientation.unlock){screen.orientation.unlock();}}';\n html += 'document.addEventListener(\"fullscreenchange\",function(){if(document.fullscreenElement){lockLandscape();}else{unlockOrientation();}});';\n html += 'document.addEventListener(\"webkitfullscreenchange\",function(){if(document.webkitFullscreenElement){lockLandscape();}else{unlockOrientation();}});';\n\n html += '<\/script><\/html>';\n\n return html;\n } catch(e) {\n return \"解析错误:\" + e.message;\n }\n})();",
"ruleImage": "$.cover",
"ruleLink": "@js:'https:\/\/api.agedm.io\/v2\/detail\/' + result.id",
"ruleNextPage": "page",
"ruleTitle": "name",
"searchUrl": "https:\/\/api.agedm.io\/v2\/search?query={{source.getVariable()}}&page={{page}}",
"showWebLog": false,
"singleUrl": false,
"sortUrl": "日本动漫::https:\/\/api.agedm.io\/v2\/catalog?genre=all&label=all&letter=all&order=time®ion=日本&resource=all&season=all&status=all&year=all&page={{page}}&size=10\n国产动漫::https:\/\/api.agedm.io\/v2\/catalog?genre=all&label=all&letter=all&order=time®ion=中国&resource=all&season=all&status=all&year=all&page={{page}}&size=10\n欧美动漫::https:\/\/api.agedm.io\/v2\/catalog?genre=all&label=all&letter=all&order=time®ion=欧美&resource=all&season=all&status=all&year=all&page={{page}}&size=10\n新番连载::https:\/\/api.agedm.io\/v2\/catalog?genre=all&label=all&letter=all&order=time®ion=all&resource=all&season=all&status=连载&year=all&page={{page}}&size=10\n已完结::https:\/\/api.agedm.io\/v2\/catalog?genre=all&label=all&letter=all&order=time®ion=all&resource=all&season=all&status=完结&year=all&page={{page}}&size=10",
"sourceComment": "\/\/梦不觉 \n\n\/\/2826.07.25制",
"sourceGroup": "影视",
"sourceIcon": "https:\/\/xcdn.aiqingyu1314.com:8443\/agem\/apple-touch-icon-120x120.png",
"sourceName": "AGE动漫",
"sourceUrl": "https:\/\/m.agedm.io\/#\/",
"type": 0
}