Skip to content

Commit 8c04201

Browse files
authored
Merge pull request #6 from emaele/feature/add-thumbnail-to-posts-#5
Added support for feed items' images and for YouTube Thumbnails
2 parents 48874b7 + cb5acc1 commit 8c04201

7 files changed

Lines changed: 120 additions & 6 deletions

File tree

add.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ func addFeed(writer http.ResponseWriter, request *http.Request) {
3737
return
3838
}
3939

40+
parseYoutubeFeeds(feed)
41+
4042
// parsing the regex
4143
reg, err := regexp.Compile(addRequest.Filter)
4244
if err != nil {
@@ -73,9 +75,10 @@ func addFeed(writer http.ResponseWriter, request *http.Request) {
7375
// fetching and filtering initial elements
7476
filteredItems := make([]*gofeed.Item, 0, len(feed.Items))
7577

76-
for _, itm := range feed.Items {
78+
for index, itm := range feed.Items {
79+
7780
if reg.MatchString(itm.Title) {
78-
filteredItems = append(filteredItems, itm)
81+
filteredItems = append(filteredItems, feed.Items[index])
7982
}
8083
}
8184

db.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func addItems(feedID int64, items []*gofeed.Item, markAsSent bool) {
6767
Feed: feedID,
6868
}
6969

70+
if feedelement.Image != nil {
71+
element.ImageURL = feedelement.Image.URL
72+
}
73+
7074
err := db.Where(entities.RssItem{URL: element.URL}).FirstOrCreate(&element).Error
7175
if err != nil {
7276
log.Printf("there was an error adding %s, %v", element.Title, err)

entities/entities.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type RssItem struct {
1717
URL string `json:"URL" gorm:"not null,unique"`
1818
Sent bool `json:"-"`
1919
Feed int64 `json:"-" gorm:"not null"`
20+
ImageURL string `json:"-"`
2021
}
2122

2223
// RssFeed represents a rss feed

fetch.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ func fetchElements() {
3030
continue
3131
}
3232

33+
parseYoutubeFeeds(feed)
34+
3335
// filtering elements
3436
reg := regexp.MustCompile(f.Filter)
3537

notify.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func notificationRoutine() {
1919

2020
_, err = bot.Send(message)
2121
if err != nil {
22-
log.Printf("Send to Telegram failed due to: %v", err)
22+
log.Printf("Send \"%s\" to Telegram failed due to: %v", message.Text, err)
2323
continue
2424
}
2525

utility.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,27 @@ func createTelegramKeyboard(URL string) tg.InlineKeyboardMarkup {
3434
func createTelegramMessage(element entities.RssItem) tg.MessageConfig {
3535

3636
feedTitle := retrieveFeedTitle(element.Feed)
37-
tgMarkdownReservedChars := []string{".", "-", "(", ")", "#", "!", "|"}
3837

39-
text := fmt.Sprintf("*%s*\n\n%s", feedTitle, element.Title)
38+
if feedTitle == "" {
39+
feedTitle = "New Feed!"
40+
}
41+
42+
tgMarkdownReservedChars := []string{".", "-", "(", ")", "#", "!", "|", "[", "]", "_", "*", "`", "~"}
43+
44+
var text string
45+
46+
// Pre-parsing our elements for markdown Reserved Chars
4047
for _, char := range tgMarkdownReservedChars {
41-
text = strings.ReplaceAll(text, char, fmt.Sprintf(`\%s`, char))
48+
element.Title = strings.ReplaceAll(element.Title, char, fmt.Sprintf(`\%s`, char))
49+
element.ImageURL = strings.ReplaceAll(element.ImageURL, char, fmt.Sprintf(`\%s`, char))
50+
feedTitle = strings.ReplaceAll(feedTitle, char, fmt.Sprintf(`\%s`, char))
51+
}
52+
53+
// Creating the message with pre-parsed items
54+
if element.ImageURL != "" {
55+
text = fmt.Sprintf("📣 *%s*\n\n[➡️](%s) %s", feedTitle, element.ImageURL, element.Title)
56+
} else {
57+
text = fmt.Sprintf("📣 *%s*\n\n➡️ %s", feedTitle, element.Title)
4258
}
4359

4460
message := tg.NewMessage(telegramChatID, text)

youtube.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/url"
6+
"strings"
7+
8+
"github.com/mmcdole/gofeed"
9+
)
10+
11+
func parseYoutubeFeeds(feed *gofeed.Feed) {
12+
13+
parsedUrl, err := url.Parse(feed.Link)
14+
if err != nil {
15+
log.Printf("Error parsing URL due to: %v", err)
16+
return
17+
}
18+
19+
// I trim the prefix www. because I don't know if youtube will use always the www. CNAME
20+
if strings.TrimPrefix(parsedUrl.Hostname(), "www.") != "youtube.com" {
21+
return
22+
}
23+
24+
for index := range feed.Items {
25+
addThumbnailToYoutubeItems(feed.Items[index])
26+
}
27+
}
28+
29+
func addThumbnailToYoutubeItems(item *gofeed.Item) {
30+
31+
// If I already have an image, I don't add it
32+
if item.Image != nil && item.Image.URL != "" {
33+
return
34+
}
35+
36+
var url string
37+
38+
// Checking if there are Extensions since it's there that I have the thumbnail
39+
if item.Extensions == nil {
40+
return
41+
}
42+
43+
// Checking media -> group, then since I have multiple []Extensions I use for and map access to retrieve (finally) the thumbnail
44+
media, ok := item.Extensions["media"]
45+
if !ok {
46+
return
47+
}
48+
49+
group, ok := media["group"]
50+
if !ok {
51+
return
52+
}
53+
54+
for _, groupElem := range group {
55+
if groupElem.Name != "group" {
56+
continue
57+
}
58+
59+
if groupElem.Children == nil {
60+
continue
61+
}
62+
63+
thumbnail, ok := groupElem.Children["thumbnail"]
64+
if !ok {
65+
continue
66+
}
67+
68+
for _, thumbElem := range thumbnail {
69+
if thumbElem.Name != "thumbnail" {
70+
continue
71+
}
72+
73+
if thumbElem.Attrs == nil {
74+
continue
75+
}
76+
77+
url = thumbElem.Attrs["url"]
78+
}
79+
}
80+
81+
// When finally I have an URL, I add the Image directly into the feed
82+
83+
item.Image = &gofeed.Image{
84+
URL: url,
85+
Title: "thumbnail",
86+
}
87+
88+
}

0 commit comments

Comments
 (0)