Upkeep for data directory
This commit is contained in:
@@ -76,9 +76,6 @@ func (t *TorrentManager) processFixers(instances []realdebrid.Torrent) {
|
|||||||
|
|
||||||
func (t *TorrentManager) removeExpiredFixers(instances []realdebrid.Torrent) {
|
func (t *TorrentManager) removeExpiredFixers(instances []realdebrid.Torrent) {
|
||||||
fixers := t.fixers.Keys()
|
fixers := t.fixers.Keys()
|
||||||
if len(fixers) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, fixerID := range fixers {
|
for _, fixerID := range fixers {
|
||||||
found := false
|
found := false
|
||||||
for _, instance := range instances {
|
for _, instance := range instances {
|
||||||
|
|||||||
@@ -137,8 +137,17 @@ func (t *TorrentManager) GetPath(file *File) string {
|
|||||||
|
|
||||||
/// torrent functions
|
/// torrent functions
|
||||||
|
|
||||||
|
func (t *TorrentManager) getTorrentFiles() mapset.Set[string] {
|
||||||
|
files, err := filepath.Glob("data/*.torrent_zurg")
|
||||||
|
if err != nil {
|
||||||
|
t.log.Warnf("Cannot get files in data directory: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return mapset.NewSet[string](files...)
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) writeTorrentToFile(torrent *Torrent) {
|
func (t *TorrentManager) writeTorrentToFile(torrent *Torrent) {
|
||||||
filePath := "data/" + torrent.Hash + ".json"
|
filePath := "data/" + torrent.Hash + ".torrent_zurg"
|
||||||
file, err := os.Create(filePath)
|
file, err := os.Create(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.log.Warnf("Cannot create file %s: %v", filePath, err)
|
t.log.Warnf("Cannot create file %s: %v", filePath, err)
|
||||||
@@ -163,7 +172,7 @@ func (t *TorrentManager) writeTorrentToFile(torrent *Torrent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) readTorrentFromFile(hash string) *Torrent {
|
func (t *TorrentManager) readTorrentFromFile(hash string) *Torrent {
|
||||||
filePath := "data/" + hash + ".json"
|
filePath := "data/" + hash + ".torrent_zurg"
|
||||||
file, err := os.Open(filePath)
|
file, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
@@ -190,7 +199,7 @@ func (t *TorrentManager) readTorrentFromFile(hash string) *Torrent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) deleteTorrentFile(hash string) {
|
func (t *TorrentManager) deleteTorrentFile(hash string) {
|
||||||
filePath := "data/" + hash + ".json"
|
filePath := "data/" + hash + ".torrent_zurg"
|
||||||
err := os.Remove(filePath)
|
err := os.Remove(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.log.Warnf("Cannot delete file %s: %v", filePath, err)
|
t.log.Warnf("Cannot delete file %s: %v", filePath, err)
|
||||||
@@ -201,8 +210,17 @@ func (t *TorrentManager) deleteTorrentFile(hash string) {
|
|||||||
|
|
||||||
/// info functions
|
/// info functions
|
||||||
|
|
||||||
|
func (t *TorrentManager) getInfoFiles() mapset.Set[string] {
|
||||||
|
files, err := filepath.Glob("data/*.info_zurg")
|
||||||
|
if err != nil {
|
||||||
|
t.log.Warnf("Cannot get files in data directory: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return mapset.NewSet[string](files...)
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) writeInfoToFile(info *realdebrid.TorrentInfo) {
|
func (t *TorrentManager) writeInfoToFile(info *realdebrid.TorrentInfo) {
|
||||||
filePath := "data/" + info.ID + ".info"
|
filePath := "data/" + info.ID + ".info_zurg"
|
||||||
file, err := os.Create(filePath)
|
file, err := os.Create(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.log.Warnf("Cannot create info file %s: %v", filePath, err)
|
t.log.Warnf("Cannot create info file %s: %v", filePath, err)
|
||||||
@@ -225,7 +243,7 @@ func (t *TorrentManager) writeInfoToFile(info *realdebrid.TorrentInfo) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) readInfoFromFile(torrentID string) *realdebrid.TorrentInfo {
|
func (t *TorrentManager) readInfoFromFile(torrentID string) *realdebrid.TorrentInfo {
|
||||||
filePath := "data/" + torrentID + ".info"
|
filePath := "data/" + torrentID + ".info_zurg"
|
||||||
file, err := os.Open(filePath)
|
file, err := os.Open(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
@@ -246,7 +264,7 @@ func (t *TorrentManager) readInfoFromFile(torrentID string) *realdebrid.TorrentI
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) deleteInfoFile(torrentID string) {
|
func (t *TorrentManager) deleteInfoFile(torrentID string) {
|
||||||
filePath := "data/" + torrentID + ".info"
|
filePath := "data/" + torrentID + ".info_zurg"
|
||||||
err := os.Remove(filePath)
|
err := os.Remove(filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.log.Warnf("Cannot delete info file %s: %v", filePath, err)
|
t.log.Warnf("Cannot delete info file %s: %v", filePath, err)
|
||||||
|
|||||||
@@ -39,8 +39,28 @@ func (t *TorrentManager) refreshTorrents(isInitialRun bool) []string {
|
|||||||
|
|
||||||
var updatedPaths []string
|
var updatedPaths []string
|
||||||
noInfoCount := 0
|
noInfoCount := 0
|
||||||
|
|
||||||
allTorrents, _ := t.DirectoryMap.Get(INT_ALL)
|
allTorrents, _ := t.DirectoryMap.Get(INT_ALL)
|
||||||
freshAccessKeys := mapset.NewSet[string]()
|
freshAccessKeys := mapset.NewSet[string]()
|
||||||
|
|
||||||
|
allHashes := mapset.NewSet[string]()
|
||||||
|
t.getTorrentFiles().Each(func(path string) bool {
|
||||||
|
path = filepath.Base(path)
|
||||||
|
hash := strings.TrimSuffix(path, ".torrent_zurg")
|
||||||
|
allHashes.Add(hash)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
freshHashes := mapset.NewSet[string]()
|
||||||
|
|
||||||
|
allIDs := mapset.NewSet[string]()
|
||||||
|
t.getInfoFiles().Each(func(path string) bool {
|
||||||
|
path = filepath.Base(path)
|
||||||
|
torrentID := strings.TrimSuffix(path, ".info_zurg")
|
||||||
|
allIDs.Add(torrentID)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
freshIDs := mapset.NewSet[string]()
|
||||||
|
|
||||||
for torrent := range torChan {
|
for torrent := range torChan {
|
||||||
if torrent == nil {
|
if torrent == nil {
|
||||||
noInfoCount++
|
noInfoCount++
|
||||||
@@ -54,6 +74,8 @@ func (t *TorrentManager) refreshTorrents(isInitialRun bool) []string {
|
|||||||
}
|
}
|
||||||
accessKey := t.GetKey(torrent)
|
accessKey := t.GetKey(torrent)
|
||||||
freshAccessKeys.Add(accessKey)
|
freshAccessKeys.Add(accessKey)
|
||||||
|
freshHashes.Add(torrent.Hash)
|
||||||
|
freshIDs.Add(tInfo.ID)
|
||||||
|
|
||||||
// update allTorrents
|
// update allTorrents
|
||||||
isNewID := false
|
isNewID := false
|
||||||
@@ -77,8 +99,13 @@ func (t *TorrentManager) refreshTorrents(isInitialRun bool) []string {
|
|||||||
|
|
||||||
updatedPaths = append(updatedPaths, fmt.Sprintf("%s/%s", directory, accessKey))
|
updatedPaths = append(updatedPaths, fmt.Sprintf("%s/%s", directory, accessKey))
|
||||||
})
|
})
|
||||||
|
// write torrent to file
|
||||||
|
if !allHashes.Contains(mainTorrent.Hash) {
|
||||||
|
t.writeTorrentToFile(mainTorrent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// removed torrents
|
// removed torrents
|
||||||
allAccessKeys := mapset.NewSet[string](allTorrents.Keys()...)
|
allAccessKeys := mapset.NewSet[string](allTorrents.Keys()...)
|
||||||
allAccessKeys.Difference(freshAccessKeys).Each(func(accessKey string) bool {
|
allAccessKeys.Difference(freshAccessKeys).Each(func(accessKey string) bool {
|
||||||
@@ -88,6 +115,18 @@ func (t *TorrentManager) refreshTorrents(isInitialRun bool) []string {
|
|||||||
|
|
||||||
t.log.Infof("Compiled into %d torrents, %d were missing info", allTorrents.Count(), noInfoCount)
|
t.log.Infof("Compiled into %d torrents, %d were missing info", allTorrents.Count(), noInfoCount)
|
||||||
|
|
||||||
|
// data directory cleanup
|
||||||
|
allHashes.Difference(freshHashes).Each(func(hash string) bool {
|
||||||
|
t.log.Infof("Deleting stale torrent file %s", hash)
|
||||||
|
t.deleteTorrentFile(hash)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
allIDs.Difference(freshIDs).Each(func(id string) bool {
|
||||||
|
t.log.Infof("Deleting stale info file %s", id)
|
||||||
|
t.deleteInfoFile(id)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
if t.Config.EnableRepair() {
|
if t.Config.EnableRepair() {
|
||||||
if isInitialRun {
|
if isInitialRun {
|
||||||
t.removeExpiredFixers(instances)
|
t.removeExpiredFixers(instances)
|
||||||
@@ -136,6 +175,7 @@ func (t *TorrentManager) getMoreInfo(rdTorrent realdebrid.Torrent) *Torrent {
|
|||||||
diskTor := t.readTorrentFromFile(rdTorrent.Hash)
|
diskTor := t.readTorrentFromFile(rdTorrent.Hash)
|
||||||
if diskTor != nil {
|
if diskTor != nil {
|
||||||
if diskInfo, ok := diskTor.Components[rdTorrent.ID]; ok && diskInfo.Progress == 100 {
|
if diskInfo, ok := diskTor.Components[rdTorrent.ID]; ok && diskInfo.Progress == 100 {
|
||||||
|
diskTor.Components = map[string]*realdebrid.TorrentInfo{rdTorrent.ID: diskInfo}
|
||||||
return diskTor
|
return diskTor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -473,6 +473,9 @@ func (t *TorrentManager) canCapacityHandle() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) markAsUnplayable(torrent *Torrent, reason string) {
|
func (t *TorrentManager) markAsUnplayable(torrent *Torrent, reason string) {
|
||||||
|
if torrent.State.Is("unplayable") {
|
||||||
|
return
|
||||||
|
}
|
||||||
t.log.Warnf("Marking torrent %s as unplayable - %s", t.GetKey(torrent), reason)
|
t.log.Warnf("Marking torrent %s as unplayable - %s", t.GetKey(torrent), reason)
|
||||||
err := torrent.State.Event(context.Background(), "mark_as_unplayable")
|
err := torrent.State.Event(context.Background(), "mark_as_unplayable")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user