neingeist
/
neinomaten
Archived
1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
neinomaten/neinomat-radio-chaotica

116 lines
2.9 KiB
Plaintext

19 years ago
#!/usr/bin/env ruby
19 years ago
$:.unshift('vendor/ruby-mediawiki/lib')
require 'mediawiki/dotfile'
require 'cgi'
require 'date'
require 'erb'
require 'net/http'
#----------------------------------------------------------------------------
# Constants
RFC822 = "%a, %d %b %Y %T %z" # for Date::strftime
require "#{$0}.templates.rb"
#----------------------------------------------------------------------------
# Some helper functions
19 years ago
def parse_template(title, template)
template_re = Regexp.new("\\\{\\\{" + template + "(.*?)\\\}\\\}")
fields = {}
fields_string = @wiki.article(title).text.scan(template_re)[0][0]
19 years ago
19 years ago
inlink = 0
field = ""
fields_string += "|" unless fields_string.match(/\|$/)
fields_string.split(//).each do |c|
if c == "|" && inlink == 0
(key, value) = field.split(/=/)
fields[key] = value
field = ""
else
19 years ago
inlink += 1 if c == "["
inlink -= 1 if c == "]"
field += c
end
end
fields
end
19 years ago
def datum2isodate(datum)
return datum[6..9] + "-" + datum[3..4] + "-" + datum[0..1]
end
def head(url)
uri = URI.parse(url)
Net::HTTP.start(uri.host, uri.port) do |http|
http.head(uri.path)
end
end
#----------------------------------------------------------------------------
# Get episodes from wiki
@wiki = MediaWiki.dotfile(nil,'entropia')
19 years ago
template = "Vorlage:Radio Chaotica-Sendung"
episodes = []
19 years ago
@wiki.article(template).what_links_here.each do |page|
# puts page # DEBUG
19 years ago
if erste_sendung = parse_template(page, template)["erste_sendung"]
episode = {
"title" => page,
18 years ago
"url" => @wiki.full_article_url(page),
"discussion" => @wiki.full_article_url("Diskussion:#{page}"),
"enclosure_url" => parse_template(page, template)["download"],
"date" => Date.today(), # fallback
}
# Get a real date
erste_sendung.gsub!(/\s*um\s*\d+:\d+$/,"")
if erste_sendung !~ /^[0-9]{2}\.[0-9]{2}\.[0-9]{4}.*$/
$stderr.puts "Field '#{erste_sendung}' in #{episode["url"]} looks funny, fall back to today."
else
episode["date"] = Date.parse(datum2isodate(erste_sendung))
end
episode["pubdate"] = episode["date"].strftime(RFC822)
# Get content type and length
head = head(episode["enclosure_url"])
episode["length"] = head["content-length"]
episode["type"] = head["content-type"]
# We just assume that the episode's length is an hour or so
episode["duration"] = "00:59:59"
episodes.push(episode)
19 years ago
end
$stderr.puts "DEBUG: Only crawling one episode"; break
end
# Sort episodes, starting with last
episodes = episodes.sort do |x,y|
y["date"] <=> x["date"]
end
#----------------------------------------------------------------------------
# Generate RSS
items = ""
episodes.each do |episode|
items += ERB.new(TPL_ITEM).result(binding);
19 years ago
end
rss = ERB.new(TPL_RSS).result;
#puts rss #DEBUG
rssfile = File.new("/home/neingeist/public_html/chaotica.xml", "w")
rssfile.puts rss
rssfile.close