summary refs log tree commit diff
path: root/pkgs/tools/misc/ultrastar-manager/default.nix
blob: 19d126d98f64f0536a8b1bc2c90d1660d944bed9 (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
{ lib, mkDerivation, fetchFromGitHub, pkgconfig, symlinkJoin, qmake, diffPlugins
, qtbase, qtmultimedia, taglib, libmediainfo, libzen, libbass }:

let
  version = "2019-04-23";
  rev = "ef4524e2239ddbb60f26e05bfba1f4f28cb7b54f";
  sha256 = "0dl2qp686vbs160b3i9qypb7sv37phy2wn21kgzljbk3wnci3yv4";
  buildInputs = [ qtbase qtmultimedia taglib libmediainfo libzen libbass ];

  plugins = [
    "albumartex"
    "amazon"
    "audiotag"
    "cleanup"
    "freecovers"
    "lyric"
    "preparatory"
    "rename"
 ];

  patchedSrc =
    let src = fetchFromGitHub {
      owner = "UltraStar-Deluxe";
      repo = "UltraStar-Manager";
      inherit rev sha256;
    };
    in mkDerivation {
      name = "${src.name}-patched";
      inherit src;
      phases = [ "unpackPhase" "patchPhase" ];

      patchPhase = with lib; ''
        # we don’t want prebuild binaries checked into version control!
        rm -rf lib include

        # fix up main project file
        sed -e 's|-L.*unix.*lbass.*$|-lbass|' \
            -e "/QMAKE_POST_LINK/d" \
            -e "s|../include/bass|${getLib libbass}/include|g" \
            -e "s|../include/taglib|${getLib taglib}/include|g" \
            -e "s|../include/mediainfo|${getLib libmediainfo}/include|g" \
            -i src/UltraStar-Manager.pro

        # if more plugins start depending on ../../../include,
        # it should be abstracted out for all .pro files
        sed -e "s|../../../include/taglib|${getLib taglib}/include/taglib|g" \
            -i src/plugins/audiotag/audiotag.pro

        mkdir $out
        mv * $out
      '';
    };

  patchApplicationPath = file: path: ''
    sed -e "s|QCore.*applicationDirPath()|QString(\"${path}\")|" -i "${file}"
  '';

  buildPlugin = name: mkDerivation {
    name = "ultrastar-manager-${name}-plugin-${version}";
    src = patchedSrc;

    buildInputs = [ qmake ] ++ buildInputs;

    postPatch = ''
      sed -e "s|DESTDIR = .*$|DESTDIR = $out|" \
          -i src/plugins/${name}/${name}.pro

      # plugins use the application’s binary folder (wtf)
      for f in $(grep -lr "QCoreApplication::applicationDirPath" src/plugins); do
        ${patchApplicationPath "$f" "\$out"}
      done

    '';
    preConfigure = ''
      cd src/plugins/${name}
    '';
  };

  builtPlugins =
    symlinkJoin {
      name = "ultrastar-manager-plugins-${version}";
      paths = map buildPlugin plugins;
    };

in mkDerivation {
  pname = "ultrastar-manager";
  inherit version;
  src = patchedSrc;

  postPatch = ''
    sed -e "s|DESTDIR =.*$|DESTDIR = $out/bin|" \
        -i src/UltraStar-Manager.pro
    # patch plugin manager to point to the collected plugin folder
    ${patchApplicationPath "src/plugins/QUPluginManager.cpp" builtPlugins}
  '';

  buildPhase = ''
    find -path './src/plugins/*' -prune -type d -print0 \
      | xargs -0 -i'{}' basename '{}' \
      | sed -e '/shared/d' \
      > found_plugins
    ${diffPlugins plugins "found_plugins"}

    cd src && qmake && make
  '';

  # is not installPhase so that qt post hooks can run
  preInstall = ''
    make install
  '';

  nativeBuildInputs = [ pkgconfig ];
  inherit buildInputs;

  meta = with lib; {
    description = "Ultrastar karaoke song manager";
    homepage = https://github.com/UltraStar-Deluxe/UltraStar-Manager;
    license = licenses.gpl2;
    maintainers = with maintainers; [ Profpatsch ];
  };
}