From b74352169597c320953e77aac87ee1fe1eccd4dd Mon Sep 17 00:00:00 2001 From: Lyric-c Date: Fri, 11 Aug 2023 14:13:57 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0feed=E6=97=B6=E4=B8=B2?= =?UTF-8?q?=E8=A1=8C=E6=94=B9=E4=B8=BA=E5=B9=B6=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/main.go b/main.go index a22e4e1..62b16a6 100644 --- a/main.go +++ b/main.go @@ -97,29 +97,36 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { } func updateFeeds() { + var ( + tick = time.Tick(time.Duration(rssUrls.ReFresh) * time.Minute) + fp = gofeed.NewParser() + formattedTime = time.Now().Format("2006-01-02 15:04:05") + ) for { for _, url := range rssUrls.Values { - fp := gofeed.NewParser() - feed, err := fp.ParseURL(url) - if err != nil { - log.Printf("Error fetching feed: %v | %v", url, err) - continue - } - currentTime := time.Now() - formattedTime := currentTime.Format("2006-01-02 15:04:05") - feed.Custom = map[string]string{"lastupdate": formattedTime} - - feedJSON, err := json.Marshal(feed) - if err != nil { - log.Printf("Error marshaling feed: %v", err) - continue - } - dbMap.Store(url, string(feedJSON)) + go updateFeed(fp, url, formattedTime) } - time.Sleep(time.Duration(rssUrls.ReFresh) * time.Minute) + <-tick } } +func updateFeed(fp *gofeed.Parser, url, formattedTime string) { + feed, err := fp.ParseURL(url) + if err != nil { + log.Printf("Error fetching feed: %v | %v", url, err) + return + } + + feed.Custom = map[string]string{"lastupdate": formattedTime} + + feedJSON, err := json.Marshal(feed) + if err != nil { + log.Printf("Error marshaling feed: %v", err) + return + } + dbMap.Store(url, string(feedJSON)) +} + func getFeedsHandler(w http.ResponseWriter, r *http.Request) { feeds := make([]gofeed.Feed, 0, len(rssUrls.Values)) From e3250bf686fe44ca687aa11cc35269efb99cb711 Mon Sep 17 00:00:00 2001 From: Lyric-c Date: Fri, 11 Aug 2023 16:13:46 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E5=AD=98?= =?UTF-8?q?=E7=BC=93=E5=AD=98=EF=BC=9B=E7=B2=BE=E7=AE=80=E9=9D=9E=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feed.go | 14 ++++++++++++++ main.go | 58 +++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 50 insertions(+), 22 deletions(-) create mode 100644 feed.go diff --git a/feed.go b/feed.go new file mode 100644 index 0000000..fe48170 --- /dev/null +++ b/feed.go @@ -0,0 +1,14 @@ +package main + +type feed struct { + Title string `json:"title,omitempty"` + Link string `json:"link"` + Custom map[string]string `json:"custom,omitempty"` + Items []item `json:"items,omitempty"` +} + +type item struct { + Title string `json:"title"` + Link string `json:"link"` + Description string `json:"description"` +} diff --git a/main.go b/main.go index 62b16a6..9c5ca5f 100644 --- a/main.go +++ b/main.go @@ -20,9 +20,10 @@ type Config struct { } var ( - dbMap sync.Map + dbMap map[string]feed rssUrls Config upgrader = websocket.Upgrader{} + lock sync.RWMutex //go:embed static dirStatic embed.FS @@ -48,6 +49,8 @@ func init() { if err != nil { panic(err) } + + dbMap = make(map[string]feed) } func main() { @@ -73,15 +76,24 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { log.Printf("Upgrade failed: %v", err) return } + defer conn.Close() for { for _, url := range rssUrls.Values { - feedJSON, ok := dbMap.Load(url) + lock.RLock() + cache, ok := dbMap[url] + lock.RUnlock() if !ok { log.Printf("Error getting feed from db is null %v", url) continue } - err = conn.WriteMessage(websocket.TextMessage, []byte(feedJSON.(string))) + data, err := json.Marshal(cache) + if err != nil { + log.Printf("json marshal failure: %s", err.Error()) + continue + } + + err = conn.WriteMessage(websocket.TextMessage, data) //错误直接关闭更新 if err != nil { log.Printf("Error sending message or Connection closed: %v", err) @@ -111,39 +123,41 @@ func updateFeeds() { } func updateFeed(fp *gofeed.Parser, url, formattedTime string) { - feed, err := fp.ParseURL(url) + result, err := fp.ParseURL(url) if err != nil { log.Printf("Error fetching feed: %v | %v", url, err) return } - - feed.Custom = map[string]string{"lastupdate": formattedTime} - - feedJSON, err := json.Marshal(feed) - if err != nil { - log.Printf("Error marshaling feed: %v", err) - return + customFeed := feed{ + Title: result.Title, + Link: result.Link, + Custom: map[string]string{"lastupdate": formattedTime}, + Items: make([]item, 0, len(result.Items)), } - dbMap.Store(url, string(feedJSON)) + for _, v := range result.Items { + customFeed.Items = append(customFeed.Items, item{ + Link: v.Link, + Title: v.Title, + Description: v.Description, + }) + } + lock.Lock() + defer lock.Unlock() + dbMap[url] = customFeed } func getFeedsHandler(w http.ResponseWriter, r *http.Request) { - - feeds := make([]gofeed.Feed, 0, len(rssUrls.Values)) + feeds := make([]feed, 0, len(rssUrls.Values)) for _, url := range rssUrls.Values { - feedJSON, ok := dbMap.Load(url) + lock.RLock() + cache, ok := dbMap[url] + lock.RUnlock() if !ok { log.Printf("Error getting feed from db is null %v", url) continue } - var feed gofeed.Feed - if err := json.Unmarshal([]byte(feedJSON.(string)), &feed); err != nil { - log.Printf("Error unmarshaling feed: %v", err) - continue - } - - feeds = append(feeds, feed) + feeds = append(feeds, cache) } w.Header().Set("Content-Type", "application/json") From c8583357cf19742418ec3fb8e2c177d60b956d98 Mon Sep 17 00:00:00 2001 From: Lyric-c Date: Fri, 18 Aug 2023 10:22:04 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 9c5ca5f..ce74756 100644 --- a/main.go +++ b/main.go @@ -110,11 +110,11 @@ func wsHandler(w http.ResponseWriter, r *http.Request) { func updateFeeds() { var ( - tick = time.Tick(time.Duration(rssUrls.ReFresh) * time.Minute) - fp = gofeed.NewParser() - formattedTime = time.Now().Format("2006-01-02 15:04:05") + tick = time.Tick(time.Duration(rssUrls.ReFresh) * time.Minute) + fp = gofeed.NewParser() ) for { + formattedTime := time.Now().Format("2006-01-02 15:04:05") for _, url := range rssUrls.Values { go updateFeed(fp, url, formattedTime) } From 57ec9939ab67a4cc89d992dbdf53e19375d453ff Mon Sep 17 00:00:00 2001 From: Lyric-c Date: Fri, 18 Aug 2023 10:28:52 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feed=E5=86=85=E5=AE=B9=E6=97=A0=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=97=B6=E6=97=A0=E9=9C=80=E6=9B=B4=E6=96=B0=E7=BC=93?= =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index ce74756..d162f6b 100644 --- a/main.go +++ b/main.go @@ -128,6 +128,13 @@ func updateFeed(fp *gofeed.Parser, url, formattedTime string) { log.Printf("Error fetching feed: %v | %v", url, err) return } + //feed内容无更新时无需更新缓存 + if cache, ok := dbMap[url]; ok && + len(result.Items) > 0 && + len(cache.Items) > 0 && + result.Items[0].Link == cache.Items[0].Link { + return + } customFeed := feed{ Title: result.Title, Link: result.Link, @@ -136,8 +143,8 @@ func updateFeed(fp *gofeed.Parser, url, formattedTime string) { } for _, v := range result.Items { customFeed.Items = append(customFeed.Items, item{ - Link: v.Link, - Title: v.Title, + Link: v.Link, + Title: v.Title, Description: v.Description, }) }