diff options
Diffstat (limited to 'downloader')
| -rw-r--r-- | downloader/downloader.go | 80 | ||||
| -rw-r--r-- | downloader/downloader_test.go | 22 |
2 files changed, 102 insertions, 0 deletions
diff --git a/downloader/downloader.go b/downloader/downloader.go new file mode 100644 index 0000000..1ebaa1d --- /dev/null +++ b/downloader/downloader.go @@ -0,0 +1,80 @@ +package downloader + +import ( + "net/url" + "os/exec" + "strconv" + "time" + + "io/ioutil" + "os" + + "github.com/cryptix/wav" + "github.com/op/go-logging" +) + +var log = logging.MustGetLogger("downloader") + +func getUrl(inUrl string) (string, error) { + dl := exec.Command("youtube-dl", "-f", "bestaudio", "-x", "--get-url", inUrl) + + b, err := dl.CombinedOutput() + if err != nil { + log.Errorf("youtube-dl failed: %v", string(b)) + return "", err + } + + tgt, err := url.Parse(string(b)) + out := tgt.Scheme + "://" + tgt.Host + tgt.Path + "?" + tgt.Query().Encode() + + return out, nil +} + +func Download(inUrl string, startTime time.Duration, duration time.Duration) error { + targetUrl, err := getUrl(inUrl) + if err != nil { + return err + } + + startSecond := int(startTime.Seconds()) + dur := int(duration.Seconds()) + + args := []string{ + "-ss", strconv.Itoa(startSecond), + "-i", targetUrl, + "-c:a", "pcm_s16le", + "-f", "wav", + "-ar", "44100", + "-ac", "2", + "-vn", "-y", + } + + if dur > 0 { + args = append(args, "-t", strconv.Itoa(dur)) + } + + file, err := ioutil.TempFile("", "dl") + if err != nil { + return err + } + defer func() { + if err := os.Remove(file.Name()); err != nil { + log.Errorf("unable to remove temp file: %q", err) + } + }() + + args = append(args, file.Name()) + + dl := exec.Command(`ffmpeg`, args...) + b, err := dl.CombinedOutput() + if err != nil { + log.Errorf("ffmpeg failed: \n%v", string(b)) + return err + } + + wav.NewReader(file, ) + + + + return nil +} diff --git a/downloader/downloader_test.go b/downloader/downloader_test.go new file mode 100644 index 0000000..37a23d4 --- /dev/null +++ b/downloader/downloader_test.go @@ -0,0 +1,22 @@ +package downloader + +import ( + "fmt" + "testing" + "time" +) + +func TestGetUrl(t *testing.T) { + u, err := getUrl("https://www.youtube.com/watch?v=_K13GJkGvDw") + if err != nil { + t.Fatal(err) + } + + fmt.Println(u) +} + +func TestDownload(t *testing.T) { + if err := Download("https://www.youtube.com/watch?v=_K13GJkGvDw", 10*time.Second, 10*time.Second); err != nil { + t.Fatal(err) + } +} |
