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
+22 -8
View File
@@ -5,15 +5,15 @@ from CodernityDB.tree_index import TreeBasedIndex
class ReleaseIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '16s'
kwargs['key_format'] = '32s'
super(ReleaseIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return md5(key).digest()
return md5(key).hexdigest()
def make_key_value(self, data):
if data.get('type') == 'release' and data.get('media_id'):
return md5(data['media_id']).digest(), {'media_id': data.get('media_id')}
if data.get('_t') == 'release' and data.get('media_id'):
return md5(data['media_id']).hexdigest(), {'media_id': data.get('media_id')}
def run_for_media(self, db, media_id):
for release in db.get_many('release', media_id, with_doc = True):
@@ -31,12 +31,26 @@ class ReleaseIndex(TreeBasedIndex):
class ReleaseStatusIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '16s'
kwargs['key_format'] = '32s'
super(ReleaseStatusIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return md5(key).digest()
return md5(key).hexdigest()
def make_key_value(self, data):
if data.get('type') == 'release' and data.get('status'):
return md5(data.get('status')).digest(), None
if data.get('_t') == 'release' and data.get('status'):
return md5(data.get('status')).hexdigest(), None
class ReleaseIDIndex(TreeBasedIndex):
def __init__(self, *args, **kwargs):
kwargs['key_format'] = '32s'
super(ReleaseIDIndex, self).__init__(*args, **kwargs)
def make_key(self, key):
return md5(key).hexdigest()
def make_key_value(self, data):
if data.get('_t') == 'release' and data.get('identifier'):
return md5(data.get('identifier')).hexdigest(), None
+41 -54
View File
@@ -5,7 +5,7 @@ from couchpotato.core.helpers.encoding import ss, toUnicode
from couchpotato.core.helpers.variable import getTitle
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from .index import ReleaseIndex, ReleaseStatusIndex
from .index import ReleaseIndex, ReleaseStatusIndex, ReleaseIDIndex
from couchpotato.core.plugins.scanner.main import Scanner
from couchpotato.core.settings.model import Release as Relea, Media, \
ReleaseInfo
@@ -61,7 +61,7 @@ class Release(Plugin):
addEvent('database.setup', self.databaseSetup)
# Clean releases that didn't have activity in the last week
addEvent('app.load2', self.cleanDone)
addEvent('app.load', self.cleanDone)
fireEvent('schedule.interval', 'movie.clean_releases', self.cleanDone, hours = 4)
def databaseSetup(self):
@@ -82,6 +82,13 @@ class Release(Plugin):
log.debug('Index already exists')
db.edit_index(ReleaseStatusIndex(db.path, 'release_status'))
# Release identifier index
try:
db.add_index(ReleaseIDIndex(db.path, 'release_identifier'))
except:
log.debug('Index already exists')
db.edit_index(ReleaseIDIndex(db.path, 'release_identifier'))
def cleanDone(self):
log.debug('Removing releases from dashboard')
@@ -112,7 +119,7 @@ class Release(Plugin):
try:
db = get_session()
identifier = '%s.%s.%s' % (group['library']['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier'])
identifier = '%s.%s.%s' % (group['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier'])
# Add movie
media = db.query(Media).filter_by(library_id = group['library'].get('id')).first()
@@ -120,7 +127,7 @@ class Release(Plugin):
media = Media(
library_id = group['library'].get('id'),
profile_id = 0,
status_id = done_status.get('id')
status = 'done'
)
db.add(media)
db.commit()
@@ -129,7 +136,7 @@ class Release(Plugin):
rel = db.query(Relea).filter(
or_(
Relea.identifier == identifier,
and_(Relea.identifier.startswith(group['library']['identifier']), Relea.status_id == snatched_status.get('id'))
and_(Relea.identifier.startswith(group['identifier']), Relea.status == 'snatched')
)
).first()
if not rel:
@@ -137,7 +144,7 @@ class Release(Plugin):
identifier = identifier,
movie = media,
quality_id = group['meta_data']['quality'].get('id'),
status_id = done_status.get('id')
status = 'done'
)
db.add(rel)
db.commit()
@@ -246,11 +253,6 @@ class Release(Plugin):
# Get matching provider
provider = fireEvent('provider.belongs_to', item['url'], provider = item.get('provider'), single = True)
# Backwards compatibility code
if not item.get('protocol'):
item['protocol'] = item['type']
item['type'] = 'movie'
if item.get('protocol') != 'torrent_magnet':
item['download'] = provider.loginDownload if provider.urls.get('login') else provider.download
@@ -271,11 +273,6 @@ class Release(Plugin):
def download(self, data, media, manual = False):
# Backwards compatibility code
if not data.get('protocol'):
data['protocol'] = data['type']
data['type'] = 'movie'
# Test to see if any downloaders are enabled for this type
downloader_enabled = fireEvent('download.enabled', manual, data, single = True)
if not downloader_enabled:
@@ -303,8 +300,6 @@ class Release(Plugin):
return False
log.debug('Downloader result: %s', download_result)
snatched_status, done_status, downloaded_status, active_status = fireEvent('status.get', ['snatched', 'done', 'downloaded', 'active'], single = True)
try:
db = get_session()
rls = db.query(Relea).filter_by(identifier = md5(data['url'])).first()
@@ -324,7 +319,7 @@ class Release(Plugin):
rls.info.append(rls_info)
db.commit()
log_movie = '%s (%s) in %s' % (getTitle(media['library']), media['library']['year'], rls.quality.label)
log_movie = '%s (%s) in %s' % (getTitle(media), media['info']['year'], rls.quality.label)
snatch_message = 'Snatched "%s": %s' % (data.get('name'), log_movie)
log.info(snatch_message)
fireEvent('%s.snatched' % data['type'], message = snatch_message, data = rls.to_dict())
@@ -335,7 +330,7 @@ class Release(Plugin):
# If renamer isn't used, mark media done if finished or release downloaded
else:
if media['status_id'] == active_status.get('id'):
if media['status'] == 'active':
finished = next((True for profile_type in media['profile']['types']
if profile_type['quality_id'] == rls.quality.id and profile_type['finish']), False)
if finished:
@@ -346,7 +341,7 @@ class Release(Plugin):
# Mark media done
mdia = db.query(Media).filter_by(id = media['id']).first()
mdia.status_id = done_status.get('id')
mdia.status = 'done'
mdia.last_edit = int(time.time())
db.commit()
@@ -364,15 +359,14 @@ class Release(Plugin):
return True
def tryDownloadResult(self, results, media, quality_type, manual = False):
ignored_status, failed_status = fireEvent('status.get', ['ignored', 'failed'], single = True)
def tryDownloadResult(self, results, media, quality_custom, manual = False):
for rel in results:
if not quality_type.get('finish', False) and quality_type.get('wait_for', 0) > 0 and rel.get('age') <= quality_type.get('wait_for', 0):
log.info('Ignored, waiting %s days: %s', (quality_type.get('wait_for'), rel['name']))
if not quality_custom.get('finish', False) and quality_custom.get('wait_for', 0) > 0 and rel.get('age') <= quality_custom.get('wait_for', 0):
log.info('Ignored, waiting %s days: %s', (quality_custom.get('wait_for'), rel['name']))
continue
if rel['status_id'] in [ignored_status.get('id'), failed_status.get('id')]:
if rel['status'] in ['ignored', 'failed']:
log.info('Ignored: %s', rel['name'])
continue
@@ -388,12 +382,10 @@ class Release(Plugin):
return False
def createFromSearch(self, search_results, media, quality_type):
available_status = fireEvent('status.get', ['available'], single = True)
def createFromSearch(self, search_results, media, quality):
try:
db = get_session()
db = get_db()
found_releases = []
@@ -402,45 +394,40 @@ class Release(Plugin):
rel_identifier = md5(rel['url'])
found_releases.append(rel_identifier)
rls = db.query(Relea).filter_by(identifier = rel_identifier).first()
if not rls:
rls = Relea(
identifier = rel_identifier,
movie_id = media.get('id'),
#media_id = media.get('id'),
quality_id = quality_type.get('quality_id'),
status_id = available_status.get('id')
)
db.add(rls)
else:
[db.delete(old_info) for old_info in rls.info]
rls.last_edit = int(time.time())
release = {
'_t': 'release',
'identifier': rel_identifier,
'media_id': media.get('_id'),
'quality': quality.get('identifier'),
'status': 'available',
'last_edit': int(time.time()),
'info': {}
}
db.commit()
try:
rls = db.get('release_identifier', rel_identifier, with_doc = True)['doc']
except:
rls = db.insert(release)
rls.update(release)
# Update info, but filter out functions
for info in rel:
try:
if not isinstance(rel[info], (str, unicode, int, long, float)):
continue
rls_info = ReleaseInfo(
identifier = info,
value = toUnicode(rel[info])
)
rls.info.append(rls_info)
rls['info'][info] = toUnicode(rel[info])
except InterfaceError:
log.debug('Couldn\'t add %s to ReleaseInfo: %s', (info, traceback.format_exc()))
db.commit()
db.update(rls)
rel['status_id'] = rls.status_id
# Update release in search_results
rel['status'] = rls.get('status')
return found_releases
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
pass #db.close()
return []