Try NoSQL

This commit is contained in:
Ruud committed 2014-01-29 17:49:54 +01:00
1 parent aab10fb599
commit a254886bad
65 files changed
+7372 -761

No files matched your search

+58 -75
View File
@@ -1,4 +1,4 @@
from couchpotato import get_session, md5
from couchpotato import get_session, md5, get_db
from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, addEvent
from couchpotato.core.helpers.encoding import ss, toUnicode
@@ -72,34 +72,32 @@ class Release(Plugin):
done_status, available_status, snatched_status, downloaded_status, ignored_status = \
fireEvent('status.get', ['done', 'available', 'snatched', 'downloaded', 'ignored'], single = True)
db = get_session()
db = get_db()
# get movies last_edit more than a week ago
media = db.query(Media) \
.filter(Media.status_id == done_status.get('id'), Media.last_edit < (now - week)) \
.all()
medias = db.run('media', 'with_status', ['done'])
for item in media:
for rel in item.releases:
for media in medias:
if media['last_edit'] > (now - week):
continue
for rel in db.run('release', 'for_media', media['_id']):
# Remove all available releases
if rel.status_id in [available_status.get('id')]:
fireEvent('release.delete', id = rel.id, single = True)
# Set all snatched and downloaded releases to ignored to make sure they are ignored when re-adding the move
elif rel.status_id in [snatched_status.get('id'), downloaded_status.get('id')]:
self.updateStatus(id = rel.id, status = ignored_status)
if rel['status'] in ['available']:
fireEvent('release.delete', id = rel['_id'], single = True)
db.close()
# Set all snatched and downloaded releases to ignored to make sure they are ignored when re-adding the move
elif rel['status'] in ['snatched', 'downloaded']:
self.updateStatus(id = rel['id'], status = ignored_status)
def add(self, group):
try:
db = get_session()
db = get_db()
identifier = '%s.%s.%s' % (group['library']['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier'])
done_status, snatched_status = fireEvent('status.get', ['done', 'snatched'], single = True)
# Add movie
media = db.query(Media).filter_by(library_id = group['library'].get('id')).first()
if not media:
@@ -129,41 +127,28 @@ class Release(Plugin):
db.commit()
# Add each file type
added_files = []
rel['files'] = []
for type in group['files']:
for cur_file in group['files'][type]:
added_file = self.saveFile(cur_file, type = type, include_media_info = type is 'movie')
added_files.append(added_file.get('id'))
added_file = self.saveFile(cur_file, type = type)
rel['files'].append(added_file.get('id'))
# Add the release files in batch
try:
added_files = db.query(File).filter(or_(*[File.id == x for x in added_files])).all()
rel.files.extend(added_files)
db.commit()
except:
log.debug('Failed to attach "%s" to release: %s', (added_files, traceback.format_exc()))
fireEvent('media.restatus', media.id)
fireEvent('media.restatus', media['_id'])
return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False
def saveFile(self, filepath, type = 'unknown', include_media_info = False):
properties = {}
# Get media info for files
if include_media_info:
properties = {}
# Check database and update/insert if necessary
return fireEvent('file.add', path = filepath, part = fireEvent('scanner.partnumber', file, single = True), type_tuple = Scanner.file_types.get(type), properties = properties, single = True)
return {
'type': '%s_%s' % Scanner.file_types.get(type),
'path': filepath,
'part': fireEvent('scanner.partnumber', file, single = True),
}
def deleteView(self, id = None, **kwargs):
@@ -171,60 +156,58 @@ class Release(Plugin):
'success': self.delete(id)
}
def delete(self, id):
def delete(self, release_id):
try:
db = get_session()
db = get_db()
rel = db.query(Relea).filter_by(id = id).first()
if rel:
db.delete(rel)
db.commit()
return True
rel = db.get('release', release_id, with_doc = True)
db.delete(rel['doc'])
return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False
def clean(self, id):
def clean(self, release_id):
try:
db = get_session()
db = get_db()
rel = db.query(Relea).filter_by(id = id).first()
if rel:
for release_file in rel.files:
if not os.path.isfile(ss(release_file.path)):
db.delete(release_file)
db.commit()
rel = db.get('release', release_id, with_doc = True)
files = []
for release_file in rel['files']:
if os.path.isfile(ss(release_file['path'])):
files.append(release_file)
if len(rel.files) == 0:
self.delete(id)
if len(rel['files']) == 0:
self.delete(rel['_id'])
else:
rel['files'] = files
db.update(rel)
return True
return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False
def ignore(self, id = None, **kwargs):
def ignore(self, release_id = None, **kwargs):
db = get_session()
db = get_db()
rel = db.query(Relea).filter_by(id = id).first()
if rel:
ignored_status, failed_status, available_status = fireEvent('status.get', ['ignored', 'failed', 'available'], single = True)
self.updateStatus(id, available_status if rel.status_id in [ignored_status.get('id'), failed_status.get('id')] else ignored_status)
try:
rel = db.get('release', release_id, with_doc = True)['doc']
self.updateStatus(release_id, 'available' if rel['status'] in ['ignored', 'failed'] else 'ignored')
return {
'success': True
}
except:
log.error('Failed: %s', traceback.format_exc())
db.close()
return {
'success': True
'success': False
}
def manualDownload(self, id = None, **kwargs):
@@ -265,7 +248,7 @@ class Release(Plugin):
if success:
fireEvent('notify.frontend', type = 'release.manual_download', data = True, message = 'Successfully snatched "%s"' % item['name'])
db.close()
pass #db.close()
return {
'success': success == True
}
@@ -361,7 +344,7 @@ class Release(Plugin):
db.rollback()
return False
finally:
db.close()
pass #db.close()
return True
@@ -441,7 +424,7 @@ class Release(Plugin):
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
pass #db.close()
return []
@@ -458,7 +441,7 @@ class Release(Plugin):
releases = [r.to_dict({'info': {}, 'files': {}}) for r in releases_raw]
releases = sorted(releases, key = lambda k: k['info'].get('score', 0), reverse = True)
db.close()
pass #db.close()
return releases
def forMovieView(self, id = None, **kwargs):
@@ -506,6 +489,6 @@ class Release(Plugin):
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
pass #db.close()
return False