shiori/cmd/add.go

93 lines
2.2 KiB
Go
Raw Normal View History

package cmd
import (
"github.com/RadhiFadlillah/go-readability"
2018-01-30 17:16:25 +08:00
"github.com/RadhiFadlillah/shiori/model"
"github.com/spf13/cobra"
"os"
"time"
)
var (
addCmd = &cobra.Command{
Use: "add url",
2018-01-30 14:31:31 +08:00
Short: "Bookmark the specified URL.",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
// Read flag and arguments
url := args[0]
2018-01-30 15:57:36 +08:00
title, _ := cmd.Flags().GetString("title")
excerpt, _ := cmd.Flags().GetString("excerpt")
tags, _ := cmd.Flags().GetStringSlice("tags")
2018-01-30 15:57:36 +08:00
offline, _ := cmd.Flags().GetBool("offline")
// Save new bookmark
2018-01-30 15:57:36 +08:00
err := addBookmark(url, title, excerpt, tags, offline)
if err != nil {
cError.Println(err)
os.Exit(1)
}
},
}
)
func init() {
2018-01-30 15:57:36 +08:00
addCmd.Flags().StringP("title", "i", "", "Custom title for this bookmark.")
addCmd.Flags().StringP("excerpt", "e", "", "Custom excerpt for this bookmark.")
addCmd.Flags().StringSliceP("tags", "t", []string{}, "Comma-separated tags for this bookmark.")
2018-01-30 15:57:36 +08:00
addCmd.Flags().BoolP("offline", "o", false, "Save bookmark without fetching data from internet.")
rootCmd.AddCommand(addCmd)
}
2018-01-30 15:57:36 +08:00
func addBookmark(url, title, excerpt string, tags []string, offline bool) (err error) {
// Fetch data from internet
2018-01-30 17:16:25 +08:00
article := readability.Article{}
2018-01-30 15:57:36 +08:00
if !offline {
article, err = readability.Parse(url, 10*time.Second)
if err != nil {
2018-01-30 17:16:25 +08:00
cError.Println("Failed to fetch article from internet:", err)
article.URL = url
article.Meta.Title = "Untitled"
2018-01-30 15:57:36 +08:00
}
}
2018-01-30 17:16:25 +08:00
// Prepare bookmark
bookmark := model.Bookmark{
URL: article.URL,
Title: article.Meta.Title,
ImageURL: article.Meta.Image,
Excerpt: article.Meta.Excerpt,
Author: article.Meta.Author,
Language: article.Meta.Language,
MinReadTime: article.Meta.MinReadTime,
MaxReadTime: article.Meta.MaxReadTime,
Content: article.Content,
}
bookTags := make([]model.Tag, len(tags))
for i, tag := range tags {
bookTags[i].Name = tag
}
bookmark.Tags = bookTags
2018-01-30 15:57:36 +08:00
// Set custom value
if title != "" {
2018-01-30 17:16:25 +08:00
bookmark.Title = title
2018-01-30 15:57:36 +08:00
}
if excerpt != "" {
2018-01-30 17:16:25 +08:00
bookmark.Excerpt = excerpt
}
2018-01-30 17:16:25 +08:00
// Save to database
bookmark.ID, err = DB.SaveBookmark(bookmark)
if err != nil {
return err
}
printBookmark(bookmark)
return nil
}