Skip to content

Commit

Permalink
Rework simultaneous downloads cap
Browse files Browse the repository at this point in the history
  • Loading branch information
JackDallas committed May 24, 2022
1 parent 8c3d0dc commit 3d67c6d
Showing 1 changed file with 84 additions and 76 deletions.
160 changes: 84 additions & 76 deletions internal/service/transfer_manager_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,20 @@ func (manager *TransferManagerService) TaskUpdateTransfersList() {
func (manager *TransferManagerService) TaskCheckPremiumizeDownloadsFolder() {
log.Debug("Running Task CheckPremiumizeDownloadsFolder")

if len(manager.transfers) < manager.config.SimultaneousDownloads {
items, err := manager.premiumizemeClient.ListFolder(manager.downloadsFolderID)
if err != nil {
log.Error("Error listing downloads folder: %s", err.Error())
return
}
items, err := manager.premiumizemeClient.ListFolder(manager.downloadsFolderID)
if err != nil {
log.Error("Error listing downloads folder: %s", err.Error())
return
}

for _, item := range items {
for _, item := range items {
if manager.countDownloads() < manager.config.SimultaneousDownloads {
log.Debugf("Processing completed item: %s", item.Name)
go manager.HandleFinishedItem(item, manager.config.DownloadsDirectory)
manager.HandleFinishedItem(item, manager.config.DownloadsDirectory)
} else {
log.Debugf("Not processing any more transfers, %d are running and cap is %d", manager.countDownloads(), manager.config.SimultaneousDownloads)
break
}
} else {
log.Debug("Hit download cap, skipping task")
}
}

Expand All @@ -139,6 +140,13 @@ func (manager *TransferManagerService) addDownload(item *premiumizeme.Item) {
}
}

func (manager *TransferManagerService) countDownloads() int {
manager.downloadListMutex.Lock()
defer manager.downloadListMutex.Unlock()

return len(manager.downloadList)
}

func (manager *TransferManagerService) removeDownload(name string) {
manager.downloadListMutex.Lock()
defer manager.downloadListMutex.Unlock()
Expand All @@ -159,86 +167,86 @@ func (manager *TransferManagerService) downloadExists(itemName string) bool {
return false
}

// Ran in a goroutine
// Returns when the download has been added to the list
func (manager *TransferManagerService) HandleFinishedItem(item premiumizeme.Item, downloadDirectory string) {
if manager.downloadExists(item.Name) {
log.Tracef("Transfer %s is already downloading", item.Name)
return
}

manager.addDownload(&item)
//Create entry in downloads map to lock item
// manager.downloadList[item.Name] = progress_downloader.NewWriteCounter()

log.Debug("Downloading: ", item.Name)
log.Tracef("%+v", item)
var link string
var err error
if item.Type == "file" {
link, err = manager.premiumizemeClient.GenerateZippedFileLink(item.ID)
} else if item.Type == "folder" {
link, err = manager.premiumizemeClient.GenerateZippedFolderLink(item.ID)
} else {
log.Errorf("Item is not of type 'file' or 'folder' !! Can't download %s", item.Name)
return
}
if err != nil {
log.Error("Error generating download link: %s", err)
manager.removeDownload(item.Name)
return
}
log.Trace("Downloading: ", link)

tempDir, err := manager.config.GetTempDir()
if err != nil {
log.Errorf("Could not create temp dir: %s", err)
manager.removeDownload(item.Name)
return
}
go func() {
log.Debug("Downloading: ", item.Name)
log.Tracef("%+v", item)
var link string
var err error
if item.Type == "file" {
link, err = manager.premiumizemeClient.GenerateZippedFileLink(item.ID)
} else if item.Type == "folder" {
link, err = manager.premiumizemeClient.GenerateZippedFolderLink(item.ID)
} else {
log.Errorf("Item is not of type 'file' or 'folder' !! Can't download %s", item.Name)
return
}
if err != nil {
log.Error("Error generating download link: %s", err)
manager.removeDownload(item.Name)
return
}
log.Trace("Downloading: ", link)

splitString := strings.Split(link, "/")
savePath := path.Join(tempDir, splitString[len(splitString)-1])
log.Trace("Downloading to: ", savePath)
tempDir, err := manager.config.GetTempDir()
if err != nil {
log.Errorf("Could not create temp dir: %s", err)
manager.removeDownload(item.Name)
return
}

out, err := os.Create(savePath)
if err != nil {
log.Errorf("Could not create save path: %s", err)
manager.removeDownload(item.Name)
return
}
defer out.Close()
splitString := strings.Split(link, "/")
savePath := path.Join(tempDir, splitString[len(splitString)-1])
log.Trace("Downloading to: ", savePath)

err = progress_downloader.DownloadFile(link, savePath, manager.downloadList[item.Name].ProgressDownloader)
out, err := os.Create(savePath)
if err != nil {
log.Errorf("Could not create save path: %s", err)
manager.removeDownload(item.Name)
return
}
defer out.Close()

if err != nil {
log.Errorf("Could not download file: %s", err)
manager.removeDownload(item.Name)
return
}
err = progress_downloader.DownloadFile(link, savePath, manager.downloadList[item.Name].ProgressDownloader)

log.Tracef("Unzipping %s to %s", savePath, downloadDirectory)
err = utils.Unzip(savePath, downloadDirectory)
if err != nil {
log.Errorf("Could not unzip file: %s", err)
manager.removeDownload(item.Name)
return
}
if err != nil {
log.Errorf("Could not download file: %s", err)
manager.removeDownload(item.Name)
return
}

log.Tracef("Removing zip %s from system", savePath)
err = os.RemoveAll(savePath)
if err != nil {
manager.removeDownload(item.Name)
log.Errorf("Could not remove zip: %s", err)
return
}
log.Tracef("Unzipping %s to %s", savePath, downloadDirectory)
err = utils.Unzip(savePath, downloadDirectory)
if err != nil {
log.Errorf("Could not unzip file: %s", err)
manager.removeDownload(item.Name)
return
}

err = manager.premiumizemeClient.DeleteFolder(item.ID)
if err != nil {
manager.removeDownload(item.Name)
log.Error("Error deleting folder on premiumuze.me: %s", err)
return
}
log.Tracef("Removing zip %s from system", savePath)
err = os.RemoveAll(savePath)
if err != nil {
manager.removeDownload(item.Name)
log.Errorf("Could not remove zip: %s", err)
return
}

err = manager.premiumizemeClient.DeleteFolder(item.ID)
if err != nil {
manager.removeDownload(item.Name)
log.Error("Error deleting folder on premiumuze.me: %s", err)
return
}

//Remove download entry from downloads map
manager.removeDownload(item.Name)
//Remove download entry from downloads map
manager.removeDownload(item.Name)
}()
}

0 comments on commit 3d67c6d

Please sign in to comment.