feat: remove individual watch-later videos

This commit is contained in:
2026-10-11 21:00:04 +02:00
parent b65834e9d4
commit 343010ce5c
3 changed files with 110 additions and 15 deletions
+3
View File
@@ -73,6 +73,7 @@ These are the default bindings. Overrides in `[keys]` replace an action's bindin
| `w` | Save the selected video to watch later (also works in previews) |
| `W` | Browse watch later for the current category, or the combined collection elsewhere |
| `f` | In watch later, cycle All → Unwatched → Watched |
| `X` (Shift-X) | Remove only the selected watch-later video (also works in previews) |
| `D` | In watch later, confirm removal of all videos matching the current list/filter |
| `v` | Save the selected video to saved videos (also works in previews) |
| `V` | Browse saved videos for the current category, or the combined collection elsewhere |
@@ -185,6 +186,8 @@ Terebi reports acknowledged playback positions. A video becomes watched when an
### Removal
`X` (Shift-X) immediately removes **only the selected video** from watch later, including from Search, category views, or previews. Other videos, saved-video membership, and watched status remain unchanged. Configure this action with `video.watch_later.remove`; it is separate from the bulk action `view.watch_later.remove`.
`D` snapshots all videos matching the current list and filter, then shows their count, category, and filter. **`y` confirms; `n` or Esc cancels.** Enter does not confirm. Removal deletes those videos from the shared collection, so they disappear from every matching category; watched status is untouched. An empty filtered list has nothing to remove.
### Storage
+7 -2
View File
@@ -109,6 +109,7 @@ actions! {
WatchLaterBrowse, "view.watch_later.browse", "Browse this category's watch later, or the combined collection elsewhere", &[Context::Normal], ["W"];
WatchLaterFilter, "view.watch_later.filter", "Cycle watch-later filter: all, unwatched, watched", &[Context::Normal], ["f"];
WatchLaterRemove, "view.watch_later.remove", "Confirm removal of the current filtered watch-later subset", &[Context::Normal], ["D"];
WatchLaterRemoveSelected, "video.watch_later.remove", "Remove only the selected watch-later video (also in previews)", VIEW, ["X"];
SavedVideoSave, "video.saved.save", "Save the selected video (also in previews)", VIEW, ["v"];
SavedVideoBrowse, "view.saved.browse", "Browse this category's saved videos, or the combined collection elsewhere", &[Context::Normal], ["V"];
SavedVideoRemove, "video.saved.remove", "Remove the selected saved video (also in previews)", VIEW, ["x"];
@@ -474,6 +475,10 @@ impl Bindings {
"Browse category watch later; combined elsewhere",
),
(&[WatchLaterFilter], "Cycle all / unwatched / watched"),
(
&[WatchLaterRemoveSelected],
"Remove the selected video (also in previews)",
),
(
&[WatchLaterRemove],
"Confirm removal of filtered subset (combined: all matches)",
@@ -1023,7 +1028,7 @@ mod tests {
Some(Action::InfoDescription),
);
let bindings = configured(
"[keys.video.watch_later]\nsave = 'alt+w'\n[keys.view.watch_later]\nbrowse = 'shift+x'\nfilter = 'ctrl+f'\nremove = []\n",
"[keys.video.watch_later]\nsave = 'alt+w'\nremove = []\n[keys.view.watch_later]\nbrowse = 'shift+x'\nfilter = 'ctrl+f'\nremove = []\n",
)
.unwrap();
for context in ALL {
@@ -1083,7 +1088,7 @@ mod tests {
}
}
let bindings = configured(
"[keys.video.saved]\nsave = 'alt+v'\nremove = []\n[keys.view.saved]\nbrowse = 'shift+x'\n",
"[keys.video.watch_later]\nremove = []\n[keys.video.saved]\nsave = 'alt+v'\nremove = []\n[keys.view.saved]\nbrowse = 'shift+x'\n",
)
.unwrap();
for context in ALL {
+100 -13
View File
File diff suppressed because one or more lines are too long