2024-10-24 12:33:37 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-10-24 12:54:47 +02:00
|
|
|
"log"
|
2024-10-24 12:33:37 +02:00
|
|
|
"net/http"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/apognu/gocal"
|
|
|
|
"github.com/gorilla/feeds"
|
|
|
|
)
|
|
|
|
|
|
|
|
func convertICStoRSS(w http.ResponseWriter, r *http.Request) {
|
|
|
|
// Lese die ICS-URL aus dem Query-Parameter
|
|
|
|
icsURL := r.URL.Query().Get("ics")
|
|
|
|
if icsURL == "" {
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Println("[ERROR] Missing 'ics' query parameter")
|
2024-10-24 12:33:37 +02:00
|
|
|
http.Error(w, "Missing 'ics' query parameter", http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Printf("[INFO] Fetching ICS file from URL: %s\n", icsURL)
|
|
|
|
|
2024-10-24 12:33:37 +02:00
|
|
|
// ICS-Datei herunterladen
|
|
|
|
resp, err := http.Get(icsURL)
|
|
|
|
if err != nil {
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Printf("[ERROR] Unable to fetch ICS file: %v\n", err)
|
2024-10-24 12:33:37 +02:00
|
|
|
http.Error(w, "Unable to fetch ICS file", http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Println("[INFO] Parsing ICS file")
|
|
|
|
|
2024-10-24 12:33:37 +02:00
|
|
|
// ICS-Datei parsen
|
|
|
|
parser := gocal.NewParser(resp.Body)
|
|
|
|
parser.Parse()
|
|
|
|
|
|
|
|
// RSS-Feed erstellen
|
|
|
|
feed := &feeds.Feed{
|
|
|
|
Title: "Converted Calendar Feed",
|
|
|
|
Link: &feeds.Link{Href: icsURL},
|
|
|
|
Description: "This is a converted calendar feed",
|
|
|
|
Created: time.Now(),
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, event := range parser.Events {
|
|
|
|
// Dereferenziere event.Start, um den time.Time Wert zu erhalten
|
|
|
|
item := &feeds.Item{
|
|
|
|
Title: event.Summary,
|
|
|
|
Description: event.Description,
|
|
|
|
Link: &feeds.Link{Href: icsURL},
|
|
|
|
Created: *event.Start,
|
|
|
|
}
|
|
|
|
feed.Items = append(feed.Items, item)
|
|
|
|
}
|
|
|
|
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Println("[INFO] Generating RSS feed")
|
|
|
|
|
2024-10-24 12:33:37 +02:00
|
|
|
// RSS als HTTP-Antwort senden
|
|
|
|
rssData, err := feed.ToRss()
|
|
|
|
if err != nil {
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Printf("[ERROR] Unable to generate RSS feed: %v\n", err)
|
2024-10-24 12:33:37 +02:00
|
|
|
http.Error(w, "Unable to generate RSS feed", http.StatusInternalServerError)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
w.Header().Set("Content-Type", "application/rss+xml")
|
|
|
|
w.Write([]byte(rssData))
|
2024-10-24 12:54:47 +02:00
|
|
|
|
|
|
|
log.Println("[INFO] RSS feed successfully generated and sent")
|
2024-10-24 12:33:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
http.HandleFunc("/rss", convertICStoRSS)
|
2024-10-24 12:54:47 +02:00
|
|
|
log.Println("[INFO] Server is running at :8080")
|
|
|
|
|
|
|
|
if err := http.ListenAndServe(":8080", nil); err != nil {
|
|
|
|
log.Fatalf("[FATAL] Server failed to start: %v\n", err)
|
|
|
|
}
|
2024-10-24 12:33:37 +02:00
|
|
|
}
|