From ee5bf1d50b9165729d0c61f7d1f968949e3e0638 Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Wed, 4 Jul 2018 14:58:43 -0700 Subject: enable feed export from web interface --- exporter/exporter.go | 23 ++++++++++++++--------- main.go | 16 +++++++--------- static/ui.html | 10 +++++++++- web/rice-box.go | 8 ++++---- web/web.go | 9 +++++++++ 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/exporter/exporter.go b/exporter/exporter.go index 04ced0b..013377d 100644 --- a/exporter/exporter.go +++ b/exporter/exporter.go @@ -2,37 +2,38 @@ package exporter import ( "adammathes.com/neko/models/feed" + "bytes" "encoding/json" "encoding/xml" "fmt" "html/template" - "os" ) -func ExportFeeds(format string) { +func ExportFeeds(format string) string { feeds, err := feed.All() if err != nil { panic(err) } + s := "" switch format { case "text": for _, f := range feeds { - fmt.Printf("%s\n", f.Url) + s = s + fmt.Sprintf("%s\n", f.Url) } case "opml": - fmt.Printf(`neko feeds`) - fmt.Printf("\n") + s = s + fmt.Sprintf(`neko feeds`) + s = s + fmt.Sprintf("\n") for _, f := range feeds { b, _ := xml.Marshal(f) - fmt.Printf("%s\n", string(b)) + s = s + fmt.Sprintf("%s\n", string(b)) } - fmt.Printf(``) + s = s + fmt.Sprintf(``) case "json": js, _ := json.Marshal(feeds) - fmt.Printf("%s\n", js) + s = fmt.Sprintf("%s\n", js) case "html": htmlTemplateString := ` @@ -48,10 +49,14 @@ func ExportFeeds(format string) { ` + var bts bytes.Buffer htmlTemplate, err := template.New("feeds").Parse(htmlTemplateString) - err = htmlTemplate.Execute(os.Stdout, feeds) + err = htmlTemplate.Execute(&bts, feeds) if err != nil { panic(err) } + s = bts.String() } + + return s } diff --git a/main.go b/main.go index b3a1b01..fd72676 100644 --- a/main.go +++ b/main.go @@ -8,6 +8,7 @@ import ( "adammathes.com/neko/models/feed" "adammathes.com/neko/vlog" "adammathes.com/neko/web" + "fmt" flag "github.com/ogier/pflag" ) @@ -26,10 +27,7 @@ func main() { flag.StringVarP(&dbfile, "db", "d", "neko.db", "sqlite database file") flag.IntVarP(&port, "http", "s", 4994, "HTTP port to serve on") flag.BoolVarP(&proxyImages, "imageproxy", "i", false, "rewrite and proxy all image requests for privacy (experimental)") - - // verbose output by default unless you know what you're doing - // this is probably wrong but keeping it this way for debugging - flag.BoolVarP(&verbose, "verbose", "v", true, "verbose output") + flag.BoolVarP(&verbose, "verbose", "v", false, "verbose output") // passwords on command line are bad flag.StringVarP(&password, "password", "p", "", "password to access web interface") @@ -60,14 +58,14 @@ func main() { return } if export != "" { - vlog.Printf("feed export\n") - exporter.ExportFeeds(export) + vlog.Printf("exporting feeds in format %s\n", export) + fmt.Printf("%s", exporter.ExportFeeds(export)) return } - if password == "" { - panic("Please specify an access password\n") - } + // if password == "" { + // panic("Please specify an access password\n") + // } vlog.Printf("starting web server at 127.0.0.1:%d\n", config.Config.Port) web.Serve() diff --git a/static/ui.html b/static/ui.html index bf533df..84d6629 100644 --- a/static/ui.html +++ b/static/ui.html @@ -27,8 +27,16 @@

Feeds

- +

Export

+ + + +
diff --git a/web/rice-box.go b/web/rice-box.go index bb8b8b5..7a52f0e 100644 --- a/web/rice-box.go +++ b/web/rice-box.go @@ -60,8 +60,8 @@ func init() { } filec := &embedded.EmbeddedFile{ Filename: "ui.html", - FileModTime: time.Unix(1529169644, 0), - Content: string("\n\n \n neko rss mode\n \n \n \n \n \n \n \n \n \n \n \n

🐱

\n\n
\n\n
\n

Tags

\n
    \n
\n \n

Feeds

\n
    \n
\n
\n\n
\n\n
\n
\n
\n
\n \n \n\n \n\n \n\n \n \n\n \n"), + FileModTime: time.Unix(1530741472, 0), + Content: string("\n\n \n neko rss mode\n \n \n \n \n \n \n \n \n \n \n \n

🐱

\n\n
\n\n
\n

Tags

\n \n \n

Feeds

\n \n\n

Export

\n \n\n
\n \n \n\n
\n
\n
\n
\n \n \n\n \n\n \n\n \n \n\n \n"), } filed := &embedded.EmbeddedFile{ Filename: "ui.js", @@ -82,7 +82,7 @@ func init() { // define dirs dir1 := &embedded.EmbeddedDir{ Filename: "", - DirModTime: time.Unix(1529169644, 0), + DirModTime: time.Unix(1530741472, 0), ChildFiles: []*embedded.EmbeddedFile{ file2, // ".DS_Store" file3, // "backbone-1.3.3.min.js" @@ -108,7 +108,7 @@ func init() { // register embeddedBox embedded.RegisterEmbeddedBox(`../static`, &embedded.EmbeddedBox{ Name: `../static`, - Time: time.Unix(1529169644, 0), + Time: time.Unix(1530741472, 0), Dirs: map[string]*embedded.EmbeddedDir{ "": dir1, }, diff --git a/web/web.go b/web/web.go index 8b3b19d..f7fec31 100644 --- a/web/web.go +++ b/web/web.go @@ -3,6 +3,7 @@ package web import ( "adammathes.com/neko/config" "adammathes.com/neko/crawler" + "adammathes.com/neko/exporter" "adammathes.com/neko/models/feed" "adammathes.com/neko/models/item" "encoding/base64" @@ -193,6 +194,13 @@ func imageProxyHandler(w http.ResponseWriter, r *http.Request) { return } +func exportHandler(w http.ResponseWriter, r *http.Request) { + format := r.URL.String() + w.Header().Set("content-type", "text/plain") + w.Write([]byte(exporter.ExportFeeds(format))) + return +} + func fullTextHandler(w http.ResponseWriter, r *http.Request) { fmt.Printf("request: %v\n\n", r) @@ -289,6 +297,7 @@ func Serve() { http.HandleFunc("/feed/", AuthWrap(feedHandler)) http.HandleFunc("/tag/", AuthWrap(categoryHandler)) http.Handle("/image/", http.StripPrefix("/image/", AuthWrap(imageProxyHandler))) + http.Handle("/export/", http.StripPrefix("/export/", AuthWrap(exportHandler))) http.HandleFunc("/login/", loginHandler) http.HandleFunc("/logout/", logoutHandler) -- cgit v1.2.3