Wrap all commits with try/except
This commit is contained in:
1 parent
31c39650a9
commit
7001ed476d
19 files changed
+919
-689
No files matched your search
@@ -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
|
||||||
|
|||||||
@@ -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():
|
||||||
db = get_session()
|
try:
|
||||||
media = db.query(Media).filter_by(id = id).first()
|
db = get_session()
|
||||||
media_dict = media.to_dict(self.default_dict)
|
media = db.query(Media).filter_by(id = id).first()
|
||||||
event_name = '%s.searcher.single' % media.type
|
media_dict = media.to_dict(self.default_dict)
|
||||||
db.expire_all()
|
event_name = '%s.searcher.single' % media.type
|
||||||
|
|
||||||
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():
|
||||||
db = get_session()
|
try:
|
||||||
media = db.query(Media).filter_by(id = media_id).first()
|
db = get_session()
|
||||||
media_dict = media.to_dict(self.default_dict)
|
media = db.query(Media).filter_by(id = media_id).first()
|
||||||
event_name = '%s.update' % media.type
|
media_dict = media.to_dict(self.default_dict)
|
||||||
db.expire_all()
|
event_name = '%s.update' % media.type
|
||||||
|
|
||||||
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
|
||||||
@@ -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,50 +376,55 @@ class MediaPlugin(MediaBase):
|
|||||||
|
|
||||||
def delete(self, media_id, delete_from = None):
|
def delete(self, media_id, delete_from = None):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
media = db.query(Media).filter_by(id = media_id).first()
|
media = db.query(Media).filter_by(id = media_id).first()
|
||||||
if media:
|
if media:
|
||||||
deleted = False
|
deleted = False
|
||||||
if delete_from == 'all':
|
if delete_from == 'all':
|
||||||
db.delete(media)
|
|
||||||
db.commit()
|
|
||||||
deleted = True
|
|
||||||
else:
|
|
||||||
done_status = fireEvent('status.get', 'done', single = True)
|
|
||||||
|
|
||||||
total_releases = len(media.releases)
|
|
||||||
total_deleted = 0
|
|
||||||
new_movie_status = None
|
|
||||||
for release in media.releases:
|
|
||||||
if delete_from in ['wanted', 'snatched', 'late']:
|
|
||||||
if release.status_id != done_status.get('id'):
|
|
||||||
db.delete(release)
|
|
||||||
total_deleted += 1
|
|
||||||
new_movie_status = 'done'
|
|
||||||
elif delete_from == 'manage':
|
|
||||||
if release.status_id == done_status.get('id'):
|
|
||||||
db.delete(release)
|
|
||||||
total_deleted += 1
|
|
||||||
new_movie_status = 'active'
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
if total_releases == total_deleted:
|
|
||||||
db.delete(media)
|
db.delete(media)
|
||||||
db.commit()
|
db.commit()
|
||||||
deleted = True
|
deleted = True
|
||||||
elif new_movie_status:
|
|
||||||
new_status = fireEvent('status.get', new_movie_status, single = True)
|
|
||||||
media.profile_id = None
|
|
||||||
media.status_id = new_status.get('id')
|
|
||||||
db.commit()
|
|
||||||
else:
|
else:
|
||||||
fireEvent('media.restatus', media.id, single = True)
|
done_status = fireEvent('status.get', 'done', single = True)
|
||||||
|
|
||||||
if deleted:
|
total_releases = len(media.releases)
|
||||||
fireEvent('notify.frontend', type = 'movie.deleted', data = media.to_dict())
|
total_deleted = 0
|
||||||
|
new_movie_status = None
|
||||||
|
for release in media.releases:
|
||||||
|
if delete_from in ['wanted', 'snatched', 'late']:
|
||||||
|
if release.status_id != done_status.get('id'):
|
||||||
|
db.delete(release)
|
||||||
|
total_deleted += 1
|
||||||
|
new_movie_status = 'done'
|
||||||
|
elif delete_from == 'manage':
|
||||||
|
if release.status_id == done_status.get('id'):
|
||||||
|
db.delete(release)
|
||||||
|
total_deleted += 1
|
||||||
|
new_movie_status = 'active'
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
if total_releases == total_deleted:
|
||||||
|
db.delete(media)
|
||||||
|
db.commit()
|
||||||
|
deleted = True
|
||||||
|
elif new_movie_status:
|
||||||
|
new_status = fireEvent('status.get', new_movie_status, single = True)
|
||||||
|
media.profile_id = None
|
||||||
|
media.status_id = new_status.get('id')
|
||||||
|
db.commit()
|
||||||
|
else:
|
||||||
|
fireEvent('media.restatus', media.id, single = True)
|
||||||
|
|
||||||
|
if deleted:
|
||||||
|
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,28 +448,33 @@ 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)
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
m = db.query(Media).filter_by(id = media_id).first()
|
m = db.query(Media).filter_by(id = media_id).first()
|
||||||
if not m or len(m.library.titles) == 0:
|
if not m or len(m.library.titles) == 0:
|
||||||
log.debug('Can\'t restatus movie, doesn\'t seem to exist.')
|
log.debug('Can\'t restatus movie, doesn\'t seem to exist.')
|
||||||
return False
|
return False
|
||||||
|
|
||||||
log.debug('Changing status for %s', m.library.titles[0].title)
|
log.debug('Changing status for %s', m.library.titles[0].title)
|
||||||
if not m.profile:
|
if not m.profile:
|
||||||
m.status_id = done_status.get('id')
|
m.status_id = done_status.get('id')
|
||||||
else:
|
else:
|
||||||
move_to_wanted = True
|
move_to_wanted = True
|
||||||
|
|
||||||
for t in m.profile.types:
|
for t in m.profile.types:
|
||||||
for release in m.releases:
|
for release in m.releases:
|
||||||
if t.quality.identifier is release.quality.identifier and (release.status_id is done_status.get('id') and t.finish):
|
if t.quality.identifier is release.quality.identifier and (release.status_id is done_status.get('id') and t.finish):
|
||||||
move_to_wanted = False
|
move_to_wanted = False
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
@@ -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,76 +71,81 @@ 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')
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
m = db.query(Media).filter_by(library_id = library.get('id')).first()
|
db = get_session()
|
||||||
added = True
|
m = db.query(Media).filter_by(library_id = library.get('id')).first()
|
||||||
do_search = False
|
added = True
|
||||||
search_after = search_after and self.conf('search_on_add', section = 'moviesearcher')
|
do_search = False
|
||||||
if not m:
|
search_after = search_after and self.conf('search_on_add', section = 'moviesearcher')
|
||||||
m = Media(
|
if not m:
|
||||||
library_id = library.get('id'),
|
m = Media(
|
||||||
profile_id = params.get('profile_id', default_profile.get('id')),
|
library_id = library.get('id'),
|
||||||
status_id = status_id if status_id else status_active.get('id'),
|
profile_id = params.get('profile_id', default_profile.get('id')),
|
||||||
category_id = tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else None,
|
status_id = status_id if status_id else status_active.get('id'),
|
||||||
)
|
category_id = tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else None,
|
||||||
db.add(m)
|
)
|
||||||
db.commit()
|
db.add(m)
|
||||||
|
|
||||||
onComplete = None
|
|
||||||
if search_after:
|
|
||||||
onComplete = self.createOnComplete(m.id)
|
|
||||||
|
|
||||||
fireEventAsync('library.update.movie', params.get('identifier'), default_title = params.get('title', ''), on_complete = onComplete)
|
|
||||||
search_after = False
|
|
||||||
elif force_readd:
|
|
||||||
|
|
||||||
# Clean snatched history
|
|
||||||
for release in m.releases:
|
|
||||||
if release.status_id in [downloaded_status.get('id'), snatched_status.get('id'), done_status.get('id')]:
|
|
||||||
if params.get('ignore_previous', False):
|
|
||||||
release.status_id = ignored_status.get('id')
|
|
||||||
else:
|
|
||||||
fireEvent('release.delete', release.id, single = True)
|
|
||||||
|
|
||||||
m.profile_id = params.get('profile_id', default_profile.get('id'))
|
|
||||||
m.category_id = tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else (m.category_id or None)
|
|
||||||
else:
|
|
||||||
log.debug('Movie already exists, not updating: %s', params)
|
|
||||||
added = False
|
|
||||||
|
|
||||||
if force_readd:
|
|
||||||
m.status_id = status_id if status_id else status_active.get('id')
|
|
||||||
m.last_edit = int(time.time())
|
|
||||||
do_search = True
|
|
||||||
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Remove releases
|
|
||||||
available_status = fireEvent('status.get', 'available', single = True)
|
|
||||||
for rel in m.releases:
|
|
||||||
if rel.status_id is available_status.get('id'):
|
|
||||||
db.delete(rel)
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
movie_dict = m.to_dict(self.default_dict)
|
onComplete = None
|
||||||
|
if search_after:
|
||||||
|
onComplete = self.createOnComplete(m.id)
|
||||||
|
|
||||||
if do_search and search_after:
|
fireEventAsync('library.update.movie', params.get('identifier'), default_title = params.get('title', ''), on_complete = onComplete)
|
||||||
onComplete = self.createOnComplete(m.id)
|
search_after = False
|
||||||
onComplete()
|
elif force_readd:
|
||||||
|
|
||||||
if added:
|
# Clean snatched history
|
||||||
if params.get('title'):
|
for release in m.releases:
|
||||||
message = 'Successfully added "%s" to your wanted list.' % params.get('title', '')
|
if release.status_id in [downloaded_status.get('id'), snatched_status.get('id'), done_status.get('id')]:
|
||||||
|
if params.get('ignore_previous', False):
|
||||||
|
release.status_id = ignored_status.get('id')
|
||||||
|
else:
|
||||||
|
fireEvent('release.delete', release.id, single = True)
|
||||||
|
|
||||||
|
m.profile_id = params.get('profile_id', default_profile.get('id'))
|
||||||
|
m.category_id = tryInt(cat_id) if cat_id is not None and tryInt(cat_id) > 0 else (m.category_id or None)
|
||||||
else:
|
else:
|
||||||
title = getTitle(m.library)
|
log.debug('Movie already exists, not updating: %s', params)
|
||||||
if title:
|
added = False
|
||||||
message = 'Successfully added "%s" to your wanted list.' % title
|
|
||||||
else:
|
|
||||||
message = 'Succesfully added to your wanted list.'
|
|
||||||
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = message)
|
|
||||||
|
|
||||||
db.expire_all()
|
if force_readd:
|
||||||
return movie_dict
|
m.status_id = status_id if status_id else status_active.get('id')
|
||||||
|
m.last_edit = int(time.time())
|
||||||
|
do_search = True
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
# Remove releases
|
||||||
|
available_status = fireEvent('status.get', 'available', single = True)
|
||||||
|
for rel in m.releases:
|
||||||
|
if rel.status_id is available_status.get('id'):
|
||||||
|
db.delete(rel)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
movie_dict = m.to_dict(self.default_dict)
|
||||||
|
|
||||||
|
if do_search and search_after:
|
||||||
|
onComplete = self.createOnComplete(m.id)
|
||||||
|
onComplete()
|
||||||
|
|
||||||
|
if added:
|
||||||
|
if params.get('title'):
|
||||||
|
message = 'Successfully added "%s" to your wanted list.' % params.get('title', '')
|
||||||
|
else:
|
||||||
|
title = getTitle(m.library)
|
||||||
|
if title:
|
||||||
|
message = 'Successfully added "%s" to your wanted list.' % title
|
||||||
|
else:
|
||||||
|
message = 'Succesfully added to your wanted list.'
|
||||||
|
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = message)
|
||||||
|
|
||||||
|
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,42 +157,51 @@ class MovieBase(MovieTypeBase):
|
|||||||
|
|
||||||
def edit(self, id = '', **kwargs):
|
def edit(self, id = '', **kwargs):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
available_status = fireEvent('status.get', 'available', single = True)
|
available_status = fireEvent('status.get', 'available', single = True)
|
||||||
|
|
||||||
ids = splitString(id)
|
ids = splitString(id)
|
||||||
for media_id in ids:
|
for media_id in ids:
|
||||||
|
|
||||||
m = db.query(Media).filter_by(id = media_id).first()
|
m = db.query(Media).filter_by(id = media_id).first()
|
||||||
if not m:
|
if not m:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
m.profile_id = kwargs.get('profile_id')
|
m.profile_id = kwargs.get('profile_id')
|
||||||
|
|
||||||
cat_id = kwargs.get('category_id')
|
cat_id = kwargs.get('category_id')
|
||||||
if cat_id is not None:
|
if cat_id is not None:
|
||||||
m.category_id = tryInt(cat_id) if tryInt(cat_id) > 0 else None
|
m.category_id = tryInt(cat_id) if tryInt(cat_id) > 0 else None
|
||||||
|
|
||||||
# Remove releases
|
# Remove releases
|
||||||
for rel in m.releases:
|
for rel in m.releases:
|
||||||
if rel.status_id is available_status.get('id'):
|
if rel.status_id is available_status.get('id'):
|
||||||
db.delete(rel)
|
db.delete(rel)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
# Default title
|
# Default title
|
||||||
if kwargs.get('default_title'):
|
if kwargs.get('default_title'):
|
||||||
for title in m.library.titles:
|
for title in m.library.titles:
|
||||||
title.default = toUnicode(kwargs.get('default_title', '')).lower() == toUnicode(title.title).lower()
|
title.default = toUnicode(kwargs.get('default_title', '')).lower() == toUnicode(title.title).lower()
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
fireEvent('media.restatus', m.id)
|
fireEvent('media.restatus', m.id)
|
||||||
|
|
||||||
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))
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed deleting media: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': False,
|
||||||
}
|
}
|
||||||
@@ -26,142 +26,163 @@ class MovieLibraryPlugin(LibraryBase):
|
|||||||
|
|
||||||
primary_provider = attrs.get('primary_provider', 'imdb')
|
primary_provider = attrs.get('primary_provider', 'imdb')
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
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()
|
||||||
if not l:
|
if not l:
|
||||||
status = fireEvent('status.get', 'needs_update', single = True)
|
status = fireEvent('status.get', 'needs_update', single = True)
|
||||||
l = Library(
|
l = Library(
|
||||||
year = attrs.get('year'),
|
year = attrs.get('year'),
|
||||||
identifier = attrs.get('identifier'),
|
identifier = attrs.get('identifier'),
|
||||||
plot = toUnicode(attrs.get('plot')),
|
plot = toUnicode(attrs.get('plot')),
|
||||||
tagline = toUnicode(attrs.get('tagline')),
|
tagline = toUnicode(attrs.get('tagline')),
|
||||||
status_id = status.get('id'),
|
status_id = status.get('id'),
|
||||||
info = {}
|
info = {}
|
||||||
)
|
)
|
||||||
|
|
||||||
title = LibraryTitle(
|
title = LibraryTitle(
|
||||||
title = toUnicode(attrs.get('title')),
|
title = toUnicode(attrs.get('title')),
|
||||||
simple_title = self.simplifyTitle(attrs.get('title')),
|
simple_title = self.simplifyTitle(attrs.get('title')),
|
||||||
)
|
)
|
||||||
|
|
||||||
l.titles.append(title)
|
l.titles.append(title)
|
||||||
|
|
||||||
db.add(l)
|
db.add(l)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
# Update library info
|
# Update library info
|
||||||
if update_after is not False:
|
if update_after is not False:
|
||||||
handle = fireEventAsync if update_after is 'async' else fireEvent
|
handle = fireEventAsync if update_after is 'async' else fireEvent
|
||||||
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)
|
||||||
|
return library_dict
|
||||||
|
except:
|
||||||
|
log.error('Failed adding media: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
db.expire_all()
|
return {}
|
||||||
return library_dict
|
|
||||||
|
|
||||||
def update(self, identifier, default_title = '', extended = False):
|
def update(self, identifier, default_title = '', extended = False):
|
||||||
|
|
||||||
if self.shuttingDown():
|
if self.shuttingDown():
|
||||||
return
|
return
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
library = db.query(Library).filter_by(identifier = identifier).first()
|
db = get_session()
|
||||||
done_status = fireEvent('status.get', 'done', single = True)
|
|
||||||
|
|
||||||
info = fireEvent('movie.info', merge = True, extended = extended, identifier = identifier)
|
library = db.query(Library).filter_by(identifier = identifier).first()
|
||||||
|
done_status = fireEvent('status.get', 'done', single = True)
|
||||||
|
|
||||||
# Don't need those here
|
info = fireEvent('movie.info', merge = True, extended = extended, identifier = identifier)
|
||||||
try: del info['in_wanted']
|
|
||||||
except: pass
|
|
||||||
try: del info['in_library']
|
|
||||||
except: pass
|
|
||||||
|
|
||||||
if not info or len(info) == 0:
|
# Don't need those here
|
||||||
log.error('Could not update, no movie info to work with: %s', identifier)
|
try: del info['in_wanted']
|
||||||
return False
|
except: pass
|
||||||
|
try: del info['in_library']
|
||||||
|
except: pass
|
||||||
|
|
||||||
# Main info
|
if not info or len(info) == 0:
|
||||||
library.plot = toUnicode(info.get('plot', ''))
|
log.error('Could not update, no movie info to work with: %s', identifier)
|
||||||
library.tagline = toUnicode(info.get('tagline', ''))
|
return False
|
||||||
library.year = info.get('year', 0)
|
|
||||||
library.status_id = done_status.get('id')
|
|
||||||
library.info.update(info)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Titles
|
# Main info
|
||||||
[db.delete(title) for title in library.titles]
|
library.plot = toUnicode(info.get('plot', ''))
|
||||||
db.commit()
|
library.tagline = toUnicode(info.get('tagline', ''))
|
||||||
|
library.year = info.get('year', 0)
|
||||||
|
library.status_id = done_status.get('id')
|
||||||
|
library.info.update(info)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
titles = info.get('titles', [])
|
# Titles
|
||||||
log.debug('Adding titles: %s', titles)
|
[db.delete(title) for title in library.titles]
|
||||||
counter = 0
|
db.commit()
|
||||||
|
|
||||||
def_title = None
|
titles = info.get('titles', [])
|
||||||
for title in titles:
|
log.debug('Adding titles: %s', titles)
|
||||||
if (len(default_title) == 0 and counter == 0) or len(titles) == 1 or title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == six.u('') and toUnicode(titles[0]) == title):
|
counter = 0
|
||||||
def_title = toUnicode(title)
|
|
||||||
break
|
|
||||||
counter += 1
|
|
||||||
|
|
||||||
#if not def_title:
|
def_title = None
|
||||||
# def_title = toUnicode(titles[0])
|
for title in titles:
|
||||||
|
if (len(default_title) == 0 and counter == 0) or len(titles) == 1 or title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == six.u('') and toUnicode(titles[0]) == title):
|
||||||
|
def_title = toUnicode(title)
|
||||||
|
break
|
||||||
|
counter += 1
|
||||||
|
|
||||||
for title in titles:
|
if not def_title:
|
||||||
if not title:
|
def_title = toUnicode(titles[0])
|
||||||
continue
|
|
||||||
title = toUnicode(title)
|
|
||||||
t = LibraryTitle(
|
|
||||||
title = title,
|
|
||||||
simple_title = self.simplifyTitle(title),
|
|
||||||
default = title == def_title
|
|
||||||
)
|
|
||||||
library.titles.append(t)
|
|
||||||
|
|
||||||
db.commit()
|
for title in titles:
|
||||||
|
if not title:
|
||||||
# Files
|
|
||||||
images = info.get('images', [])
|
|
||||||
for image_type in ['poster']:
|
|
||||||
for image in images.get(image_type, []):
|
|
||||||
if not isinstance(image, (str, unicode)):
|
|
||||||
continue
|
continue
|
||||||
|
title = toUnicode(title)
|
||||||
|
t = LibraryTitle(
|
||||||
|
title = title,
|
||||||
|
simple_title = self.simplifyTitle(title),
|
||||||
|
default = title == def_title
|
||||||
|
)
|
||||||
|
library.titles.append(t)
|
||||||
|
|
||||||
file_path = fireEvent('file.download', url = image, single = True)
|
db.commit()
|
||||||
if file_path:
|
|
||||||
file_obj = fireEvent('file.add', path = file_path, type_tuple = ('image', image_type), single = True)
|
|
||||||
try:
|
|
||||||
file_obj = db.query(File).filter_by(id = file_obj.get('id')).one()
|
|
||||||
library.files.append(file_obj)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
break
|
# Files
|
||||||
except:
|
images = info.get('images', [])
|
||||||
log.debug('Failed to attach to library: %s', traceback.format_exc())
|
for image_type in ['poster']:
|
||||||
|
for image in images.get(image_type, []):
|
||||||
|
if not isinstance(image, (str, unicode)):
|
||||||
|
continue
|
||||||
|
|
||||||
library_dict = library.to_dict(self.default_dict)
|
file_path = fireEvent('file.download', url = image, single = True)
|
||||||
|
if file_path:
|
||||||
|
file_obj = fireEvent('file.add', path = file_path, type_tuple = ('image', image_type), single = True)
|
||||||
|
try:
|
||||||
|
file_obj = db.query(File).filter_by(id = file_obj.get('id')).one()
|
||||||
|
library.files.append(file_obj)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
db.expire_all()
|
break
|
||||||
return library_dict
|
except:
|
||||||
|
log.debug('Failed to attach to library: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
|
||||||
|
library_dict = library.to_dict(self.default_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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
library = db.query(Library).filter_by(identifier = identifier).first()
|
db = get_session()
|
||||||
|
library = db.query(Library).filter_by(identifier = identifier).first()
|
||||||
|
|
||||||
if not library.info:
|
if not library.info:
|
||||||
library_dict = self.update(identifier)
|
library_dict = self.update(identifier)
|
||||||
dates = library_dict.get('info', {}).get('release_date')
|
dates = library_dict.get('info', {}).get('release_date')
|
||||||
else:
|
else:
|
||||||
dates = library.info.get('release_date')
|
dates = library.info.get('release_date')
|
||||||
|
|
||||||
if dates and (dates.get('expires', 0) < time.time() or dates.get('expires', 0) > time.time() + (604800 * 4)) or not dates:
|
if dates and (dates.get('expires', 0) < time.time() or dates.get('expires', 0) > time.time() + (604800 * 4)) or not dates:
|
||||||
dates = fireEvent('movie.release_date', identifier = identifier, merge = True)
|
dates = fireEvent('movie.release_date', identifier = identifier, merge = True)
|
||||||
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):
|
||||||
|
|||||||
@@ -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':
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -67,27 +67,42 @@ class CoreNotifier(Notification):
|
|||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
db.query(Notif).filter(Notif.added <= (int(time.time()) - 2419200)).delete()
|
db = get_session()
|
||||||
db.commit()
|
db.query(Notif).filter(Notif.added <= (int(time.time()) - 2419200)).delete()
|
||||||
|
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
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
if ids:
|
if ids:
|
||||||
q = db.query(Notif).filter(or_(*[Notif.id == tryInt(s) for s in ids]))
|
q = db.query(Notif).filter(or_(*[Notif.id == tryInt(s) for s in ids]))
|
||||||
else:
|
else:
|
||||||
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 {
|
||||||
|
'success': True
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed mark as read: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True
|
'success': False
|
||||||
}
|
}
|
||||||
|
|
||||||
def listView(self, limit_offset = None, **kwargs):
|
def listView(self, limit_offset = None, **kwargs):
|
||||||
@@ -139,24 +154,30 @@ 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 = {}
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
data['notification_type'] = listener if listener else 'unknown'
|
data['notification_type'] = listener if listener else 'unknown'
|
||||||
|
|
||||||
n = Notif(
|
n = Notif(
|
||||||
message = toUnicode(message),
|
message = toUnicode(message),
|
||||||
data = data
|
data = data
|
||||||
)
|
)
|
||||||
db.add(n)
|
db.add(n)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
ndict = n.to_dict()
|
ndict = n.to_dict()
|
||||||
ndict['type'] = 'notification'
|
ndict['type'] = 'notification'
|
||||||
ndict['time'] = time.time()
|
ndict['time'] = time.time()
|
||||||
|
|
||||||
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 = {}
|
||||||
|
|||||||
@@ -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,83 +42,116 @@ 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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
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()
|
||||||
if not c:
|
if not c:
|
||||||
c = Category()
|
c = Category()
|
||||||
db.add(c)
|
db.add(c)
|
||||||
|
|
||||||
c.order = kwargs.get('order', c.order if c.order else 0)
|
c.order = kwargs.get('order', c.order if c.order else 0)
|
||||||
c.label = toUnicode(kwargs.get('label', ''))
|
c.label = toUnicode(kwargs.get('label', ''))
|
||||||
c.ignored = toUnicode(kwargs.get('ignored', ''))
|
c.ignored = toUnicode(kwargs.get('ignored', ''))
|
||||||
c.preferred = toUnicode(kwargs.get('preferred', ''))
|
c.preferred = toUnicode(kwargs.get('preferred', ''))
|
||||||
c.required = toUnicode(kwargs.get('required', ''))
|
c.required = toUnicode(kwargs.get('required', ''))
|
||||||
c.destination = toUnicode(kwargs.get('destination', ''))
|
c.destination = toUnicode(kwargs.get('destination', ''))
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
category_dict = c.to_dict()
|
category_dict = c.to_dict()
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'category': category_dict
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': False,
|
||||||
'category': category_dict
|
'category': None
|
||||||
}
|
}
|
||||||
|
|
||||||
def saveOrder(self, **kwargs):
|
def saveOrder(self, **kwargs):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
order = 0
|
order = 0
|
||||||
for category_id in kwargs.get('ids', []):
|
for category_id in kwargs.get('ids', []):
|
||||||
c = db.query(Category).filter_by(id = category_id).first()
|
c = db.query(Category).filter_by(id = category_id).first()
|
||||||
c.order = order
|
c.order = order
|
||||||
|
|
||||||
order += 1
|
order += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True
|
'success': False
|
||||||
}
|
}
|
||||||
|
|
||||||
def delete(self, id = None, **kwargs):
|
def delete(self, id = None, **kwargs):
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
success = False
|
|
||||||
message = ''
|
|
||||||
try:
|
try:
|
||||||
c = db.query(Category).filter_by(id = id).first()
|
db = get_session()
|
||||||
db.delete(c)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Force defaults on all empty category movies
|
success = False
|
||||||
self.removeFromMovie(id)
|
message = ''
|
||||||
|
try:
|
||||||
|
c = db.query(Category).filter_by(id = id).first()
|
||||||
|
db.delete(c)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
success = True
|
# Force defaults on all empty category movies
|
||||||
except Exception as e:
|
self.removeFromMovie(id)
|
||||||
message = log.error('Failed deleting category: %s', e)
|
|
||||||
|
success = True
|
||||||
|
except Exception as e:
|
||||||
|
message = log.error('Failed deleting category: %s', e)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': success,
|
||||||
|
'message': message
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return {
|
return {
|
||||||
'success': success,
|
'success': False
|
||||||
'message': message
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def removeFromMovie(self, category_id):
|
def removeFromMovie(self, category_id):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
movies = db.query(Media).filter(Media.category_id == category_id).all()
|
db = get_session()
|
||||||
|
movies = db.query(Media).filter(Media.category_id == category_id).all()
|
||||||
|
|
||||||
if len(movies) > 0:
|
if len(movies) > 0:
|
||||||
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()
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,42 +105,56 @@ 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:
|
||||||
f = File()
|
f = File()
|
||||||
db.add(f)
|
db.add(f)
|
||||||
|
|
||||||
f.path = toUnicode(path)
|
f.path = toUnicode(path)
|
||||||
f.part = part
|
f.part = part
|
||||||
f.available = available
|
f.available = available
|
||||||
f.type_id = type_id
|
f.type_id = type_id
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
type_type, type_identifier = type_tuple
|
db = get_session()
|
||||||
|
type_type, type_identifier = type_tuple
|
||||||
|
|
||||||
ft = db.query(FileType).filter_by(identifier = type_identifier).first()
|
ft = db.query(FileType).filter_by(identifier = type_identifier).first()
|
||||||
if not ft:
|
if not ft:
|
||||||
ft = FileType(
|
ft = FileType(
|
||||||
type = toUnicode(type_type),
|
type = toUnicode(type_type),
|
||||||
identifier = type_identifier,
|
identifier = type_identifier,
|
||||||
name = toUnicode(type_identifier[0].capitalize() + type_identifier[1:])
|
name = toUnicode(type_identifier[0].capitalize() + type_identifier[1:])
|
||||||
)
|
)
|
||||||
db.add(ft)
|
db.add(ft)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
type_dict = ft.to_dict()
|
||||||
|
|
||||||
|
return type_dict
|
||||||
|
except:
|
||||||
|
log.error('Failed getting type: %s, %s', (type_tuple, traceback.format_exc()))
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
type_dict = ft.to_dict()
|
|
||||||
return type_dict
|
|
||||||
|
|
||||||
def getTypes(self):
|
def getTypes(self):
|
||||||
|
|
||||||
|
|||||||
@@ -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,16 +38,20 @@ 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)
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
movies = db.query(Media).filter(Media.status_id == active_status.get('id'), Media.profile == None).all()
|
db = get_session()
|
||||||
|
movies = db.query(Media).filter(Media.status_id == active_status.get('id'), Media.profile == None).all()
|
||||||
|
|
||||||
if len(movies) > 0:
|
if len(movies) > 0:
|
||||||
default_profile = self.default()
|
default_profile = self.default()
|
||||||
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,44 +71,53 @@ 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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
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()
|
||||||
if not p:
|
if not p:
|
||||||
p = Profile()
|
p = Profile()
|
||||||
db.add(p)
|
db.add(p)
|
||||||
|
|
||||||
p.label = toUnicode(kwargs.get('label'))
|
p.label = toUnicode(kwargs.get('label'))
|
||||||
p.order = kwargs.get('order', p.order if p.order else 0)
|
p.order = kwargs.get('order', p.order if p.order else 0)
|
||||||
p.core = kwargs.get('core', False)
|
p.core = kwargs.get('core', False)
|
||||||
|
|
||||||
#delete old types
|
#delete old types
|
||||||
[db.delete(t) for t in p.types]
|
[db.delete(t) for t in p.types]
|
||||||
|
|
||||||
order = 0
|
order = 0
|
||||||
for type in kwargs.get('types', []):
|
for type in kwargs.get('types', []):
|
||||||
t = ProfileType(
|
t = ProfileType(
|
||||||
order = order,
|
order = order,
|
||||||
finish = type.get('finish') if order > 0 else 1,
|
finish = type.get('finish') if order > 0 else 1,
|
||||||
wait_for = kwargs.get('wait_for'),
|
wait_for = kwargs.get('wait_for'),
|
||||||
quality_id = type.get('quality_id')
|
quality_id = type.get('quality_id')
|
||||||
)
|
)
|
||||||
p.types.append(t)
|
p.types.append(t)
|
||||||
|
|
||||||
order += 1
|
order += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
profile_dict = p.to_dict(self.to_dict)
|
profile_dict = p.to_dict(self.to_dict)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True,
|
||||||
|
'profile': profile_dict
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True,
|
'success': False
|
||||||
'profile': profile_dict
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def default(self):
|
def default(self):
|
||||||
@@ -114,93 +128,119 @@ 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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
order = 0
|
order = 0
|
||||||
for profile in kwargs.get('ids', []):
|
for profile in kwargs.get('ids', []):
|
||||||
p = db.query(Profile).filter_by(id = profile).first()
|
p = db.query(Profile).filter_by(id = profile).first()
|
||||||
p.hide = kwargs.get('hidden')[order]
|
p.hide = kwargs.get('hidden')[order]
|
||||||
p.order = order
|
p.order = order
|
||||||
|
|
||||||
order += 1
|
order += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True
|
'success': False
|
||||||
}
|
}
|
||||||
|
|
||||||
def delete(self, id = None, **kwargs):
|
def delete(self, id = None, **kwargs):
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
success = False
|
|
||||||
message = ''
|
|
||||||
try:
|
try:
|
||||||
p = db.query(Profile).filter_by(id = id).first()
|
db = get_session()
|
||||||
|
|
||||||
db.delete(p)
|
success = False
|
||||||
db.commit()
|
message = ''
|
||||||
|
try:
|
||||||
|
p = db.query(Profile).filter_by(id = id).first()
|
||||||
|
|
||||||
# Force defaults on all empty profile movies
|
db.delete(p)
|
||||||
self.forceDefaults()
|
db.commit()
|
||||||
|
|
||||||
success = True
|
# Force defaults on all empty profile movies
|
||||||
except Exception as e:
|
self.forceDefaults()
|
||||||
message = log.error('Failed deleting Profile: %s', e)
|
|
||||||
|
success = True
|
||||||
|
except Exception as e:
|
||||||
|
message = log.error('Failed deleting Profile: %s', e)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': success,
|
||||||
|
'message': message
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return {
|
return {
|
||||||
'success': success,
|
'success': False
|
||||||
'message': message
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def fill(self):
|
def fill(self):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
profiles = [{
|
profiles = [{
|
||||||
'label': 'Best',
|
'label': 'Best',
|
||||||
'qualities': ['720p', '1080p', 'brrip', 'dvdrip']
|
'qualities': ['720p', '1080p', 'brrip', 'dvdrip']
|
||||||
}, {
|
}, {
|
||||||
'label': 'HD',
|
'label': 'HD',
|
||||||
'qualities': ['720p', '1080p']
|
'qualities': ['720p', '1080p']
|
||||||
}, {
|
}, {
|
||||||
'label': 'SD',
|
'label': 'SD',
|
||||||
'qualities': ['dvdrip', 'dvdr']
|
'qualities': ['dvdrip', 'dvdr']
|
||||||
}]
|
}]
|
||||||
|
|
||||||
# Create default quality profile
|
# Create default quality profile
|
||||||
order = -2
|
order = -2
|
||||||
for profile in profiles:
|
for profile in profiles:
|
||||||
log.info('Creating default profile: %s', profile.get('label'))
|
log.info('Creating default profile: %s', profile.get('label'))
|
||||||
p = Profile(
|
p = Profile(
|
||||||
label = toUnicode(profile.get('label')),
|
label = toUnicode(profile.get('label')),
|
||||||
order = order
|
order = order
|
||||||
)
|
|
||||||
db.add(p)
|
|
||||||
|
|
||||||
quality_order = 0
|
|
||||||
for quality in profile.get('qualities'):
|
|
||||||
quality = fireEvent('quality.single', identifier = quality, single = True)
|
|
||||||
profile_type = ProfileType(
|
|
||||||
quality_id = quality.get('id'),
|
|
||||||
profile = p,
|
|
||||||
finish = True,
|
|
||||||
wait_for = 0,
|
|
||||||
order = quality_order
|
|
||||||
)
|
)
|
||||||
p.types.append(profile_type)
|
db.add(p)
|
||||||
|
|
||||||
quality_order += 1
|
quality_order = 0
|
||||||
|
for quality in profile.get('qualities'):
|
||||||
|
quality = fireEvent('quality.single', identifier = quality, single = True)
|
||||||
|
profile_type = ProfileType(
|
||||||
|
quality_id = quality.get('id'),
|
||||||
|
profile = p,
|
||||||
|
finish = True,
|
||||||
|
wait_for = 0,
|
||||||
|
order = quality_order
|
||||||
|
)
|
||||||
|
p.types.append(profile_type)
|
||||||
|
|
||||||
order += 1
|
quality_order += 1
|
||||||
|
|
||||||
db.commit()
|
order += 1
|
||||||
|
|
||||||
return True
|
db.commit()
|
||||||
|
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
return False
|
||||||
@@ -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,70 +99,88 @@ class QualityPlugin(Plugin):
|
|||||||
|
|
||||||
def saveSize(self, **kwargs):
|
def saveSize(self, **kwargs):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
quality = db.query(Quality).filter_by(identifier = kwargs.get('identifier')).first()
|
db = get_session()
|
||||||
|
quality = db.query(Quality).filter_by(identifier = kwargs.get('identifier')).first()
|
||||||
|
|
||||||
if quality:
|
if quality:
|
||||||
setattr(quality, kwargs.get('value_type'), kwargs.get('value'))
|
setattr(quality, kwargs.get('value_type'), kwargs.get('value'))
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
self.cached_qualities = None
|
self.cached_qualities = None
|
||||||
|
|
||||||
|
return {
|
||||||
|
'success': True
|
||||||
|
}
|
||||||
|
except:
|
||||||
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'success': True
|
'success': False
|
||||||
}
|
}
|
||||||
|
|
||||||
def fill(self):
|
def fill(self):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
order = 0
|
order = 0
|
||||||
for q in self.qualities:
|
for q in self.qualities:
|
||||||
|
|
||||||
# Create quality
|
# Create quality
|
||||||
qual = db.query(Quality).filter_by(identifier = q.get('identifier')).first()
|
qual = db.query(Quality).filter_by(identifier = q.get('identifier')).first()
|
||||||
|
|
||||||
if not qual:
|
if not qual:
|
||||||
log.info('Creating quality: %s', q.get('label'))
|
log.info('Creating quality: %s', q.get('label'))
|
||||||
qual = Quality()
|
qual = Quality()
|
||||||
qual.order = order
|
qual.order = order
|
||||||
qual.identifier = q.get('identifier')
|
qual.identifier = q.get('identifier')
|
||||||
qual.label = toUnicode(q.get('label'))
|
qual.label = toUnicode(q.get('label'))
|
||||||
qual.size_min, qual.size_max = q.get('size')
|
qual.size_min, qual.size_max = q.get('size')
|
||||||
|
|
||||||
db.add(qual)
|
db.add(qual)
|
||||||
|
|
||||||
# Create single quality profile
|
# Create single quality profile
|
||||||
prof = db.query(Profile).filter(
|
prof = db.query(Profile).filter(
|
||||||
Profile.core == True
|
Profile.core == True
|
||||||
).filter(
|
).filter(
|
||||||
Profile.types.any(quality = qual)
|
Profile.types.any(quality = qual)
|
||||||
).all()
|
).all()
|
||||||
|
|
||||||
if not prof:
|
if not prof:
|
||||||
log.info('Creating profile: %s', q.get('label'))
|
log.info('Creating profile: %s', q.get('label'))
|
||||||
prof = Profile(
|
prof = Profile(
|
||||||
core = True,
|
core = True,
|
||||||
label = toUnicode(qual.label),
|
label = toUnicode(qual.label),
|
||||||
order = order
|
order = order
|
||||||
)
|
)
|
||||||
db.add(prof)
|
db.add(prof)
|
||||||
|
|
||||||
profile_type = ProfileType(
|
profile_type = ProfileType(
|
||||||
quality = qual,
|
quality = qual,
|
||||||
profile = prof,
|
profile = prof,
|
||||||
finish = True,
|
finish = True,
|
||||||
order = 0
|
order = 0
|
||||||
)
|
)
|
||||||
prof.types.append(profile_type)
|
prof.types.append(profile_type)
|
||||||
|
|
||||||
order += 1
|
order += 1
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
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 = {}
|
||||||
|
|||||||
@@ -88,63 +88,69 @@ 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):
|
||||||
|
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
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:
|
|
||||||
media = Media(
|
|
||||||
library_id = group['library'].get('id'),
|
|
||||||
profile_id = 0,
|
|
||||||
status_id = done_status.get('id')
|
|
||||||
)
|
|
||||||
db.add(media)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Add Release
|
|
||||||
rel = db.query(Relea).filter(
|
|
||||||
or_(
|
|
||||||
Relea.identifier == identifier,
|
|
||||||
and_(Relea.identifier.startswith(group['library']['identifier']), Relea.status_id == snatched_status.get('id'))
|
|
||||||
)
|
|
||||||
).first()
|
|
||||||
if not rel:
|
|
||||||
rel = Relea(
|
|
||||||
identifier = identifier,
|
|
||||||
movie = media,
|
|
||||||
quality_id = group['meta_data']['quality'].get('id'),
|
|
||||||
status_id = done_status.get('id')
|
|
||||||
)
|
|
||||||
db.add(rel)
|
|
||||||
db.commit()
|
|
||||||
|
|
||||||
# Add each file type
|
|
||||||
added_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'))
|
|
||||||
|
|
||||||
# Add the release files in batch
|
|
||||||
try:
|
try:
|
||||||
added_files = db.query(File).filter(or_(*[File.id == x for x in added_files])).all()
|
db = get_session()
|
||||||
rel.files.extend(added_files)
|
|
||||||
db.commit()
|
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:
|
||||||
|
media = Media(
|
||||||
|
library_id = group['library'].get('id'),
|
||||||
|
profile_id = 0,
|
||||||
|
status_id = done_status.get('id')
|
||||||
|
)
|
||||||
|
db.add(media)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
# Add Release
|
||||||
|
rel = db.query(Relea).filter(
|
||||||
|
or_(
|
||||||
|
Relea.identifier == identifier,
|
||||||
|
and_(Relea.identifier.startswith(group['library']['identifier']), Relea.status_id == snatched_status.get('id'))
|
||||||
|
)
|
||||||
|
).first()
|
||||||
|
if not rel:
|
||||||
|
rel = Relea(
|
||||||
|
identifier = identifier,
|
||||||
|
movie = media,
|
||||||
|
quality_id = group['meta_data']['quality'].get('id'),
|
||||||
|
status_id = done_status.get('id')
|
||||||
|
)
|
||||||
|
db.add(rel)
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
# Add each file type
|
||||||
|
added_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'))
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
return True
|
||||||
except:
|
except:
|
||||||
log.debug('Failed to attach "%s" to release: %s', (added_files, traceback.format_exc()))
|
log.error('Failed: %s', traceback.format_exc())
|
||||||
|
db.rollback()
|
||||||
|
finally:
|
||||||
|
db.close()
|
||||||
|
|
||||||
fireEvent('media.restatus', media.id)
|
return False
|
||||||
|
|
||||||
db.expire_all()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def saveFile(self, filepath, type = 'unknown', include_media_info = False):
|
def saveFile(self, filepath, type = 'unknown', include_media_info = False):
|
||||||
|
|
||||||
@@ -165,31 +171,43 @@ class Release(Plugin):
|
|||||||
|
|
||||||
def delete(self, id):
|
def delete(self, id):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
rel = db.query(Relea).filter_by(id = id).first()
|
rel = db.query(Relea).filter_by(id = id).first()
|
||||||
if rel:
|
if rel:
|
||||||
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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
rel = db.query(Relea).filter_by(id = id).first()
|
rel = db.query(Relea).filter_by(id = id).first()
|
||||||
if rel:
|
if rel:
|
||||||
for release_file in rel.files:
|
for release_file in rel.files:
|
||||||
if not os.path.isfile(ss(release_file.path)):
|
if not os.path.isfile(ss(release_file.path)):
|
||||||
db.delete(release_file)
|
db.delete(release_file)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
if len(rel.files) == 0:
|
if len(rel.files) == 0:
|
||||||
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,49 +390,58 @@ 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)
|
||||||
db = get_session()
|
|
||||||
|
|
||||||
found_releases = []
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
for rel in search_results:
|
found_releases = []
|
||||||
|
|
||||||
rel_identifier = md5(rel['url'])
|
for rel in search_results:
|
||||||
found_releases.append(rel_identifier)
|
|
||||||
|
|
||||||
rls = db.query(Relea).filter_by(identifier = rel_identifier).first()
|
rel_identifier = md5(rel['url'])
|
||||||
if not rls:
|
found_releases.append(rel_identifier)
|
||||||
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())
|
|
||||||
|
|
||||||
db.commit()
|
rls = db.query(Relea).filter_by(identifier = rel_identifier).first()
|
||||||
|
if not rls:
|
||||||
for info in rel:
|
rls = Relea(
|
||||||
try:
|
identifier = rel_identifier,
|
||||||
if not isinstance(rel[info], (str, unicode, int, long, float)):
|
movie_id = media.get('id'),
|
||||||
continue
|
#media_id = media.get('id'),
|
||||||
|
quality_id = quality_type.get('quality_id'),
|
||||||
rls_info = ReleaseInfo(
|
status_id = available_status.get('id')
|
||||||
identifier = info,
|
|
||||||
value = toUnicode(rel[info])
|
|
||||||
)
|
)
|
||||||
rls.info.append(rls_info)
|
db.add(rls)
|
||||||
except InterfaceError:
|
else:
|
||||||
log.debug('Couldn\'t add %s to ReleaseInfo: %s', (info, traceback.format_exc()))
|
[db.delete(old_info) for old_info in rls.info]
|
||||||
|
rls.last_edit = int(time.time())
|
||||||
|
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
rel['status_id'] = rls.status_id
|
for info in rel:
|
||||||
|
try:
|
||||||
|
if not isinstance(rel[info], (str, unicode, int, long, float)):
|
||||||
|
continue
|
||||||
|
|
||||||
return found_releases
|
rls_info = ReleaseInfo(
|
||||||
|
identifier = info,
|
||||||
|
value = toUnicode(rel[info])
|
||||||
|
)
|
||||||
|
rls.info.append(rls_info)
|
||||||
|
except InterfaceError:
|
||||||
|
log.debug('Couldn\'t add %s to ReleaseInfo: %s', (info, traceback.format_exc()))
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
|
rel['status_id'] = rls.status_id
|
||||||
|
|
||||||
|
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,32 +470,39 @@ 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
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
rel = db.query(Relea).filter_by(id = id).first()
|
rel = db.query(Relea).filter_by(id = id).first()
|
||||||
if rel and status and rel.status_id != status.get('id'):
|
if rel and status and rel.status_id != status.get('id'):
|
||||||
|
|
||||||
item = {}
|
item = {}
|
||||||
for info in rel.info:
|
for info in rel.info:
|
||||||
item[info.identifier] = info.value
|
item[info.identifier] = info.value
|
||||||
|
|
||||||
release_name = None
|
release_name = None
|
||||||
if rel.files:
|
if rel.files:
|
||||||
for file_item in rel.files:
|
for file_item in rel.files:
|
||||||
if file_item.type.identifier == 'movie':
|
if file_item.type.identifier == 'movie':
|
||||||
release_name = os.path.basename(file_item.path)
|
release_name = os.path.basename(file_item.path)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
release_name = item['name']
|
release_name = item['name']
|
||||||
|
|
||||||
#update status in Db
|
#update status in Db
|
||||||
log.debug('Marking release %s as %s', (release_name, status.get("label")))
|
log.debug('Marking release %s as %s', (release_name, status.get("label")))
|
||||||
rel.status_id = status.get('id')
|
rel.status_id = status.get('id')
|
||||||
rel.last_edit = int(time.time())
|
rel.last_edit = int(time.time())
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
#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
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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,47 +80,57 @@ class StatusPlugin(Plugin):
|
|||||||
if not isinstance(identifiers, list):
|
if not isinstance(identifiers, list):
|
||||||
identifiers = [identifiers]
|
identifiers = [identifiers]
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
return_list = []
|
db = get_session()
|
||||||
|
return_list = []
|
||||||
|
|
||||||
for identifier in identifiers:
|
for identifier in identifiers:
|
||||||
|
|
||||||
if self.status_cached.get(identifier):
|
if self.status_cached.get(identifier):
|
||||||
return_list.append(self.status_cached.get(identifier))
|
return_list.append(self.status_cached.get(identifier))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
s = db.query(Status).filter_by(identifier = identifier).first()
|
s = db.query(Status).filter_by(identifier = identifier).first()
|
||||||
if not s:
|
if not s:
|
||||||
s = Status(
|
s = Status(
|
||||||
identifier = identifier,
|
identifier = identifier,
|
||||||
label = toUnicode(identifier.capitalize())
|
label = toUnicode(identifier.capitalize())
|
||||||
)
|
)
|
||||||
db.add(s)
|
db.add(s)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
status_dict = s.to_dict()
|
status_dict = s.to_dict()
|
||||||
|
|
||||||
self.status_cached[identifier] = status_dict
|
self.status_cached[identifier] = status_dict
|
||||||
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):
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
for identifier, label in self.statuses.items():
|
for identifier, label in self.statuses.items():
|
||||||
s = db.query(Status).filter_by(identifier = identifier).first()
|
s = db.query(Status).filter_by(identifier = identifier).first()
|
||||||
if not s:
|
if not s:
|
||||||
log.info('Creating status: %s', label)
|
log.info('Creating status: %s', label)
|
||||||
s = Status(
|
s = Status(
|
||||||
identifier = identifier,
|
identifier = identifier,
|
||||||
label = toUnicode(label)
|
label = toUnicode(label)
|
||||||
)
|
)
|
||||||
db.add(s)
|
db.add(s)
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
@@ -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,14 +221,20 @@ class Settings(object):
|
|||||||
def setProperty(self, identifier, value = ''):
|
def setProperty(self, identifier, value = ''):
|
||||||
from couchpotato import get_session
|
from couchpotato import get_session
|
||||||
|
|
||||||
db = get_session()
|
try:
|
||||||
|
db = get_session()
|
||||||
|
|
||||||
p = db.query(Properties).filter_by(identifier = identifier).first()
|
p = db.query(Properties).filter_by(identifier = identifier).first()
|
||||||
if not p:
|
if not p:
|
||||||
p = Properties()
|
p = Properties()
|
||||||
db.add(p)
|
db.add(p)
|
||||||
|
|
||||||
p.identifier = identifier
|
p.identifier = identifier
|
||||||
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()
|
||||||
+12
-13
@@ -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):
|
||||||
|
|||||||
Reference in new issue
Block a user