package main
import (
"flag"
"fmt"
"log/slog"
"net/http"
"os"
"time"
"github.com/gorilla/feeds"
)
func main() {
configFile := flag.String("config", "config.yaml", "Path to config file")
flag.Parse()
config, err := loadConfig(*configFile)
if err != nil {
slog.Error("failed to load config", "err", err)
os.Exit(1)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
episodes, err := fetchNewEpisodes(config)
if err != nil {
slog.Error("failed to fetch episodes", "err", err)
os.Exit(1)
}
rssFeed := generateRSS(episodes)
w.Header().Set("Content-Type", "application/rss+xml")
w.Write([]byte(rssFeed))
})
slog.Info("server starting", "port", config.Port)
http.ListenAndServe(":"+config.Port, nil)
}
func generateRSS(episodes []TMDBEpisode) string {
feed := &feeds.Feed{
Title: "moviefeed",
Link: &feeds.Link{Href: "http://localhost"},
Description: "Latest episodes from followed shows",
Created: time.Now(),
}
for _, ep := range episodes {
airDate, _ := time.Parse("2006-01-02", ep.AirDate)
feed.Items = append(feed.Items, &feeds.Item{
Id: fmt.Sprintf("%s-%d-%d", ep.ShowID, ep.SeasonNumber, ep.EpisodeNumber),
Title: fmt.Sprintf(
"%s S%dE%d: %s",
ep.ShowName,
ep.SeasonNumber,
ep.EpisodeNumber,
ep.Name,
),
Link: &feeds.Link{
Href: fmt.Sprintf("https://www.themoviedb.org/tv/episode/%d", ep.ID),
},
Description: ep.Overview,
Created: airDate,
})
}
rss, err := feed.ToRss()
if err != nil {
slog.Error("error generating RSS", "err", err)
return ""
}
return rss
}
|