aboutsummaryrefslogtreecommitdiff
path: root/downloader
diff options
context:
space:
mode:
Diffstat (limited to 'downloader')
-rw-r--r--downloader/download_manager.go84
-rw-r--r--downloader/downloader.go14
2 files changed, 83 insertions, 15 deletions
diff --git a/downloader/download_manager.go b/downloader/download_manager.go
index fb7e883..004efc1 100644
--- a/downloader/download_manager.go
+++ b/downloader/download_manager.go
@@ -1,15 +1,89 @@
package downloader
+import (
+ "time"
+)
+
// DownloadManager handles a download for a particular song.
type DownloadManager struct {
Url string
- dlChans []<-chan []byte
+ Start time.Duration
+ Duration time.Duration
+ End time.Duration
+
+ pb chan (<-chan []byte)
+
+ info videoInfo
}
-func NewDownload(url string) DownloadManager {
- return DownloadManager{
- Url: url,
- dlChans: []<-chan []byte{},
+const clipTime = 10 * time.Second
+const preloadCount = 5
+
+func NewDownload(url string, startTime, dur time.Duration) (*DownloadManager, error) {
+ vInfo, err := info(url)
+ if err != nil {
+ return nil, err
+ }
+
+ if dur == 0 {
+ dur = vInfo.Duration - startTime
}
+
+ dl := &DownloadManager{
+ Url: url,
+
+ Start: startTime,
+ Duration: dur,
+ End: startTime + dur,
+
+ pb: make(chan (<-chan []byte), preloadCount),
+ info: *vInfo,
+ }
+
+ go dl.schedule()
+
+ return dl, nil
+}
+
+func (d *DownloadManager) SendOn(ch chan<- []byte) <-chan struct{} {
+ out := make(chan struct{}, 1)
+
+ go func() {
+ defer close(out)
+ for c := range d.pb {
+ for b := range c {
+ ch <- b
+ }
+ }
+ }()
+
+ return out
+}
+
+func (d *DownloadManager) schedule() {
+ go func() {
+ defer close(d.pb)
+ for i := 0; ; i++ {
+ clipStart := time.Duration(i)*clipTime + d.Start
+ clipEnd := time.Duration(i+1)*clipTime + d.Start
+
+ if clipStart >= d.End {
+ return
+ }
+
+ dur := clipTime
+ if clipEnd > d.End {
+ dur = d.End - clipStart
+ }
+
+ ch, err := d.download(clipStart, dur)
+ if err != nil {
+ log.Errorf("error setting up download: %q", err)
+ return
+ }
+
+ d.pb <- ch
+ }
+ }()
}
diff --git a/downloader/downloader.go b/downloader/downloader.go
index 793cd22..95c022f 100644
--- a/downloader/downloader.go
+++ b/downloader/downloader.go
@@ -75,18 +75,11 @@ func info(inUrl string) (*videoInfo, error) {
return &v, err
}
-func Download(inUrl string, startTime time.Duration, duration time.Duration) (<-chan []byte, error) {
- vInfo, err := info(inUrl)
- if err != nil {
- return nil, err
- }
-
+func (d *DownloadManager) download(startTime, duration time.Duration) (<-chan []byte, error) {
startSecond := int(startTime.Seconds())
- dur := int(duration.Seconds())
-
args := []string{
"-ss", strconv.Itoa(startSecond),
- "-i", vInfo.Url.String(),
+ "-i", d.info.Url.String(),
"-c:a", "pcm_s16le",
"-f", "wav",
"-ar", "48000",
@@ -94,7 +87,8 @@ func Download(inUrl string, startTime time.Duration, duration time.Duration) (<-
"-vn", "-y",
}
- if dur > 0 {
+ dur := int(duration.Seconds())
+ if dur > 0 && startTime+duration < d.info.Duration {
args = append(args, "-t", strconv.Itoa(dur))
}