Skip to content
Merged

v0.3 #12

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
215 commits
Select commit Hold shift + click to select a range
7b3654e
First pass at docker
Jarvl Aug 1, 2025
d749d13
Improve Dockerfile setup
Jarvl Aug 1, 2025
def525e
Update docker-compose example
Jarvl Aug 1, 2025
7050f19
Merge branch 'lufinkey:main' into main
Jarvl Aug 1, 2025
eca24d7
Fix github action repo owner
Jarvl Aug 1, 2025
78f745a
partially available banner
lufinkey Aug 13, 2025
b792648
document sendMetadataUnavailability
lufinkey Aug 13, 2025
5f8ee58
allow sendsMetadataUnavilability to be overwritten by plugins
lufinkey Aug 13, 2025
f1d3f02
ignore plugindeps
lufinkey Aug 13, 2025
7a477eb
command flags to only install plugins and to not install plugins
lufinkey Aug 13, 2025
7656b81
install plugins ahead of time and exit if needed
lufinkey Aug 13, 2025
bb2a680
better name for installing plugins and exiting
lufinkey Aug 13, 2025
a0fb46d
separate clean if windows or not windows
lufinkey Aug 13, 2025
ff0f645
fix getting caught on exit codes
lufinkey Aug 13, 2025
552d940
fucking windows
lufinkey Aug 13, 2025
52e6754
more stupid windows bullshit
lufinkey Aug 13, 2025
d39bd0a
goddammit windows i hate you so much
lufinkey Aug 13, 2025
91e5870
pause batch script on any error on windows
lufinkey Aug 13, 2025
34138d8
dont persist environment vars after batch script
lufinkey Aug 14, 2025
ada600e
option to output full cert chain
lufinkey Aug 14, 2025
655420a
space
lufinkey Aug 14, 2025
33f2b3b
add script to build fswatch
lufinkey Aug 14, 2025
8fb0091
script to decrypt plex key and certchain
lufinkey Aug 14, 2025
2977012
pause _before_ exiting
lufinkey Aug 14, 2025
27c77f5
optionally log watched files
lufinkey Aug 15, 2025
73424e4
bun support, switch to @httptoolkit/httpolyglot
lufinkey Aug 16, 2025
22a4d60
pass args to npm node:start
lufinkey Aug 16, 2025
e4492fd
add back prepare script
lufinkey Aug 16, 2025
47e3181
remove polyfills
lufinkey Aug 16, 2025
a454fca
per-user redirect stream option
lufinkey Aug 16, 2025
9c9ec9e
vars in fswatch build script
lufinkey Aug 16, 2025
76f87fa
script to fetch traefik
lufinkey Aug 16, 2025
1327665
bash script to watch file changes
lufinkey Aug 16, 2025
af03a5f
fix typo, make platform lowercase
lufinkey Aug 16, 2025
5bc3a05
use BASH_SOURCE for base path
lufinkey Aug 16, 2025
5d9e29e
add missing bang
lufinkey Aug 16, 2025
66b2943
fix compile error
lufinkey Aug 16, 2025
effd795
fix typo
lufinkey Aug 16, 2025
33aae35
remove accidental extra fswatch call, add log for listening
lufinkey Aug 16, 2025
a0e3fa1
make keys folder if missing, output to stderr
lufinkey Aug 16, 2025
d7dd99d
make external folder if it doesnt exist
lufinkey Aug 16, 2025
85510f2
add comments to run.sh, use BASH_SOURCE
lufinkey Aug 16, 2025
3c359e5
shell script to autodecrypt plex cert
lufinkey Aug 16, 2025
447b8e6
add log for fswatch listening
lufinkey Aug 16, 2025
7bbaf16
rename privatekey filename, remove break
lufinkey Aug 16, 2025
55acb83
only set FSWATCH_VERSION if not set
lufinkey Aug 17, 2025
270f38f
dont include v in traefik version
lufinkey Aug 17, 2025
2cb8032
script to fetch prometheus
lufinkey Aug 17, 2025
06af1dd
fix separate massive logs for each header
lufinkey Aug 17, 2025
9c31f8c
add optional header modifier for plex proxy middleware
lufinkey Aug 17, 2025
98750ef
dont use http2 import
lufinkey Aug 17, 2025
c05713e
passwordlock plugin
lufinkey Aug 18, 2025
ba81e98
plexProxy middleware
lufinkey Aug 18, 2025
f193acc
fix plex client calling section prefs
lufinkey Aug 18, 2025
c776ace
just block updater check put request
lufinkey Aug 19, 2025
545cfdc
lock instructions poster, configurable titles
lufinkey Aug 19, 2025
913e4ee
metadata pages for locked section
lufinkey Aug 19, 2025
09d720f
PlexPlaylistPage => PlexPlaylistsPage, PlayQueueURIParts => PlexServe…
lufinkey Aug 19, 2025
460d856
implement password locking
lufinkey Aug 19, 2025
7373998
add password locking to README
lufinkey Aug 19, 2025
9be6339
space
lufinkey Aug 19, 2025
c3257cc
document per-user password
lufinkey Aug 19, 2025
0f4a821
Update README.md
lufinkey Aug 19, 2025
72e4544
Update README.md
lufinkey Aug 19, 2025
0d96de6
Update README.md
lufinkey Aug 19, 2025
5ae60af
fix cd into nonexistant path, add --log-watched-paths to batch script
lufinkey Aug 19, 2025
2111521
autoWhitelistedNetmask
lufinkey Aug 19, 2025
a033cab
always pass through transcode sessions since IDs are unique
lufinkey Aug 19, 2025
7b0048a
log initial watch
lufinkey Aug 19, 2025
4c3adf7
log sse proxy errors
lufinkey Aug 20, 2025
6219eb8
Instructions => Enter the password
lufinkey Aug 20, 2025
812eea0
block continue watching hub behind lock
lufinkey Aug 20, 2025
50a86ca
remove per-user stream redirect option
lufinkey Aug 20, 2025
d1cdcb0
add express-http-proxy and http-proxy to trusted dependencies
lufinkey Aug 20, 2025
728b9e8
fix ssl in bun
lufinkey Aug 20, 2025
2e30241
fix slop
lufinkey Aug 20, 2025
52ef974
fix bun run on older versions
lufinkey Aug 20, 2025
94d4124
only evaluate plex auth once, unless otherwise specified
lufinkey Aug 20, 2025
a372b71
fix issue in new plex mobile app
lufinkey Aug 20, 2025
a4ca087
add intro hub and home continueWatching hub to passwordlock
lufinkey Aug 20, 2025
4865f98
pass refreshing, agent, scanner, language to section
lufinkey Aug 20, 2025
23b5f59
fallback uuid should be random
lufinkey Aug 21, 2025
9598c75
add random uuid to docs
lufinkey Aug 21, 2025
6d58baf
compress to gzip when able, limit plex section visibility to when pin…
lufinkey Aug 21, 2025
2f79946
update bun.lock with ip-cidr
lufinkey Aug 20, 2025
f9e1ba3
better logs for plex errors
lufinkey Aug 21, 2025
0d1fa30
shorten title
lufinkey Aug 21, 2025
d28cb88
fix readme typo
lufinkey Aug 21, 2025
d68d6ea
dont hook video transcode unless redirectHost is set
lufinkey Aug 22, 2025
a621c56
allow more requests through by default
lufinkey Aug 23, 2025
9aae47b
log if remote address is undefined
lufinkey Aug 23, 2025
ee0c0f1
log remoteAddress undefined in one place, so we catch all cases
lufinkey Aug 23, 2025
c16398b
throw errors when film slug cant be parsed, log when fetching reviews
lufinkey Aug 23, 2025
583d56f
update packages
lufinkey Aug 23, 2025
566a373
dont forward notifications to eventsource for now
lufinkey Aug 23, 2025
68d823c
route upgrade request through middleware
lufinkey Aug 24, 2025
1fed5f7
empty websocket server when not authed
lufinkey Aug 24, 2025
41f54da
separate out login function
lufinkey Aug 24, 2025
1f07c13
remove other unneeded methods, disconnect websockets upon login
lufinkey Aug 24, 2025
057d135
empty eventsource when locked
lufinkey Aug 24, 2025
1a21fa5
fallback on request.ip
lufinkey Aug 24, 2025
f6a4136
another check for bad overlay name
lufinkey Aug 24, 2025
d8b03d4
update middleware line in readme
lufinkey Aug 24, 2025
363a68c
show "unlock server" action on "more ways to watch"
lufinkey Aug 24, 2025
f5a86de
remove --verbose-ws-traffic, add --log-watchedpaths to run.sh
lufinkey Aug 24, 2025
9ad78d9
options for trusting proxy
lufinkey Aug 24, 2025
6048339
add x-forwarded headers to proxied websocket requests
lufinkey Aug 24, 2025
6865a5f
always delete the forwarded header for now
lufinkey Aug 24, 2025
c5eb1a3
consistent params parsing and var names, add getAllItemsPage for section
lufinkey Aug 24, 2025
c904eb8
fix parsing hub params from hub list params
lufinkey Aug 24, 2025
b243889
/library/all handler, section all handler
lufinkey Aug 26, 2025
a11aada
fix missing query names
lufinkey Aug 26, 2025
cda9032
lock icon for unlock server button
lufinkey Aug 26, 2025
0d21e4e
use real IP when trusting proxy
lufinkey Aug 26, 2025
df40d22
empty prefs page for section
lufinkey Aug 26, 2025
abdaf0f
handle section prefs from library base path
lufinkey Aug 26, 2025
34deac7
semicolon
lufinkey Aug 26, 2025
0a6bfbe
handle section all items from library base path
lufinkey Aug 26, 2025
9c3ee30
all endpoints for section
lufinkey Aug 26, 2025
c87459c
contentDirectoryID is included on both endpoints
lufinkey Aug 26, 2025
05059f1
i guess we include event subscribers
lufinkey Aug 26, 2025
4a500c8
dont return any prefs, add IncomingPlexHttpRequest type, function for…
lufinkey Aug 26, 2025
89dfab8
real IP => identity IP
lufinkey Aug 26, 2025
1b5eb42
section collection page
lufinkey Aug 26, 2025
4011a49
fix requestable seasons hiding server items
lufinkey Aug 27, 2025
d0f31ed
remove owner only requirement for activities
lufinkey Aug 27, 2025
7d437db
include plex user email in log
lufinkey Aug 27, 2025
7bfe1f6
Update README.md
lufinkey Aug 30, 2025
5164104
Update README.md
lufinkey Aug 30, 2025
c538fff
fix constant error log about continueWatching
lufinkey Aug 31, 2025
06a9928
update packages
lufinkey Sep 1, 2025
2434683
fetch thumb from plex too
lufinkey Sep 1, 2025
63e51d7
cache year too
lufinkey Sep 1, 2025
f8df0f8
add missing thumb and year
lufinkey Sep 1, 2025
5641815
empty playlists and recently added
lufinkey Sep 1, 2025
c669239
keep track of the got dang transients
lufinkey Sep 1, 2025
ecce5df
remove async
lufinkey Sep 1, 2025
2ec9e62
no transients middleware
lufinkey Sep 1, 2025
a6a90f2
space
lufinkey Sep 1, 2025
4a320a9
add note about newer react native app
lufinkey Sep 1, 2025
d9ef491
dont block music transcodes, redirect music transcodes if enabled
lufinkey Sep 1, 2025
a792e83
accept any http request for plexServerHost and context methods
lufinkey Sep 1, 2025
b3ff95e
map users to whitelisted IPs, instead of tokens
lufinkey Sep 1, 2025
f6e9533
include more info in auth cache
lufinkey Sep 1, 2025
8c57cb2
saving unsavedChanges should also get reset, since the whole object i…
lufinkey Sep 1, 2025
050f107
if token is definitely transient, but isn't in the transient tokens c…
lufinkey Sep 1, 2025
5f92a20
comment
lufinkey Sep 1, 2025
dbd7eb4
fallback log error when setting a non-promise
lufinkey Sep 1, 2025
2bd2757
log successful and failed logins
lufinkey Sep 1, 2025
10dfdea
ensure login failures cause a real delay
lufinkey Sep 1, 2025
e374d50
per user netmasks, fix endpoint using .all
lufinkey Sep 1, 2025
1a64ab0
compare ignored paths against normalized path
lufinkey Sep 1, 2025
84fc174
turns out everyone should be able to get this one
lufinkey Sep 1, 2025
69a9715
log timestamps
lufinkey Sep 1, 2025
388379b
iso string is more descriptive
lufinkey Sep 1, 2025
c74e599
eh, i changed my mind
lufinkey Sep 1, 2025
bc4f050
comment + pass error (just in case ig?)
lufinkey Sep 1, 2025
7ce4688
no need for cast
lufinkey Sep 1, 2025
d051461
update name in screenshot
lufinkey Sep 1, 2025
2d89766
update doc image
lufinkey Sep 1, 2025
6fadd7c
no http urls
lufinkey Sep 1, 2025
fd9d250
dont encourage http urls
lufinkey Sep 1, 2025
c9340f0
log url path for unknown content type
lufinkey Sep 1, 2025
f135d4b
add note about plex host
lufinkey Sep 1, 2025
ea8ae6b
more specific about what wont work
lufinkey Sep 1, 2025
55e952b
update example config
lufinkey Sep 1, 2025
40664ff
consistent debug string for error handlers
lufinkey Sep 1, 2025
3cac62b
add method to log, rename function
lufinkey Sep 2, 2025
f3475e0
log ip and original ip, fix error thrown during error log
lufinkey Sep 2, 2025
354039c
log incoming upgrade requests, include original remote address
lufinkey Sep 2, 2025
0efd304
no need for past tense
lufinkey Sep 3, 2025
f0644e3
document autoWhitelistNetmask
lufinkey Sep 3, 2025
3f813ff
sections filter and all sections source
lufinkey Sep 3, 2025
013aaf2
hidesections plugin
lufinkey Sep 3, 2025
00384c8
proxy whitelisted video if needed
lufinkey Sep 3, 2025
1531be2
simplify
lufinkey Sep 3, 2025
7d1256a
rewrite transcode paths if needed
lufinkey Sep 4, 2025
eff757e
fix id rewriting in passwordlock
lufinkey Sep 4, 2025
58f9e66
whitelist transcode sessions prefix, add stop endpoint
lufinkey Sep 4, 2025
d546dc1
fix typo, use plural, dont check methods a bunch
lufinkey Sep 4, 2025
f9ca01c
ope
lufinkey Sep 4, 2025
2c40835
prepend log level
lufinkey Sep 6, 2025
3ddb448
better error silencing
lufinkey Nov 1, 2025
5b26ae6
add access tokens endpoint to client
lufinkey Nov 1, 2025
4b9c0d3
use cached fetcher for owner accounts, since they change
lufinkey Nov 1, 2025
d87651a
update windows cert path
lufinkey Nov 1, 2025
8520506
update README to specify server token
lufinkey Nov 1, 2025
3e8a559
italics + wording
lufinkey Nov 1, 2025
6c9217c
fix cache expiration lifetimes
lufinkey Nov 1, 2025
21096e8
what the fuck windows
lufinkey Nov 2, 2025
7abe77c
better auto cleaning of owner tokens
lufinkey Nov 2, 2025
e0914d9
handle synchronous error-throwing fetchers
lufinkey Nov 2, 2025
80c26da
fix similar items hub for letterboxd
lufinkey Nov 2, 2025
12c7921
Merge branch 'docker' into main
lufinkey Nov 3, 2025
c67a653
Merge pull request #6 from Jarvl/main
lufinkey Nov 3, 2025
55ceb85
add caches path to configuration
lufinkey Nov 3, 2025
67ffc8f
docker compose comments, different external plex port, separate docke…
lufinkey Nov 3, 2025
5735a50
comment improvements
lufinkey Nov 3, 2025
7a7b08d
support appCachePath on all systems
lufinkey Nov 3, 2025
37b196e
remove letterboxd example on docker config
lufinkey Nov 3, 2025
8015ba8
replace prepare with prepublishOnly
lufinkey Nov 3, 2025
eb58c70
fix single quotes
lufinkey Nov 3, 2025
963a59b
Merge pull request #11 from lufinkey/docker
lufinkey Nov 3, 2025
b61846c
consolidate metadata endpoints, add getHub helper, add helpers for me…
lufinkey Dec 2, 2025
99e964e
update node forge + package lock
lufinkey Dec 2, 2025
6b9f143
Update README.md
lufinkey Dec 7, 2025
2db4559
getHub => provideHubs, parseURLQueryItems
lufinkey Dec 7, 2025
74f3550
provideHubs => provideHub
lufinkey Dec 7, 2025
3f9c818
separate dev and latest docker versions
lufinkey Dec 7, 2025
986edad
ensure all protocols can be parsed for plex metadata guid
lufinkey Dec 7, 2025
dedf1dd
fix pathStartIndex slicing for guid
lufinkey Dec 7, 2025
0edaf6c
clean up wording
lufinkey Dec 7, 2025
0b68caf
improve example docker compose comments
lufinkey Dec 7, 2025
cbf2063
simplify paths in docker example
lufinkey Dec 7, 2025
9c48028
warn on unknown platform, improve docker compose example comments
lufinkey Dec 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Dependencies
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Build outputs
dist
build

# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# IDE files
.vscode
.idea
*.swp
*.swo

# OS files
.DS_Store
Thumbs.db

# Git
.git
.gitignore

# Docker
Dockerfile
.dockerignore
docker-compose*.yml

# Documentation
README.md
docs

# Scripts
run.sh
run.bat
scripts

# GitHub Actions
.github
54 changes: 54 additions & 0 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Adapted from https://docs.github.com/en/packages/managing-github-packages-using-github-actions-workflows/publishing-and-installing-a-package-with-github-actions
name: Build and Push Docker Image

on:
push:
branches:
- main
- dev

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }} # i.e. <owner>/<repo>

jobs:
build-and-push:
runs-on: ubuntu-latest
# Only run on the original repository, not on forks
if: github.event_name == 'push' && github.repository_owner == 'lufinkey'
permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set image tag
id: tag
run: |
if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "version=latest" >> $GITHUB_OUTPUT
elif [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then
echo "version=dev" >> $GITHUB_OUTPUT
else
echo "tag=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT"
fi

- name: Build image
run: docker build . --file Dockerfile --tag $IMAGE_NAME --label "runnumber=${GITHUB_RUN_ID}"

- name: Log in to registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin

- name: Push image
run: |
IMAGE_ID=ghcr.io/$IMAGE_NAME

# This changes all uppercase characters to lowercase.
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]')
VERSION=${{ steps.tag.outputs.version }}
echo IMAGE_ID=$IMAGE_ID
echo VERSION=$VERSION
docker tag $IMAGE_NAME $IMAGE_ID:$VERSION
docker push $IMAGE_ID:$VERSION
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,12 @@ dist
.DS_Store

# private data
/plex_docker/docker-compose.yml
docker-compose.yml
/plex-config
/plex-cache
/plugindeps
/external
/keys
/config/config.json
/config/csr.conf
/config/authCache.json
31 changes: 31 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
FROM node:22-alpine AS builder

WORKDIR /app

COPY package*.json ./

# Install all dependencies (including dev dependencies) for building
RUN npm ci && npm cache clean --force

COPY . .

RUN npm run build


# Production stage: copies dist from builder stage, then only installs dependencies needed for production (non-dev)
FROM node:22-alpine AS production

WORKDIR /app

# Run as non-root user `node`, which is a default user provided by the node image
RUN chown node:node ./
USER node

COPY --from=builder --chown=node:node /app/dist ./dist

COPY package*.json ./

RUN npm ci --omit=dev && npm cache clean --force

# Entrypoint is used here to allow signals (e.g. SIGTERM) to properly pass through to node process
ENTRYPOINT [ "node", "--enable-source-maps", "dist/main.js", "--config=/config/config.json" ]
33 changes: 27 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A middleware proxy for the plex server API. This sits in between the plex client

Inspired by [Replex](https://github.com/lostb1t/replex)

This project is still very much a WIP. While I've tried to do my due diligence in terms of security ([middleware](src/plex/requesthandling.ts#L73) prevents unauthorized requests from tokens not listed in the shared account list), I'm really the only contributor right now. Use at your own risk.
This project is still very much a WIP. While I've tried to do my due diligence in terms of security ([middleware](src/plex/requesthandling.ts#L124) prevents unauthorized requests from tokens not listed in the shared account list), I'm really the only contributor right now. Use at your own risk.

This is an unofficial project that is **NOT** endorsed by or associated with Plexinc.

Expand Down Expand Up @@ -42,6 +42,12 @@ This is an unofficial project that is **NOT** endorsed by or associated with Ple

![Letterboxd Friends Reviews](docs/images/letterboxd_friends_reviews.png)

- ### Password Locking

Password-protect your server to easily whitelist IPs per user! To log into your server, add the instructions item to a new playlist, and input the password as the playlist title. If successful, then once you refresh the page (or restart the app), you will be "logged in" for the IP you're connecting from.

![Password Locking](docs/images/passwordlock.png)

## Contributing

This app is structured to have different ["plugins"](src/plugins) to provide different functionality. The [example plugin](pluginexample) and the [plugin template](src/plugins/template) are provided to give a starting point for anyone implementing a new plugin. If you would like to add your own set of functionality unrelated to letterboxd or any existing functionality, you should create your own plugin.
Expand All @@ -54,7 +60,7 @@ Feel free to ask me if you're unsure of where or how to implement something!

You will need to use your own SSL certificate for your plex server in order for this proxy to modify requests over HTTPS. Otherwise, it will only work over HTTP, or it will fallback to the plex server's true address instead of the proxy address.

The configuration option `autoP12Password` is provided to automatically decrypt and use the built-in plex direct SSL certificate, so that you don't need to set up your own SSL certificate. If you're running any service in front of this proxy (ie, another reverse proxy or anything using its own custom domain name) then it is recommended to **not** use the built-in plex certificate, and instead use your own certificate for your custom domain.
The configuration option `autoP12Password` is provided to automatically decrypt and use the built-in plex direct SSL certificate, so that you don't need to set up your own SSL certificate.

### Configuration

Expand All @@ -64,15 +70,16 @@ Create a `config.json` file with the following structure, and fill in the config
{
"port": 32397,
"plex": {
"host": "http://127.0.0.1:32400",
"token": "<PLEX API TOKEN>"
"host": "http://192.168.1.123:32400",
"token": "<PLEX SERVER OWNER TOKEN>"
},
"ssl": {
"keyPath": "/etc/pseudo_plex_proxy/ssl_cert.key",
"certPath": "/etc/pseudo_plex_proxy/ssl_cert.crt"
},
"dashboard": {
"enabled": true,
"uuid": "<YOUR RANDOMLY GENERATED UUID>"
},
"perUser": {
"yourplexuseremail@example.com": {
Expand All @@ -98,12 +105,14 @@ Create a `config.json` file with the following structure, and fill in the config
- **httpPort**: Manually specify the port that the http proxy will run on, if you want http and https traffic on separate ports.
- **httpsPort**: Manually specify the port that the https proxy will run on, if you want http and https traffic on separate ports.
- **redirectPlexStreams**: Optionally redirect video streams to go directly to plex, rather than through the proxy. The `plex.redirectHost` option must be set in order for streams to be redirected.
- **sendMetadataUnavailability**: By default, the proxy will send the "unavailable" status for any "pseudo" metadata item (ie from letterboxd) that doesn't match up to an item in your library. If you for whatever reason don't want this behaviour, you can optionally set this to `false` to disable it.
- **trustProxy**: Set this to `true` only if you have another proxy in front of this proxy
- **plex**
- **host**: The url of your plex server.
- **host**: The url of your plex server. You probably don't want to set this to use `http://localhost:32400` or `http://127.0.0.1:32400`, even if you're on the same machine. It will work, but plex will also classify the traffic as localhost and it won't show up in bandwidth statistics. Instead, use the local ip (for example `http://192.168.1.123:32400`)
- **secureHost**: The "secure" url of your plex server, if you want https traffic to use a different url.
- **redirectHost**: The external url of your plex server, to use when redirecting streams.
- **secureRedirectHost**: The "secure" external url of your plex server, to use when redirecting streams for https traffic.
- **token**: The plex API token of the server owner.
- **token**: The plex API token of the server owner. This *must* be the token used by the actual server itself. All other tokens will expire. See [here](https://www.plexopedia.com/plex-media-server/general/plex-token/#plexservertoken) for how to get the server token.
- **appDataPath**: (*optional*) Manually specify the path of your plex server's appdata folder if it's in an unconventional place. On Linux, this is typically `/var/lib/plexmediaserver/Library/Application Support/Plex Media Server` unless you're running via docker. This will be used to determine the path of the SSL certificate if `ssl.autoP12Path` is `true`. This will also be used to determine the path of `Preferences.xml` if `ssl.autoP12Password` is `true`.
- **assumedTopSectionId**: (*optional*) Because of a bug in Plex for Mobile, it isn't possible to determine which section is the first "pinned" section. To fix this, you can manually specify the top pinned section ID here.
- **ssl**
Expand All @@ -122,12 +131,20 @@ Create a `config.json` file with the following structure, and fill in the config
- **friendsReviewsEnabled**: Display letterboxd friends reviews for all users with a letterboxd username configured
- **dashboard**:
- **enabled**: Controls whether to show a pseudo "Dashboard" section for all users, which will show custom hubs
- **id**: The section id for the dashboard section. This must be a number not already in use by another section or metadata.
- **uuid**: The unique uuid for the dashboard section. If enabling the dashboard, you should specify your own [randomly generated uuid](https://www.uuidgenerator.net), to ensure it's unique to your server.
- **title**: The title to display for the section
- **hubs**: An array of hubs to show on the dashboard section for all users. For a list of built-in hubs that can be configured, see [here](docs/Dashboard.md#hubs).
- **plugin**: The name of the plugin that this hub comes from (for example, `letterboxd` for letterboxd hubs)
- **hub**: The name of the hub within the plugin (for example, `userFollowingActivity` the activity feed of users that a given user is following)
- **arg**: The argument to pass to the hub provider for this hub. (for `letterboxd`.`userFollowingActivity` hub, this would be a letterboxd username slug, for example `crew`)
- **passwordLock**:
- **enabled**: Controls whether to password protect this server.
- **sectionID**: The section id for the initial section when the library is locked. This must be a number not already in use by another section or metadata.
- **sectionUUID**: A unique uuid for the initial section when the library is locked. You should specify your own [randomly generated uuid](https://www.uuidgenerator.net), to ensure it's unique to your server.
- **password**: The custom password of your server.
- **authCachePath**: The file path to store the auth cache json file. This stores the mapping of tokens to their whitelisted IPs.
- **autoWhitelistNetmask**: The ip netmask to whitelist automatically. Typically this would be a local netmask, like `"192.168.0.0/16"`.
- **perUser**: A map of settings to configure for each user on your server. The map keys are the plex email for each user.
- **letterboxd**:
- **username**: The letterboxd username for this user
Expand All @@ -141,6 +158,10 @@ Create a `config.json` file with the following structure, and fill in the config
- **plugin**: The name of the plugin that this hub comes from (for example, `letterboxd` for letterboxd hubs)
- **hub**: The name of the hub within the plugin
- **arg**: The argument to pass to the hub provider
- **passwordLock**:
- **password**: The custom password to require from this specific user.
- **autoWhitelistNetmask**: The ip netmask to whitelist automatically for this user.
- **overrideAutoWhitelistNetmask**: Set to `true` if the `autoWhitelistNetmask` for this user should override the global `autoWhitelistNetmask` config.

### Network Settings

Expand Down
Loading