ipodderx-core/iPXQuotaManager.py

218 lines
5.9 KiB
Python

#(c) 2004-2008 Thunderstone Media, LLC
#Creative Commons Attribution-Noncommercial 3.0 United States License
#
#Python Developyment By:
#
#Ray Slakinski
#August Trometer
import iPXSettings
from iPXTools import *
from types import *
class iPXError(Exception): pass
class OutOfRangeError(iPXError): pass
class NotIntegerError(iPXError): pass
def qmCacheCreate():
import iPXClass
printMSG('Creating SmartSpace Cache File...')
try:
feedsObj = iPXClass.Feeds()
feedsObj.createQMCacheBridge()
except Exception, msg:
logIt('Create qmcache.dat failed...')
logIt('ERRMSG: ' + str(msg))
def writeQuotaCache(feedID, guid, enc, encSize):
import os, pickle
rec = [feedID, guid, enc, encSize]
cacheFile = iPXSettings.rssPath + 'qmcache.dat'
cacheData = []
if os.path.isfile(cacheFile):
cacheData = pickle.load(open(cacheFile))
cacheData.append(rec)
pickle.dump(cacheData, open(cacheFile,'w'))
else:
cacheData = [rec]
pickle.dump(cacheData, open(cacheFile,'w'))
def remCacheItem(enc):
import os, pickle
cacheFile = iPXSettings.rssPath + 'qmcache.dat'
checkDir(iPXSettings.tempDir + '/iPXCache/')
dailyCacheFile = iPXSettings.tempDir + '/iPXCache/qmcache-' + strftime('%m%d%Y',localtime()) + '.dat'
if os.path.isfile(cacheFile):
cacheData = pickle.load(open(cacheFile))
delList = []
enc = enc.replace(iPXSettings.downloadDirectory + '/', '')
for rec in cacheData:
if enc in rec[2]:
delList.append(rec)
logIt('Removing qmcache.dat record: ' + str(rec))
for rec in delList:
cacheData.remove(rec)
pickle.dump(cacheData, open(cacheFile,'w'))
if os.path.isfile(dailyCacheFile):
delList = []
dailyCacheItems = pickle.load(open(dailyCacheFile))
for item in dailyCacheItems:
if enc in item:
delList.append(item)
for rec in delList:
dailyCacheItems.remove(rec)
pickle.dump(dailyCacheItems, open(dailyCacheFile,'w'))
def readQuotaCache():
import os, pickle
cacheFile = iPXSettings.rssPath + 'qmcache.dat'
cacheData = []
if os.path.isfile(cacheFile):
cacheData = pickle.load(open(cacheFile))
return cacheData
def getAllowedDelList():
import os, iPXClass, pickle
sizeTaken = 0
allowList = []
tempAllowList = {}
finalAllowList = []
checkDir(iPXSettings.tempDir + '/iPXCache/')
dailyCacheFie = iPXSettings.tempDir + '/iPXCache/qmcache-' + strftime('%m%d%Y',localtime()) + '.dat'
if not os.path.isfile(iPXSettings.rssPath + 'qmcache.dat'):
qmCacheCreate()
if not os.path.isfile(dailyCacheFie):
cacheList = readQuotaCache()
logIt('Number of items in qmcache.dat file: ' + str(len(cacheList)))
feedsObj = iPXClass.Feeds()
for cacheItem in cacheList:
sizeTaken = sizeTaken + int(cacheItem[3])
hashFile = iPXSettings.rssPath + 'feedData/' + cacheItem[0] + '.ipxd'
if os.path.isfile(hashFile):
try:
EntriesData = plistlib.Plist.fromFile(file(hashFile))
if EntreiesData.has_key('entries'):
for entry in EntriesData['entries']:
if entry.guid == cacheItem[1]:
if entry.has_key('read'):
if entry['read'] == True:
if entry.has_key('flagged'):
if entry['flagged'] == False:
allowList.append(cacheItem[2])
else:
allowList.append(cacheItem[2])
else:
allowList.append(cacheItem[2])
except Exception, msg:
logIt('getAllowedDelList failed...')
logIt('ERRMSG: ' + str(msg))
else:
allowList.append(cacheItem[2])
pickle.dump(allowList, open(dailyCacheFie,'w'))
else:
allowList = pickle.load(open(dailyCacheFie))
counter = 0
for enc in allowList:
encFile = os.path.join(iPXSettings.downloadDirectory + '/' + enc)
if os.path.isfile(encFile):
fileCreateTime = os.path.getmtime(encFile)
tempAllowList[fileCreateTime + counter] = encFile
sizeTaken = sizeTaken + os.path.getsize(encFile)
counter = counter + 1
else:
remCacheItem(enc)
keys = tempAllowList.keys()
keys.sort()
for key in keys:
finalAllowList.append(tempAllowList[key])
logIt('Number of items in final del allow list: ' + str(len(finalAllowList)))
return finalAllowList, sizeTaken
def getToQuota(size):
import os, shutil, sys
if size == '':
size = 0
elif size == None:
size = 0
elif type(size) == str:
try:
size = long(size)
except Exception, msg:
logIt('getToQuota size error: ' + str(msg))
logIt('Size = ' + str(size))
size = 0
elif size < 0:
raise OutOfRangeError, 'number out of range (must be positive whole number)'
if len(iPXSettings.delList) > 0:
plusSize = 1048576 * 50
size = long(size) + plusSize
logIt('QM: ' + str(iPXSettings.quotaSize))
logIt('QM: ' + str(size))
logIt('QM: =============')
logIt('QM: ' + str(iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size)))
if (iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size)) <= 0:
for enc in iPXSettings.delList:
if os.path.isfile(enc):
logIt('QM: Removing "' + enc + '"')
remCacheItem(enc)
iPXSettings.quotaSizeTaken = iPXSettings.quotaSizeTaken - long(os.path.getsize(enc))
logIt('quotaSizeTaken: ' + str(iPXSettings.quotaSizeTaken))
if sys.platform == 'darwin':
encNameSplit = enc.split('/')
encName = encNameSplit[len(encNameSplit)-1]
shutil.move(enc, iPXSettings.userPath + '/.Trash/' + encName)
elif sys.platform == 'win32':
os.unlink(enc)
if (iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size)) > 0:
iPXSettings.quotaSizeTaken = iPXSettings.quotaSizeTaken + size
break
else:
logIt('QM: delList holds ' + str(len(iPXSettings.delList)) + ' files, no action taken')
def main():
import sys
iPXSettings.initSettings()
iPXSettings.DEBUG = 1
iPXSettings.delList, iPXSettings.sizeTaken = getAllowedDelList()
size = 0
try:
size = sys.argv[1]
except:
printMSG('Please secify a whole number ')
sys.exit(0)
try:
size = long(size)
except Exception, msg:
printMSG('Invalid param "' + str(size) + '", please use a whole number')
sys.exit(0)
getToQuota(size)
if __name__ == '__main__':
main()