diff options
Diffstat (limited to 'feldküche.go')
-rw-r--r-- | feldküche.go | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/feldküche.go b/feldküche.go new file mode 100644 index 0000000..ea2a005 --- /dev/null +++ b/feldküche.go @@ -0,0 +1,101 @@ +package main + +import ( + "encoding/xml" + "net/http" + "os" + "strconv" + "text/template" + "strings" + "path/filepath" + img "image" +) + +type Enclosure struct { + Url string `xml:"url,attr"` +} + +func (e *Enclosure) BaseName() string { + index := strings.LastIndex(e.Url, "/") + + if index == -1 { + return "" + } + + return e.Url[index+1:] +} + +func (e *Enclosure) ImageSize() (img.Point) { + filename := "./enclosures" + e.BaseName() + + f, err := os.Open(filename) + + if err != nil { + return img.Point{} + } + + i, _, err := img.Decode(f) + + if err != nil { + return img.Point{} + } + + return i.Bounds().Max +} + +type Item struct { + XMLName xml.Name `xml:"item"` + Enclosure Enclosure `xml:"enclosure"` + Title string `xml:"title"` + Description string `xml:"description"` + PubDate string `xml:"pubDate"` + Link string `xml:"link"` +} + +type Channel struct { + Items []Item `xml:"item"` +} + +type Rss struct { + XMLName xml.Name `xml:"rss"` + Channel Channel `xml:"channel"` +} + +var rss Rss + +func index(w http.ResponseWriter, r *http.Request) { + t, _ := template.ParseFiles("./html/feldküche.html") + t.Execute(w, nil) +} + +func posts(w http.ResponseWriter, r *http.Request) { + offset, _ := strconv.Atoi(r.URL.Path[len("/posts/"):]) + t, _ := template.ParseFiles("./html/feldküche_posts.html") + p := rss.Channel.Items[offset*10 : offset*10+10] + t.Execute(w, p) +} + +func image(w http.ResponseWriter, r *http.Request) { + // TODO: Is this secure? + filename := r.URL.Path[len("/image/"):] + basename := filepath.Base(filepath.Clean(filename)); + + if basename == "." { + return + } + + http.ServeFile(w, r, "./enclosures/" + basename) +} + +func main() { + file, _ := os.Open("backup.rss") + + decoder := xml.NewDecoder(file) + + decoder.Decode(&rss) + + http.HandleFunc("/posts/", posts) + http.HandleFunc("/image/", image) + http.HandleFunc("/", index) + http.ListenAndServe(":8080", nil) +} |