From 76170188111e2887bc81e38e08929d9ad6f1be3b Mon Sep 17 00:00:00 2001 From: Maksym Pavlenko Date: Wed, 30 Oct 2019 00:13:02 -0700 Subject: [PATCH] Add debug logging and a few minor fixes --- cmd/podsync/main.go | 15 +++++++++++---- cmd/podsync/updater.go | 40 ++++++++++++++++++++++++++++------------ pkg/config/config.go | 5 +++++ 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/cmd/podsync/main.go b/cmd/podsync/main.go index b3c3f9e..69c9667 100644 --- a/cmd/podsync/main.go +++ b/cmd/podsync/main.go @@ -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() diff --git a/cmd/podsync/updater.go b/cmd/podsync/updater.go index ecadabc..247578f 100644 --- a/cmd/podsync/updater.go +++ b/cmd/podsync/updater.go @@ -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 } diff --git a/pkg/config/config.go b/pkg/config/config.go index d6de94f..0fb8ff5 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -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 {