api: refactor download subreddit image
This commit is contained in:
parent
bf998e9ef9
commit
8d2d44597c
|
@ -82,7 +82,7 @@ func (api *API) DownloadSubredditImages(ctx context.Context, subredditName strin
|
||||||
}
|
}
|
||||||
|
|
||||||
func (api *API) downloadSubredditListImage(ctx context.Context, list reddit.Listing, params DownloadSubredditParams) error {
|
func (api *API) downloadSubredditListImage(ctx context.Context, list reddit.Listing, params DownloadSubredditParams) error {
|
||||||
ctx, span := tracer.Start(ctx, "*API.downloadSubredditImage")
|
ctx, span := tracer.Start(ctx, "*API.downloadSubredditListImage")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
wg := sync.WaitGroup{}
|
wg := sync.WaitGroup{}
|
||||||
|
@ -98,69 +98,13 @@ func (api *API) downloadSubredditListImage(ctx context.Context, list reddit.List
|
||||||
wg.Add(1)
|
wg.Add(1)
|
||||||
api.imageSemaphore <- struct{}{}
|
api.imageSemaphore <- struct{}{}
|
||||||
go func(ctx context.Context, post reddit.Post) {
|
go func(ctx context.Context, post reddit.Post) {
|
||||||
ctx, span := tracer.Start(ctx, "*API.downloadSubredditImage.goFunc")
|
|
||||||
defer span.End()
|
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
<-api.imageSemaphore
|
<-api.imageSemaphore
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
imageHandler, err := api.reddit.DownloadImage(ctx, post, api.downloadBroadcast)
|
if err := api.downloadSubredditImage(ctx, post, devices); err != nil {
|
||||||
if err != nil {
|
log.New(ctx).Err(err).Error("failed to download subreddit image")
|
||||||
log.New(ctx).Err(err).Error("failed to download image")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer imageHandler.Close()
|
|
||||||
|
|
||||||
// copy to temp dir first to avoid copying incomplete files.
|
|
||||||
tmpImageFile, err := api.copyImageToTempDir(ctx, imageHandler)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to download image to temp file")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer tmpImageFile.Close()
|
|
||||||
|
|
||||||
w, close, err := api.createDeviceImageWriters(post, devices)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to create image files")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer close()
|
|
||||||
_, err = io.Copy(w, tmpImageFile)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to create save image files")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
thumbnailPath := post.GetThumbnailTargetPath(api.config)
|
|
||||||
_, errStat := os.Stat(thumbnailPath)
|
|
||||||
if errStat == nil {
|
|
||||||
// file exist
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !errors.Is(errStat, os.ErrNotExist) {
|
|
||||||
log.New(ctx).Err(err).Error("failed to check thumbail existence", "path", thumbnailPath)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
thumbnailSource, err := imaging.Open(tmpImageFile.filename)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to open temp thumbnail file", "filename", tmpImageFile.filename)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
thumbnail := imaging.Resize(thumbnailSource, 256, 0, imaging.Lanczos)
|
|
||||||
thumbnailFile, err := os.Create(thumbnailPath)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to create thumbnail file", "filename", thumbnailPath)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer thumbnailFile.Close()
|
|
||||||
|
|
||||||
err = jpeg.Encode(thumbnailFile, thumbnail, nil)
|
|
||||||
if err != nil {
|
|
||||||
log.New(ctx).Err(err).Error("failed to encode thumbnail file to jpeg", "filename", thumbnailPath)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}(ctx, post)
|
}(ctx, post)
|
||||||
}
|
}
|
||||||
|
@ -170,6 +114,62 @@ func (api *API) downloadSubredditListImage(ctx context.Context, list reddit.List
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (api *API) downloadSubredditImage(ctx context.Context, post reddit.Post, devices []queries.Device) error {
|
||||||
|
ctx, span := tracer.Start(ctx, "*API.downloadSubredditImage")
|
||||||
|
defer span.End()
|
||||||
|
|
||||||
|
imageHandler, err := api.reddit.DownloadImage(ctx, post, api.downloadBroadcast)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to download image")
|
||||||
|
}
|
||||||
|
defer imageHandler.Close()
|
||||||
|
|
||||||
|
// copy to temp dir first to avoid copying incomplete files.
|
||||||
|
tmpImageFile, err := api.copyImageToTempDir(ctx, imageHandler)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to download image to temp file")
|
||||||
|
}
|
||||||
|
defer tmpImageFile.Close()
|
||||||
|
|
||||||
|
w, close, err := api.createDeviceImageWriters(post, devices)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to create image files")
|
||||||
|
}
|
||||||
|
defer close()
|
||||||
|
_, err = io.Copy(w, tmpImageFile)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to save image files")
|
||||||
|
}
|
||||||
|
thumbnailPath := post.GetThumbnailTargetPath(api.config)
|
||||||
|
_, errStat := os.Stat(thumbnailPath)
|
||||||
|
if errStat == nil {
|
||||||
|
// file exist
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if !errors.Is(errStat, os.ErrNotExist) {
|
||||||
|
return errs.Wrapw(err, "failed to check thumbail existence", "path", thumbnailPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
thumbnailSource, err := imaging.Open(tmpImageFile.filename)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to open temp thumbnail file", "filename", tmpImageFile.filename)
|
||||||
|
}
|
||||||
|
|
||||||
|
thumbnail := imaging.Resize(thumbnailSource, 256, 0, imaging.Lanczos)
|
||||||
|
thumbnailFile, err := os.Create(thumbnailPath)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to create thumbnail file", "filename", thumbnailPath)
|
||||||
|
}
|
||||||
|
defer thumbnailFile.Close()
|
||||||
|
|
||||||
|
err = jpeg.Encode(thumbnailFile, thumbnail, nil)
|
||||||
|
if err != nil {
|
||||||
|
return errs.Wrapw(err, "failed to encode thumbnail file to jpeg", "filename", thumbnailPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (api *API) createDeviceImageWriters(post reddit.Post, devices []queries.Device) (writer io.Writer, close func(), err error) {
|
func (api *API) createDeviceImageWriters(post reddit.Post, devices []queries.Device) (writer io.Writer, close func(), err error) {
|
||||||
// open file for each device
|
// open file for each device
|
||||||
var files []*os.File
|
var files []*os.File
|
||||||
|
|
Loading…
Reference in a new issue