diff --git a/.gitattributes b/.gitattributes index 7bee716a5d..7a5df63373 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,26 +1,6 @@ # Auto-detect text files and perform LF normalization * text=auto -# Fork-specific files - always keep ours during merge conflicts -# These files contain customizations that should not be overwritten by upstream merges -README.md merge=ours -package_info merge=ours -bazarr/app/check_update.py merge=ours -custom_libs/subliminal_patch/providers/opensubtitles_scraper.py merge=ours -Dockerfile merge=ours -docker-compose.yml merge=ours -docker/entrypoint.sh merge=ours -.dockerignore merge=ours -.gitattributes merge=ours -docs/FORK_MAINTENANCE.md merge=ours - -# GitHub workflows - keep our fork's versions -.github/workflows/* merge=ours - -# Git submodule - keep our reference -.gitmodules merge=ours -opensubtitles-scraper merge=ours - # Binary files *.png binary *.jpg binary diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b663249502..b774a8b9e7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -21,7 +21,7 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Software (please complete the following information):** - - Bazarr: [e.g. v 0.6.1] + - Bazarr+: [e.g. v2.0.0] - Radarr version [e.g. v 0.2.0.0001] - Sonarr version [e.g. v 2.0.0.0001] - OS: [e.g. Windows 10] diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 77b0f431ff..cb76eff4d6 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -5,4 +5,4 @@ contact_links: about: The Bazarr wiki should help guide you through installation and setup as well as help resolve common problems and answer frequently asked questions. - name: 🚀 Feature suggestions url: https://github.com/LavX/bazarr/issues - about: Share your suggestions or ideas to make Bazarr better! + about: Share your suggestions or ideas to make Bazarr+ better! diff --git a/.github/scripts/build_test.sh b/.github/scripts/build_test.sh index 56ccd6c1a7..d0714b5db0 100755 --- a/.github/scripts/build_test.sh +++ b/.github/scripts/build_test.sh @@ -7,7 +7,7 @@ sleep 30 if kill -s 0 $PID then - echo "Bazarr is still running. We'll test if UI is working..." + echo "Bazarr+ is still running. We'll test if UI is working..." else exit 1 fi diff --git a/.github/workflows/build-docker-manual.yml b/.github/workflows/build-docker-manual.yml index c247fe8f04..55a6764b15 100644 --- a/.github/workflows/build-docker-manual.yml +++ b/.github/workflows/build-docker-manual.yml @@ -15,10 +15,6 @@ on: options: - master - development - - feature/audio-display-with-filter - - python_3_14 - - ai_translate - - no_telemetry default: 'master' build_type: @@ -33,7 +29,7 @@ on: default: 'dev' version_tag: - description: 'Version tag (e.g., v1.5.3) - used for release builds' + description: 'Version tag (e.g., v2.0.0) - used for release builds' required: false default: '' type: string @@ -77,7 +73,7 @@ jobs: ref: ${{ inputs.branch }} - name: Setup NodeJS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: "${{ env.UI_DIRECTORY }}/.nvmrc" cache: 'npm' @@ -161,7 +157,7 @@ jobs: VERSION=$(git describe --tags --always 2>/dev/null || echo "0.0.0") fi VERSION="${VERSION#v}" # Remove 'v' prefix - FORK_VERSION="${VERSION}+$(date -u +%y%m%d)" + FORK_VERSION="${VERSION}" TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${FORK_VERSION}" TAGS="${TAGS},${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:v${VERSION}" diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 80c9cbca9f..4522e7f11a 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -3,7 +3,6 @@ name: Build Docker Image on: push: branches: - - main - master paths-ignore: - '*.md' @@ -12,14 +11,7 @@ on: workflow_dispatch: inputs: version_tag: - description: 'Version tag for the image (e.g., v1.5.3)' - required: false - default: '' - type: string - workflow_call: - inputs: - version_tag: - description: 'Version tag for the image' + description: 'Version tag for the image (e.g., v2.0.0)' required: false default: '' type: string @@ -39,7 +31,7 @@ jobs: uses: actions/checkout@v5 - name: Setup NodeJS - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version-file: "${{ env.UI_DIRECTORY }}/.nvmrc" cache: 'npm' @@ -116,19 +108,17 @@ jobs: # Remove 'v' prefix for semver SEMVER="${VERSION#v}" - # Create Bazarr+ version + # Bazarr+ version is the semver tag directly SHORT_SHA=$(git rev-parse --short HEAD) - BUILD_DATE=$(date -u +%y%m%d) - FORK_VERSION="${SEMVER}+${BUILD_DATE}" - + FORK_VERSION="${SEMVER}" + echo "version=$VERSION" >> $GITHUB_OUTPUT echo "semver=$SEMVER" >> $GITHUB_OUTPUT echo "fork_version=$FORK_VERSION" >> $GITHUB_OUTPUT echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT - + echo "## Version Info" >> $GITHUB_STEP_SUMMARY - echo "- **Base Version:** $VERSION" >> $GITHUB_STEP_SUMMARY - echo "- **Fork Version:** $FORK_VERSION" >> $GITHUB_STEP_SUMMARY + echo "- **Version:** $FORK_VERSION" >> $GITHUB_STEP_SUMMARY echo "- **Short SHA:** $SHORT_SHA" >> $GITHUB_STEP_SUMMARY - name: Extract Docker Metadata @@ -139,7 +129,7 @@ jobs: tags: | # Latest tag on main/master branch type=raw,value=latest,enable={{is_default_branch}} - # Version tag (e.g., v1.5.7+250324) + # Version tag (e.g., v2.0.0) type=raw,value=${{ steps.version.outputs.fork_version }} # Short SHA tag type=raw,value=sha-${{ steps.version.outputs.short_sha }} @@ -221,6 +211,5 @@ jobs: This release is based on upstream Bazarr with the following custom modifications: - OpenSubtitles.org web scraper provider (no VIP API needed) - - Manual sync with upstream on major releases See the auto-generated release notes below for detailed changes. \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 58aa6fa4ce..6699519db9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: [main] + branches: [master, development] paths: - frontend/** - bazarr/** @@ -14,7 +14,7 @@ on: - dev-requirements.txt - .github/workflows/ci.yml pull_request: - branches: [main] + branches: [master, development] env: ROOT_DIRECTORY: . @@ -77,7 +77,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: [ '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14' ] + python-version: [ '3.12', '3.13', '3.14' ] name: Python ${{ matrix.python-version }} backend steps: diff --git a/.gitignore b/.gitignore index 5ad12489e5..16e1ffd382 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,6 @@ VERSION !*.dll .claude/ +.superpowers/ docs/superpowers/ .coverage diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca49bf167c..c9d3609e26 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ ### Branch model -- `master` contains stable releases, tagged with `v{upstream}+{YYMMDD}` versions +- `master` contains stable releases, tagged with semver versions (e.g., `v2.0.0`, `v2.1.0`) - `development` is the integration branch where upstream merges and new features land - Feature branches are created from `development` and merged back via PR @@ -20,18 +20,11 @@ - `master` is not merged back to `development` - All feature branches are branched from `development` -- Upstream sync merges go into `development` first, never directly to `master` +- Cherry-picked upstream fixes go into `development` first, never directly to `master` -## Upstream sync +## Upstream relationship -Bazarr+ syncs with [upstream Bazarr](https://github.com/morpheus65535/bazarr) manually after major releases. Upstream merges are always done with `--no-commit --no-ff` and reviewed before committing, to avoid reintroducing removed telemetry, overwriting branding, or conflicting with fork-specific features. - -Files that are always kept as the Bazarr+ version during upstream merges: -- `package_info` -- `Dockerfile`, `docker-compose.yml` -- `README.md` -- Logo and branding assets -- Any telemetry/analytics code (removed in Bazarr+) +Bazarr+ is a hard fork of [upstream Bazarr](https://github.com/morpheus65535/bazarr). There is no automatic synchronization. Bug fixes from upstream may be cherry-picked selectively when relevant, but upstream releases are not merged wholesale. ## Contribution workflow @@ -65,7 +58,7 @@ Fix all errors before submitting. Warnings should be addressed when practical. PRs should include tests when the change is testable. We use: - **Backend:** pytest for Python tests -- **Frontend:** Jest for React component and page tests +- **Frontend:** Vitest for React component and page tests ```bash # Run backend tests @@ -76,7 +69,7 @@ cd frontend npm test # Run a specific test file -npm test -- --testPathPattern=Translator +npm test -- Translator ``` When to include tests: diff --git a/README.md b/README.md index 31404eb434..88b0da9a71 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@
-
+
+
+
Bazarr+ @@ -15,14 +19,75 @@
- No tracking · Provider priority · OpenSubtitles.org web scraper · AI translation via OpenRouter (300+ LLMs) · API key encryption · batch translation · mass subtitle sync · 11 bulk operations · advanced table filters · security hardening · Python 3.14 · navy + amber dark theme + No tracking · Provider priority · OpenSubtitles.org web scraper · AI translation via OpenRouter (300+ LLMs) · API key encryption · batch translation · mass subtitle sync · 11 bulk operations · subtitle viewer · advanced table filters · security hardening · Python 3.14 · navy + amber dark theme
--- -## Why Bazarr+? +## Switching from upstream Bazarr? + +- Migration can be as simple as replacing the container image with `ghcr.io/lavx/bazarr:latest` and starting the container +- Back up your `/config` directory first +- Bazarr+ uses independent versioning starting at v2.0.0, unrelated to upstream version numbers +- Config changes made by Bazarr+ are not backwards-compatible with upstream Bazarr, so switching back requires restoring your backup +- Recommended: test with a copy of your config before committing to the switch + +--- + +## At a Glance -Bazarr is great at finding subtitles. Bazarr+ takes it further with features upstream doesn't have: +| Feature | Upstream Bazarr | Bazarr+ | +|---------|-----------------|---------| +| **Provider Priority** | [Rejected](https://bazarr.featureupvote.com/suggestions/112323/provider-prioritization) (62 votes) | Dual mode: priority order with early stop, or classic simultaneous | +| **OpenSubtitles.org (Scraper)** | Not available | Self-hosted FastAPI microservice via CloudScraper | +| **AI Subtitle Translator (OpenRouter)** | Not available | 300+ LLMs + any custom model ID | +| **API Key Encryption** | Not available | AES-256-GCM encryption for keys in transit | +| **Translate from Missing Menu** | Not available | Action menu on missing subs with source language picker | +| **Batch Translation** | Not available | Translate entire series/libraries from Wanted pages | +| **Mass Subtitle Sync** | [Rejected](https://bazarr.featureupvote.com/suggestions/172013/mass-sync-all-subtitles) (249 votes) | Bulk sync from Tasks page or Mass Edit, skips already-synced | +| **Bulk Operations** | One-at-a-time only | 11 batch actions: sync, translate, OCR fixes, common fixes, remove HI, remove tags, fix uppercase, reverse RTL, scan disk, search missing, upgrade (up to 10k items) | +| **Dedicated Translator Settings** | Not available | 4-zone page with pricing, cost estimates, status panel | +| **No Tracking** | GA4 + legacy UA phone home to Google | All telemetry removed, nothing phones home | +| **Security Hardening** | MD5, no CSRF/SSRF/rate limiting | PBKDF2 (600k iter), CSRF, SSRF, brute-force, 4 more | +| **Subtitle Viewer** | Not available | Read-only subtitle preview with SRT/VTT/ASS parsing, cue table, and format detection | +| **Audio Language Display** | Not shown in tables | Badges in all table views | +| **Advanced Table Filters** | No filters | Include/exclude audio, missing subtitle, title search | +| **Floating Save + Ctrl+S** | Not available | Sticky save button with 3-option unsaved changes modal | +| **Navy + Amber Theme** | Purple | `#121125` navy to `#fff8e1` cream, amber accents | +| OpenSubtitles.com (API) | Available | Available | +| Docker images | linuxserver.io / hotio | ghcr.io/lavx (self-built, multi-arch) | +| Python runtime | 3.8-3.13 | 3.14 | + +--- + +## Quick Start + +### Option 1: Docker Compose (Recommended) + +```bash +# Clone with the scraper submodule +git clone --recursive https://github.com/LavX/bazarr.git +cd bazarr + +# Configure your media paths in docker-compose.yml, then: +docker compose up -d + +# Access Bazarr at http://localhost:6767 +``` + +### Option 2: Pull Pre-built Images + +```bash +# Pull all images +docker pull ghcr.io/lavx/bazarr:latest +docker pull ghcr.io/lavx/opensubtitles-scraper:latest +docker pull ghcr.io/lavx/ai-subtitle-translator:latest +``` + +--- + +