From eb12be6f8315973bfb3e39c259c00d325889c32c Mon Sep 17 00:00:00 2001 From: Nathan Perry Date: Sat, 29 Jul 2017 16:39:57 -0400 Subject: refactor works --- downloader/download_manager.go | 51 ++++++++++++++++++--------- downloader/downloader.go | 79 +++++++++++++++++------------------------- 2 files changed, 67 insertions(+), 63 deletions(-) (limited to 'downloader') diff --git a/downloader/download_manager.go b/downloader/download_manager.go index 481fc4f..d6f3fa0 100644 --- a/downloader/download_manager.go +++ b/downloader/download_manager.go @@ -24,7 +24,9 @@ const ( type DownloadManager struct { conn *discordgo.VoiceConnection session *discordgo.Session - dls chan *Downloader + guildID string + voiceID string + dls chan *downloader PlayState chan DlMessage playStateChan chan DlMessage @@ -36,12 +38,14 @@ type DownloadManager struct { const proxyBufSize = 512 -func NewManager(s *discordgo.Session) *DownloadManager { +func NewManager(s *discordgo.Session, guildID string, voiceChanID string) *DownloadManager { dm := &DownloadManager{ session: s, - dls: make(chan *Downloader), + dls: make(chan *downloader), connUpdate: make(chan connUpdate, 1), PlayState: make(chan DlMessage), + guildID: guildID, + voiceID: voiceChanID, playStateChan: make(chan DlMessage), @@ -103,39 +107,54 @@ loop: if attachState == attach { select { - case upd := <-m.connUpdate: - attachState = upd + case attachState = <-m.connUpdate: case m.conn.OpusSend <- <-m.proxyChan: } } else { select { - case upd := <-m.connUpdate: - attachState = upd + case attachState = <-m.connUpdate: } } } } func (m *DownloadManager) playFromQueue() { -loop: + //timer := time.After(5*time.Second) + for { select { case dl := <-m.dls: - dl.SendOn(m.proxyChan) - select { - case <-dl.done: - continue loop - - case upd:=<-m.playStateChan: + if m.conn == nil { + ch, err := m.session.ChannelVoiceJoin(m.guildID, m.voiceID, false, false) + if err != nil { + log.Errorf("unable to connect to the voice channel: %q", err) + time.Sleep(1 * time.Second) + break + } + m.conn = ch + m.connUpdate <- attach } + m.conn.Speaking(true) + // todo: figure out how to do disconnection checking + dl.SendOn(m.proxyChan) + <-dl.done + m.conn.Speaking(false) + //case <-timer: + // if m.conn != nil { + // m.connUpdate<-detach + // if err := m.conn.Disconnect(); err != nil { + // log.Errorf("disconnecting from voice connection: %q", err) + // } + // m.conn = nil + // } } } } -func (m *DownloadManager) Enqueue(url string, startTime, endTime time.Duration) error { - dl, err := NewDownload(url, startTime, endTime) +func (m *DownloadManager) Enqueue(url string, startTime, duration time.Duration) error { + dl, err := newDownload(url, startTime, duration) if err != nil { return err } diff --git a/downloader/downloader.go b/downloader/downloader.go index cab561b..c9fc864 100644 --- a/downloader/downloader.go +++ b/downloader/downloader.go @@ -11,18 +11,17 @@ import ( "github.com/mammothbane/thulani-go/wav" ) -// Downloader handles a download for a particular song. -type Downloader struct { +// downloader handles a download for a particular song. +type downloader struct { Url string Start time.Duration Duration time.Duration End time.Duration - pause chan wav.State - once sync.Once - done chan struct{} - pb chan *wavBundle + once sync.Once + done chan struct{} + pb chan *wavBundle info videoInfo } @@ -30,7 +29,7 @@ type Downloader struct { const clipTime = 10 * time.Second const preloadCount = 5 -func NewDownload(url string, startTime, dur time.Duration) (*Downloader, error) { +func newDownload(url string, startTime, dur time.Duration) (*downloader, error) { vInfo, err := info(url) if err != nil { return nil, err @@ -40,17 +39,16 @@ func NewDownload(url string, startTime, dur time.Duration) (*Downloader, error) dur = vInfo.Duration - startTime } - dl := &Downloader{ + dl := &downloader{ Url: url, Start: startTime, Duration: dur, End: startTime + dur, - pause: make(chan wav.State), - done: make(chan struct{}, 1), - pb: make(chan *wavBundle, preloadCount), - info: *vInfo, + done: make(chan struct{}, 1), + pb: make(chan *wavBundle, preloadCount), + info: *vInfo, } go dl.schedule() @@ -58,21 +56,13 @@ func NewDownload(url string, startTime, dur time.Duration) (*Downloader, error) return dl, nil } -func (d *Downloader) Stop() { +func (d *downloader) Stop() { d.once.Do(func() { close(d.done) }) } -func (d *Downloader) Resume() { - d.pause <- wav.Resume -} - -func (d *Downloader) Pause() { - d.pause <- wav.Pause -} - -func (d *Downloader) SendOn(ch chan<- []byte) <-chan struct{} { +func (d *downloader) SendOn(ch chan<- []byte) <-chan struct{} { out := make(chan struct{}, 1) go func() { @@ -87,9 +77,6 @@ func (d *Downloader) SendOn(ch chan<- []byte) <-chan struct{} { case <-wavB.wav.Done: break - - case elem := <-d.pause: - wavB.wav.PlayState <- elem } } }() @@ -97,34 +84,32 @@ func (d *Downloader) SendOn(ch chan<- []byte) <-chan struct{} { return out } -func (d *Downloader) 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 - } +func (d *downloader) schedule() { + defer close(d.pb) + for i := 0; ; i++ { + clipStart := time.Duration(i)*clipTime + d.Start + clipEnd := time.Duration(i+1)*clipTime + d.Start - dur := clipTime - if clipEnd > d.End { - dur = d.End - clipStart - } + if clipStart >= d.End { + return + } - wavb, err := d.download(clipStart, dur) - if err != nil { - log.Errorf("error setting up download: %q", err) - return - } + dur := clipTime + if clipEnd > d.End { + dur = d.End - clipStart + } - d.pb <- wavb + wavb, err := d.downloadSegment(clipStart, dur) + if err != nil { + log.Errorf("error setting up download: %q", err) + return } - }() + + d.pb <- wavb + } } -func (d *Downloader) download(startTime, duration time.Duration) (*wavBundle, error) { +func (d *downloader) downloadSegment(startTime, duration time.Duration) (*wavBundle, error) { startSecond := int(startTime.Seconds()) args := []string{ "-ss", strconv.Itoa(startSecond), -- cgit v1.3.1