You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.6 KiB

from couchpotato import get_session
14 years ago
from couchpotato.core.event import addEvent, fireEventAsync, fireEvent
from couchpotato.core.helpers.encoding import toUnicode, simplifyString, \
tryUrlencode
14 years ago
from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin
from couchpotato.core.settings.model import Library, LibraryTitle, File
from string import ascii_letters
import traceback
14 years ago
log = CPLog(__name__)
class LibraryPlugin(Plugin):
default_dict = {'titles': {}, 'files':{}}
14 years ago
def __init__(self):
addEvent('library.add', self.add)
14 years ago
addEvent('library.update', self.update)
def add(self, attrs = {}, update_after = True):
14 years ago
db = get_session()
l = db.query(Library).filter_by(identifier = attrs.get('identifier')).first()
if not l:
status = fireEvent('status.get', 'needs_update', single = True)
l = Library(
year = attrs.get('year'),
identifier = attrs.get('identifier'),
14 years ago
plot = toUnicode(attrs.get('plot')),
tagline = toUnicode(attrs.get('tagline')),
status_id = status.get('id')
14 years ago
)
title = LibraryTitle(
title = toUnicode(attrs.get('title')),
simple_title = self.simplifyTitle(attrs.get('title'))
)
14 years ago
l.titles.append(title)
db.add(l)
db.commit()
14 years ago
# Update library info
if update_after is not False:
handle = fireEventAsync if update_after is 'async' else fireEvent
handle('library.update', identifier = l.identifier, default_title = toUnicode(attrs.get('title', '')))
14 years ago
14 years ago
return l.to_dict(self.default_dict)
def update(self, identifier, default_title = '', force = False):
14 years ago
db = get_session()
library = db.query(Library).filter_by(identifier = identifier).first()
done_status = fireEvent('status.get', 'done', single = True)
if library:
library_dict = library.to_dict(self.default_dict)
14 years ago
do_update = True
if library.status_id == done_status.get('id') and not force:
14 years ago
do_update = False
else:
info = fireEvent('movie.info', merge = True, identifier = identifier)
14 years ago
if not info or len(info) == 0:
log.error('Could not update, no movie info to work with: %s' % identifier)
return False
14 years ago
# Main info
14 years ago
if do_update:
14 years ago
library.plot = toUnicode(info.get('plot', ''))
library.tagline = toUnicode(info.get('tagline', ''))
14 years ago
library.year = info.get('year', 0)
library.status_id = done_status.get('id')
library.info = info
14 years ago
db.commit()
14 years ago
14 years ago
# Titles
[db.delete(title) for title in library.titles]
db.commit()
14 years ago
14 years ago
titles = info.get('titles', [])
log.debug('Adding titles: %s' % titles)
for title in titles:
if not title:
continue
title = toUnicode(title)
14 years ago
t = LibraryTitle(
title = title,
simple_title = self.simplifyTitle(title),
default = title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == u'' and toUnicode(titles[0]) == title)
14 years ago
)
library.titles.append(t)
14 years ago
db.commit()
14 years ago
# Files
images = info.get('images', [])
for type in images:
for image in images[type]:
if not isinstance(image, str):
continue
file_path = fireEvent('file.download', url = image, single = True)
file_obj = fireEvent('file.add', path = file_path, type_tuple = ('image', type), single = True)
14 years ago
try:
file_obj = db.query(File).filter_by(id = file_obj.get('id')).one()
library.files.append(file_obj)
14 years ago
db.commit()
except:
log.debug('Failed to attach to library: %s' % traceback.format_exc())
14 years ago
library_dict = library.to_dict(self.default_dict)
14 years ago
fireEvent('library.update_finish', data = library_dict)
return library_dict
def simplifyTitle(self, title):
title = toUnicode(title)
nr_prefix = '' if title[0] in ascii_letters else '#'
title = simplifyString(title)
for prefix in ['the ']:
if prefix == title[:len(prefix)]:
title = title[len(prefix):]
break
return nr_prefix + title