package main import ( "bytes" "context" "encoding/json" "flag" "fmt" "log" "net/http" "github.com/google/subcommands" "github.com/rodaine/table" "within.website/x/web" ) var ( sanguisugaURL = flag.String("sanguisuga-url", "http://sanguisuga", "Base sanguisuga URL") ) type Show struct { Title string `json:"title"` DiskPath string `json:"diskPath"` Quality string `json:"quality"` } type sanguisugaAnimeList struct{} func (*sanguisugaAnimeList) Name() string { return "anime-list" } func (*sanguisugaAnimeList) Synopsis() string { return "Print list of anime tracked by sanguisuga." } func (*sanguisugaAnimeList) Usage() string { return `anime-list: Print list of anime tracked by sanguisuga ` } func (sal *sanguisugaAnimeList) SetFlags(f *flag.FlagSet) {} func (sal *sanguisugaAnimeList) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { resp, err := http.Get(fmt.Sprintf("%s/api/anime/list", *sanguisugaURL)) if err != nil { log.Fatal(err) } var shows []Show defer resp.Body.Close() if err := json.NewDecoder(resp.Body).Decode(&shows); err != nil { log.Fatal(err) } tbl := table.New("Name", "Disk Path", "Quality") for _, show := range shows { tbl.AddRow(show.Title, show.DiskPath, show.Quality) } tbl.Print() return subcommands.ExitSuccess } type sanguisugaAnimeTrack struct{} func (*sanguisugaAnimeTrack) Name() string { return "anime-track" } func (*sanguisugaAnimeTrack) Synopsis() string { return "Add a new anime to the list of anime to track." } func (*sanguisugaAnimeTrack) Usage() string { return `anime-track <dataDir>: Add a new anime to the tracklist for XDCC. ` } func (sal *sanguisugaAnimeTrack) SetFlags(f *flag.FlagSet) {} func (sal *sanguisugaAnimeTrack) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { if f.NArg() != 2 { fmt.Println(sal.Usage()) return subcommands.ExitFailure } show := Show{ Title: f.Arg(0), DiskPath: f.Arg(1), Quality: "1080p", } data, err := json.Marshal(show) if err != nil { log.Fatal(err) } resp, err := http.Post(fmt.Sprintf("%s/api/anime/track", *sanguisugaURL), "application/json", bytes.NewBuffer(data)) if err != nil { log.Fatal(err) } if resp.StatusCode != http.StatusOK { log.Fatal(web.NewError(http.StatusOK, resp)) } return subcommands.ExitSuccess } type sanguisugaTVList struct{} func (*sanguisugaTVList) Name() string { return "tv-list" } func (*sanguisugaTVList) Synopsis() string { return "Print list of tv tracked by sanguisuga." } func (*sanguisugaTVList) Usage() string { return `tv-list [--url]: Print list of tv tracked by sanguisuga. ` } func (sal *sanguisugaTVList) SetFlags(f *flag.FlagSet) {} func (sal *sanguisugaTVList) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { resp, err := http.Get(fmt.Sprintf("%s/api/tv/list", *sanguisugaURL)) if err != nil { log.Fatal(err) } var shows []Show defer resp.Body.Close() if err := json.NewDecoder(resp.Body).Decode(&shows); err != nil { log.Fatal(err) } tbl := table.New("Name", "Disk Path", "Quality") for _, show := range shows { tbl.AddRow(show.Title, show.DiskPath, show.Quality) } tbl.Print() return subcommands.ExitSuccess } type sanguisugaTVTrack struct{} func (*sanguisugaTVTrack) Name() string { return "tv-track" } func (*sanguisugaTVTrack) Synopsis() string { return "Add a new tv to the list of tv to track." } func (*sanguisugaTVTrack) Usage() string { return `tv-track <title> <dataDir>: Add a new tv to the tracklist. ` } func (sal *sanguisugaTVTrack) SetFlags(f *flag.FlagSet) {} func (sal *sanguisugaTVTrack) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus { if f.NArg() != 2 { fmt.Println(sal.Usage()) return subcommands.ExitFailure } show := Show{ Title: f.Arg(0), DiskPath: f.Arg(1), Quality: "1080p", } data, err := json.Marshal(show) if err != nil { log.Fatal(err) } resp, err := http.Post(fmt.Sprintf("%s/api/tv/track", *sanguisugaURL), "application/json", bytes.NewBuffer(data)) if err != nil { log.Fatal(err) } if resp.StatusCode != http.StatusOK { log.Fatal(web.NewError(http.StatusOK, resp)) } return subcommands.ExitSuccess }