about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/plex/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/plex/default.nix')
-rw-r--r--nixpkgs/pkgs/servers/plex/default.nix84
1 files changed, 84 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/plex/default.nix b/nixpkgs/pkgs/servers/plex/default.nix
new file mode 100644
index 000000000000..cce1f5c6ab09
--- /dev/null
+++ b/nixpkgs/pkgs/servers/plex/default.nix
@@ -0,0 +1,84 @@
+{ stdenv, fetchurl, rpmextract, glibc
+, dataDir ? "/var/lib/plex" # Plex's data directory must be baked into the package due to symlinks.
+, enablePlexPass ? false
+}:
+
+let
+  plexPass = throw "Plex pass has been removed at upstream's request; please unset nixpkgs.config.plex.pass";
+  plexpkg = if enablePlexPass then plexPass else {
+    version = "1.14.1.5488";
+    vsnHash = "cc260c476";
+    sha256 = "8ee806f35ccedcecd0cab028bbe1f7e2ac7de24292b715978d3165c4712f5c40";
+  };
+
+in stdenv.mkDerivation rec {
+  name = "plex-${version}";
+  version = plexpkg.version;
+  vsnHash = plexpkg.vsnHash;
+  sha256 = plexpkg.sha256;
+
+  src = fetchurl {
+    url = "https://downloads.plex.tv/plex-media-server/${version}-${vsnHash}/plexmediaserver-${version}-${vsnHash}.x86_64.rpm";
+    inherit sha256;
+  };
+
+  buildInputs = [ rpmextract glibc ];
+
+  phases = [ "unpackPhase" "installPhase" "fixupPhase" "distPhase" ];
+
+  unpackPhase = ''
+    rpmextract $src
+  '';
+
+  installPhase = ''
+    install -d $out/usr/lib
+    cp -dr --no-preserve='ownership' usr/lib/plexmediaserver $out/usr/lib/
+
+    # Now we need to patch up the executables and libraries to work on Nix.
+    # Side note: PLEASE don't put spaces in your binary names. This is stupid.
+    for bin in "Plex Media Server"              \
+               "Plex Commercial Skipper"        \
+               "Plex DLNA Server"               \
+               "Plex Media Scanner"             \
+               "Plex Relay"                     \
+               "Plex Script Host"               \
+               "Plex Transcoder"                \
+               "Plex Tuner Service"             ; do
+      patchelf --set-interpreter "${glibc.out}/lib/ld-linux-x86-64.so.2" "$out/usr/lib/plexmediaserver/$bin"
+      patchelf --set-rpath "$out/usr/lib/plexmediaserver" "$out/usr/lib/plexmediaserver/$bin"
+    done
+
+    find $out/usr/lib/plexmediaserver/Resources -type f -a -perm -0100 \
+        -print -exec patchelf --set-interpreter "${glibc.out}/lib/ld-linux-x86-64.so.2" '{}' \;
+
+    # executables need libstdc++.so.6
+    ln -s "${stdenv.lib.makeLibraryPath [ stdenv.cc.cc ]}/libstdc++.so.6" "$out/usr/lib/plexmediaserver/libstdc++.so.6"
+
+    # Our next problem is the "Resources" directory in /usr/lib/plexmediaserver.
+    # This is ostensibly a skeleton directory, which contains files that Plex
+    # copies into its folder in /var. Unfortunately, there are some SQLite
+    # databases in the directory that are opened at startup. Since these
+    # database files are read-only, SQLite chokes and Plex fails to start. To
+    # solve this, we keep the resources directory in the Nix store, but we
+    # rename the database files and replace the originals with symlinks to
+    # /var/lib/plex. Then, in the systemd unit, the base database files are
+    # copied to /var/lib/plex before starting Plex.
+    RSC=$out/usr/lib/plexmediaserver/Resources
+    for db in "com.plexapp.plugins.library.db"; do
+        mv $RSC/$db $RSC/base_$db
+        ln -s "${dataDir}/.skeleton/$db" $RSC/$db
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    homepage = http://plex.tv/;
+    license = licenses.unfree;
+    platforms = platforms.linux;
+    maintainers = with stdenv.lib.maintainers; [ colemickens forkk thoughtpolice pjones lnl7 ];
+    description = "Media / DLNA server";
+    longDescription = ''
+      Plex is a media server which allows you to store your media and play it
+      back across many different devices.
+    '';
+  };
+}