Add yt-downloader
This commit is contained in:
55
api/internal/core/services/download/default/background.go
Normal file
55
api/internal/core/services/download/default/background.go
Normal 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
|
||||
}
|
53
api/internal/core/services/download/default/service.go
Normal file
53
api/internal/core/services/download/default/service.go
Normal 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)
|
||||
}
|
Reference in New Issue
Block a user