From 9a43b69b4b6e57028ed4ae5cfdd548e43d14fc68 Mon Sep 17 00:00:00 2001 From: primal Date: Wed, 28 Jan 2026 21:03:10 -0500 Subject: [PATCH] Add profile refresh on startup to backfill feed URLs Updates existing account profiles with the feed URL on startup. This ensures all accounts have the source feed URL in their profile description. Co-Authored-By: Claude Opus 4.5 --- crawler.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/crawler.go b/crawler.go index 9f948a6..ad6f457 100644 --- a/crawler.go +++ b/crawler.go @@ -156,6 +156,9 @@ func (c *Crawler) StartPublishLoop() { sessions := make(map[string]*PDSSession) publisher := NewPublisher(pdsHost) + // Refresh existing account profiles on startup + c.RefreshAllProfiles(publisher, feedPassword) + for { // Get up to 50 unpublished items from approved feeds, sorted by discovered_at ASC items, err := c.GetAllUnpublishedItems(50) @@ -291,6 +294,62 @@ func (c *Crawler) getFeedInfo(feedURL string) *FeedInfo { } } +// RefreshAllProfiles updates profiles for all existing accounts with feed URLs +func (c *Crawler) RefreshAllProfiles(publisher *Publisher, feedPassword string) { + rows, err := c.db.Query(` + SELECT url, title, description, publish_account + FROM feeds + WHERE publish_account IS NOT NULL AND publish_account <> '' + `) + if err != nil { + fmt.Printf("RefreshProfiles: query error: %v\n", err) + return + } + defer rows.Close() + + for rows.Next() { + var feedURL, account string + var title, description *string + if err := rows.Scan(&feedURL, &title, &description, &account); err != nil { + continue + } + + // Login to account + session, err := publisher.CreateSession(account, feedPassword) + if err != nil { + fmt.Printf("RefreshProfiles: login failed for %s: %v\n", account, err) + continue + } + + // Build profile + displayName := StringValue(title) + if displayName == "" { + displayName = account + } + desc := StringValue(description) + if desc == "" { + desc = "News feed via 1440.news" + } + // Add feed URL + feedURLFull := "https://" + feedURL + desc = desc + "\n\n" + feedURLFull + + // Truncate if needed + if len(displayName) > 64 { + displayName = displayName[:61] + "..." + } + if len(desc) > 256 { + desc = desc[:253] + "..." + } + + if err := publisher.UpdateProfile(session, displayName, desc, nil); err != nil { + fmt.Printf("RefreshProfiles: update failed for %s: %v\n", account, err) + } else { + fmt.Printf("RefreshProfiles: updated %s\n", account) + } + } +} + // GetAllUnpublishedItems returns unpublished items from all approved feeds func (c *Crawler) GetAllUnpublishedItems(limit int) ([]Item, error) { rows, err := c.db.Query(`