Last active
July 13, 2023 15:31
-
-
Save hmua/cd25eeb5e880cf82c14839e1bda4fb40 to your computer and use it in GitHub Desktop.
B站动态自动归档
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
RawStorage=(()=>{ | |
verify=(()=>{ | |
a=Object.keys(localStorage) | |
prefix='archive_';console.assert(a.every(a=>a.startsWith(prefix))) | |
console.assert(/*isLatestOnTop*/JSON.stringify(a.toSorted().reverse())==JSON.stringify(a)) | |
console.log('#RawStorage verified') | |
})() | |
formatFiles=async a=>{ | |
groupBy=(x,f)=>x.reduce((a,b,i)=>((a[f(b,i,x)]||=[]).push(b),a),{}) | |
const name=d=>`${d.getFullYear()-2000}-${d.getMonth()+1}-${d.getDate()}-.md` | |
file=a=>`---\ntweets: |-\n ${a.replaceAll('\n','\n ')}\n---\n{{page.tweets}}` | |
a=JSON.parse(a) | |
a=groupBy(a,([_,d])=>name(new Date(d*1000))) | |
const b=[];for await(const i of Object.keys(a))b.push([i,a[i]]) | |
a=b.map(([d,items])=>[d,items.map(([a,_])=>a).join('\n\n')]) | |
return a.map(([a,b])=>[a,file(b)]) | |
} | |
loadLatest=()=>localStorage[localStorage.key(0)] | |
load=async()=>{ | |
a=Object.values(localStorage) | |
return await Promise.all(a.map(a=>formatFiles(a))) | |
} | |
return{load} | |
})() | |
///检查更新 | |
var[getNew,getUpdates,markUpdates]=await(async()=>{ | |
var[a,old]=await RawStorage.load() | |
// for(a of a)console.log(a,isNew=!old.some(b=>a[0]==b[0]&&a[1]==b[1])) | |
function*takeWhile(xs,fn){for (let x of xs)if (fn(x))yield x;else break} | |
isNew=a=>!old.some(b=>a[0]==b[0]&&a[1]==b[1]) | |
return[()=>[...takeWhile(a,isNew)],()=>[...a.filter(isNew)], | |
()=>[...a.map(a=>a.concat(isNew(a)))]] | |
})() | |
///生成界面,按每天复制文件名和内容 | |
build=a=>{ | |
input=a=>`<input value=\'${a}\'></input>` | |
tag=(name,a)=>`<${name}>${a}</${name}>`;div=a=>tag('div',a);pre=a=>tag('pre',a) | |
textarea=a=>tag('textarea',a) | |
template=([file,content])=>textarea(file)+textarea(content) | |
a=a.map(template).join('') | |
reload=html=>{document.write(html);document.close();return document} | |
a=reload(a) | |
a.querySelectorAll('textarea').forEach(a=>{ | |
a.readOnly=true;a.style.width='100%';a.style.resize='none' | |
a.rows=1;a.style.height="";a.style.height=a.scrollHeight+"px" | |
copy=t=>navigator.clipboard.writeText(t).then(()=>new Notification('✓ '+t),()=>new Notification('×')) | |
a.onfocus=(()=>copy(a.value)) | |
}) | |
} | |
a=getNew() | |
build(a) | |
///将更新合并到存档 | |
combineUpdates=()=>{ | |
///- 原记录的最新一天,和新纪录的最早一天,数据都可能不完整,不能使用 | |
///- 去掉不完整的,两份记录应该衔接,或者有重叠,否则不能使用,要获取更多数据 | |
///- 按现在的设计,还涉及解析后再反解析的问题,或者调整成保存解析后的 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment