More nosql

This commit is contained in:
Ruud
2014-02-02 20:41:14 +01:00
parent 63743dd2b6
commit 99252074be
82 changed files with 643 additions and 715 deletions
+16
View File
@@ -0,0 +1,16 @@
from CodernityDB.hash_index import HashIndex
from hashlib import md5
class QualityIndex(HashIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s'
super(QualityIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return md5(key).hexdigest()
def make_key_value(self, data):
if data.get('_t') == 'quality' and data.get('identifier'):
return md5(data.get('identifier')).hexdigest(), None
+51 -55
View File
@@ -1,15 +1,14 @@
import traceback
from couchpotato import get_session
from couchpotato import get_session, get_db
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent
from couchpotato.core.helpers.encoding import toUnicode, ss
from couchpotato.core.helpers.variable import mergeDicts, getExt
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Quality, Profile, ProfileType
from sqlalchemy.sql.expression import or_
from couchpotato.core.plugins.quality.index import QualityIndex
from couchpotato.core.settings.model import Quality
import re
import time
log = CPLog(__name__)
@@ -39,6 +38,7 @@ class QualityPlugin(Plugin):
addEvent('quality.single', self.single)
addEvent('quality.guess', self.guess)
addEvent('quality.pre_releases', self.preReleases)
addEvent('quality.order', self.getOrder)
addApiView('quality.size.save', self.saveSize)
addApiView('quality.list', self.allView, docs = {
@@ -50,9 +50,31 @@ class QualityPlugin(Plugin):
})
addEvent('app.initialize', self.fill, priority = 10)
addEvent('database.setup', self.databaseSetup)
addEvent('app.test', self.doTest)
self.addOrder()
def addOrder(self):
self.order = []
for q in self.qualities:
self.order.append(q.get('identifier'))
def getOrder(self):
return self.order
def databaseSetup(self):
db = get_db()
# Quality index
try:
db.add_index(QualityIndex(db.path, 'quality'))
except:
log.debug('Index already exists')
db.edit_index(QualityIndex(db.path, 'quality'))
def preReleases(self):
return self.pre_releases
@@ -68,30 +90,29 @@ class QualityPlugin(Plugin):
if self.cached_qualities:
return self.cached_qualities
db = get_session()
db = get_db()
qualities = db.query(Quality).all()
qualities = db.all('quality', with_doc = True)
temp = []
for quality in qualities:
q = mergeDicts(self.getQuality(quality.identifier), quality.to_dict())
quality = quality['doc']
q = mergeDicts(self.getQuality(quality.get('identifier')), quality)
temp.append(q)
self.cached_qualities = temp
pass #db.close()
return temp
def single(self, identifier = ''):
db = get_session()
db = get_db()
quality_dict = {}
quality = db.query(Quality).filter(or_(Quality.identifier == identifier, Quality.id == identifier)).first()
quality = db.get('quality', identifier, with_doc = True)['doc']
if quality:
quality_dict = dict(self.getQuality(quality.identifier), **quality.to_dict())
quality_dict = mergeDicts(self.getQuality(quality['identifier']), quality)
pass #db.close()
return quality_dict
def getQuality(self, identifier):
@@ -128,60 +149,35 @@ class QualityPlugin(Plugin):
def fill(self):
try:
db = get_session()
db = get_db()
order = 0
for q in self.qualities:
# Create quality
qual = db.query(Quality).filter_by(identifier = q.get('identifier')).first()
db.insert({
'_t': 'quality',
'order': order,
'identifier': q.get('identifier'),
'size_min': q.get('size')[0],
'size_max': q.get('size')[1]
})
if not qual:
log.info('Creating quality: %s', q.get('label'))
qual = Quality()
qual.order = order
qual.identifier = q.get('identifier')
qual.label = toUnicode(q.get('label'))
qual.size_min, qual.size_max = q.get('size')
db.add(qual)
# Create single quality profile
prof = db.query(Profile).filter(
Profile.core == True
).filter(
Profile.types.any(quality = qual)
).all()
if not prof:
log.info('Creating profile: %s', q.get('label'))
prof = Profile(
core = True,
label = toUnicode(qual.label),
order = order
)
db.add(prof)
profile_type = ProfileType(
quality = qual,
profile = prof,
finish = True,
order = 0
)
prof.types.append(profile_type)
log.info('Creating profile: %s', q.get('label'))
db.insert({
'_t': 'profile',
'order': order + 20, # Make sure it goes behind other profiles
'core': True,
'qualities': [q.get('identifier')],
'label': toUnicode(q.get('label')),
'finish': [True],
'wait_for': [0],
})
order += 1
db.commit()
time.sleep(0.3) # Wait a moment
return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return False