class DownloadsManager:
"""Manages downloading and downloads access."""
- def __init__(self) -> None:
+ def __init__(self, playlist_inject: Callable[[VideoFile], None]) -> None:
+ self._playlist_inject = playlist_inject
+ self._to_inject: set[str] = set()
self._inherited: list[YoutubeId] = []
self._downloaded: list[YoutubeId] = []
self._downloading: Optional[YoutubeId] = None
def overview(
self, conn: DbConn
- ) -> dict[str, list[dict[str, str]] | Optional[dict[str, str]]]:
+ ) -> dict[str,
+ list[dict[str, str | bool]]
+ | Optional[dict[str, str | bool]]]:
'What has been, what will be, and what currently is being downloaded.'
- downloaded: list[dict[str, str]] = []
+ downloaded: list[dict[str, str | bool]] = []
yt_id: Optional[YoutubeId]
for yt_id in self._downloaded:
try:
downloaded += [{'yt_id': yt_id,
'path': str(file.rel_path),
'digest': file.digest.b64}] # + title?
- to_download: list[dict[str, str]] = []
+ to_download: list[dict[str, str | bool]] = []
for idx, yt_id in enumerate(self._to_download):
try:
yt_video = YoutubeVideo.get_one(conn, yt_id)
continue
to_download += [{'yt_id': yt_id,
'title': yt_video.title,
- 'idx': str(idx)}]
- downloading: Optional[dict[str, str]] = None
+ 'idx': str(idx),
+ 'to_inject': yt_id in self._to_inject}]
+ downloading: Optional[dict[str, str | bool]] = None
if (yt_id := self._downloading):
try:
yt_video = YoutubeVideo.get_one(conn, yt_id)
else:
downloading = {'yt_id': yt_id,
'title': yt_video.title,
- 'status': self._status}
+ 'status': self._status,
+ 'to_inject': yt_id in self._to_inject}
return {'downloaded': downloaded,
'downloading': downloading,
'to_download': to_download}
def _queue_download(self, yt_id: YoutubeId) -> None:
if yt_id == self._downloading or yt_id in self._downloaded:
return
+ self._to_inject.add(yt_id)
self._to_download += [yt_id]
if not self._downloading:
self.q.put('download_next')
with DbConn() as conn:
file.save(conn)
conn.commit()
+ if yt_id in self._to_inject:
+ self._playlist_inject(file)
+ self._to_inject.remove(yt_id)
self._downloaded += [yt_id]
self._downloading = None
return yt_id
self._queue_download(yt_id)
elif command == 'forget':
self._forget_file(yt_id)
+ elif command == 'inject':
+ self._to_inject.add(yt_id)
+ elif command == 'unject' and yt_id in self._to_inject:
+ self._to_inject.remove(yt_id)
self._update_timestamp(yt_id)
Thread(target=loop, daemon=False).start()