drk-impfaktionen: init

This commit is contained in:
Astro 2021-11-12 00:07:28 +01:00
parent d8434f916e
commit 097c0437f2
2 changed files with 94 additions and 0 deletions

View File

@ -34,4 +34,5 @@ in {
kreuzchor-termine = wrapScript "kreuzchor-termine" ./kreuzchor-termine/scrape.rb;
dhmd-veranstaltungen = wrapScript "dhmd-veranstaltungen" ./dhmd-veranstaltungen/scrape.rb;
mkz-programm = wrapScript "mkz-programm" ./mkz-programm/scrape.rb;
drk-impfaktionen = wrapScript "drk-impfaktionen" ./drk-impfaktionen/scrape.rb;
}

View File

@ -0,0 +1,93 @@
#!/usr/bin/env ruby
# coding: utf-8
require 'open-uri'
require 'nokogiri'
require 'erb'
def find_day s
if s =~ /(\d+)\.(\d+)\./
day = $1.to_i
month = $2.to_i
result = Time.now - 3 * 30 * 86400
while result.year < 2100
if result.month == month && result.day == day
return result
end
result += 86400
end
STDERR.puts "Invalid day #{s.inspect}"
nil
else
# STDERR.puts "Cannot parse day #{s.inspect}"
nil
end
end
def fmt_time t
t.strftime "%Y%m%dT%H%M%S"
end
class Event
attr_accessor :start, :stop, :location
def initialize start, stop, location
@start = start
@stop = stop
@location = location
end
end
events = []
day = nil
url = "https://drksachsen.de/impfaktionen.html"
doc = Nokogiri::HTML URI.open(url)
doc.css(".o-accordion__navigation").each do |section|
region = section.css(".o-accordion__title-wrap").text
if region =~ /Dresden/
section.css(".o-media__body").each do |list|
list.children.each do |child|
case child.name
when "p"
day = find_day child.text
when "ul"
child.css("li").each do |item|
if day && item.text =~ /Impf\-?aktion[\s\u00A0]+(.+Dresden),?[\s\u00A0]*(\d+)[:\.]?(\d*)[\s\u00A0]*[\-bis]{1,3}[\s\u00A0]*(\d+)[:\.]?(\d*)/i
start = Time.new day.year, day.month, day.day, $2.to_i, $3.to_i
stop = Time.new day.year, day.month, day.day, $4.to_i, $5.to_i
raise "Stuff is really broken" if start.hour == 0 || stop.hour == 0
events << Event.new(start, stop, $1)
elsif day
STDERR.puts "Text not recognized: #{item.text.inspect}"
else
STDERR.puts "No day!"
end
end
end
end
end
end
end
ical = ERB::new <<~EOF
BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
X-WR-TIMEZONE;VALUE=TEXT:Europe/Berlin
<% events.each_with_index do |ev, i| %>
BEGIN:VEVENT
METHOD:PUBLISH
CLASS:PUBLIC
UID:<%= url %>#<%= i %>
DTSTART:<%= fmt_time ev.start %>
DTEND:<%= fmt_time ev.stop %>
SUMMARY:Vor-Ort-Impfaktion
URL:<%= url %>
LOCATION:<%= ev.location %>
END:VEVENT
<% end %>
END:VCALENDAR
EOF
puts ical.result