self.send_http(b'no way', code=403)
with DbConn() as conn:
file = VideoFile.get_one(conn, Hash.from_b64(self.path_toks[2]))
+ self.server.player.remove_by_digest(file.digest)
file.set_flags({FILE_FLAGS[FlagName('delete')]})
file.save(conn)
conn.commit()
file.set_flags({FILE_FLAGS[FlagName(name)] for name
in self.postvars.all_for('flags')})
if self.postvars.as_dict['delete_locally']:
+ self.server.player.remove_by_digest(file.digest)
file.unlink_locally()
file.save(conn)
conn.commit()
elif command.startswith('down_'):
self.server.player.move_entry(int(command.split('_')[1]), False)
elif command.startswith('rm_'):
- self.server.player.remove(int(command.split('_')[1]))
+ self.server.player.remove_by_idx(int(command.split('_')[1]))
elif command.startswith('inject_'):
with DbConn() as conn:
file = VideoFile.get_one(
def _purge_deleted_files(self) -> None:
with DbConn() as conn:
+ for file in VideoFile.get_deleteds(conn):
+ self.server.player.remove_by_digest(file.digest)
VideoFile.purge_deleteds(conn)
- self.server.player.load_files_and_mpv()
conn.commit()
self.send_http(b'OK')
self.playlist[i0])
self._signal_update()
- def remove(self, idx: int) -> None:
+ def remove_by_idx(self, idx: int) -> None:
"""Remove from playlist title at idx."""
if self._mpv:
self._mpv.command('playlist-remove', idx)
self.playlist[idx:idx + 1] = []
self._signal_update()
+ def remove_by_digest(self, digest: Hash) -> None:
+ """Remove from playlist entries to title by digest."""
+ indices_to_remove: list[int] = [
+ idx for idx, file in enumerate(self.playlist)
+ if digest == file.digest]
+ for idx in reversed(indices_to_remove): # reversed() so yet-to-remove
+ self.remove_by_idx(idx) # indices remain correct
+
def inject(self, file: VideoFile) -> None:
"""Inject file after current title."""
self.playlist.insert(self._idx + 1, file)