Merge branch 'develop' of https://github.com/sct/overseerr into jellyfin-support
@@ -312,6 +312,233 @@
|
|||||||
"contributions": [
|
"contributions": [
|
||||||
"code"
|
"code"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "NuroDev",
|
||||||
|
"name": "nuro",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/4991309?v=4",
|
||||||
|
"profile": "https://nuro.dev",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "onedr0p",
|
||||||
|
"name": "ᗪєνιη ᗷυнʟ",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/213795?v=4",
|
||||||
|
"profile": "https://github.com/onedr0p",
|
||||||
|
"contributions": [
|
||||||
|
"infra"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "JonnyWong16",
|
||||||
|
"name": "JonnyWong16",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/9099342?v=4",
|
||||||
|
"profile": "https://github.com/JonnyWong16",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Roxedus",
|
||||||
|
"name": "Roxedus",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/7110194?v=4",
|
||||||
|
"profile": "https://github.com/Roxedus",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "WoisWoi",
|
||||||
|
"name": "WoisWoi",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/75491231?v=4",
|
||||||
|
"profile": "https://github.com/WoisWoi",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "HubDuck",
|
||||||
|
"name": "HubDuck",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/77843475?v=4",
|
||||||
|
"profile": "https://github.com/HubDuck",
|
||||||
|
"contributions": [
|
||||||
|
"translation",
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "costaht",
|
||||||
|
"name": "costaht",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/50637431?v=4",
|
||||||
|
"profile": "https://github.com/costaht",
|
||||||
|
"contributions": [
|
||||||
|
"doc",
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Shjosan",
|
||||||
|
"name": "Shjosan",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/20847626?v=4",
|
||||||
|
"profile": "https://github.com/Shjosan",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "kobaubarr",
|
||||||
|
"name": "kobaubarr",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/28481522?v=4",
|
||||||
|
"profile": "https://github.com/kobaubarr",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "notorius28",
|
||||||
|
"name": "Ricardo González",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/1621513?v=4",
|
||||||
|
"profile": "https://github.com/notorius28",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Torkiliuz",
|
||||||
|
"name": "Torkil",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/460764?v=4",
|
||||||
|
"profile": "http://torkili.uz",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "JagandeepBrar",
|
||||||
|
"name": "Jagandeep Brar",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/3048295?v=4",
|
||||||
|
"profile": "https://www.jagandeepbrar.io",
|
||||||
|
"contributions": [
|
||||||
|
"doc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "dtalens",
|
||||||
|
"name": "dtalens",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/6631832?v=4",
|
||||||
|
"profile": "http://dtalens.com",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "acortelyou",
|
||||||
|
"name": "Alex Cortelyou",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/1689668?v=4",
|
||||||
|
"profile": "https://github.com/acortelyou",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "jonocairns",
|
||||||
|
"name": "Jono Cairns",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/182836?v=4",
|
||||||
|
"profile": "https://nz.linkedin.com/in/jonocairns",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "DJScias",
|
||||||
|
"name": "DJScias",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/439655?v=4",
|
||||||
|
"profile": "https://scias.net/",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Dabu-dot",
|
||||||
|
"name": "Dabu-dot",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/52525576?v=4",
|
||||||
|
"profile": "https://github.com/Dabu-dot",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Jabster28",
|
||||||
|
"name": "Jabster28",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/29015942?v=4",
|
||||||
|
"profile": "https://github.com/Jabster28",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "littlerooster",
|
||||||
|
"name": "littlerooster",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/83890654?v=4",
|
||||||
|
"profile": "https://github.com/littlerooster",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "dphildebrandt",
|
||||||
|
"name": "Dustin Hildebrandt",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/154459?v=4",
|
||||||
|
"profile": "https://github.com/dphildebrandt",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "Generator",
|
||||||
|
"name": "Bruno Guerreiro",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/44146?v=4",
|
||||||
|
"profile": "https://github.com/Generator",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "iceHtwoO",
|
||||||
|
"name": "Alexander Neuhäuser",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/27020492?v=4",
|
||||||
|
"profile": "https://github.com/iceHtwoO",
|
||||||
|
"contributions": [
|
||||||
|
"translation"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "liviokanone",
|
||||||
|
"name": "Livio",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/37431541?v=4",
|
||||||
|
"profile": "http://www.unext.co.jp",
|
||||||
|
"contributions": [
|
||||||
|
"design"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "tangentThought",
|
||||||
|
"name": "tangentThought",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/25516090?v=4",
|
||||||
|
"profile": "https://github.com/tangentThought",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"login": "nicospz",
|
||||||
|
"name": "Nicolás Espinoza",
|
||||||
|
"avatar_url": "https://avatars.githubusercontent.com/u/31373060?v=4",
|
||||||
|
"profile": "https://github.com/nicospz",
|
||||||
|
"contributions": [
|
||||||
|
"code"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",
|
"badgeTemplate": "<a href=\"#contributors-\"><img alt=\"All Contributors\" src=\"https://img.shields.io/badge/all_contributors-<%= contributors.length %>-orange.svg\"/></a>",
|
||||||
|
|||||||
@@ -8,16 +8,20 @@
|
|||||||
.git
|
.git
|
||||||
.gitbook.yaml
|
.gitbook.yaml
|
||||||
.gitconfig
|
.gitconfig
|
||||||
.gitignore
|
|
||||||
.github
|
.github
|
||||||
|
.gitignore
|
||||||
.next
|
.next
|
||||||
.prettierignore
|
.prettierignore
|
||||||
config/db/db.sqlite3
|
config/db/*
|
||||||
config/db/logs/overseerr.log
|
config/logs/*
|
||||||
|
config/*.json
|
||||||
|
dist
|
||||||
Dockerfile*
|
Dockerfile*
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
docs
|
docs
|
||||||
LICENSE
|
LICENSE
|
||||||
node_modules
|
node_modules
|
||||||
|
public/os_logo_filled.png
|
||||||
|
public/preview.jpg
|
||||||
snap
|
snap
|
||||||
stylelint.config.js
|
stylelint.config.js
|
||||||
|
|||||||
@@ -4,12 +4,10 @@ module.exports = {
|
|||||||
extends: [
|
extends: [
|
||||||
'eslint:recommended',
|
'eslint:recommended',
|
||||||
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
|
'plugin:@typescript-eslint/recommended', // Uses the recommended rules from the @typescript-eslint/eslint-plugin
|
||||||
'prettier/@typescript-eslint', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
|
|
||||||
'plugin:prettier/recommended', // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
|
|
||||||
'plugin:jsx-a11y/recommended',
|
'plugin:jsx-a11y/recommended',
|
||||||
'plugin:react/recommended',
|
'plugin:react/recommended',
|
||||||
'plugin:react-hooks/recommended',
|
'plugin:react-hooks/recommended',
|
||||||
'prettier/react',
|
'prettier',
|
||||||
],
|
],
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
ecmaVersion: 6,
|
ecmaVersion: 6,
|
||||||
|
|||||||
26
.gitattributes
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
* text eol=lf
|
||||||
|
|
||||||
|
#
|
||||||
|
## These files are binary and should be left untouched
|
||||||
|
#
|
||||||
|
|
||||||
|
# (binary is a macro for -text -diff)
|
||||||
|
*.png binary
|
||||||
|
*.jpg binary
|
||||||
|
*.jpeg binary
|
||||||
|
*.gif binary
|
||||||
|
*.ico binary
|
||||||
|
*.mov binary
|
||||||
|
*.mp4 binary
|
||||||
|
*.mp3 binary
|
||||||
|
*.flv binary
|
||||||
|
*.fla binary
|
||||||
|
*.swf binary
|
||||||
|
*.gz binary
|
||||||
|
*.zip binary
|
||||||
|
*.7z binary
|
||||||
|
*.ttf binary
|
||||||
|
*.eot binary
|
||||||
|
*.woff binary
|
||||||
|
*.pyc binary
|
||||||
|
*.pdf binary
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
root: ./docs
|
root: ./docs
|
||||||
|
|
||||||
structure:
|
structure:
|
||||||
readme: README.md
|
readme: README.md
|
||||||
summary: SUMMARY.md
|
summary: SUMMARY.md
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Support via Discord
|
- name: Support via Discord
|
||||||
url: https://discord.gg/PkCWJSeCk7
|
url: https://discord.gg/overseerr
|
||||||
about: Chat with users and devs on support and setup related topics.
|
about: Chat with users and devs on support and setup related topics.
|
||||||
- name: Support via GitHub Discussions
|
- name: Support via GitHub Discussions
|
||||||
url: https://github.com/sct/overseerr/discussions
|
url: https://github.com/sct/overseerr/discussions
|
||||||
|
|||||||
50
.github/workflows/ci.yml
vendored
@@ -12,53 +12,55 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
name: Lint & Test Build
|
name: Lint & Test Build
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: node:12.18-alpine
|
container: node:14.17-alpine
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
- name: install dependencies
|
- name: Install dependencies
|
||||||
env:
|
env:
|
||||||
HUSKY_SKIP_INSTALL: 1
|
HUSKY_SKIP_INSTALL: 1
|
||||||
run: yarn
|
run: yarn
|
||||||
- name: lint
|
- name: Lint
|
||||||
run: yarn lint
|
run: yarn lint
|
||||||
- name: build
|
- name: Build
|
||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
build_and_push:
|
build_and_push:
|
||||||
name: Build & Publish to Docker Hub
|
name: Build & Publish Docker Images
|
||||||
needs: test
|
needs: test
|
||||||
if: github.ref == 'refs/heads/develop' && !contains(github.event.head_commit.message, '[skip ci]')
|
if: github.ref == 'refs/heads/develop' && !contains(github.event.head_commit.message, '[skip ci]')
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v1
|
uses: docker/setup-buildx-action@v1.3.0
|
||||||
- name: Cache Docker layers
|
- name: Cache Docker layers
|
||||||
uses: actions/cache@v2.1.4
|
uses: actions/cache@v2.1.6
|
||||||
with:
|
with:
|
||||||
path: /tmp/.buildx-cache
|
path: /tmp/.buildx-cache
|
||||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-buildx-
|
${{ runner.os }}-buildx-
|
||||||
- name: Login to DockerHub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v1.9.0
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_TOKEN }}
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
- name: Login to GitHub Container Registry
|
- name: Log in to GitHub Container Registry
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v1.9.0
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.CR_PAT }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2.5.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: ./Dockerfile
|
file: ./Dockerfile
|
||||||
|
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||||
push: true
|
push: true
|
||||||
build-args: |
|
build-args: |
|
||||||
COMMIT_TAG=${{ github.sha }}
|
COMMIT_TAG=${{ github.sha }}
|
||||||
@@ -68,7 +70,15 @@ jobs:
|
|||||||
ghcr.io/sct/overseerr:develop
|
ghcr.io/sct/overseerr:develop
|
||||||
ghcr.io/sct/overseerr:${{ github.sha }}
|
ghcr.io/sct/overseerr:${{ github.sha }}
|
||||||
cache-from: type=local,src=/tmp/.buildx-cache
|
cache-from: type=local,src=/tmp/.buildx-cache
|
||||||
cache-to: type=local,dest=/tmp/.buildx-cache,mode=max
|
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
|
||||||
|
- # Temporary fix
|
||||||
|
# https://github.com/docker/build-push-action/issues/252
|
||||||
|
# https://github.com/moby/buildkit/issues/1896
|
||||||
|
name: Move cache
|
||||||
|
run: |
|
||||||
|
rm -rf /tmp/.buildx-cache
|
||||||
|
mv /tmp/.buildx-cache-new /tmp/.buildx-cache
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
name: Send Discord Notification
|
name: Send Discord Notification
|
||||||
needs: build_and_push
|
needs: build_and_push
|
||||||
@@ -76,8 +86,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Get Build Job Status
|
- name: Get Build Job Status
|
||||||
uses: technote-space/workflow-conclusion-action@v2.1.2
|
uses: technote-space/workflow-conclusion-action@v2.1.6
|
||||||
|
|
||||||
- name: Combine Job Status
|
- name: Combine Job Status
|
||||||
id: status
|
id: status
|
||||||
run: |
|
run: |
|
||||||
@@ -87,7 +96,6 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Post Status to Discord
|
- name: Post Status to Discord
|
||||||
uses: sarisia/actions-status-discord@v1
|
uses: sarisia/actions-status-discord@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
4
.github/workflows/deploy_docs.yml
vendored
@@ -11,12 +11,12 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Generate Swagger UI
|
- name: Generate Swagger UI
|
||||||
uses: Legion2/swagger-ui-action@v1
|
uses: Legion2/swagger-ui-action@v1.1.2
|
||||||
with:
|
with:
|
||||||
output: swagger-ui
|
output: swagger-ui
|
||||||
spec-file: overseerr-api.yml
|
spec-file: overseerr-api.yml
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
uses: peaceiris/actions-gh-pages@v3.8.0
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
publish_dir: swagger-ui
|
publish_dir: swagger-ui
|
||||||
|
|||||||
2
.github/workflows/invalid_template.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
support:
|
support:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/support-requests@v2
|
- uses: dessant/support-requests@v2.0.1
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
support-label: 'invalid:template-incomplete'
|
support-label: 'invalid:template-incomplete'
|
||||||
|
|||||||
44
.github/workflows/preview.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Overseerr Preview
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'preview-*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_and_push:
|
||||||
|
name: Build & Publish Docker Preview Images
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2.3.4
|
||||||
|
- name: Get the version
|
||||||
|
id: get_version
|
||||||
|
run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/}
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1.3.0
|
||||||
|
- name: Log in to Docker Hub
|
||||||
|
uses: docker/login-action@v1.9.0
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v1.9.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v2.5.0
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
platforms: linux/amd64
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
COMMIT_TAG=${{ github.sha }}
|
||||||
|
tags: |
|
||||||
|
sctx/overseerr:${{ steps.get_version.outputs.VERSION }}
|
||||||
|
ghcr.io/sct/overseerr:${{ steps.get_version.outputs.VERSION }}
|
||||||
54
.github/workflows/release.yml
vendored
@@ -9,31 +9,47 @@ jobs:
|
|||||||
test:
|
test:
|
||||||
name: Lint & Test Build
|
name: Lint & Test Build
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: node:12.18-alpine
|
container: node:14.17-alpine
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
- name: install dependencies
|
- name: Install dependencies
|
||||||
env:
|
env:
|
||||||
HUSKY_SKIP_INSTALL: 1
|
HUSKY_SKIP_INSTALL: 1
|
||||||
run: yarn
|
run: yarn
|
||||||
- name: lint
|
- name: Lint
|
||||||
run: yarn lint
|
run: yarn lint
|
||||||
- name: build
|
- name: Build
|
||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
semantic-release:
|
semantic-release:
|
||||||
name: Tag and release latest version
|
name: Tag and release latest version
|
||||||
needs: test
|
needs: test
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v1
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: 12
|
node-version: 14
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v1.3.0
|
||||||
|
- name: Log in to Docker Hub
|
||||||
|
uses: docker/login-action@v1.9.0
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_TOKEN }}
|
||||||
|
- name: Log in to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v1.9.0
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
run: yarn
|
||||||
- name: Release
|
- name: Release
|
||||||
@@ -42,6 +58,7 @@ jobs:
|
|||||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||||
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
run: npx semantic-release
|
run: npx semantic-release
|
||||||
|
|
||||||
build-snap:
|
build-snap:
|
||||||
name: Build Snap Package (${{ matrix.architecture }})
|
name: Build Snap Package (${{ matrix.architecture }})
|
||||||
needs: semantic-release
|
needs: semantic-release
|
||||||
@@ -55,14 +72,13 @@ jobs:
|
|||||||
- armhf
|
- armhf
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Switch to master branch
|
- name: Switch to master branch
|
||||||
run: git checkout master
|
run: git checkout master
|
||||||
- name: Pull latest changes
|
- name: Pull latest changes
|
||||||
run: git pull
|
run: git pull
|
||||||
|
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
id: prepare
|
id: prepare
|
||||||
run: |
|
run: |
|
||||||
@@ -72,35 +88,31 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo ::set-output name=RELEASE::edge
|
echo ::set-output name=RELEASE::edge
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Set Up QEMU
|
- name: Set Up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde
|
image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde
|
||||||
|
|
||||||
- name: Build Snap Package
|
- name: Build Snap Package
|
||||||
uses: diddlesnaps/snapcraft-multiarch-action@v1
|
uses: diddlesnaps/snapcraft-multiarch-action@v1
|
||||||
id: build
|
id: build
|
||||||
with:
|
with:
|
||||||
architecture: ${{ matrix.architecture }}
|
architecture: ${{ matrix.architecture }}
|
||||||
|
|
||||||
- name: Upload Snap Package
|
- name: Upload Snap Package
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: overseerr-snap-package-${{ matrix.architecture }}
|
name: overseerr-snap-package-${{ matrix.architecture }}
|
||||||
path: ${{ steps.build.outputs.snap }}
|
path: ${{ steps.build.outputs.snap }}
|
||||||
|
|
||||||
- name: Review Snap Package
|
- name: Review Snap Package
|
||||||
uses: diddlesnaps/snapcraft-review-tools-action@v1.2.0
|
uses: diddlesnaps/snapcraft-review-tools-action@v1.3.0
|
||||||
with:
|
with:
|
||||||
snap: ${{ steps.build.outputs.snap }}
|
snap: ${{ steps.build.outputs.snap }}
|
||||||
|
|
||||||
- name: Publish Snap Package
|
- name: Publish Snap Package
|
||||||
uses: snapcore/action-publish@v1
|
uses: snapcore/action-publish@v1
|
||||||
with:
|
with:
|
||||||
store_login: ${{ secrets.SNAP_LOGIN }}
|
store_login: ${{ secrets.SNAP_LOGIN }}
|
||||||
snap: ${{ steps.build.outputs.snap }}
|
snap: ${{ steps.build.outputs.snap }}
|
||||||
release: ${{ steps.prepare.outputs.RELEASE }}
|
release: ${{ steps.prepare.outputs.RELEASE }}
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
name: Send Discord Notification
|
name: Send Discord Notification
|
||||||
needs: semantic-release
|
needs: semantic-release
|
||||||
@@ -108,8 +120,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Get Build Job Status
|
- name: Get Build Job Status
|
||||||
uses: technote-space/workflow-conclusion-action@v2.1.2
|
uses: technote-space/workflow-conclusion-action@v2.1.6
|
||||||
|
|
||||||
- name: Combine Job Status
|
- name: Combine Job Status
|
||||||
id: status
|
id: status
|
||||||
run: |
|
run: |
|
||||||
@@ -119,7 +130,6 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Post Status to Discord
|
- name: Post Status to Discord
|
||||||
uses: sarisia/actions-status-discord@v1
|
uses: sarisia/actions-status-discord@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
36
.github/workflows/snap.yaml
vendored
@@ -2,7 +2,8 @@ name: Publish Snap
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [develop]
|
branches:
|
||||||
|
- develop
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
jobs:
|
jobs:
|
||||||
@@ -11,25 +12,27 @@ jobs:
|
|||||||
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
if: "!contains(github.event.head_commit.message, '[skip ci]')"
|
||||||
steps:
|
steps:
|
||||||
- name: Cancel Previous Runs
|
- name: Cancel Previous Runs
|
||||||
uses: styfle/cancel-workflow-action@0.8.0
|
uses: styfle/cancel-workflow-action@0.9.0
|
||||||
with:
|
with:
|
||||||
access_token: ${{ secrets.GITHUB_TOKEN }}
|
access_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
test:
|
test:
|
||||||
name: Lint & Test Build
|
name: Lint & Test Build
|
||||||
needs: jobs
|
needs: jobs
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
container: node:12.18-alpine
|
container: node:14.17-alpine
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
- name: install dependencies
|
- name: Install dependencies
|
||||||
env:
|
env:
|
||||||
HUSKY_SKIP_INSTALL: 1
|
HUSKY_SKIP_INSTALL: 1
|
||||||
run: yarn
|
run: yarn
|
||||||
- name: lint
|
- name: Lint
|
||||||
run: yarn lint
|
run: yarn lint
|
||||||
- name: build
|
- name: Build
|
||||||
run: yarn build
|
run: yarn build
|
||||||
|
|
||||||
build-snap:
|
build-snap:
|
||||||
name: Build Snap Package (${{ matrix.architecture }})
|
name: Build Snap Package (${{ matrix.architecture }})
|
||||||
needs: test
|
needs: test
|
||||||
@@ -43,8 +46,7 @@ jobs:
|
|||||||
- armhf
|
- armhf
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2.3.4
|
||||||
|
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
id: prepare
|
id: prepare
|
||||||
run: |
|
run: |
|
||||||
@@ -54,35 +56,31 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo ::set-output name=RELEASE::edge
|
echo ::set-output name=RELEASE::edge
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Set Up QEMU
|
- name: Set Up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1.2.0
|
||||||
with:
|
with:
|
||||||
image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde
|
image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde
|
||||||
|
|
||||||
- name: Build Snap Package
|
- name: Build Snap Package
|
||||||
uses: diddlesnaps/snapcraft-multiarch-action@v1
|
uses: diddlesnaps/snapcraft-multiarch-action@v1
|
||||||
id: build
|
id: build
|
||||||
with:
|
with:
|
||||||
architecture: ${{ matrix.architecture }}
|
architecture: ${{ matrix.architecture }}
|
||||||
|
|
||||||
- name: Upload Snap Package
|
- name: Upload Snap Package
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: overseerr-snap-package-${{ matrix.architecture }}
|
name: overseerr-snap-package-${{ matrix.architecture }}
|
||||||
path: ${{ steps.build.outputs.snap }}
|
path: ${{ steps.build.outputs.snap }}
|
||||||
|
|
||||||
- name: Review Snap Package
|
- name: Review Snap Package
|
||||||
uses: diddlesnaps/snapcraft-review-tools-action@v1.2.0
|
uses: diddlesnaps/snapcraft-review-tools-action@v1.3.0
|
||||||
with:
|
with:
|
||||||
snap: ${{ steps.build.outputs.snap }}
|
snap: ${{ steps.build.outputs.snap }}
|
||||||
|
|
||||||
- name: Publish Snap Package
|
- name: Publish Snap Package
|
||||||
uses: snapcore/action-publish@v1
|
uses: snapcore/action-publish@v1
|
||||||
with:
|
with:
|
||||||
store_login: ${{ secrets.SNAP_LOGIN }}
|
store_login: ${{ secrets.SNAP_LOGIN }}
|
||||||
snap: ${{ steps.build.outputs.snap }}
|
snap: ${{ steps.build.outputs.snap }}
|
||||||
release: ${{ steps.prepare.outputs.RELEASE }}
|
release: ${{ steps.prepare.outputs.RELEASE }}
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
name: Send Discord Notification
|
name: Send Discord Notification
|
||||||
needs: build-snap
|
needs: build-snap
|
||||||
@@ -90,8 +88,7 @@ jobs:
|
|||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Get Build Job Status
|
- name: Get Build Job Status
|
||||||
uses: technote-space/workflow-conclusion-action@v2.1.2
|
uses: technote-space/workflow-conclusion-action@v2.1.6
|
||||||
|
|
||||||
- name: Combine Job Status
|
- name: Combine Job Status
|
||||||
id: status
|
id: status
|
||||||
run: |
|
run: |
|
||||||
@@ -101,7 +98,6 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
echo ::set-output name=status::$WORKFLOW_CONCLUSION
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Post Status to Discord
|
- name: Post Status to Discord
|
||||||
uses: sarisia/actions-status-discord@v1
|
uses: sarisia/actions-status-discord@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
7
.github/workflows/support.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
|||||||
support:
|
support:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/support-requests@v2
|
- uses: dessant/support-requests@v2.0.1
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
support-label: 'support'
|
support-label: 'support'
|
||||||
@@ -18,8 +18,9 @@ jobs:
|
|||||||
to be a support request. Please use our support channels
|
to be a support request. Please use our support channels
|
||||||
to get help with Overseerr.
|
to get help with Overseerr.
|
||||||
|
|
||||||
- [Discord](https://discord.gg/PkCWJSeCk7)
|
- [Discord](https://discord.gg/overseerr)
|
||||||
|
|
||||||
- [GitHub Discussions](https://github.com/sct/overseerr/discussions)
|
- [GitHub Discussions](https://github.com/sct/overseerr/discussions)
|
||||||
close-issue: true
|
close-issue: true
|
||||||
lock-issue: false
|
lock-issue: true
|
||||||
issue-lock-reason: 'off-topic'
|
issue-lock-reason: 'off-topic'
|
||||||
|
|||||||
2
.gitignore
vendored
@@ -32,7 +32,7 @@ yarn-error.log*
|
|||||||
.vercel
|
.vercel
|
||||||
|
|
||||||
# database
|
# database
|
||||||
config/db/*.sqlite3
|
config/db/*.sqlite3*
|
||||||
config/settings.json
|
config/settings.json
|
||||||
|
|
||||||
# logs
|
# logs
|
||||||
|
|||||||
9
.vscode/settings.json
vendored
@@ -15,8 +15,9 @@
|
|||||||
"database": "./config/db/db.sqlite3"
|
"database": "./config/db/db.sqlite3"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"i18n-ally.localesPaths": [
|
"i18n-ally.localesPaths": ["src/i18n", "src/i18n/locale"],
|
||||||
"src/i18n",
|
"editor.codeActionsOnSave": {
|
||||||
"src/i18n/locale"
|
"source.organizeImports": true
|
||||||
]
|
},
|
||||||
|
"editor.formatOnSave": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,80 +1,87 @@
|
|||||||
# Contributing to Overseerr
|
# Contributing to Overseerr
|
||||||
|
|
||||||
All help is welcome and greatly appreciated. If you would like to contribute to the project, the instructions below can get you started...
|
All help is welcome and greatly appreciated! If you would like to contribute to the project, the following instructions should get you started...
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
### Tools Required
|
### Tools Required
|
||||||
|
|
||||||
- HTML/Typescript/Javascript editor of choice. ([VSCode](https://code.visualstudio.com/) is recommended. Upon opening the project, a few extensions will be automatically recommended for install.)
|
- HTML/Typescript/Javascript editor
|
||||||
- [NodeJS](https://nodejs.org/en/download/) (Node 12.x.x or higher)
|
- [VSCode](https://code.visualstudio.com/) is recommended. Upon opening the project, a few extensions will be automatically recommended for install.
|
||||||
|
- [NodeJS](https://nodejs.org/en/download/) (Node 14.x or higher)
|
||||||
- [Yarn](https://yarnpkg.com/)
|
- [Yarn](https://yarnpkg.com/)
|
||||||
- [Git](https://git-scm.com/downloads)
|
- [Git](https://git-scm.com/downloads)
|
||||||
|
|
||||||
### Getting Started
|
### Getting Started
|
||||||
|
|
||||||
1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device.
|
1. [Fork](https://help.github.com/articles/fork-a-repo/) the repository to your own GitHub account and [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/YOUR_USERNAME/overseerr.git
|
git clone https://github.com/YOUR_USERNAME/overseerr.git
|
||||||
cd overseerr/
|
cd overseerr/
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Add the remote upstream.
|
2. Add the remote `upstream`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git remote add upstream https://github.com/sct/overseerr.git
|
git remote add upstream https://github.com/sct/overseerr.git
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Create a new branch
|
3. Create a new branch:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git checkout -b BRANCH_NAME develop
|
git checkout -b BRANCH_NAME develop
|
||||||
```
|
```
|
||||||
|
|
||||||
- It is recommended to name the branch something relevant to the feature or fix you are working on.
|
- It is recommended to give your branch a meaningful name, relevant to the feature or fix you are working on.
|
||||||
- An example of this would be `fix-title-cards` or `feature-new-system`.
|
- Good examples:
|
||||||
- Bad examples would be `patch` or `bug`.
|
- `docs-docker`
|
||||||
|
- `feature-new-system`
|
||||||
|
- `fix-title-cards`
|
||||||
|
- Bad examples:
|
||||||
|
- `bug`
|
||||||
|
- `docs`
|
||||||
|
- `feature`
|
||||||
|
- `fix`
|
||||||
|
- `patch`
|
||||||
|
|
||||||
4. Run development environment
|
4. Run the development environment:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn
|
yarn
|
||||||
yarn dev
|
yarn dev
|
||||||
```
|
```
|
||||||
|
|
||||||
- Alternatively you can run using [Docker](https://www.docker.com/) with `docker-compose up -d`. This method does not require installing NodeJS or Yarn on your machine directly.
|
- Alternatively, you can use [Docker](https://www.docker.com/) with `docker-compose up -d`. This method does not require installing NodeJS or Yarn on your machine directly.
|
||||||
|
|
||||||
5. Create your patch and run appropriate tests.
|
5. Create your patch and test your changes.
|
||||||
|
|
||||||
6. Follow the [guidelines](#contributing-code).
|
- Be sure to follow both the [code](#contributing-code) and [UI text](#ui-text-style) guidelines.
|
||||||
|
- Should you need to update your fork, you can do so by rebasing from `upstream`:
|
||||||
7. Should you need to update your fork, you can do so by rebasing from `upstream`:
|
```bash
|
||||||
|
git fetch upstream
|
||||||
```bash
|
git rebase upstream/develop
|
||||||
git fetch upstream
|
git push origin BRANCH_NAME -f
|
||||||
git rebase upstream/develop
|
```
|
||||||
git push origin BRANCH_NAME -f
|
|
||||||
```
|
|
||||||
|
|
||||||
### Contributing Code
|
### Contributing Code
|
||||||
|
|
||||||
- If you are taking on an existing bug or feature ticket, please comment on the [GitHub Issue](https://github.com/sct/overseerr/issues) to avoid multiple people working on the same thing.
|
- If you are taking on an existing bug or feature ticket, please comment on the [issue](https://github.com/sct/overseerr/issues) to avoid multiple people working on the same thing.
|
||||||
- All commits **must** follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
|
- All commits **must** follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
|
||||||
- It is okay if you squash your PR down to be a single commit that fits this standard.
|
- It is okay to squash your pull request down into a single commit that fits this standard.
|
||||||
- PRs with commits not following this standard will not be merged.
|
- Pull requests with commits not following this standard will **not** be merged.
|
||||||
- Please make meaningful commits, or squash them.
|
- Please make meaningful commits, or squash them.
|
||||||
- Always rebase your commit to the latest `develop` branch. Do not merge `develop` into your branch.
|
- Always rebase your commit to the latest `develop` branch. Do **not** merge `develop` into your branch.
|
||||||
- It is your responsibility to keep your branch up to date. It will not be merged unless its rebased off the latest `develop` branch.
|
- It is your responsibility to keep your branch up-to-date. Your work will **not** be merged unless it is rebased off the latest `develop` branch.
|
||||||
- You can create a "draft" pull request early to get feedback on your work.
|
- You can create a "draft" pull request early to get feedback on your work.
|
||||||
- Your code must be formatted correctly or the tests will fail.
|
- Your code **must** be formatted correctly, or the tests will fail.
|
||||||
- We use Prettier to format our codebase. It should automatically run with a `git` hook, but it is recommended to have the Prettier extension installed in your editor and format on save.
|
- We use Prettier to format our code base. It should automatically run with a Git hook, but it is recommended to have the Prettier extension installed in your editor and format on save.
|
||||||
- If you have questions or need help, you can reach out in [GitHub Discussions](https://github.com/sct/overseerr/discussions) or in our [Discord](https://discord.gg/PkCWJSeCk7).
|
- If you have questions or need help, you can reach out via [Discussions](https://github.com/sct/overseerr/discussions) or our [Discord server](https://discord.gg/overseerr).
|
||||||
- Only open pull requests to `develop`. Never `master`. Any PRs opened to `master` will be closed.
|
- Only open pull requests to `develop`, never `master`! Any pull requests opened to `master` will be closed.
|
||||||
|
|
||||||
### UI Text Style
|
### UI Text Style
|
||||||
|
|
||||||
When adding new UI text, please be sure to adhere to the following guidelines:
|
When adding new UI text, please try to adhere to the following guidelines:
|
||||||
|
|
||||||
1. Be concise and clear, and use as few words as possible to make your point.
|
1. Be concise and clear, and use as few words as possible to make your point.
|
||||||
2. Use the Oxford comma where appropriate.
|
2. Use the Oxford comma where appropriate.
|
||||||
@@ -90,7 +97,7 @@ When adding new UI text, please be sure to adhere to the following guidelines:
|
|||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
|
|
||||||
We use [Weblate](https://hosted.weblate.org/engage/overseerr/) for our translations, and your help with localizing Overseerr would be greatly appreciated! If your language is not listed below, please [open a feature request on GitHub](https://github.com/sct/overseerr/issues/new/choose).
|
We use [Weblate](https://hosted.weblate.org/engage/overseerr/) for our translations, and your help with localizing Overseerr would be greatly appreciated! If your language is not listed below, please [open a feature request](https://github.com/sct/overseerr/issues/new/choose).
|
||||||
|
|
||||||
<a href="https://hosted.weblate.org/engage/overseerr/"><img src="https://hosted.weblate.org/widgets/overseerr/-/overseerr-frontend/multi-auto.svg" alt="Translation status" /></a>
|
<a href="https://hosted.weblate.org/engage/overseerr/"><img src="https://hosted.weblate.org/widgets/overseerr/-/overseerr-frontend/multi-auto.svg" alt="Translation status" /></a>
|
||||||
|
|
||||||
|
|||||||
41
Dockerfile
@@ -1,33 +1,46 @@
|
|||||||
FROM node:14.15-alpine AS BUILD_IMAGE
|
FROM node:14.17-alpine AS BUILD_IMAGE
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
ARG TARGETPLATFORM
|
||||||
|
ENV TARGETPLATFORM=${TARGETPLATFORM:-linux/amd64}
|
||||||
|
|
||||||
|
RUN \
|
||||||
|
case "${TARGETPLATFORM}" in \
|
||||||
|
'linux/arm64') apk add --no-cache python make g++ ;; \
|
||||||
|
'linux/arm/v7') apk add --no-cache python make g++ ;; \
|
||||||
|
esac
|
||||||
|
|
||||||
|
COPY package.json yarn.lock ./
|
||||||
|
RUN yarn install --frozen-lockfile --network-timeout 1000000
|
||||||
|
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
ARG COMMIT_TAG
|
ARG COMMIT_TAG
|
||||||
ENV COMMIT_TAG=${COMMIT_TAG}
|
ENV COMMIT_TAG=${COMMIT_TAG}
|
||||||
|
|
||||||
COPY . /app
|
RUN yarn build
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN yarn --frozen-lockfile && \
|
|
||||||
yarn build
|
|
||||||
|
|
||||||
# remove development dependencies
|
# remove development dependencies
|
||||||
RUN yarn install --production --ignore-scripts --prefer-offline
|
RUN yarn install --production --ignore-scripts --prefer-offline
|
||||||
|
|
||||||
RUN rm -rf src && \
|
RUN rm -rf src server
|
||||||
rm -rf server
|
|
||||||
|
|
||||||
RUN touch config/DOCKER
|
RUN touch config/DOCKER
|
||||||
|
|
||||||
RUN echo "{\"commitTag\": \"${COMMIT_TAG}\"}" > committag.json
|
RUN echo "{\"commitTag\": \"${COMMIT_TAG}\"}" > committag.json
|
||||||
|
|
||||||
|
|
||||||
FROM node:14.15-alpine
|
FROM node:14.17-alpine
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata
|
|
||||||
|
|
||||||
# copy from build image
|
|
||||||
COPY --from=BUILD_IMAGE /app /app
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
CMD yarn start
|
RUN apk add --no-cache tzdata tini
|
||||||
|
|
||||||
|
# copy from build image
|
||||||
|
COPY --from=BUILD_IMAGE /app ./
|
||||||
|
|
||||||
|
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||||
|
CMD [ "yarn", "start" ]
|
||||||
|
|
||||||
EXPOSE 5055
|
EXPOSE 5055
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:12.18-alpine
|
FROM node:14.17-alpine
|
||||||
|
|
||||||
COPY . /app
|
COPY . /app
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|||||||
71
README.md
@@ -1,18 +1,18 @@
|
|||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://i.imgur.com/TMoEG7g.png" alt="Overseerr">
|
<img src="./public/logo_full.svg" alt="Overseerr" style="margin: 20px 0;">
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://github.com/sct/overseerr/workflows/Overseerr%20Release/badge.svg?branch=master" alt="Overseerr Release" />
|
<img src="https://github.com/sct/overseerr/workflows/Overseerr%20Release/badge.svg?branch=master" alt="Overseerr Release" />
|
||||||
<img src="https://github.com/sct/overseerr/workflows/Overseerr%20CI/badge.svg" alt="Overseerr CI">
|
<img src="https://github.com/sct/overseerr/workflows/Overseerr%20CI/badge.svg" alt="Overseerr CI">
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://discord.gg/PkCWJSeCk7"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
|
<a href="https://discord.gg/overseerr"><img src="https://img.shields.io/discord/783137440809746482" alt="Discord"></a>
|
||||||
<a href="https://hub.docker.com/r/sctx/overseerr"><img src="https://img.shields.io/docker/pulls/sctx/overseerr" alt="Docker pulls"></a>
|
<a href="https://hub.docker.com/r/sctx/overseerr"><img src="https://img.shields.io/docker/pulls/sctx/overseerr" alt="Docker pulls"></a>
|
||||||
<a href="https://hosted.weblate.org/engage/overseerr/"><img src="https://hosted.weblate.org/widgets/overseerr/-/overseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
<a href="https://hosted.weblate.org/engage/overseerr/"><img src="https://hosted.weblate.org/widgets/overseerr/-/overseerr-frontend/svg-badge.svg" alt="Translation status" /></a>
|
||||||
<a href="https://lgtm.com/projects/g/sct/overseerr/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/sct/overseerr.svg?logo=lgtm&logoWidth=18"/></a>
|
<a href="https://lgtm.com/projects/g/sct/overseerr/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/sct/overseerr.svg?logo=lgtm&logoWidth=18"/></a>
|
||||||
<a href="https://github.com/sct/overseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/sct/overseerr"></a>
|
<a href="https://github.com/sct/overseerr/blob/develop/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/sct/overseerr"></a>
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
||||||
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-33-orange.svg"/></a>
|
<a href="#contributors-"><img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-58-orange.svg"/></a>
|
||||||
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -22,18 +22,14 @@
|
|||||||
|
|
||||||
- Full Plex integration. Authenticate and manage user access with Plex!
|
- Full Plex integration. Authenticate and manage user access with Plex!
|
||||||
- Easy integration with your existing services. Currently, Overseerr supports Sonarr and Radarr. More to come!
|
- Easy integration with your existing services. Currently, Overseerr supports Sonarr and Radarr. More to come!
|
||||||
- Plex library sync, to keep track of the titles which are already available.
|
- Plex library scan, to keep track of the titles which are already available.
|
||||||
- Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface.
|
- Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface.
|
||||||
- Incredibly simple request management UI. Don't dig through the app to simply approve recent requests!
|
- Incredibly simple request management UI. Don't dig through the app to simply approve recent requests!
|
||||||
- Granular permission system.
|
- Granular permission system.
|
||||||
- Support for various notification agents.
|
- Support for various notification agents.
|
||||||
- Mobile-friendly design, for when you need to approve requests on the go!
|
- Mobile-friendly design, for when you need to approve requests on the go!
|
||||||
|
|
||||||
## Planned Features
|
With more features on the way! Check out our [issue tracker](https://github.com/sct/overseerr/issues) to see the features which have already been requested.
|
||||||
|
|
||||||
- Additional notification types.
|
|
||||||
- Issues system. This will allow users to report issues with content on your media server.
|
|
||||||
- And a ton more! Check out our [issue tracker](https://github.com/sct/overseerr/issues) to see the features which have already been requested.
|
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
@@ -41,26 +37,6 @@ Check out our documentation for instructions on how to install and run Overseerr
|
|||||||
|
|
||||||
https://docs.overseerr.dev/getting-started/installation
|
https://docs.overseerr.dev/getting-started/installation
|
||||||
|
|
||||||
## Running Overseerr
|
|
||||||
|
|
||||||
Currently, Overseerr is primarily distributed as Docker images. If you have Docker installed, you can simply run Overseerr with:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker run -d \
|
|
||||||
-e LOG_LEVEL=info \
|
|
||||||
-e TZ=Asia/Tokyo \
|
|
||||||
-p 5055:5055 \
|
|
||||||
-v /path/to/appdata/config:/app/config \
|
|
||||||
--restart unless-stopped \
|
|
||||||
sctx/overseerr
|
|
||||||
```
|
|
||||||
|
|
||||||
After running Overseerr for the first time, configure it by visiting the web UI at http://[address]:5055 and completing the setup steps
|
|
||||||
|
|
||||||
For more information or alternative installation methods, please see the [Overseerr documentation](https://docs.overseerr.dev/getting-started/installation).
|
|
||||||
|
|
||||||
⚠️ Overseerr is currently under very heavy, rapid development and things are likely to break often. We need all the help we can get to find bugs and get them fixed to hit a more stable release. If you would like to help test the bleeding edge, please use the `sctx/overseerr:develop` image instead! ⚠️
|
|
||||||
|
|
||||||
## Preview
|
## Preview
|
||||||
|
|
||||||
<img src="./public/preview.jpg">
|
<img src="./public/preview.jpg">
|
||||||
@@ -68,7 +44,7 @@ For more information or alternative installation methods, please see the [Overse
|
|||||||
## Support
|
## Support
|
||||||
|
|
||||||
- Check out the [Overseerr Documentation](https://docs.overseerr.dev/) before asking for help. Your question might already be in the [FAQ](https://docs.overseerr.dev/support/faq).
|
- Check out the [Overseerr Documentation](https://docs.overseerr.dev/) before asking for help. Your question might already be in the [FAQ](https://docs.overseerr.dev/support/faq).
|
||||||
- You can get support on [Discord](https://discord.gg/PkCWJSeCk7).
|
- You can get support on [Discord](https://discord.gg/overseerr).
|
||||||
- You can ask questions in the Help category of our [GitHub Discussions](https://github.com/sct/overseerr/discussions).
|
- You can ask questions in the Help category of our [GitHub Discussions](https://github.com/sct/overseerr/discussions).
|
||||||
- Bug reports and feature requests can be submitted via [GitHub Issues](https://github.com/sct/overseerr/issues).
|
- Bug reports and feature requests can be submitted via [GitHub Issues](https://github.com/sct/overseerr/issues).
|
||||||
|
|
||||||
@@ -82,7 +58,7 @@ You can also access the API documentation from your local Overseerr install at h
|
|||||||
|
|
||||||
You can ask questions, share ideas, and more in [GitHub Discussions](https://github.com/sct/overseerr/discussions).
|
You can ask questions, share ideas, and more in [GitHub Discussions](https://github.com/sct/overseerr/discussions).
|
||||||
|
|
||||||
If you would like to chat with other members of our growing community, [join the Overseerr Discord server](https://discord.gg/PkCWJSeCk7)!
|
If you would like to chat with other members of our growing community, [join the Overseerr Discord server](https://discord.gg/overseerr)!
|
||||||
|
|
||||||
Our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_CONDUCT.md) applies to all Overseerr community channels.
|
Our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_CONDUCT.md) applies to all Overseerr community channels.
|
||||||
|
|
||||||
@@ -140,6 +116,39 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
|||||||
<td align="center"><a href="https://hmnd.io"><img src="https://avatars.githubusercontent.com/u/12853597?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hmnd" title="Code">💻</a></td>
|
<td align="center"><a href="https://hmnd.io"><img src="https://avatars.githubusercontent.com/u/12853597?v=4?s=100" width="100px;" alt=""/><br /><sub><b>David</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=hmnd" title="Code">💻</a></td>
|
||||||
<td align="center"><a href="https://www.douglas-parker.com"><img src="https://avatars.githubusercontent.com/u/18235822?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Douglas Parker</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=douglasparker" title="Documentation">📖</a></td>
|
<td align="center"><a href="https://www.douglas-parker.com"><img src="https://avatars.githubusercontent.com/u/18235822?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Douglas Parker</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=douglasparker" title="Documentation">📖</a></td>
|
||||||
<td align="center"><a href="https://github.com/dancarter"><img src="https://avatars.githubusercontent.com/u/4387516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Carter</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dancarter" title="Code">💻</a></td>
|
<td align="center"><a href="https://github.com/dancarter"><img src="https://avatars.githubusercontent.com/u/4387516?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Carter</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dancarter" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://nuro.dev"><img src="https://avatars.githubusercontent.com/u/4991309?v=4?s=100" width="100px;" alt=""/><br /><sub><b>nuro</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=NuroDev" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/onedr0p"><img src="https://avatars.githubusercontent.com/u/213795?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ᗪєνιη ᗷυнʟ</b></sub></a><br /><a href="#infra-onedr0p" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/JonnyWong16"><img src="https://avatars.githubusercontent.com/u/9099342?v=4?s=100" width="100px;" alt=""/><br /><sub><b>JonnyWong16</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JonnyWong16" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Roxedus"><img src="https://avatars.githubusercontent.com/u/7110194?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Roxedus</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Roxedus" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/WoisWoi"><img src="https://avatars.githubusercontent.com/u/75491231?v=4?s=100" width="100px;" alt=""/><br /><sub><b>WoisWoi</b></sub></a><br /><a href="#translation-WoisWoi" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/HubDuck"><img src="https://avatars.githubusercontent.com/u/77843475?v=4?s=100" width="100px;" alt=""/><br /><sub><b>HubDuck</b></sub></a><br /><a href="#translation-HubDuck" title="Translation">🌍</a> <a href="https://github.com/sct/overseerr/commits?author=HubDuck" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/costaht"><img src="https://avatars.githubusercontent.com/u/50637431?v=4?s=100" width="100px;" alt=""/><br /><sub><b>costaht</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=costaht" title="Documentation">📖</a> <a href="#translation-costaht" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Shjosan"><img src="https://avatars.githubusercontent.com/u/20847626?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Shjosan</b></sub></a><br /><a href="#translation-Shjosan" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/kobaubarr"><img src="https://avatars.githubusercontent.com/u/28481522?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kobaubarr</b></sub></a><br /><a href="#translation-kobaubarr" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/notorius28"><img src="https://avatars.githubusercontent.com/u/1621513?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ricardo González</b></sub></a><br /><a href="#translation-notorius28" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="http://torkili.uz"><img src="https://avatars.githubusercontent.com/u/460764?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Torkil</b></sub></a><br /><a href="#translation-Torkiliuz" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://www.jagandeepbrar.io"><img src="https://avatars.githubusercontent.com/u/3048295?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jagandeep Brar</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=JagandeepBrar" title="Documentation">📖</a></td>
|
||||||
|
<td align="center"><a href="http://dtalens.com"><img src="https://avatars.githubusercontent.com/u/6631832?v=4?s=100" width="100px;" alt=""/><br /><sub><b>dtalens</b></sub></a><br /><a href="#translation-dtalens" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/acortelyou"><img src="https://avatars.githubusercontent.com/u/1689668?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Cortelyou</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=acortelyou" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://nz.linkedin.com/in/jonocairns"><img src="https://avatars.githubusercontent.com/u/182836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jono Cairns</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=jonocairns" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://scias.net/"><img src="https://avatars.githubusercontent.com/u/439655?v=4?s=100" width="100px;" alt=""/><br /><sub><b>DJScias</b></sub></a><br /><a href="#translation-DJScias" title="Translation">🌍</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/Dabu-dot"><img src="https://avatars.githubusercontent.com/u/52525576?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dabu-dot</b></sub></a><br /><a href="#translation-Dabu-dot" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Jabster28"><img src="https://avatars.githubusercontent.com/u/29015942?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jabster28</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=Jabster28" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/littlerooster"><img src="https://avatars.githubusercontent.com/u/83890654?v=4?s=100" width="100px;" alt=""/><br /><sub><b>littlerooster</b></sub></a><br /><a href="#translation-littlerooster" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/dphildebrandt"><img src="https://avatars.githubusercontent.com/u/154459?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dustin Hildebrandt</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=dphildebrandt" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/Generator"><img src="https://avatars.githubusercontent.com/u/44146?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bruno Guerreiro</b></sub></a><br /><a href="#translation-Generator" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/iceHtwoO"><img src="https://avatars.githubusercontent.com/u/27020492?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexander Neuhäuser</b></sub></a><br /><a href="#translation-iceHtwoO" title="Translation">🌍</a></td>
|
||||||
|
<td align="center"><a href="http://www.unext.co.jp"><img src="https://avatars.githubusercontent.com/u/37431541?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Livio</b></sub></a><br /><a href="#design-liviokanone" title="Design">🎨</a></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="center"><a href="https://github.com/tangentThought"><img src="https://avatars.githubusercontent.com/u/25516090?v=4?s=100" width="100px;" alt=""/><br /><sub><b>tangentThought</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=tangentThought" title="Code">💻</a></td>
|
||||||
|
<td align="center"><a href="https://github.com/nicospz"><img src="https://avatars.githubusercontent.com/u/31373060?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolás Espinoza</b></sub></a><br /><a href="https://github.com/sct/overseerr/commits?author=nicospz" title="Code">💻</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|||||||
@@ -8,15 +8,26 @@
|
|||||||
|
|
||||||
## Using Overseerr
|
## Using Overseerr
|
||||||
|
|
||||||
|
- [Settings](using-overseerr/settings/README.md)
|
||||||
|
- [Users](using-overseerr/users/README.md)
|
||||||
- [Notifications](using-overseerr/notifications/README.md)
|
- [Notifications](using-overseerr/notifications/README.md)
|
||||||
- [Custom Webhooks](using-overseerr/notifications/webhooks.md)
|
- [Email](using-overseerr/notifications/email.md)
|
||||||
|
- [Web Push](using-overseerr/notifications/webpush.md)
|
||||||
|
- [Discord](using-overseerr/notifications/discord.md)
|
||||||
|
- [LunaSea](using-overseerr/notifications/lunasea.md)
|
||||||
|
- [Pushbullet](using-overseerr/notifications/pushbullet.md)
|
||||||
|
- [Pushover](using-overseerr/notifications/pushover.md)
|
||||||
|
- [Slack](using-overseerr/notifications/slack.md)
|
||||||
|
- [Telegram](using-overseerr/notifications/telegram.md)
|
||||||
|
- [Webhook](using-overseerr/notifications/webhooks.md)
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
- [Frequently Asked Questions (FAQ)](support/faq.md)
|
- [Frequently Asked Questions (FAQ)](support/faq.md)
|
||||||
- [Asking for Support](support/asking-for-support.md)
|
- [Need Help?](support/need-help.md)
|
||||||
|
|
||||||
## Extending Overseerr
|
## Extending Overseerr
|
||||||
|
|
||||||
- [Reverse Proxy Examples](extending-overseerr/reverse-proxy-examples.md)
|
- [Reverse Proxy](extending-overseerr/reverse-proxy.md)
|
||||||
- [Fail2ban Filter](extending-overseerr/fail2ban.md)
|
- [Fail2ban](extending-overseerr/fail2ban.md)
|
||||||
|
- [Third-Party Integrations](extending-overseerr/third-party.md)
|
||||||
|
|||||||
@@ -1,125 +0,0 @@
|
|||||||
# Reverse Proxy Examples
|
|
||||||
|
|
||||||
{% hint style="warning" %}
|
|
||||||
Base URLs cannot be configured in Overseerr. With this limitation, only subdomain configurations are supported.
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
## [SWAG (Secure Web Application Gateway, formerly known as `letsencrypt`)](https://github.com/linuxserver/docker-swag)
|
|
||||||
|
|
||||||
A sample proxy configuration is included in SWAG. However, this page is still the only source of truth, so the SWAG sample configuration is not guaranteed to be up-to-date. If you find an inconsistency, please [report it to the LinuxServer team](https://github.com/linuxserver/reverse-proxy-confs/issues/new) or [submit a pull request to update it](https://github.com/linuxserver/reverse-proxy-confs/pulls).
|
|
||||||
|
|
||||||
To use the bundled configuration file, simply rename `overseerr.subdomain.conf.sample` in the `proxy-confs` folder to `overseerr.subdomain.conf`. Alternatively, create a new file `overseerr.subdomain.conf` in `proxy-confs` with the following configuration:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
|
|
||||||
server_name overseerr.*;
|
|
||||||
|
|
||||||
include /config/nginx/ssl.conf;
|
|
||||||
|
|
||||||
client_max_body_size 0;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
|
|
||||||
include /config/nginx/proxy.conf;
|
|
||||||
resolver 127.0.0.11 valid=30s;
|
|
||||||
set $upstream_app overseerr;
|
|
||||||
set $upstream_port 5055;
|
|
||||||
set $upstream_proto http;
|
|
||||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Traefik \(v2\)
|
|
||||||
|
|
||||||
Add the following labels to the Overseerr service in your `docker-compose.yml` file:
|
|
||||||
|
|
||||||
```text
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
## HTTP Routers
|
|
||||||
- "traefik.http.routers.overseerr-rtr.entrypoints=https"
|
|
||||||
- "traefik.http.routers.overseerr-rtr.rule=Host(`overseerr.domain.com`)"
|
|
||||||
- "traefik.http.routers.overseerr-rtr.tls=true"
|
|
||||||
## HTTP Services
|
|
||||||
- "traefik.http.routers.overseerr-rtr.service=overseerr-svc"
|
|
||||||
- "traefik.http.services.overseerr-svc.loadbalancer.server.port=5055"
|
|
||||||
```
|
|
||||||
|
|
||||||
For more information, see the Traefik documentation for a [basic example](https://doc.traefik.io/traefik/user-guides/docker-compose/basic-example/).
|
|
||||||
|
|
||||||
## `nginx`
|
|
||||||
|
|
||||||
Add the following configuration to a new file `/etc/nginx/sites-available/overseerr.example.com.conf`:
|
|
||||||
|
|
||||||
```text
|
|
||||||
server {
|
|
||||||
listen 80;
|
|
||||||
server_name overseerr.example.com;
|
|
||||||
return 301 https://$server_name$request_uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
server_name overseerr.example.com;
|
|
||||||
|
|
||||||
ssl_certificate /etc/letsencrypt/live/overseerr.example.com/fullchain.pem;
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/overseerr.example.com/privkey.pem;
|
|
||||||
|
|
||||||
proxy_set_header Referer $http_referer;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Real-Port $remote_port;
|
|
||||||
proxy_set_header X-Forwarded-Host $host:$remote_port;
|
|
||||||
proxy_set_header X-Forwarded-Server $host;
|
|
||||||
proxy_set_header X-Forwarded-Port $remote_port;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header X-Forwarded-Ssl on;
|
|
||||||
real_ip_header CF-Connecting-IP;
|
|
||||||
# Control the behavior of the Referer header (Referrer-Policy)
|
|
||||||
add_header Referrer-Policy "no-referrer";
|
|
||||||
# HTTP Strict Transport Security
|
|
||||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
|
|
||||||
# Reduce XSS risks (Content-Security-Policy) - uncomment to use and add URLs whenever necessary
|
|
||||||
# add_header Content-Security-Policy "default-src 'self'; connect-src 'self' https://plex.tv; style-src 'self' 'unsafe-inline' https://rsms.me/inter/inter.css; script-src 'self' 'unsafe-inline'; img-src 'self' data: https://plex.tv https://assets.plex.tv https://gravatar.com https://secure.gravatar.com https://i2.wp.com https://image.tmdb.org; font-src 'self' https://rsms.me/inter/font-files/" always;
|
|
||||||
# Prevent some categories of XSS attacks (X-XSS-Protection)
|
|
||||||
add_header X-XSS-Protection "1; mode=block" always;
|
|
||||||
# Provide clickjacking protection (X-Frame-Options)
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
# Prevent Sniff Mimetype (X-Content-Type-Options)
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
# Tell crawling bots to not index the site
|
|
||||||
add_header X-Robots-Tag "noindex, nofollow" always;
|
|
||||||
|
|
||||||
access_log /var/log/nginx/overseerr.example.com-access.log;
|
|
||||||
error_log /var/log/nginx/overseerr.example.com-error.log;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://127.0.0.1:5055;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, create a symlink to `/etc/nginx/sites-enabled`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo ln -s /etc/nginx/sites-available/overseerr.example.com.conf /etc/nginx/sites-enabled/overseerr.example.com.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
Next, test the configuration:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo nginx -t
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, reload `nginx` for the new configuration to take effect:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl reload nginx
|
|
||||||
```
|
|
||||||
173
docs/extending-overseerr/reverse-proxy.md
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
# Reverse Proxy
|
||||||
|
|
||||||
|
{% hint style="warning" %}
|
||||||
|
Base URLs cannot be configured in Overseerr. With this limitation, only subdomain configurations are supported.
|
||||||
|
|
||||||
|
A Nginx subfolder workaround configuration is provided below, but it is not officially supported.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
## Nginx
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
{% tab title="SWAG" %}
|
||||||
|
|
||||||
|
A sample proxy configuration is included in [SWAG (Secure Web Application Gateway)](https://github.com/linuxserver/docker-swag).
|
||||||
|
|
||||||
|
However, this page is still the only source of truth, so the SWAG sample configuration is not guaranteed to be up-to-date. If you find an inconsistency, please [report it to the LinuxServer team](https://github.com/linuxserver/reverse-proxy-confs/issues/new) or [submit a pull request to update it](https://github.com/linuxserver/reverse-proxy-confs/pulls).
|
||||||
|
|
||||||
|
To use the bundled configuration file, simply rename `overseerr.subdomain.conf.sample` in the `proxy-confs` folder to `overseerr.subdomain.conf`.
|
||||||
|
|
||||||
|
Alternatively, you can create a new file `overseerr.subdomain.conf` in `proxy-confs` with the following configuration:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
listen [::]:443 ssl http2;
|
||||||
|
|
||||||
|
server_name overseerr.*;
|
||||||
|
|
||||||
|
include /config/nginx/ssl.conf;
|
||||||
|
|
||||||
|
client_max_body_size 0;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
include /config/nginx/proxy.conf;
|
||||||
|
resolver 127.0.0.11 valid=30s;
|
||||||
|
set $upstream_app overseerr;
|
||||||
|
set $upstream_port 5055;
|
||||||
|
set $upstream_proto http;
|
||||||
|
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="Nginx Proxy Manager" %}
|
||||||
|
|
||||||
|
Add a new proxy host with the following settings:
|
||||||
|
|
||||||
|
### Details
|
||||||
|
|
||||||
|
- **Domain Names:** Your desired external Overseerr hostname; e.g., `overseerr.example.com`
|
||||||
|
- **Scheme:** `http`
|
||||||
|
- **Forward Hostname / IP:** Internal Overseerr hostname or IP
|
||||||
|
- **Forward Port:** `5055`
|
||||||
|
- **Cache Assets:** yes
|
||||||
|
- **Block Common Exploits:** yes
|
||||||
|
|
||||||
|
### SSL
|
||||||
|
|
||||||
|
- **SSL Certificate:** Select one of the options; if you are not sure, pick “Request a new SSL Certificate”
|
||||||
|
- **Force SSL:** yes
|
||||||
|
- **HTTP/2 Support:** yes
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="Subdomain" %}
|
||||||
|
|
||||||
|
Add the following configuration to a new file `/etc/nginx/sites-available/overseerr.example.com.conf`:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name overseerr.example.com;
|
||||||
|
return 301 https://$server_name$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name overseerr.example.com;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/overseerr.example.com/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/overseerr.example.com/privkey.pem;
|
||||||
|
|
||||||
|
proxy_set_header Referer $http_referer;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Real-Port $remote_port;
|
||||||
|
proxy_set_header X-Forwarded-Host $host:$remote_port;
|
||||||
|
proxy_set_header X-Forwarded-Server $host;
|
||||||
|
proxy_set_header X-Forwarded-Port $remote_port;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Forwarded-Ssl on;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:5055;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, create a symlink to `/etc/nginx/sites-enabled`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo ln -s /etc/nginx/sites-available/overseerr.example.com.conf /etc/nginx/sites-enabled/overseerr.example.com.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="Subfolder" %}
|
||||||
|
|
||||||
|
{% hint style="warning" %}
|
||||||
|
This Nginx subfolder reverse proxy is an unsupported workaround, and only provided as an example. The filters may stop working when Overseerr is updated.
|
||||||
|
|
||||||
|
If you encounter any issues with Overseerr while using this workaround, we may ask you to try to reproduce the problem without the Nginx proxy.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
Add the following location block to your existing `nginx.conf` file.
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
location ^~ /overseerr {
|
||||||
|
set $app 'overseerr';
|
||||||
|
|
||||||
|
# Remove /overseerr path to pass to the app
|
||||||
|
rewrite ^/overseerr/?(.*)$ /$1 break;
|
||||||
|
proxy_pass http://127.0.0.1:5055; # NO TRAILING SLASH
|
||||||
|
|
||||||
|
# Redirect location headers
|
||||||
|
proxy_redirect ^ /$app;
|
||||||
|
proxy_redirect /setup /$app/setup;
|
||||||
|
proxy_redirect /login /$app/login;
|
||||||
|
|
||||||
|
# Sub filters to replace hardcoded paths
|
||||||
|
proxy_set_header Accept-Encoding "";
|
||||||
|
sub_filter_once off;
|
||||||
|
sub_filter_types *;
|
||||||
|
sub_filter 'href="/"' 'href="/$app"';
|
||||||
|
sub_filter 'href="/login"' 'href="/$app/login"';
|
||||||
|
sub_filter 'href:"/"' 'href:"/$app"';
|
||||||
|
sub_filter '/_next' '/$app/_next';
|
||||||
|
sub_filter '/api/v1' '/$app/api/v1';
|
||||||
|
sub_filter '/login/plex/loading' '/$app/login/plex/loading';
|
||||||
|
sub_filter '/images/' '/$app/images/';
|
||||||
|
sub_filter '/android-' '/$app/android-';
|
||||||
|
sub_filter '/apple-' '/$app/apple-';
|
||||||
|
sub_filter '/favicon' '/$app/favicon';
|
||||||
|
sub_filter '/logo_full.svg' '/$app/logo_full.svg';
|
||||||
|
sub_filter '/logo_stacked.svg' '/$app/logo_stacked.svg';
|
||||||
|
sub_filter '/site.webmanifest' '/$app/site.webmanifest';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
|
|
||||||
|
## Traefik (v2)
|
||||||
|
|
||||||
|
Add the following labels to the Overseerr service in your `docker-compose.yml` file:
|
||||||
|
|
||||||
|
```text
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
## HTTP Routers
|
||||||
|
- "traefik.http.routers.overseerr-rtr.entrypoints=https"
|
||||||
|
- "traefik.http.routers.overseerr-rtr.rule=Host(`overseerr.domain.com`)"
|
||||||
|
- "traefik.http.routers.overseerr-rtr.tls=true"
|
||||||
|
## HTTP Services
|
||||||
|
- "traefik.http.routers.overseerr-rtr.service=overseerr-svc"
|
||||||
|
- "traefik.http.services.overseerr-svc.loadbalancer.server.port=5055"
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information, please refer to the [Traefik documentation](https://doc.traefik.io/traefik/user-guides/docker-compose/basic-example/).
|
||||||
13
docs/extending-overseerr/third-party.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Third-Party Integrations
|
||||||
|
|
||||||
|
{% hint style="warning" %}
|
||||||
|
We do not officially support these third-party integrations. If you run into any issues, please seek help on the appropriate support channels for the integration itself!
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
- [Organizr](https://organizr.app/), a HTPC/homelab services organizer
|
||||||
|
- [Heimdall](https://github.com/linuxserver/Heimdall), an application dashboard and launcher
|
||||||
|
- [LunaSea](https://docs.lunasea.app/modules/overseerr), a self-hosted controller for mobile and macOS
|
||||||
|
- [Requestrr](https://github.com/darkalfx/requestrr/wiki/Configuring-Overseerr), a Discord chatbot
|
||||||
|
- [ha-overseerr](https://github.com/vaparr/ha-overseerr), a custom Home Assistant component
|
||||||
|
- [OverCLIrr](https://github.com/WillFantom/OverCLIrr), a command-line tool
|
||||||
|
- [Overseerr Exporter](https://github.com/WillFantom/overseerr-exporter), a Prometheus exporter
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Overseerr is currently under very heavy, rapid development and things are likely to break often. We need all the help we can get to find bugs and get them fixed to hit a more stable release. If you would like to help test the bleeding edge, please use the image **`sctx/overseerr:develop`** instead!
|
**Overseerr is currently in BETA.** If you would like to help test the bleeding edge, please use the image **`sctx/overseerr:develop`**!
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
@@ -15,7 +15,8 @@ After running Overseerr for the first time, configure it by visiting the web UI
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d \
|
docker run -d \
|
||||||
-e LOG_LEVEL=info \
|
--name overseerr \
|
||||||
|
-e LOG_LEVEL=debug \
|
||||||
-e TZ=Asia/Tokyo \
|
-e TZ=Asia/Tokyo \
|
||||||
-p 5055:5055 \
|
-p 5055:5055 \
|
||||||
-v /path/to/appdata/config:/app/config \
|
-v /path/to/appdata/config:/app/config \
|
||||||
@@ -25,12 +26,37 @@ docker run -d \
|
|||||||
|
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="Compose" %}
|
||||||
|
|
||||||
|
**docker-compose.yml:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
version: '3'
|
||||||
|
|
||||||
|
services:
|
||||||
|
overseerr:
|
||||||
|
image: sctx/overseerr:latest
|
||||||
|
container_name: overseerr
|
||||||
|
environment:
|
||||||
|
- LOG_LEVEL=debug
|
||||||
|
- TZ=Asia/Tokyo
|
||||||
|
ports:
|
||||||
|
- 5055:5055
|
||||||
|
volumes:
|
||||||
|
- /path/to/appdata/config:/app/config
|
||||||
|
restart: unless-stopped
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="UID/GID" %}
|
{% tab title="UID/GID" %}
|
||||||
|
|
||||||
```text
|
```text
|
||||||
docker run -d \
|
docker run -d \
|
||||||
|
--name overseerr \
|
||||||
--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ] \
|
--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ] \
|
||||||
-e LOG_LEVEL=info \
|
-e LOG_LEVEL=debug \
|
||||||
-e TZ=Asia/Tokyo \
|
-e TZ=Asia/Tokyo \
|
||||||
-p 5055:5055 \
|
-p 5055:5055 \
|
||||||
-v /path/to/appdata/config:/app/config \
|
-v /path/to/appdata/config:/app/config \
|
||||||
@@ -42,7 +68,7 @@ docker run -d \
|
|||||||
|
|
||||||
{% tab title="Manual Update" %}
|
{% tab title="Manual Update" %}
|
||||||
|
|
||||||
```text
|
```bash
|
||||||
# Stop the Overseerr container
|
# Stop the Overseerr container
|
||||||
docker stop overseerr
|
docker stop overseerr
|
||||||
|
|
||||||
@@ -66,31 +92,56 @@ Use a 3rd party updating mechanism such as [Watchtower](https://github.com/conta
|
|||||||
## Unraid
|
## Unraid
|
||||||
|
|
||||||
1. Ensure you have the **Community Applications** plugin installed.
|
1. Ensure you have the **Community Applications** plugin installed.
|
||||||
2. Inside the **Communtiy Applications** app store, search for **Overseerr**.
|
2. Inside the **Community Applications** app store, search for **Overseerr**.
|
||||||
3. Click the **Install Button**.
|
3. Click the **Install Button**.
|
||||||
4. On the following **Add Container** screen, make changes to the **Host Port** and **Host Path 1**\(Appdata\) as needed.
|
4. On the following **Add Container** screen, make changes to the **Host Port** and **Host Path 1**\(Appdata\) as needed.
|
||||||
5. Click apply and access "Overseerr" at your `<ServerIP:HostPort>` in a web browser.
|
5. Click apply and access "Overseerr" at your `<ServerIP:HostPort>` in a web browser.
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|
||||||
Please refer to the [docker for windows documentation](https://docs.docker.com/docker-for-windows/) for installation.
|
Please refer to the [Docker Desktop for Windows user manual](https://docs.docker.com/docker-for-windows/) for details on how to install Docker on Windows. There is no need to install a Linux distro if using named volumes like in the example below.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
**WSL2 will need to be installed to prevent DB corruption! Please see** [**Docker Desktop WSL 2 backend**](https://docs.docker.com/docker-for-windows/wsl/) **on how to enable WSL2. The command below will only work with WSL2 installed!**
|
**WSL2 will need to be installed to prevent DB corruption!** Please see the [Docker Desktop WSL 2 backend documentation](https://docs.docker.com/docker-for-windows/wsl/) for instructions on how to enable WSL2. The commands below will only work with WSL2 installed!
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
|
First, create a volume to store the configuration data for Overseerr using using either the Docker CLI:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -d -e LOG_LEVEL=info -e TZ=Asia/Tokyo -p 5055:5055 -v "/your/path/here:/app/config" --restart unless-stopped sctx/overseerr
|
docker volume create overseerr-data
|
||||||
```
|
```
|
||||||
|
|
||||||
|
or the Docker Desktop app:
|
||||||
|
|
||||||
|
1. Open the Docker Desktop app
|
||||||
|
2. Head to the Volumes tab
|
||||||
|
3. Click on the "New Volume" button near the top right
|
||||||
|
4. Enter a name for the volume (example: `overseerr-data`) and hit "Create"
|
||||||
|
|
||||||
|
Then, create and start the Overseerr container:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d -e LOG_LEVEL=debug -e TZ=Asia/Tokyo -p 5055:5055 -v "overseerr-data:/app/config" --restart unless-stopped sctx/overseerr
|
||||||
|
```
|
||||||
|
|
||||||
|
If using a named volume like above, you can safely ignore the warning about the `/app/config` folder being incorrectly mounted on the setup page.
|
||||||
|
|
||||||
|
To access the files inside the volume created above, navigate to `\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\overseerr-data\_data` using File Explorer.
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Docker on Windows works differently than it does on Linux; it uses a VM to run a stripped-down Linux and then runs docker within that. The volume mounts are exposed to the docker in this VM via SMB mounts. While this is fine for media, it is unacceptable for the `/app/config` directory because SMB does not support file locking. This will eventually corrupt your database which can lead to slow behavior and crashes. If you must run in docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host. It's worth noting that this warning also extends to other containers which use SQLite databases.
|
Docker on Windows works differently than it does on Linux; it runs Docker inside of a stripped-down Linux VM. Volume mounts are exposed to Docker inside this VM via SMB mounts. While this is fine for media, it is unacceptable for the `/app/config` directory because SMB does not support file locking. This will eventually corrupt your database, which can lead to slow behavior and crashes.
|
||||||
|
|
||||||
|
**If you must run Docker on Windows, you should put the `/app/config` directory mount inside the VM and not on the Windows host.** (This also applies to other containers with SQLite databases.)
|
||||||
|
|
||||||
|
Named volumes, like in the example commands above, are automatically mounted inside the VM.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Linux
|
## Linux
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
The [Overseerr snap](https://snapcraft.io/overseerr) is the only supported linux install method. Currently, the listening port cannot be changed. Port `5055` will need to be available on your host. To install snapd please refer to [Installing snapd](https://snapcraft.io/docs/installing-snapd).
|
The [Overseerr snap](https://snapcraft.io/overseerr) is the only officially supported Linux install method aside from [Docker](#docker).
|
||||||
|
|
||||||
|
Currently, the listening port cannot be changed, so port `5055` will need to be available on your host. To install `snapd`, please refer to the [Snapcraft documentation](https://snapcraft.io/docs/installing-snapd).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
**To install:**
|
**To install:**
|
||||||
@@ -116,7 +167,7 @@ sudo snap install overseerr --edge
|
|||||||
This version can break any moment. Be prepared to troubleshoot any issues that arise!
|
This version can break any moment. Be prepared to troubleshoot any issues that arise!
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## Third Party
|
## Third-Party
|
||||||
|
|
||||||
{% tabs %}
|
{% tabs %}
|
||||||
|
|
||||||
@@ -125,7 +176,7 @@ Portage overlay [GitHub Repository](https://github.com/chriscpritchard/overseerr
|
|||||||
|
|
||||||
This is now included in the list of [Gentoo repositories](https://overlays.gentoo.org/), so can be easily enabled with `eselect repository`
|
This is now included in the list of [Gentoo repositories](https://overlays.gentoo.org/), so can be easily enabled with `eselect repository`
|
||||||
|
|
||||||
Efforts will be made to keep up to date with the latest releases, however, this cannot be guaranteed.
|
Efforts will be made to keep up-to-date with the latest releases; however, this cannot be guaranteed.
|
||||||
|
|
||||||
**To enable:**
|
**To enable:**
|
||||||
To enable using `eselect repository`, run:
|
To enable using `eselect repository`, run:
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
# Asking for Support
|
|
||||||
|
|
||||||
## Before Asking for Support
|
|
||||||
|
|
||||||
Before seeking help, please make sure you have tried these following first:
|
|
||||||
|
|
||||||
- **Update** to the latest version.
|
|
||||||
- ["Have you tried turning it off and on again?"](https://www.youtube.com/watch?v=nn2FB1P_Mn8)
|
|
||||||
- **Analyze** your logs, you just might find the solution yourself!
|
|
||||||
- **Search** the [Wiki](../), [Installation Guides](../getting-started/installation.md), and [FAQs](faq.md).
|
|
||||||
- If you have questions, feel free to ask on [Discord](https://discord.gg/PkCWJSeCk7) \(Please review our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_CONDUCT.md).\) Be sure to include a link to your logs. See [How can I share my logs?](asking-for-support.md#how-can-i-share-my-logs) below.
|
|
||||||
|
|
||||||
## What should I include when asking for support?
|
|
||||||
|
|
||||||
When you contact support, a vague statement like "it doesn't work" leaves little to go on to figure out what is wrong for you. When contacting support, try to include as much information as possible. Try to answer the following questions:
|
|
||||||
|
|
||||||
- What did you try to do? When you describe what you did to reach the state you are in, we may notice something you did differently from the official instructions, or something required by your unique setup. The following are questions that should be answered in your request:
|
|
||||||
- What command did you enter?
|
|
||||||
- What did you click on?
|
|
||||||
- What settings did you change?
|
|
||||||
- Provide a step-by-step list of what you tried.
|
|
||||||
- What do you see? We cannot see your screen so some of the following is necessary for us to know what is going on:
|
|
||||||
- Did something happen?
|
|
||||||
- Did something not happen?
|
|
||||||
- Are there any error messages showing?
|
|
||||||
- Provide screenshots to help us see what you are seeing.
|
|
||||||
- Share your Overseerr logs, which show exactly what happened and are often critical for identifying issues \(see [How can I share my logs?](asking-for-support.md#how-can-i-share-my-logs) below\).
|
|
||||||
|
|
||||||
## How can I share my logs?
|
|
||||||
|
|
||||||
1. Locate the log file at `<Overseeerr-install-directory>/logs/overseerr.log`
|
|
||||||
2. Open the log file and **copy its contents** into a [**secret gist** on GitHub](https://gist.github.com/). If you upload your logs elsewhere, we may ask you to share them again via GitHub Gist.
|
|
||||||
3. **Share the link/URL to your secret gist** in the [`#support` channel in our Discord server](https://discord.gg/PkCWJSeCk7).
|
|
||||||
@@ -1,46 +1,54 @@
|
|||||||
# Frequently Asked Questions (FAQ)
|
# Frequently Asked Questions (FAQ)
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
If you can't find a solution here, please ask on [Discord](https://discord.gg/PkCWJSeCk7). Please do not post questions on the GitHub issues tracker.
|
If you can't find the solution to your problem here, please read [Need Help?](./need-help.md) and reach out to us on [Discord](https://discord.gg/overseerr).
|
||||||
|
|
||||||
|
_Please do not post questions or support requests on the GitHub issue tracker!_
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
## General
|
## General
|
||||||
|
|
||||||
### I receive 409 or 400 errors when requesting a movie or TV series!
|
|
||||||
|
|
||||||
**A:** Verify you are running Radarr and Sonarr v3. Overseerr was developed for v3 and is not currently backwards-compatible with previous versions.
|
|
||||||
|
|
||||||
### How do I keep Overseerr up-to-date?
|
### How do I keep Overseerr up-to-date?
|
||||||
|
|
||||||
**A:** Use a 3rd party updating mechanism such as [Watchtower](https://github.com/containrrr/watchtower) or [Ouroboros](https://github.com/pyouroboros/ouroboros) to keep Overseerr up-to-date automatically.
|
Use a third-party update mechanism (such as [Watchtower](https://github.com/containrrr/watchtower), [Ouroboros](https://github.com/pyouroboros/ouroboros), or [Pullio](https://hotio.dev/pullio)) to keep Overseerr up-to-date automatically.
|
||||||
|
|
||||||
### How can I access Overseerr outside my home network?
|
### How can I access Overseerr outside of my home network?
|
||||||
|
|
||||||
**A:** The easy and least secure method is to forward an external port \(`5055`\) on your router to the internal port used by Overseerr \(default is TCP `5055`\). Visit [Port Forward](http://portforward.com/) for instructions for your particular router. You will then be able to access Overseerr via `http://EXTERNAL-IP-ADDRESS:5055`.
|
The easiest but least secure method is to simply forward an external port (e.g., `5055`) on your router to the internal port used by Overseerr (default is TCP `5055`). Visit [Port Forward](http://portforward.com/) for instructions for your particular router. You would then be able to access Overseerr via `http://EXTERNAL-IP-ADDRESS:5055`.
|
||||||
|
|
||||||
The more advanced and most preferred method \(and more secure if you use SSL\) is to set up a web server with NGINX/Apache, and use a reverse proxy to access Overseerr. You can lookup many guides on the internet to find out how to do this. There are several reverse proxy config examples located [here](../extending-overseerr/reverse-proxy-examples.md).
|
A more advanced, user-friendly, and secure (if using SSL) method is to set up a web server and use a reverse proxy to access Overseerr. Please refer to our [reverse proxy examples](../extending-overseerr/reverse-proxy.md) for more information.
|
||||||
|
|
||||||
The most secure method, but also the most inconvenient, is to set up a VPN tunnel to your home server, then you can access Overseerr as if it is on a local network via `http://LOCAL-IP-ADDRESS:5055`.
|
The most secure method (but also the most inconvenient method) is to set up a VPN tunnel to your home server. You would then be able to access Overseerr as if you were on your local network, via `http://LOCAL-IP-ADDRESS:5055`.
|
||||||
|
|
||||||
### Overseerr is amazing! But it is not translated in my language yet! Can I help with translations?
|
### Overseerr is amazing! But it is not translated in my language yet! Can I help with translations?
|
||||||
|
|
||||||
**A:** You sure can! We are using [Weblate](https://hosted.weblate.org/engage/overseerr/) for translations. If your language is not listed, please [open a feature request on GitHub](https://github.com/sct/overseerr/issues/new/choose).
|
You sure can! We are using [Weblate](https://hosted.weblate.org/engage/overseerr/) for translations. If your language is not listed, please [open a feature request on GitHub](https://github.com/sct/overseerr/issues/new/choose).
|
||||||
|
|
||||||
### Where can I find the changelog?
|
### Where can I find the changelog?
|
||||||
|
|
||||||
**A:** You can find the changelog in the **Settings → About** page in your Overseerr instance. You can also find it on [GitHub](https://github.com/sct/overseerr/releases).
|
You can find the changelog for your version (stable/`latest`,s or `develop`) in the **Settings → About** page in your Overseerr instance.
|
||||||
|
|
||||||
### Can I make 4K requests?
|
You can alternatively review the [stable release history](https://github.com/sct/overseerr/releases) and [`develop` branch commit history](https://github.com/sct/overseerr/commits/develop) on GitHub.
|
||||||
|
|
||||||
**A:** Yes! When adding your 4K Sonarr/Radarr server in **Settings → Services**, tick the `4K Server` checkbox. You also need to tick the `Default Server` checkbox if it is the default server you would like to use for 4K content requests. (To enable 4K requests, there need to be default Sonarr/Radarr servers for both 4K content **and** non-4K content.)
|
|
||||||
|
|
||||||
### Some media is missing from Overseerr that I know is in Plex!
|
### Some media is missing from Overseerr that I know is in Plex!
|
||||||
|
|
||||||
**A:** Overseerr supports the new Plex Movie, legacy Plex Movie, TheTVDB, and TMDb agents. Please verify that your library is using one of the agents previously listed. If you are changing agents, a full metadata refresh will need to be performed. Caution, this can take a long time depending on how many items you have in your movie library.
|
Overseerr currently supports the following agents:
|
||||||
|
|
||||||
**Troubleshooting Steps:**
|
- New Plex Movie
|
||||||
|
- Legacy Plex Movie
|
||||||
|
- New Plex TV
|
||||||
|
- Legacy Plex TV
|
||||||
|
- TheTVDB
|
||||||
|
- TMDb
|
||||||
|
- [HAMA](https://github.com/ZeroQI/Hama.bundle)
|
||||||
|
|
||||||
First, check the Overseerr logs for media items that are missing. The logs will contain an error as to why that item could not be matched. One example might be `errorMessage":"SQLITE_CONSTRAINT: NOT NULL`. This means that the TMDb ID is missing from the Plex XML for that item.
|
Please verify that your library is using one of the agents previously listed.
|
||||||
|
|
||||||
|
When changing agents, a full metadata refresh of your Plex library is required. (Caution: This can take a long time depending on the size of your library.)
|
||||||
|
|
||||||
|
#### Troubleshooting Steps
|
||||||
|
|
||||||
|
First, check the Overseerr logs for media items that are missing. The logs will contain an error as to why that item could not be matched.
|
||||||
|
|
||||||
1. Verify that you are using one of the agents mentioned above.
|
1. Verify that you are using one of the agents mentioned above.
|
||||||
2. Refresh the metadata for just that item.
|
2. Refresh the metadata for just that item.
|
||||||
@@ -58,40 +66,56 @@ You can also perform the following to verify the media item has a GUID Overseerr
|
|||||||
3. TheTVDB agent `guid="com.plexapp.agents.thetvdb://78874/1/1"`
|
3. TheTVDB agent `guid="com.plexapp.agents.thetvdb://78874/1/1"`
|
||||||
4. Legacy Plex Movie agent `guid="com.plexapp.agents.imdb://tt0765446"`
|
4. Legacy Plex Movie agent `guid="com.plexapp.agents.imdb://tt0765446"`
|
||||||
|
|
||||||
### TV series requests are failing after I updated Overseerr!
|
### Where can I find the log files?
|
||||||
|
|
||||||
**A:** Language profile support for Sonarr was added in [#860](https://github.com/sct/overseerr/pull/860), along with a new "Language Profile" required setting. If your TV series requests are failing, please make sure that you have a default language profile configured for each of your Sonarr servers in **Settings → Services**.
|
Please see [these instructions on how to locate and share your logs](./need-help.md#how-can-i-share-my-logs).
|
||||||
|
|
||||||
### Where can I find the logs?
|
## Users
|
||||||
|
|
||||||
**A:** The logs are located at `<Overseeerr-install-directory>/logs/overseerr.log`
|
### Why can't I see all of my Plex users?
|
||||||
|
|
||||||
## User management
|
Please see the [documentation for importing users from Plex](../using-overseerr/users/README.md#importing-users-from-plex).
|
||||||
|
|
||||||
### Why can't I see all my Plex users?
|
|
||||||
|
|
||||||
**A:** Navigate to your **User List** in Overseerr and click **Import Users from Plex** button. Don't forget to check the default user permissions in the **Settings → General Settings** page beforehand.
|
|
||||||
|
|
||||||
### Can I create local users in Overseerr?
|
### Can I create local users in Overseerr?
|
||||||
|
|
||||||
**A:** Head to the **Users** page and hit **Create Local User**. Keep in mind that local user accounts need a valid email address.
|
Yes! Please see the [documentation for creating local users](../using-overseerr/users/README.md#creating-local-users).
|
||||||
|
|
||||||
### Is is possible to set user roles in Overseerr?
|
### Is is possible to set user roles in Overseerr?
|
||||||
|
|
||||||
**A:** User roles can be set for each user on the **Users** page. The list of assignable permissions is one that is still growing, so if you have any suggestions, [make a feature request](https://github.com/sct/overseerr/issues/new/choose) on GitHub.
|
Permissions can be configured for each user via the **User List** or their **User Settings** page. The list of assignable permissions is still growing, so if you have any suggestions, [submit a feature request](https://github.com/sct/overseerr/issues/new/choose)!
|
||||||
|
|
||||||
## Requests
|
## Requests
|
||||||
|
|
||||||
|
### I receive 409 or 400 errors when requesting a movie or TV series!
|
||||||
|
|
||||||
|
Verify you are running v3 of both Radarr and Sonarr. Overseerr is not backwards-compatible with previous versions.
|
||||||
|
|
||||||
|
### Can I allow users to submit 4K requests?
|
||||||
|
|
||||||
|
Yes! If you keep both non-4K and 4K content in your media libraries, you can link separate 4K Radarr/Sonarr servers to allow users to submit 4K requests. (You must configure default non-4K **and** default 4K Radarr/Sonarr servers.)
|
||||||
|
|
||||||
|
Please see the [Services documentation](../using-overseerr/settings/README.md#services) for details on how to configure your Radarr and/or Sonarr servers.
|
||||||
|
|
||||||
|
Note that users must also have the **Request 4K**, **Request 4K Movies**, and/or **Request 4K Series** permissions in order to submit requests for 4K content.
|
||||||
|
|
||||||
### I approved a requested movie and Radarr didn't search for it!
|
### I approved a requested movie and Radarr didn't search for it!
|
||||||
|
|
||||||
**A:** Check the minimum availability setting in your Radarr server. If a movie does not meet the minimum availability requirement, no search will be performed. Also verify that Radarr did not perform a search, by checking the Radarr logs. Lastly, verify that the item was not already being monitored by Radarr prior to approving the request.
|
Check the minimum availability setting in your Radarr server. If a movie does not meet the minimum availability requirement, no search will be performed. Also verify that Radarr did not perform a search, by checking the Radarr logs. Lastly, verify that the item was not already being monitored by Radarr prior to approving the request.
|
||||||
|
|
||||||
### Help! My request still shows "requested" even though it is in Plex!
|
### Help! My request still shows "requested" even though it is in Plex!
|
||||||
|
|
||||||
**A:** See "[Some media is missing from Overseerr that I know is in Plex!](./faq.md#some-media-is-missing-from-overseerr-that-i-know-is-in-plex)" for troubleshooting steps.
|
See "[Some media is missing from Overseerr that I know is in Plex!](#some-media-is-missing-from-overseerr-that-i-know-is-in-plex)" for troubleshooting steps.
|
||||||
|
|
||||||
|
### Series requests keep failing!
|
||||||
|
|
||||||
|
If you configured a URL base in Sonarr, make sure you have also configured the [URL Base](../using-overseerr/settings/README.md#url-base) setting for your Sonarr server in Overseerr.
|
||||||
|
|
||||||
|
Also, check that you are using Sonarr v3 and that you have configured a default language profile in Overseerr.
|
||||||
|
|
||||||
|
Language profile support for Sonarr was added in [v1.20.0](https://github.com/sct/overseerr/releases/tag/v1.20.0) along with a new, _required_ **Language Profile** setting. If series requests are failing, make sure that you have a default language profile configured for each of your Sonarr servers in **Settings → Services**.
|
||||||
|
|
||||||
## Notifications
|
## Notifications
|
||||||
|
|
||||||
### I am getting "Username and Password not accepted" when attempting to send email notifications via Gmail!
|
### I am getting "Username and Password not accepted" when attempting to send email notifications via Gmail!
|
||||||
|
|
||||||
**A:** If you have 2-Step Verification enabled on your account, you will need to create an [app password](https://support.google.com/mail/answer/185833).
|
If you have 2-Step Verification enabled on your account, you will need to create an [app password](https://support.google.com/mail/answer/185833).
|
||||||
|
|||||||
40
docs/support/need-help.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Need Help?
|
||||||
|
|
||||||
|
Before seeking assistance, please make sure you have first tried these following:
|
||||||
|
|
||||||
|
- **Updating** Overseerr to the latest version.
|
||||||
|
- **Stopping and restarting** Overseerr.
|
||||||
|
- **Restarting** your machine.
|
||||||
|
- **Clearing** your browser cache.
|
||||||
|
- **Analyzing** your logs, you just might find the solution yourself!
|
||||||
|
- **Searching** the [documentation](../README.md), [installation guide](../getting-started/installation.md), and [FAQs](./faq.md).
|
||||||
|
|
||||||
|
If you still have questions after troubleshooting on your own, feel free to ask on [Discord](https://discord.gg/overseerr)! (Please review our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_CONDUCT.md) before posting.)
|
||||||
|
|
||||||
|
Be sure to also include a link to your logs. (Please see [How can I share my logs?](#how-can-i-share-my-logs) below.)
|
||||||
|
|
||||||
|
## What should I include when requesting support?
|
||||||
|
|
||||||
|
Please try to include as much information as possible. A vague statement like "it doesn't work" provides very little to go on, and makes it difficult for us to help you.
|
||||||
|
|
||||||
|
Try to answer the following questions:
|
||||||
|
|
||||||
|
- What were you trying to do, and how did you attempt it?
|
||||||
|
- What command did you enter?
|
||||||
|
- What did you click on?
|
||||||
|
- What settings did you change?
|
||||||
|
- Did you follow official instructions, or a third-party guide?
|
||||||
|
- Provide a step-by-step list of what you tried.
|
||||||
|
- Provide a brief description of your setup.
|
||||||
|
- What exactly do you see?
|
||||||
|
- Did something happen?
|
||||||
|
- Did something not happen?
|
||||||
|
- Are there any error messages showing?
|
||||||
|
- Provide screenshots to help us see what you are seeing.
|
||||||
|
- Share your Overseerr logs, which show exactly what happened and are often critical for identifying issues (see [How can I share my logs?](#how-can-i-share-my-logs) below).
|
||||||
|
|
||||||
|
## How can I share my logs?
|
||||||
|
|
||||||
|
1. Locate the current log file at `<your Overseerr config directory>/logs/overseerr.log`.
|
||||||
|
2. Open the log file and **copy its contents** into a [**secret gist** on GitHub](https://gist.github.com/). If you upload your logs elsewhere, we may ask you to share them again via GitHub Gist.
|
||||||
|
3. **Share the link/URL to your secret gist** in the [`#support` channel in our Discord server](https://discord.gg/overseerr).
|
||||||
@@ -1,29 +1,25 @@
|
|||||||
# Notifications
|
# Notifications
|
||||||
|
|
||||||
Overseerr already supports a good number of notification agents, such as **Discord**, **Slack** and **Pushover**. New agents are always considered for development, if there is enough demand for it.
|
## Supported Notification Agents
|
||||||
|
|
||||||
## Currently Supported Notification Agents
|
Overseerr currently supports the following notification agents:
|
||||||
|
|
||||||
- Discord
|
- [Email](./email.md)
|
||||||
- Email
|
- [Web Push](./webpush.md)
|
||||||
- Pushbullet
|
- [Discord](./discord.md)
|
||||||
- Pushover
|
- [LunaSea](./lunasea.md)
|
||||||
- Slack
|
- [Pushbullet](./pushbullet.md)
|
||||||
- Telegram
|
- [Pushover](./pushover.md)
|
||||||
|
- [Slack](./slack.md)
|
||||||
|
- [Telegram](./telegram.md)
|
||||||
- [Webhooks](./webhooks.md)
|
- [Webhooks](./webhooks.md)
|
||||||
|
|
||||||
## Setting Up Notifications
|
## Setting Up Notifications
|
||||||
|
|
||||||
Configuring your notifications is _very simple_. First, you will need to visit the **Settings** page and click **Notifications** in the menu. This will present you with all of the currently available notification agents. Click on each one individually to configure them.
|
Simply configure your desired notification agents in **Settings → Notifications**.
|
||||||
|
|
||||||
You must configure which type of notifications you want to send _per agent_. If no types are selected, you will not receive notifications!
|
Users can customize their personal notification preferences in their own user notification settings.
|
||||||
|
|
||||||
Some agents may have specific configuration "gotchas" covered in their documentation pages.
|
|
||||||
|
|
||||||
{% hint style="danger" %}
|
|
||||||
You will **not receive notifications** for any automatically approved requests unless the "Enable Notifications for Automatic Approvals" setting is enabled.
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
## Requesting New Notification Agents
|
## Requesting New Notification Agents
|
||||||
|
|
||||||
If we do not currently support a notification agent you would like, feel free to request it on [GitHub](https://github.com/sct/overseerr/issues). However, please be sure to search first and confirm that there is not already an existing request for the agent!
|
If we do not currently support your preferred notification agent, feel free to [submit a feature request on GitHub](https://github.com/sct/overseerr/issues). However, please be sure to search first and confirm that there is not already an existing request for the agent!
|
||||||
|
|||||||
21
docs/using-overseerr/notifications/discord.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Discord
|
||||||
|
|
||||||
|
The Discord notification agent enables you to post notifications to a channel in a server you manage.
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Users can optionally opt-in to being mentioned in Discord notifications by configuring their [Discord user ID](https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID-) in their user settings.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Webhook URL
|
||||||
|
|
||||||
|
You can find the webhook URL in the Discord application, at **Server Settings → Integrations → Webhooks**.
|
||||||
|
|
||||||
|
### Bot Username (optional)
|
||||||
|
|
||||||
|
If you would like to override the name you configured for your bot in Discord, you may set this value to whatever you like!
|
||||||
|
|
||||||
|
### Bot Avatar URL (optional)
|
||||||
|
|
||||||
|
Similar to the bot username, you can override the avatar for your bot.
|
||||||
45
docs/using-overseerr/notifications/email.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Email
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
If the [Application URL](../settings/README.md#application-url) setting is configured in **Settings → General**, Overseerr will explicitly set the origin server hostname when connecting to the SMTP host.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Sender Name (optional)
|
||||||
|
|
||||||
|
Configure a friendly name for the email sender (e.g., "Overseerr").
|
||||||
|
|
||||||
|
### Sender Address
|
||||||
|
|
||||||
|
Set this to the email address you would like to appear in the "from" field of the email message.
|
||||||
|
|
||||||
|
Depending on your email provider, this may need to be an address you own. For example, Gmail requires this to be your actual email address.
|
||||||
|
|
||||||
|
### SMTP Host
|
||||||
|
|
||||||
|
Set this to the hostname or IP address of your SMTP host/server.
|
||||||
|
|
||||||
|
### SMTP Port
|
||||||
|
|
||||||
|
Set this to a supported port number for your SMTP host. `465` and `587` are commonly used.
|
||||||
|
|
||||||
|
### Encryption Method
|
||||||
|
|
||||||
|
In most cases, [Use Implicit TLS](https://tools.ietf.org/html/rfc8314) should be selected for port 465, and [Use STARTTLS if available](https://en.wikipedia.org/wiki/Opportunistic_TLS) for port 587. Please refer to your email provider's documentations for details on how to configure this setting.
|
||||||
|
|
||||||
|
The default value for this setting is **Use STARTTLS if available**.
|
||||||
|
|
||||||
|
### SMTP Username & Password
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
If your account has two-factor authentication enabled, you may need to create an application password instead of using your account password.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
Configure these values as appropriate to authenticate with your SMTP host.
|
||||||
|
|
||||||
|
### PGP Private Key & Password (optional)
|
||||||
|
|
||||||
|
Configure these values to enable encrypting and signing of email messages using [OpenPGP](https://www.openpgp.org/). Note that individual users must also have their **PGP public keys** configured in their user settings in order for PGP encryption to be used in messages addressed to them.
|
||||||
|
|
||||||
|
When configuring the PGP keys, be sure to keep the entire contents of the key intact. For example, private keys always begin with `-----BEGIN PGP PRIVATE KEY BLOCK-----` and end with `-----END PGP PRIVATE KEY BLOCK-----`.
|
||||||
17
docs/using-overseerr/notifications/lunasea.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# LunaSea
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Webhook URL
|
||||||
|
|
||||||
|
Copy either a device- or user-based webhook URL from the LunaSea app into this field.
|
||||||
|
|
||||||
|
### Profile Name (optional)
|
||||||
|
|
||||||
|
If not using the `default` profile in the LunaSea app, specify the name of the profile here.
|
||||||
|
|
||||||
|
Note that the entered profile name **_must_** match the name in LunaSea exactly (including any capitalization, punctuation, and/or whitespace).
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Please refer to the [LunaSea documentation](https://docs.lunasea.app/lunasea/notifications/overseerr) for more details on configuring these notifications.
|
||||||
|
{% endhint %}
|
||||||
7
docs/using-overseerr/notifications/pushbullet.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Pushbullet
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Access Token
|
||||||
|
|
||||||
|
[Create an access token](https://www.pushbullet.com/#settings) and set it here to grant Overseerr access to the Pushbullet API.
|
||||||
15
docs/using-overseerr/notifications/pushover.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Pushover
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Application/API Token
|
||||||
|
|
||||||
|
[Register an application](https://pushover.net/apps/build) and enter the API token in this field. (You can use one of the [official icons in our GitHub repository](https://github.com/sct/overseerr/tree/develop/public) when configuring the application.)
|
||||||
|
|
||||||
|
For more details on registering applications or the API token, please see the [Pushover API documentation](https://pushover.net/api#registration).
|
||||||
|
|
||||||
|
### User Key
|
||||||
|
|
||||||
|
Set this to the user key for your Pushover account. Alternatively, you can set this to a group key to deliver notifications to multiple users.
|
||||||
|
|
||||||
|
For more details, please see the [Pushover API documentation](https://pushover.net/api#identifiers).
|
||||||
11
docs/using-overseerr/notifications/slack.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Slack
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Webhook URL
|
||||||
|
|
||||||
|
Simply [create a webhook](https://my.slack.com/services/new/incoming-webhook/) and enter the URL in this field.
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Please refer to the [Slack API documentation](https://api.slack.com/messaging/webhooks) for more details on configuring these notifications.
|
||||||
|
{% endhint %}
|
||||||
31
docs/using-overseerr/notifications/telegram.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Telegram
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Users can optionally configure their own notifications in their user settings.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
In order to configure Telegram notifications, you first need to [create a bot](https://telegram.me/BotFather).
|
||||||
|
|
||||||
|
Bots **cannot** initiate conversations with users, so users must have your bot added to a conversation in order to receive notifications.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Bot Username (optional)
|
||||||
|
|
||||||
|
If this value is configured, users will be able to click a link to start a chat with your bot and configure their own personal notifications.
|
||||||
|
|
||||||
|
The bot username should end with `_bot`, and the `@` prefix should be omitted.
|
||||||
|
|
||||||
|
### Bot Authentication Token
|
||||||
|
|
||||||
|
At the end of the bot creation process, [@BotFather](https://telegram.me/botfather) will provide an authentication token.
|
||||||
|
|
||||||
|
### Chat ID
|
||||||
|
|
||||||
|
To obtain your chat ID, simply create a new group chat, add [@get_id_bot](https://telegram.me/get_id_bot), and issue the `/my_id` command.
|
||||||
|
|
||||||
|
### Send Silently (optional)
|
||||||
|
|
||||||
|
Optionally, notifications can be sent silently. Silent notifications send messages without notification sounds.
|
||||||
@@ -1,22 +1,24 @@
|
|||||||
# Webhooks
|
# Webhook
|
||||||
|
|
||||||
Webhooks let you post a custom JSON payload to any endpoint you like. You can also set an authorization header for security purposes.
|
The webhook notification agent enables you to send a custom JSON payload to any endpoint for specific notification events.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
The following configuration options are available:
|
### Webhook URL
|
||||||
|
|
||||||
### Webhook URL (required)
|
|
||||||
|
|
||||||
The URL you would like to post notifications to. Your JSON will be sent as the body of the request.
|
The URL you would like to post notifications to. Your JSON will be sent as the body of the request.
|
||||||
|
|
||||||
### Authorization Header
|
### Authorization Header (optional)
|
||||||
|
|
||||||
Custom authorization header. Anything entered for this will be sent as an `Authorization` header.
|
{% hint style="info" %}
|
||||||
|
This is typically not needed. Please refer to your webhook provider's documentation for details.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
### JSON Payload (required)
|
This value will be sent as an `Authorization` HTTP header.
|
||||||
|
|
||||||
Customize the JSON payload to suit your needs. Overseerr provides several [template variables](./webhooks.md#template-variables) for use in the payload, which will be replaced with the relevant data when the notifications are triggered.
|
### JSON Payload
|
||||||
|
|
||||||
|
Customize the JSON payload to suit your needs. Overseerr provides several [template variables](#template-variables) for use in the payload, which will be replaced with the relevant data when the notifications are triggered.
|
||||||
|
|
||||||
## Template Variables
|
## Template Variables
|
||||||
|
|
||||||
@@ -29,23 +31,29 @@ Customize the JSON payload to suit your needs. Overseerr provides several [templ
|
|||||||
|
|
||||||
### User
|
### User
|
||||||
|
|
||||||
These variables are usually the target user of the notification.
|
These variables are for the target recipient of the notification.
|
||||||
|
|
||||||
- `{{notifyuser_username}}` Target user's username.
|
- `{{notifyuser_username}}` Target user's username.
|
||||||
- `{{notifyuser_email}}` Target user's email.
|
- `{{notifyuser_email}}` Target user's email address.
|
||||||
- `{{notifyuser_avatar}}` Target user's avatar.
|
- `{{notifyuser_avatar}}` Target user's avatar URL.
|
||||||
- `{{notifyuser_settings_discordId}}` Target user's discord ID (if one is set).
|
- `{{notifyuser_settings_discordId}}` Target user's Discord ID (if one is set).
|
||||||
|
- `{{notifyuser_settings_telegramChatId}}` Target user's Telegram Chat ID (if one is set).
|
||||||
|
|
||||||
### Media
|
{% hint style="info" %}
|
||||||
|
The `notifyuser` variables are not set for the following notification types, as they are intended for application administrators rather than end users:
|
||||||
|
|
||||||
These variables are only included in media related notifications, such as requests.
|
- Media Requested
|
||||||
|
- Media Automatically Approved
|
||||||
|
- Media Failed
|
||||||
|
|
||||||
- `{{media_type}}` Media type. Either `movie` or `tv`.
|
On the other hand, the `notifyuser` variables _will_ be replaced with the requesting user's information for the below notification types:
|
||||||
- `{{media_tmdbid}}` Media's TMDb ID.
|
|
||||||
- `{{media_imdbid}}` Media's IMDb ID.
|
- Media Approved
|
||||||
- `{{media_tvdbid}}` Media's TVDB ID.
|
- Media Declined
|
||||||
- `{{media_status}}` Media's availability status (e.g., `AVAILABLE` or `PENDING`).
|
- Media Available
|
||||||
- `{{media_status4k}}` Media's 4K availability status (e.g., `AVAILABLE` or `PENDING`).
|
|
||||||
|
If you would like to use the requesting user's information in your webhook, please instead include the relevant variables from the [Request](#request) section below.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
### Special
|
### Special
|
||||||
|
|
||||||
@@ -54,3 +62,25 @@ The following variables must be used as a key in the JSON payload (e.g., `"{{ext
|
|||||||
- `{{request}}` This object will be `null` if there is no relevant request object for the notification.
|
- `{{request}}` This object will be `null` if there is no relevant request object for the notification.
|
||||||
- `{{media}}` This object will be `null` if there is no relevant media object for the notification.
|
- `{{media}}` This object will be `null` if there is no relevant media object for the notification.
|
||||||
- `{{extra}}` This object will contain the "extra" array of additional data for certain notifications.
|
- `{{extra}}` This object will contain the "extra" array of additional data for certain notifications.
|
||||||
|
|
||||||
|
#### Media
|
||||||
|
|
||||||
|
These `{{media}}` special variables are only included in media-related notifications, such as requests.
|
||||||
|
|
||||||
|
- `{{media_type}}` Media type (`movie` or `tv`).
|
||||||
|
- `{{media_tmdbid}}` Media's TMDb ID.
|
||||||
|
- `{{media_imdbid}}` Media's IMDb ID.
|
||||||
|
- `{{media_tvdbid}}` Media's TVDB ID.
|
||||||
|
- `{{media_status}}` Media's availability status (`UNKNOWN`, `PENDING`, `PROCESSING`, `PARTIALLY_AVAILABLE`, or `AVAILABLE`).
|
||||||
|
- `{{media_status4k}}` Media's 4K availability status (`UNKNOWN`, `PENDING`, `PROCESSING`, `PARTIALLY_AVAILABLE`, or `AVAILABLE`)
|
||||||
|
|
||||||
|
#### Request
|
||||||
|
|
||||||
|
The `{{request}}` special variables are only included in request-related notifications.
|
||||||
|
|
||||||
|
- `{{request_id}}` Request ID.
|
||||||
|
- `{{requestedBy_username}}` Requesting user's username.
|
||||||
|
- `{{requestedBy_email}}` Requesting user's email address.
|
||||||
|
- `{{requestedBy_avatar}}` Requesting user's avatar URL.
|
||||||
|
- `{{requestedBy_settings_discordId}}` Requesting user's Discord ID (if set).
|
||||||
|
- `{{requestedBy_settings_telegramChatId}}` Requesting user's Telegram Chat ID (if set).
|
||||||
|
|||||||
17
docs/using-overseerr/notifications/webpush.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Web Push
|
||||||
|
|
||||||
|
The web push notification agent enables you and your users to receive Overseerr notifications in a supported browser.
|
||||||
|
|
||||||
|
This notification agent does not require any configuration, but is not enabled in Overseerr by default.
|
||||||
|
|
||||||
|
{% hint style="warning" %}
|
||||||
|
**The web push agent only works via HTTPS.** Refer to our [reverse proxy examples](../../extending-overseerr/reverse-proxy.md) for help on proxying Overseerr traffic via HTTPS.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
To set up web push notifications, simply enable the agent in **Settings → Notifications → Web Push**. You and your users will then be prompted to allow notifications in your web browser.
|
||||||
|
|
||||||
|
Users can opt out of these notifications, or customize the notification types they would like to subscribe to, in their user settings.
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
Web push notifications offer a native notification experience without the need to install an app. iOS devices do not have support for these notifications at this time, however.
|
||||||
|
{% endhint %}
|
||||||
213
docs/using-overseerr/settings/README.md
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
# Settings
|
||||||
|
|
||||||
|
## General
|
||||||
|
|
||||||
|
### API Key
|
||||||
|
|
||||||
|
This is your Overseerr API key, which can be used to integrate Overseerr with third-party applications. Do **not** share this key publicly, as it can be used to gain administrator access!
|
||||||
|
|
||||||
|
If you need to generate a new API key for any reason, simply click the button to the right of the text box.
|
||||||
|
|
||||||
|
### Application Title
|
||||||
|
|
||||||
|
If you aren't a huge fan of the name "Overseerr" and would like to display something different to your users, you can customize the application title!
|
||||||
|
|
||||||
|
### Application URL
|
||||||
|
|
||||||
|
Set this to the externally-accessible URL of your Overseerr instance.
|
||||||
|
|
||||||
|
You must configure this setting in order to enable password reset and [generation](../users/README.md#automatically-generate-password) emails.
|
||||||
|
|
||||||
|
### Enable Proxy Support
|
||||||
|
|
||||||
|
If you have Overseerr behind a [reverse proxy](../../extending-overseerr/reverse-proxy.md), enable this setting to allow Overseerr to correctly register client IP addresses. For details, please see the [Express documentation](http://expressjs.com/en/guide/behind-proxies.html).
|
||||||
|
|
||||||
|
This setting is **disabled** by default.
|
||||||
|
|
||||||
|
### Enable CSRF Protection
|
||||||
|
|
||||||
|
{% hint style="danger" %}
|
||||||
|
**This is an advanced setting.** We do not recommend enabling it unless you understand the implications of doing so.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
CSRF stands for [cross-site request forgery](https://en.wikipedia.org/wiki/Cross-site_request_forgery). When this setting is enabled, all external API access that alters Overseerr application data is blocked.
|
||||||
|
|
||||||
|
If you do not use Overseerr integrations with third-party applications to add/modify/delete requests or users, you can consider enabling this setting to protect against malicious attacks.
|
||||||
|
|
||||||
|
One caveat, however, is that _HTTPS is required_, meaning that once this setting is enabled, you will no longer be able to access your Overseerr instance over HTTP (including using an IP address and port number).
|
||||||
|
|
||||||
|
If you enable this setting and find yourself unable to access Overseerr, you can disable the setting by modifying `settings.json` in `/app/config`.
|
||||||
|
|
||||||
|
This setting is **disabled** by default.
|
||||||
|
|
||||||
|
### Display Language
|
||||||
|
|
||||||
|
Set the default display language for Overseerr. Users can override this setting in their user settings.
|
||||||
|
|
||||||
|
### Discover Region & Discover Language
|
||||||
|
|
||||||
|
These settings filter content shown on the "Discover" home page based on regional availability and original language, respectively. Users can override these global settings by configuring these same options in their user settings.
|
||||||
|
|
||||||
|
### Hide Available Media
|
||||||
|
|
||||||
|
When enabled, media which is already available will not appear on the "Discover" home page, or in the "Recommended" or "Similar" categories or other links on media detail pages.
|
||||||
|
|
||||||
|
Available media will still appear in search results, however, so it is possible to locate and view hidden items by searching for them by title.
|
||||||
|
|
||||||
|
This setting is **disabled** by default.
|
||||||
|
|
||||||
|
### Allow Partial Series Requests
|
||||||
|
|
||||||
|
When enabled, users will be able to submit requests for specific seasons of TV series. If disabled, users will only be able to submit requests for all unavailable seasons.
|
||||||
|
|
||||||
|
This setting is **enabled** by default.
|
||||||
|
|
||||||
|
## Users
|
||||||
|
|
||||||
|
### Enable Local Sign-In
|
||||||
|
|
||||||
|
When enabled, users who have configured passwords will be allowed to sign in using their email address.
|
||||||
|
|
||||||
|
When disabled, Plex OAuth becomes the only sign-in option, and any "local users" you have created will not be able to sign in to Overseerr.
|
||||||
|
|
||||||
|
This setting is **enabled** by default.
|
||||||
|
|
||||||
|
### Enable New Plex Sign-In
|
||||||
|
|
||||||
|
When enabled, users with access to your Plex server will be able to sign in to Overseerr even if they have not yet been imported. Users will be automatically assigned the permissions configured in the [Default Permissions](#default-permissions) setting upon first sign-in.
|
||||||
|
|
||||||
|
This setting is **enabled** by default.
|
||||||
|
|
||||||
|
### Global Movie Request Limit & Global Series Request Limit
|
||||||
|
|
||||||
|
Select the request limits you would like granted to users.
|
||||||
|
|
||||||
|
Unless an [override](../users/README.md#movie-request-limit-and-series-request-limit) is configured, users are granted these global request limits.
|
||||||
|
|
||||||
|
Note that users with the **Manage Users** permission are exempt from request limits, since that permission also grants the ability to submit requests on behalf of other users.
|
||||||
|
|
||||||
|
### Default Permissions
|
||||||
|
|
||||||
|
Select the permissions you would like assigned to new users to have by default upon account creation.
|
||||||
|
|
||||||
|
If [Enable New Plex Sign-In](#enable-new-plex-sign-in) is enabled, any user with access to your Plex server will be able to sign in to Overseerr, and they will be granted the permissions you select here upon first sign-in.
|
||||||
|
|
||||||
|
This setting only affects new users, and has no impact on existing users. In order to modify permissions for existing users, you will need to [edit the users](../users/README.md#editing-users).
|
||||||
|
|
||||||
|
## Plex
|
||||||
|
|
||||||
|
### Plex Settings
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
To set up Plex, you can either enter your details manually or select a server retrieved from [plex.tv](https://plex.tv/). Press the button to the right of the "Server" dropdown to retrieve available servers.
|
||||||
|
|
||||||
|
Depending on your setup/configuration, you may need to enter your Plex server details manually in order to establish a connection from Overseerr.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
#### Hostname or IP Address
|
||||||
|
|
||||||
|
If you have Overseerr installed on the same network as Plex, you can set this to the local IP address of your Plex server. Otherwise, this should be set to a valid hostname (e.g., `plex.myawesomeserver.com`).
|
||||||
|
|
||||||
|
#### Port
|
||||||
|
|
||||||
|
This value should be set to the port that your Plex server listens on. The default port that Plex uses is `32400`, but you may need to set this to `443` or some other value if your Plex server is hosted on a VPS or cloud provider.
|
||||||
|
|
||||||
|
#### Use SSL
|
||||||
|
|
||||||
|
Enable this setting to connect to Plex via HTTPS rather than HTTP. Note that self-signed certificates are _not_ supported.
|
||||||
|
|
||||||
|
#### Web App URL (optional)
|
||||||
|
|
||||||
|
The **Play on Plex** buttons on media pages link to items on your Plex server. By default, these links use the [Plex Web App](https://support.plex.tv/articles/200288666-opening-plex-web-app/) hosted from plex.tv, but you can provide the URL to the web app on your Plex server and we'll use that instead!
|
||||||
|
|
||||||
|
Note that you will need to enter the full path to the web app (e.g., `https://plex.myawesomeserver.com/web`).
|
||||||
|
|
||||||
|
### Plex Libraries
|
||||||
|
|
||||||
|
In this section, simply select the libraries you would like Overseerr to scan. Overseerr will periodically check the selected libraries for available content to update the media status that is displayed to users.
|
||||||
|
|
||||||
|
If you do not see your Plex libraries listed, verify your Plex settings are correct and click the **Sync Libraries** button.
|
||||||
|
|
||||||
|
### Manual Library Scan
|
||||||
|
|
||||||
|
Overseerr will perform a full scan of your Plex libraries once every 24 hours (recently added items are fetched more frequently). If this is your first time configuring Plex, a one-time full manual library scan is recommended!
|
||||||
|
|
||||||
|
## Services
|
||||||
|
|
||||||
|
{% hint style="info" %}
|
||||||
|
**If you keep separate copies of non-4K and 4K content in your media libraries, you will need to set up multiple Radarr/Sonarr instances and link each of them to Overseerr.**
|
||||||
|
|
||||||
|
Overseerr checks these linked servers to determine whether or not media has already been requested or is available, so two servers of each type are required _if you keep separate non-4K and 4K copies of media_.
|
||||||
|
|
||||||
|
**If you only maintain one copy of media, you can instead simply set up one server and set the "Quality Profile" setting on a per-request basis.**
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
### Radarr/Sonarr Settings
|
||||||
|
|
||||||
|
{% hint style="warning" %}
|
||||||
|
**Only v3 Radarr/Sonarr servers are supported!** If your Radarr/Sonarr server is still running v2, you will need to upgrade in order to add it to Overseerr.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
|
#### Default Server
|
||||||
|
|
||||||
|
At least one server needs to be marked as "Default" in order for requests to be sent successfully to Radarr/Sonarr.
|
||||||
|
|
||||||
|
If you have separate 4K Radarr/Sonarr servers, you need to designate default 4K servers _in addition to_ default non-4K servers.
|
||||||
|
|
||||||
|
#### 4K Server
|
||||||
|
|
||||||
|
Only select this option if you have separate non-4K and 4K servers. If you only have a single Radarr/Sonarr server, do _not_ check this box!
|
||||||
|
|
||||||
|
#### Server Name
|
||||||
|
|
||||||
|
Enter a friendly name for the Radarr/Sonarr server.
|
||||||
|
|
||||||
|
#### Hostname or IP Address
|
||||||
|
|
||||||
|
If you have Overseerr installed on the same network as Radarr/Sonarr, you can set this to the local IP address of your Radarr/Sonarr server. Otherwise, this should be set to a valid hostname (e.g., `radarr.myawesomeserver.com`).
|
||||||
|
|
||||||
|
#### Port
|
||||||
|
|
||||||
|
This value should be set to the port that your Radarr/Sonarr server listens on. By default, Radarr uses port `7878` and Sonarr uses port `8989`, but you may need to set this to `443` or some other value if your Radarr/Sonarr server is hosted on a VPS or cloud provider.
|
||||||
|
|
||||||
|
#### Use SSL
|
||||||
|
|
||||||
|
Enable this setting to connect to Radarr/Sonarr via HTTPS rather than HTTP. Note that self-signed certificates are _not_ supported.
|
||||||
|
|
||||||
|
#### API Key
|
||||||
|
|
||||||
|
Enter your Radarr/Sonarr API key here. Do _not_ share these key publicly, as they can be used to gain administrator access to your Radarr/Sonarr servers!
|
||||||
|
|
||||||
|
You can locate the required API keys in Radarr/Sonarr in **Settings → General → Security**.
|
||||||
|
|
||||||
|
#### URL Base
|
||||||
|
|
||||||
|
If you have configured a URL base for your Radarr/Sonarr server, you _must_ enter it here in order for Overseerr to connect to those services!
|
||||||
|
|
||||||
|
You can verify whether or not you have a URL base configured in your Radarr/Sonarr server at **Settings → General → Host**. (Note that a restart of your Radarr/Sonarr server is required if you modify this setting!)
|
||||||
|
|
||||||
|
#### Profiles, Root Folder, Minimum Availability
|
||||||
|
|
||||||
|
Select the default settings you would like to use for all new requests. Note that all of these options are required, and that requests will fail if any of these are not configured!
|
||||||
|
|
||||||
|
#### External URL (optional)
|
||||||
|
|
||||||
|
If the hostname or IP address you configured above is not accessible outside your network, you can set a different URL here. This "external" URL is used to add clickable links to your Radarr/Sonarr servers on media detail pages.
|
||||||
|
|
||||||
|
#### Enable Scan (optional)
|
||||||
|
|
||||||
|
Enable this setting if you would like to scan your Radarr/Sonarr server for existing media/request status. It is recommended that you enable this setting, so that users cannot submit requests for media which has already been requested or is already available.
|
||||||
|
|
||||||
|
#### Enable Automatic Search (optional)
|
||||||
|
|
||||||
|
Enable this setting to have Radarr/Sonarr to automatically search for media upon approval of a request.
|
||||||
|
|
||||||
|
## Notifications
|
||||||
|
|
||||||
|
Please see [Notifications](../notifications/README.md) for details on configuring and enabling notifications.
|
||||||
|
|
||||||
|
## Jobs & Cache
|
||||||
|
|
||||||
|
Overseerr performs certain maintenance tasks as regularly-scheduled jobs, but they can also be manually triggered on this page.
|
||||||
|
|
||||||
|
Overseerr also caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls. If necessary, the cache for any particular endpoint can be cleared by clicking the "Flush Cache" button.
|
||||||
79
docs/using-overseerr/users/README.md
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# Users
|
||||||
|
|
||||||
|
## Owner Account
|
||||||
|
|
||||||
|
The user account created during Overseerr setup is the "Owner" account, which cannot be deleted or modified by other users. This account's credentials are used to authenticate with Plex.
|
||||||
|
|
||||||
|
## Adding Users
|
||||||
|
|
||||||
|
There are currently two methods to add users to Overseerr: importing Plex users and creating "local users." All new users are created with the [default permissions](../settings/README.md#default-permissions) defined in **Settings → Users**.
|
||||||
|
|
||||||
|
### Importing Users from Plex
|
||||||
|
|
||||||
|
Clicking the **Import Users from Plex** button on the **User List** page will fetch the list of users with access to the Plex server from [plex.tv](https://www.plex.tv/), and add them to Overseerr automatically.
|
||||||
|
|
||||||
|
Importing Plex users is not required, however. Any user with access to the Plex server can log in to Overseerr even if they have not been imported, and will be assigned the configured [default permissions](../settings/README.md#default-permissions) upon their first login.
|
||||||
|
|
||||||
|
### Creating Local Users
|
||||||
|
|
||||||
|
If you would like to grant Overseerr access to a user who doesn't have their own Plex account and/or access to the Plex server, you can manually add them by clicking the **Create Local User** button.
|
||||||
|
|
||||||
|
#### Email Address
|
||||||
|
|
||||||
|
Enter a valid email address at which the user can receive messages pertaining to their account and other notifications. The email address currently cannot be modified after the account is created.
|
||||||
|
|
||||||
|
#### Automatically Generate Password
|
||||||
|
|
||||||
|
If an [application URL](../settings/README.md#application-url) is set and [email notifications](../notifications/email.md) have been configured and enabled, Overseerr can automatically generate a password for the new user.
|
||||||
|
|
||||||
|
#### Password
|
||||||
|
|
||||||
|
If you would prefer to manually configure a password, enter a password here that is a minimum of 8 characters.
|
||||||
|
|
||||||
|
## Editing Users
|
||||||
|
|
||||||
|
From the **User List**, you can click the **Edit** button to modify a particular user's settings.
|
||||||
|
|
||||||
|
You can also click the check boxes and click the **Bulk Edit** button to set user permissions for multiple users at once.
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
#### Display Name
|
||||||
|
|
||||||
|
You can optionally set a "friendly name" for any user. This name will be used in lieu of their Plex username (for users imported from Plex) or their email address (for manually-created local users).
|
||||||
|
|
||||||
|
#### Display Language
|
||||||
|
|
||||||
|
Users can override the [global display language](../settings/README.md#display-language) to use Overseerr in their preferred language.
|
||||||
|
|
||||||
|
#### Discover Region & Discover Language
|
||||||
|
|
||||||
|
Users can override the [global filter settings](../settings/README.md#discover-region-and-discover-language) to suit their own preferences.
|
||||||
|
|
||||||
|
#### Movie Request Limit & Series Request Limit
|
||||||
|
|
||||||
|
You can override the default settings and assign different request limits for specific users by checking the **Enable Override** box and selecting the desired request limit and time period.
|
||||||
|
|
||||||
|
Unless an override is configured, users are granted the global request limits.
|
||||||
|
|
||||||
|
Note that users with the **Manage Users** permission are exempt from request limits, since that permission also grants the ability to submit requests on behalf of other users.
|
||||||
|
|
||||||
|
Users are also unable to modify their own request limits.
|
||||||
|
|
||||||
|
### Password
|
||||||
|
|
||||||
|
All "local users" are assigned passwords upon creation, but users imported from Plex can also optionally configure passwords to enable sign-in using their email address.
|
||||||
|
|
||||||
|
Passwords must be a minimum of 8 characters long.
|
||||||
|
|
||||||
|
### Notifications
|
||||||
|
|
||||||
|
Users can configure their personal notification settings here. Please see [Notifications](../notifications/README.md) for details on configuring and enabling notifications.
|
||||||
|
|
||||||
|
### Permissions
|
||||||
|
|
||||||
|
Users cannot modify their own permissions. Users with the **Manage Users** permission can manage permissions of other users, except those of users with the **Admin** permission.
|
||||||
|
|
||||||
|
## Deleting Users
|
||||||
|
|
||||||
|
When users are deleted, all of their data and request history is also cleared from the database.
|
||||||
4
next-env.d.ts
vendored
@@ -1,2 +1,6 @@
|
|||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
/// <reference types="next/types/global" />
|
/// <reference types="next/types/global" />
|
||||||
|
/// <reference types="next/image-types/global" />
|
||||||
|
|
||||||
|
// NOTE: This file should not be edited
|
||||||
|
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ module.exports = {
|
|||||||
env: {
|
env: {
|
||||||
commitTag: process.env.COMMIT_TAG || 'local',
|
commitTag: process.env.COMMIT_TAG || 'local',
|
||||||
},
|
},
|
||||||
|
images: {
|
||||||
|
domains: ['image.tmdb.org'],
|
||||||
|
},
|
||||||
webpack(config) {
|
webpack(config) {
|
||||||
config.module.rules.push({
|
config.module.rules.push({
|
||||||
test: /\.svg$/,
|
test: /\.svg$/,
|
||||||
issuer: {
|
issuer: /\.(js|ts)x?$/,
|
||||||
test: /\.(js|ts)x?$/,
|
|
||||||
},
|
|
||||||
use: ['@svgr/webpack'],
|
use: ['@svgr/webpack'],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const devConfig = {
|
|||||||
synchronize: true,
|
synchronize: true,
|
||||||
migrationsRun: false,
|
migrationsRun: false,
|
||||||
logging: false,
|
logging: false,
|
||||||
|
enableWAL: true,
|
||||||
entities: ['server/entity/**/*.ts'],
|
entities: ['server/entity/**/*.ts'],
|
||||||
migrations: ['server/migration/**/*.ts'],
|
migrations: ['server/migration/**/*.ts'],
|
||||||
subscribers: ['server/subscriber/**/*.ts'],
|
subscribers: ['server/subscriber/**/*.ts'],
|
||||||
@@ -22,6 +23,7 @@ const prodConfig = {
|
|||||||
: 'config/db/db.sqlite3',
|
: 'config/db/db.sqlite3',
|
||||||
synchronize: false,
|
synchronize: false,
|
||||||
logging: false,
|
logging: false,
|
||||||
|
enableWAL: true,
|
||||||
entities: ['dist/entity/**/*.js'],
|
entities: ['dist/entity/**/*.js'],
|
||||||
migrations: ['dist/migration/**/*.js'],
|
migrations: ['dist/migration/**/*.js'],
|
||||||
migrationsRun: false,
|
migrationsRun: false,
|
||||||
|
|||||||
1012
overseerr-api.yml
181
package.json
@@ -9,7 +9,7 @@
|
|||||||
"build": "yarn build:next && yarn build:server",
|
"build": "yarn build:next && yarn build:server",
|
||||||
"lint": "eslint \"./server/**/*.{ts,tsx}\" \"./src/**/*.{ts,tsx}\"",
|
"lint": "eslint \"./server/**/*.{ts,tsx}\" \"./src/**/*.{ts,tsx}\"",
|
||||||
"start": "NODE_ENV=production node dist/index.js",
|
"start": "NODE_ENV=production node dist/index.js",
|
||||||
"i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault false \"./src/**/!(*.test).{ts,tsx}\"",
|
"i18n:extract": "extract-messages -l=en -o src/i18n/locale -d en --flat true --overwriteDefault true \"./src/**/!(*.test).{ts,tsx}\"",
|
||||||
"migration:generate": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:generate",
|
"migration:generate": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:generate",
|
||||||
"migration:create": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:create",
|
"migration:create": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:create",
|
||||||
"migration:run": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:run",
|
"migration:run": "ts-node --project server/tsconfig.json ./node_modules/.bin/typeorm migration:run",
|
||||||
@@ -17,118 +17,124 @@
|
|||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@headlessui/react": "^0.3.1",
|
"@headlessui/react": "^1.4.1",
|
||||||
|
"@heroicons/react": "^1.0.4",
|
||||||
"@supercharge/request-ip": "^1.1.2",
|
"@supercharge/request-ip": "^1.1.2",
|
||||||
"@svgr/webpack": "^5.5.0",
|
"@svgr/webpack": "^5.5.0",
|
||||||
|
"@tanem/react-nprogress": "^3.0.79",
|
||||||
"ace-builds": "^1.4.12",
|
"ace-builds": "^1.4.12",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.4",
|
||||||
"bcrypt": "^5.0.0",
|
"bcrypt": "^5.0.1",
|
||||||
"body-parser": "^1.19.0",
|
|
||||||
"bowser": "^2.11.0",
|
"bowser": "^2.11.0",
|
||||||
"connect-typeorm": "^1.1.4",
|
"connect-typeorm": "^1.1.4",
|
||||||
"cookie-parser": "^1.4.5",
|
"cookie-parser": "^1.4.5",
|
||||||
"country-code-emoji": "^2.2.0",
|
"copy-to-clipboard": "^3.3.1",
|
||||||
|
"country-flag-icons": "^1.4.10",
|
||||||
"csurf": "^1.11.0",
|
"csurf": "^1.11.0",
|
||||||
"email-templates": "^8.0.3",
|
"email-templates": "^8.0.8",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-openapi-validator": "^4.11.0",
|
"express-openapi-validator": "^4.13.1",
|
||||||
"express-session": "^1.17.1",
|
"express-rate-limit": "^5.3.0",
|
||||||
"formik": "^2.2.6",
|
"express-session": "^1.17.2",
|
||||||
"gravatar-url": "^3.1.0",
|
"formik": "^2.2.9",
|
||||||
|
"gravatar-url": "3.1.0",
|
||||||
"intl": "^1.2.5",
|
"intl": "^1.2.5",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"next": "10.0.3",
|
"next": "11.1.2",
|
||||||
"node-cache": "^5.1.2",
|
"node-cache": "^5.1.2",
|
||||||
"node-schedule": "^2.0.0",
|
"node-schedule": "^2.0.0",
|
||||||
"nodemailer": "^6.4.18",
|
"nodemailer": "^6.6.3",
|
||||||
"nookies": "^2.5.2",
|
"openpgp": "^5.0.0-3",
|
||||||
"plex-api": "^5.3.1",
|
"plex-api": "^5.3.1",
|
||||||
"pug": "^3.0.0",
|
"pug": "^3.0.2",
|
||||||
"react": "17.0.1",
|
"react": "17.0.2",
|
||||||
"react-ace": "^9.3.0",
|
"react-ace": "^9.3.0",
|
||||||
"react-animate-height": "^2.0.23",
|
"react-animate-height": "^2.0.23",
|
||||||
"react-dom": "17.0.1",
|
"react-dom": "17.0.2",
|
||||||
"react-intersection-observer": "^8.31.0",
|
"react-intersection-observer": "^8.32.1",
|
||||||
"react-intl": "^5.12.5",
|
"react-intl": "5.20.10",
|
||||||
"react-markdown": "^5.0.3",
|
"react-markdown": "^6.0.2",
|
||||||
"react-spring": "^8.0.27",
|
"react-select": "^4.3.1",
|
||||||
"react-toast-notifications": "^2.4.3",
|
"react-spring": "^9.2.4",
|
||||||
"react-transition-group": "^4.4.1",
|
"react-toast-notifications": "^2.5.1",
|
||||||
|
"react-transition-group": "^4.4.2",
|
||||||
"react-truncate-markup": "^5.1.0",
|
"react-truncate-markup": "^5.1.0",
|
||||||
"react-use-clipboard": "1.0.7",
|
"react-use-clipboard": "1.0.7",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"secure-random-password": "^0.2.2",
|
"secure-random-password": "^0.2.3",
|
||||||
"sqlite3": "^5.0.2",
|
"sqlite3": "^5.0.2",
|
||||||
"swagger-ui-express": "^4.1.6",
|
"swagger-ui-express": "^4.1.6",
|
||||||
"swr": "^0.4.2",
|
"swr": "^0.5.6",
|
||||||
"typeorm": "^0.2.31",
|
"typeorm": "0.2.37",
|
||||||
"uuid": "^8.3.2",
|
"web-push": "^3.4.5",
|
||||||
"winston": "^3.3.3",
|
"winston": "^3.3.3",
|
||||||
"winston-daily-rotate-file": "^4.5.0",
|
"winston-daily-rotate-file": "^4.5.5",
|
||||||
"xml2js": "^0.4.23",
|
"xml2js": "^0.4.23",
|
||||||
"yamljs": "^0.3.0",
|
"yamljs": "^0.3.0",
|
||||||
"yup": "^0.32.9"
|
"yup": "^0.32.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.12.17",
|
"@babel/cli": "^7.15.7",
|
||||||
"@commitlint/cli": "^11.0.0",
|
"@commitlint/cli": "^13.1.0",
|
||||||
"@commitlint/config-conventional": "^11.0.0",
|
"@commitlint/config-conventional": "^13.1.0",
|
||||||
"@fullhuman/postcss-purgecss": "3.0.0",
|
"@fullhuman/postcss-purgecss": "3.0.0",
|
||||||
"@semantic-release/changelog": "^5.0.1",
|
"@semantic-release/changelog": "^5.0.1",
|
||||||
"@semantic-release/commit-analyzer": "^8.0.1",
|
"@semantic-release/commit-analyzer": "^9.0.1",
|
||||||
"@semantic-release/exec": "^5.0.0",
|
"@semantic-release/exec": "^5.0.0",
|
||||||
"@semantic-release/git": "^9.0.0",
|
"@semantic-release/git": "^9.0.1",
|
||||||
"@tailwindcss/aspect-ratio": "^0.2.0",
|
"@tailwindcss/aspect-ratio": "^0.2.1",
|
||||||
"@tailwindcss/forms": "^0.2.1",
|
"@tailwindcss/forms": "^0.3.3",
|
||||||
"@tailwindcss/typography": "^0.4.0",
|
"@tailwindcss/typography": "^0.4.1",
|
||||||
"@types/bcrypt": "^3.0.0",
|
"@types/bcrypt": "^5.0.0",
|
||||||
"@types/body-parser": "^1.19.0",
|
|
||||||
"@types/cookie-parser": "^1.4.2",
|
"@types/cookie-parser": "^1.4.2",
|
||||||
"@types/csurf": "^1.11.0",
|
"@types/country-flag-icons": "^1.2.0",
|
||||||
"@types/email-templates": "^8.0.2",
|
"@types/csurf": "^1.11.2",
|
||||||
"@types/express": "^4.17.11",
|
"@types/email-templates": "^8.0.4",
|
||||||
|
"@types/express": "^4.17.13",
|
||||||
|
"@types/express-rate-limit": "^5.1.3",
|
||||||
"@types/express-session": "^1.17.3",
|
"@types/express-session": "^1.17.3",
|
||||||
"@types/lodash": "^4.14.168",
|
"@types/lodash": "^4.14.173",
|
||||||
"@types/node": "^14.14.31",
|
"@types/node": "^15.6.1",
|
||||||
"@types/node-schedule": "^1.3.1",
|
"@types/node-schedule": "^1.3.2",
|
||||||
"@types/nodemailer": "^6.4.0",
|
"@types/nodemailer": "^6.4.4",
|
||||||
"@types/react": "^17.0.2",
|
"@types/react": "^17.0.22",
|
||||||
"@types/react-dom": "^17.0.1",
|
"@types/react-dom": "^17.0.9",
|
||||||
"@types/react-toast-notifications": "^2.4.0",
|
"@types/react-select": "^4.0.17",
|
||||||
"@types/react-transition-group": "^4.4.1",
|
"@types/react-toast-notifications": "^2.4.1",
|
||||||
"@types/secure-random-password": "^0.2.0",
|
"@types/react-transition-group": "^4.4.3",
|
||||||
"@types/swagger-ui-express": "^4.1.2",
|
"@types/secure-random-password": "^0.2.1",
|
||||||
"@types/uuid": "^8.3.0",
|
"@types/swagger-ui-express": "^4.1.3",
|
||||||
"@types/xml2js": "^0.4.8",
|
"@types/web-push": "^3.3.2",
|
||||||
|
"@types/xml2js": "^0.4.9",
|
||||||
"@types/yamljs": "^0.2.31",
|
"@types/yamljs": "^0.2.31",
|
||||||
"@types/yup": "^0.29.11",
|
"@types/yup": "^0.29.13",
|
||||||
"@typescript-eslint/eslint-plugin": "^4.15.1",
|
"@typescript-eslint/eslint-plugin": "^4.31.1",
|
||||||
"@typescript-eslint/parser": "^4.15.1",
|
"@typescript-eslint/parser": "^4.31.1",
|
||||||
"autoprefixer": "^10.2.4",
|
"autoprefixer": "^10.3.4",
|
||||||
"babel-plugin-react-intl": "^8.2.25",
|
"babel-plugin-react-intl": "^8.2.25",
|
||||||
"babel-plugin-react-intl-auto": "^3.3.0",
|
"babel-plugin-react-intl-auto": "^3.3.0",
|
||||||
"commitizen": "^4.2.3",
|
"commitizen": "^4.2.4",
|
||||||
"copyfiles": "^2.4.1",
|
"copyfiles": "^2.4.1",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"eslint": "^7.20.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^7.2.0",
|
"eslint-config-next": "^11.1.2",
|
||||||
"eslint-plugin-formatjs": "^2.12.4",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
"eslint-plugin-formatjs": "^2.17.6",
|
||||||
"eslint-plugin-jsx-a11y": "^6.4.1",
|
"eslint-plugin-jsx-a11y": "^6.4.1",
|
||||||
"eslint-plugin-prettier": "^3.3.1",
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
"eslint-plugin-react": "^7.22.0",
|
"eslint-plugin-react": "^7.25.3",
|
||||||
"eslint-plugin-react-hooks": "^4.2.0",
|
"eslint-plugin-react-hooks": "^4.2.0",
|
||||||
"extract-react-intl-messages": "^4.1.1",
|
"extract-react-intl-messages": "^4.1.1",
|
||||||
"husky": "4.3.8",
|
"husky": "4.3.8",
|
||||||
"lint-staged": "^10.5.4",
|
"lint-staged": "^11.1.2",
|
||||||
"nodemon": "^2.0.7",
|
"nodemon": "^2.0.12",
|
||||||
"postcss": "^8.2.6",
|
"postcss": "^8.3.6",
|
||||||
"postcss-preset-env": "^6.7.0",
|
"prettier": "^2.4.1",
|
||||||
"prettier": "^2.2.1",
|
"semantic-release": "^18.0.0",
|
||||||
"semantic-release": "^17.3.9",
|
"semantic-release-docker-buildx": "^1.0.1",
|
||||||
"semantic-release-docker": "^2.2.0",
|
"tailwindcss": "^2.2.15",
|
||||||
"tailwindcss": "npm:@tailwindcss/postcss7-compat",
|
"ts-node": "^10.2.1",
|
||||||
"ts-node": "^9.1.1",
|
"typescript": "^4.4.3"
|
||||||
"typescript": "^4.1.5"
|
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"sqlite3/node-gyp": "^5.1.0"
|
"sqlite3/node-gyp": "^5.1.0"
|
||||||
@@ -148,12 +154,10 @@
|
|||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"**/*.{ts,tsx,js}": [
|
"**/*.{ts,tsx,js}": [
|
||||||
"prettier --write",
|
"prettier --write",
|
||||||
"eslint",
|
"eslint"
|
||||||
"git add"
|
|
||||||
],
|
],
|
||||||
"**/*.{json,md}": [
|
"**/*.{json,md}": [
|
||||||
"prettier --write",
|
"prettier --write"
|
||||||
"git add"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"commitlint": {
|
"commitlint": {
|
||||||
@@ -186,13 +190,7 @@
|
|||||||
"message": "chore(release): ${nextRelease.version}"
|
"message": "chore(release): ${nextRelease.version}"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
"semantic-release-docker-buildx",
|
||||||
"@semantic-release/exec",
|
|
||||||
{
|
|
||||||
"prepareCmd": "docker build --build-arg COMMIT_TAG=$GITHUB_SHA -t sctx/overseerr ."
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"semantic-release-docker",
|
|
||||||
[
|
[
|
||||||
"@semantic-release/github",
|
"@semantic-release/github",
|
||||||
{
|
{
|
||||||
@@ -206,8 +204,19 @@
|
|||||||
"npmPublish": false,
|
"npmPublish": false,
|
||||||
"publish": [
|
"publish": [
|
||||||
{
|
{
|
||||||
"path": "semantic-release-docker",
|
"path": "semantic-release-docker-buildx",
|
||||||
"name": "sctx/overseerr"
|
"buildArgs": {
|
||||||
|
"COMMIT_TAG": "$GITHUB_SHA"
|
||||||
|
},
|
||||||
|
"imageNames": [
|
||||||
|
"sctx/overseerr",
|
||||||
|
"ghcr.io/sct/overseerr"
|
||||||
|
],
|
||||||
|
"platforms": [
|
||||||
|
"linux/amd64",
|
||||||
|
"linux/arm64",
|
||||||
|
"linux/arm/v7"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"@semantic-release/github"
|
"@semantic-release/github"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
plugins: ['tailwindcss', 'postcss-preset-env'],
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 7.9 KiB |
BIN
public/android-chrome-192x192_maskable.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 24 KiB |
BIN
public/android-chrome-512x512_maskable.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/apple-splash-1125-2436.jpg
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/apple-splash-1136-640.jpg
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/apple-splash-1170-2532.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/apple-splash-1242-2208.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/apple-splash-1242-2688.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
public/apple-splash-1284-2778.jpg
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
public/apple-splash-1334-750.jpg
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
public/apple-splash-1536-2048.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
public/apple-splash-1620-2160.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
public/apple-splash-1668-2224.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
public/apple-splash-1668-2388.jpg
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
public/apple-splash-1792-828.jpg
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/apple-splash-2048-1536.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/apple-splash-2048-2732.jpg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/apple-splash-2160-1620.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/apple-splash-2208-1242.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
public/apple-splash-2224-1668.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/apple-splash-2388-1668.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/apple-splash-2436-1125.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
public/apple-splash-2532-1170.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/apple-splash-2688-1242.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/apple-splash-2732-2048.jpg
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
public/apple-splash-2778-1284.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/apple-splash-640-1136.jpg
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/apple-splash-750-1334.jpg
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
public/apple-splash-828-1792.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 7.0 KiB |
BIN
public/badge-128x128.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/clock-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
public/cog-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 774 B |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -1 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg version="1.1" viewBox="0 0 1024 1025" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><rect id="a" width="1024" height="1024"/><clipPath id="b"><use clip-rule="evenodd" xlink:href="#a"/></clipPath></defs><g clip-path="url(#b)"><use fill="#24292E" fill-opacity="0" xlink:href="#a"/><g transform="translate(70 18)"><path d="m105.3 156.12l7.522 719.97c-60.173 7.579-105.3-22.736-105.3-83.364l-7.5216-598.71c0-189.46 173-234.94 278.3-159.15l534.03 310.72c75.216 53.05 90.259 151.57 52.651 219.78-7.522-53.05-30.086-83.365-75.216-113.68l-601.73-341.04c-45.13-30.315-82.738-22.736-82.738 45.471z" fill="#fff"/><path transform="translate(60.173 535.05)" d="m0 378.93c45.13 15.158 90.259 7.579 127.87-15.157l616.77-363.77c37.607 53.05 30.086 106.1-15.044 136.42l-518.99 303.14c-75.216 37.893-173 0-210.6-60.629z" fill="#fff"/><path transform="translate(240.69 284.95)" d="M0 416.822L368.558 204.622L7.52159 0L0 416.822Z" fill="#FFC230"/></g></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 1023 B |
@@ -1 +0,0 @@
|
|||||||
<svg height="216.9" viewBox="0 0 216.7 216.9" width="216.7" xmlns="http://www.w3.org/2000/svg"> <path clip-rule="evenodd" d="M216.7 108.45c0 29.833-10.533 55.4-31.6 76.7-.7.833-1.483 1.6-2.35 2.3-3.466 3.4-7.133 6.484-11 9.25-18.267 13.467-39.367 20.2-63.3 20.2-23.967 0-45.033-6.733-63.2-20.2-4.8-3.4-9.3-7.25-13.5-11.55-16.367-16.266-26.417-35.167-30.15-56.7-.733-4.2-1.217-8.467-1.45-12.8-.1-2.4-.15-4.8-.15-7.2 0-2.533.05-4.95.15-7.25 0-.233.066-.467.2-.7 1.567-26.6 12.033-49.583 31.4-68.95C53.05 10.517 78.617 0 108.45 0c29.933 0 55.484 10.517 76.65 31.55 21.067 21.433 31.6 47.067 31.6 76.9z" fill="#EEE" fill-rule="evenodd"/> <path clip-rule="evenodd" d="M194.65 42.5l-22.4 22.4C159.152 77.998 158 89.4 158 109.5c0 17.934 2.852 34.352 16.2 47.7 9.746 9.746 19 18.95 19 18.95-2.5 3.067-5.2 6.067-8.1 9-.7.833-1.483 1.6-2.35 2.3-2.533 2.5-5.167 4.817-7.9 6.95l-17.55-17.55c-15.598-15.6-27.996-17.1-48.6-17.1-19.77 0-33.223 1.822-47.7 16.3-8.647 8.647-18.55 18.6-18.55 18.6-3.767-2.867-7.333-6.034-10.7-9.5-2.8-2.8-5.417-5.667-7.85-8.6 0 0 9.798-9.848 19.15-19.2 13.852-13.853 16.1-29.916 16.1-47.85 0-17.5-2.874-33.823-15.6-46.55-8.835-8.836-21.05-21-21.05-21 2.833-3.6 5.917-7.067 9.25-10.4 2.934-2.867 5.934-5.55 9-8.05L61.1 43.85C74.102 56.852 90.767 60.2 108.7 60.2c18.467 0 35.077-3.577 48.6-17.1 8.32-8.32 19.3-19.25 19.3-19.25 2.9 2.367 5.733 4.933 8.5 7.7 3.467 3.533 6.65 7.183 9.55 10.95z" fill="#3A3F51" fill-rule="evenodd"/> <g clip-rule="evenodd"> <path d="M78.7 114c-.2-1.167-.332-2.35-.4-3.55-.032-.667-.05-1.333-.05-2 0-.7.018-1.367.05-2 0-.067.018-.133.05-.2.435-7.367 3.334-13.733 8.7-19.1 5.9-5.833 12.984-8.75 21.25-8.75 8.3 0 15.384 2.917 21.25 8.75 5.834 5.934 8.75 13.033 8.75 21.3 0 8.267-2.916 15.35-8.75 21.25-.2.233-.416.45-.65.65-.966.933-1.982 1.783-3.05 2.55-5.065 3.733-10.916 5.6-17.55 5.6s-12.466-1.866-17.5-5.6c-1.332-.934-2.582-2-3.75-3.2-4.532-4.5-7.316-9.734-8.35-15.7z" fill="#0CF" fill-rule="evenodd"/> <path d="M157.8 59.75l-15 14.65M30.785 32.526L71.65 73.25m84.6 84.25l27.808 28.78m1.855-153.894L157.8 59.75m-125.45 126l27.35-27.4" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="2"/> <path d="M157.8 59.75l-16.95 17.2M58.97 60.604l17.2 17.15M59.623 158.43l16.75-17.4m61.928-1.396l18.028 17.945" fill="none" stroke="#0CF" stroke-miterlimit="1" stroke-width="7"/> </g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.3 KiB |
BIN
public/logo.png
|
Before Width: | Height: | Size: 64 KiB |
BIN
public/logo_full.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
1
public/logo_full.svg
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
1
public/logo_stacked.svg
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
69
public/offline.html
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
|
||||||
|
<title>You are offline</title>
|
||||||
|
|
||||||
|
<!-- Inline the page's stylesheet. -->
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: helvetica, arial, sans-serif;
|
||||||
|
margin: 2em;
|
||||||
|
background-color: #111827;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #6366F1;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin-block: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>You are offline</h1>
|
||||||
|
|
||||||
|
<button type="button">↻ Reload</button>
|
||||||
|
|
||||||
|
<!-- Inline the page's JavaScript file. -->
|
||||||
|
<script>
|
||||||
|
// Manual reload feature.
|
||||||
|
document.querySelector("button").addEventListener("click", () => {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Listen to changes in the network state, reload when online.
|
||||||
|
// This handles the case when the device is completely offline.
|
||||||
|
window.addEventListener('online', () => {
|
||||||
|
window.location.reload();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check if the server is responding and reload the page if it is.
|
||||||
|
// This handles the case when the device is online, but the server
|
||||||
|
// is offline or misbehaving.
|
||||||
|
async function checkNetworkAndReload() {
|
||||||
|
try {
|
||||||
|
const response = await fetch('.');
|
||||||
|
// Verify we get a valid response from the server
|
||||||
|
if (response.status >= 200 && response.status < 500) {
|
||||||
|
window.location.reload();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// Unable to connect to the server, ignore.
|
||||||
|
}
|
||||||
|
window.setTimeout(checkNetworkAndReload, 2500);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkNetworkAndReload();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1
public/os_icon.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" fill="none" viewBox="0 0 96 96"><path fill="url(#paint0_linear)" fill-rule="evenodd" d="M48 96C74.5097 96 96 74.5097 96 48C96 21.4903 74.5097 0 48 0C21.4903 0 0 21.4903 0 48C0 74.5097 21.4903 96 48 96ZM80.0001 52C80.0001 67.464 67.4641 80 52.0001 80C36.5361 80 24.0001 67.464 24.0001 52C24.0001 49.1303 24.4318 46.3615 25.2338 43.7548C27.4288 48.6165 32.3194 52 38.0001 52C45.7321 52 52.0001 45.732 52.0001 38C52.0001 32.3192 48.6166 27.4287 43.755 25.2337C46.3616 24.4317 49.1304 24 52.0001 24C67.4641 24 80.0001 36.536 80.0001 52Z" clip-rule="evenodd"/><path fill="#131928" fill-rule="evenodd" d="M80.0002 52C80.0002 67.464 67.4642 80 52.0002 80C36.864 80 24.5329 67.9897 24.017 52.9791C24.0057 53.318 24 53.6583 24 54C24 70.5685 37.4315 84 54 84C70.5685 84 84 70.5685 84 54C84 37.4315 70.5685 24 54 24C53.6597 24 53.3207 24.0057 52.9831 24.0169C67.9919 24.5347 80.0002 36.865 80.0002 52Z" clip-rule="evenodd" opacity=".2"/><path fill="url(#paint1_linear)" fill-rule="evenodd" d="M48 12C28.1177 12 12 28.1177 12 48C12 50.2091 10.2091 52 8 52C5.79086 52 4 50.2091 4 48C4 23.6995 23.6995 4 48 4C50.2091 4 52 5.79086 52 8C52 10.2091 50.2091 12 48 12Z" clip-rule="evenodd"/><defs><linearGradient id="paint0_linear" x1="48" x2="117.5" y1="0" y2="69.5" gradientUnits="userSpaceOnUse"><stop stop-color="#C395FC"/><stop offset="1" stop-color="#4F65F5"/></linearGradient><linearGradient id="paint1_linear" x1="28" x2="28" y1="8" y2="48" gradientUnits="userSpaceOnUse"><stop stop-color="#fff" stop-opacity=".4"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient></defs></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
BIN
public/os_logo_filled.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 504 KiB |
@@ -4,17 +4,77 @@
|
|||||||
"start_url": "./",
|
"start_url": "./",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "/android-chrome-192x192.png",
|
"src": "./android-chrome-192x192.png",
|
||||||
"sizes": "192x192",
|
"sizes": "192x192",
|
||||||
"type": "image/png"
|
"type": "image/png",
|
||||||
|
"purpose": "any"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"src": "/android-chrome-512x512.png",
|
"src": "./android-chrome-192x192_maskable.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "./android-chrome-512x512.png",
|
||||||
"sizes": "512x512",
|
"sizes": "512x512",
|
||||||
"type": "image/png"
|
"type": "image/png",
|
||||||
|
"purpose": "any"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "./android-chrome-512x512_maskable.png",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"theme_color": "#2d3748",
|
"theme_color": "#1f2937",
|
||||||
"background_color": "#2d3748",
|
"background_color": "#1f2937",
|
||||||
"display": "standalone"
|
"display": "standalone",
|
||||||
|
"shortcuts": [
|
||||||
|
{
|
||||||
|
"name": "Discover",
|
||||||
|
"url": "./",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "./sparkles-icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Requests",
|
||||||
|
"url": "./requests",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "./clock-icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Profile",
|
||||||
|
"url": "./profile",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "./user-icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Settings",
|
||||||
|
"url": "./profile/settings",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "./cog-icon-192x192.png",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
public/sparkles-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
139
public/sw.js
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/* eslint-disable no-undef */
|
||||||
|
// Incrementing OFFLINE_VERSION will kick off the install event and force
|
||||||
|
// previously cached resources to be updated from the network.
|
||||||
|
// This variable is intentionally declared and unused.
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
const OFFLINE_VERSION = 3;
|
||||||
|
const CACHE_NAME = "offline";
|
||||||
|
// Customize this with a different URL if needed.
|
||||||
|
const OFFLINE_URL = "/offline.html";
|
||||||
|
|
||||||
|
self.addEventListener("install", (event) => {
|
||||||
|
event.waitUntil(
|
||||||
|
(async () => {
|
||||||
|
const cache = await caches.open(CACHE_NAME);
|
||||||
|
// Setting {cache: 'reload'} in the new request will ensure that the
|
||||||
|
// response isn't fulfilled from the HTTP cache; i.e., it will be from
|
||||||
|
// the network.
|
||||||
|
await cache.add(new Request(OFFLINE_URL, { cache: "reload" }));
|
||||||
|
})()
|
||||||
|
);
|
||||||
|
// Force the waiting service worker to become the active service worker.
|
||||||
|
self.skipWaiting();
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener("activate", (event) => {
|
||||||
|
event.waitUntil(
|
||||||
|
(async () => {
|
||||||
|
// Enable navigation preload if it's supported.
|
||||||
|
// See https://developers.google.com/web/updates/2017/02/navigation-preload
|
||||||
|
if ("navigationPreload" in self.registration) {
|
||||||
|
await self.registration.navigationPreload.enable();
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Tell the active service worker to take control of the page immediately.
|
||||||
|
clients.claim();
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener("fetch", (event) => {
|
||||||
|
// We only want to call event.respondWith() if this is a navigation request
|
||||||
|
// for an HTML page.
|
||||||
|
if (event.request.mode === "navigate") {
|
||||||
|
event.respondWith(
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
// First, try to use the navigation preload response if it's supported.
|
||||||
|
const preloadResponse = await event.preloadResponse;
|
||||||
|
if (preloadResponse) {
|
||||||
|
return preloadResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always try the network first.
|
||||||
|
const networkResponse = await fetch(event.request);
|
||||||
|
return networkResponse;
|
||||||
|
} catch (error) {
|
||||||
|
// catch is only triggered if an exception is thrown, which is likely
|
||||||
|
// due to a network error.
|
||||||
|
// If fetch() returns a valid HTTP response with a response code in
|
||||||
|
// the 4xx or 5xx range, the catch() will NOT be called.
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log("Fetch failed; returning offline page instead.", error);
|
||||||
|
|
||||||
|
const cache = await caches.open(CACHE_NAME);
|
||||||
|
const cachedResponse = await cache.match(OFFLINE_URL);
|
||||||
|
return cachedResponse;
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener('push', (event) => {
|
||||||
|
const payload = event.data ? event.data.json() : {};
|
||||||
|
|
||||||
|
const options = {
|
||||||
|
body: payload.message,
|
||||||
|
badge: 'badge-128x128.png',
|
||||||
|
icon: payload.image ? payload.image : 'android-chrome-192x192.png',
|
||||||
|
vibrate: [100, 50, 100],
|
||||||
|
data: {
|
||||||
|
dateOfArrival: Date.now(),
|
||||||
|
primaryKey: '2',
|
||||||
|
actionUrl: payload.actionUrl,
|
||||||
|
requestId: payload.requestId,
|
||||||
|
},
|
||||||
|
actions: [],
|
||||||
|
}
|
||||||
|
|
||||||
|
if (payload.actionUrl){
|
||||||
|
options.actions.push(
|
||||||
|
{
|
||||||
|
action: 'viewmedia',
|
||||||
|
title: 'View Media',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (payload.notificationType === 'MEDIA_PENDING') {
|
||||||
|
options.actions.push(
|
||||||
|
{
|
||||||
|
action: 'approve',
|
||||||
|
title: 'Approve',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action: 'decline',
|
||||||
|
title: 'Decline',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
event.waitUntil(
|
||||||
|
self.registration.showNotification(payload.subject, options)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.addEventListener('notificationclick', (event) => {
|
||||||
|
const notificationData = event.notification.data;
|
||||||
|
|
||||||
|
event.notification.close();
|
||||||
|
|
||||||
|
if (event.action === 'viewmedia') {
|
||||||
|
clients.openWindow(notificationData.actionUrl);
|
||||||
|
} else if (event.action === 'approve') {
|
||||||
|
fetch(`/api/v1/request/${notificationData.requestId}/approve`, {
|
||||||
|
method: 'POST',
|
||||||
|
});
|
||||||
|
|
||||||
|
clients.openWindow(notificationData.actionUrl);
|
||||||
|
} else if (event.action === 'decline') {
|
||||||
|
fetch(`/api/v1/request/${notificationData.requestId}/decline`, {
|
||||||
|
method: 'POST',
|
||||||
|
});
|
||||||
|
|
||||||
|
clients.openWindow(notificationData.actionUrl);
|
||||||
|
} else if (notificationData.actionUrl) {
|
||||||
|
clients.openWindow(notificationData.actionUrl);
|
||||||
|
}
|
||||||
|
}, false);
|
||||||
BIN
public/user-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |