nixpkgs/pkgs/servers/plex/default.nix
Austin Seipp 8458d6b720 plex: 1.0.0 -> 1.2.7; fix some more binaries (#20137)
This bumps the version of Plex to the new 1.2.x branch, available to the
public. During the 1.1.x branch, there were several more critical
binaries that were added to the distribution; we also have to patch
these new executables as well with the version bump, to ensure things
keep working.

Part of this patch was authored by Michael Francis - I simply bumped the
version.

Closes #20137.

Authored-by: Austin Seipp <aseipp@pobox.com>
Authored-by: Michael Francis <edude03@gmail.com>
Signed-off-by: Austin Seipp <aseipp@pobox.com>
2016-11-17 18:16:20 -06:00

78 lines
3.1 KiB
Nix

{ 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.2.7.2987";
vsnHash = "1bef33a";
sha256 = "17d1yisbikcp25mgn71rf8w76zhy015f33hxjj93swfm1qrq55hq";
};
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 DLNA Server" "Plex Media Scanner" "Plex Script Host" "Plex Transcoder" "Plex Relay"; 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 ];
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.
'';
};
}