11local curl = require " plenary.curl"
22local config = require " feed.config"
33local feedparser = require " feed.feedparser"
4- local date = require " feed.date"
54local db = require (" feed.db" ).db (config .db_dir )
6- local sha1 = require " feed.sha1"
75
86local M = {}
97
10- --- @param ast table
11- --- @param feed_type feed.feedtype
12- --- @return feed.entry[]
13- --- @return string
14- local function get_root (ast , feed_type )
15- if feed_type == " json" then
16- return ast .items , ast .title
17- elseif feed_type == " rss" then
18- return ast .channel .item , ast .channel .title
19- else
20- return {}, " nulllll" --- TODO: test atom feeds!!!
21- end
22- end
23-
24- local date_tag = {
25- rss = " pubDate" ,
26- json = " date_published" ,
27- }
28-
29- --- @param entry table
30- --- @param feedtype feed.feedtype
31- --- @param feedname string
32- --- @return feed.entry
33- --- @return string # content to store on disk
34- local function unify (entry , feedtype , feedname )
35- local content
36- local _date = entry [date_tag [feedtype ]]
37- entry [date_tag [feedtype ]] = nil
38- entry .time = date .new_from [feedtype ](_date ):absolute ()
39- entry .feed = feedname
40- if feedtype == " json" then
41- entry .link = entry .url
42- entry .id = sha1 (entry .link )
43- entry .url = nil
44- content = entry .content_html
45- entry .content_html = nil
46- elseif feedtype == " rss" then
47- entry .link = entry .link
48- entry .id = sha1 (entry .link )
49- content = entry [" content:encoded" ] or entry .description
50- entry [" content:encoded" ] = nil
51- entry .description = nil
52- end
53- entry .tags = { unread = true } -- HACK:
54- return entry , content
55- end
56-
57- function M .fetch (url , timeout , callback )
8+ local function fetch (url , timeout , callback )
589 curl .get {
5910 url = url ,
6011 timeout = timeout ,
@@ -70,7 +21,11 @@ function M.update_feed(feed, total, handle)
7021 local src
7122 local url
7223 if type (feed ) == " table" then
73- url = feed [1 ]
24+ if feed .xmlUrl then
25+ url = feed .xmlUrl
26+ else
27+ url = feed [1 ]
28+ end
7429 else
7530 url = feed
7631 end
@@ -79,16 +34,19 @@ function M.update_feed(feed, total, handle)
7934 return
8035 end
8136 src = res .body
82- -- src = (res.body):gsub("\n", "")
83- local ok , ast , feed_type = pcall (feedparser .parse , src )
37+ local ok , ast = pcall (feedparser .parse , src )
8438 if not ok then -- FOR DEBUG
8539 print ((" [feed.nvim] failed to parse %s" ):format (feed .name or url ))
8640 print (ast )
8741 return
8842 end
89- local entries , feed_name = get_root (ast , feed_type )
43+ --- @type feed.opml
44+ config .opml_t :append (ast .title , nil , ast .link , url )
45+ local entries = ast .entries
9046 for _ , entry in ipairs (entries ) do
91- db :add (unify (entry , feed_type , feed_name ))
47+ local content = entry .content
48+ entry .content = nil
49+ db :add (entry , content )
9250 end
9351 db :save ()
9452 if handle then
@@ -98,7 +56,7 @@ function M.update_feed(feed, total, handle)
9856 end
9957 end
10058 end
101- M . fetch (url , 30000 , callback )
59+ fetch (url , 30000 , callback )
10260end
10361
10462-- TODO: maybe use a process bar like fidget.nvim
0 commit comments