import sys
import os
#from cStringIO import StringIO
#from traceback import print_exc
from Utility.configreader import ConfigReader
from Utility.constants import *#IGNORE:W0611
################################################################
#
# Class: TorrentConfig
#
# Handles reading and writing information about this torrent
# to the torrent.list file.
#
################################################################
class TorrentConfig(ConfigReader):
def __init__(self, torrent):
self.torrent = torrent
self.utility = torrent.utility
basepath = os.path.join(self.utility.getConfigPath(), "torrentinfo")
self.filename = os.path.split(self.torrent.src)[1] + ".info"
configpath = os.path.join(basepath, self.filename)
ConfigReader.__init__(self, configpath, "TorrentInfo")
self.writeflags = { "src": False,
"basicinfo": False,
"status": False,
"priority": False,
"filepriorities": False,
"fileprogress": False,
"progress": False,
"uploadparams": False,
"nameparams": False,
"seedtime": False }
def writeAll(self):
for key in self.writeflags:
self.writeflags[key] = True
self.DeleteGroup()
self.writeSrc(False)
self.writeBasicInfo(False)
self.writeStatus(False)
self.writePriority(False)
self.writeFilePriorities(False)
self.writeProgress(False)
self.writeUploadParams(False)
self.writeNameParams(False)
self.writeSeedTime(False)
self.writeFileProgress(False)
self.Flush()
def writeSrc(self, clearOld = True):
if clearOld:
if self.writeflags["src"]:
return
torrent = self.torrent
overallchange = False
# Write torrent information
filename = os.path.split(torrent.src)[1]
index = str(self.torrent.listindex)
change = self.utility.torrentconfig.Write(index, "\"" + filename + "\"")
if change:
overallchange = True
if clearOld and overallchange:
self.utility.torrentconfig.Flush()
self.writeflags["src"] = False
return overallchange
def writeBasicInfo(self, clearOld = True):
if clearOld:
if self.writeflags["basicinfo"]:
return
torrent = self.torrent
overallchange = False
change = self.Write("dest", torrent.files.dest)
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["basicinfo"] = False
return overallchange
def writeNameParams(self, clearOld = True):
if clearOld:
if self.writeflags["nameparams"]:
return
torrent = self.torrent
overallchange = False
# Write settings for name if available
title = torrent.title
if title is not None:
if title == "":
title = " "
change = self.Write("title", title)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("title")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["nameparams"] = False
return overallchange
def writeUploadParams(self, clearOld = True):
if clearOld:
if self.writeflags["uploadparams"]:
return
torrent = self.torrent
overallchange = False
# Write settings for local upload rate if available
localmax = torrent.connection.getLocalRate("up")
if localmax != 0:
change = self.Write("localmax", localmax)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("localmax")
if change:
overallchange = True
localmaxdown = torrent.connection.getLocalRate("down")
if localmaxdown != 0:
change = self.Write("localmaxdown", localmaxdown)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("localmaxdown")
if change:
overallchange = True
maxupload = torrent.connection.getMaxUpload(localonly = True)
if maxupload is not None:
change = self.Write("maxupload", maxupload)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("maxupload")
if change:
overallchange = True
for param in torrent.connection.seedoptions:
value = torrent.connection.getSeedOption(param, localonly = True)
if value is not None:
change = self.Write(param, value)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry(param)
if change:
overallchange = True
if not torrent.connection.timeout:
change = self.Write("timeout", "0")
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("timeout")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["uploadparams"] = False
return overallchange
def writeProgress(self, clearOld = True):
if clearOld:
if self.writeflags["progress"]:
return
torrent = self.torrent
overallchange = False
change = self.Write("downsize", ('%.0f' % torrent.files.downsize))
if change:
overallchange = True
change = self.Write("upsize", ('%.0f' % torrent.files.upsize))
if change:
overallchange = True
change = self.Write("progress", ('%.1f' % torrent.files.progress))
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["progress"] = False
return overallchange
def writeStatus(self, clearOld = True):
if clearOld:
if self.writeflags["status"]:
return
torrent = self.torrent
overallchange = False
value = torrent.status.value
oldvalue = torrent.actions.oldstatus
if oldvalue is None:
oldvalue = 0
if (value == STATUS_FINISHED
or (value == STATUS_HASHCHECK and oldvalue == STATUS_FINISHED)):
status = 2 # Torrent is finished
elif value == STATUS_STOP:
status = 1 # Torrent is stopped
else:
status = 0 # Torrent is queued
if status != 0:
change = self.Write("statusvalue", status)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("statusvalue")
if change:
overallchange = True
if torrent.status.completed:
change = self.Write("complete", "1")
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("complete")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["status"] = False
return overallchange
def writePriority(self, clearOld = True):
if clearOld:
if self.writeflags["priority"]:
return
torrent = self.torrent
overallchange = False
change = self.Write("prio", torrent.prio)
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["priority"] = False
return overallchange
def writeSeedTime(self, clearOld = True):
if clearOld:
if self.writeflags["seedtime"]:
return
torrent = self.torrent
overallchange = False
if torrent.connection.seedingtime > 0:
change = self.Write("seedtime", int(torrent.connection.seedingtime))
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("seedtime")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["seedtime"] = False
return overallchange
def writeFilePriorities(self, clearOld = True):
if clearOld:
if self.writeflags["filepriorities"]:
return
torrent = self.torrent
overallchange = False
if not self.torrent.files.isFile():
notdefault, text = torrent.files.getFilePrioritiesAsString()
if notdefault:
change = self.Write("fileprio", text)
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("fileprio")
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("fileprio")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["filepriorities"] = False
return overallchange
def writeFileProgress(self, clearOld = True):
if clearOld:
if self.writeflags["fileprogress"]:
return
torrent = self.torrent
overallchange = False
if not torrent.files.isFile():
change = self.Write("fileprogress", torrent.files.fileprogress, "bencode-list")
if change:
overallchange = True
elif clearOld:
change = self.DeleteEntry("fileprogress")
if change:
overallchange = True
if clearOld and overallchange:
self.Flush()
self.writeflags["fileprogress"] = False
return overallchange
def readAll(self):
torrent = self.torrent
# Download size
downsize = self.Read("downsize")
if downsize != "":
try:
torrent.files.downsize = float(downsize)
except:
pass
# Upload size
upsize = self.Read("upsize")
if upsize != "":
try:
torrent.files.upsize = float(upsize)
except:
pass
# Status
# Format from earlier 2.7.0 builds:
status = self.Read("status")
if status == "completed":
torrent.status.completed = True
elif status == "pause":
torrent.status.value = STATUS_STOP
status = self.Read("statusvalue")
if status == "2":
torrent.status.value = STATUS_FINISHED
elif status == "1":
torrent.status.value = STATUS_STOP
complete = self.Read("complete", "boolean")
if complete:
torrent.status.completed = True
# Priority
prio = self.Read("prio")
if prio != "":
try:
torrent.prio = int(prio)
except:
pass
# File priorities
fileprio = self.Read("fileprio")
if fileprio != "":
filepriorities = fileprio.split(",")
# Just in case there's a mismatch in sizes,
# don't try to get more values than exist
# in the source or destination arrays
len1 = len(filepriorities)
len2 = len(torrent.files.filepriorities)
rangeEnd = min(len1, len2)
for i in range(rangeEnd):
try:
torrent.files.filepriorities[i] = int(filepriorities[i])
except:
pass
# File progress
fileprogress = self.Read("fileprogress", "bencode-list")
if fileprogress != []:
self.torrent.files.fileprogress = fileprogress
#name
title = self.Read("title")
if title != "":
torrent.title = title
# Progress
if torrent.status.completed or torrent.status.value == STATUS_FINISHED:
torrent.files.progress = 100.0
else:
progress = self.Read("progress")
if progress != "":
try:
torrent.files.progress = float(progress)
except:
pass
# Local upload options
localmax = self.Read("localmax", "int")
if localmax != 0:
torrent.connection.maxlocalrate['up'] = localmax
localmaxdown = self.Read("localmaxdown", "int")
if localmaxdown != 0:
torrent.connection.maxlocalrate['down'] = localmaxdown
maxupload = self.Read("maxupload", "int")
torrent.connection.setMaxUpload(maxupload)
for param in torrent.connection.seedoptions:
value = self.Read(param)
if value != "":
torrent.connection.seedoptions[param] = value
timeout = self.Read("timeout")
if timeout == "0":
torrent.connection.timeout = False
seedtime = self.Read("seedtime")
if seedtime != "":
try:
torrent.connection.seedingtime = int(seedtime)
torrent.connection.seedingtimeleft -= torrent.connection.seedingtime
except:
pass
|