package torrent import ( "github.com/debridmediamanager/zurg/pkg/realdebrid" ) type LibraryState struct { TotalCount int ActiveCount int FirstTorrent *realdebrid.Torrent FirstActiveTorrent *realdebrid.Torrent } func (ls LibraryState) equal(a LibraryState) bool { if a.TotalCount != ls.TotalCount || a.ActiveCount != ls.ActiveCount { return false } if (ls.FirstTorrent == nil) != (a.FirstTorrent == nil) { return false } if ls.FirstTorrent != nil && (ls.FirstTorrent.ID != a.FirstTorrent.ID || ls.FirstTorrent.Status != a.FirstTorrent.Status) { return false } if (ls.FirstActiveTorrent == nil) != (a.FirstActiveTorrent == nil) { return false } if ls.FirstActiveTorrent != nil && (ls.FirstActiveTorrent.ID != a.FirstActiveTorrent.ID || ls.FirstActiveTorrent.Status != a.FirstActiveTorrent.Status) { return false } return true } func (t *TorrentManager) SetNewLatestState(checksum LibraryState) { t.latestState.ActiveCount = checksum.ActiveCount t.latestState.TotalCount = checksum.TotalCount t.latestState.FirstTorrent = checksum.FirstTorrent t.latestState.FirstActiveTorrent = checksum.FirstActiveTorrent } type torrentsResp struct { torrents []realdebrid.Torrent totalCount int } // generates a checksum based on the number of torrents, the first torrent id and the number of active torrents func (t *TorrentManager) getCurrentState() LibraryState { torrentChan := make(chan torrentsResp, 1) activeChan := make(chan torrentsResp, 1) countChan := make(chan int, 1) errChan := make(chan error, 3) // accommodate errors from all goroutines defer close(torrentChan) defer close(activeChan) defer close(countChan) defer close(errChan) _ = t.workerPool.Submit(func() { torrents, totalCount, err := t.Api.GetTorrents(1, false) if err != nil { errChan <- err return } torrentChan <- torrentsResp{torrents: torrents, totalCount: totalCount} }) _ = t.workerPool.Submit(func() { torrents, totalCount, err := t.Api.GetTorrents(1, true) if err != nil { errChan <- err return } activeChan <- torrentsResp{torrents: torrents, totalCount: totalCount} }) _ = t.workerPool.Submit(func() { count, err := t.Api.GetActiveTorrentCount() if err != nil { errChan <- err return } countChan <- count.DownloadingCount }) var first, active *realdebrid.Torrent var totalCount, count int for i := 0; i < 3; i++ { select { case firstResp := <-torrentChan: if len(firstResp.torrents) > 0 { first = &firstResp.torrents[0] } totalCount = firstResp.totalCount case activeResp := <-activeChan: if len(activeResp.torrents) > 0 { active = &activeResp.torrents[0] } case count = <-countChan: case err := <-errChan: t.log.Warnf("Checksum API Error: %v", err) return LibraryState{} } } return LibraryState{ TotalCount: totalCount, ActiveCount: count, FirstTorrent: first, FirstActiveTorrent: active, } }