File feedtree.hws changed (mode: 100755) (index bf8bd23..cad1c0c) |
... |
... |
Function p_Fetch(url$) |
281 |
281 |
EndIf |
EndIf |
282 |
282 |
|
|
283 |
283 |
Local err_code = ?StringToFile(xml$, p_GetXMLname(url$)) |
Local err_code = ?StringToFile(xml$, p_GetXMLname(url$)) |
284 |
|
p_Replay(err_code, "Updated XML file saved") |
|
285 |
|
If err_code = #ERR_NONE |
|
286 |
|
;č kolikrát weby dodají do RSS nějaký BuildDate, |
|
287 |
|
;č kterým se RSS formálně změní. |
|
288 |
|
;č Takže zde, na místě, když ještě máme xml v ruce, |
|
289 |
|
;č musíme rozhodnout, zda je v tom RSS doopravdy něco nového. |
|
290 |
|
;č Půjdeme podle guid. Když se změní, tak asi kvůli novému článku. |
|
291 |
|
;č Kódování nemusíme řešit, je to jen pro nás, |
|
292 |
|
;č žádný parser zde volat nebudeme. |
|
293 |
|
Local guidsum = 0 |
|
294 |
|
;č nechcu to posílat do další funkce |
|
295 |
|
;č Já totiž nejsem 100% jist, že Hollywood ty řetězce nekopíruje |
|
296 |
|
; If Atom |
|
297 |
|
Local guidpos = FindStr(xml$, "<updated", False, 0, #ENCODING_RAW) |
|
298 |
|
If guidpos > 0 |
|
299 |
|
Local guidend = FindStr(xml$, "</updated>", False, guidpos, #ENCODING_RAW) |
|
300 |
|
Local len = guidend - guidpos |
|
301 |
|
If len > 0 |
|
302 |
|
guidsum = CRC32Str(MidStr(xml$, guidpos, len, #ENCODING_RAW)) |
|
303 |
|
EndIf |
|
304 |
|
EndIf |
|
305 |
|
|
|
306 |
|
; If RSS |
|
307 |
|
Local guidpos = FindStr(xml$, "<guid", False, 0, #ENCODING_RAW) |
|
308 |
|
If guidpos > 0 |
|
309 |
|
Local guidend = FindStr(xml$, "</guid", False, guidpos, #ENCODING_RAW) |
|
310 |
|
Local len = guidend - guidpos |
|
311 |
|
If len > 0 |
|
312 |
|
guidsum = CRC32Str(MidStr(xml$, guidpos, len, #ENCODING_RAW)) |
|
313 |
|
EndIf |
|
314 |
|
EndIf |
|
315 |
|
|
|
316 |
|
;č objevilo se, že některé RSS kanály žádné guidy nemají vůbec |
|
317 |
|
;č Když tak, v tuto chvíli už víme, že xml soubor je nový |
|
318 |
|
;č a můžeme s čistým svědomím prohlásit kanál za aktualizovaný |
|
319 |
|
If guidsum = 0 |
|
320 |
|
Return(#FEED_STATUS_NEW) |
|
321 |
|
EndIf |
|
322 |
|
|
|
323 |
|
If fd_isEqualOrSet(url$, "guidsum", guidsum) |
|
324 |
|
Return(#FEED_STATUS_SUCCESS) |
|
325 |
|
EndIf |
|
326 |
|
|
|
327 |
|
p_Replay(err_code, "\27".."5\27b" .. url$ .. " Updated!") |
|
328 |
|
Return(#FEED_STATUS_NEW) |
|
329 |
|
Else |
|
|
284 |
|
p_Replay(err_code, "Updated XML file from " ..url$ .." saved") |
|
285 |
|
If err_code <> #ERR_NONE |
330 |
286 |
;č Aha... Tak zpětně vynulujeme čeksumu, aby příště zkusil to uložit znovu |
;č Aha... Tak zpětně vynulujeme čeksumu, aby příště zkusil to uložit znovu |
331 |
287 |
fd_Set(url$, "checksum", False) |
fd_Set(url$, "checksum", False) |
332 |
288 |
Return(#FEED_STATUS_ERROR) |
Return(#FEED_STATUS_ERROR) |
333 |
|
EndIf |
|
|
289 |
|
EndIf |
|
290 |
|
|
|
291 |
|
;č kolikrát weby dodají do RSS nějaký BuildDate, |
|
292 |
|
;č kterým se RSS formálně změní. |
|
293 |
|
;č Takže zde, na místě, když ještě máme xml v ruce, |
|
294 |
|
;č musíme rozhodnout, zda je v tom RSS doopravdy něco nového. |
|
295 |
|
;č Objevilo se, že kolikrát ty kanály žádné guid nemají, |
|
296 |
|
;č specifikace RSS totiž ustanovuje povinným pouze buď title, |
|
297 |
|
;č nebo description. |
|
298 |
|
;č Některé kanály navíc neumísťují nejnovější články na první místo. |
|
299 |
|
;č Napadlo mně, že by bylo možné počítat kontrolní sumu od prvního item |
|
300 |
|
;č až do konce souboru. Tím |
|
301 |
|
;č 1. odřízneme veškeré BuildDate kanálu atd. |
|
302 |
|
;č 2. zachytíme změny článků, |
|
303 |
|
;č a) aniž by byly na prvním místě |
|
304 |
|
;č b) aniž bychom celý obsah parsili a hlídali |
|
305 |
|
;č nové příspěvky ve slovnících. |
|
306 |
|
; |
|
307 |
|
;č nechcu to posílat do další funkce |
|
308 |
|
;č Já totiž nejsem 100% jist, že Hollywood ty řetězce nekopíruje |
|
309 |
|
Local guidsum = 0 |
|
310 |
|
;č Kódování nemusíme řešit, je to jen pro nás, |
|
311 |
|
;č žádný parser zde volat nebudeme. |
|
312 |
|
Local guidpos = Max(FindStr(xml$, "<entry", False, 0, #ENCODING_RAW), |
|
313 |
|
FindStr(xml$, "<item", False, 0, #ENCODING_RAW)) |
|
314 |
|
|
|
315 |
|
|
|
316 |
|
;č XML-ko je nové, ale kanál neobsahuje nic? |
|
317 |
|
;č Tak já nevím... |
|
318 |
|
If guidpos < 0 |
|
319 |
|
mui.Set("status", "Contents", "\27".."5\27i ".. url$ .. " is empty") |
|
320 |
|
Return(#FEED_STATUS_SUCCESS) |
|
321 |
|
EndIf |
|
322 |
|
|
|
323 |
|
guidsum = CRC32Str(UnrightStr(xml$, guidpos, #ENCODING_RAW)) |
|
324 |
|
If fd_isEqualOrSet(url$, "guidsum", guidsum) |
|
325 |
|
Return(#FEED_STATUS_SUCCESS) |
|
326 |
|
EndIf |
|
327 |
|
|
|
328 |
|
mui.Set("status", "Contents", "\27".."5\27b" .. url$ .. " Updated!") |
|
329 |
|
Return(#FEED_STATUS_NEW) |
334 |
330 |
EndFunction |
EndFunction |
335 |
331 |
|
|
336 |
332 |
|
|