44
55module Ingestors
66 class IcalIngestor < Ingestor
7+ include Ingestors ::Concerns ::SitemapHelpers
8+
79 def self . config
810 {
911 key : 'ical' ,
@@ -13,111 +15,63 @@ def self.config
1315 end
1416
1517 def read ( url )
16- unless url . nil?
17- if url . to_s . downcase . end_with? 'sitemap.xml'
18- process_sitemap url
19- else
20- process_icalendar url
21- end
18+ sources = parse_sitemap ( url )
19+ sources . each do |source |
20+ process_icalendar ( source )
2221 end
2322 end
2423
2524 private
2625
27- def process_sitemap ( url )
28- # find urls for individual icalendar files
29- begin
30- sitemap = Nokogiri ::XML . parse ( open_url ( url , raise : true ) )
31- locs = sitemap . xpath ( '/ns:urlset/ns:url/ns:loc' , {
32- 'ns' => 'http://www.sitemaps.org/schemas/sitemap/0.9'
33- } )
34- locs . each do |loc |
35- process_icalendar ( loc . text )
36- end
37- rescue Exception => e
38- @messages << "Extract from sitemap[#{ url } ] failed with: #{ e . message } "
39- end
40-
41- # finished
42- nil
43- end
44-
4526 def process_icalendar ( url )
4627 # process individual ics file
4728 query = '?ical=true'
4829
49- begin
50- # append query (if required)
51- file_url = url
52- file_url << query unless url . to_s . downcase . ends_with? query
30+ # append query (if required)
31+ file_url = url
32+ file_url << query unless url . to_s . downcase . ends_with? query
5333
54- # process file
55- events = Icalendar ::Event . parse ( open_url ( file_url , raise : true ) . set_encoding ( 'utf-8' ) )
34+ # process file
35+ data = open_url ( file_url )
36+ if data
37+ events = Icalendar ::Event . parse ( data . set_encoding ( 'utf-8' ) )
5638
5739 # process each event
58- events . each do |e |
59- process_event ( e )
40+ events . each do |ical_event |
41+ add_event ( process_event ( ical_event ) )
6042 end
61- rescue Exception => e
62- @messages << "Process file url[#{ file_url } ] failed with: #{ e . message } "
6343 end
64-
6544 # finished
66- nil
6745 end
6846
6947 def process_event ( calevent )
70- # puts "calevent: #{calevent.inspect}"
71- begin
72- # set fields
73- event = OpenStruct . new
74- event . url = calevent . url . to_s
75- event . title = calevent . summary . to_s
76- event . description = process_description calevent . description
77-
78- # puts "\n\ncalevent.description = #{calevent.description}"
79- # puts "\n\n... converted = #{event.description}"
80-
81- event . end = calevent . dtend &.to_time
82- unless calevent . dtstart . nil?
83- dtstart = calevent . dtstart
84- event . start = dtstart &.to_time
85- tzid = dtstart . ical_params [ 'tzid' ]
86- event . timezone = tzid . first . to_s if !tzid . nil? and tzid . size > 0
87- end
48+ # set fields
49+ event = OpenStruct . new
50+ event . url = calevent . url &.to_s
51+ event . title = calevent . summary &.to_s
52+ event . description = process_description ( calevent . description )
53+
54+ event . end = calevent . dtend &.to_time
55+ unless calevent . dtstart . nil?
56+ dtstart = calevent . dtstart
57+ event . start = dtstart &.to_time
58+ tzid = dtstart . ical_params [ 'tzid' ]
59+ event . timezone = tzid . first . to_s if tzid . present?
60+ end
8861
62+ if calevent . location
8963 event . venue = calevent . location . to_s
9064 if calevent . location . downcase . include? ( 'online' )
9165 event . online = true
9266 event . city = nil
9367 event . postcode = nil
9468 event . country = nil
95- else
96- location = convert_location ( calevent . location )
97- event . city = location [ 'suburb' ] unless location [ 'suburb' ] . nil?
98- event . country = location [ 'country' ] unless location [ 'country' ] . nil?
99- event . postcode = location [ 'postcode' ] unless location [ 'postcode' ] . nil?
10069 end
101- event . keywords = [ ]
102- unless calevent . categories . nil? or calevent . categories . first . nil?
103- cats = calevent . categories . first
104- if cats . is_a? ( Icalendar ::Values ::Array )
105- cats . each do |item |
106- event . keywords << item . to_s . lstrip
107- end
108- else
109- event . keywords << cats . to_s . strip
110- end
111- end
112-
113- # store event
114- @events << event
115- rescue Exception => e
116- @messages << "Process iCalendar failed with: #{ e . message } "
11770 end
11871
119- # finished
120- nil
72+ event . keywords = calevent . categories . flatten . map ( &:strip )
73+
74+ event
12175 end
12276
12377 def process_description ( input )
0 commit comments