blob: d82cb968ca16c2a0d5a630265378d4caa6b37827 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
(in-package #:nx-router)
(nyxt:use-nyxt-package-nicknames)
(define-class instances-builder ()
((source
nil
:type (or quri:uri string null))
(builder
nil
:type (or function symbol null)))
(:export-class-name-p t)
(:export-slot-names-p t)
(:export-accessor-names-p t)
(:documentation "An instances builder for an alternative front-end."))
(export-always 'libredirect-instances-source)
(defvar libredirect-instances-source
"https://raw.githubusercontent.com/libredirect/instances/main/data.json")
(export-always 'libredirect-instances-builder)
(defun libredirect-instances-builder (service)
"Return an instances builder for SERVICE in Libredirect's generated list
of instances."
(lambda (instances)
(rest (alex:assoc-value
(alex:assoc-value
(json:with-decoder-simple-list-semantics
(json:decode-json-from-string instances))
service)
:clearnet))))
(export-always 'proxitok-instances-builder)
(defvar proxitok-instances-builder
(make-instance
'instances-builder
:source libredirect-instances-source
:builder (libredirect-instances-builder :proxi-tok)))
(export-always 'whoogle-instances-builder)
(defvar whoogle-instances-builder
(make-instance
'instances-builder
:source libredirect-instances-source
:builder (libredirect-instances-builder :whoogle)))
(export-always 'breezewiki-instances-builder)
(defvar breezewiki-instances-builder
(make-instance
'instances-builder
:source libredirect-instances-source
:builder (libredirect-instances-builder :breeze-wiki)))
(export-always 'invidious-instances-builder)
(defvar invidious-instances-builder
(make-instance
'instances-builder
:source "https://api.invidious.io/instances.json"
:builder
(lambda (instances)
(mapcar 'first
(json:with-decoder-simple-list-semantics
(json:decode-json-from-string instances))))))
(export-always 'scribe-instances-builder)
(defvar scribe-instances-builder
(make-instance
'instances-builder
:source
"https://git.sr.ht/~edwardloveall/scribe/blob/main/docs/instances.json"
:builder
(lambda (instances)
(json:decode-json-from-string instances))))
(export-always 'teddit-instances-builder)
(defvar teddit-instances-builder
(make-instance
'instances-builder
:source
"https://codeberg.org/teddit/teddit/raw/branch/main/instances.json"
:builder
(lambda (instances)
(mapcar (lambda (instance)
(unless (str:emptyp (alex:assoc-value instance :url))
(alex:assoc-value instance :url)))
(json:with-decoder-simple-list-semantics
(json:decode-json-from-string instances))))))
(export-always 'libreddit-instances-builder)
(defvar libreddit-instances-builder
(make-instance
'instances-builder
:source
"https://raw.githubusercontent.com/libreddit/libreddit-instances/master/instances.json"
:builder
(lambda (instances)
(mapcar (lambda (instance)
(unless (str:emptyp (alex:assoc-value instance :url))
(alex:assoc-value instance :url)))
(alex:assoc-value
(json:with-decoder-simple-list-semantics
(json:decode-json-from-string instances))
:instances)))))
(defun fetch-instances (url)
(handler-case (dex:get url)
(usocket:ns-host-not-found-error ()
(nyxt:echo-warning
"There's no Internet connection to retrieve instances")
nil)))
(defgeneric build-instances (instances-builder)
(:documentation "Build a list of instances from INSTANCES-BUILDER."))
(defmethod build-instances ((instances-builder instances-builder))
(alex:when-let ((instances (fetch-instances (source instances-builder))))
(delete nil (funcall (builder instances-builder) instances))))
|