yttopodcast: complete service for podcast feed and bouncer
Signed-off-by: HeshamTB <hishaminv@gmail.com>
This commit is contained in:
parent
e6c2f91a84
commit
1fc423d08a
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
cmd/yttopodcast/yttopodcast
|
||||
cmd/yttopodcast/feeds
|
||||
|
114
cmd/yttopodcast/main.go
Normal file
114
cmd/yttopodcast/main.go
Normal file
@ -0,0 +1,114 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"time"
|
||||
|
||||
"gitea.hbanafa.com/hesham/yttopodcast/bouncer"
|
||||
"gitea.hbanafa.com/hesham/yttopodcast/feed"
|
||||
"gitea.hbanafa.com/hesham/yttopodcast/ytlinkprov"
|
||||
)
|
||||
|
||||
var (
|
||||
l log.Logger
|
||||
|
||||
listenAddr = flag.String("addr", "0.0.0.0:8086", "bouncer listen address")
|
||||
fileServAdd = flag.String("fs-addr", "0.0.0.0:8087", "http file server listen address")
|
||||
interval = flag.Int("interval", 30, "update interval for feed in minutes")
|
||||
chan_id = flag.String("id", "", "YouTube channel ID")
|
||||
bounc_url = flag.String("bouncer", "http://localhost:8081/?id=%s", "bouncer url as format string")
|
||||
lang = flag.String("lang", "en", "content language")
|
||||
)
|
||||
|
||||
|
||||
func main() {
|
||||
|
||||
flag.Parse()
|
||||
l = *log.Default()
|
||||
|
||||
if *chan_id == "" {
|
||||
l.Println("no channel id provided")
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
cache, err := ytlinkprov.NewCachedLinkProvider(time.Minute * time.Duration(*interval))
|
||||
if err != nil {
|
||||
l.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
bouncer, err := bouncer.NewBouncerHTTPServer(context.Background(), *listenAddr, cache)
|
||||
if err != nil {
|
||||
l.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// This goro is sleeping until interval or SIGINT
|
||||
// Another one is running the bouncer
|
||||
|
||||
go func() {
|
||||
l.Printf("http bouncer server starting on %s\n", bouncer.Addr)
|
||||
l.Println(bouncer.ListenAndServe())
|
||||
}()
|
||||
|
||||
os.Mkdir("feeds", 0700)
|
||||
|
||||
mux := http.NewServeMux()
|
||||
mux.Handle("GET /", http.FileServer(http.Dir("feeds")))
|
||||
fileServer := http.Server{
|
||||
Addr: *fileServAdd,
|
||||
Handler: mux,
|
||||
ErrorLog: &l,
|
||||
ReadTimeout: time.Second * 20,
|
||||
WriteTimeout: time.Second * 20,
|
||||
}
|
||||
|
||||
go func() {
|
||||
l.Printf("http file server starting on %s\n", fileServer.Addr)
|
||||
l.Println(fileServer.ListenAndServe())
|
||||
}()
|
||||
|
||||
err = genFeed()
|
||||
if err != nil {
|
||||
l.Println(err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
sig := make(chan os.Signal)
|
||||
|
||||
signal.Notify(sig, os.Interrupt, os.Kill)
|
||||
|
||||
l:
|
||||
for {
|
||||
select {
|
||||
case s := <-sig:
|
||||
l.Println("got ", s.String())
|
||||
fileServer.Shutdown(context.Background())
|
||||
bouncer.Shutdown(context.Background())
|
||||
break l
|
||||
case <-time.NewTicker(time.Minute * time.Duration(*interval)).C:
|
||||
l.Println("tick")
|
||||
genFeed()
|
||||
}}
|
||||
|
||||
}
|
||||
|
||||
func genFeed() error {
|
||||
|
||||
l.Println("generating feed")
|
||||
file, err := os.Create("./feeds/f.xml")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
return feed.ConvertYtToRss(file, *chan_id, feed.RSSMetadata{
|
||||
Languge: *lang,
|
||||
BounceURL: *bounc_url,
|
||||
})
|
||||
}
|
Loading…
Reference in New Issue
Block a user