From 60f903c50a845d3a1becdd570abd4d79e64b0fdb Mon Sep 17 00:00:00 2001 From: dialmaster Date: Sat, 31 Jan 2026 13:54:56 -0800 Subject: [PATCH 1/8] fix(ci): grant gh CLI permissions to Claude Code workflow [skip ci] --- .github/workflows/claude.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 7569ebe..d0ca825 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -31,7 +31,7 @@ jobs: with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} prompt: "/review" - claude_args: "--max-turns 5" + claude_args: '--max-turns 5 --allowedTools "Bash(gh:*)"' # Manual @claude responses - restricted to authorized users manual-claude: @@ -50,4 +50,4 @@ jobs: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - claude_args: "--max-turns 10" + claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)"' From 3ab9525f228a5dd196b75f789446105b2fc4ea66 Mon Sep 17 00:00:00 2001 From: dialmaster Date: Sat, 31 Jan 2026 14:16:26 -0800 Subject: [PATCH 2/8] fix(ci): Claude Code gh workflow [skip ci] --- .github/workflows/claude.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index d0ca825..7f63cad 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -30,8 +30,22 @@ jobs: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - prompt: "/review" - claude_args: '--max-turns 5 --allowedTools "Bash(gh:*)"' + prompt: | + REPO: ${{ github.repository }} + PR NUMBER: ${{ github.event.pull_request.number }} + PR TITLE: ${{ github.event.pull_request.title }} + + Please review this pull request with a focus on: + - Code quality and best practices + - Potential bugs or issues + - Security implications + - Performance considerations + + The PR branch is already checked out. Use `gh pr diff ${{ github.event.pull_request.number }}` to see the changes. + + Post your review as a comment on the PR using `gh pr comment ${{ github.event.pull_request.number }} --body "your review here"`. + Only post GitHub comments - don't just output text. + claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)"' # Manual @claude responses - restricted to authorized users manual-claude: From cce2e8179793091eff7049dba00a2512cf196adf Mon Sep 17 00:00:00 2001 From: dialmaster Date: Sun, 1 Feb 2026 09:39:42 -0800 Subject: [PATCH 3/8] docs: PR guidelines / expectations CONTRIBUTING.md [skip ci] --- CONTRIBUTING.md | 95 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc3c684..69a8f70 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -53,7 +53,21 @@ Found a bug? Check the [GitHub Issues](https://github.com/DialmasterOrg/Youtarr/ - Relevant logs or screenshots ### New Features -Have an idea for a new feature? Open an issue to discuss it before starting development. This helps ensure the feature aligns with the project's direction and prevents duplicate work. + +Have an idea for a new feature? **Open an issue to discuss it before starting development.** This is especially important for: + +- Features requiring more than ~1,000 lines of code +- Changes to the build system, testing framework, or core architecture +- UI/UX redesigns or navigation changes +- New dependencies or third-party integrations + +Why discuss first? +- Ensures the feature aligns with the project direction +- Prevents duplicate work +- Allows the maintainer to suggest the best approach +- Avoids investing time in changes that may not be accepted + +For small, obvious improvements (typo fixes, minor bug fixes), feel free to submit a PR directly. ### Documentation Improvements Documentation is crucial for user adoption. Contributions that improve clarity, fix errors, or add missing information are highly valued. This includes: @@ -222,6 +236,54 @@ fix/zzz ──────┘ - Modified setup/installation steps - Changed environment variables +### PR Scope and Size Guidelines + +**Keep PRs focused and reviewable.** Large PRs are difficult to review and risky to merge. Follow these guidelines: + +#### Size Limits +- **Target: Under 1,000 lines changed** (excluding generated files, lock files) +- **Hard limit: 25 files** - PRs touching more than 25 files need prior discussion +- **One feature per PR** - Don't bundle unrelated changes + +#### PR Requirements (Non-Negotiable) + +These are hard requirements for all PRs: + +- **No merge conflicts** - Rebase your branch on the latest `dev` before submitting +- **CI must pass** - All automated checks must be green (linting, tests, type checking) +- **No bypassing checks** - Never use `--no-verify`, `test.skip()`, or comment out tests +- **Coverage maintained** - Don't delete tests without adding equivalent coverage + +#### What Requires Prior Discussion + +Open a GitHub issue or Discord discussion **before** starting work on: + +| Change Type | Why Discuss First? | +|-------------|-------------------| +| Build system changes | Affects entire codebase | +| Testing framework changes | Affects all tests | +| Major dependencies | Long-term maintenance | +| Architecture changes | Affects future PRs | +| Large refactors | Risk of regressions | + +#### Breaking Up Large Changes + +If your feature requires many changes, split it into sequential PRs: + +1. **Infrastructure PR** - Build/config changes only +2. **Core feature PR** - Minimal implementation +3. **Enhancement PRs** - Additional features, polish +4. **Test migration PR** - Only after feature is stable + +Each PR should be independently reviewable and mergeable. + +#### What NOT to Do + +- **Don't delete existing tests** without adding equivalent coverage first +- **Don't modify CI/workflow files** in feature PRs (submit those separately) +- **Don't combine unrelated features** in a single PR +- **Don't make "while I'm here" changes** - stay focused on the stated goal + ### Submitting Your PR When you're ready, push your branch and create a pull request **targeting the `dev` branch** on GitHub. Your PR will be reviewed by the maintainer. @@ -229,11 +291,18 @@ When you're ready, push your branch and create a pull request **targeting the `d **PR Checklist:** - [ ] PR targets `dev` branch (not `main`) +- [ ] PR has no merge conflicts (rebased on latest `dev`) +- [ ] CI passes (linting, tests, type checking all green) - [ ] Tests pass locally (`npm test`) - [ ] Coverage meets 70% threshold +- [ ] No bypassed checks (no `--no-verify`, `test.skip`, or commented tests) - [ ] Conventional commit format used - [ ] ESLint passes (`npm run lint`) - [ ] TypeScript compiles without errors (`npm run lint:ts`) +- [ ] PR is focused on a single feature/fix (not bundled changes) +- [ ] PR touches fewer than 25 files (or discussed with maintainer first) +- [ ] No workflow/CI file changes (submit those separately) +- [ ] Existing tests are preserved (or equivalent coverage added) - [ ] Documentation updated if needed - [ ] Tested in Docker environment - [ ] No commented-out code or debug statements @@ -403,6 +472,30 @@ For more information on database management, see [DATABASE.md](docs/DATABASE.md) ## Getting Help +### Communication Expectations + +**We value collaboration over surprise PRs.** Before investing significant time: + +1. **Check existing issues** - Is someone already working on this? +2. **Open a discussion issue** - Describe what you want to build +3. **Wait for feedback** - The maintainer may have context you don't +4. **Start small** - A working prototype PR is better than a complete rewrite + +#### When to Reach Out + +- **Small bug fixes** (< 100 lines): Just submit the PR +- **Medium features** (100-1000 lines): Open an issue first +- **Large changes** (1000+ lines): Discuss on Discord or issue before coding +- **Architectural changes**: Always discuss first, regardless of size + +#### Response Times + +- **Issues**: Typically responded to within 2-4 days +- **PRs**: Review within 1 week (complex PRs may take longer) +- **Discord**: Usually 1-2 day response time during active hours + +Don't interpret silence as approval to proceed with major changes. + ### Questions and Discussion - **Discord Server**: Join our [Discord community](https://discord.gg/68rvWnYMtD) for real-time help and discussion From 42d68160f9f2f7c820ece5cdd14f8937474f7332 Mon Sep 17 00:00:00 2001 From: dialmaster Date: Sun, 15 Feb 2026 15:21:06 -0800 Subject: [PATCH 4/8] fix(ci): Claude Code gh workflow [skip ci] --- .github/workflows/claude.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index 7f63cad..f38fc94 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -41,11 +41,13 @@ jobs: - Security implications - Performance considerations - The PR branch is already checked out. Use `gh pr diff ${{ github.event.pull_request.number }}` to see the changes. + Use `gh pr diff ${{ github.event.pull_request.number }}` to see the changes. + + IMPORTANT: Only use `gh` commands. Do NOT run tests, npm commands, or any other shell commands. Post your review as a comment on the PR using `gh pr comment ${{ github.event.pull_request.number }} --body "your review here"`. Only post GitHub comments - don't just output text. - claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)"' + claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' # Manual @claude responses - restricted to authorized users manual-claude: @@ -64,4 +66,4 @@ jobs: - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)"' + claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' From 609d38ae43471d11f65dbe5d32a4f7d1cff50ced Mon Sep 17 00:00:00 2001 From: dialmaster Date: Sun, 15 Feb 2026 15:45:48 -0800 Subject: [PATCH 5/8] fix(ci): Claude Code gh workflow again [skip ci] --- .github/workflows/claude.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml index f38fc94..d541e90 100644 --- a/.github/workflows/claude.yml +++ b/.github/workflows/claude.yml @@ -24,6 +24,7 @@ jobs: auto-review: if: github.event_name == 'pull_request' runs-on: ubuntu-latest + continue-on-error: true steps: - uses: actions/checkout@v4 @@ -47,7 +48,7 @@ jobs: Post your review as a comment on the PR using `gh pr comment ${{ github.event.pull_request.number }} --body "your review here"`. Only post GitHub comments - don't just output text. - claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' + claude_args: '--max-turns 20 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' # Manual @claude responses - restricted to authorized users manual-claude: @@ -60,10 +61,11 @@ jobs: github.event.comment.author_association == 'COLLABORATOR' ) runs-on: ubuntu-latest + continue-on-error: true steps: - uses: actions/checkout@v4 - uses: anthropics/claude-code-action@v1 with: anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - claude_args: '--max-turns 10 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' + claude_args: '--max-turns 20 --allowedTools "Bash(gh:*)" "Bash(git fetch *)"' From 00b39929b48494392b15a479e646af75e5fe47a0 Mon Sep 17 00:00:00 2001 From: "Youtarr Service Account[bot]" Date: Mon, 16 Feb 2026 22:39:07 +0000 Subject: [PATCH 6/8] Bump version to v1.59.0 [skip ci] --- client/package-lock.json | 4 ++-- client/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index c21e2d8..9140a48 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "client", - "version": "1.58.0", + "version": "1.59.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client", - "version": "1.58.0", + "version": "1.59.0", "dependencies": { "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", diff --git a/client/package.json b/client/package.json index d174b77..5700a7e 100644 --- a/client/package.json +++ b/client/package.json @@ -1,6 +1,6 @@ { "name": "client", - "version": "1.58.0", + "version": "1.59.0", "private": true, "type": "module", "proxy": "http://localhost:3011", diff --git a/package-lock.json b/package-lock.json index 6904007..33184e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "youtarr", - "version": "1.58.0", + "version": "1.59.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "youtarr", - "version": "1.58.0", + "version": "1.59.0", "license": "ISC", "dependencies": { "axios": "^1.12.0", diff --git a/package.json b/package.json index f134644..769eb9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "youtarr", - "version": "1.58.0", + "version": "1.59.0", "description": "", "main": "server/index.js", "scripts": { From 4752a3888fd3f7d70c9e64042a57bef0d46390e4 Mon Sep 17 00:00:00 2001 From: "Youtarr Service Account[bot]" Date: Mon, 16 Feb 2026 22:44:13 +0000 Subject: [PATCH 7/8] docs: update CHANGELOG for v1.59.0 [skip ci] --- CHANGELOG.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94f8bcf..8159886 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,72 @@ # Changelog +## [v1.59.0](https://github.com/DialmasterOrg/Youtarr/releases/tag/v1.59.0) - 2026-02-16 + +## [1.59.0](https://github.com/DialmasterOrg/Youtarr/compare/vv1.58.0...v1.59.0) (2026-02-16) + + +### Features + +* add default_rating handling in settings and channel mapping ([cec6610](https://github.com/DialmasterOrg/Youtarr/commit/cec661079a74356e445f88fa1e1b95060005ba19)) +* add Vite environment variables and enhance location mocking utilities for tests ([a4e52de](https://github.com/DialmasterOrg/Youtarr/commit/a4e52de6d05eed3ae3940b2c85b225a3c2d4c28f)) +* enhance testing setup with window.location mock and aligned endpoint calls with upstream-dev ([a364a44](https://github.com/DialmasterOrg/Youtarr/commit/a364a44eca9b9104689961e6d1deb7e919b80a7a)) +* enhance URL validation to support sync/async handlers and improve error handling ([d5d9cdc](https://github.com/DialmasterOrg/Youtarr/commit/d5d9cdcef625cbdd98776e9bacd8818279c9eaa5)) +* implement age limit mapping and validation for content ratings ([1b0a8fa](https://github.com/DialmasterOrg/Youtarr/commit/1b0a8fa17516bea1ba9fda875c3f4c7f5d153798)) +* Implement content rating system across various components ([349322d](https://github.com/DialmasterOrg/Youtarr/commit/349322d65e761c5fb4749e413063b1d23d183d28)) +* implement locationUtils for robust window.location mocking in tests and refactor components to use it ([86c0a1b](https://github.com/DialmasterOrg/Youtarr/commit/86c0a1bd49729cc8639966277d68e6ccca3fda3b)) +* implement safe JSON parsing for fetch responses and remove unused location mock ([9500926](https://github.com/DialmasterOrg/Youtarr/commit/950092680396981806bf16f2c47634296d9a47aa)) +* migrate client to Vite, update dependencies, and refactor tests ([cf0f67c](https://github.com/DialmasterOrg/Youtarr/commit/cf0f67cc7dcdb9b4cc50715ca97a7a2a07fe0052)) +* Pull content rating feature from full-stack and updated existing testing. ([c679d17](https://github.com/DialmasterOrg/Youtarr/commit/c679d173964c1456365ca24c0f0093c14cde8046)) +* update cache control settings across API calls and static assets ([7c9842b](https://github.com/DialmasterOrg/Youtarr/commit/7c9842b4db9b23af214adf593b926ef5a89870b5)) +* update video rating handling to support null values and normalize ratings in API ([d40de38](https://github.com/DialmasterOrg/Youtarr/commit/d40de38dca5c54ac898fde604dd79fb01922a760)) + + +### Bug Fixes + +* **#426:** use configurable tmp path ([8edefdf](https://github.com/DialmasterOrg/Youtarr/commit/8edefdf8b87c4d4fabf0bc59714be26ddd3996ca)), closes [#426](https://github.com/DialmasterOrg/Youtarr/issues/426) +* **ci:** Claude Code gh workflow [skip ci] ([e103335](https://github.com/DialmasterOrg/Youtarr/commit/e1033355554c8b7dc060313eedd637567b7b9292)) +* **ci:** Claude Code gh workflow [skip ci] ([3ab9525](https://github.com/DialmasterOrg/Youtarr/commit/3ab9525f228a5dd196b75f789446105b2fc4ea66)) +* **ci:** grant gh CLI permissions to Claude Code workflow [skip ci] ([2ff9f19](https://github.com/DialmasterOrg/Youtarr/commit/2ff9f19babc38f7b7499d5a94fb303ab6f061506)) +* **ci:** grant gh CLI permissions to Claude Code workflow [skip ci] ([60f903c](https://github.com/DialmasterOrg/Youtarr/commit/60f903c50a845d3a1becdd570abd4d79e64b0fdb)) +* Improve content rating reliability and Plex metadata embedding ([29ac65d](https://github.com/DialmasterOrg/Youtarr/commit/29ac65d4ca5dff622b393f0f8ef40131aeb5e412)) +* update import paths for locationUtils in multiple components and tests ([c97b740](https://github.com/DialmasterOrg/Youtarr/commit/c97b74092486cbe8898b0148664a47d7c4a51cfa)) +* **ci:** Claude Code gh workflow [skip ci] ([af6cf50](https://github.com/DialmasterOrg/Youtarr/commit/af6cf505214076a988165fbba5913a041f50d589)) +* **ci:** Claude Code gh workflow [skip ci] ([42d6816](https://github.com/DialmasterOrg/Youtarr/commit/42d68160f9f2f7c820ece5cdd14f8937474f7332)) +* **ci:** Claude Code gh workflow [skip ci] ([c23a3bc](https://github.com/DialmasterOrg/Youtarr/commit/c23a3bc6382d102d2d4a718d54b17ea8155c983e)) +* **ci:** Claude Code gh workflow again [skip ci] ([6b29f5c](https://github.com/DialmasterOrg/Youtarr/commit/6b29f5ce30adea6fe19993e1b268446fbd5b5a7c)) +* **ci:** Claude Code gh workflow again [skip ci] ([4d4d73c](https://github.com/DialmasterOrg/Youtarr/commit/4d4d73cf1513116f26ff1fb90123da99ab57b389)) +* **ci:** Claude Code gh workflow again [skip ci] ([609d38a](https://github.com/DialmasterOrg/Youtarr/commit/609d38ae43471d11f65dbe5d32a4f7d1cff50ced)) +* **ci:** stop Claude running disallowed commands ([d6571fa](https://github.com/DialmasterOrg/Youtarr/commit/d6571fa9962f00961921ebf085ddae2aa0349602)) +* **tests:** correct --year in AtomicParsley test ([f826275](https://github.com/DialmasterOrg/Youtarr/commit/f826275e7de04509b8564033c0a8dffe80704eaa)) +* **tests:** prevent Jest hanging by mocking tempPathManager ([185ff04](https://github.com/DialmasterOrg/Youtarr/commit/185ff04d3c81c1b524fb70a49088acb1b14b698e)) +* Addressed test error and implemented code review suggestions. ([ce2315f](https://github.com/DialmasterOrg/Youtarr/commit/ce2315fd51a6407f2e63a448de8fef1dea6dd4e7)) +* Better helper text for content rating setting ([9a26bbb](https://github.com/DialmasterOrg/Youtarr/commit/9a26bbb3ea6c3eb03bff86d85da8fa1792a28221)) +* option for original date (year) metadata ([1c8e7d6](https://github.com/DialmasterOrg/Youtarr/commit/1c8e7d665297f06530445cc7dd58a0f89c66073b)) +* Update tests to include rating field in VideoTableView and DownloadSettingsDialog ([3745388](https://github.com/DialmasterOrg/Youtarr/commit/3745388ba0f4f6ab636c5e37fa140adb0617bcd3)) + + +### Tests + +* include Channel in models mock and set https mock statusCode=200 to fix CI ([e106d14](https://github.com/DialmasterOrg/Youtarr/commit/e106d14bcf55c3f10b314f705eb0ca7bb9896324)) + + +### Code Refactoring + +* update TypeScript version and remove unused files ([2d301be](https://github.com/DialmasterOrg/Youtarr/commit/2d301be1c6964ea1aa1c9fb0e357315e9e619a0b)) + + +### Documentation + +* document backfill-ratings.js script in USAGE_GUIDE ([79e5c74](https://github.com/DialmasterOrg/Youtarr/commit/79e5c749eb398a341bdc0524810396f8642e8ca4)) +* fix Vite dev server port in documentation [skip ci] ([cd49ed9](https://github.com/DialmasterOrg/Youtarr/commit/cd49ed924ef2c36d1249ab4ff7c733f1a8be31a2)) +* PR guidelines / expectations CONTRIBUTING.md [skip ci] ([d404bf8](https://github.com/DialmasterOrg/Youtarr/commit/d404bf80ab6476a923cdf64ee24c24669ca6035a)) +* PR guidelines / expectations CONTRIBUTING.md [skip ci] ([cce2e81](https://github.com/DialmasterOrg/Youtarr/commit/cce2e8179793091eff7049dba00a2512cf196adf)) +* update CHANGELOG for v1.58.0 [skip ci] ([bc52fad](https://github.com/DialmasterOrg/Youtarr/commit/bc52fad6e4ceed59486ab63b21d89cfdbb6ccc65)) + + + + + ## [v1.58.0](https://github.com/DialmasterOrg/Youtarr/releases/tag/v1.58.0) - 2026-01-31 ## [1.58.0](https://github.com/DialmasterOrg/Youtarr/compare/vv1.57.1...v1.58.0) (2026-01-31) From bef34d3fb357c80c94fc9c1fa9000893127b91a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Feb 2026 22:53:56 +0000 Subject: [PATCH 8/8] chore: update coverage badges [skip ci] --- .github/badges/backend-coverage.txt | 2 +- .github/badges/frontend-coverage.txt | 2 +- README.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/badges/backend-coverage.txt b/.github/badges/backend-coverage.txt index 45d98e9..2a09e6d 100644 --- a/.github/badges/backend-coverage.txt +++ b/.github/badges/backend-coverage.txt @@ -1 +1 @@ -https://img.shields.io/badge/Backend_Coverage-80%25-yellow +https://img.shields.io/badge/Backend_Coverage-79%25-yellow diff --git a/.github/badges/frontend-coverage.txt b/.github/badges/frontend-coverage.txt index 58d35e1..fab5109 100644 --- a/.github/badges/frontend-coverage.txt +++ b/.github/badges/frontend-coverage.txt @@ -1 +1 @@ -https://img.shields.io/badge/Frontend_Coverage-84%25-brightgreen +https://img.shields.io/badge/Frontend_Coverage-87%25-brightgreen diff --git a/README.md b/README.md index e6e867b..896f66e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Youtarr -![Backend Coverage](https://img.shields.io/badge/Backend_Coverage-80%25-yellow) -![Frontend Coverage](https://img.shields.io/badge/Frontend_Coverage-84%25-brightgreen) +![Backend Coverage](https://img.shields.io/badge/Backend_Coverage-79%25-yellow) +![Frontend Coverage](https://img.shields.io/badge/Frontend_Coverage-87%25-brightgreen) ![CI Status](https://github.com/DialmasterOrg/Youtarr/workflows/CI%20-%20Lint%20and%20Test/badge.svg) Youtarr is a self-hosted YouTube downloader that automatically downloads videos from your favorite channels. It provides metadata for multiple media servers and offers optional Plex integration for automatic library refreshes.