Personal fork of Dictionarry-Hub/database (branch v2) that keeps every upstream quality profile as-is and adds a German-language sibling for each one.
So upstream's 1080p Efficient stays exactly as upstream ships it, and a new 1080p Efficient german lives alongside it with:
languageset to must German instead ofmust Original.- A
Not Germancustom format scored-999999— this is what actually forces German (see below). Any release without a German audio track drops below the profile'sminimum_custom_format_scoreand is rejected. - The
German DLcustom format re-scored from-999999to+5000, so German dual-language releases are not only allowed but nudged above the floor. Not Original or Englishre-scored from-999999to0, so German dubs aren't rejected for lacking the original/English track.Banned Language GroupsandBanned Dual Audio Groupsre-scored from-999999to0— those upstream bans target dual/foreign audio, which is exactly what a German profile wants. (Banned Groups (Release Title)is left enforcing, since it bans for quality/scene reasons.)- Every other custom-format score, quality tier, tag and upgrade rule copied verbatim from the upstream profile.
The variants are produced by a single SQL migration file (ops/99999999.create-german-variants.sql). The migration is idempotent (WHERE NOT EXISTS guards everywhere), so replaying it against an existing database is a no-op.
The profile's must German language field is only enforced by Radarr — Sonarr treats it as advisory and will happily grab non-German releases. Upstream sidesteps this for original/English by using the Not Original or English custom format at -999999 (anything matching falls under minimum_custom_format_score and is rejected in both arrs). Because our fork neutralises that CF to 0, it adds the mirror image — Not German at -999999 — so non-German releases are rejected in Radarr and Sonarr. German and German-DL releases contain a German track, don't match, and pass untouched.
Note: this is deliberately strict. A release that Sonarr can't confirm as German (e.g. detected as
Unknown) is also rejected — the same tradeoff upstream accepts for original/English.
A scheduled GitHub Actions workflow (.github/workflows/sync-upstream.yml) runs every night at 03:17 UTC and:
- Adds the upstream as a git remote.
- Fetches and merges
upstream/v2into ourv2(with-X ours, so any upstream change that conflicts with our customisations is resolved in favour of our state — most relevant for the deletion of upstream's own workflow files). - Re-deletes
.github/workflows/notify.ymland.github/workflows/devSync.ymlif the merge somehow brought them back. - Pushes the merged result back to
origin/v2.
You can also trigger it manually from the Actions tab via Run workflow.
Two upstream workflows are unwanted in this fork:
| Workflow | Why it's stripped |
|---|---|
.github/workflows/notify.yml |
Pings upstream's Dictionarry-Hub/parrot notifier on every push — irrelevant here. |
.github/workflows/devSync.yml |
Syncs upstream's internal dev branch from stable — meaningless for us. |
They are removed in our v2 branch, and the nightly sync re-strips them if they ever come back. As an extra safety net, GitHub disables Actions in newly-created forks by default — only sync-upstream.yml needs to be explicitly enabled.
The behaviour of the German variants is determined entirely by ops/99999999.create-german-variants.sql. To change the policy, edit that single file and commit — for example:
- Loosen the language gate: lower the
Not Germanscore (step 10b) from-999999, or drop the block entirely to fall back to the (Radarr-only)must Germanfield. - Tune the
German DLreward: change the+5000in the step 9CASE. - Re-ban a group set: remove
Banned Language Groups/Banned Dual Audio Groupsfrom the step 9CASEso they keep their upstream-999999. - Switch language type from
musttosimplein step 8.
Everything good here is upstream's work. This fork is just a thin language-localisation layer on top of Dictionarry.