Repository navigation
Release: Deleted vs. missing videos, deleting from the playlist page, and better YouTube search - #954
Merged
Merged
Conversation
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
Contributor
📊 Test Coverage ReportBackend Coverage
Frontend Coverage
Coverage Requirements
Coverage report generated for commit c548ddc |
fix(deps): bump follow-redirects to 1.16.1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
fixes
__subfolderwas 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)