Skip to content

Instantly share code, notes, and snippets.

@hmua
Last active July 13, 2023 15:31
Show Gist options
  • Save hmua/cd25eeb5e880cf82c14839e1bda4fb40 to your computer and use it in GitHub Desktop.
Save hmua/cd25eeb5e880cf82c14839e1bda4fb40 to your computer and use it in GitHub Desktop.
B站动态自动归档
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