Compare commits
7 Commits
Author | SHA1 | Date |
---|---|---|
|
6f29ac4b03 | |
|
5e0a725deb | |
|
baf36dbaf8 | |
|
64190a500d | |
|
dcbf937d38 | |
|
08c92ca74d | |
|
d0929f5b01 |
|
@ -1 +1,4 @@
|
|||
nlink.conf
|
||||
nlink.db
|
||||
nlink
|
||||
nlink.exe
|
||||
|
|
40
main.go
40
main.go
|
@ -2,7 +2,6 @@ package main
|
|||
|
||||
import (
|
||||
"flag"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -99,6 +98,15 @@ func splitFeeds() []string {
|
|||
return feeds
|
||||
}
|
||||
|
||||
func fetchLoop(feeds []string, db *nomad.DB) {
|
||||
for _, feed := range feeds {
|
||||
log.Infof("fetching items for feed %s", feed)
|
||||
if err := fetchItems(db, feed, false); err != nil {
|
||||
log.Errln(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
var (
|
||||
configFile string
|
||||
|
@ -106,12 +114,14 @@ func main() {
|
|||
initDB bool
|
||||
level string
|
||||
markOnly bool
|
||||
singleRun bool
|
||||
)
|
||||
|
||||
flag.StringVar(&configFile, "f", defaultPath("nlink.conf"), "`path` to config file")
|
||||
flag.BoolVar(&initDB, "i", false, "initialize a new DB")
|
||||
flag.StringVar(&level, "l", "DEBUG", "log level")
|
||||
flag.BoolVar(&markOnly, "m", false, "only mark posts as having been posted")
|
||||
flag.BoolVar(&singleRun, "s", false, "only go through a single run")
|
||||
flag.DurationVar(&interval, "t", defaultInterval, "interval between fetching posts")
|
||||
flag.Parse()
|
||||
|
||||
|
@ -122,16 +132,18 @@ func main() {
|
|||
die.If(err)
|
||||
}
|
||||
|
||||
log.Debugln("config keys")
|
||||
for _, k := range config.ListKeys() {
|
||||
log.Debugf("key: %s", k)
|
||||
}
|
||||
log.Infoln("nlink is starting")
|
||||
|
||||
log.Debugf("loading config file %s\n", configFile)
|
||||
if err := config.LoadFile(configFile); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Debugln("config keys")
|
||||
for _, k := range config.ListKeys() {
|
||||
log.Debugf("key: %s", k)
|
||||
}
|
||||
|
||||
log.Infof("minio_bucket: %s", config.Get("minio_bucket"))
|
||||
if err := restoreDatabase(config.Get("local_database")); err != nil {
|
||||
log.Fatal(err)
|
||||
|
@ -154,6 +166,7 @@ func main() {
|
|||
defer db.Close()
|
||||
|
||||
feeds := splitFeeds()
|
||||
|
||||
if markOnly {
|
||||
log.Info("marking database")
|
||||
for _, feed := range feeds {
|
||||
|
@ -165,15 +178,18 @@ func main() {
|
|||
return
|
||||
}
|
||||
|
||||
os.Exit(1)
|
||||
if singleRun {
|
||||
log.Debugf("running a single loop")
|
||||
fetchLoop(feeds, db)
|
||||
return
|
||||
}
|
||||
|
||||
log.Debugf("will look for new items every %s\n", interval)
|
||||
for {
|
||||
for _, feed := range feeds {
|
||||
log.Infoln("fetching items")
|
||||
if err := fetchItems(db, feed, markOnly); err != nil {
|
||||
log.Info(err)
|
||||
}
|
||||
}
|
||||
log.Infoln("running fetch loop")
|
||||
fetchLoop(feeds, db)
|
||||
time.Sleep(interval)
|
||||
}
|
||||
|
||||
log.Infoln("exiting")
|
||||
}
|
||||
|
|
|
@ -4,14 +4,26 @@ import (
|
|||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"path/filepath"
|
||||
|
||||
"git.sr.ht/~thrrgilag/woodstock"
|
||||
"git.wntrmute.dev/kyle/goutils/log"
|
||||
"github.com/anaskhan96/soup"
|
||||
)
|
||||
|
||||
func nomadLink(url Source) string {
|
||||
return fmt.Sprintf("[nomad.wntrmute.net](%s)", url.ID())
|
||||
func nomadLink(item Item) string {
|
||||
if item.Title != "" {
|
||||
return fmt.Sprintf("[%s](%s)", item.Title, item.URL.ID())
|
||||
}
|
||||
|
||||
u, err := url.Parse(item.URL.ID())
|
||||
if err != nil {
|
||||
log.Errf("nomadLink: %s", err)
|
||||
return fmt.Sprintf("[%s](%s)", item.URL.ID(), item.URL.ID())
|
||||
}
|
||||
|
||||
return fmt.Sprintf("[%s](%s)", u.Host, item.URL.ID())
|
||||
}
|
||||
|
||||
type sel struct {
|
||||
|
@ -22,6 +34,23 @@ func selector(selectors ...string) sel {
|
|||
return sel{selectors: selectors}
|
||||
}
|
||||
|
||||
type imageFinder func(soup.Root) (string, bool)
|
||||
|
||||
var imageFinders = []imageFinder{
|
||||
func(root soup.Root) (string, bool) {
|
||||
return find(
|
||||
root, "src",
|
||||
selector("div", "class", "entry-image"),
|
||||
selector("img"))
|
||||
},
|
||||
func(root soup.Root) (string, bool) {
|
||||
return find(
|
||||
root, "src",
|
||||
selector("div", "class", "gh-inner"),
|
||||
selector("img"))
|
||||
},
|
||||
}
|
||||
|
||||
func find(root soup.Root, attr string, selectors ...sel) (string, bool) {
|
||||
result := root
|
||||
for _, selector := range selectors {
|
||||
|
@ -41,16 +70,18 @@ func find(root soup.Root, attr string, selectors ...sel) (string, bool) {
|
|||
}
|
||||
|
||||
type Post struct {
|
||||
Title string
|
||||
Image Source
|
||||
Body string
|
||||
URL Source
|
||||
}
|
||||
|
||||
func NewPost(item Item) Post {
|
||||
return Post{
|
||||
Body: nomadLink(item.URL),
|
||||
post := Post{
|
||||
Body: nomadLink(item),
|
||||
URL: item.URL,
|
||||
}
|
||||
return post
|
||||
}
|
||||
|
||||
func (p *Post) Fetch() error {
|
||||
|
@ -65,10 +96,15 @@ func (p *Post) Fetch() error {
|
|||
p.Body = body + " " + p.Body
|
||||
}
|
||||
|
||||
imageURL, hasImageURL := find(
|
||||
root, "src",
|
||||
selector("div", "class", "entry-image"),
|
||||
selector("img"))
|
||||
var imageURL string
|
||||
var hasImageURL bool
|
||||
|
||||
for _, finder := range imageFinders {
|
||||
imageURL, hasImageURL = finder(root)
|
||||
if hasImageURL {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if hasImageURL {
|
||||
p.Image = NewURLSource(imageURL)
|
||||
|
|
|
@ -30,6 +30,7 @@ func connectMinio() (err error) {
|
|||
}
|
||||
|
||||
func restoreDatabase(path string) error {
|
||||
log.Debugln("restoring database from minio")
|
||||
if minioClient == nil {
|
||||
if err := connectMinio(); err != nil {
|
||||
return err
|
||||
|
@ -58,9 +59,14 @@ func restoreDatabase(path string) error {
|
|||
defer dbFile.Close()
|
||||
|
||||
_, err = io.Copy(dbFile, obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Debugln("database restored from minio")
|
||||
return nil
|
||||
}
|
||||
|
||||
func saveDatabase(path string) error {
|
||||
if minioClient == nil {
|
||||
if err := connectMinio(); err != nil {
|
||||
|
@ -91,5 +97,7 @@ func saveDatabase(path string) error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Debugln("database saved to minio")
|
||||
return nil
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue