summary refs log tree commit diff
path: root/pkgs/applications/audio/spotify/default.nix
blob: d66029199ce809406e96aa05e5c49ecfde495090 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
{ fetchurl, stdenv, dpkg, xlibs, qt4, alsaLib, makeWrapper, openssl, freetype
, glib, pango, cairo, atk, gdk_pixbuf, gtk, cups, nspr, nss, libpng, GConf
, libgcrypt, chromium, udev, fontconfig
, dbus, expat }:

assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux";

let
  version = if stdenv.system == "i686-linux"
    then "0.9.4.183.g644e24e.428"
    else "0.9.17.1.g9b85d43.7";

  deps = [
    alsaLib
    atk
    cairo
    cups
    dbus
    expat
    fontconfig
    freetype
    GConf
    gdk_pixbuf
    glib
    gtk
    libgcrypt
    libpng
    nss
    pango
    qt4
    stdenv.cc.cc
    xlibs.libX11
    xlibs.libXcomposite
    xlibs.libXdamage
    xlibs.libXext
    xlibs.libXfixes
    xlibs.libXi
    xlibs.libXrandr
    xlibs.libXrender
    xlibs.libXrender
    xlibs.libXScrnSaver
  ];

in

stdenv.mkDerivation {
  name = "spotify-${version}";

  src =
    if stdenv.system == "i686-linux" then
      fetchurl {
        url = "http://repository.spotify.com/pool/non-free/s/spotify/spotify-client_${version}-1_i386.deb";
        sha256 = "1wl6v5x8vm74h5lxp8fhvmih8l122aadsf1qxvpk0k3y6mbx0ifa";
      }
    else if stdenv.system == "x86_64-linux" then
      fetchurl {
        url = "http://repository.spotify.com/pool/non-free/s/spotify/spotify-client_${version}-1_amd64.deb";
        sha256 = "0x87q7gd2997sgppsm4lmdiz1cm11x5vnd5c34nqb5d4ry5qfyki";
      }
    else throw "Spotify not supported on this platform.";

  buildInputs = [ dpkg makeWrapper ];

  unpackPhase = "true";

  installPhase =
    ''
      libdir=$out/lib/spotify
      mkdir -p $libdir
      dpkg-deb -x $src $out
      mv $out/opt/spotify/* $out/
      rm -rf $out/usr $out/opt

      # Work around Spotify referring to a specific minor version of
      # OpenSSL.

      ln -s ${nss}/lib/libnss3.so $libdir/libnss3.so.1d
      ln -s ${nss}/lib/libnssutil3.so $libdir/libnssutil3.so.1d
      ln -s ${nss}/lib/libsmime3.so $libdir/libsmime3.so.1d

      ${if stdenv.system == "x86_64-linux" then ''
      ln -s ${openssl}/lib/libssl.so $libdir/libssl.so.1.0.0
      ln -s ${openssl}/lib/libcrypto.so $libdir/libcrypto.so.1.0.0
      ln -s ${nspr}/lib/libnspr4.so $libdir/libnspr4.so
      ln -s ${nspr}/lib/libplc4.so $libdir/libplc4.so
      '' else ''
      ln -s ${openssl}/lib/libssl.so $libdir/libssl.so.0.9.8
      ln -s ${openssl}/lib/libcrypto.so $libdir/libcrypto.so.0.9.8
      ln -s ${nspr}/lib/libnspr4.so $libdir/libnspr4.so.0d
      ln -s ${nspr}/lib/libplc4.so $libdir/libplc4.so.0d
      ''}

      # Work around Spotify trying to open libudev.so.1 (which we don't have)
      ln -s ${udev}/lib/libudev.so.1 $libdir/libudev.so.1

      mkdir -p $out/bin

      rpath="$out/spotify-client/Data:$libdir:$out/spotify-client:${stdenv.cc.cc}/lib64"

      ln -s $out/spotify-client/spotify $out/bin/spotify

      patchelf \
        --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
        --set-rpath $rpath $out/spotify-client/spotify

      patchelf \
        --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
        --set-rpath $rpath $out/spotify-client/Data/SpotifyHelper

      preload=$out/libexec/spotify/libpreload.so
      librarypath="${stdenv.lib.makeLibraryPath deps}:$libdir"
      mkdir -p $out/libexec/spotify
      gcc -shared ${./preload.c} -o $preload -ldl -DOUT=\"$out\" -fPIC

      wrapProgram $out/bin/spotify --set LD_PRELOAD $preload --prefix LD_LIBRARY_PATH : "$librarypath"
      wrapProgram $out/spotify-client/Data/SpotifyHelper --set LD_PRELOAD $preload --prefix LD_LIBRARY_PATH : "$librarypath"

      # Desktop file
      mkdir -p "$out/share/applications/"
      cp "$out/spotify-client/spotify.desktop" "$out/share/applications/"
      sed -i "s|Icon=.*|Icon=$out/spotify-client/Icons/spotify-linux-512.png|" "$out/share/applications/spotify.desktop"
    ''; # */

  dontStrip = true;
  dontPatchELF = true;

  meta = {
    homepage = https://www.spotify.com/;
    description = "Play music from the Spotify music service";
    license = stdenv.lib.licenses.unfree;
    maintainers = with stdenv.lib.maintainers; [ eelco ftrvxmtrx ];
  };
}