From bfe00452eaebf216bb9c589aa4f06911ceb116e9 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Sat, 4 Sep 2021 11:11:27 +0200 Subject: cmd: Add classify flag --- README.md | 18 ++++++++++-------- cmd/lftpq/main.go | 27 +++++++++++++++++++++++++++ cmd/lftpq/main_test.go | 24 ++++++++++++++++++++++++ parser/parser.go | 12 ++++++++++++ queue/config.go | 4 +++- 5 files changed, 76 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 582017e..2a2beba 100644 --- a/README.md +++ b/README.md @@ -10,17 +10,19 @@ A queue generator for [lftp](https://lftp.yar.ru). $ lftpq -h Usage of lftpq: -F string - Format to use in dry-run mode (default "lftp") + Format to use in dry-run mode (default "lftp") + -c string + Classify string and print its local dir -f string - Path to config (default "~/.lftpqrc") - -i Build queues from stdin + Path to config (default "~/.lftpqrc") + -i Build queues from stdin -l string - Override local dir for this run - -n Print queue and exit + Override local dir for this run + -n Print queue and exit -p string - Path to lftp program (default "lftp") - -q Do not print output from lftp - -t Test and print config + Path to lftp program (default "lftp") + -q Do not print output from lftp + -t Test and print config ``` ## Example config diff --git a/cmd/lftpq/main.go b/cmd/lftpq/main.go index 3183d75..65837d7 100644 --- a/cmd/lftpq/main.go +++ b/cmd/lftpq/main.go @@ -10,6 +10,7 @@ import ( "syscall" "github.com/mpolden/lftpq/lftp" + "github.com/mpolden/lftpq/parser" "github.com/mpolden/lftpq/queue" ) @@ -26,6 +27,7 @@ type CLI struct { Import bool LocalDir string LftpPath string + Name string consumer queue.Consumer lister lister stderr io.Writer @@ -63,6 +65,30 @@ func (c *CLI) Run() error { fmt.Fprintf(c.stdout, "%s\n", json) return nil } + if c.Name != "" { + name := filepath.Base(c.Name) + media, parserName, err := parser.Guess(name) + if err != nil { + return err + } + templateFound := false + for _, dir := range cfg.LocalDirs { + if dir.Parser != parserName { + continue + } + path, err := media.PathIn(dir.Template) + if err != nil { + return err + } + templateFound = true + fmt.Fprintln(c.stdout, path) + break + } + if !templateFound { + return fmt.Errorf("no template set for parser: %s", parserName) + } + return nil + } var queues []queue.Queue if c.Import { if queues, err = queue.Read(cfg.Sites, c.stdin); err != nil { @@ -169,6 +195,7 @@ func main() { flag.BoolVar(&cli.Import, "i", false, "Build queues from stdin") flag.StringVar(&cli.LocalDir, "l", "", "Override local dir for this run") flag.StringVar(&cli.LftpPath, "p", "lftp", "Path to lftp program") + flag.StringVar(&cli.Name, "c", "", "Classify media and print its local dir") flag.Parse() client := lftp.Client{Path: cli.LftpPath, InheritIO: !cli.Quiet} cli.lister = &client diff --git a/cmd/lftpq/main_test.go b/cmd/lftpq/main_test.go index f1287cd..b2de28e 100644 --- a/cmd/lftpq/main_test.go +++ b/cmd/lftpq/main_test.go @@ -408,3 +408,27 @@ func TestRunListError(t *testing.T) { t.Errorf("want %q, got %q", want, got) } } + +func TestClassify(t *testing.T) { + cli, buf := newTestCLI(` +{ + "LocalDirs": [ + { + "Name": "d1", + "Parser": "movie", + "Dir": "/media/{{ .Year}}/" + } + ] +}`) + defer os.Remove(cli.Config) + + cli.Name = "/download/foo.2018" + if err := cli.Run(); err != nil { + t.Fatal(err) + } + + want := "/media/2018/foo.2018\n" + if got := buf.String(); got != want { + t.Errorf("want %q, got %q", want, got) + } +} diff --git a/parser/parser.go b/parser/parser.go index 621992d..3378154 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -60,6 +60,18 @@ func (m *Media) PathIn(dir *template.Template) (string, error) { return path, nil } +func Guess(s string) (Media, string, error) { + show, err := Show(s) + if err != nil { + movie, err := Movie(s) + if err != nil { + return Media{}, "", fmt.Errorf("could not guess media: %q", s) + } + return movie, "movie", err + } + return show, "show", nil +} + func Default(s string) (Media, error) { return Media{Release: s}, nil } diff --git a/queue/config.go b/queue/config.go index f774438..bff5572 100644 --- a/queue/config.go +++ b/queue/config.go @@ -34,6 +34,7 @@ type LocalDir struct { Parser string Dir string Replacements []Replacement + Template *template.Template `json:"-"` } type Site struct { @@ -129,7 +130,7 @@ func command(cmd string) (*exec.Cmd, error) { func (c *Config) load() error { itemParsers := make(map[string]itemParser) - for _, d := range c.LocalDirs { + for i, d := range c.LocalDirs { if d.Name == "" { return fmt.Errorf("invalid local dir name: %q", d.Name) } @@ -164,6 +165,7 @@ func (c *Config) load() error { replacements: replacements, template: tmpl, } + c.LocalDirs[i].Template = tmpl } for i := range c.Sites { site := &c.Sites[i] -- cgit v1.2.3