openmedialibrary/oml/downloads.py

95 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
import os
from threading import Thread
import time
from sqlitedict import SqliteDict
import db
import state
import settings
import update
import utils
import logging
logger = logging.getLogger(__name__)
class Downloads(Thread):
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.start()
self._dbpath = os.path.join(settings.data_path, 'transfers.db')
self.transfers = SqliteDict(self._dbpath, tablename='transfers', autocommit=False)
def download_updates(self):
now = int(time.time())
if now > settings.server.get('last_update_check', 0) + 24*60*60:
settings.server['last_update_check'] = now
update.download()
state.user().export_library()
if settings.preferences.get('sendDiagnostics') and \
now > settings.server.get('last_send_diagnostics', 0) + 60*60 and \
state.online:
utils.send_debug()
settings.server['last_send_diagnostics'] = now
def download_next(self):
import item.models
self.download_updates()
downloads = list(self.transfers.items())
try:
downloads.sort(key=lambda t: t[1].get('added'))
except:
pass
for itemid, t in downloads:
if state.shutdown:
return False
if itemid not in self.transfers:
continue
f = item.models.File.get(itemid)
if f:
del self.transfers[itemid]
continue
if t.get('added') and t.get('progress', -1) < 1:
if 'users' not in t:
i = item.models.Item.get(itemid)
if not i:
del self.transfers[itemid]
continue
t['users'] = [u.id for u in i.users]
for uid in t['users']:
if state.shutdown:
return False
if state.nodes.is_online(uid):
logger.debug('DOWNLOAD %s %s', i, uid)
if state.nodes.download(uid, i):
break
return False
def run(self):
self.wait(10)
while not state.shutdown:
with db.session():
self.download_next()
self.wait(60)
def join(self):
self.transfers.commit()
self.transfers.close(do_log=False)
return Thread.join(self)
def wait_online(self):
while not state.online and not state.shutdown:
self.wait(5)
return not state.shutdown
def wait(self, timeout):
step = min(timeout, 1)
while not state.shutdown and timeout > 0:
time.sleep(step)
timeout -= step