2014-05-26 11:21:19 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
2016-02-11 14:26:12 +00:00
|
|
|
from queue import PriorityQueue
|
2014-05-26 11:21:19 +00:00
|
|
|
from threading import Thread
|
2016-02-11 14:29:51 +00:00
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import time
|
2014-05-26 11:21:19 +00:00
|
|
|
|
|
|
|
from websocket import trigger_event
|
2016-01-31 16:45:14 +00:00
|
|
|
import state
|
2016-02-11 06:14:40 +00:00
|
|
|
import settings
|
2014-05-26 11:21:19 +00:00
|
|
|
|
|
|
|
import logging
|
2015-11-29 14:56:38 +00:00
|
|
|
logger = logging.getLogger(__name__)
|
2014-05-26 11:21:19 +00:00
|
|
|
|
2016-02-11 14:29:51 +00:00
|
|
|
DEUBG_TASKS = False
|
|
|
|
|
2014-05-26 11:21:19 +00:00
|
|
|
class Tasks(Thread):
|
2016-02-11 06:14:40 +00:00
|
|
|
_tasks = []
|
2014-05-26 11:21:19 +00:00
|
|
|
|
2014-08-09 16:33:59 +00:00
|
|
|
def __init__(self):
|
2016-02-11 06:14:40 +00:00
|
|
|
self._taskspath = os.path.join(settings.data_path, 'tasks.json')
|
2016-02-11 14:26:12 +00:00
|
|
|
self.q = PriorityQueue()
|
2014-05-26 11:21:19 +00:00
|
|
|
Thread.__init__(self)
|
|
|
|
self.daemon = True
|
|
|
|
self.start()
|
|
|
|
|
|
|
|
def run(self):
|
2016-02-11 14:26:12 +00:00
|
|
|
self.load_tasks()
|
|
|
|
self.queue('scan')
|
2014-05-26 11:21:19 +00:00
|
|
|
import item.scan
|
2016-02-11 06:14:40 +00:00
|
|
|
from item.models import sync_metadata, get_preview, get_cover
|
2016-01-14 12:22:39 +00:00
|
|
|
from user.models import export_list, update_user_peering
|
2016-02-11 06:14:40 +00:00
|
|
|
shutdown = False
|
|
|
|
while not shutdown:
|
2016-02-11 14:26:12 +00:00
|
|
|
p, m = self.q.get()
|
2016-02-11 06:14:40 +00:00
|
|
|
if m:
|
|
|
|
if state.shutdown:
|
2016-02-11 14:26:12 +00:00
|
|
|
self._tasks.append((p, m))
|
2016-02-11 06:14:40 +00:00
|
|
|
else:
|
|
|
|
try:
|
|
|
|
action, data = m
|
2016-02-11 14:29:51 +00:00
|
|
|
if DEUBG_TASKS:
|
|
|
|
t0 = time.time()
|
|
|
|
logger.debug('%s start', action)
|
|
|
|
|
2016-02-11 06:14:40 +00:00
|
|
|
if action == 'changelibrarypath':
|
|
|
|
item.scan.change_path(data[0], data[1])
|
|
|
|
elif action == 'export':
|
|
|
|
export_list(data)
|
|
|
|
elif action == 'getcover':
|
|
|
|
get_cover(data)
|
|
|
|
elif action == 'getpreview':
|
|
|
|
get_preview(data)
|
|
|
|
elif action == 'import':
|
|
|
|
item.scan.run_import(data)
|
|
|
|
elif action == 'peering':
|
|
|
|
update_user_peering(*data)
|
|
|
|
elif action == 'ping':
|
|
|
|
trigger_event('pong', data)
|
|
|
|
elif action == 'scan':
|
|
|
|
item.scan.run_scan()
|
|
|
|
elif action == 'scanimport':
|
|
|
|
item.scan.import_folder()
|
|
|
|
elif action == 'syncmetadata':
|
|
|
|
sync_metadata(data)
|
|
|
|
else:
|
|
|
|
trigger_event('error', {'error': 'unknown action'})
|
2016-02-11 14:29:51 +00:00
|
|
|
if DEUBG_TASKS:
|
|
|
|
logger.debug('%s done (%s)', action, time.time()-t0)
|
2016-02-11 06:14:40 +00:00
|
|
|
except:
|
|
|
|
logger.debug('task failed', exc_info=True)
|
|
|
|
else:
|
|
|
|
shutdown = True
|
2014-05-26 11:21:19 +00:00
|
|
|
self.q.task_done()
|
|
|
|
|
2016-02-11 06:14:40 +00:00
|
|
|
def load_tasks(self):
|
|
|
|
if os.path.exists(self._taskspath):
|
|
|
|
try:
|
|
|
|
with open(self._taskspath) as f:
|
|
|
|
tasks = json.load(f)
|
|
|
|
for task in tasks:
|
2016-02-11 15:54:32 +00:00
|
|
|
if len(task) == 2:
|
2016-02-12 17:20:42 +00:00
|
|
|
self.q.put((task[0], tuple(task[1])))
|
2016-02-11 06:14:40 +00:00
|
|
|
logger.debug('loaded %s tasks', len(tasks))
|
|
|
|
except:
|
|
|
|
logger.debug('failed to load saved tasks', exc_info=True)
|
|
|
|
os.unlink(self._taskspath)
|
|
|
|
|
|
|
|
def save_tasks(self):
|
|
|
|
if self._tasks:
|
|
|
|
logger.debug('saving %s tasks for later', len(self._tasks))
|
|
|
|
with open(self._taskspath, 'w') as f:
|
|
|
|
json.dump(self._tasks, f)
|
|
|
|
|
2014-05-26 11:21:19 +00:00
|
|
|
def join(self):
|
2016-02-11 14:26:12 +00:00
|
|
|
self.q.put((1000, None))
|
2016-02-11 06:14:40 +00:00
|
|
|
r = Thread.join(self)
|
|
|
|
self.save_tasks()
|
|
|
|
return r
|
2014-05-26 11:21:19 +00:00
|
|
|
|
2016-02-11 14:26:12 +00:00
|
|
|
def queue(self, action, data=None, priority=None):
|
|
|
|
if priority is None:
|
|
|
|
priority = 100
|
|
|
|
if action in ('getcover', 'getpreview'):
|
|
|
|
priority += 1
|
2016-02-14 07:33:15 +00:00
|
|
|
if action in ('import', 'export', 'scanimport'):
|
2016-02-11 14:26:12 +00:00
|
|
|
priority -= 1
|
|
|
|
if action in ('peering', 'changelibrarypath'):
|
|
|
|
priority -= 2
|
2016-01-31 16:45:14 +00:00
|
|
|
if not state.shutdown:
|
2016-02-11 14:26:12 +00:00
|
|
|
#logger.debug('queue: %s (%s)', action, data)
|
|
|
|
self.q.put((priority, (action, data)))
|
2016-02-27 04:49:45 +00:00
|
|
|
else:
|
|
|
|
self._tasks.append((priority, (action, data)))
|