Initial Commit

This commit is contained in:
Nicolas Wavrant 2019-03-24 13:02:27 +09:00
commit a8e1256f82
3 changed files with 250 additions and 0 deletions

9
go.mod Normal file
View File

@ -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
)

24
go.sum Normal file
View File

@ -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=

217
main.go Normal file
View File

@ -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)
}
}