diff --git a/nixos/modules/services/misc/plex.nix b/nixos/modules/services/misc/plex.nix index 7efadf1b9bb1..d57f7d20926f 100644 --- a/nixos/modules/services/misc/plex.nix +++ b/nixos/modules/services/misc/plex.nix @@ -65,6 +65,29 @@ in ''; }; + extraScanners = mkOption { + type = types.listOf types.path; + default = []; + description = '' + A list of paths to extra scanners to install in Plex's scanners + directory. + + Every time the systemd unit for Plex starts up, all of the symlinks + in Plex's scanners directory will be cleared and this module will + symlink all of the paths specified here to that directory. + ''; + example = literalExample '' + [ + (fetchFromGitHub { + owner = "ZeroQI"; + repo = "Absolute-Series-Scanner"; + rev = "773a39f502a1204b0b0255903cee4ed02c46fde0"; + sha256 = "4l+vpiDdC8L/EeJowUgYyB3JPNTZ1sauN8liFAcK+PY="; + }) + ] + ''; + }; + package = mkOption { type = types.package; default = pkgs.plex; @@ -113,6 +136,7 @@ in # Configuration for our FHS userenv script PLEX_DATADIR=cfg.dataDir; PLEX_PLUGINS=concatMapStringsSep ":" builtins.toString cfg.extraPlugins; + PLEX_SCANNERS=concatMapStringsSep ":" builtins.toString cfg.extraScanners; # The following variables should be set by the FHS userenv script: # PLEX_MEDIA_SERVER_APPLICATION_SUPPORT_DIR diff --git a/pkgs/servers/plex/default.nix b/pkgs/servers/plex/default.nix index 3d69d2197803..fd580d52d8a0 100644 --- a/pkgs/servers/plex/default.nix +++ b/pkgs/servers/plex/default.nix @@ -63,13 +63,9 @@ buildFHSUserEnv { test -d "$pluginDir" || mkdir -p "$pluginDir" # First, remove all of the symlinks in the plugins directory. - echo "Removing old symlinks" - for f in $(ls "$pluginDir/"); do - if [[ -L "$pluginDir/$f" ]]; then - echo "Removing plugin symlink: $pluginDir/$f" - rm "$pluginDir/$f" - fi - done + while IFS= read -r -d $'\0' f; do + echo "Removing plugin symlink: $f" + done < <(find "$pluginDir" -type l -print0) echo "Symlinking plugins" IFS=':' read -ra pluginsArray <<< "$PLEX_PLUGINS" @@ -87,6 +83,39 @@ buildFHSUserEnv { 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" + 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.