add "completed" panel

This commit is contained in:
Alex
2019-12-03 22:32:07 +02:00
parent 6f5c56595f
commit 9a959f9326
9 changed files with 266 additions and 109 deletions

View File

@@ -43,8 +43,14 @@ class Notifier(DownloadQueueNotifier):
async def updated(self, dl):
await sio.emit('updated', serializer.encode(dl))
async def deleted(self, id):
await sio.emit('deleted', serializer.encode(id))
async def completed(self, dl):
await sio.emit('completed', serializer.encode(dl))
async def canceled(self, id):
await sio.emit('canceled', serializer.encode(id))
async def cleared(self, id):
await sio.emit('cleared', serializer.encode(id))
dqueue = DownloadQueue(config, Notifier())
@@ -61,21 +67,15 @@ async def add(request):
async def delete(request):
post = await request.json()
ids = post.get('ids')
if not ids:
where = post.get('where')
if not ids or where not in ['queue', 'done']:
raise web.HTTPBadRequest()
status = await dqueue.delete(ids)
status = await (dqueue.cancel(ids) if where == 'queue' else dqueue.clear(ids))
return web.Response(text=serializer.encode(status))
@routes.get('/queue')
def queue(request):
ret = dqueue.get()
return web.Response(text=serializer.encode(ret))
@sio.event
async def connect(sid, environ):
ret = dqueue.get()
#ret = [["XeNTV0kyHaU", {"id": "XeNTV0kyHaU", "title": "2020 Mercedes ACTROS \u2013 Digital Side Mirrors, Electronic Stability, Auto Braking, Side Guard Safety", "url": "XeNTV0kyHaU", "status": None, "percentage": 0}], ["76wlIusQe9U", {"id": "76wlIusQe9U", "title": "Toyota HIACE 2020 \u2013 Toyota Wagon / Toyota HIACE 2019 and 2020", "url": "76wlIusQe9U", "status": None, "percentage": 0}], ["n_d5LPwflMM", {"id": "n_d5LPwflMM", "title": "2020 Toyota GRANVIA \u2013 Toyota 8 Seater LUXURY VAN / ALL-NEW Toyota GRANVIA 2020", "url": "n_d5LPwflMM", "status": None, "percentage": 0}], ["Dv4ZFhCpF1M", {"id": "Dv4ZFhCpF1M", "title": "Toyota SIENNA 2019 vs Honda ODYSSEY 2019", "url": "Dv4ZFhCpF1M", "status": None, "percentage": 0}], ["GjHJFb3Mgqw", {"id": "GjHJFb3Mgqw", "title": "How It's Made (Buses) \u2013 How Buses are made? SETRA BUS Production", "url": "GjHJFb3Mgqw", "status": None, "percentage": 0}]]
await sio.emit('queue', serializer.encode(ret), to=sid)
await sio.emit('all', serializer.encode(dqueue.get()), to=sid)
@routes.get('/')
def index(request):

View File

@@ -78,7 +78,13 @@ class DownloadQueueNotifier:
async def updated(self, dl):
raise NotImplementedError
async def deleted(self, id):
async def completed(self, dl):
raise NotImplementedError
async def canceled(self, id):
raise NotImplementedError
async def cleared(self, id):
raise NotImplementedError
class DownloadQueue:
@@ -86,6 +92,7 @@ class DownloadQueue:
self.config = config
self.notifier = notifier
self.queue = OrderedDict()
self.done = OrderedDict()
self.event = asyncio.Event()
asyncio.ensure_future(self.__download())
@@ -116,20 +123,28 @@ class DownloadQueue:
self.event.set()
return {'status': 'ok'}
async def delete(self, ids):
async def cancel(self, ids):
for id in ids:
if id not in self.queue:
log.warn(f'requested cancel for non-existent download {id}')
continue
self.queue[id].cancel()
del self.queue[id]
await self.notifier.canceled(id)
return {'status': 'ok'}
async def clear(self, ids):
for id in ids:
if id not in self.done:
log.warn(f'requested delete for non-existent download {id}')
continue
if self.queue[id].info.status is not None:
self.queue[id].cancel()
else:
del self.queue[id]
await self.notifier.deleted(id)
del self.done[id]
await self.notifier.cleared(id)
return {'status': 'ok'}
def get(self):
return list((k, v.info) for k, v in self.queue.items())
return(list((k, v.info) for k, v in self.queue.items()),
list((k, v.info) for k, v in self.done.items()))
async def __download(self):
while True:
@@ -144,11 +159,15 @@ class DownloadQueue:
async def updated_cb(): await self.notifier.updated(entry.info)
asyncio.ensure_future(entry.update_status(updated_cb))
await start_aw
if entry.info.status != 'finished' and entry.tmpfilename and os.path.isfile(entry.tmpfilename):
try:
os.remove(entry.tmpfilename)
except:
pass
if entry.info.status != 'finished':
if entry.tmpfilename and os.path.isfile(entry.tmpfilename):
try:
os.remove(entry.tmpfilename)
except:
pass
entry.info.status = 'error'
entry.close()
del self.queue[id]
await self.notifier.deleted(id)
if id in self.queue:
del self.queue[id]
self.done[id] = entry
await self.notifier.completed(entry.info)