code wiki / _hdl_build / nx_ereader_sota_fetch.nx
nx_ereader_sota_fetch.nx source
↩ module page · 86 lines · 5824 B
1// nx_ereader_sota_fetch.nx -- HONEST research (operator 2026-07-04: "the rest of our library is still not state of
2// the art in loading, serving, hotkeys... use the nishi researcher and see what ereaders do on github that are way
3// ahead of us"). Fetches the GitHub topic search API for the SOTA e-reader / comic-server projects (Kavita, Komga,
4// Koodo, foliate, Readium, epub.js...) + their READMEs with our sovereign Chrome client (we beat GitHub's wall).
5// Parses to a COMPACT list (rank, full_name, stars, topics, desc) then dumps READMEs -> the library census is
6// grounded on what these tools ACTUALLY do (loading/serving/keyboard), not memory. Temporary. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_x509_trust_store.nx"
9import "nx_trust_store_load_from_certdata.nx"
10import "nx_https_fetch_follow.nx"
11import "nx_manga_sites.nx" // na_find_from
12const K_MAGIC_4194304: i64 = 4194304
13const K_MAGIC_2097152: i64 = 2097152
14const K_MAGIC_2400: i64 = 2400
15const K_MAGIC_2600: i64 = 2600
16
17func iw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
18func iseg(buf: *u8, a: i64, e: i64) -> i64 { if e>a { sys_write(1,(buf as i64+a) as *u8, e-a) } return 0 }
19func jval(buf: *u8, n: i64, key: *u8, from: i64, bound: i64, sp: *i64, ep: *i64) -> i64 {
20 let kp: i64 = na_find_from(buf, n, key, from)
21 if kp < 0 { return 0-1 } if kp >= bound { return 0-1 }
22 var kl: i64 = 0; while key[kl]!=(0 as u8){kl=kl+1}
23 let s: i64 = kp + kl
24 let e: i64 = na_find_from(buf, n, "\"" as *u8, s)
25 sp[0]=s; ep[0]=e; return 0
26}
27func fetch(url: *u8, store: *TrustStore, buf: *u8, cap: i64) -> i64 {
28 let st: *i64 = sys_mmap(8) as *i64
29 let n: i64 = nx_https_fetch_follow_chrome(url, store, buf, cap, 6, st)
30 iw("\n==== "); iw(url); iw(" status="); let sb: *u8=sys_mmap(16); var v: i64=st[0]; var k: i64=0; if v==0{sb[0]=48 as u8;k=1} let t: *u8=sys_mmap(16); while v>0{t[k]=(48+(v%10)) as u8;v=v/10;k=k+1} var i: i64=0; while i<k{sb[i]=t[k-1-i];i=i+1} sys_write(1,sb,k); iw("\n" as *u8)
31 return n
32}
33// compact top-N list from a GitHub search JSON
34func complist(buf: *u8, n: i64) -> i64 {
35 let sp: *i64 = sys_mmap(8) as *i64; let ep: *i64 = sys_mmap(8) as *i64
36 var pos: i64 = 0; var rank: i64 = 1; var guard: i64 = 0
37 while guard < 40 {
38 guard = guard + 1
39 let fp: i64 = na_find_from(buf, n, "\"full_name\":\"" as *u8, pos)
40 if fp < 0 { guard = 40 } else {
41 let nb: i64 = na_find_from(buf, n, "\"full_name\":\"" as *u8, fp + 13)
42 var bound: i64 = n; if nb >= 0 { bound = nb }
43 iw("["); let rb: *u8=sys_mmap(8); var rv: i64=rank; var rk: i64=0; if rv==0{rb[0]=48 as u8;rk=1} let rt: *u8=sys_mmap(8); while rv>0{rt[rk]=(48+(rv%10)) as u8;rv=rv/10;rk=rk+1} var ri: i64=0; while ri<rk{rb[ri]=rt[rk-1-ri];ri=ri+1} sys_write(1,rb,rk); iw("] " as *u8)
44 if jval(buf, n, "\"full_name\":\"" as *u8, fp, bound, sp, ep) == 0 { iseg(buf, sp[0], ep[0]) }
45 let stp: i64 = na_find_from(buf, n, "\"stargazers_count\":" as *u8, fp)
46 if stp >= 0 { if stp < bound { iw(" *"); var q: i64 = stp + 19; while q < bound { let c: i64 = buf[q] as i64; if c>=48 { if c<=57 { let o1: *u8=sys_mmap(1); o1[0]=buf[q]; sys_write(1,o1,1); q=q+1 } else { q=bound } } else { q=bound } } } }
47 iw(" topics:" as *u8)
48 let tp: i64 = na_find_from(buf, n, "\"topics\":[" as *u8, fp)
49 if tp >= 0 { if tp < bound { let te: i64 = na_find_from(buf, n, "]" as *u8, tp+10); iseg(buf, tp+9, te+1) } }
50 iw("\n " as *u8)
51 if jval(buf, n, "\"description\":\"" as *u8, fp, bound, sp, ep) == 0 { var d: i64 = ep[0]; if d - sp[0] > 150 { d = sp[0]+150 } iseg(buf, sp[0], d) }
52 iw("\n" as *u8)
53 pos = fp + 13; rank = rank + 1
54 }
55 }
56 return 0
57}
58func readme(owner_repo: *u8, store: *TrustStore, buf: *u8, cap: i64, shown: i64) -> i64 {
59 let url: *u8 = sys_mmap(256); var o: i64 = 0
60 let p1: *u8 = "https://raw.githubusercontent.com/" as *u8; while p1[o]!=(0 as u8){url[o]=p1[o];o=o+1}
61 var j: i64 = 0; while owner_repo[j]!=(0 as u8){url[o]=owner_repo[j];o=o+1;j=j+1}
62 let p2: *u8 = "/HEAD/README.md" as *u8; var k: i64=0; while p2[k]!=(0 as u8){url[o]=p2[k];o=o+1;k=k+1} url[o]=0 as u8
63 let n: i64 = fetch(url, store, buf, cap)
64 if n > 0 { var d: i64 = n; if d > shown { d = shown } sys_write(1, buf, d); iw("\n" as *u8) }
65 return n
66}
67func main() -> i64 {
68 let r: i64 = nx_trust_store_load_from_certdata("data/mozilla_certdata.txt" as *u8, 512, K_MAGIC_4194304)
69 if r <= 0 { iw("certdata fail\n" as *u8); return 1 }
70 let store: *TrustStore = r as *TrustStore
71 let buf: *u8 = sys_mmap(K_MAGIC_2097152)
72 iw("### TOPIC ebook-reader\n" as *u8)
73 let a: i64 = fetch("https://api.github.com/search/repositories?q=topic:ebook-reader&sort=stars&order=desc&per_page=12" as *u8, store, buf, K_MAGIC_2097152)
74 if a > 0 { complist(buf, a) }
75 iw("\n### TOPIC comic-reader\n" as *u8)
76 let b: i64 = fetch("https://api.github.com/search/repositories?q=topic:comics+manga+reader&sort=stars&order=desc&per_page=12" as *u8, store, buf, K_MAGIC_2097152)
77 if b > 0 { complist(buf, b) }
78 iw("\n### TOPIC self-hosted comics/manga server\n" as *u8)
79 let c: i64 = fetch("https://api.github.com/search/repositories?q=manga+server+self-hosted&sort=stars&order=desc&per_page=10" as *u8, store, buf, K_MAGIC_2097152)
80 if c > 0 { complist(buf, c) }
81 iw("\n### README: LANraragi (self-hosted manga/doujinshi server -- our closest analog)\n" as *u8)
82 readme("Difegue/LANraragi" as *u8, store, buf, K_MAGIC_2097152, K_MAGIC_2400)
83 iw("\n### README: readest (modern feature-rich reader)\n" as *u8)
84 readme("readest/readest" as *u8, store, buf, K_MAGIC_2097152, K_MAGIC_2600)
85 return 0
86}