nixpkgs/pkgs/servers/plex/default.nix
Silvan Mosberger 4f0dadbf38 treewide: format all inactive Nix files
After final improvements to the official formatter implementation,
this commit now performs the first treewide reformat of Nix files using it.
This is part of the implementation of RFC 166.

Only "inactive" files are reformatted, meaning only files that
aren't being touched by any PR with activity in the past 2 months.
This is to avoid conflicts for PRs that might soon be merged.
Later we can do a full treewide reformat to get the rest,
which should not cause as many conflicts.

A CI check has already been running for some time to ensure that new and
already-formatted files are formatted, so the files being reformatted here
should also stay formatted.

This commit was automatically created and can be verified using

    nix-build a08b3a4d19.tar.gz \
      --argstr baseRev b32a0943687d2a5094a6d92f25a4b6e16a76b5b7
    result/bin/apply-formatting $NIXPKGS_PATH
2024-12-10 20:26:33 +01:00

141 lines
5.0 KiB
Nix

# The actual Plex package that we run is a FHS userenv of the "raw" package.
{
stdenv,
buildFHSEnv,
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",
}:
buildFHSEnv {
pname = "plexmediaserver";
inherit (plexRaw) version 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"
'';
}