mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-28 18:03:04 +00:00
5d2d3ce279
Switch the plex server to use buildFHSUserEnvBubblewrap. Still requires shared PID namespace as plex refuses to start otherwise, it thinks it's already running.
140 lines
5.0 KiB
Nix
140 lines
5.0 KiB
Nix
# The actual Plex package that we run is a FHS userenv of the "raw" package.
|
|
{ stdenv
|
|
, buildFHSUserEnvBubblewrap
|
|
, writeScript
|
|
, plexRaw
|
|
|
|
# Old argument for overriding the Plex data directory; not used for this
|
|
# version of Plex, but still around for backwards-compatibility.
|
|
, dataDir ? "/var/lib/plex"
|
|
}:
|
|
|
|
buildFHSUserEnvBubblewrap {
|
|
name = "plexmediaserver";
|
|
|
|
inherit (plexRaw) meta;
|
|
|
|
# Plex does some magic to detect if it is already running.
|
|
# The separate PID namespace somehow breaks this and Plex is thinking it's already
|
|
# running and refuses to start.
|
|
unsharePid = false;
|
|
|
|
# This script is run when we start our Plex binary
|
|
runScript = writeScript "plex-run-script" ''
|
|
#!${stdenv.shell}
|
|
|
|
set -eu
|
|
|
|
# The root path to our Plex installation
|
|
root=${plexRaw}/lib/plexmediaserver
|
|
|
|
# Path to where we're storing our Plex data files. We default to storing
|
|
# them in the user's home directory under the XDG-compatible location, but
|
|
# allow overriding with an environment variable so the location can be
|
|
# configured in our NixOS module.
|
|
#
|
|
# NOTE: the old version of Plex used /var/lib/plex as the default location,
|
|
# but this package shouldn't assume that we're going to run Plex with the
|
|
# ability to write to /var/lib, so using a subdirectory of $HOME when none
|
|
# is specified feels less likely to have permission errors.
|
|
if [[ -z "''${PLEX_DATADIR:-}" ]]; then
|
|
PLEX_DATADIR="$HOME/.local/share/plex"
|
|
fi
|
|
if [[ ! -d "$PLEX_DATADIR" ]]; then
|
|
echo "Creating Plex data directory: $PLEX_DATADIR"
|
|
mkdir -p "$PLEX_DATADIR"
|
|
fi
|
|
|
|
# The database is stored under the given directory
|
|
db="$PLEX_DATADIR/.skeleton/com.plexapp.plugins.library.db"
|
|
|
|
# If we don't have a database in the expected path, then create one by
|
|
# copying our base database to that location.
|
|
if ! test -f "$db"; then
|
|
echo "Copying base database file to: $db"
|
|
mkdir -p "$(dirname "$db")"
|
|
cat "${plexRaw.basedb}" > "$db"
|
|
fi
|
|
|
|
# Set up symbolic link at '/db', which is linked to by our Plex package
|
|
# (see the 'plexRaw' package).
|
|
ln -s "$db" /db
|
|
|
|
# If we have a plugin list (set by our NixOS module), we create plugins in
|
|
# the data directory as expected. This is a colon-separated list of paths.
|
|
if [[ -n "''${PLEX_PLUGINS:-}" ]]; then
|
|
echo "Preparing plugin directory"
|
|
|
|
pluginDir="$PLEX_DATADIR/Plex Media Server/Plug-ins"
|
|
test -d "$pluginDir" || mkdir -p "$pluginDir"
|
|
|
|
# First, remove all of the symlinks in the plugins directory.
|
|
while IFS= read -r -d $'\0' f; do
|
|
echo "Removing plugin symlink: $f"
|
|
rm "$f"
|
|
done < <(find "$pluginDir" -type l -print0)
|
|
|
|
echo "Symlinking plugins"
|
|
IFS=':' read -ra pluginsArray <<< "$PLEX_PLUGINS"
|
|
for path in "''${pluginsArray[@]}"; do
|
|
dest="$pluginDir/$(basename "$path")"
|
|
|
|
if [[ ! -d "$path" ]]; then
|
|
echo "Error symlinking plugin from $path: no such directory"
|
|
elif [[ -d "$dest" || -L "$dest" ]]; then
|
|
echo "Error symlinking plugin from $path to $dest: file or directory already exists"
|
|
else
|
|
echo "Symlinking plugin at: $path"
|
|
ln -s "$path" "$dest"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ -n "''${PLEX_SCANNERS:-}" ]]; then
|
|
for scannerType in Common Movies Music Series; do
|
|
echo "Preparing $scannerType scanners directory"
|
|
|
|
scannerDir="$PLEX_DATADIR/Plex Media Server/Scanners/$scannerType"
|
|
test -d "$scannerDir" || mkdir -p "$scannerDir"
|
|
|
|
# First, remove all of the symlinks in the scanners directory.
|
|
echo "Removing old symlinks"
|
|
while IFS= read -r -d $'\0' f; do
|
|
echo "Removing scanner symlink: $f"
|
|
rm "$f"
|
|
done < <(find "$scannerDir" -type l -print0)
|
|
|
|
echo "Symlinking scanners"
|
|
IFS=':' read -ra scannersArray <<< "$PLEX_SCANNERS"
|
|
for path in "''${scannersArray[@]}"; do
|
|
# The provided source should contain a 'Scanners' directory; symlink
|
|
# from inside that.
|
|
subpath="$path/Scanners/$scannerType"
|
|
while IFS= read -r -d $'\0' file; do
|
|
dest="$scannerDir/$(basename "$file")"
|
|
|
|
if [[ -f "$dest" || -L "$dest" ]]; then
|
|
echo "Error symlinking scanner from $file to $dest: file or directory already exists"
|
|
else
|
|
echo "Symlinking scanner at: $file"
|
|
ln -s "$file" "$dest"
|
|
fi
|
|
done < <(find "$subpath" -type f -print0)
|
|
done
|
|
done
|
|
fi
|
|
|
|
# Tell Plex to use the data directory as the "Application Support"
|
|
# directory, otherwise it tries to write things into the user's home
|
|
# directory.
|
|
export PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR="$PLEX_DATADIR"
|
|
|
|
# Tell Plex where the 'home' directory for itself is.
|
|
export PLEX_MEDIA_SERVER_HOME="${plexRaw}/lib/plexmediaserver"
|
|
|
|
# Actually run Plex, prepending LD_LIBRARY_PATH with the libraries from
|
|
# the Plex package.
|
|
LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}$root exec "$root/Plex Media Server"
|
|
'';
|
|
}
|