Initial Commit
This commit is contained in:
commit
a8e1256f82
|
@ -0,0 +1,9 @@
|
|||
module git.wavrant.xyz/webrss
|
||||
|
||||
require (
|
||||
github.com/PuerkitoBio/goquery v1.5.0 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.10.0 // indirect
|
||||
github.com/mmcdole/gofeed v1.0.0-beta2 // indirect
|
||||
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf // indirect
|
||||
golang.org/x/net v0.0.0-20190322120337-addf6b3196f6 // indirect
|
||||
)
|
|
@ -0,0 +1,24 @@
|
|||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20171212193932-7d465cb032ad h1:ON6B5Ohml5Cqz+7jCJ9QH/j0QKhuStmmwjEyUINrIc0=
|
||||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20171212193932-7d465cb032ad/go.mod h1:fASu6kVGYSlvrdl1B9L2Hhoi7wZM5EkWfepSFTBiMzA=
|
||||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20190323140510-b5825d2479e3 h1:31Pkzati2iglstD8ihIDeEX5/mXNEJXnoOxnBcDnrZY=
|
||||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20190323140510-b5825d2479e3/go.mod h1:fASu6kVGYSlvrdl1B9L2Hhoi7wZM5EkWfepSFTBiMzA=
|
||||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20190323141610-f8e57ec956d1 h1:94A+Ntto8ALZZ41H5N+NjCI/UPkCVUwkCuVxB12j7d0=
|
||||
git.wavrant.xyz/nwavrant/go-rssreader v0.0.0-20190323141610-f8e57ec956d1/go.mod h1:fASu6kVGYSlvrdl1B9L2Hhoi7wZM5EkWfepSFTBiMzA=
|
||||
github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
|
||||
github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
|
||||
github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
|
||||
github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
|
||||
github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o=
|
||||
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
|
||||
github.com/mmcdole/gofeed v1.0.0-beta2 h1:CjQ0ADhAwNSb08zknAkGOEYqr8zfZKfrzgk9BxpWP2E=
|
||||
github.com/mmcdole/gofeed v1.0.0-beta2/go.mod h1:/BF9JneEL2/flujm8XHoxUcghdTV6vvb3xx/vKyChFU=
|
||||
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf h1:sWGE2v+hO0Nd4yFU/S/mDBM5plIU8v/Qhfz41hkDIAI=
|
||||
github.com/mmcdole/goxpp v0.0.0-20181012175147-0068e33feabf/go.mod h1:pasqhqstspkosTneA62Nc+2p9SOBBYAPbnmRRWPQ0V8=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190322120337-addf6b3196f6 h1:78jEq2G3J16aXneH23HSnTQQTCwMHoyO8VEiUH+bpPM=
|
||||
golang.org/x/net v0.0.0-20190322120337-addf6b3196f6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
@ -0,0 +1,217 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
librss "github.com/mmcdole/gofeed"
|
||||
"os"
|
||||
)
|
||||
|
||||
type FeedManager struct {
|
||||
DBPath string
|
||||
}
|
||||
|
||||
func (f *FeedManager) createDB() (bool, error) {
|
||||
db, err := sql.Open("sqlite3", "./database.db")
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
createStmts := [2]string{`
|
||||
create table feeds (
|
||||
Id INTEGER PRIMARY KEY,
|
||||
Title TEXT,
|
||||
Description TEXT,
|
||||
Link TEXT,
|
||||
FeedLink TEXT,
|
||||
Updated TEXT,
|
||||
UpdatedParsed TEXT,
|
||||
Published TEXT,
|
||||
PublishedParsed TEXT,
|
||||
Author TEXT,
|
||||
Language TEXT,
|
||||
Image TEXT,
|
||||
Copyright TEXT,
|
||||
Generator TEXT,
|
||||
Categories TEXT,
|
||||
DublinCoreExt TEXT,
|
||||
ITunesExt TEXT,
|
||||
Extensions TEXT,
|
||||
Custom TEXT,
|
||||
Items TEXT,
|
||||
FeedType TEXT,
|
||||
FeedVersion TEXT
|
||||
);`,
|
||||
`
|
||||
create table items (
|
||||
GUID TEXT PRIMARY KEY,
|
||||
Feed INTEGER NOT NULL,
|
||||
Title TEXT,
|
||||
Description TEXT,
|
||||
Content TEXT,
|
||||
Link TEXT,
|
||||
Updated TEXT,
|
||||
UpdatedParsed TEXT,
|
||||
Published TEXT,
|
||||
PublishedParsed TEXT,
|
||||
Author TEXT,
|
||||
Image TEXT,
|
||||
Categories TEXT,
|
||||
Enclosures TEXT,
|
||||
DublinCoreExt TEXT,
|
||||
ITunesExt TEXT,
|
||||
Extensions TEXT,
|
||||
Custom TEXT,
|
||||
|
||||
FOREIGN KEY(Feed) REFERENCES feeds(Id)
|
||||
)
|
||||
`}
|
||||
|
||||
for _, stmt := range createStmts {
|
||||
_, err = db.Exec(stmt)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return true, nil
|
||||
}
|
||||
|
||||
func (f *FeedManager) ExecDB(query string, parameters ...interface{}) (*sql.Result, error) {
|
||||
db, err := sql.Open("sqlite3", f.DBPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
stmt, err := db.Prepare(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := stmt.Exec(parameters...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (f *FeedManager) QueryDB(query string, parameters ...interface{}) (*sql.Rows, error) {
|
||||
db, err := sql.Open("sqlite3", f.DBPath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
stmt, err := db.Prepare(query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result, err := stmt.Query(parameters...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (f *FeedManager) AddFeed(url string) (*sql.Result, error) {
|
||||
feed, err := f.DownloadFeed(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
query := `insert into feeds (title, description, link, feedLink, updated, updatedParsed,
|
||||
published, publishedParsed, image) values(?, ?, ?, ?, ?, ?, ?, ?, ?);`
|
||||
return f.ExecDB(query, feed.Title, feed.Description, feed.Link, feed.FeedLink, feed.Updated, feed.UpdatedParsed,
|
||||
feed.Published, feed.PublishedParsed, feed.Image)
|
||||
}
|
||||
|
||||
func (f *FeedManager) RemoveFeed(url string) (*sql.Result, error) {
|
||||
query := "delete from feeds where link = ?;"
|
||||
return f.ExecDB(query, url)
|
||||
}
|
||||
|
||||
func (f *FeedManager) DownloadFeed(url string) (*librss.Feed, error) {
|
||||
fp := librss.NewParser()
|
||||
feed, err := fp.ParseURL(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return feed, nil
|
||||
}
|
||||
|
||||
func (f *FeedManager) GetFeeds () (map[int]librss.Feed, error) {
|
||||
feeds := make(map[int]librss.Feed)
|
||||
|
||||
rows, err := f.QueryDB("select id, link from feeds;")
|
||||
if err != nil {
|
||||
return feeds, err
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var link string
|
||||
var id int
|
||||
err = rows.Scan(&id, &link)
|
||||
if err != nil {
|
||||
return feeds, err
|
||||
}
|
||||
fmt.Println(id, link)
|
||||
|
||||
feeds[id] = librss.Feed{Link:link}
|
||||
}
|
||||
|
||||
return feeds, nil
|
||||
}
|
||||
|
||||
func (f *FeedManager) Sync() (error) {
|
||||
feeds, err := f.GetFeeds()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for id, feed := range feeds {
|
||||
res, err := f.DownloadFeed(feed.Link)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, item := range res.Items {
|
||||
_, err := f.ExecDB("insert into items (feed, Title, Description, Content, Link, Author, GUID, Image) values (?, ?, ?, ?, ?, ?, ?, ?)",
|
||||
id, item.Title, item.Description, item.Content, item.Link, item.Author, item.GUID, item.Image)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
defaultDBPath := "./database.db"
|
||||
|
||||
feedManager := FeedManager{DBPath: defaultDBPath}
|
||||
|
||||
if _, err := os.Stat(defaultDBPath); os.IsNotExist(err) {
|
||||
feedManager.createDB()
|
||||
_, err := feedManager.AddFeed("https://me.wavrant.xyz/feed/1/")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
} else if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
|
||||
err := feedManager.Sync()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue