Browse Source

Wrap all commits with try/except

pull/2775/head
Ruud 11 years ago
parent
commit
7001ed476d
  1. 4
      couchpotato/__init__.py
  2. 13
      couchpotato/core/media/__init__.py
  3. 20
      couchpotato/core/media/_base/media/main.py
  4. 19
      couchpotato/core/media/movie/_base/main.py
  5. 35
      couchpotato/core/media/movie/library/movie/main.py
  6. 7
      couchpotato/core/media/movie/searcher/main.py
  7. 2
      couchpotato/core/media/movie/suggestion/main.py
  8. 23
      couchpotato/core/notifications/core/main.py
  9. 42
      couchpotato/core/plugins/category/main.py
  10. 1
      couchpotato/core/plugins/dashboard/main.py
  11. 20
      couchpotato/core/plugins/file/main.py
  12. 50
      couchpotato/core/plugins/profile/main.py
  13. 19
      couchpotato/core/plugins/quality/main.py
  14. 43
      couchpotato/core/plugins/release/main.py
  15. 1
      couchpotato/core/plugins/renamer/main.py
  16. 2
      couchpotato/core/plugins/scanner/main.py
  17. 15
      couchpotato/core/plugins/status/main.py
  18. 7
      couchpotato/core/settings/__init__.py
  19. 25
      couchpotato/environment.py

4
couchpotato/__init__.py

@ -48,8 +48,8 @@ def addView(route, func, static = False):
views[route] = func views[route] = func
def get_session(engine = None): def get_session():
return Env.getSession(engine) return Env.getSession()
# Web view # Web view

13
couchpotato/core/media/__init__.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.core.event import addEvent, fireEventAsync, fireEvent from couchpotato.core.event import addEvent, fireEventAsync, fireEvent
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
@ -26,25 +27,33 @@ class MediaBase(Plugin):
def createOnComplete(self, id): def createOnComplete(self, id):
def onComplete(): def onComplete():
try:
db = get_session() db = get_session()
media = db.query(Media).filter_by(id = id).first() media = db.query(Media).filter_by(id = id).first()
media_dict = media.to_dict(self.default_dict) media_dict = media.to_dict(self.default_dict)
event_name = '%s.searcher.single' % media.type event_name = '%s.searcher.single' % media.type
db.expire_all()
fireEvent(event_name, media_dict, on_complete = self.createNotifyFront(id)) fireEvent(event_name, media_dict, on_complete = self.createNotifyFront(id))
except:
log.error('Failed creating onComplete: %s', traceback.format_exc())
finally:
db.close()
return onComplete return onComplete
def createNotifyFront(self, media_id): def createNotifyFront(self, media_id):
def notifyFront(): def notifyFront():
try:
db = get_session() db = get_session()
media = db.query(Media).filter_by(id = media_id).first() media = db.query(Media).filter_by(id = media_id).first()
media_dict = media.to_dict(self.default_dict) media_dict = media.to_dict(self.default_dict)
event_name = '%s.update' % media.type event_name = '%s.update' % media.type
db.expire_all()
fireEvent('notify.frontend', type = event_name, data = media_dict) fireEvent('notify.frontend', type = event_name, data = media_dict)
except:
log.error('Failed creating onComplete: %s', traceback.format_exc())
finally:
db.close()
return notifyFront return notifyFront

20
couchpotato/core/media/_base/media/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session, tryInt from couchpotato import get_session, tryInt
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
@ -100,8 +101,6 @@ class MediaPlugin(MediaBase):
def handler(): def handler():
fireEvent(event, identifier = identifier, default_title = default_title, on_complete = self.createOnComplete(id)) fireEvent(event, identifier = identifier, default_title = default_title, on_complete = self.createOnComplete(id))
db.expire_all()
if handler: if handler:
return handler return handler
@ -125,7 +124,6 @@ class MediaPlugin(MediaBase):
if m: if m:
results = m.to_dict(self.default_dict) results = m.to_dict(self.default_dict)
db.expire_all()
return results return results
def getView(self, id = None, **kwargs): def getView(self, id = None, **kwargs):
@ -261,7 +259,6 @@ class MediaPlugin(MediaBase):
'releases_count': releases_count.get(media_id), 'releases_count': releases_count.get(media_id),
})) }))
db.expire_all()
return total_count, movies return total_count, movies
def listView(self, **kwargs): def listView(self, **kwargs):
@ -355,7 +352,6 @@ class MediaPlugin(MediaBase):
if len(chars) == 25: if len(chars) == 25:
break break
db.expire_all()
return ''.join(sorted(chars)) return ''.join(sorted(chars))
def charView(self, **kwargs): def charView(self, **kwargs):
@ -380,6 +376,7 @@ class MediaPlugin(MediaBase):
def delete(self, media_id, delete_from = None): def delete(self, media_id, delete_from = None):
try:
db = get_session() db = get_session()
media = db.query(Media).filter_by(id = media_id).first() media = db.query(Media).filter_by(id = media_id).first()
@ -422,8 +419,12 @@ class MediaPlugin(MediaBase):
if deleted: if deleted:
fireEvent('notify.frontend', type = 'movie.deleted', data = media.to_dict()) fireEvent('notify.frontend', type = 'movie.deleted', data = media.to_dict())
except:
log.error('Failed deleting media: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
db.expire_all()
return True return True
def deleteView(self, id = '', **kwargs): def deleteView(self, id = '', **kwargs):
@ -447,6 +448,7 @@ class MediaPlugin(MediaBase):
active_status, done_status = fireEvent('status.get', ['active', 'done'], single = True) active_status, done_status = fireEvent('status.get', ['active', 'done'], single = True)
try:
db = get_session() db = get_session()
m = db.query(Media).filter_by(id = media_id).first() m = db.query(Media).filter_by(id = media_id).first()
@ -468,7 +470,11 @@ class MediaPlugin(MediaBase):
m.status_id = active_status.get('id') if move_to_wanted else done_status.get('id') m.status_id = active_status.get('id') if move_to_wanted else done_status.get('id')
db.commit() db.commit()
db.expire_all()
return True return True
except:
log.error('Failed restatus: %s', traceback.format_exc())
db.rollback()
finally:
db.close()

19
couchpotato/core/media/movie/_base/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import fireEvent, fireEventAsync, addEvent from couchpotato.core.event import fireEvent, fireEventAsync, addEvent
@ -70,6 +71,7 @@ class MovieBase(MovieTypeBase):
default_profile = fireEvent('profile.default', single = True) default_profile = fireEvent('profile.default', single = True)
cat_id = params.get('category_id') cat_id = params.get('category_id')
try:
db = get_session() db = get_session()
m = db.query(Media).filter_by(library_id = library.get('id')).first() m = db.query(Media).filter_by(library_id = library.get('id')).first()
added = True added = True
@ -138,8 +140,12 @@ class MovieBase(MovieTypeBase):
message = 'Succesfully added to your wanted list.' message = 'Succesfully added to your wanted list.'
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = message) fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = message)
db.expire_all()
return movie_dict return movie_dict
except:
log.error('Failed deleting media: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def addView(self, **kwargs): def addView(self, **kwargs):
add_dict = self.add(params = kwargs) add_dict = self.add(params = kwargs)
@ -151,6 +157,7 @@ class MovieBase(MovieTypeBase):
def edit(self, id = '', **kwargs): def edit(self, id = '', **kwargs):
try:
db = get_session() db = get_session()
available_status = fireEvent('status.get', 'available', single = True) available_status = fireEvent('status.get', 'available', single = True)
@ -186,7 +193,15 @@ class MovieBase(MovieTypeBase):
movie_dict = m.to_dict(self.default_dict) movie_dict = m.to_dict(self.default_dict)
fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(media_id)) fireEventAsync('movie.searcher.single', movie_dict, on_complete = self.createNotifyFront(media_id))
db.expire_all()
return { return {
'success': True, 'success': True,
} }
except:
log.error('Failed deleting media: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False,
}

35
couchpotato/core/media/movie/library/movie/main.py

@ -26,6 +26,7 @@ class MovieLibraryPlugin(LibraryBase):
primary_provider = attrs.get('primary_provider', 'imdb') primary_provider = attrs.get('primary_provider', 'imdb')
try:
db = get_session() db = get_session()
l = db.query(Library).filter_by(identifier = attrs.get('identifier')).first() l = db.query(Library).filter_by(identifier = attrs.get('identifier')).first()
@ -56,16 +57,23 @@ class MovieLibraryPlugin(LibraryBase):
handle('library.update.movie', identifier = l.identifier, default_title = toUnicode(attrs.get('title', ''))) handle('library.update.movie', identifier = l.identifier, default_title = toUnicode(attrs.get('title', '')))
library_dict = l.to_dict(self.default_dict) library_dict = l.to_dict(self.default_dict)
db.expire_all()
return library_dict return library_dict
except:
log.error('Failed adding media: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {}
def update(self, identifier, default_title = '', extended = False): def update(self, identifier, default_title = '', extended = False):
if self.shuttingDown(): if self.shuttingDown():
return return
try:
db = get_session() db = get_session()
library = db.query(Library).filter_by(identifier = identifier).first() library = db.query(Library).filter_by(identifier = identifier).first()
done_status = fireEvent('status.get', 'done', single = True) done_status = fireEvent('status.get', 'done', single = True)
@ -104,8 +112,8 @@ class MovieLibraryPlugin(LibraryBase):
break break
counter += 1 counter += 1
#if not def_title: if not def_title:
# def_title = toUnicode(titles[0]) def_title = toUnicode(titles[0])
for title in titles: for title in titles:
if not title: if not title:
@ -138,14 +146,21 @@ class MovieLibraryPlugin(LibraryBase):
break break
except: except:
log.debug('Failed to attach to library: %s', traceback.format_exc()) log.debug('Failed to attach to library: %s', traceback.format_exc())
db.rollback()
library_dict = library.to_dict(self.default_dict) library_dict = library.to_dict(self.default_dict)
db.expire_all()
return library_dict return library_dict
except:
log.error('Failed update media: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {}
def updateReleaseDate(self, identifier): def updateReleaseDate(self, identifier):
try:
db = get_session() db = get_session()
library = db.query(Library).filter_by(identifier = identifier).first() library = db.query(Library).filter_by(identifier = identifier).first()
@ -160,8 +175,14 @@ class MovieLibraryPlugin(LibraryBase):
library.info.update({'release_date': dates}) library.info.update({'release_date': dates})
db.commit() db.commit()
db.expire_all()
return dates return dates
except:
log.error('Failed updating release dates: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {}
def simplifyTitle(self, title): def simplifyTitle(self, title):

7
couchpotato/core/media/movie/searcher/main.py

@ -89,8 +89,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
'files': {}, 'files': {},
})) }))
db.expire_all()
self.in_progress = { self.in_progress = {
'total': len(movies), 'total': len(movies),
'to_go': len(movies), 'to_go': len(movies),
@ -209,7 +207,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['id']}) fireEvent('notify.frontend', type = 'movie.searcher.ended', data = {'id': movie['id']})
db.expire_all()
return ret return ret
def correctRelease(self, nzb = None, media = None, quality = None, **kwargs): def correctRelease(self, nzb = None, media = None, quality = None, **kwargs):
@ -342,7 +339,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
for rel in rels: for rel in rels:
rel.status_id = ignored_status.get('id') rel.status_id = ignored_status.get('id')
db.commit() db.commit()
db.expire_all()
movie_dict = fireEvent('media.get', media_id = media_id, single = True) movie_dict = fireEvent('media.get', media_id = media_id, single = True)
log.info('Trying next release for: %s', getTitle(movie_dict['library'])) log.info('Trying next release for: %s', getTitle(movie_dict['library']))
@ -352,7 +348,10 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
except: except:
log.error('Failed searching for next release: %s', traceback.format_exc()) log.error('Failed searching for next release: %s', traceback.format_exc())
db.rollback()
return False return False
finally:
db.close()
def getSearchTitle(self, media): def getSearchTitle(self, media):
if media['type'] == 'movie': if media['type'] == 'movie':

2
couchpotato/core/media/movie/suggestion/main.py

@ -33,7 +33,6 @@ class Suggestion(Plugin):
.options(joinedload_all('library')) \ .options(joinedload_all('library')) \
.filter(or_(*[Media.status.has(identifier = s) for s in ['active', 'done']])).all() .filter(or_(*[Media.status.has(identifier = s) for s in ['active', 'done']])).all()
movies = [x.library.identifier for x in active_movies] movies = [x.library.identifier for x in active_movies]
db.expire_all()
if not ignored or len(ignored) == 0: if not ignored or len(ignored) == 0:
ignored = splitString(Env.prop('suggest_ignore', default = '')) ignored = splitString(Env.prop('suggest_ignore', default = ''))
@ -98,7 +97,6 @@ class Suggestion(Plugin):
.filter(Media.status_id.in_([active_status.get('id'), done_status.get('id')])).all() .filter(Media.status_id.in_([active_status.get('id'), done_status.get('id')])).all()
movies = [x[0] for x in active_movies] movies = [x[0] for x in active_movies]
movies.extend(seen) movies.extend(seen)
db.expire_all()
ignored.extend([x.get('imdb') for x in cached_suggestion]) ignored.extend([x.get('imdb') for x in cached_suggestion])
suggestions = fireEvent('movie.suggest', movies = movies, ignore = removeDuplicate(ignored), single = True) suggestions = fireEvent('movie.suggest', movies = movies, ignore = removeDuplicate(ignored), single = True)

23
couchpotato/core/notifications/core/main.py

@ -67,14 +67,21 @@ class CoreNotifier(Notification):
def clean(self): def clean(self):
try:
db = get_session() db = get_session()
db.query(Notif).filter(Notif.added <= (int(time.time()) - 2419200)).delete() db.query(Notif).filter(Notif.added <= (int(time.time()) - 2419200)).delete()
db.commit() db.commit()
except:
log.error('Failed cleaning notification: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def markAsRead(self, ids = None, **kwargs): def markAsRead(self, ids = None, **kwargs):
ids = splitString(ids) if ids else None ids = splitString(ids) if ids else None
try:
db = get_session() db = get_session()
if ids: if ids:
@ -83,12 +90,20 @@ class CoreNotifier(Notification):
q = db.query(Notif).filter_by(read = False) q = db.query(Notif).filter_by(read = False)
q.update({Notif.read: True}) q.update({Notif.read: True})
db.commit() db.commit()
return { return {
'success': True 'success': True
} }
except:
log.error('Failed mark as read: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def listView(self, limit_offset = None, **kwargs): def listView(self, limit_offset = None, **kwargs):
@ -139,6 +154,7 @@ class CoreNotifier(Notification):
def notify(self, message = '', data = None, listener = None): def notify(self, message = '', data = None, listener = None):
if not data: data = {} if not data: data = {}
try:
db = get_session() db = get_session()
data['notification_type'] = listener if listener else 'unknown' data['notification_type'] = listener if listener else 'unknown'
@ -157,6 +173,11 @@ class CoreNotifier(Notification):
self.frontend(type = listener, data = data) self.frontend(type = listener, data = data)
return True return True
except:
log.error('Failed notify: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def frontend(self, type = 'notification', data = None, message = None): def frontend(self, type = 'notification', data = None, message = None):
if not data: data = {} if not data: data = {}

42
couchpotato/core/plugins/category/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
@ -41,11 +42,11 @@ class CategoryPlugin(Plugin):
for category in categories: for category in categories:
temp.append(category.to_dict()) temp.append(category.to_dict())
db.expire_all()
return temp return temp
def save(self, **kwargs): def save(self, **kwargs):
try:
db = get_session() db = get_session()
c = db.query(Category).filter_by(id = kwargs.get('id')).first() c = db.query(Category).filter_by(id = kwargs.get('id')).first()
@ -68,9 +69,20 @@ class CategoryPlugin(Plugin):
'success': True, 'success': True,
'category': category_dict 'category': category_dict
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False,
'category': None
}
def saveOrder(self, **kwargs): def saveOrder(self, **kwargs):
try:
db = get_session() db = get_session()
order = 0 order = 0
@ -85,9 +97,19 @@ class CategoryPlugin(Plugin):
return { return {
'success': True 'success': True
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def delete(self, id = None, **kwargs): def delete(self, id = None, **kwargs):
try:
db = get_session() db = get_session()
success = False success = False
@ -104,14 +126,23 @@ class CategoryPlugin(Plugin):
except Exception as e: except Exception as e:
message = log.error('Failed deleting category: %s', e) message = log.error('Failed deleting category: %s', e)
db.expire_all()
return { return {
'success': success, 'success': success,
'message': message 'message': message
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def removeFromMovie(self, category_id): def removeFromMovie(self, category_id):
try:
db = get_session() db = get_session()
movies = db.query(Media).filter(Media.category_id == category_id).all() movies = db.query(Media).filter(Media.category_id == category_id).all()
@ -119,5 +150,8 @@ class CategoryPlugin(Plugin):
for movie in movies: for movie in movies:
movie.category_id = None movie.category_id = None
db.commit() db.commit()
except:
db.expire_all() log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()

1
couchpotato/core/plugins/dashboard/main.py

@ -119,7 +119,6 @@ class Dashboard(Plugin):
'files': {}, 'files': {},
})) }))
db.expire_all()
return { return {
'success': True, 'success': True,
'empty': len(movies) == 0, 'empty': len(movies) == 0,

20
couchpotato/core/plugins/file/main.py

@ -66,7 +66,6 @@ class FileManager(Plugin):
time.sleep(3) time.sleep(3)
log.debug('Cleaning up unused files') log.debug('Cleaning up unused files')
python_cache = Env.get('cache')._path
try: try:
db = get_session() db = get_session()
for root, dirs, walk_files in os.walk(Env.get('cache_dir')): for root, dirs, walk_files in os.walk(Env.get('cache_dir')):
@ -78,6 +77,9 @@ class FileManager(Plugin):
os.remove(file_path) os.remove(file_path)
except: except:
log.error('Failed removing unused file: %s', traceback.format_exc()) log.error('Failed removing unused file: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def showCacheFile(self, route, **kwargs): def showCacheFile(self, route, **kwargs):
Env.get('app').add_handlers(".*$", [('%s%s' % (Env.get('api_base'), route), StaticFileHandler, {'path': Env.get('cache_dir')})]) Env.get('app').add_handlers(".*$", [('%s%s' % (Env.get('api_base'), route), StaticFileHandler, {'path': Env.get('cache_dir')})])
@ -103,8 +105,9 @@ class FileManager(Plugin):
def add(self, path = '', part = 1, type_tuple = (), available = 1, properties = None): def add(self, path = '', part = 1, type_tuple = (), available = 1, properties = None):
if not properties: properties = {} if not properties: properties = {}
type_id = self.getType(type_tuple).get('id') try:
db = get_session() db = get_session()
type_id = self.getType(type_tuple).get('id')
f = db.query(File).filter(File.path == toUnicode(path)).first() f = db.query(File).filter(File.path == toUnicode(path)).first()
if not f: if not f:
@ -121,9 +124,15 @@ class FileManager(Plugin):
file_dict = f.to_dict() file_dict = f.to_dict()
return file_dict return file_dict
except:
log.error('Failed adding file: %s, %s', (path, traceback.format_exc()))
db.rollback()
finally:
db.close()
def getType(self, type_tuple): def getType(self, type_tuple):
try:
db = get_session() db = get_session()
type_type, type_identifier = type_tuple type_type, type_identifier = type_tuple
@ -138,7 +147,14 @@ class FileManager(Plugin):
db.commit() db.commit()
type_dict = ft.to_dict() type_dict = ft.to_dict()
return type_dict return type_dict
except:
log.error('Failed getting type: %s, %s', (type_tuple, traceback.format_exc()))
db.rollback()
finally:
db.close()
def getTypes(self): def getTypes(self):

50
couchpotato/core/plugins/profile/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.event import addEvent, fireEvent
@ -37,6 +38,7 @@ class ProfilePlugin(Plugin):
# Get all active movies without profile # Get all active movies without profile
active_status = fireEvent('status.get', 'active', single = True) active_status = fireEvent('status.get', 'active', single = True)
try:
db = get_session() db = get_session()
movies = db.query(Media).filter(Media.status_id == active_status.get('id'), Media.profile == None).all() movies = db.query(Media).filter(Media.status_id == active_status.get('id'), Media.profile == None).all()
@ -45,8 +47,11 @@ class ProfilePlugin(Plugin):
for movie in movies: for movie in movies:
movie.profile_id = default_profile.get('id') movie.profile_id = default_profile.get('id')
db.commit() db.commit()
except:
db.expire_all() log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def allView(self, **kwargs): def allView(self, **kwargs):
@ -66,11 +71,11 @@ class ProfilePlugin(Plugin):
for profile in profiles: for profile in profiles:
temp.append(profile.to_dict(self.to_dict)) temp.append(profile.to_dict(self.to_dict))
db.expire_all()
return temp return temp
def save(self, **kwargs): def save(self, **kwargs):
try:
db = get_session() db = get_session()
p = db.query(Profile).filter_by(id = kwargs.get('id')).first() p = db.query(Profile).filter_by(id = kwargs.get('id')).first()
@ -105,6 +110,15 @@ class ProfilePlugin(Plugin):
'success': True, 'success': True,
'profile': profile_dict 'profile': profile_dict
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def default(self): def default(self):
@ -114,11 +128,11 @@ class ProfilePlugin(Plugin):
.first() .first()
default_dict = default.to_dict(self.to_dict) default_dict = default.to_dict(self.to_dict)
db.expire_all()
return default_dict return default_dict
def saveOrder(self, **kwargs): def saveOrder(self, **kwargs):
try:
db = get_session() db = get_session()
order = 0 order = 0
@ -134,9 +148,19 @@ class ProfilePlugin(Plugin):
return { return {
'success': True 'success': True
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def delete(self, id = None, **kwargs): def delete(self, id = None, **kwargs):
try:
db = get_session() db = get_session()
success = False success = False
@ -154,14 +178,23 @@ class ProfilePlugin(Plugin):
except Exception as e: except Exception as e:
message = log.error('Failed deleting Profile: %s', e) message = log.error('Failed deleting Profile: %s', e)
db.expire_all()
return { return {
'success': success, 'success': success,
'message': message 'message': message
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def fill(self): def fill(self):
try:
db = get_session() db = get_session()
profiles = [{ profiles = [{
@ -204,3 +237,10 @@ class ProfilePlugin(Plugin):
db.commit() db.commit()
return True return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False

19
couchpotato/core/plugins/quality/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
@ -98,6 +99,7 @@ class QualityPlugin(Plugin):
def saveSize(self, **kwargs): def saveSize(self, **kwargs):
try:
db = get_session() db = get_session()
quality = db.query(Quality).filter_by(identifier = kwargs.get('identifier')).first() quality = db.query(Quality).filter_by(identifier = kwargs.get('identifier')).first()
@ -110,9 +112,19 @@ class QualityPlugin(Plugin):
return { return {
'success': True 'success': True
} }
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return {
'success': False
}
def fill(self): def fill(self):
try:
db = get_session() db = get_session()
order = 0 order = 0
@ -162,6 +174,13 @@ class QualityPlugin(Plugin):
time.sleep(0.3) # Wait a moment time.sleep(0.3) # Wait a moment
return True return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False
def guess(self, files, extra = None): def guess(self, files, extra = None):
if not extra: extra = {} if not extra: extra = {}

43
couchpotato/core/plugins/release/main.py

@ -88,10 +88,10 @@ class Release(Plugin):
elif rel.status_id in [snatched_status.get('id'), downloaded_status.get('id')]: elif rel.status_id in [snatched_status.get('id'), downloaded_status.get('id')]:
self.updateStatus(id = rel.id, status = ignored_status) self.updateStatus(id = rel.id, status = ignored_status)
db.expire_all()
def add(self, group): def add(self, group):
try:
db = get_session() 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['library']['identifier'], group['meta_data'].get('audio', 'unknown'), group['meta_data']['quality']['identifier'])
@ -143,8 +143,14 @@ class Release(Plugin):
fireEvent('media.restatus', media.id) fireEvent('media.restatus', media.id)
db.expire_all()
return True 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): def saveFile(self, filepath, type = 'unknown', include_media_info = False):
@ -165,6 +171,7 @@ class Release(Plugin):
def delete(self, id): def delete(self, id):
try:
db = get_session() db = get_session()
rel = db.query(Relea).filter_by(id = id).first() rel = db.query(Relea).filter_by(id = id).first()
@ -172,11 +179,17 @@ class Release(Plugin):
rel.delete() rel.delete()
db.commit() db.commit()
return True return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False return False
def clean(self, id): def clean(self, id):
try:
db = get_session() db = get_session()
rel = db.query(Relea).filter_by(id = id).first() rel = db.query(Relea).filter_by(id = id).first()
@ -190,6 +203,11 @@ class Release(Plugin):
self.delete(id) self.delete(id)
return True return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False return False
@ -338,9 +356,10 @@ class Release(Plugin):
except: except:
log.error('Failed storing download status: %s', traceback.format_exc()) log.error('Failed storing download status: %s', traceback.format_exc())
db.rollback()
return False return False
finally: finally:
db.expire_all() db.close()
return True return True
@ -371,6 +390,8 @@ class Release(Plugin):
def createFromSearch(self, search_results, media, quality_type): def createFromSearch(self, search_results, media, quality_type):
available_status = fireEvent('status.get', ['available'], single = True) available_status = fireEvent('status.get', ['available'], single = True)
try:
db = get_session() db = get_session()
found_releases = [] found_releases = []
@ -414,6 +435,13 @@ class Release(Plugin):
rel['status_id'] = rls.status_id rel['status_id'] = rls.status_id
return found_releases return found_releases
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return []
def forMovie(self, id = None): def forMovie(self, id = None):
@ -442,6 +470,7 @@ class Release(Plugin):
def updateStatus(self, id, status = None): def updateStatus(self, id, status = None):
if not status: return False if not status: return False
try:
db = get_session() db = get_session()
rel = db.query(Relea).filter_by(id = id).first() rel = db.query(Relea).filter_by(id = id).first()
@ -469,5 +498,11 @@ class Release(Plugin):
#Update all movie info as there is no release update function #Update all movie info as there is no release update function
fireEvent('notify.frontend', type = 'release.update_status', data = rel.to_dict()) fireEvent('notify.frontend', type = 'release.update_status', data = rel.to_dict())
db.expire_all()
return True return True
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
return False

1
couchpotato/core/plugins/renamer/main.py

@ -439,6 +439,7 @@ class Renamer(Plugin):
db.commit() db.commit()
except Exception as e: except Exception as e:
log.error('Failed marking movie finished: %s %s', (e, traceback.format_exc())) log.error('Failed marking movie finished: %s %s', (e, traceback.format_exc()))
db.rollback()
# Go over current movie releases # Go over current movie releases
for release in movie.releases: for release in movie.releases:

2
couchpotato/core/plugins/scanner/main.py

@ -597,6 +597,7 @@ class Scanner(Plugin):
# Check if path is already in db # Check if path is already in db
if not imdb_id: if not imdb_id:
db = get_session() db = get_session()
for cf in files['movie']: for cf in files['movie']:
f = db.query(File).filter_by(path = toUnicode(cf)).first() f = db.query(File).filter_by(path = toUnicode(cf)).first()
@ -607,7 +608,6 @@ class Scanner(Plugin):
break break
except: except:
pass pass
db.expire_all()
# Search based on identifiers # Search based on identifiers
if not imdb_id: if not imdb_id:

15
couchpotato/core/plugins/status/main.py

@ -1,3 +1,4 @@
import traceback
from couchpotato import get_session from couchpotato import get_session
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
@ -79,6 +80,7 @@ class StatusPlugin(Plugin):
if not isinstance(identifiers, list): if not isinstance(identifiers, list):
identifiers = [identifiers] identifiers = [identifiers]
try:
db = get_session() db = get_session()
return_list = [] return_list = []
@ -103,9 +105,15 @@ class StatusPlugin(Plugin):
return_list.append(status_dict) return_list.append(status_dict)
return return_list if len(identifiers) > 1 else return_list[0] return return_list if len(identifiers) > 1 else return_list[0]
except:
log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()
def fill(self): def fill(self):
try:
db = get_session() db = get_session()
for identifier, label in self.statuses.items(): for identifier, label in self.statuses.items():
@ -120,6 +128,9 @@ class StatusPlugin(Plugin):
s.label = toUnicode(label) s.label = toUnicode(label)
db.commit() db.commit()
except:
#db.close() log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()

7
couchpotato/core/settings/__init__.py

@ -1,4 +1,5 @@
from __future__ import with_statement from __future__ import with_statement
import traceback
from couchpotato.api import addApiView from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent from couchpotato.core.event import addEvent, fireEvent
from couchpotato.core.helpers.encoding import toUnicode from couchpotato.core.helpers.encoding import toUnicode
@ -220,6 +221,7 @@ class Settings(object):
def setProperty(self, identifier, value = ''): def setProperty(self, identifier, value = ''):
from couchpotato import get_session from couchpotato import get_session
try:
db = get_session() db = get_session()
p = db.query(Properties).filter_by(identifier = identifier).first() p = db.query(Properties).filter_by(identifier = identifier).first()
@ -231,3 +233,8 @@ class Settings(object):
p.value = toUnicode(value) p.value = toUnicode(value)
db.commit() db.commit()
except:
self.log.error('Failed: %s', traceback.format_exc())
db.rollback()
finally:
db.close()

25
couchpotato/environment.py

@ -2,7 +2,6 @@ from couchpotato.core.event import fireEvent, addEvent
from couchpotato.core.loader import Loader from couchpotato.core.loader import Loader
from couchpotato.core.settings import Settings from couchpotato.core.settings import Settings
from sqlalchemy.engine import create_engine from sqlalchemy.engine import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm.session import sessionmaker from sqlalchemy.orm.session import sessionmaker
import os import os
@ -24,7 +23,7 @@ class Env(object):
_quiet = False _quiet = False
_daemonized = False _daemonized = False
_desktop = None _desktop = None
_session = None _engine = None
''' Data paths and directories ''' ''' Data paths and directories '''
_app_dir = "" _app_dir = ""
@ -54,20 +53,20 @@ class Env(object):
return setattr(Env, '_' + attr, value) return setattr(Env, '_' + attr, value)
@staticmethod @staticmethod
def getSession(engine = None): def getSession():
existing_session = Env.get('session') session = sessionmaker(bind = Env.getEngine())
if existing_session: return session()
return existing_session
engine = Env.getEngine()
session = scoped_session(sessionmaker(bind = engine))
Env.set('session', session)
return session
@staticmethod @staticmethod
def getEngine(): def getEngine():
return create_engine(Env.get('db_path'), echo = False) existing_engine = Env.get('engine')
if existing_engine:
return existing_engine
engine = create_engine(Env.get('db_path'), echo = False)
Env.set('engine', engine)
return engine
@staticmethod @staticmethod
def setting(attr, section = 'core', value = None, default = '', type = None): def setting(attr, section = 'core', value = None, default = '', type = None):

Loading…
Cancel
Save