File feedtree.hws changed (mode: 100755) (index 0211706..63f7164) |
... |
... |
Function p_FetchAll() |
54 |
54 |
p_Unlock() |
p_Unlock() |
55 |
55 |
EndFunction |
EndFunction |
56 |
56 |
|
|
|
57 |
|
|
|
58 |
|
Function progress_curl_callback(total, count, utotal, ucount, url$) |
|
59 |
|
mui.Set("status", "Contents", |
|
60 |
|
"Downloading (" .. count .. "/" .. total .. ") from " .. url$) |
|
61 |
|
CheckEvents() ; keep MUI responsive |
|
62 |
|
Return(PleaseStop) |
|
63 |
|
EndFunction |
|
64 |
|
|
|
65 |
|
Function write_curl_callback(data$, t) |
|
66 |
|
InsertItem(t, data$) |
|
67 |
|
CheckEvents() ; keep MUI responsive |
|
68 |
|
If PleaseStop Then Return(#CURL_WRITEFUNC_PAUSE) |
|
69 |
|
EndFunction |
|
70 |
|
|
|
71 |
|
|
|
72 |
|
|
57 |
73 |
Function p_TimeFetch(muiid) |
Function p_TimeFetch(muiid) |
58 |
74 |
Local tid = StartTimer(Nil) |
Local tid = StartTimer(Nil) |
59 |
|
p_FetchGroup(muiid) |
|
|
75 |
|
Local e = Nil |
|
76 |
|
If UseDefaultDownloader |
|
77 |
|
p_FetchGroup(muiid, Nil) |
|
78 |
|
Else |
|
79 |
|
e = hurl.Easy() |
|
80 |
|
e:SetOpt_Accept_Encoding("") |
|
81 |
|
;e:SetOpt_AutoReferer(1) |
|
82 |
|
e:SetOpt_ConnectTimeout(3) |
|
83 |
|
e:SetOpt_FileTime(1) |
|
84 |
|
e:SetOpt_FailOnError(1) |
|
85 |
|
e:SetOpt_FollowLocation(1) |
|
86 |
|
e:SetOpt_NoProgress(0) |
|
87 |
|
e:SetOpt_TimeCondition(1) ;#HURL_TIMECOND_IFMODSINCE undefined |
|
88 |
|
e:SetOpt_UserAgent("IvoRSS") |
|
89 |
|
;e:SetOpt_SSL_FalseStart(1) |
|
90 |
|
;e:SetOpt_TCP_FastOpen(1) |
|
91 |
|
|
|
92 |
|
p_FetchGroup(muiid, e) |
|
93 |
|
|
|
94 |
|
; destroy easy object |
|
95 |
|
e:Close() |
|
96 |
|
EndIf |
|
97 |
|
|
60 |
98 |
If PleaseStop |
If PleaseStop |
61 |
99 |
mui.Set("status", "Contents", "job is interrupted") |
mui.Set("status", "Contents", "job is interrupted") |
62 |
100 |
Else |
Else |
|
... |
... |
Function p_FetchCurrent() |
74 |
112 |
If t.Node |
If t.Node |
75 |
113 |
p_TimeFetch(t.muiid) |
p_TimeFetch(t.muiid) |
76 |
114 |
Else |
Else |
77 |
|
Local status = p_Fetch(t.id, False) |
|
|
115 |
|
Local status = p_Fetch(t.id, Nil) |
|
116 |
|
CollectGarbage() |
78 |
117 |
If status = #FEED_STATUS_NEW |
If status = #FEED_STATUS_NEW |
79 |
118 |
p_MarkFeed(t.id, #FEED_STATUS_READ) |
p_MarkFeed(t.id, #FEED_STATUS_READ) |
80 |
119 |
Ivor:Load(t.id) |
Ivor:Load(t.id) |
|
... |
... |
EndFunction |
107 |
146 |
;č zjistit co je Node zač, |
;č zjistit co je Node zač, |
108 |
147 |
;č podle toho postupovat |
;č podle toho postupovat |
109 |
148 |
;č musí být rekurzivní |
;č musí být rekurzivní |
110 |
|
Function p_FetchGroup(muiid$) |
|
|
149 |
|
Function p_FetchGroup(muiid$, e) |
111 |
150 |
Local isFound, t = mui.DoMethod(#LIST_TREE, "GetEntry", muiid$, "Head", "") |
Local isFound, t = mui.DoMethod(#LIST_TREE, "GetEntry", muiid$, "Head", "") |
112 |
151 |
While isFound And Not PleaseStop |
While isFound And Not PleaseStop |
113 |
152 |
If t.Node |
If t.Node |
114 |
|
p_FetchGroup(t.muiid) |
|
|
153 |
|
p_FetchGroup(t.muiid, e) |
115 |
154 |
Else |
Else |
116 |
|
p_FetchFeed(t.id) |
|
|
155 |
|
p_FetchFeed(t.id, e) |
117 |
156 |
EndIf |
EndIf |
118 |
157 |
isFound, t = mui.DoMethod(#LIST_TREE, "GetEntry", t.muiid, "Next", "") |
isFound, t = mui.DoMethod(#LIST_TREE, "GetEntry", t.muiid, "Next", "") |
119 |
158 |
Wend |
Wend |
|
... |
... |
EndFunction |
122 |
161 |
|
|
123 |
162 |
;č označit buď jako nové, nebo jako přečtené |
;č označit buď jako nové, nebo jako přečtené |
124 |
163 |
;č smí se posílat JENOM fidy, nikoliv skupiny |
;č smí se posílat JENOM fidy, nikoliv skupiny |
125 |
|
Function p_FetchFeed(feedid$) |
|
126 |
|
Local status = p_Fetch(feedid$, True) |
|
|
164 |
|
Function p_FetchFeed(feedid$, e) |
|
165 |
|
Local status = p_Fetch(feedid$, e) |
|
166 |
|
CollectGarbage() |
127 |
167 |
If status = #FEED_STATUS_SUCCESS |
If status = #FEED_STATUS_SUCCESS |
128 |
168 |
If fd_Get(feedid$, "status") = #FEED_STATUS_NEW Then Return() |
If fd_Get(feedid$, "status") = #FEED_STATUS_NEW Then Return() |
129 |
169 |
status = #FEED_STATUS_READ |
status = #FEED_STATUS_READ |
|
... |
... |
EndFunction |
263 |
303 |
|
|
264 |
304 |
|
|
265 |
305 |
|
|
266 |
|
|
|
267 |
|
|
|
268 |
|
|
|
269 |
306 |
;č stáhnout soubor |
;č stáhnout soubor |
270 |
307 |
;č možné statusy |
;č možné statusy |
271 |
308 |
/* |
/* |
|
... |
... |
EndFunction |
274 |
311 |
#FEED_STATUS_INTERRUPTED |
#FEED_STATUS_INTERRUPTED |
275 |
312 |
#FEED_STATUS_ERROR |
#FEED_STATUS_ERROR |
276 |
313 |
*/ |
*/ |
277 |
|
Function p_Fetch(url$, fast) |
|
|
314 |
|
Function p_Fetch(url$, e) |
278 |
315 |
;č Já se bojím. Co kdyby nějaký server posílal blbosti? |
;č Já se bojím. Co kdyby nějaký server posílal blbosti? |
279 |
316 |
;č Uživatel bude cvakat Fetch a mu jen "Download skipped"? |
;č Uživatel bude cvakat Fetch a mu jen "Download skipped"? |
280 |
|
Local timestamp = -2 |
|
|
317 |
|
; |
281 |
318 |
;č objevilo, že TCP handshake je šíleně dlouhá záležitost |
;č objevilo, že TCP handshake je šíleně dlouhá záležitost |
282 |
319 |
;č tohle, jako, skoro dvojnásobně prodlužuje stahování |
;č tohle, jako, skoro dvojnásobně prodlužuje stahování |
283 |
320 |
;č Na druhou stranu, psát v Hollywoodu něco jako kólbeky, |
;č Na druhou stranu, psát v Hollywoodu něco jako kólbeky, |
284 |
321 |
;č které by alokovaly buffery je pěkný nesmysl |
;č které by alokovaly buffery je pěkný nesmysl |
285 |
|
If fast And fd_Get(url$, "timestamp") > -1 |
|
286 |
|
e = hurl.Easy({URL = url$, FollowLocation = True}) |
|
287 |
|
;e:SetOpt_Accept_Encoding("") |
|
288 |
|
;e:SetOpt_AutoReferer(1) |
|
289 |
|
e:SetOpt_FileTime(1) |
|
290 |
|
e:SetOpt_FailOnError(1) |
|
291 |
|
e:SetOpt_Forbid_Reuse(1) |
|
292 |
|
;e:SetOpt_SSL_FalseStart(1) |
|
293 |
|
;e:SetOpt_TCP_FastOpen(1) |
|
294 |
|
Function p_WriteData(data$) |
|
295 |
|
DebugPrint("Data: ", data$) |
|
296 |
|
EndFunction |
|
297 |
|
e:SetOpt_WriteFunction(p_WriteData) |
|
298 |
|
e:SetOpt_Nobody(1) |
|
299 |
|
Local err_code = ?e:Perform() |
|
300 |
|
timestamp = e:GetInfo_FileTime() |
|
301 |
|
; destroy easy object |
|
302 |
|
e:Close() |
|
303 |
|
DebugPrint(timestamp, fd_Get(url$, "timestamp"), url$) |
|
|
322 |
|
If Not isNil(e) ;And timestamp > -1 |
|
323 |
|
e:SetOpt_URL(url$) |
|
324 |
|
e:SetOpt_ProgressFunction(progress_curl_callback, url$) ;userdata |
|
325 |
|
|
|
326 |
|
Local tdata = CreateList() |
|
327 |
|
e:SetOpt_WriteFunction(write_curl_callback, tdata) |
304 |
328 |
|
|
305 |
|
If timestamp > 0 And fd_Get(url$, "timestamp") = timestamp |
|
306 |
|
mui.Set("status", "Contents", "Skipped downloading from " ..url$) |
|
|
329 |
|
Local servertime = fd_Get(url$, "servertime") |
|
330 |
|
If servertime > 0 |
|
331 |
|
e:SetOpt_TimeValue(servertime) |
|
332 |
|
DebugPrint("servertime", servertime) |
|
333 |
|
ElseIf fd_Get(url$, "localtime") > 0 |
|
334 |
|
e:SetOpt_TimeValue(fd_Get(url$, "localtime")) |
|
335 |
|
DebugPrint("localtime", fd_Get(url$, "localtime")) |
|
336 |
|
Else |
|
337 |
|
e:UnsetOpt_TimeValue() |
|
338 |
|
DebugPrint("Nothing time") |
|
339 |
|
EndIf |
|
340 |
|
|
|
341 |
|
;e:SetOpt_Nobody(1) |
|
342 |
|
Local err_code = ?e:Perform() |
|
343 |
|
If err_code <> #ERR_NONE |
|
344 |
|
If PleaseStop |
|
345 |
|
;mui.Set("status", "Contents", "interrupted") |
|
346 |
|
Return(#FEED_STATUS_INTERRUPTED) |
|
347 |
|
Else |
|
348 |
|
;č přece je nějaká chyba |
|
349 |
|
mui.Set("status", "Contents", "\27b" .. GetErrorName(err_code)) |
|
350 |
|
Return(#FEED_STATUS_ERROR) |
|
351 |
|
EndIf |
|
352 |
|
ElseIf e:GetInfo_Condition_Unmet() |
|
353 |
|
mui.Set("status", "Contents", GetErrorName(err_code) |
|
354 |
|
.." (skip downloading from " ..url$ ..")") |
|
355 |
|
;č Soubor na serveru se nezměnil |
|
356 |
|
;č neděláme nic, vracíme úspěch |
|
357 |
|
DebugPrint("skipped", url$) |
307 |
358 |
Return(#FEED_STATUS_SUCCESS) |
Return(#FEED_STATUS_SUCCESS) |
308 |
|
;č Když server nechce dát čas změny, tak si to zapíšeme |
|
309 |
|
;č a příště už na něj nebudeme utrácet čas |
|
310 |
|
ElseIf timestamp < 0 |
|
311 |
|
fd_Set(url$, "timestamp", timestamp) |
|
312 |
|
EndIf |
|
313 |
|
EndIf |
|
|
359 |
|
EndIf |
|
360 |
|
|
314 |
361 |
|
|
|
362 |
|
;č úspěch |
|
363 |
|
DebugPrint(e:GetInfo_FileTime()) |
|
364 |
|
Return(p_LookThrough(url$, Concat(tdata), e:GetInfo_FileTime())) |
|
365 |
|
|
|
366 |
|
EndIf |
|
367 |
|
|
|
368 |
|
; |
|
369 |
|
; Default downloader |
|
370 |
|
; |
|
371 |
|
|
315 |
372 |
;č zjednodušená kontrola, pokud řetězec obsahuje procenta, |
;č zjednodušená kontrola, pokud řetězec obsahuje procenta, |
316 |
373 |
;č považujeme ho za "eskejpnutý". |
;č považujeme ho za "eskejpnutý". |
317 |
374 |
;č Na případ, kdy uživatel strčí do URLu osamělý znak procenta vysereme |
;č Na případ, kdy uživatel strčí do URLu osamělý znak procenta vysereme |
318 |
375 |
Local err_code, xml$, count = ?DownloadFile(url$, |
Local err_code, xml$, count = ?DownloadFile(url$, |
319 |
|
{Adapter="hurl", Fail404=True, Encoded=FindStr(url$, "%", True) <> -1}, |
|
|
376 |
|
{Adapter="hurl", Fail404=True, Encoded=FindStr(url$, "%", True) <> -1}, |
320 |
377 |
p_callback, url$) |
p_callback, url$) |
321 |
378 |
p_Replay(err_code, count .. " bytes from " .. url$ .. " transmitted") |
p_Replay(err_code, count .. " bytes from " .. url$ .. " transmitted") |
322 |
379 |
CheckEvents() ; keep MUI even more responsive |
CheckEvents() ; keep MUI even more responsive |
|
... |
... |
Function p_Fetch(url$, fast) |
324 |
381 |
|
|
325 |
382 |
If PleaseStop Then Return(#FEED_STATUS_INTERRUPTED) |
If PleaseStop Then Return(#FEED_STATUS_INTERRUPTED) |
326 |
383 |
|
|
327 |
|
If fd_isEqualOrSet(url$, "checksum", CRC32Str(xml$)) |
|
328 |
|
Return(#FEED_STATUS_SUCCESS) |
|
329 |
|
EndIf |
|
|
384 |
|
;č není chyba? Tam posíláme dál |
|
385 |
|
Return(p_LookThrough(url$, xml$)) |
|
386 |
|
EndFunction |
330 |
387 |
|
|
|
388 |
|
|
|
389 |
|
Function p_LookThrough(url$, xml$, servertime) |
|
390 |
|
Local checksum = CRC32Str(xml$) |
|
391 |
|
If fd_Get(url$, "checksum") = checksum Then Return(#FEED_STATUS_SUCCESS) |
|
392 |
|
|
331 |
393 |
Local err_code = ?StringToFile(xml$, p_GetXMLname(url$)) |
Local err_code = ?StringToFile(xml$, p_GetXMLname(url$)) |
332 |
394 |
p_Replay(err_code, "Updated XML file from " ..url$ .." saved") |
p_Replay(err_code, "Updated XML file from " ..url$ .." saved") |
333 |
|
If err_code <> #ERR_NONE |
|
334 |
|
;č Aha... Tak zpětně vynulujeme čeksumu, aby příště zkusil to uložit znovu |
|
335 |
|
fd_Set(url$, "checksum", False) |
|
336 |
|
Return(#FEED_STATUS_ERROR) |
|
337 |
|
EndIf |
|
338 |
|
|
|
339 |
|
;č teprve zde uložíme otisk času |
|
340 |
|
;č Pěkně si uvědomuji, že případná chyba v tomto kódu zablokuje |
|
341 |
|
;č uživateli normální stahování |
|
342 |
|
If fast Then fd_Set(url$, "timestamp", timestamp) |
|
343 |
|
|
|
|
395 |
|
If err_code <> #ERR_NONE Then Return(#FEED_STATUS_ERROR) |
344 |
396 |
|
|
|
397 |
|
fd_Set(url$, "checksum", checksum) |
|
398 |
|
fd_Set(url$, "servertime", servertime) |
|
399 |
|
fd_Set(url$, "localtime", GetTimestamp(#TIMESTAMP_UNIX)) |
345 |
400 |
|
|
346 |
401 |
;č kolikrát weby dodají do RSS nějaký BuildDate, |
;č kolikrát weby dodají do RSS nějaký BuildDate, |
347 |
402 |
;č kterým se RSS formálně změní. |
;č kterým se RSS formálně změní. |