summary refs log tree commit diff
path: root/pkgs/applications/audio/spotify/default.nix
blob: 59b82d155da9ff22cd42ebd87e265570519d6fa5 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
{ fetchurl, stdenv, dpkg, xlibs, qt4, alsaLib, makeWrapper, openssl, freetype
, glib, pango, cairo, atk, gdk_pixbuf, gtk, cups, nspr, nss, libpng, GConf
, libgcrypt, chromium, sqlite, gst_plugins_base, gstreamer, 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.11.27.g2b1a638.81";

  qt4webkit =
    if stdenv.system == "i686-linux" then
      fetchurl {
        name = "libqtwebkit4_2.3.2_i386.deb";
        url = http://ie.archive.ubuntu.com/ubuntu/pool/main/q/qtwebkit-source/libqtwebkit4_2.3.2-0ubuntu7_i386.deb;
        sha256 = "0q4abhczx91ma57fjss0gn8j6nkfbfsbsh6kxhykzj88dih2s8rn";
      }
    else
      fetchurl {
        name = "libqtwebkit4_2.3.2_amd64.deb";
        url = http://ie.archive.ubuntu.com/ubuntu/pool/main/q/qtwebkit-source/libqtwebkit4_2.3.2-0ubuntu7_amd64.deb;
        sha256 = "0sac88avfivwkfhmd6fik7ili8fdznqas6741dbspf9mfnawbwch";
      };

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

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 = "0yfljiw01kssj3qaz8m0ppgrpjs6xrhzlr2wccp64bsnmin7g4sg";
      }
    else throw "Spotify not supported on this platform.";

  buildInputs = [ dpkg makeWrapper ];

  unpackPhase = "true";

  installPhase =
    ''
      mkdir -p $out
      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.
      mkdir $out/lib

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

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

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

      mkdir -p $out/bin

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

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

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

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

      dpkg-deb -x ${qt4webkit} ./
      mkdir -p $out/lib/
      cp -v usr/lib/*/* $out/lib/

      preload=$out/libexec/spotify/libpreload.so
      librarypath="${stdenv.lib.makeLibraryPath deps}:$out/lib"
      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 = "Spotify for Linux allows you to play music from the Spotify music service";
    license = stdenv.lib.licenses.unfree;
    maintainers = [ stdenv.lib.maintainers.eelco ];
  };
}