|
|
@ -2,22 +2,33 @@ from couchpotato.api import addApiView |
|
|
|
from couchpotato.core.event import fireEvent, addEvent, fireEventAsync |
|
|
|
from couchpotato.core.helpers.encoding import ss |
|
|
|
from couchpotato.core.helpers.request import jsonified, getParam |
|
|
|
from couchpotato.core.helpers.variable import getTitle |
|
|
|
from couchpotato.core.logger import CPLog |
|
|
|
from couchpotato.core.plugins.base import Plugin |
|
|
|
from couchpotato.environment import Env |
|
|
|
import os |
|
|
|
import time |
|
|
|
import traceback |
|
|
|
|
|
|
|
|
|
|
|
log = CPLog(__name__) |
|
|
|
|
|
|
|
class Manage(Plugin): |
|
|
|
|
|
|
|
in_progress = False |
|
|
|
|
|
|
|
def __init__(self): |
|
|
|
|
|
|
|
fireEvent('scheduler.interval', identifier = 'manage.update_library', handle = self.updateLibrary, hours = 2) |
|
|
|
|
|
|
|
addEvent('manage.update', self.updateLibrary) |
|
|
|
addEvent('manage.scan_files', self.scanFilesToLibrary) |
|
|
|
|
|
|
|
# Add files after renaming |
|
|
|
def after_rename(group): |
|
|
|
return self.scanFilesToLibrary(folder = group['destination_dir'], files = group['renamed_files']) |
|
|
|
addEvent('renamer.after', after_rename) |
|
|
|
|
|
|
|
addApiView('manage.update', self.updateLibraryView, docs = { |
|
|
|
'desc': 'Update the library by scanning for new movies', |
|
|
|
'params': { |
|
|
@ -25,11 +36,23 @@ class Manage(Plugin): |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
addApiView('manage.progress', self.getProgress, docs = { |
|
|
|
'desc': 'Get the progress of current manage update', |
|
|
|
'return': {'type': 'object', 'example': """{ |
|
|
|
'progress': False || object, total & to_go, |
|
|
|
}"""}, |
|
|
|
}) |
|
|
|
|
|
|
|
if not Env.get('dev'): |
|
|
|
def updateLibrary(): |
|
|
|
self.updateLibrary(full = False) |
|
|
|
addEvent('app.load', updateLibrary) |
|
|
|
|
|
|
|
def getProgress(self): |
|
|
|
return jsonified({ |
|
|
|
'progress': self.in_progress |
|
|
|
}) |
|
|
|
|
|
|
|
def updateLibraryView(self): |
|
|
|
|
|
|
|
full = getParam('full', default = 1) |
|
|
@ -43,23 +66,41 @@ class Manage(Plugin): |
|
|
|
def updateLibrary(self, full = True): |
|
|
|
last_update = float(Env.prop('manage.last_update', default = 0)) |
|
|
|
|
|
|
|
if self.isDisabled() or (last_update > time.time() - 20): |
|
|
|
if self.in_progress: |
|
|
|
log.info('Already updating library: %s', self.in_progress) |
|
|
|
return |
|
|
|
elif self.isDisabled() or (last_update > time.time() - 20): |
|
|
|
return |
|
|
|
|
|
|
|
self.in_progress = {} |
|
|
|
fireEvent('notify.frontend', type = 'manage.updating', data = True) |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
directories = self.directories() |
|
|
|
added_identifiers = [] |
|
|
|
|
|
|
|
# Add some progress |
|
|
|
self.in_progress = {} |
|
|
|
for directory in directories: |
|
|
|
self.in_progress[os.path.normpath(directory)] = { |
|
|
|
'total': None, |
|
|
|
'to_go': None, |
|
|
|
} |
|
|
|
|
|
|
|
for directory in directories: |
|
|
|
folder = os.path.normpath(directory) |
|
|
|
|
|
|
|
if not os.path.isdir(directory): |
|
|
|
if not os.path.isdir(folder): |
|
|
|
if len(directory) > 0: |
|
|
|
log.error('Directory doesn\'t exist: %s', directory) |
|
|
|
log.error('Directory doesn\'t exist: %s', folder) |
|
|
|
continue |
|
|
|
|
|
|
|
log.info('Updating manage library: %s', directory) |
|
|
|
identifiers = fireEvent('scanner.folder', folder = directory, newer_than = last_update if not full else 0, single = True) |
|
|
|
if identifiers: |
|
|
|
added_identifiers.extend(identifiers) |
|
|
|
log.info('Updating manage library: %s', folder) |
|
|
|
fireEvent('notify.frontend', type = 'manage.update', data = True, message = 'Scanning for movies in "%s"' % folder) |
|
|
|
|
|
|
|
onFound = self.createAddToLibrary(folder, added_identifiers) |
|
|
|
fireEvent('scanner.scan', folder = folder, simple = True, newer_than = last_update if not full else 0, on_found = onFound, single = True) |
|
|
|
|
|
|
|
# Break if CP wants to shut down |
|
|
|
if self.shuttingDown(): |
|
|
@ -83,9 +124,69 @@ class Manage(Plugin): |
|
|
|
break |
|
|
|
|
|
|
|
Env.prop('manage.last_update', time.time()) |
|
|
|
except: |
|
|
|
log.error('Failed updating library: %s', (traceback.format_exc())) |
|
|
|
|
|
|
|
while True and not self.shuttingDown(): |
|
|
|
|
|
|
|
delete_me = {} |
|
|
|
|
|
|
|
for folder in self.in_progress: |
|
|
|
if self.in_progress[folder]['to_go'] <= 0: |
|
|
|
delete_me[folder] = True |
|
|
|
|
|
|
|
for delete in delete_me: |
|
|
|
del self.in_progress[delete] |
|
|
|
|
|
|
|
if len(self.in_progress) == 0: |
|
|
|
break |
|
|
|
|
|
|
|
time.sleep(1) |
|
|
|
|
|
|
|
fireEvent('notify.frontend', type = 'manage.updating', data = False) |
|
|
|
self.in_progress = False |
|
|
|
|
|
|
|
def createAddToLibrary(self, folder, added_identifiers = []): |
|
|
|
def addToLibrary(group, total_found, to_go): |
|
|
|
if self.in_progress[folder]['total'] is None: |
|
|
|
self.in_progress[folder] = { |
|
|
|
'total': total_found, |
|
|
|
'to_go': total_found, |
|
|
|
} |
|
|
|
|
|
|
|
if group['library']: |
|
|
|
identifier = group['library'].get('identifier') |
|
|
|
added_identifiers.append(identifier) |
|
|
|
|
|
|
|
# Add it to release and update the info |
|
|
|
fireEvent('release.add', group = group) |
|
|
|
fireEventAsync('library.update', identifier = identifier, on_complete = self.createAfterUpdate(folder, identifier)) |
|
|
|
|
|
|
|
return addToLibrary |
|
|
|
|
|
|
|
def createAfterUpdate(self, folder, identifier): |
|
|
|
|
|
|
|
# Notify frontend |
|
|
|
def afterUpdate(): |
|
|
|
self.in_progress[folder]['to_go'] = self.in_progress[folder]['to_go'] - 1 |
|
|
|
total = self.in_progress[folder]['total'] |
|
|
|
movie_dict = fireEvent('movie.get', identifier, single = True) |
|
|
|
fireEvent('notify.frontend', type = 'movie.added', data = movie_dict, message = None if total > 5 else 'Added "%s" to manage.' % getTitle(movie_dict['library'])) |
|
|
|
|
|
|
|
return afterUpdate |
|
|
|
|
|
|
|
def directories(self): |
|
|
|
try: |
|
|
|
return [x.strip() for x in self.conf('library', default = '').split('::')] |
|
|
|
except: |
|
|
|
return [] |
|
|
|
|
|
|
|
def scanFilesToLibrary(self, folder = None, files = None): |
|
|
|
|
|
|
|
folder = os.path.normpath(folder) |
|
|
|
|
|
|
|
groups = fireEvent('scanner.scan', folder = folder, files = files, single = True) |
|
|
|
|
|
|
|
for group in groups.itervalues(): |
|
|
|
if group['library']: |
|
|
|
fireEvent('release.add', group = group) |
|
|
|