mirror of
https://github.com/mxpv/podsync.git
synced 2024-05-11 05:55:04 +00:00
Add debug logging and a few minor fixes
This commit is contained in:
@@ -15,8 +15,8 @@ import (
|
||||
)
|
||||
|
||||
type Opts struct {
|
||||
Config string `long:"config" short:"c" default:"config.toml"`
|
||||
Debug bool `long:"debug" short:"d"`
|
||||
ConfigPath string `long:"config" short:"c" default:"config.toml" env:"PODSYNC_CONFIG_PATH"`
|
||||
Debug bool `long:"debug"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
@@ -42,8 +42,8 @@ func main() {
|
||||
}
|
||||
|
||||
// Load TOML file
|
||||
log.Debugf("loading configuration %q", opts.Config)
|
||||
cfg, err := config.LoadConfig(opts.Config)
|
||||
log.Debugf("loading configuration %q", opts.ConfigPath)
|
||||
cfg, err := config.LoadConfig(opts.ConfigPath)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("failed to load configuration file")
|
||||
}
|
||||
@@ -53,6 +53,7 @@ func main() {
|
||||
defer close(updates)
|
||||
|
||||
// Run updater thread
|
||||
log.Debug("creating updater")
|
||||
updater, err := NewUpdater(cfg)
|
||||
if err != nil {
|
||||
log.WithError(err).Fatal("failed to create updater")
|
||||
@@ -75,12 +76,18 @@ func main() {
|
||||
for _, feed := range cfg.Feeds {
|
||||
_feed := feed
|
||||
group.Go(func() error {
|
||||
log.Debugf("-> %s (update every %s)", _feed.URL, _feed.UpdatePeriod)
|
||||
|
||||
// Perform initial update after CLI restart
|
||||
updates <- _feed
|
||||
|
||||
timer := time.NewTicker(_feed.UpdatePeriod.Duration)
|
||||
defer timer.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-timer.C:
|
||||
log.Debugf("adding %q to update queue", _feed.URL)
|
||||
updates <- _feed
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
|
||||
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
itunes "github.com/mxpv/podcast"
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/mxpv/podsync/pkg/builder"
|
||||
"github.com/mxpv/podsync/pkg/config"
|
||||
@@ -25,38 +26,53 @@ func NewUpdater(config *config.Config) (*Updater, error) {
|
||||
return &Updater{config: config}, nil
|
||||
}
|
||||
|
||||
func (u *Updater) Update(ctx context.Context, feed *config.Feed) error {
|
||||
func (u *Updater) Update(ctx context.Context, cfg *config.Feed) error {
|
||||
log.WithFields(log.Fields{
|
||||
"id": cfg.ID,
|
||||
"format": cfg.Format,
|
||||
"quality": cfg.Quality,
|
||||
}).Infof("-> updating %s", cfg.URL)
|
||||
started := time.Now()
|
||||
|
||||
// Create an updater for this feed type
|
||||
provider, err := u.makeBuilder(ctx, feed)
|
||||
provider, err := u.makeBuilder(ctx, cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Query API to get episodes
|
||||
result, err := provider.Build(ctx, feed)
|
||||
log.Debug("building feed")
|
||||
result, err := provider.Build(ctx, cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Debugf("received %d episode(s) for %q", len(result.Episodes), result.Title)
|
||||
|
||||
// Build iTunes XML feed with data received from builder
|
||||
podcast, err := u.buildPodcast(result)
|
||||
log.Debug("building iTunes podcast feed")
|
||||
podcast, err := u.buildPodcast(result, cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Save XML to disk
|
||||
xmlName := fmt.Sprintf("%s.xml", result.ItemID)
|
||||
xmlName := fmt.Sprintf("%s.xml", cfg.ID)
|
||||
xmlPath := filepath.Join(u.config.Server.DataDir, xmlName)
|
||||
log.Debugf("saving feed XML file to %s", xmlPath)
|
||||
if err := ioutil.WriteFile(xmlPath, []byte(podcast.String()), 0600); err != nil {
|
||||
return errors.Wrapf(err, "failed to write XML feed to disk")
|
||||
}
|
||||
|
||||
elapsed := time.Since(started)
|
||||
nextUpdate := time.Now().Add(cfg.UpdatePeriod.Duration)
|
||||
log.Infof("successfully updated feed in %s, next update at %s", elapsed, nextUpdate.Format(time.Kitchen))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (u *Updater) buildPodcast(feed *model.Feed) (*itunes.Podcast, error) {
|
||||
func (u *Updater) buildPodcast(feed *model.Feed, cfg *config.Feed) (*itunes.Podcast, error) {
|
||||
const (
|
||||
podsyncGenerator = "Podsync generator"
|
||||
podsyncGenerator = "Podsync generator (support us at https://github.com/mxpv/podsync)"
|
||||
defaultCategory = "TV & Film"
|
||||
)
|
||||
|
||||
@@ -100,7 +116,7 @@ func (u *Updater) buildPodcast(feed *model.Feed) (*itunes.Podcast, error) {
|
||||
item.AddSummary(episode.Description)
|
||||
item.AddImage(episode.Thumbnail)
|
||||
item.AddDuration(episode.Duration)
|
||||
item.AddEnclosure(u.makeEnclosure(feed, episode))
|
||||
item.AddEnclosure(u.makeEnclosure(feed, episode, cfg))
|
||||
|
||||
// p.AddItem requires description to be not empty, use workaround
|
||||
if item.Description == "" {
|
||||
@@ -122,7 +138,7 @@ func (u *Updater) buildPodcast(feed *model.Feed) (*itunes.Podcast, error) {
|
||||
return &p, nil
|
||||
}
|
||||
|
||||
func (u *Updater) makeEnclosure(feed *model.Feed, episode *model.Episode) (string, itunes.EnclosureType, int64) {
|
||||
func (u *Updater) makeEnclosure(feed *model.Feed, episode *model.Episode, cfg *config.Feed) (string, itunes.EnclosureType, int64) {
|
||||
ext := "mp4"
|
||||
contentType := itunes.MP4
|
||||
if feed.Format == model.FormatAudio {
|
||||
@@ -130,17 +146,17 @@ func (u *Updater) makeEnclosure(feed *model.Feed, episode *model.Episode) (strin
|
||||
contentType = itunes.M4A
|
||||
}
|
||||
|
||||
url := fmt.Sprintf("%s/%s/%s.%s", u.config.Server.Hostname, feed.ItemID, episode.ID, ext)
|
||||
url := fmt.Sprintf("%s/%s/%s.%s", u.config.Server.Hostname, cfg.ID, episode.ID, ext)
|
||||
return url, contentType, episode.Size
|
||||
}
|
||||
|
||||
func (u *Updater) makeBuilder(ctx context.Context, feed *config.Feed) (builder.Builder, error) {
|
||||
func (u *Updater) makeBuilder(ctx context.Context, cfg *config.Feed) (builder.Builder, error) {
|
||||
var (
|
||||
provider builder.Builder
|
||||
err error
|
||||
)
|
||||
|
||||
info, err := link.Parse(feed.URL)
|
||||
info, err := link.Parse(cfg.URL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
|
||||
// Feed is a configuration for a feed
|
||||
type Feed struct {
|
||||
ID string `toml:"-"`
|
||||
// URL is a full URL of the field
|
||||
URL string `toml:"url"`
|
||||
// PageSize is the number of pages to query from YouTube API.
|
||||
@@ -67,6 +68,10 @@ func LoadConfig(path string) (*Config, error) {
|
||||
return nil, errors.Wrap(err, "failed to load config file")
|
||||
}
|
||||
|
||||
for id, feed := range config.Feeds {
|
||||
feed.ID = id
|
||||
}
|
||||
|
||||
config.applyDefaults()
|
||||
|
||||
if err := config.validate(); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user