mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-03-31 17:10:29 +02:00
79 lines
1.3 KiB
Go
79 lines
1.3 KiB
Go
package gobackend
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"sync"
|
|
)
|
|
|
|
// ErrDownloadCancelled is returned when a download is cancelled by the user.
|
|
var ErrDownloadCancelled = errors.New("download cancelled")
|
|
|
|
type cancelEntry struct {
|
|
cancel context.CancelFunc
|
|
canceled bool
|
|
}
|
|
|
|
var (
|
|
cancelMu sync.Mutex
|
|
cancelMap = make(map[string]*cancelEntry)
|
|
)
|
|
|
|
func initDownloadCancel(itemID string) context.Context {
|
|
if itemID == "" {
|
|
return context.Background()
|
|
}
|
|
|
|
cancelMu.Lock()
|
|
defer cancelMu.Unlock()
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
cancelMap[itemID] = &cancelEntry{
|
|
cancel: cancel,
|
|
canceled: false,
|
|
}
|
|
return ctx
|
|
}
|
|
|
|
func cancelDownload(itemID string) {
|
|
if itemID == "" {
|
|
return
|
|
}
|
|
|
|
cancelMu.Lock()
|
|
entry, ok := cancelMap[itemID]
|
|
if ok {
|
|
entry.canceled = true
|
|
if entry.cancel != nil {
|
|
entry.cancel()
|
|
}
|
|
} else {
|
|
cancelMap[itemID] = &cancelEntry{canceled: true}
|
|
}
|
|
cancelMu.Unlock()
|
|
|
|
RemoveItemProgress(itemID)
|
|
}
|
|
|
|
func isDownloadCancelled(itemID string) bool {
|
|
if itemID == "" {
|
|
return false
|
|
}
|
|
|
|
cancelMu.Lock()
|
|
entry, ok := cancelMap[itemID]
|
|
canceled := ok && entry.canceled
|
|
cancelMu.Unlock()
|
|
return canceled
|
|
}
|
|
|
|
func clearDownloadCancel(itemID string) {
|
|
if itemID == "" {
|
|
return
|
|
}
|
|
|
|
cancelMu.Lock()
|
|
delete(cancelMap, itemID)
|
|
cancelMu.Unlock()
|
|
}
|