2024-08-03 20:05:08 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/pelletier/go-toml/v2"
|
|
|
|
"os"
|
|
|
|
"io/ioutil"
|
|
|
|
"sync"
|
|
|
|
"log"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type GenericError struct { msg string }
|
|
|
|
func (e *GenericError) Error() string { return e.msg }
|
|
|
|
|
2024-08-15 02:53:02 +02:00
|
|
|
type MPVPair struct {
|
|
|
|
Option string `toml:"option"`
|
|
|
|
Value string `toml:"value"`
|
|
|
|
}
|
|
|
|
|
2024-08-03 20:05:08 +02:00
|
|
|
type PodcastConfig struct {
|
|
|
|
Name string `toml:"name"`
|
|
|
|
URL string `toml:"url"`
|
|
|
|
UseAuth bool
|
|
|
|
User string `toml:"user"`
|
|
|
|
Pass string `toml:"pass"`
|
|
|
|
Convert string `toml:"convert"`
|
2024-08-15 02:53:02 +02:00
|
|
|
FilterType string `toml:"filter-type"`
|
|
|
|
FilterDirAsc bool `toml:"filter-direction-asc"`
|
|
|
|
FilterLimit uint `toml:"filter-limit"`
|
|
|
|
MPVOptions []MPVPair `toml:"mpv-options"`
|
2024-08-03 20:05:08 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
type ServerConfig struct {
|
|
|
|
MediaProxyBaseURL string `toml:"media-proxy-base-url"`
|
|
|
|
Port int `toml:"port"`
|
|
|
|
Feeds []PodcastConfig `toml:"podcasts"`
|
|
|
|
FileRoot string `toml:"file-root"`
|
|
|
|
UpdateTimeout uint `toml:"update-timeout"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *ServerConfig) Load(path string) error {
|
|
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
file, err := os.Open(path)
|
|
|
|
if err!=nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
content, err := ioutil.ReadAll(file)
|
|
|
|
if err!=nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := toml.Unmarshal(content, cfg); err!=nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
for _, feed := range cfg.Feeds {
|
|
|
|
if strings.Contains(feed.Name, "/") {
|
|
|
|
log.Fatal("invalid feed name contains '/': "+feed.Name)
|
|
|
|
}
|
|
|
|
if feed.User!="" && feed.Pass!="" {
|
|
|
|
feed.UseAuth = true
|
|
|
|
} else {
|
|
|
|
feed.UseAuth = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type FeedCacheEntry struct {
|
|
|
|
Mutex sync.Mutex
|
|
|
|
Text string
|
|
|
|
}
|
|
|
|
|
|
|
|
type FeedCacheS struct {
|
|
|
|
Texts map[string]string
|
|
|
|
sync.Mutex
|
|
|
|
}
|
|
|
|
|
|
|
|
type ServerContext struct {
|
|
|
|
Config ServerConfig
|
|
|
|
WG sync.WaitGroup
|
|
|
|
IsActive bool
|
|
|
|
FeedCache FeedCacheS
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ctx *ServerContext) LoadConfig(path string) error {
|
|
|
|
ctx.FeedCache.Texts = make(map[string]string)
|
|
|
|
return ctx.Config.Load(path);
|
|
|
|
}
|