From f333fd2675af647b5d9c5e6ad63cb5d294bb8d5e Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Wed, 26 Feb 2025 13:49:17 +0100
Subject: [PATCH] On deleting files, remove respective entries from playlist.

---
 src/ytplom/http.py |  7 +++++--
 src/ytplom/misc.py | 10 +++++++++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/src/ytplom/http.py b/src/ytplom/http.py
index 957cdab..8db6e50 100644
--- a/src/ytplom/http.py
+++ b/src/ytplom/http.py
@@ -123,6 +123,7 @@ class _TaskHandler(PlomHttpHandler):
             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()
@@ -140,6 +141,7 @@ class _TaskHandler(PlomHttpHandler):
             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()
@@ -164,7 +166,7 @@ class _TaskHandler(PlomHttpHandler):
         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(
@@ -174,8 +176,9 @@ class _TaskHandler(PlomHttpHandler):
 
     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')
 
diff --git a/src/ytplom/misc.py b/src/ytplom/misc.py
index 5df2502..bbb959c 100644
--- a/src/ytplom/misc.py
+++ b/src/ytplom/misc.py
@@ -764,13 +764,21 @@ class Player:
                                                 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)
-- 
2.30.2