阅读导入

阅读导入

分享者: laizhiyu (6509)发布时间: 10/29 15:27

由源社区@游呢娃子制作,本人代为转发

在智阅•智能导入规则基础上

1:增加批量识别链接

2:本地文件批量选择导入,追加选择导入

3:最近导入记录增加时间显示,

4:点击最近导入记录可以重新导入,(存本地localstorage,不需要了点击x或者清空缓存即可)

目前网页调用文件选择功能好像只有suml-1/max版本支持了,其它版本网页调用不了选文件弹窗。

二维码导入
{
    "articleStyle": 0,
    "cacheFirst": false,
    "customOrder": 0,
    "enableJs": true,
    "enabled": true,
    "enabledCookieJar": true,
    "lastUpdateTime": 0,
    "loadWithBaseUrl": true,
    "preload": false,
    "showWebLog": false,
    "singleUrl": false,
    "sourceGroup": "legado",
    "sourceIcon": "https:\/\/proicons.com\/icon\/196610.svg",
    "sourceName": "阅读导入",
    "sourceUrl": "阅读导入",
    "startHtml": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover\">\n<title>阅读 · 导入<\/title>\n<style>\n:root{--p:#5865f2;--pl:#eef1ff;--bg:#f8fafc;--cbg:#fff;--tm:#1e293b;--ts:#64748b;--bd:#e2e8f0;--r:16px}\n*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}\nbody{font-family:-apple-system,sans-serif;background:var(--bg);color:var(--tm);padding:16px 16px 32px}\n.app{max-width:560px;margin:0 auto}\n.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}\n.title{font-size:22px;font-weight:700}\n.icon-btn{width:36px;height:36px;border:none;border-radius:50%;background:var(--pl);color:var(--p);font-size:18px;display:flex;align-items:center;justify-content:center;cursor:pointer}\n.card{background:var(--cbg);border-radius:var(--r);padding:16px;margin-bottom:16px;border:1px solid var(--bd);box-shadow:0 2px 8px rgba(0,0,0,.02)}\n.textarea{width:100%;border:none;outline:none;resize:none;font-size:15px;min-height:64px;line-height:1.5;background:transparent;color:var(--tm);font-family:inherit}\n.textarea::placeholder{color:#94a3b8}\n.btn{border:none;border-radius:12px;font-size:15px;font-weight:600;padding:14px;cursor:pointer;transition:.2s;display:flex;align-items:center;justify-content:center;gap:6px}\n.btn:disabled{opacity:.5;cursor:not-allowed}\n.btn-main{width:100%;background:var(--p);color:#fff;margin-top:12px}\n.btn-primary{background:var(--pl);color:var(--p)}\n.btn-ghost{background:#f1f5f9;color:var(--ts)}\n.row{display:flex;gap:12px}.row>*{flex:1}\n.label{font-size:14px;font-weight:600;color:var(--ts);margin-bottom:12px;display:flex;align-items:center;gap:6px}\n.hint{font-size:12px;color:var(--ts);line-height:1.5;margin-top:12px}\n.result-box{display:none;margin-top:16px;padding-top:16px;border-top:1px dashed var(--bd)}\n.result-title{font-size:15px;font-weight:600;margin-bottom:8px}\n.badges{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}\n.badge{font-size:12px;padding:4px 10px;background:var(--pl);color:var(--p);border-radius:20px;font-weight:500}\n.history-sec{margin-top:24px}\n.history-sec h3{font-size:14px;color:var(--ts);margin-bottom:12px;font-weight:600;display:flex;justify-content:space-between;align-items:center}\n.clear-all{font-size:12px;color:#ef4444;cursor:pointer;font-weight:normal;padding:4px}\n.history-item{display:flex;align-items:center;background:#fff;padding:12px 16px;border-radius:12px;margin-bottom:10px;border:1px solid var(--bd);cursor:pointer}\n.history-item:active{background:#f8fafc}\n.h-text{flex:1;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-right:12px;display:flex;align-items:center}\n.time{color:#94a3b8;font-size:12px;margin-left:8px;font-weight:normal}\n.h-del{padding:8px;color:#cbd5e1;font-size:16px;font-weight:bold;border:none;background:transparent;cursor:pointer}\n.empty{text-align:center;font-size:13px;color:#94a3b8;padding:32px 0;background:#fff;border-radius:var(--r);border:1px dashed var(--bd)}\n.modal{position:fixed;inset:0;background:rgba(0,0,0,.4);display:none;align-items:flex-end;z-index:100}\n.modal.on{display:flex}\n.modal-body{width:100%;max-width:560px;margin:0 auto;background:#fff;border-radius:20px 20px 0 0;padding:20px;padding-bottom:calc(20px + env(safe-area-inset-bottom))}\n.modal-body textarea{width:100%;height:30vh;background:var(--bg);border:1px solid var(--bd);border-radius:12px;padding:12px;font-size:13px;outline:none;resize:none;font-family:monospace;margin-bottom:16px}\n.toast{position:fixed;top:20px;left:50%;transform:translateX(-50%) translateY(-20px);background:rgba(30,41,59,.9);color:#fff;padding:10px 20px;border-radius:30px;font-size:13.5px;opacity:0;transition:.3s;pointer-events:none;z-index:200;max-width:90vw;text-align:center}\n.toast.on{transform:translateX(-50%) translateY(0);opacity:1}\n@media (prefers-color-scheme:dark){\n:root{--bg:#0f172a;--cbg:#1e293b;--tm:#e2e8f0;--ts:#94a3b8;--bd:#334155}\n.btn-ghost{background:#334155;color:#e2e8f0}\n.h-del{color:#475569}.empty{background:transparent}\n.history-item{background:var(--cbg)}.history-item:active{background:#334155}\n.modal-body{background:#1e293b}.modal-body textarea{background:#0f172a;color:#fff}\n}\n<\/style>\n<\/head>\n<body>\n<div class=\"app\">\n<div class=\"header\">\n<div class=\"title\">阅读 · 导入<\/div>\n<button class=\"icon-btn\" id=\"openBtn\">🌐<\/button>\n<\/div>\n<div class=\"card\">\n<textarea class=\"textarea\" id=\"urlInput\" placeholder=\"粘贴链接(支持换行、空格或逗号分隔)...\"><\/textarea>\n<button class=\"btn btn-main\" id=\"linkBtn\" disabled>✨ 一键批量导入链接<\/button>\n<\/div>\n<div class=\"card\">\n<div class=\"label\">📁 本地文件 \/ 文本导入<\/div>\n<div class=\"row\">\n<button class=\"btn btn-primary\" id=\"fileBtn\">📄 选择 JSON<\/button>\n<button class=\"btn btn-ghost\" id=\"pasteBtn\">📋 粘贴内容<\/button>\n<\/div>\n<input type=\"file\" id=\"fileInput\" accept=\".json,.txt\" multiple style=\"display:none\">\n<div class=\"hint\">支持多次点击选择累积,已自动持久化。若无反应请用“粘贴内容”或从系统文件管理器打开。<\/div>\n<div class=\"result-box\" id=\"resultBox\">\n<div class=\"result-title\">已累积待导入:<\/div>\n<div class=\"badges\" id=\"badges\"><\/div>\n<div class=\"row\">\n<button class=\"btn btn-primary\" id=\"doLocalBtn\">🚀 同类型合并导入<\/button>\n<button class=\"btn btn-ghost\" id=\"clearLocalBtn\">🗑 清空<\/button>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"history-sec\">\n<h3>🕘 最近导入 <span class=\"clear-all\" id=\"clearAllBtn\">🧹 清空缓存<\/span><\/h3>\n<div id=\"historyList\"><\/div>\n<\/div>\n<\/div>\n<div class=\"modal\" id=\"pasteModal\">\n<div class=\"modal-body\">\n<div class=\"label\">📋 粘贴 JSON 内容<\/div>\n<textarea id=\"pasteArea\" placeholder=\"在此粘贴 JSON 内容...\"><\/textarea>\n<div class=\"row\">\n<button class=\"btn btn-ghost\" id=\"pasteCancel\">取消<\/button>\n<button class=\"btn btn-primary\" id=\"pasteOk\">识别并累积<\/button>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"toast\" id=\"toast\"><\/div>\n<script>\n(function(){\nconst $=id=>document.getElementById(id),urlInput=$('urlInput'),linkBtn=$('linkBtn'),openBtn=$('openBtn'),fileBtn=$('fileBtn'),fileInput=$('fileInput'),pasteBtn=$('pasteBtn'),pasteModal=$('pasteModal'),pasteArea=$('pasteArea'),pasteCancel=$('pasteCancel'),pasteOk=$('pasteOk'),resultBox=$('resultBox'),badges=$('badges'),doLocalBtn=$('doLocalBtn'),clearLocalBtn=$('clearLocalBtn'),historyList=$('historyList'),toastEl=$('toast'),clearAllBtn=$('clearAllBtn');\nconst KE='smartImportEntries',KH='smartImportHistory';\nlet allEntries=[];\nconst TN={bookSource:'📖 书源',rssSource:'📡 订阅源',replaceRule:'🧹 替换规则',dictRule:'📚 字典规则',txtRule:'📑 目录规则',httpTts:'🔊 TTS引擎',theme:'🎨 主题'};\nconst IP={bookSource:'bookSource',rssSource:'rssSource',replaceRule:'replaceRule',txtRule:'textTocRule',httpTts:'httpTTS',dictRule:'dictRule',theme:'theme'};\n\nfunction toast(m,e){toastEl.textContent=m;toastEl.style.background=e?'rgba(185,28,28,.9)':'rgba(30,41,59,.9)';toastEl.classList.add('on');clearTimeout(toastEl.timer);toastEl.timer=setTimeout(()=>toastEl.classList.remove('on'),2500)}\nfunction save(k,v){try{localStorage.setItem(k,JSON.stringify(v))}catch(e){}}\nfunction load(k){try{return JSON.parse(localStorage.getItem(k))||[]}catch(e){return[]}}\nfunction fmtTime(ts){if(!ts)return '';let d=new Date(ts),p=n=>n<10?'0'+n:n;return `${p(d.getMonth()+1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`}\n\nfunction extLinks(t){return [...new Set((t.match(\/https?:\\\/\\\/[^\\s,;'\"<>]+\/gi)||[]).flatMap(m=>m.split(\/(?=https?:\\\/\\\/)\/i)).filter(Boolean))]}\nfunction detType(o){if(!o||typeof o!=='object')return null;if(o.bookSourceUrl||o.bookSourceName)return 'bookSource';if(o.sourceUrl||o.sourceName)return 'rssSource';if(o.pattern&&o.replacement)return 'replaceRule';if(o.themeName)return 'theme';if(o.showRule)return 'dictRule';if(o.rule&&o.name)return 'txtRule';if(o.httpTts||(o.voice&&o.url))return 'httpTts';return null}\nfunction analyze(t){t=(t||'').trim();if(t.charCodeAt(0)===0xFEFF)t=t.slice(1);try{let d=JSON.parse(t),arr=[];(function w(v){if(Array.isArray(v))v.forEach(w);else if(v&&typeof v==='object'){if(v.items)v.items.forEach(w);else if(v.sources)v.sources.forEach(w);else arr.push(v)}})(d);let res=[];arr.forEach(o=>{let ty=detType(o);if(ty)res.push({type:ty,text:JSON.stringify([o])})});return res}catch(e){return[]}}\n\nfunction renderRes(){if(!allEntries.length){resultBox.style.display='none';return}resultBox.style.display='block';let g={};allEntries.forEach(e=>g[e.type]=(g[e.type]||0)+1);badges.innerHTML=Object.keys(g).map(t=>`<span class=\"badge\">${TN[t]||t} × ${g[t]}<\/span>`).join('')}\n\nfunction doLocalImport(){if(!allEntries.length)return;let g={};allEntries.forEach(e=>{if(!IP[e.type])return;if(!g[e.type])g[e.type]=[];try{g[e.type].push(JSON.parse(e.text)[0])}catch(_){}});let bs=Object.keys(g).map(t=>({type:t,text:JSON.stringify(g[t]),count:g[t].length}));if(!bs.length)return toast('没有可导入的内容',1);addHistory('📄 本地累积 ('+allEntries.length+'条)','local',allEntries);let i=0;function next(){if(i>=bs.length){toast('✅ 导入请求已发送');allEntries=[];save(KE,[]);renderRes();return}let b=bs[i++];location.href=`legado:\/\/import\/${IP[b.type]}?src=${encodeURIComponent(b.text)}`;setTimeout(next,1200)}toast('📥 正在按类型合并导入...');next()}\n\nfunction doLinkImport(){let ls=extLinks(urlInput.value);if(!ls.length)return toast('没有识别到有效链接',1);addHistory('🔗 链接批量 ('+ls.length+'条)','link',ls);let i=0;function next(){if(i>=ls.length)return toast('✅ 链接导入请求已发送');location.href=`legado:\/\/import\/importonline?src=${encodeURIComponent(ls[i++])}`;setTimeout(next,900)}toast('📥 正在逐个唤醒导入...');next()}\n\nfunction addHistory(title,type,data){let h=load(KH);h=h.filter(i=>i.title!==title);h.unshift({title,type,data,time:Date.now()});if(h.length>20)h=h.slice(0,20);save(KH,h);renderHist()}\nfunction renderHist(){let h=load(KH);if(!h.length){historyList.innerHTML='<div class=\"empty\">✨ 暂无历史记录<\/div>';return}historyList.innerHTML=h.map(i=>`\n<div class=\"history-item\" data-title=\"${i.title}\">\n<div class=\"h-text\">${i.title} <span class=\"time\">${fmtTime(i.time)}<\/span><\/div>\n<button class=\"h-del\" data-title=\"${i.title}\">✕<\/button>\n<\/div>`).join('')}\n\nurlInput.addEventListener('input',()=>{let ls=extLinks(urlInput.value);if(ls.length){linkBtn.disabled=0;linkBtn.textContent=`🚀 批量导入 ${ls.length} 条链接`}else{linkBtn.disabled=1;linkBtn.textContent='✨ 一键批量导入链接'}});\nopenBtn.addEventListener('click',()=>{let ls=extLinks(urlInput.value);if(ls.length)window.open(ls[0],'_blank');else toast('请先输入有效链接',1)});\nlinkBtn.addEventListener('click',doLinkImport);doLocalBtn.addEventListener('click',doLocalImport);\n\n\/\/ 未导入列表点清空:彻底清理\nclearLocalBtn.addEventListener('click',()=>{allEntries=[];save(KE,[]);renderRes();toast('已清空列表及缓存')});\n\n\/\/ 一键清理全部缓存\nclearAllBtn.addEventListener('click',()=>{if(confirm('确定要清空所有历史记录和本地缓存吗?')){save(KH,[]);allEntries=[];save(KE,[]);renderRes();renderHist();toast('已清理全部缓存')}});\n\nhistoryList.addEventListener('click',e=>{let h=load(KH),del=e.target.closest('.h-del');if(del){e.stopPropagation();let title=del.dataset.title;save(KH,h.filter(x=>x.title!==title));renderHist();toast('已删除记录');return}let item=e.target.closest('.history-item');if(!item)return;let title=item.dataset.title,rec=h.find(x=>x.title===title);if(!rec)return;if(rec.type==='local'){allEntries=rec.data;save(KE,allEntries);renderRes();resultBox.scrollIntoView({behavior:'smooth',block:'center'});toast('已从历史恢复列表')}else if(rec.type==='link'){if(rec.data&&rec.data.length){urlInput.value=rec.data.join('\\n');urlInput.dispatchEvent(new Event('input'));window.scrollTo({top:0,behavior:'smooth'});toast('已回填历史链接')}}});\n\nfileBtn.addEventListener('click',()=>{fileInput.value='';fileInput.click()});\nfileInput.addEventListener('change',e=>{let fs=e.target.files;if(!fs||!fs.length)return;let p=fs.length,a=0;Array.from(fs).forEach(f=>{let r=new FileReader();r.onload=ev=>{let en=analyze(ev.target.result);if(en.length){allEntries=allEntries.concat(en);a+=en.length}if(--p===0){if(a>0){save(KE,allEntries);renderRes();toast(`成功识别累积 ${a} 条`)}else{toast('未识别到有效源',1)}}};r.readAsText(f,'utf-8')})});\n\npasteBtn.addEventListener('click',()=>{pasteModal.classList.add('on');pasteArea.focus()});\npasteCancel.addEventListener('click',()=>pasteModal.classList.remove('on'));\npasteOk.addEventListener('click',()=>{let en=analyze(pasteArea.value);if(!en.length)return toast('无法识别该内容',1);allEntries=allEntries.concat(en);save(KE,allEntries);renderRes();pasteModal.classList.remove('on');pasteArea.value='';toast(`成功识别累积 ${en.length} 条`)});\n\nallEntries=load(KE);renderRes();renderHist();\n})();\n<\/script>\n<\/body>\n<\/html>\n",
    "type": 0
}
广告