Compare commits
	
		
			2 commits
		
	
	
		
			
				c711ed6567
			
			...
			
				ec3db89d1a
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ec3db89d1a | |||
| 19206a9bf5 | 
					 6 changed files with 175 additions and 21 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +1,2 @@ | ||||||
| build/ | build/ | ||||||
|  | .task/ | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								Taskfile.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Taskfile.yml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | ||||||
|  | # https://taskfile.dev | ||||||
|  | 
 | ||||||
|  | version: '3' | ||||||
|  | 
 | ||||||
|  | tasks: | ||||||
|  |   fmt: | ||||||
|  |     desc: Format go files | ||||||
|  |     sources: | ||||||
|  |       - "**/*.go" | ||||||
|  |     cmds: | ||||||
|  |       - go fmt ./... | ||||||
|  |   cmd-build: | ||||||
|  |     internal: true | ||||||
|  |     cmds: | ||||||
|  |       - go build -o build/ ./cmd/{{.CMD}} | ||||||
|  |   build-convids: | ||||||
|  |     desc: Builds the convids command | ||||||
|  |     sources: | ||||||
|  |       - cmd/convids/**/*.go | ||||||
|  |       - convids/**/*.go | ||||||
|  |       - internal/cli/*.go | ||||||
|  |     generates: | ||||||
|  |       - build/convids | ||||||
|  |     cmds: | ||||||
|  |       - task: cmd-build | ||||||
|  |         vars: | ||||||
|  |           CMD: convids | ||||||
|  |   build-all: | ||||||
|  |     desc: Builds all available commands | ||||||
|  |     sources: | ||||||
|  |       - "**/*.go" | ||||||
|  |     generates: | ||||||
|  |       - build/convids | ||||||
|  |     cmds: | ||||||
|  |       - task: cmd-build | ||||||
|  |         vars: | ||||||
|  |           CMD: "*" | ||||||
|  | @ -7,7 +7,6 @@ import ( | ||||||
| 	"codeberg.org/danjones000/utils/convids" | 	"codeberg.org/danjones000/utils/convids" | ||||||
| 	"codeberg.org/danjones000/utils/internal/cli" | 	"codeberg.org/danjones000/utils/internal/cli" | ||||||
| 	"github.com/spf13/pflag" | 	"github.com/spf13/pflag" | ||||||
| 	"gopkg.in/yaml.v3" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const dataPath = "shows.yml" | const dataPath = "shows.yml" | ||||||
|  | @ -26,17 +25,12 @@ func main() { | ||||||
| 		fmt.Println("looping") | 		fmt.Println("looping") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	f, err := os.Open(dataPath) | 	data, err := convids.NewData(dataPath) | ||||||
| 	cli.HandleErr(err) | 	cli.HandleErr(err) | ||||||
| 
 | 
 | ||||||
| 	ydec := yaml.NewDecoder(f) | 	convids.WalkFiles(data, false, false, func(s *convids.Show, path string) error { | ||||||
| 	var data convids.Data | 		fmt.Printf("%s for %+v\n", path, s) | ||||||
| 	err = ydec.Decode(&data) | 		return nil | ||||||
| 	cli.HandleErr(err) | 	}) | ||||||
| 
 | 	fmt.Println("\nDone!") | ||||||
| 	fmt.Printf("Data: %+v\n", data) |  | ||||||
| 
 |  | ||||||
| 	for s := range data.AllShows(false) { |  | ||||||
| 		fmt.Printf("Show: %+v\n", s) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										63
									
								
								convids/logic.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								convids/logic.go
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,63 @@ | ||||||
|  | package convids | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"os" | ||||||
|  | 	fp "path/filepath" | ||||||
|  | 	"regexp" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"gopkg.in/yaml.v3" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func NewData(path string) (*Data, error) { | ||||||
|  | 	f, err := os.Open(path) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	ydec := yaml.NewDecoder(f) | ||||||
|  | 	var data Data | ||||||
|  | 	err = ydec.Decode(&data) | ||||||
|  | 	return &data, err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ensureExtRe(c *Config) (err error) { | ||||||
|  | 	if c.extRe != nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	c.extRe, err = regexp.Compile("(" + strings.Join(c.Extensions, "|") + ")$") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func WalkFiles(d *Data, stopOnError, silent bool, cb func(s *Show, path string) error) (err error) { | ||||||
|  | 	err = ensureExtRe(d.Config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	var files []os.DirEntry | ||||||
|  | 	files, err = os.ReadDir(d.Config.Source) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for s := range d.AllShows(silent) { | ||||||
|  | 		var found bool | ||||||
|  | 		for _, file := range files { | ||||||
|  | 			if file.IsDir() { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			if !d.Config.extRe.MatchString(file.Name()) { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			found, err = s.Match(file.Name()) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 			if found { | ||||||
|  | 				err = cb(s, fp.Join(d.Config.Source, file.Name())) | ||||||
|  | 				if err != nil && stopOnError { | ||||||
|  | 					return | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | @ -1,22 +1,75 @@ | ||||||
| package convids | package convids | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"iter" | 	"iter" | ||||||
|  | 	"regexp" | ||||||
| 	"slices" | 	"slices" | ||||||
|  | 	"strings" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func (s Shows) All() iter.Seq[Show] { | var ErrNoName = errors.New("missing name") | ||||||
| 	return slices.Values(s) | 
 | ||||||
|  | var animePattern = `^\[.+\] ` | ||||||
|  | var animeRegexp = regexp.MustCompile(animePattern) | ||||||
|  | 
 | ||||||
|  | func (s *Show) Match(path string) (bool, error) { | ||||||
|  | 	if s.Pattern != "" { | ||||||
|  | 		return s.matchRegexp(path) | ||||||
|  | 	} | ||||||
|  | 	if s.Name == "" { | ||||||
|  | 		return false, ErrNoName | ||||||
|  | 	} | ||||||
|  | 	if s.Anime { | ||||||
|  | 		if !animeRegexp.MatchString(path) { | ||||||
|  | 			return false, nil | ||||||
|  | 		} | ||||||
|  | 		path = animeRegexp.ReplaceAllString(path, "") | ||||||
|  | 	} | ||||||
|  | 	return strings.HasPrefix(path, s.Name), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d Data) AllShows(silent bool) iter.Seq[Show] { | func (s *Show) matchRegexp(path string) (f bool, err error) { | ||||||
| 	return func(yield func(Show) bool) { | 	if s.re == nil { | ||||||
|  | 		p := s.Pattern | ||||||
|  | 		if s.Anime { | ||||||
|  | 			if strings.HasPrefix(p, "^") { | ||||||
|  | 				p = strings.TrimPrefix(p, "^") | ||||||
|  | 			} | ||||||
|  | 			p = animePattern + p | ||||||
|  | 		} else if !strings.HasPrefix(p, "^") { | ||||||
|  | 			p = "^" + p | ||||||
|  | 		} | ||||||
|  | 		s.re, err = regexp.Compile(p) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return s.re.MatchString(path), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (ss *Shows) All() iter.Seq[*Show] { | ||||||
|  | 	return slices.Values(*ss) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Data) AllShows(silent bool) iter.Seq[*Show] { | ||||||
|  | 	return func(yield func(*Show) bool) { | ||||||
|  | 		if d.Config == nil { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 		for _, show := range d.Config.Shows { | 		for _, show := range d.Config.Shows { | ||||||
|  | 			sh := (*d.Shows)[show] | ||||||
|  | 			if sh == nil || len(*sh) < 1 { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
| 			if !silent { | 			if !silent { | ||||||
| 				fmt.Println("\nChecking", show, "shows\n") | 				fmt.Println("\nChecking", show, "shows\n") | ||||||
| 			} | 			} | ||||||
| 			for s := range d.Shows[show].All() { | 			for s := range sh.All() { | ||||||
|  | 				if s == nil { | ||||||
|  | 					continue | ||||||
|  | 				} | ||||||
| 				if !yield(s) { | 				if !yield(s) { | ||||||
| 					return | 					return | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
|  | @ -1,23 +1,29 @@ | ||||||
| package convids | package convids | ||||||
| 
 | 
 | ||||||
|  | import "regexp" | ||||||
|  | 
 | ||||||
| type Data struct { | type Data struct { | ||||||
| 	Config Config | 	Config *Config | ||||||
| 	Shows  ShowMap | 	Shows  *ShowMap | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Config struct { | type Config struct { | ||||||
| 	Source     string | 	Source     string | ||||||
| 	Extensions []string | 	Extensions []string | ||||||
| 	Shows      []string | 	Shows      []string | ||||||
|  | 
 | ||||||
|  | 	extRe *regexp.Regexp | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type ShowMap map[string]Shows | type ShowMap map[string]*Shows | ||||||
| 
 | 
 | ||||||
| type Shows []Show | type Shows []*Show | ||||||
| 
 | 
 | ||||||
| type Show struct { | type Show struct { | ||||||
| 	Folder  string | 	Folder  string | ||||||
| 	Pattern string | 	Pattern string | ||||||
| 	Name    string | 	Name    string | ||||||
| 	Anime   bool | 	Anime   bool | ||||||
|  | 
 | ||||||
|  | 	re *regexp.Regexp | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue