@@ -28,40 +28,35 @@ def read(url)
2828 private
2929
3030 def process_surf ( url )
31- Hash . from_xml ( Nokogiri ::XML ( open_url ( url , raise : true ) ) . to_s ) [ 'urlset' ] [ 'url' ] . each do |event_page |
32- next unless event_page [ 'loc' ] . include? ( '/en/agenda/' )
31+ ical_surf_url = "https://www.surf.nl/ical/surf-agenda.ics"
32+ ical_events = Icalendar ::Event . parse ( open_url ( ical_surf_url , raise : true ) . set_encoding ( 'utf-8' ) )
33+ events = { }
34+ ical_events . each do |ical_event |
35+ title = ical_event . summary . to_s
36+ events [ title ] ||= OpenStruct . new
37+ events [ title ] . title = title
38+ events [ title ] . url = "https://www.surf.nl/agenda##{ title . parameterize ( separator : '_' ) } "
39+ events [ title ] . description ||= ical_event . description . to_s
40+ my_start = Time . zone . parse ( ical_event . dtstart . strftime ( '%a, %d %b %Y %H:%M:%S' ) )
41+ my_end = Time . zone . parse ( ical_event . dtend . strftime ( '%a, %d %b %Y %H:%M:%S' ) )
42+ events [ title ] . start ||= my_start
43+ events [ title ] . end ||= my_end
44+ events [ title ] . set_default_times
45+ events [ title ] . venue ||= ical_event . location
46+ events [ title ] . source ||= 'SURF'
47+ events [ title ] . timezone ||= 'Amsterdam'
3348
34- sleep ( 1 ) unless Rails . env . test? and File . exist? ( 'test/vcr_cassettes/ingestors/surf.yml' )
35- data_json = Nokogiri ::HTML5 . parse ( open_url ( event_page [ 'loc' ] , raise : false ) ) &.css ( 'script[type="application/ld+json"]' )
36- next unless data_json . present? && data_json . length > 0
37-
38- data = JSON . parse ( data_json . first . text )
39- begin
40- # create new event
41- event = OpenStruct . new
42-
43- # extract event details from
44- attr = data [ '@graph' ] . first
45- event . title = convert_title attr [ 'name' ]
46- event . url = attr [ 'url' ] &.strip
47- event . description = convert_description attr [ 'description' ]
48- event . start = attr [ 'startDate' ]
49- event . end = attr [ 'endDate' ]
50- event . set_default_times
51- event . venue = if attr [ 'location' ] . is_a? ( Array )
52- attr [ 'location' ] . join ( ' - ' )
53- else
54- attr [ 'location' ]
55- end
56- event . source = 'SURF'
57- event . online = true
58- event . timezone = 'Amsterdam'
59-
60- # add event to events array
61- add_event ( event )
62- rescue Exception => e
63- @messages << "Extract event fields failed with: #{ e . message } "
64- end
49+ events [ title ] . start = [ my_start , events [ title ] . start ] . min
50+ events [ title ] . end = [ my_end , events [ title ] . end ] . max
51+ rescue Exception => e
52+ puts e
53+ @messages << "Extract event fields failed with: #{ e . message } "
54+ end
55+ events . values . each do |event |
56+ add_event ( event )
57+ rescue Exception => e
58+ puts e
59+ @messages << "Extract event fields failed with: #{ e . message } "
6560 end
6661 end
6762 end
0 commit comments