diff --git a/app/ui/anime_page_utils.go b/app/ui/anime_page_utils.go index f24b2ad..757f85c 100644 --- a/app/ui/anime_page_utils.go +++ b/app/ui/anime_page_utils.go @@ -19,23 +19,32 @@ const ( ) // save: Save a Episode. -func (p *AnimePage) saveEpisode(episode *tohru.Episode, errChan chan error) { +func (p *AnimePage) saveEpisode(episode *tohru.Episode, errChan chan error, infoChan chan string) { url, err := getDwnLink(episode) if err != nil { errChan <- err return } filePath := p.getDownloadPath(episode) - filename := fmt.Sprintf("%s%s.%s", filePath, removeRestrictedChars(episode.EpisodeName), "mp4") + fullPath := fmt.Sprintf("%s%s.%s", filePath, removeRestrictedChars(episode.EpisodeName), "mp4") err = os.MkdirAll(filePath, 0777) if err != nil { errChan <- err return } - _, err = grab.Get(filename, url) + resp, err := grab.Get(fullPath, url) if err != nil { errChan <- err + return + } + if resp.Err() != nil { + errChan <- resp.Err() + return + } + if resp.IsComplete() { + infoChan <- fmt.Sprintf("Download is complete and file can be found at: %s", fullPath) + return } } diff --git a/app/ui/modals.go b/app/ui/modals.go index bab025b..b9a3c94 100644 --- a/app/ui/modals.go +++ b/app/ui/modals.go @@ -54,7 +54,7 @@ func confirmModal(id, text, confirmButton string, f func()) *tview.Modal { // confirmModal : Creates a new modal for confirmation. // The user specifies the function to do when confirming. // If the user cancels, then the modal is removed from the view. -func watchOrDownloadModal(id, text string, stream func(chan error), download func(chan error), errChan chan error) *tview.Modal { +func watchOrDownloadModal(id, text string, stream func(chan error, chan string), download func(chan error, chan string), errChan chan error, infoChan chan string) *tview.Modal { // Create new modal modal := tview.NewModal() @@ -65,9 +65,9 @@ func watchOrDownloadModal(id, text string, stream func(chan error), download fun SetFocus(0). SetDoneFunc(func(buttonIndex int, _ string) { if buttonIndex == 0 { - stream(errChan) + stream(errChan, infoChan) } else if buttonIndex == 1 { - download(errChan) + download(errChan, infoChan) } log.Printf("Removing %s modal\n", id) core.App.PageHolder.RemovePage(id) diff --git a/app/ui/page_inputs.go b/app/ui/page_inputs.go index fc74f4b..7b91f45 100644 --- a/app/ui/page_inputs.go +++ b/app/ui/page_inputs.go @@ -130,6 +130,8 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { log.Println("Creating and showing confirm download modal...") errChan := make(chan error) + infoChan := make(chan string) + if len(p.sWrap.Selection) > 1 { modal := confirmModal(utils.DownloadModalID, "Download episode(s)?", "Yes", func() { // Create a copy of the Selection. @@ -140,7 +142,7 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { }) ShowModal(utils.DownloadModalID, modal) } else { - streamF := func(errChan chan error) { + streamF := func(errChan chan error, infoChan chan string) { selected := p.sWrap.CopySelection() for index := range selected { var episode *tohru.Episode @@ -160,7 +162,7 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { modal := okModal(utils.InfoModalID, "Stream Starting...\n this operation may take few minutes based on internet connection and mpv launch \nif error happened it will be reported") ShowModal(utils.InfoModalID, modal) } - dwnF := func(errChan chan error) { + dwnF := func(errChan chan error, infoChan chan string) { selected := p.sWrap.CopySelection() for index := range selected { var episode *tohru.Episode @@ -168,7 +170,7 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { if episode, ok = p.Table.GetCell(index, 0).GetReference().(*tohru.Episode); !ok { return } - go p.saveEpisode(episode, errChan) + go p.saveEpisode(episode, errChan, infoChan) } log.Println(selected) @@ -179,10 +181,10 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { modal := okModal(utils.InfoModalID, info) ShowModal(utils.InfoModalID, modal) } - modal := watchOrDownloadModal(utils.WatchOrDownloadModalID, "Select Option", streamF, dwnF, errChan) + modal := watchOrDownloadModal(utils.WatchOrDownloadModalID, "Select Option", streamF, dwnF, errChan, infoChan) ShowModal(utils.WatchOrDownloadModalID, modal) } - go func(errChan chan error) { + go func(errChan chan error, infoChan chan string) { for { select { case err := <-errChan: @@ -191,9 +193,16 @@ func (p *AnimePage) setHandlers(cancel context.CancelFunc) { modal := okModal(utils.GenericAPIErrorModalID, err.Error()) ShowModal(utils.GenericAPIErrorModalID, modal) }) + + case info := <-infoChan: + log.Println(info) + core.App.TView.QueueUpdateDraw(func() { + modal := okModal(utils.InfoModalID, info) + ShowModal(utils.InfoModalID, modal) + }) } } - }(errChan) + }(errChan, infoChan) }) // Set table input captures.