diff --git a/Dockerfile b/Dockerfile new file mode 100755 index 0000000..25eb6eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM frolvlad/alpine-glibc:alpine-3.9_glibc-2.29 +RUN apk update && apk add --no-cache ca-certificates + +RUN mkdir -p /var/log +WORKDIR /main + +COPY . . + +ENV GOPATH="" +ENV MNT="/mnt/" +ENTRYPOINT ["/main/exec-youtuber"] +CMD [] + diff --git a/config/config.go b/config/config.go old mode 100644 new mode 100755 index 736c228..4be805c --- a/config/config.go +++ b/config/config.go @@ -1,10 +1,19 @@ package config +import "os" + var ( - Feed = "https://www.youtube.com/feeds/videos.xml?channel_id=UCwX0AEx-qIhQ9kgtlNhyIXw" - Root = "/tmp" + Feed = orEnv("FEED", "https://www.youtube.com/feeds/videos.xml?channel_id=UCwX0AEx-qIhQ9kgtlNhyIXw") + Root = orEnv("ROOT", "/tmp") ) +func orEnv(k, v string) string { + if w, ok := os.LookupEnv(k); ok { + return w + } + return v +} + /* config = { "path" : "../TV/Shepherds_Chapel" , diff --git a/feed/feed.go b/feed/feed.go old mode 100644 new mode 100755 diff --git a/feed/item.go b/feed/item.go old mode 100644 new mode 100755 diff --git a/main.go b/main.go old mode 100644 new mode 100755 index 1df4fa8..a025170 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "local/youtuber/config" "local/youtuber/feed" @@ -9,19 +10,32 @@ import ( "os" "path" "strings" + "time" ) func main() { os.Setenv("LC_ALL", "C.UTF-8") - results, err := feed.Fetch(config.Feed) + client, err := youtubedl.New() if err != nil { panic(err) } - log.Println(results) + interval := time.Hour * 4 + for true { + err := do(client) + if err != nil { + log.Println(err) + } + log.Printf("sleeping until %v", time.Now().Add(interval)) + time.Sleep(interval) + } +} - youtubedl, err := youtubedl.New() +func do(client *youtubedl.Client) error { + errs := "" + + results, err := feed.Fetch(config.Feed) if err != nil { - panic(err) + return err } for _, result := range results { @@ -32,10 +46,17 @@ func main() { result.Date.Day(), strings.Join(strings.Split(result.Title, " ")[2:], "_"), ) - if err := youtubedl.Download(result.Link, path.Join(config.Root, target)); err != nil { - panic(err) + target = path.Join(config.Root, target) + if _, err := os.Stat(strings.ReplaceAll(target, "%(ext)s", "mp4")); !os.IsNotExist(err) { + log.Printf("already exists: %s", target) + continue + } + if err := client.Download(result.Link, path.Join(config.Root, target)); err != nil { + errs += ", " + err.Error() } - return } - log.Println(youtubedl) + if errs != "" { + return errors.New(errs) + } + return nil } diff --git a/youtubedl/client.go b/youtubedl/client.go old mode 100644 new mode 100755 diff --git a/youtubedl/install.go b/youtubedl/install.go old mode 100644 new mode 100755 index 2d87ea5..52ea35c --- a/youtubedl/install.go +++ b/youtubedl/install.go @@ -2,6 +2,7 @@ package youtubedl import ( "errors" + "log" "os/exec" ) @@ -31,11 +32,15 @@ func installPyPip3() error { []string{"apt", "install", "python3", "pip3"}, []string{"apk", "add", "python3", "py3-pip"}, []string{"sudo", "apk", "add", "python3", "py3-pip"}, + []string{"/sbin/apk", "add", "python3", "py3-pip"}, + []string{"sudo", "/sbin/apk", "add", "python3", "py3-pip"}, } { cmd := exec.Command(combo[0], combo[1:]...) - if err := cmd.Run(); err == nil { + err := cmd.Run() + if err == nil { return nil } + log.Println("%v: %v", err, combo) } return errors.New("cannot get python3 and pip3") }