Skip to content

Release: Deleted vs. missing videos, deleting from the playlist page, and better YouTube search - #954

Merged
dialmaster merged 21 commits into
mainfrom
dev
Oct 20, 2026
Merged

dialmaster merged 21 commits into
mainfrom
dev

Conversation

@dialmaster

@dialmaster dialmaster commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

This release separates videos that were deleted from ones whose files went missing, so the Videos page stops filling up with red Missing videos, and adds ways to clean both out. Youtarr also no longer marks videos missing while their drive or share isn't mounted. Videos can now be deleted from the playlist page, and Find Videos lists YouTube's best matches first, with sorting and a download button on each result.

features

  • Videos without a file used to all show as red Missing, whether you deleted them, automatic cleanup removed them, or the file disappeared from disk. They now show as Deleted (grey) or Missing (red), and the tooltip and video modal say why in plain words. The Videos page hides deleted videos by default; channel and playlist pages still list them so they can be re-downloaded. Videos removed before this update show as Deleted. (Separate deleted videos from missing ones #670)
    • Missing videos can be marked as deleted from a selection on the Videos page, from the video modal, or all at once in Settings > Maintenance. Maintenance also has "Empty trash...", which removes the chosen videos from the library and can optionally remove their download archive entries too (otherwise automatic downloads keep skipping them). The Videos page links to that card when it's hiding or filtering on these videos.
  • Downloaded videos can now be selected and deleted from the playlist page. A selection can mix downloaded and not-downloaded videos: Download fetches the ones that aren't on disk, Delete removes the ones that are, and each confirmation says how many videos it will affect. The video table also stays a table down to a window about 900px wide, instead of switching to cards below about 1380px. (feat: delete videos from the playlist page #951)
  • Find Videos now lists results in YouTube's own order instead of newest first, so recent Shorts no longer crowd out the best matches. On desktop the results open in a table you can sort by title, channel, published date, length, or views, and a Sort menu does the same on phones and in grid view. (feat(find-videos): make YouTube search easier to use #953)
    • Each result also shows its view count and has its own download button, channels you're subscribed to are marked and link to their channel page, and videos a minute or shorter get a Short badge. The search stays in the page address so Back brings the same results back, and the page remembers your view, sort, and minimum length.

fixes

  • If the downloads folder or a __subfolder was on a drive or network share that wasn't mounted, the file check and the scheduled rescan could mark every video on it missing. Youtarr now checks that the downloads folder and each subfolder exist and aren't empty first. While one looks unmounted, its videos aren't marked missing or deleted, automatic cleanup skips its run, and the Videos page and Settings > Maintenance show a warning. If you emptied a folder on purpose, Maintenance has a "Rescan anyway" button. (Separate deleted videos from missing ones #670)
  • In the rare case where the download archive listed a video the library didn't have, channel "Download all" and playlist downloads queued it on every run and yt-dlp skipped it every time. Those videos are now left out. (Separate deleted videos from missing ones #670)
  • After a video was deleted, its playlists' .m3u files and Plex, Jellyfin, and Emby playlists kept listing it until the next download. They now update right away, whether the video was deleted from a page or by automatic cleanup. Deleting the last downloaded video of a playlist also empties its Plex playlist and removes its Jellyfin or Emby playlist without an error; they fill back in once videos are downloaded again. (feat: delete videos from the playlist page #951)
  • Find Videos could list live and upcoming streams, and downloading one could run until stopped. They're no longer shown. (feat(find-videos): make YouTube search easier to use #953)
  • The Filters and Sort buttons had hover text that was almost the same color as the hover background in some themes, like Bold Flat light and Playful dark. It's readable now. (feat: show where to clean up deleted and missing videos #952)
  • On desktop, the active filter chips stayed visible under the open filter panel, so each active filter showed up twice. The chips now only show while the panel is closed. (feat: show where to clean up deleted and missing videos #952)

dependabot Bot and others added 19 commits October 17, 2026 21:54
Bumps the github-actions group with 15 updates:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `4.3.1` | `7.0.1` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4.4.0` | `7.1.0` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4.6.2` | `7.0.2` |
| [actions/cache](https://github.com/actions/cache) | `4.3.0` | `6.1.0` |
| [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action) | `1.0.122` | `1.0.250` |
| [actions/download-artifact](https://github.com/actions/download-artifact) | `4.3.0` | `8.0.2` |
| [actions/github-script](https://github.com/actions/github-script) | `7.1.0` | `9.0.0` |
| [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) | `3.0.1` | `5.0.0` |
| [actions/configure-pages](https://github.com/actions/configure-pages) | `5.0.0` | `6.0.0` |
| [actions/deploy-pages](https://github.com/actions/deploy-pages) | `4.0.5` | `5.0.1` |
| [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) | `3.7.0` | `4.4.0` |
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3.12.0` | `4.4.1` |
| [docker/login-action](https://github.com/docker/login-action) | `3.7.0` | `4.6.0` |
| [docker/build-push-action](https://github.com/docker/build-push-action) | `5.4.0` | `7.4.0` |
| [mathieudutour/github-tag-action](https://github.com/mathieudutour/github-tag-action) | `6.2` | `7` |


Updates `actions/checkout` from 4.3.1 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@34e1148...3d3c42e)

Updates `actions/setup-node` from 4.4.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@49933ea...949feb2)

Updates `actions/upload-artifact` from 4.6.2 to 7.0.2
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@ea165f8...cf430e0)

Updates `actions/cache` from 4.3.0 to 6.1.0
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@0057852...55cc834)

Updates `anthropics/claude-code-action` from 1.0.122 to 1.0.250
- [Release notes](https://github.com/anthropics/claude-code-action/releases)
- [Commits](anthropics/claude-code-action@86eb26b...a26b07d)

Updates `actions/download-artifact` from 4.3.0 to 8.0.2
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](actions/download-artifact@d3f86a1...9000827)

Updates `actions/github-script` from 7.1.0 to 9.0.0
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](actions/github-script@f28e40c...3a2844b)

Updates `actions/upload-pages-artifact` from 3.0.1 to 5.0.0
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](actions/upload-pages-artifact@56afc60...fc324d3)

Updates `actions/configure-pages` from 5.0.0 to 6.0.0
- [Release notes](https://github.com/actions/configure-pages/releases)
- [Commits](actions/configure-pages@983d773...45bfe01)

Updates `actions/deploy-pages` from 4.0.5 to 5.0.1
- [Release notes](https://github.com/actions/deploy-pages/releases)
- [Commits](actions/deploy-pages@d6db901...368f825)

Updates `docker/setup-qemu-action` from 3.7.0 to 4.4.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](docker/setup-qemu-action@c7c5346...9901266)

Updates `docker/setup-buildx-action` from 3.12.0 to 4.4.1
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](docker/setup-buildx-action@8d2750c...f87e599)

Updates `docker/login-action` from 3.7.0 to 4.6.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@c94ce9f...dbcb813)

Updates `docker/build-push-action` from 5.4.0 to 7.4.0
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](docker/build-push-action@ca052bb...c3c9e26)

Updates `mathieudutour/github-tag-action` from 6.2 to 7
- [Release notes](https://github.com/mathieudutour/github-tag-action/releases)
- [Changelog](https://github.com/mathieudutour/github-tag-action/blob/master/CHANGELOG.md)
- [Commits](mathieudutour/github-tag-action@a22cf08...af99e60)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: anthropics/claude-code-action
  dependency-version: 1.0.250
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/download-artifact
  dependency-version: 8.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/github-script
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/upload-pages-artifact
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/configure-pages
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/deploy-pages
  dependency-version: 5.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/setup-qemu-action
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/setup-buildx-action
  dependency-version: 4.4.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/login-action
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: docker/build-push-action
  dependency-version: 7.4.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: mathieudutour/github-tag-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Post-release merge back to dev
Dependabot left the checkout pins labelled v4 although the SHA is
v7.0.1, and the claude-code-action pins labelled v1 although the
floating v1 tag has moved past the pinned v1.0.250.
…dev/github-actions-e79990fab6

ci: bump the github-actions group with 15 updates
Bumps the github-actions group with 1 update: [anthropics/claude-code-action](https://github.com/anthropics/claude-code-action).


Updates `anthropics/claude-code-action` from 1.0.250 to 1.0.251
- [Release notes](https://github.com/anthropics/claude-code-action/releases)
- [Commits](anthropics/claude-code-action@a26b07d...374f254)

---
updated-dependencies:
- dependency-name: anthropics/claude-code-action
  dependency-version: 1.0.251
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Every video without a file looked the same. A video deleted in the
app, one removed by automatic cleanup, and one whose file vanished
from disk all showed the same red Missing state, and they built up
on the Videos page with no way to clear them out.

- Record why a row lost its file (removed_reason, removed_at,
  removed_detail) and show it as Deleted (neutral) or Missing (red),
  with the reason in plain words in the chip tooltip and the video
  modal. Rows removed before this change show as Deleted.
- Hide deleted videos on the Videos page by default and remember the
  choice in the browser. Channel and playlist pages keep listing
  both, so either can still be re-downloaded.
- Add "Mark as deleted" for selected missing videos, plus "Mark all
  missing as deleted" and "Empty trash..." in Settings > Maintenance.
  Emptying the trash forgets the chosen videos and can also remove
  their download archive entries.
- Check that the downloads folder and each __subfolder exist and are
  not empty before marking anything missing. An unmounted drive or
  share could mark the whole library missing; now the file check
  holds those rows back and warns, the rescan records a failed or
  partial run, and actions over all missing videos are refused.
- Leave videos the archive lists without a row out of channel
  "Download all" and playlist download selection, which otherwise
  queued them for yt-dlp to skip on every run.
- Refuse a purge that removes archive entries while downloads are
  running, and hold new downloads until such a purge finishes.

Refs: #670
While a drive or share was down, the downloads folder could still
look mounted once Youtarr had created its own temp folder, playlists
folder, or an interrupted write test on the bare mount point, and the
page-load check and rescan then marked the whole library missing. The
check now ignores the entries Youtarr creates itself, reports an
unreadable subfolder on its own so the rescan keeps going, and is
consulted by automatic cleanup, the orphan folder sweep, and manual
deletes, which could otherwise stamp videos as deleted while their
files sat on the unmounted share.

- Add "Rescan anyway" to the Maintenance card: a manual rescan that
  skips the check once, for a downloads folder emptied on purpose.
  The scheduled rescan never skips it and the run record says when
  it was skipped.
- Guard the file check's writes so a delete that lands mid-request
  keeps its reason, leave the removal columns alone when job recovery
  cannot find the file, and pass plain rows to the channel page's
  file check so its results show on the same load.
- Reload from page one after a delete only in hot-load mode, where a
  later page's refetch kept the removed rows; classic pagination
  stays on its page.
- Send Mark as deleted in batches of 1000 and show the server's
  message when it is refused.
- Open Empty trash on the first available choice, disable it when
  nothing can be purged, and disable archive removal up front while
  a download is running.
- Show a present file as downloaded in the playlist modal even when
  YouTube has removed the video.
- Derive the filter chips' aria-pressed from the resting state.

Refs: #670
One failing __subfolder stopped the check, and with any present video
on record it then held back the rescan, automatic cleanup, the orphan
sweep, and the "all missing" trash actions for the whole library. An
empty subfolder nothing was stored in (one a channel had been moved
out of, say) looked like an unmounted share for good, and the check's
messages named the container path, which means nothing on the host.

The check now reports every failing subfolder, with the strictest
reason winning so an unreadable share is never looked past as emptied
on purpose, and callers ask whether the failure covers any stored
video before acting on it. The rescan and the page-load file check
hold back only the videos stored under a failing subfolder, cleanup
and the sweep skip only while present videos are affected, the
removed-summary reports a failure that covers no present or missing
video as passing, and messages name a subfolder by its own name only.

- Let Mark all missing as deleted look past the check, with an
  explicit acknowledgement in the Maintenance card, when the folder
  is only empty, never when it is gone or unreadable, so Rescan
  anyway is no longer a dead end.
- Add Mark as deleted for one missing video to the video modal, on
  every page.
- Make the Videos page unmounted-folder banner dismissible and offer
  Maintenance only for the empty reasons.
- Open an Availability chip's tooltip on a touch-screen tap without
  reaching the row underneath; mouse clicks still pass through.
- Show the Deleted filter chip as neutral at rest, keep the File
  Deleted/Missing overlay readable on any thumbnail and within a
  phone's player, and say in every removal sentence that the video
  can be downloaded again.

Refs: #670
- Say "file" instead of "files" in the Mark all missing as deleted
  dialog when only one video is missing.
- Reword the Videos page banner and Maintenance card warnings so they
  read correctly when the message names more than one subfolder:
  "Until that changes" replaces "until it is back".
- Show "The downloads folder check was skipped." on the Maintenance
  page's Last rescan line after a Rescan anyway, as the Scheduling
  page already does.
- Keep the label on the video window's Mark as deleted button on
  phones, where it showed only an icon and acted on the first tap,
  and let the phone action row wrap so the label is not cut off.

Refs: #670
…ng-video-handling

feat: separate deleted videos from missing ones
Downloaded videos can now be selected and deleted right from the
playlist page, and the video table stays readable on smaller screens.

- The table layout now holds down to a window about 900px wide,
  instead of switching to cards below about 1380px. The channel name
  sits under the title and Exclude/Include is an icon next to each
  row's checkbox, which also gives titles more room on wide screens.
- Downloaded and not-downloaded videos can be selected together.
  Download fetches the ones that aren't on disk, Delete removes the
  downloaded ones, and each confirmation says how many videos it will
  affect and which it will leave alone.
- After a video is deleted, from any page or by automatic cleanup,
  its playlists' .m3u files and Plex, Jellyfin, and Emby playlists
  update right away instead of listing the deleted file until the
  next download.
- Deleting the last downloaded video of a playlist empties its Plex
  playlist and removes its Jellyfin or Emby playlist without an error;
  they fill back in when videos are downloaded again.
- Videos marked missing stay in synced playlists, since their files
  may come back.
feat: delete videos from the playlist page
Once videos are marked deleted or missing, the Videos page hid them
without saying where to clean them up, and a missing file's path was
buried inside a sentence in a narrow tooltip.

- Show "N deleted videos hidden" beside the Library heading on wide
  screens (under it on phones) with Show, Clean up and an explanation,
  and add a line under the Missing or Deleted filter when it isolates
  those videos. Each links to the Maintenance card at
  /settings/maintenance#deleted-and-missing, which the Maintenance
  page now scrolls to.
- Render removed-video tooltips through a shared RemovalDescription
  that sets a missing file's path apart in a monospace pill, with a
  wider tooltip so it wraps less. The video modal keeps the plain
  sentence through the same describeMissing helper.
- Move InfoHint to shared, since the Videos page now uses it too.

Refs: #670
On hover, the Filters button on the Videos page and channel pages
showed its label in nearly the same color as the hover background in
some themes (Bold Flat light, Playful dark), so the text was hard to
read. The Sort button and the channel filter button in the filter
panel used the same hover classes.

Switch them to the Button's neutral outlined
style (color="inherit"), which already uses the foreground color on
hover, and keep only the border highlight as an extra class. The
Filters button still uses the primary fill while filters are active.
On desktop, the active filter chips stayed visible under the open
inline filter panel, so each active filter appeared twice: as an
editable control in the panel and as a summary chip beneath it.

Show the chips only while the inline panel is closed. The mobile
drawer is unchanged: it covers the page, so the chips keep their
place rather than shifting the content behind it when it opens.
…dev/github-actions-78acd345cd

ci: bump anthropics/claude-code-action from 1.0.250 to 1.0.251 in the github-actions group
…ng-video-handling

feat: show where to clean up deleted and missing videos
Results used to be listed newest first, so recent Shorts crowded out
the videos YouTube ranked as the best matches. Results now appear in
YouTube's own order, with sorting and several other improvements on
top.

- Results open in a table on desktop. Click a column heading to sort
  by title, channel, published date, length, or views; click again to
  reverse, and a third time to return to YouTube's order. On phones,
  and in grid view, a Sort menu does the same.
- Every result shows its view count.
- Your search stays in the page address, so the browser's Back button
  brings the same results back without searching again.
- The page remembers the view, sort, and minimum length you chose.
- Channels you already follow are marked Subscribed, and their names
  link to the channel page. Other channel names offer to add the
  channel.
- Each result has a download button, so a single video takes one click
  instead of ticking a box and opening the selection menu. The orange
  "Not Downloaded" chip is gone; a chip appears only when a video is
  already downloaded, queued, deleted, or missing.
- Dates read as "3 weeks ago", with the exact date on hover. Videos of
  a minute or less carry a Short badge, and the length filter's first
  option now says it hides Shorts.
- Live and upcoming streams no longer appear in results, since trying
  to download one could run until stopped.
- On phones the search controls take three short rows instead of
  five, and on tablets the table scrolls sideways instead of squeezing
  the titles.
…n-youtube

feat(find-videos): make YouTube search easier to use
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

📊 Test Coverage Report

Backend Coverage

Type Coverage Status
Lines 91.26% 🟢
Statements 91.14% 🟢
Functions 91.11% 🟢
Branches 85.13% 🟢

Frontend Coverage

Type Coverage Status
Lines 89.77% 🟢
Statements 88.23% 🟢
Functions 81.99% 🟢
Branches 82.92% 🟢

Coverage Requirements

  • Minimum threshold: 70% line coverage
  • Backend: ✅ Passes
  • Frontend: ✅ Passes

Coverage report generated for commit c548ddc

@dialmaster dialmaster changed the title Release Release: Deleted vs. missing videos, deleting from the playlist page, and better YouTube search Oct 20, 2026
@dialmaster
dialmaster merged commit 7f2ca31 into main Oct 20, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant