diff --git a/cmd/ytpm/add.go b/cmd/ytpm/add.go index 0b88137..44ed799 100644 --- a/cmd/ytpm/add.go +++ b/cmd/ytpm/add.go @@ -4,9 +4,10 @@ import ( "os" "fmt" "go.yaml.in/yaml/v4" + "tangled.org/hashcube.neocities.org/ytpm/config" ) -func AddSource(url, subfolder string) error { +func AddSource(url, subfolder string, cfg config.Settings) error { cwd, err := os.Getwd() if err != nil { return err @@ -45,14 +46,16 @@ func AddSource(url, subfolder string) error { } if subfolder == "" { - subfolder = "default" + subfolder = cfg.DefaultCategory + } + + if manifestData.Sources == nil { + manifestData.Sources = make(map[string][]string) } - /* */ if manifestData.Sources[subfolder] == nil { manifestData.Sources[subfolder] = []string{} } - // */ manifestData.Sources[subfolder] = append(manifestData.Sources[subfolder], url) mf, err := yaml.Marshal(manifestData) @@ -68,7 +71,6 @@ func AddSource(url, subfolder string) error { if n != len(mf) { return fmt.Errorf("Not all data written to manifest (wrote %d bytes, expected %d bytes)", n, len(data)) } - // */ return nil } diff --git a/cmd/ytpm/init.go b/cmd/ytpm/init.go index bd33fc1..c4fdeed 100644 --- a/cmd/ytpm/init.go +++ b/cmd/ytpm/init.go @@ -3,12 +3,12 @@ package main import ( "os" "fmt" - "os/user" "errors" "go.yaml.in/yaml/v4" + "tangled.org/hashcube.neocities.org/ytpm/config" ) -func InitProject(projectName, projectDir string) error { +func InitProject(projectName, projectDir string, cfg config.Settings) error { if projectName == "" { return errors.New("missing project name") } @@ -40,19 +40,10 @@ func InitProject(projectName, projectDir string) error { return err } - authorUser, err := user.Current() - if err != nil { - return err - } - authorName := authorUser.Name - if authorName == "" { - authorName = authorUser.Username - } - mf := Manifest{ Project: projectName, - Authors: []string{authorName}, - Sources: map[string][]string{ "default": {} }, + Authors: cfg.Authors, + Sources: map[string][]string{ cfg.DefaultCategory: {} }, } data, err := yaml.Marshal(mf) diff --git a/cmd/ytpm/main.go b/cmd/ytpm/main.go index 2fdb71d..e6dbf5b 100644 --- a/cmd/ytpm/main.go +++ b/cmd/ytpm/main.go @@ -4,6 +4,8 @@ import ( "fmt" "flag" "os" + "tangled.org/hashcube.neocities.org/ytpm/config" + "charm.land/log/v2" ) type Manifest struct{ @@ -13,9 +15,44 @@ type Manifest struct{ } func main() { + + cfgDir, err := os.UserConfigDir() + if err != nil { + log.Fatalf("%s failed with: %v\n", os.Args[0], err) + } + path := cfgDir + "/ytpm.yaml" + + pathFlag := flag.String("config", path, "a string") initSub := flag.NewFlagSet("init", flag.ExitOnError) addSub := flag.NewFlagSet("add", flag.ExitOnError) + flag.Parse() + + var Config config.Settings + + if *pathFlag != path { + Config, err, _ = config.ReadConfig(*pathFlag) + if err != nil { + log.Fatalf("%s failed with: %v\n", os.Args[0], err) + } + } else { + path, err := os.Getwd() + if err != nil { + log.Fatalf("%s failed with: %v\n", os.Args[0], err) + } + var auto bool + Config, err, auto = config.ReadConfig(path + "/config.yaml") + if err != nil { + log.Fatalf("%s failed with: %v\n", os.Args[0], err) + } + if auto { + Config, err, _ = config.ReadConfig("") + if err != nil { + log.Fatalf("%s failed with: %v\n", os.Args[0], err) + } + } + } + if len(os.Args) < 2 { PrintHelp(noCmd) os.Exit(1) @@ -28,10 +65,9 @@ func main() { PrintHelp(initCmd) os.Exit(1) } - err := InitProject(initSub.Arg(0), initSub.Arg(1)) + err := InitProject(initSub.Arg(0), initSub.Arg(1), Config) if err != nil { - fmt.Printf("`init` failed with: %v\n", err) - os.Exit(1) + log.Fatalf("`init` failed with: %v\n", err) } fmt.Printf("Project `%s` created successfully!\n", initSub.Arg(0)) os.Exit(0) @@ -42,18 +78,16 @@ func main() { os.Exit(1) } srcName := addSub.Arg(0) - err := AddSource(srcName, addSub.Arg(1)) + err := AddSource(srcName, addSub.Arg(1), Config) if err != nil { - fmt.Printf("`add` failed with: %v\n", err) - os.Exit(1) + log.Fatalf("`add` failed with: %v\n", err) } fmt.Printf("Added `%s` to sources\n", srcName) os.Exit(0) case "sync": - srcCount, err := SyncSources() + srcCount, err := SyncSources(Config) if err != nil { - fmt.Printf("`sync` failed with: %v\n", err) - os.Exit(1) + log.Fatalf("`sync` failed with: %v\n", err) } fmt.Printf("Synced %d sources\n", srcCount) os.Exit(0) diff --git a/cmd/ytpm/sync.go b/cmd/ytpm/sync.go index e68b79d..d8b3e62 100644 --- a/cmd/ytpm/sync.go +++ b/cmd/ytpm/sync.go @@ -11,9 +11,10 @@ import ( "go.yaml.in/yaml/v4" ytdlp "github.com/lrstanley/go-ytdlp" + "tangled.org/hashcube.neocities.org/ytpm/config" ) -func SyncSources() (int, error) { +func SyncSources(cfg config.Settings) (int, error) { cacheDir, err := os.UserCacheDir() if err != nil { @@ -83,7 +84,7 @@ func SyncSources() (int, error) { } for key, sources := range manifestData.Sources { - if key == "default" { key = "" } + if key == cfg.DefaultCategory { key = "" } keyPath := sourcesPath + key + "/" err = os.Mkdir(keyPath, cacheInfo.Mode()) if err != nil { diff --git a/config/config.go b/config/config.go index 6cdc79e..0ab9689 100644 --- a/config/config.go +++ b/config/config.go @@ -2,37 +2,55 @@ package config import ( "os" + "os/user" "go.yaml.in/yaml/v4" ) type Settings struct{ Authors []string `yaml:"authors"` - Categories []string `yaml:"categories"` + DefaultCategory string `yaml:"default_category"` } -func ReadConfig(path string) (Settings, error) { +func ReadConfig(path string) (Settings, error, bool) { s := Settings{} + autogen := true if path == "" { cfgDir, err := os.UserConfigDir() - if err != nil { return s, err } + if err != nil { return s, err, autogen } path = cfgDir + "/ytpm.yaml" } data, err := os.ReadFile(path) if err != nil { - // TODO: Handle Error To Use a Default Config - return s, err + cfg, err := GenerateDefaultConfig() + return cfg, err, autogen } err = yaml.Unmarshal(data, &s) if err != nil { - return s, err + cfg, err := GenerateDefaultConfig() + return cfg, err, autogen } - return s, nil + return s, nil, !autogen } func GenerateDefaultConfig() (Settings, error) { s := Settings{} + + authorUser, err := user.Current() + if err != nil { + return s, err + } + authorName := authorUser.Name + if authorName == "" { + authorName = authorUser.Username + } + + s.Authors = make([]string, 1) + s.Authors[0] = authorName + + s.DefaultCategory = "default" + return s, nil } diff --git a/default.nix b/default.nix index 79697b4..df261f1 100644 --- a/default.nix +++ b/default.nix @@ -10,5 +10,5 @@ in buildGoModule { inherit name src; - vendorHash = "sha256-H7ZcuEw2OAi3LwoIoKnghV/54j6ngfT3XUVjEHCTQm8="; + vendorHash = "sha256-3ccb6zPKcKHdojHP0axRvnbAYZ2JD0WZL1pUNrZfnG0="; } diff --git a/go.mod b/go.mod index 6e0b9cd..6626b23 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,31 @@ -module github.com/hashcube-dev/ytpm +module tangled.org/hashcube.neocities.org/ytpm go 1.26.2 require ( + charm.land/lipgloss/v2 v2.0.1 // indirect + charm.land/log/v2 v2.0.0 // indirect github.com/ProtonMail/go-crypto v1.3.0 // indirect + github.com/charmbracelet/colorprofile v0.4.2 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect + github.com/charmbracelet/x/ansi v0.11.6 // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/charmbracelet/x/termios v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.2.2 // indirect + github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/lrstanley/go-ytdlp v1.3.5 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/ulikunitz/xz v0.5.15 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.yaml.in/yaml/v4 v4.0.0-rc.4 // indirect golang.org/x/crypto v0.48.0 // indirect - golang.org/x/sys v0.41.0 // indirect + golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.42.0 // indirect ) diff --git a/go.sum b/go.sum index acbba02..c8b2c36 100644 --- a/go.sum +++ b/go.sum @@ -1,16 +1,54 @@ +charm.land/lipgloss/v2 v2.0.1 h1:6Xzrn49+Py1Um5q/wZG1gWgER2+7dUyZ9XMEufqPSys= +charm.land/lipgloss/v2 v2.0.1/go.mod h1:KjPle2Qd3YmvP1KL5OMHiHysGcNwq6u83MUjYkFvEkM= +charm.land/log/v2 v2.0.0 h1:SY3Cey7ipx86/MBXQHwsguOT6X1exT94mmJRdzTNs+s= +charm.land/log/v2 v2.0.0/go.mod h1:c3cZSRqm20qUVVAR1WmS/7ab8bgha3C6G7DjPcaVZz0= github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/charmbracelet/colorprofile v0.4.2 h1:BdSNuMjRbotnxHSfxy+PCSa4xAmz7szw70ktAtWRYrY= +github.com/charmbracelet/colorprofile v0.4.2/go.mod h1:0rTi81QpwDElInthtrQ6Ni7cG0sDtwAd4C4le060fT8= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI= +github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8= +github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= +github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= +github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= +github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM= +github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k= +github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= +github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/lrstanley/go-ytdlp v1.3.5 h1:eT+29mK3Lp+XPMQOH25+jVerrrjifYW1o3IkTYJ9SMs= github.com/lrstanley/go-ytdlp v1.3.5/go.mod h1:VgjnTrvkTf+23JuySjyPq1iQ8ijSovBtTPpXH5XrLtI= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/yaml/go-yaml v2.1.0+incompatible h1:Zbv44MLd20eYMtiHHvsEnw575Z8bfjNotykoUKcxgO0= github.com/yaml/go-yaml v2.1.0+incompatible/go.mod h1:XQjxMnX5ELtnGhPE/q0z8IRHbNlc0Oe8iA6GK4uSRJw= go.yaml.in/yaml/v4 v4.0.0-rc.4 h1:UP4+v6fFrBIb1l934bDl//mmnoIZEDK0idg1+AIvX5U= go.yaml.in/yaml/v4 v4.0.0-rc.4/go.mod h1:aZqd9kCMsGL7AuUv/m/PvWLdg5sjJsZ4oHDEnfPPfY0= golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= +golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= +golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=