Add yt-downloader

This commit is contained in:
2021-12-21 23:05:00 +01:00
committed by kjuulh
parent 0d3fae2ca5
commit 4b9583b08f
17 changed files with 449 additions and 134 deletions

View File

@@ -0,0 +1,55 @@
package _default
import (
"downloader/internal/core/entities"
"downloader/internal/core/ports/download_request"
"downloader/internal/core/ports/downloader"
"downloader/internal/core/services/download"
"fmt"
"go.uber.org/zap"
)
type localBackgroundService struct {
repository download_request.Repository
logger *zap.SugaredLogger
downloader downloader.Downloader
}
func NewLocalBackgroundService(repository download_request.Repository, logger *zap.SugaredLogger, downloader downloader.Downloader) download.BackgroundService {
return &localBackgroundService{repository: repository, logger: logger, downloader: downloader}
}
func (l localBackgroundService) Run(download *entities.Download) error {
logger := l.logger.With("downloadId", download.ID)
go func() {
download.Status = "started"
_ = l.repository.Update(download)
err := l.downloader.Download(download.Link, func(progress string) {
download.Status = fmt.Sprintf("in-progress: %s", progress)
_ = l.repository.Update(download)
})
download.Status = "done"
if err != nil {
logger.Error(err)
download.Status = "failed"
}
err = l.repository.Update(download)
if err != nil {
logger.Errorw("download request failed",
"downloadLink", download.Link)
download.Status = "failed"
if updateErr := l.repository.Update(download); updateErr != nil {
panic(updateErr)
}
} else {
logger.Info("download request done")
}
}()
return nil
}

View File

@@ -0,0 +1,53 @@
package _default
import (
"downloader/internal/core/entities"
"downloader/internal/core/ports/download_request"
"downloader/internal/core/services/download"
"downloader/pkg/common/uuid"
"go.uber.org/zap"
)
type localService struct {
repository download_request.Repository
uuidGen uuid.Gen
BackgroundService download.BackgroundService
logger *zap.SugaredLogger
}
func NewLocalService(repository download_request.Repository, uuidGen uuid.Gen, backgroundService download.BackgroundService, logger *zap.SugaredLogger) download.Service {
return &localService{
repository: repository,
uuidGen: uuidGen,
BackgroundService: backgroundService,
logger: logger,
}
}
func (l *localService) Schedule(link string) (*entities.Download, error) {
download, err := entities.NewDownload(link)(l.uuidGen)
if err != nil {
l.logger.Warn("Could not parse download")
return nil, err
}
logger := l.logger.With("downloadId", download.ID)
persistedDownloadRequest, uploadErr := l.repository.Create(download)
if uploadErr != nil {
logger.Error("failed to insert download request")
return nil, uploadErr
}
err = l.BackgroundService.Run(persistedDownloadRequest)
if err != nil {
logger.Error("failed to run download request")
return nil, err
}
return persistedDownloadRequest, nil
}
func (l *localService) Get(id string) (*entities.Download, error) {
return l.repository.GetById(id)
}