22 changed files with 333 additions and 764 deletions
@ -0,0 +1,125 @@ |
|||||
|
from couchpotato.core.event import addEvent, fireEvent |
||||
|
from couchpotato.core.helpers.encoding import toUnicode |
||||
|
from couchpotato.core.logger import CPLog |
||||
|
from couchpotato.core.helpers.variable import tryInt |
||||
|
from couchpotato.core.plugins.base import Plugin |
||||
|
|
||||
|
|
||||
|
log = CPLog(__name__) |
||||
|
|
||||
|
autload = 'Episode' |
||||
|
|
||||
|
class Episode(Plugin): |
||||
|
|
||||
|
def __init__(self): |
||||
|
addEvent('media.search_query', self.query) |
||||
|
addEvent('media.identifier', self.identifier) |
||||
|
|
||||
|
addEvent('show.episode.add', self.add) |
||||
|
addEvent('show.episode.update_info', self.update) |
||||
|
|
||||
|
def query(self, library, first = True, condense = True, include_identifier = True, **kwargs): |
||||
|
if library is list or library.get('type') != 'episode': |
||||
|
return |
||||
|
|
||||
|
# Get the titles of the season |
||||
|
if not library.get('related_libraries', {}).get('season', []): |
||||
|
log.warning('Invalid library, unable to determine title.') |
||||
|
return |
||||
|
|
||||
|
titles = fireEvent( |
||||
|
'media.search_query', |
||||
|
library['related_libraries']['season'][0], |
||||
|
first=False, |
||||
|
include_identifier=include_identifier, |
||||
|
condense=condense, |
||||
|
|
||||
|
single=True |
||||
|
) |
||||
|
|
||||
|
identifier = fireEvent('media.identifier', library, single = True) |
||||
|
|
||||
|
# Add episode identifier to titles |
||||
|
if include_identifier and identifier.get('episode'): |
||||
|
titles = [title + ('E%02d' % identifier['episode']) for title in titles] |
||||
|
|
||||
|
|
||||
|
if first: |
||||
|
return titles[0] if titles else None |
||||
|
|
||||
|
return titles |
||||
|
|
||||
|
|
||||
|
def identifier(self, library): |
||||
|
if library.get('type') != 'episode': |
||||
|
return |
||||
|
|
||||
|
identifier = { |
||||
|
'season': None, |
||||
|
'episode': None |
||||
|
} |
||||
|
|
||||
|
scene_map = library['info'].get('map_episode', {}).get('scene') |
||||
|
|
||||
|
if scene_map: |
||||
|
# Use scene mappings if they are available |
||||
|
identifier['season'] = scene_map.get('season') |
||||
|
identifier['episode'] = scene_map.get('episode') |
||||
|
else: |
||||
|
# Fallback to normal season/episode numbers |
||||
|
identifier['season'] = library.get('season_number') |
||||
|
identifier['episode'] = library.get('episode_number') |
||||
|
|
||||
|
|
||||
|
# Cast identifiers to integers |
||||
|
# TODO this will need changing to support identifiers with trailing 'a', 'b' characters |
||||
|
identifier['season'] = tryInt(identifier['season'], None) |
||||
|
identifier['episode'] = tryInt(identifier['episode'], None) |
||||
|
|
||||
|
return identifier |
||||
|
|
||||
|
def add(self, parent_id, update_after = True): |
||||
|
|
||||
|
# Add Season |
||||
|
season = { |
||||
|
'nr': 1, |
||||
|
'identifiers': { |
||||
|
'imdb': 'tt1234', |
||||
|
'thetvdb': 123, |
||||
|
'tmdb': 123, |
||||
|
'rage': 123 |
||||
|
}, |
||||
|
'parent': '_id', |
||||
|
'info': {}, # Returned dict by providers |
||||
|
} |
||||
|
|
||||
|
episode_exists = True or False |
||||
|
|
||||
|
if episode_exists: |
||||
|
pass #update existing |
||||
|
else: |
||||
|
pass # Add Episode |
||||
|
|
||||
|
|
||||
|
# Update library info |
||||
|
if update_after is not False: |
||||
|
handle = fireEventAsync if update_after is 'async' else fireEvent |
||||
|
handle('show.episode.update_info', season.get('_id'), default_title = toUnicode(attrs.get('title', ''))) |
||||
|
|
||||
|
return season |
||||
|
|
||||
|
def update_info(self, media_id = None, default_title = '', force = False): |
||||
|
|
||||
|
if self.shuttingDown(): |
||||
|
return |
||||
|
|
||||
|
# Get new info |
||||
|
fireEvent('episode.info', merge = True) |
||||
|
|
||||
|
# Update/create media |
||||
|
|
||||
|
|
||||
|
# Get images |
||||
|
|
||||
|
|
||||
|
return info |
@ -1,173 +0,0 @@ |
|||||
import time |
|
||||
import traceback |
|
||||
|
|
||||
from couchpotato import get_db |
|
||||
from couchpotato.core.event import addEvent, fireEvent |
|
||||
from couchpotato.core.helpers.encoding import toUnicode |
|
||||
from couchpotato.core.logger import CPLog |
|
||||
from couchpotato.core.media._base.library.base import LibraryBase |
|
||||
from couchpotato.core.helpers.variable import tryInt |
|
||||
|
|
||||
|
|
||||
log = CPLog(__name__) |
|
||||
|
|
||||
autload = 'EpisodeLibraryPlugin' |
|
||||
|
|
||||
|
|
||||
class EpisodeLibraryPlugin(LibraryBase): |
|
||||
|
|
||||
default_dict = {'titles': {}, 'files':{}} |
|
||||
|
|
||||
def __init__(self): |
|
||||
addEvent('library.query', self.query) |
|
||||
addEvent('library.identifier', self.identifier) |
|
||||
addEvent('library.update.episode', self.update) |
|
||||
|
|
||||
def query(self, library, first = True, condense = True, include_identifier = True, **kwargs): |
|
||||
if library is list or library.get('type') != 'episode': |
|
||||
return |
|
||||
|
|
||||
# Get the titles of the season |
|
||||
if not library.get('related_libraries', {}).get('season', []): |
|
||||
log.warning('Invalid library, unable to determine title.') |
|
||||
return |
|
||||
|
|
||||
titles = fireEvent( |
|
||||
'library.query', |
|
||||
library['related_libraries']['season'][0], |
|
||||
first=False, |
|
||||
include_identifier=include_identifier, |
|
||||
condense=condense, |
|
||||
|
|
||||
single=True |
|
||||
) |
|
||||
|
|
||||
identifier = fireEvent('library.identifier', library, single = True) |
|
||||
|
|
||||
# Add episode identifier to titles |
|
||||
if include_identifier and identifier.get('episode'): |
|
||||
titles = [title + ('E%02d' % identifier['episode']) for title in titles] |
|
||||
|
|
||||
|
|
||||
if first: |
|
||||
return titles[0] if titles else None |
|
||||
|
|
||||
return titles |
|
||||
|
|
||||
|
|
||||
def identifier(self, library): |
|
||||
if library.get('type') != 'episode': |
|
||||
return |
|
||||
|
|
||||
identifier = { |
|
||||
'season': None, |
|
||||
'episode': None |
|
||||
} |
|
||||
|
|
||||
scene_map = library['info'].get('map_episode', {}).get('scene') |
|
||||
|
|
||||
if scene_map: |
|
||||
# Use scene mappings if they are available |
|
||||
identifier['season'] = scene_map.get('season') |
|
||||
identifier['episode'] = scene_map.get('episode') |
|
||||
else: |
|
||||
# Fallback to normal season/episode numbers |
|
||||
identifier['season'] = library.get('season_number') |
|
||||
identifier['episode'] = library.get('episode_number') |
|
||||
|
|
||||
|
|
||||
# Cast identifiers to integers |
|
||||
# TODO this will need changing to support identifiers with trailing 'a', 'b' characters |
|
||||
identifier['season'] = tryInt(identifier['season'], None) |
|
||||
identifier['episode'] = tryInt(identifier['episode'], None) |
|
||||
|
|
||||
return identifier |
|
||||
|
|
||||
def update(self, media_id = None, identifier = None, default_title = '', force = False): |
|
||||
|
|
||||
if self.shuttingDown(): |
|
||||
return |
|
||||
|
|
||||
db = get_db() |
|
||||
|
|
||||
if media_id: |
|
||||
media = db.get('id', media_id) |
|
||||
else: |
|
||||
media = db.get('media', identifier, with_doc = True)['doc'] |
|
||||
|
|
||||
do_update = True |
|
||||
|
|
||||
if media.get('status') == 'done' and not force: |
|
||||
do_update = False |
|
||||
|
|
||||
episode_params = { |
|
||||
'season_identifier': media.get('parent'), |
|
||||
'episode_identifier': media.get('identifier'), |
|
||||
'episode': media.get('episode_number'), |
|
||||
'absolute': media.get('episode_number'), |
|
||||
} |
|
||||
info = fireEvent('episode.info', merge = True, params = episode_params) |
|
||||
|
|
||||
# Don't need those here |
|
||||
try: del info['in_wanted'] |
|
||||
except: pass |
|
||||
try: del info['in_library'] |
|
||||
except: pass |
|
||||
|
|
||||
if not info or len(info) == 0: |
|
||||
log.error('Could not update, no movie info to work with: %s', identifier) |
|
||||
return False |
|
||||
|
|
||||
# Main info |
|
||||
if do_update: |
|
||||
episode = { |
|
||||
'plot': toUnicode(info.get('plot', '')), |
|
||||
'tagline': toUnicode(info.get('tagline', '')), |
|
||||
'year': info.get('year', 0), |
|
||||
'status_id': 'done', |
|
||||
'season_number': tryInt(info.get('seasonnumber', None)), |
|
||||
'episode_number': tryInt(info.get('episodenumber', None)), |
|
||||
'absolute_number': tryInt(info.get('absolute_number', None)), |
|
||||
'last_updated': tryInt(info.get('lastupdated', time.time())), |
|
||||
} |
|
||||
|
|
||||
titles = info.get('titles', []) |
|
||||
log.debug('Adding titles: %s', titles) |
|
||||
counter = 0 |
|
||||
for title in titles: |
|
||||
if not title: |
|
||||
continue |
|
||||
title = toUnicode(title) |
|
||||
t = LibraryTitle( |
|
||||
title = title, |
|
||||
simple_title = self.simplifyTitle(title), |
|
||||
default = (len(default_title) == 0 and counter == 0) or len(titles) == 1 or title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == u'' and toUnicode(titles[0]) == title) |
|
||||
) |
|
||||
library.titles.append(t) |
|
||||
counter += 1 |
|
||||
|
|
||||
media.update(episode) |
|
||||
db.update(media) |
|
||||
|
|
||||
# Files |
|
||||
images = info.get('images', []) |
|
||||
for image_type in ['poster']: |
|
||||
for image in images.get(image_type, []): |
|
||||
if not isinstance(image, (str, unicode)): |
|
||||
continue |
|
||||
|
|
||||
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() |
|
||||
|
|
||||
break |
|
||||
except: |
|
||||
log.debug('Failed to attach to library: %s', traceback.format_exc()) |
|
||||
|
|
||||
library_dict = library.to_dict(self.default_dict) |
|
||||
db.expire_all() |
|
||||
return library_dict |
|
@ -1,158 +0,0 @@ |
|||||
import traceback |
|
||||
|
|
||||
from couchpotato import get_session |
|
||||
from couchpotato.core.event import addEvent, fireEvent |
|
||||
from couchpotato.core.helpers.encoding import toUnicode |
|
||||
from couchpotato.core.logger import CPLog |
|
||||
from couchpotato.core.media._base.library.base import LibraryBase |
|
||||
from couchpotato.core.helpers.variable import tryInt |
|
||||
|
|
||||
|
|
||||
log = CPLog(__name__) |
|
||||
|
|
||||
autload = 'SeasonLibraryPlugin' |
|
||||
|
|
||||
|
|
||||
class SeasonLibraryPlugin(LibraryBase): |
|
||||
|
|
||||
def __init__(self): |
|
||||
addEvent('library.query', self.query) |
|
||||
addEvent('library.identifier', self.identifier) |
|
||||
addEvent('library.update.season', self.update) |
|
||||
|
|
||||
def query(self, library, first = True, condense = True, include_identifier = True, **kwargs): |
|
||||
if library is list or library.get('type') != 'season': |
|
||||
return |
|
||||
|
|
||||
# Get the titles of the show |
|
||||
if not library.get('related_libraries', {}).get('show', []): |
|
||||
log.warning('Invalid library, unable to determine title.') |
|
||||
return |
|
||||
|
|
||||
titles = fireEvent( |
|
||||
'library.query', |
|
||||
library['related_libraries']['show'][0], |
|
||||
first=False, |
|
||||
condense=condense, |
|
||||
|
|
||||
single=True |
|
||||
) |
|
||||
|
|
||||
# Add season map_names if they exist |
|
||||
if 'map_names' in library['info']: |
|
||||
season_names = library['info']['map_names'].get(str(library['season_number']), {}) |
|
||||
|
|
||||
# Add titles from all locations |
|
||||
# TODO only add name maps from a specific location |
|
||||
for location, names in season_names.items(): |
|
||||
titles += [name for name in names if name and name not in titles] |
|
||||
|
|
||||
|
|
||||
identifier = fireEvent('library.identifier', library, single = True) |
|
||||
|
|
||||
# Add season identifier to titles |
|
||||
if include_identifier and identifier.get('season') is not None: |
|
||||
titles = [title + (' S%02d' % identifier['season']) for title in titles] |
|
||||
|
|
||||
|
|
||||
if first: |
|
||||
return titles[0] if titles else None |
|
||||
|
|
||||
return titles |
|
||||
|
|
||||
def identifier(self, library): |
|
||||
if library.get('type') != 'season': |
|
||||
return |
|
||||
|
|
||||
return { |
|
||||
'season': tryInt(library['season_number'], None) |
|
||||
} |
|
||||
|
|
||||
def update(self, identifier, default_title = '', force = False): |
|
||||
|
|
||||
if self.shuttingDown(): |
|
||||
return |
|
||||
|
|
||||
db = get_session() |
|
||||
library = db.query(SeasonLibrary).filter_by(identifier = identifier).first() |
|
||||
done_status = fireEvent('status.get', 'done', single = True) |
|
||||
|
|
||||
if library: |
|
||||
library_dict = library.to_dict(self.default_dict) |
|
||||
|
|
||||
do_update = True |
|
||||
|
|
||||
parent_identifier = None |
|
||||
if library.parent is not None: |
|
||||
parent_identifier = library.parent.identifier |
|
||||
|
|
||||
if library.status_id == done_status.get('id') and not force: |
|
||||
do_update = False |
|
||||
|
|
||||
season_params = {'season_identifier': identifier} |
|
||||
info = fireEvent('season.info', merge = True, identifier = parent_identifier, params = season_params) |
|
||||
|
|
||||
# Don't need those here |
|
||||
try: del info['in_wanted'] |
|
||||
except: pass |
|
||||
try: del info['in_library'] |
|
||||
except: pass |
|
||||
|
|
||||
if not info or len(info) == 0: |
|
||||
log.error('Could not update, no movie info to work with: %s', identifier) |
|
||||
return False |
|
||||
|
|
||||
# Main info |
|
||||
if do_update: |
|
||||
library.plot = toUnicode(info.get('plot', '')) |
|
||||
library.tagline = toUnicode(info.get('tagline', '')) |
|
||||
library.year = info.get('year', 0) |
|
||||
library.status_id = done_status.get('id') |
|
||||
library.season_number = tryInt(info.get('seasonnumber', None)) |
|
||||
library.info.update(info) |
|
||||
db.commit() |
|
||||
|
|
||||
# Titles |
|
||||
[db.delete(title) for title in library.titles] |
|
||||
db.commit() |
|
||||
|
|
||||
titles = info.get('titles', []) |
|
||||
log.debug('Adding titles: %s', titles) |
|
||||
counter = 0 |
|
||||
for title in titles: |
|
||||
if not title: |
|
||||
continue |
|
||||
title = toUnicode(title) |
|
||||
t = LibraryTitle( |
|
||||
title = title, |
|
||||
simple_title = self.simplifyTitle(title), |
|
||||
# XXX: default was None; so added a quick hack since we don't really need titiles for seasons anyway |
|
||||
#default = (len(default_title) == 0 and counter == 0) or len(titles) == 1 or title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == u'' and toUnicode(titles[0]) == title) |
|
||||
default = True, |
|
||||
) |
|
||||
library.titles.append(t) |
|
||||
counter += 1 |
|
||||
|
|
||||
db.commit() |
|
||||
|
|
||||
# Files |
|
||||
images = info.get('images', []) |
|
||||
for image_type in ['poster']: |
|
||||
for image in images.get(image_type, []): |
|
||||
if not isinstance(image, (str, unicode)): |
|
||||
continue |
|
||||
|
|
||||
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() |
|
||||
break |
|
||||
except: |
|
||||
log.debug('Failed to attach to library: %s', traceback.format_exc()) |
|
||||
|
|
||||
library_dict = library.to_dict(self.default_dict) |
|
||||
db.expire_all() |
|
||||
return library_dict |
|
@ -1,196 +0,0 @@ |
|||||
from string import ascii_letters |
|
||||
import time |
|
||||
import traceback |
|
||||
|
|
||||
from couchpotato import get_session |
|
||||
from couchpotato.core.event import addEvent, fireEventAsync, fireEvent |
|
||||
from couchpotato.core.helpers.encoding import toUnicode, simplifyString |
|
||||
from couchpotato.core.logger import CPLog |
|
||||
from couchpotato.core.media._base.library.base import LibraryBase |
|
||||
from qcond.helpers import simplify |
|
||||
from qcond import QueryCondenser |
|
||||
|
|
||||
|
|
||||
log = CPLog(__name__) |
|
||||
|
|
||||
autload = 'SeasonLibraryPlugin' |
|
||||
|
|
||||
|
|
||||
class ShowLibraryPlugin(LibraryBase): |
|
||||
|
|
||||
default_dict = {'titles': {}, 'files':{}} |
|
||||
|
|
||||
def __init__(self): |
|
||||
self.query_condenser = QueryCondenser() |
|
||||
|
|
||||
addEvent('library.query', self.query) |
|
||||
addEvent('library.add.show', self.add) |
|
||||
addEvent('library.update.show', self.update) |
|
||||
addEvent('library.update.show_release_date', self.updateReleaseDate) |
|
||||
|
|
||||
def query(self, library, first = True, condense = True, **kwargs): |
|
||||
if library is list or library.get('type') != 'show': |
|
||||
return |
|
||||
|
|
||||
titles = [title['title'] for title in library['titles']] |
|
||||
|
|
||||
if condense: |
|
||||
# Use QueryCondenser to build a list of optimal search titles |
|
||||
condensed_titles = self.query_condenser.distinct(titles) |
|
||||
|
|
||||
if condensed_titles: |
|
||||
# Use condensed titles if we got a valid result |
|
||||
titles = condensed_titles |
|
||||
else: |
|
||||
# Fallback to simplifying titles |
|
||||
titles = [simplify(title) for title in titles] |
|
||||
|
|
||||
if first: |
|
||||
return titles[0] if titles else None |
|
||||
|
|
||||
return titles |
|
||||
|
|
||||
def add(self, attrs = {}, update_after = True): |
|
||||
type = attrs.get('type', 'show') |
|
||||
primary_provider = attrs.get('primary_provider', 'thetvdb') |
|
||||
|
|
||||
db = get_session() |
|
||||
|
|
||||
l = db.query(ShowLibrary).filter_by(type = type, identifier = attrs.get('identifier')).first() |
|
||||
if not l: |
|
||||
status = fireEvent('status.get', 'needs_update', single = True) |
|
||||
l = ShowLibrary( |
|
||||
type = type, |
|
||||
primary_provider = primary_provider, |
|
||||
year = attrs.get('year'), |
|
||||
identifier = attrs.get('identifier'), |
|
||||
plot = toUnicode(attrs.get('plot')), |
|
||||
tagline = toUnicode(attrs.get('tagline')), |
|
||||
status_id = status.get('id'), |
|
||||
info = {}, |
|
||||
parent = None, |
|
||||
) |
|
||||
|
|
||||
title = LibraryTitle( |
|
||||
title = toUnicode(attrs.get('title')), |
|
||||
simple_title = self.simplifyTitle(attrs.get('title')), |
|
||||
) |
|
||||
|
|
||||
l.titles.append(title) |
|
||||
|
|
||||
db.add(l) |
|
||||
db.commit() |
|
||||
|
|
||||
# Update library info |
|
||||
if update_after is not False: |
|
||||
handle = fireEventAsync if update_after is 'async' else fireEvent |
|
||||
handle('library.update.show', identifier = l.identifier, default_title = toUnicode(attrs.get('title', ''))) |
|
||||
|
|
||||
library_dict = l.to_dict(self.default_dict) |
|
||||
db.expire_all() |
|
||||
return library_dict |
|
||||
|
|
||||
def update(self, identifier, default_title = '', force = False): |
|
||||
|
|
||||
if self.shuttingDown(): |
|
||||
return |
|
||||
|
|
||||
db = get_session() |
|
||||
library = db.query(ShowLibrary).filter_by(identifier = identifier).first() |
|
||||
done_status = fireEvent('status.get', 'done', single = True) |
|
||||
|
|
||||
if library: |
|
||||
library_dict = library.to_dict(self.default_dict) |
|
||||
|
|
||||
do_update = True |
|
||||
|
|
||||
info = fireEvent('show.info', merge = True, identifier = identifier) |
|
||||
|
|
||||
# Don't need those here |
|
||||
try: del info['in_wanted'] |
|
||||
except: pass |
|
||||
try: del info['in_library'] |
|
||||
except: pass |
|
||||
|
|
||||
if not info or len(info) == 0: |
|
||||
log.error('Could not update, no show info to work with: %s', identifier) |
|
||||
return False |
|
||||
|
|
||||
# Main info |
|
||||
if do_update: |
|
||||
library.plot = toUnicode(info.get('plot', '')) |
|
||||
library.tagline = toUnicode(info.get('tagline', '')) |
|
||||
library.year = info.get('year', 0) |
|
||||
library.status_id = done_status.get('id') |
|
||||
library.show_status = toUnicode(info.get('status', '').lower()) |
|
||||
library.airs_time = info.get('airs_time', None) |
|
||||
|
|
||||
# Bits |
|
||||
days_of_week_map = { |
|
||||
u'Monday': 1, |
|
||||
u'Tuesday': 2, |
|
||||
u'Wednesday': 4, |
|
||||
u'Thursday': 8, |
|
||||
u'Friday': 16, |
|
||||
u'Saturday': 32, |
|
||||
u'Sunday': 64, |
|
||||
u'Daily': 127, |
|
||||
} |
|
||||
try: |
|
||||
library.airs_dayofweek = days_of_week_map.get(info.get('airs_dayofweek')) |
|
||||
except: |
|
||||
library.airs_dayofweek = 0 |
|
||||
|
|
||||
try: |
|
||||
library.last_updated = int(info.get('lastupdated')) |
|
||||
except: |
|
||||
library.last_updated = int(time.time()) |
|
||||
|
|
||||
library.info.update(info) |
|
||||
|
|
||||
db.commit() |
|
||||
|
|
||||
# Titles |
|
||||
[db.delete(title) for title in library.titles] |
|
||||
db.commit() |
|
||||
|
|
||||
titles = info.get('titles', []) |
|
||||
log.debug('Adding titles: %s', titles) |
|
||||
counter = 0 |
|
||||
for title in titles: |
|
||||
if not title: |
|
||||
continue |
|
||||
title = toUnicode(title) |
|
||||
t = LibraryTitle( |
|
||||
title = title, |
|
||||
simple_title = self.simplifyTitle(title), |
|
||||
default = (len(default_title) == 0 and counter == 0) or len(titles) == 1 or title.lower() == toUnicode(default_title.lower()) or (toUnicode(default_title) == u'' and toUnicode(titles[0]) == title) |
|
||||
) |
|
||||
library.titles.append(t) |
|
||||
counter += 1 |
|
||||
|
|
||||
db.commit() |
|
||||
|
|
||||
# Files |
|
||||
images = info.get('images', []) |
|
||||
for image_type in ['poster']: |
|
||||
for image in images.get(image_type, []): |
|
||||
if not isinstance(image, (str, unicode)): |
|
||||
continue |
|
||||
|
|
||||
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() |
|
||||
|
|
||||
break |
|
||||
except: |
|
||||
log.debug('Failed to attach to library: %s', traceback.format_exc()) |
|
||||
|
|
||||
library_dict = library.to_dict(self.default_dict) |
|
||||
|
|
||||
db.expire_all() |
|
||||
return library_dict |
|
@ -0,0 +1,114 @@ |
|||||
|
from couchpotato.core.event import addEvent, fireEvent |
||||
|
from couchpotato.core.logger import CPLog |
||||
|
from couchpotato.core.helpers.variable import tryInt |
||||
|
from couchpotato.core.plugins.base import Plugin |
||||
|
|
||||
|
|
||||
|
log = CPLog(__name__) |
||||
|
|
||||
|
autload = 'Season' |
||||
|
|
||||
|
|
||||
|
class Season(Plugin): |
||||
|
|
||||
|
def __init__(self): |
||||
|
addEvent('media.search_query', self.query) |
||||
|
addEvent('media.identifier', self.identifier) |
||||
|
|
||||
|
addEvent('show.season.add', self.update) |
||||
|
addEvent('show.season.update_info', self.update) |
||||
|
|
||||
|
def query(self, library, first = True, condense = True, include_identifier = True, **kwargs): |
||||
|
if library is list or library.get('type') != 'season': |
||||
|
return |
||||
|
|
||||
|
# Get the titles of the show |
||||
|
if not library.get('related_libraries', {}).get('show', []): |
||||
|
log.warning('Invalid library, unable to determine title.') |
||||
|
return |
||||
|
|
||||
|
titles = fireEvent( |
||||
|
'media._search_query', |
||||
|
library['related_libraries']['show'][0], |
||||
|
first=False, |
||||
|
condense=condense, |
||||
|
|
||||
|
single=True |
||||
|
) |
||||
|
|
||||
|
# Add season map_names if they exist |
||||
|
if 'map_names' in library['info']: |
||||
|
season_names = library['info']['map_names'].get(str(library['season_number']), {}) |
||||
|
|
||||
|
# Add titles from all locations |
||||
|
# TODO only add name maps from a specific location |
||||
|
for location, names in season_names.items(): |
||||
|
titles += [name for name in names if name and name not in titles] |
||||
|
|
||||
|
|
||||
|
identifier = fireEvent('media.identifier', library, single = True) |
||||
|
|
||||
|
# Add season identifier to titles |
||||
|
if include_identifier and identifier.get('season') is not None: |
||||
|
titles = [title + (' S%02d' % identifier['season']) for title in titles] |
||||
|
|
||||
|
|
||||
|
if first: |
||||
|
return titles[0] if titles else None |
||||
|
|
||||
|
return titles |
||||
|
|
||||
|
def identifier(self, library): |
||||
|
if library.get('type') != 'season': |
||||
|
return |
||||
|
|
||||
|
return { |
||||
|
'season': tryInt(library['season_number'], None) |
||||
|
} |
||||
|
|
||||
|
def add(self, parent_id, update_after = True): |
||||
|
|
||||
|
# Add Season |
||||
|
season = { |
||||
|
'nr': 1, |
||||
|
'identifiers': { |
||||
|
'imdb': 'tt1234', |
||||
|
'thetvdb': 123, |
||||
|
'tmdb': 123, |
||||
|
'rage': 123 |
||||
|
}, |
||||
|
'parent': '_id', |
||||
|
'info': {}, # Returned dict by providers |
||||
|
} |
||||
|
|
||||
|
# Check if season already exists |
||||
|
season_exists = True or False |
||||
|
|
||||
|
if season_exists: |
||||
|
pass #update existing |
||||
|
else: |
||||
|
|
||||
|
db.insert(season) |
||||
|
|
||||
|
|
||||
|
# Update library info |
||||
|
if update_after is not False: |
||||
|
handle = fireEventAsync if update_after is 'async' else fireEvent |
||||
|
handle('show.season.update_info', episode.get('_id')) |
||||
|
|
||||
|
return season |
||||
|
|
||||
|
def update_info(self, media_id = None, default_title = '', force = False): |
||||
|
|
||||
|
if self.shuttingDown(): |
||||
|
return |
||||
|
|
||||
|
# Get new info |
||||
|
fireEvent('season.info', merge = True) |
||||
|
|
||||
|
# Update/create media |
||||
|
|
||||
|
# Get images |
||||
|
|
||||
|
|
||||
|
return info |
Loading…
Reference in new issue