218 lines
5.9 KiB
Python
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() |