aboutsummaryrefslogtreecommitdiff
path: root/app/ytdl.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/ytdl.py')
-rw-r--r--app/ytdl.py49
1 files changed, 34 insertions, 15 deletions
diff --git a/app/ytdl.py b/app/ytdl.py
index d1512ef..9fe4840 100644
--- a/app/ytdl.py
+++ b/app/ytdl.py
@@ -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)
bgstack15