Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 19 additions & 20 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
---
name: Documentation Issue Report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the Issue**
A clear and concise description of where in the docs you are seeing an issue.

**The Docs Page**
What page are you seeing something that is incorrect?

**Suggested Correction**
Do you have a suggestion on how we can correct it?

**Additional context**
Add any other context about the problem here.
---
name: Documentation Issue Report
about: Create a report to help us improve
title: ""
labels: ""
assignees: ""
---

**Describe the Issue**
A clear and concise description of where in the docs you are seeing an issue.

**The Docs Page**
What page are you seeing something that is incorrect?

**Suggested Correction**
Do you have a suggestion on how we can correct it?

**Additional context**
Add any other context about the problem here.
16 changes: 8 additions & 8 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 🚀 Feature Requests
url: https://features.maintainerr.info
about: Please share and vote on feature ideas here.
- name: 🙋 Discord Support
url: https://discord.maintainerr.info
about: Join our Discord community to ask questions and get help.
blank_issues_enabled: false
contact_links:
- name: 🚀 Feature Requests
url: https://features.maintainerr.info
about: Please share and vote on feature ideas here.
- name: 🙋 Discord Support
url: https://discord.maintainerr.info
about: Join our Discord community to ask questions and get help.
16 changes: 16 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
groups:
docusaurus:
patterns:
- "@docusaurus/*"
- "@easyops-cn/docusaurus-search-local"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
47 changes: 47 additions & 0 deletions .github/workflows/dependabot_merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Dependabot auto-merge
on: pull_request_target

# Least privilege: every write (approve + merge) is performed with the
# GitHub App token below, so the workflow's own GITHUB_TOKEN stays read-only.
permissions:
contents: read
pull-requests: read

jobs:
dependabot:
runs-on: ubuntu-latest
if: ${{ github.actor == 'dependabot[bot]' }}
steps:
- name: Create GitHub App token
id: app-token
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.DOCS_APP_ID }}
private-key: ${{ secrets.DOCS_APP_KEY }}

- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v3.1.0
with:
github-token: "${{ steps.app-token.outputs.token }}"
skip-commit-verification: true

- name: Approve PR + merge after required checks pass
if: ${{ steps.metadata.outputs.update-type != 'version-update:semver-major' }}
run: |
set -euo pipefail
review_decision=$(gh pr view "$PR_URL" --json reviewDecision -q .reviewDecision)
if [ "$review_decision" != "APPROVED" ]; then
gh pr review --approve "$PR_URL"
else
echo "PR already approved."
fi

echo "Waiting for required checks to complete successfully..."
gh pr checks "$PR_URL" --required --watch

echo "Required checks passed. Merging..."
gh pr merge --admin --squash "$PR_URL"
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
11 changes: 7 additions & 4 deletions .github/workflows/docusaurus_ci.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
name: Docusaurus Deploy

on:
push:
branches:
- main
repository_dispatch:
types: [maintainerr-release]
workflow_dispatch:
inputs:
versionInput:
description: 'Input version from Maintainerr release'
description: "Input version from Maintainerr release"
required: false

permissions:
Expand Down Expand Up @@ -39,7 +42,7 @@ jobs:
echo "email=${user_id}+${APP_SLUG}[bot]@users.noreply.github.com" >> "$GITHUB_OUTPUT"

- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.ref || github.ref }}
Expand Down Expand Up @@ -70,9 +73,9 @@ jobs:
fi

- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v6
with:
node-version: 20
node-version: 24
cache: npm

- name: Install dependencies
Expand Down
32 changes: 32 additions & 0 deletions .github/workflows/pr_build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: PR Build

on:
pull_request:
branches:
- main

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Build Docusaurus site
run: npm run build
33 changes: 33 additions & 0 deletions .github/workflows/quality.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Code quality checks

on:
pull_request:
branches:
- main

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
formatting:
name: Formatting
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Check formatting
run: npm run format:check
16 changes: 16 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Build output & generated artifacts
build/
.docusaurus/
node_modules/

# Lockfile (managed by npm)
package-lock.json

# Frozen documentation snapshots — created by `docusaurus docs:version`.
# These mirror past releases and should stay byte-stable, so we don't reformat them.
versioned_docs/
versioned_sidebars/

# Vendored / generated assets we don't own
static/assets/
static/openapi-spec/
5 changes: 5 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"proseWrap": "preserve",
"singleQuote": false,
"trailingComma": "all"
}
26 changes: 13 additions & 13 deletions blog/posts/Tutorial_S01E01.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ Let's take the above movie as an example. This isn't a real movie, but for the p

**Plex**

| Added | Last Viewed | Times Viewed | Audience Rating |
| -------|-------------|--------------|---------------- |
| 3Nov2023 | 10Jan2024 | 4 | 7.3 |
| Added | Last Viewed | Times Viewed | Audience Rating |
| -------- | ----------- | ------------ | --------------- |
| 3Nov2023 | 10Jan2024 | 4 | 7.3 |

**Overseerr**

| Requested by | Requested Date | Times Requested by Anyone |
| ------------ | -------------- | ------------------------- |
| user_girl123 | 2Nov2023 | 4 |
| user_girl123 | 2Nov2023 | 4 |

**Radarr**

| Release Date | Is Monitored | Runtime |
| ------------ | ------------ | ------- |
| 31Oct2023 | True | 114 minutes |
| Release Date | Is Monitored | Runtime |
| ------------ | ------------ | ----------- |
| 31Oct2023 | True | 114 minutes |

:::tip
This information can be looked at for an actual item in your Plex library. You can do it through the Plex UI or you can parse through the XML of an item.
Expand Down Expand Up @@ -90,7 +90,7 @@ Now we are getting into the details. After the settings above have been configur
Community rules are just that, from the community. They may not work like they say they do. They may not be formatted properly. It can be a nice place to start, but I personally wouldn't rely on them as everyone's situation is different.
:::

Below the *Community* button there are two other buttons: Import and Export. You can import a rule from a txt file in YAML format. This is an advanced method, but it is an option.
Below the _Community_ button there are two other buttons: Import and Export. You can import a rule from a txt file in YAML format. This is an advanced method, but it is an option.

:::tip
If you want to go down this path, I would choose one of the Community rules, it doesn't really matter which one, and then use the export button. You will get a generated YAML format of the rule. If you are familiar with YAML this will be a good place to start.
Expand All @@ -106,7 +106,7 @@ If you are looking at a rule that you have already created, you can export the r

Understanding rules and sections can be crucial to getting your rule setup properly and achieving your desired outcome.

When you first start, you will be in the first *section*: Section 1, Rule 1. A section is a grouped set of rules with one output over the whole section, depending on what was matched in the rules within that section.
When you first start, you will be in the first _section_: Section 1, Rule 1. A section is a grouped set of rules with one output over the whole section, depending on what was matched in the rules within that section.

### AND

Expand All @@ -116,7 +116,7 @@ So let's try an **AND** example.
- Our rule 2 setup gains us output X.
- Our rule 2 is set up with an AND operator to rule 1.
- The output of this section would be X only.
Since X was matched by rule 1 AND rule 2 but Y was only matched by rule 1, it will not be included in the section output because we said we want the output of the *section* to be everything that matched **(rule 1 AND rule 2)**.
Since X was matched by rule 1 AND rule 2 but Y was only matched by rule 1, it will not be included in the section output because we said we want the output of the _section_ to be everything that matched **(rule 1 AND rule 2)**.

### OR

Expand All @@ -126,7 +126,7 @@ Now an **OR** example.
- Our rule 2 setup gains us output X and output Z.
- Our rule 2 is set up with an OR operator to rule 1.
- The output of this section would be X, Y, and Z.
Since X and Y were matched by rule 1, and X and Z were matched by rule 2, they are all included because we said we want the output of the *section* to be everything that matched **(rule 1 OR rule 2)**.
Since X and Y were matched by rule 1, and X and Z were matched by rule 2, they are all included because we said we want the output of the _section_ to be everything that matched **(rule 1 OR rule 2)**.

This is probably the simplest form of a rule setup that you can get, unless of course you are only using one rule because anything matched by that one rule becomes the output.

Expand All @@ -140,8 +140,8 @@ Now let's try a mixed **AND** / **OR** example.
- The output is X, as before.
- Rule 3 setup gains us output G and output M.
- Rule 3 is set up with an OR operator to rule 2.
- The output of the whole *section* would be X, G, and M.
Since X was matched by rule 1 AND rule 2 but Y was only matched by rule 1, the output of rule 2 will be only X. Since G and M were matched by rule 3, and we said we want the output of the *section* to be anything that matches **((rule 1 AND 2) OR rule 3)**, we get X, G, and M.
- The output of the whole _section_ would be X, G, and M.
Since X was matched by rule 1 AND rule 2 but Y was only matched by rule 1, the output of rule 2 will be only X. Since G and M were matched by rule 3, and we said we want the output of the _section_ to be anything that matches **((rule 1 AND 2) OR rule 3)**, we get X, G, and M.

---

Expand Down
30 changes: 15 additions & 15 deletions blog/posts/Tutorial_S01E02.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,21 @@ This movie has the following attributes across Plex, Overseerr, and Radarr:

**Plex**

| Added | Last Viewed | Times Viewed | Audience Rating |
| -------|-------------|--------------|---------------- |
| 3Nov2023 | 10Jan2024 | 4 | 7.3 |
| Added | Last Viewed | Times Viewed | Audience Rating |
| -------- | ----------- | ------------ | --------------- |
| 3Nov2023 | 10Jan2024 | 4 | 7.3 |

**Overseerr**

| Requested by | Requested Date | Times Requested by Anyone |
| ------------ | -------------- | ------------------------- |
| user_girl123 | 2Nov2023 | 4 |
| user_girl123 | 2Nov2023 | 4 |

**Radarr**

| Release Date | Is Monitored | Runtime |
| ------------ | ------------ | ------- |
| 31Oct2023 | True | 114 minutes |
| Release Date | Is Monitored | Runtime |
| ------------ | ------------ | ----------- |
| 31Oct2023 | True | 114 minutes |

With this information, we have quite a few options that we can use as rule parameters and filters.

Expand All @@ -46,23 +46,23 @@ With this information, we have quite a few options that we can use as rule param
- 1: We can use one rule that states `Plex-Date Added` `before` `amount of days` `60`.
- This will match in our special tutorial scenario because the day the Movie was added to Plex happened 60 days or more "before" today's date.
- 2: We could use a rule that states `Plex-Times Viewed` `bigger` `number` `3`.
- This would get added because it has a *Times Viewed* value of 4, which is bigger than 3.
- This would get added because it has a _Times Viewed_ value of 4, which is bigger than 3.
- 3: We could also use a rule that states `Plex-Audience Rating (scale 1-10)` `bigger` `number` `5`.
- This rule would catch our movie because its *Audience Rating* is 7.3, which is bigger than 5.
- This rule would catch our movie because its _Audience Rating_ is 7.3, which is bigger than 5.

## Simple AND

- 1: We could add Rule 1 that states `Plex-Date Added` `before` `amount of days` `60`. Rule 2 then states AND `Plex-Times Viewed` `bigger` `number` `5`.
- This would not catch our movie because it has a *Times Viewed* value of 4 and we need it to match **(rule 1 AND rule 2)**. It does match rule 1 but it does not match rule 2. If another movie in the library was added 60 days ago or more **AND** it had a view count of more than 5, it **would** get added to this rule.
- This would not catch our movie because it has a _Times Viewed_ value of 4 and we need it to match **(rule 1 AND rule 2)**. It does match rule 1 but it does not match rule 2. If another movie in the library was added 60 days ago or more **AND** it had a view count of more than 5, it **would** get added to this rule.

**Let's try one more.**

- 2: Rule 1 states `Plex-Times Viewed` `bigger` `number` `3`. Rule 2 states AND `Overseerr-Amount of Requests` `equals` `Plex-Times Viewed`.
- This rule set **would** add our movie because its *Times Viewed* amount is 4, which is bigger than 3, **AND** the *Amount of Requests* from Overseerr equals the *Times Viewed* amount from Plex: **(Rule 1 AND Rule 2)**.
- This rule set **would** add our movie because its _Times Viewed_ amount is 4, which is bigger than 3, **AND** the _Amount of Requests_ from Overseerr equals the _Times Viewed_ amount from Plex: **(Rule 1 AND Rule 2)**.

Those are some fairly simple AND examples, and hopefully it is starting to become obvious what is going on. Within a *section*, and only using AND operators, each item also needs to match the rule before it to be counted as a match and added to the collection.
Those are some fairly simple AND examples, and hopefully it is starting to become obvious what is going on. Within a _section_, and only using AND operators, each item also needs to match the rule before it to be counted as a match and added to the collection.

Another way to look at these examples is that within a *section*, each rule is making a list. The next rule is checking that list to see if anything also has that value, plus the value of its own rule.
Another way to look at these examples is that within a _section_, each rule is making a list. The next rule is checking that list to see if anything also has that value, plus the value of its own rule.

### Visual Example

Expand All @@ -79,10 +79,10 @@ title:>Rule-set: Rule1 AND Rule2]
We don't have to go too far in depth with this because of what we have already learned. We will just give a quick example, then a visual.

- 1: We can use one rule that states `Plex-Date Added` `before` `amount of days` `90`.
- This will not match in our special tutorial scenario because the day the Movie was added to Plex happened only *60* days before today's date. Not quite *90* days yet.
- This will not match in our special tutorial scenario because the day the Movie was added to Plex happened only _60_ days before today's date. Not quite _90_ days yet.
- 2: Our next rule states OR `Overseerr-Requested by user (Plex or local username)` `Contains (Partial list match)` `text` `user_girl123`.
- This would match because, as we can see, that is who requested the movie.
- 3: This rule set **would** add our movie because it meets one **OR** the other of our criteria. It was added *60* days ago so it does not meet our criteria of *before 90 days*, but it did match the Overseerr requested-by-user rule. It gets added because we said we wanted **(Rule 1 OR Rule 2)**.
- 3: This rule set **would** add our movie because it meets one **OR** the other of our criteria. It was added _60_ days ago so it does not meet our criteria of _before 90 days_, but it did match the Overseerr requested-by-user rule. It gets added because we said we wanted **(Rule 1 OR Rule 2)**.

Now let's get a visual.

Expand Down
Loading