-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduckduckgo.vbml
191 lines (177 loc) · 7.2 KB
/
duckduckgo.vbml
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# VBML 1.0.3
#--------------------------------------------------------------------------------------------------
# Properties
#--------------------------------------------------------------------------------------------------
type: backend
source: https://raw.githubusercontent.com/omega-gg/backend/master/duckduckgo.vbml
api: 1.0.3
version: 1.0.15
search: tracks
title: DuckDuckGo
host: duckduckgo.com
cover: /cover/duckduckgo.png
items:
playlist:
title: Tracks
folder:
title: Playlists
validate: ^html.duckduckgo.com
#--------------------------------------------------------------------------------------------------
# Routines
#--------------------------------------------------------------------------------------------------
CREATE_QUERY: |
IF (EQUAL method "search")
OR (EQUAL method "related")
SET q (SIMPLIFY q)
# NOTE: Appending " !" to a search query redirects to the first result by default.
IF (EQUAL (INDEX_END q " !") (LENGTH q))
SET q (CHOP q 2)
FI
IF (EQUAL label "urls")
OR (EQUAL label "site")
SET url "https://html.duckduckgo.com/html"
URL_ADD_QUERY url "q" (URL_ENCODE q)
URL_ADD_QUERY url "kl" "us-en"
#URL_ADD_QUERY url "kp" "-1"
ELIF (EQUAL label "tracks")
SET url "https://duckduckgo.com/"
URL_ADD_QUERY url "q" (URL_ENCODE q)
URL_ADD_QUERY url "kl" "us-en"
#URL_ADD_QUERY url "kp" "-1"
SET url (APPEND url "&iar=videos&iax=videos&ia=videos")
SET id 2
SET queryData q
ELIF (EQUAL label "playlists")
SET url "https://html.duckduckgo.com/html"
URL_ADD_QUERY url "q" (URL_ENCODE q)
URL_ADD_QUERY url "kl" "us-en"
#URL_ADD_QUERY url "kp" "-1"
SET id 1
FI
FI
EXTRACT_PLAYLIST: |
IF (EQUAL id 1)
#------------------------------------------------------------------------------------------
# Parsing results
#------------------------------------------------------------------------------------------
# NOTE: Skipping advertisement results.
SET index (INDEX_OF data "class=\"result results_links results_links_deep web-result")
SET list (SLICES data "class=\"result__a\"" "</a>" index)
FOREACH list source
SET source (HTML_ATTRIBUTE source "href")
# NOTE: We might get corrupted URL(s) if the 'User-Agent' is invalid.
IF (CONTAIN source "?uddg=")
SET source (URL_DECODE (SLICE_IN source "?uddg=" "&"))
FI
IF (EQUAL source "")
OR (LIST_CONTAIN urls source)
CONTINUE
FI
LIST_APPEND urls source
HASH_SET query "backend" "duckduckgo"
HASH_SET query "url" source
HASH_SET query "skipError" true
HASH_SET query "timeout" 10000
LIST_APPEND next query
END
#------------------------------------------------------------------------------------------
ELIF (EQUAL id 2) # Tracks
SET url (SLICE_IN data "vqd=\"" '"')
SET url (APPEND "https://duckduckgo.com/v.js?q=" (URL_ENCODE queryData) \
"&o=json&p=-1&sr=1&vqd=" url "&f=,,,&l=us-en")
HASH_SET next "url" url
HASH_SET next "id" 3
ELIF (GREATER id 2) # Tracks
SET data (READ data "utf-8")
IF (EQUAL id 3)
# FIXME: For some reason there's a double quote in the middle of the url.
SET url (REPLACE (JSON_EXTRACT data "next") '"' '')
HASH_SET next "url" (APPEND "https://duckduckgo.com/" url)
HASH_SET next "id" 4
FI
SET list (SLICES data "\"content\"" "\"uploader\"")
FOREACH list data
HASH_SET track "state" "default"
HASH_SET track "source" (JSON_EXTRACT data "content")
HASH_SET track "title" (JSON_EXTRACT_UTF8 data "title")
HASH_SET track "cover" (JSON_EXTRACT data "large")
LIST_APPEND tracks track
END
ELSE # Extract sources
SET list (HTML_TRACKS data url (LIST "http"))
FOREACH list data
SET source data
# NOTE: We want to skip media files.
IF (NOT_EQUAL (URL_EXTENSION source) "")
CONTINUE
FI
HASH_SET track "state" "default"
HASH_SET track "source" source
LIST_APPEND tracks track
IF (EQUAL (COUNT tracks) 8)
BREAK
FI
END
SET clearDuplicate true
SET scanItems true
FI
EXTRACT_FOLDER: |
IF (EQUAL id 1)
#------------------------------------------------------------------------------------------
# Parsing results
#------------------------------------------------------------------------------------------
# NOTE: Skipping advertisement results.
SET index (INDEX_OF data "class=\"result results_links results_links_deep web-result")
SET list (SLICES data "class=\"result__a\"" "</a>" index)
FOREACH list source
SET source (HTML_ATTRIBUTE source "href")
# NOTE: We might get corrupted URL(s) if the 'User-Agent' is invalid.
IF (CONTAIN source "?uddg=")
SET source (URL_DECODE (SLICE_IN source "?uddg=" "&"))
FI
IF (EQUAL source "")
OR (LIST_CONTAIN urls source)
CONTINUE
FI
LIST_APPEND urls source
HASH_SET query "backend" "duckduckgo"
HASH_SET query "url" source
HASH_SET query "id" 2
HASH_SET query "skipError" true
HASH_SET query "timeout" 10000
LIST_APPEND next query
END
#------------------------------------------------------------------------------------------
ELIF (EQUAL id 2) # Extract sources
SET list (HTML_PLAYLISTS data url (LIST "http"))
FOREACH list data
HASH_SET item "type" (HASH_GET data "type")
HASH_SET item "state" "default"
HASH_SET item "source" (HASH_GET data "url")
LIST_APPEND items item
IF (EQUAL (COUNT items) 8)
BREAK
FI
END
SET clearDuplicate true
SET scanItems true
ELSE
# NOTE: Skipping advertisement results.
SET index (INDEX_OF data "class=\"result results_links results_links_deep web-result")
SET list (SLICES data "class=\"result__a\"" "</a>" index)
FOREACH list data
SET source (HTML_ATTRIBUTE data "href")
# NOTE: We might get corrupted URL(s) if the 'User-Agent' is invalid.
IF (CONTAIN source "?uddg=")
SET source (URL_DECODE (SLICE_IN source "?uddg=" "&"))
FI
# NOTE: We use 'name' because 'title' is the folder title.
SET name (HTML_TO_UTF8 (SLICE_IN data '>' "</a>"))
HASH_SET item "type" "folderSearch"
HASH_SET item "state" "default"
HASH_SET item "source" source
HASH_SET item "title" name
LIST_APPEND items item
END
SET scanItems true
FI