buch_des_monats/src/bdm.go

139 lines
2.8 KiB
Go

package main
import (
"fmt"
"html/template"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"regexp"
)
type Item struct {
ISBN string
Filename string
}
func (i Item) ImageURL() string {
return "https://medien.ubitweb.de/bildzentrale_original/" +
i.ISBN[0:3] + "/" +
i.ISBN[3:6] + "/" +
i.ISBN[6:9] + "/" +
i.ISBN[9:13] +
".jpg"
}
func (i Item) targetFilename() string {
return "covers/" + i.ISBN + ".jpg"
}
func (i Item) downloadCover() error {
resp, err := http.Get(i.ImageURL())
if err != nil {
return err
}
defer resp.Body.Close()
out, err := os.Create(i.targetFilename())
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, resp.Body)
return err
}
func getItems(filename string) []Item {
var items []Item
// Get all book URLS
url := "https://git.okoyono.de/mezzo/buch_des_monats/raw/branch/master/" + filename
resp, err := http.Get(url)
if err != nil {
log.Fatal(filename + " is missing")
}
defer resp.Body.Close()
content, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Can not download the file. Network problem?")
}
re := regexp.MustCompile(`[0-9]{13}`)
matches := re.FindAllString(string(content), -1)
for _, isbn := range matches {
items = append(items, Item{ISBN: isbn, Filename: filename})
}
return items
}
func getHTML(filename string, w http.ResponseWriter) {
// Get all items from the git repo
items := getItems(filename)
// Generate the restulting HTML
t, err := template.ParseFiles("templates/" + filename + ".html")
if err != nil {
panic(err)
}
err = t.Execute(w, items)
if err != nil {
panic(err)
}
}
func main() {
// All static files (CSS, JS)
fileServer := http.FileServer(http.Dir("./static"))
http.Handle("/static/", http.StripPrefix("/static", fileServer))
// Cover images
imageServer := http.FileServer(http.Dir("./covers/"))
http.Handle("/covers/", http.StripPrefix("/covers", imageServer))
// Update "Hook" /update?filename=COMIC.mkd
http.HandleFunc("/update", func(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("filename")
log.Printf("Update hook triggered for %v", filename)
// Get all items from the git repo
items := getItems(filename)
for _, item := range items {
fmt.Printf("Downloading %v ...\n", item.ImageURL())
err := item.downloadCover()
if err != nil {
fmt.Printf("ERROR: File %s not found\n", item.ImageURL())
}
}
})
http.HandleFunc("/book", func(w http.ResponseWriter, r *http.Request) {
log.Print("/book")
getHTML("BOOK.mkd", w)
})
http.HandleFunc("/comic", func(w http.ResponseWriter, r *http.Request) {
log.Print("/comic")
getHTML("COMIC.mkd", w)
})
// Spawn the webserver (blocking)
log.Print("Spawn webserver on port :9783 and waiting for requests ...")
err := http.ListenAndServe(":9783", nil)
if err != nil {
panic(err)
}
}