aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-09-04 11:11:27 +0200
committerMartin Polden <mpolden@mpolden.no>2021-09-04 11:23:48 +0200
commitbfe00452eaebf216bb9c589aa4f06911ceb116e9 (patch)
treeee4cda641082d4e7d0077f37074c1b6a4b49f5c7
parentc8d1eacc292579e6a4daf72c1c1dfcce69e2ff25 (diff)
cmd: Add classify flag
-rw-r--r--README.md18
-rw-r--r--cmd/lftpq/main.go27
-rw-r--r--cmd/lftpq/main_test.go24
-rw-r--r--parser/parser.go12
-rw-r--r--queue/config.go4
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]