Compare commits
	
		
			No commits in common. "ec3db89d1a8046a64df5c078ecef91cde28c5da0" and "c711ed65673dc43c70a9d875f6528997d18e917d" have entirely different histories.
		
	
	
		
			
				ec3db89d1a
			
			...
			
				c711ed6567
			
		
	
		
					 6 changed files with 21 additions and 175 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1,2 +1 @@
 | 
			
		|||
build/
 | 
			
		||||
.task/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								Taskfile.yml
									
										
									
									
									
								
							
							
						
						
									
										37
									
								
								Taskfile.yml
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,37 +0,0 @@
 | 
			
		|||
# 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,6 +7,7 @@ import (
 | 
			
		|||
	"codeberg.org/danjones000/utils/convids"
 | 
			
		||||
	"codeberg.org/danjones000/utils/internal/cli"
 | 
			
		||||
	"github.com/spf13/pflag"
 | 
			
		||||
	"gopkg.in/yaml.v3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const dataPath = "shows.yml"
 | 
			
		||||
| 
						 | 
				
			
			@ -25,12 +26,17 @@ func main() {
 | 
			
		|||
		fmt.Println("looping")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	data, err := convids.NewData(dataPath)
 | 
			
		||||
	f, err := os.Open(dataPath)
 | 
			
		||||
	cli.HandleErr(err)
 | 
			
		||||
 | 
			
		||||
	convids.WalkFiles(data, false, false, func(s *convids.Show, path string) error {
 | 
			
		||||
		fmt.Printf("%s for %+v\n", path, s)
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
	fmt.Println("\nDone!")
 | 
			
		||||
	ydec := yaml.NewDecoder(f)
 | 
			
		||||
	var data convids.Data
 | 
			
		||||
	err = ydec.Decode(&data)
 | 
			
		||||
	cli.HandleErr(err)
 | 
			
		||||
 | 
			
		||||
	fmt.Printf("Data: %+v\n", data)
 | 
			
		||||
 | 
			
		||||
	for s := range data.AllShows(false) {
 | 
			
		||||
		fmt.Printf("Show: %+v\n", s)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,63 +0,0 @@
 | 
			
		|||
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,75 +1,22 @@
 | 
			
		|||
package convids
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"iter"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"slices"
 | 
			
		||||
	"strings"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var ErrNoName = errors.New("missing name")
 | 
			
		||||
 | 
			
		||||
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 (s Shows) All() iter.Seq[Show] {
 | 
			
		||||
	return slices.Values(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Show) matchRegexp(path string) (f bool, err error) {
 | 
			
		||||
	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
 | 
			
		||||
		}
 | 
			
		||||
func (d Data) AllShows(silent bool) iter.Seq[Show] {
 | 
			
		||||
	return func(yield func(Show) bool) {
 | 
			
		||||
		for _, show := range d.Config.Shows {
 | 
			
		||||
			sh := (*d.Shows)[show]
 | 
			
		||||
			if sh == nil || len(*sh) < 1 {
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if !silent {
 | 
			
		||||
				fmt.Println("\nChecking", show, "shows\n")
 | 
			
		||||
			}
 | 
			
		||||
			for s := range sh.All() {
 | 
			
		||||
				if s == nil {
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			for s := range d.Shows[show].All() {
 | 
			
		||||
				if !yield(s) {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,29 +1,23 @@
 | 
			
		|||
package convids
 | 
			
		||||
 | 
			
		||||
import "regexp"
 | 
			
		||||
 | 
			
		||||
type Data struct {
 | 
			
		||||
	Config *Config
 | 
			
		||||
	Shows  *ShowMap
 | 
			
		||||
	Config Config
 | 
			
		||||
	Shows  ShowMap
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Config struct {
 | 
			
		||||
	Source     string
 | 
			
		||||
	Extensions []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 {
 | 
			
		||||
	Folder  string
 | 
			
		||||
	Pattern string
 | 
			
		||||
	Name    string
 | 
			
		||||
	Anime   bool
 | 
			
		||||
 | 
			
		||||
	re *regexp.Regexp
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue