summary refs log tree commit diff
path: root/pkgs/applications/video/handbrake/default.nix
blob: 841604399ed366f9817278690a499c0d9ac6a74a (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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# Upstream distributes HandBrake with bundle of according versions of libraries
# and patches to them. This derivation patches HandBrake to use Nix closure
# dependencies.
#
# NOTE: 2019-07-19: This derivation does not currently support the native macOS
# GUI--it produces the "HandbrakeCLI" CLI version only. In the future it would
# be nice to add the native GUI (and/or the GTK GUI) as an option too, but that
# requires invoking the Xcode build system, which is non-trivial for now.

{ stdenv
, lib
, fetchFromGitHub
  # For tests
, testVersion
, runCommand
, fetchurl
  # Main build tools
, pkg-config
, autoconf
, automake
, libtool
, m4
, xz
, python3
, numactl
, writeText
  # Processing, video codecs, containers
, ffmpeg-full
, nv-codec-headers
, libogg
, x264
, x265
, libvpx
, libtheora
, dav1d
, zimg
  # Codecs, audio
, libopus
, lame
, libvorbis
, a52dec
, speex
, libsamplerate
  # Text processing
, libiconv
, fribidi
, fontconfig
, freetype
, libass
, jansson
, libxml2
, harfbuzz
, libjpeg_turbo
  # Optical media
, libdvdread
, libdvdnav
, libdvdcss
, libbluray
  # Darwin-specific
, AudioToolbox ? null
, Foundation ? null
, libobjc ? null
, VideoToolbox ? null
  # GTK
  # NOTE: 2019-07-19: The gtk3 package has a transitive dependency on dbus,
  # which in turn depends on systemd. systemd is not supported on Darwin, so
  # for now we disable GTK GUI support on Darwin. (It may be possible to remove
  # this restriction later.)
, useGtk ? !stdenv.isDarwin
, wrapGAppsHook
, intltool
, glib
, gtk3
, libappindicator-gtk3
, libnotify
, gst_all_1
, dbus-glib
, udev
, libgudev
, hicolor-icon-theme
  # FDK
, useFdk ? false
, fdk_aac
}:

let
  version = "1.5.1";

  src = fetchFromGitHub {
    owner = "HandBrake";
    repo = "HandBrake";
    rev = version;
    sha256 = "1kk11zl1mk37d4cvbc75gfndmma7vy3vkp4gmkyl92kiz6zadhyy";
  };

  versionFile = writeText "version.txt" ''
    BRANCH=${versions.majorMinor version}.x
    DATE=1970-01-01 00:00:01 +0000
    HASH=${src.rev}
    REV=${src.rev}
    SHORTHASH=${src.rev}
    TAG=${version}
    URL=${src.meta.homepage}
  '';

  inherit (lib) optional optionals optionalString versions;

in
let self = stdenv.mkDerivation rec {
  pname = "handbrake";
  inherit version src;

  postPatch = ''
    install -Dm444 ${versionFile} ${versionFile.name}

    patchShebangs scripts

    substituteInPlace libhb/hb.c \
      --replace 'return hb_version;' 'return "${version}";'

    # Force using nixpkgs dependencies
    sed -i '/MODULES += contrib/d' make/include/main.defs
    sed -e 's/^[[:space:]]*\(meson\|ninja\|nasm\)[[:space:]]*= ToolProbe.*$//g' \
        -e '/    ## Additional library and tool checks/,/    ## MinGW specific library and tool checks/d' \
        -i make/configure.py
  '' + optionalString stdenv.isDarwin ''
    # Use the Nix-provided libxml2 instead of the patched version available on
    # the Handbrake website.
    substituteInPlace libhb/module.defs \
      --replace '$(CONTRIB.build/)include/libxml2' ${libxml2.dev}/include/libxml2

    # Prevent the configure script from failing if xcodebuild isn't available,
    # which it isn't in the Nix context. (The actual build goes fine without
    # xcodebuild.)
    sed -e '/xcodebuild = ToolProbe/s/abort=.\+)/abort=False)/' -i make/configure.py
  '' + optionalString stdenv.isLinux ''
    # Use the Nix-provided libxml2 instead of the system-provided one.
    substituteInPlace libhb/module.defs \
      --replace /usr/include/libxml2 ${libxml2.dev}/include/libxml2
  '';

  nativeBuildInputs = [
    autoconf
    automake
    libtool
    m4
    pkg-config
    python3
  ]
  ++ optionals useGtk [ intltool wrapGAppsHook ];

  buildInputs = [
    a52dec
    dav1d
    ffmpeg-full
    fontconfig
    freetype
    fribidi
    harfbuzz
    jansson
    lame
    libass
    libbluray
    libdvdcss
    libdvdnav
    libdvdread
    libiconv
    libjpeg_turbo
    libogg
    libopus
    libsamplerate
    libtheora
    libvorbis
    libvpx
    libxml2
    speex
    x264
    x265
    xz
    zimg
  ]
  ++ optional (!stdenv.isDarwin) numactl
  ++ optionals useGtk [
    dbus-glib
    glib
    gst_all_1.gst-plugins-base
    gst_all_1.gstreamer
    gtk3
    hicolor-icon-theme
    libappindicator-gtk3
    libgudev
    libnotify
    udev
  ]
  ++ optional useFdk fdk_aac
  ++ optionals stdenv.isDarwin [ AudioToolbox Foundation libobjc VideoToolbox ]
  # NOTE: 2018-12-27: Handbrake supports nv-codec-headers for Linux only,
  # look at ./make/configure.py search "enable_nvenc"
  ++ optional stdenv.isLinux nv-codec-headers;

  configureFlags = [
    "--disable-df-fetch"
    "--disable-df-verify"
    "--disable-gtk-update-checks"
  ]
  ++ optional (!useGtk) "--disable-gtk"
  ++ optional useFdk "--enable-fdk-aac"
  ++ optional stdenv.isDarwin "--disable-xcode"
  ++ optional (stdenv.isx86_32 || stdenv.isx86_64) "--harden";

  # NOTE: 2018-12-27: Check NixOS HandBrake test if changing
  NIX_LDFLAGS = [ "-lx265" ];

  makeFlags = [ "--directory=build" ];

  passthru.tests = {
    basic-conversion =
      let
        # Big Buck Bunny example, licensed under CC Attribution 3.0.
        testMkv = fetchurl {
          url = "https://github.com/Matroska-Org/matroska-test-files/blob/cf0792be144ac470c4b8052cfe19bb691993e3a2/test_files/test1.mkv?raw=true";
          sha256 = "1hfxbbgxwfkzv85pvpvx55a72qsd0hxjbm9hkl5r3590zw4s75h9";
        };
      in
      runCommand "${pname}-${version}-basic-conversion" { nativeBuildInputs = [ self ]; } ''
        mkdir -p $out
        cd $out
        HandBrakeCLI -i ${testMkv} -o test.mp4 -e x264 -q 20 -B 160
        test -e test.mp4
        HandBrakeCLI -i ${testMkv} -o test.mkv -e x264 -q 20 -B 160
        test -e test.mkv
      '';
    version = testVersion { package = self; command = "HandBrakeCLI --version"; };
  };

  meta = with lib; {
    homepage = "https://handbrake.fr/";
    description = "A tool for converting video files and ripping DVDs";
    longDescription = ''
      Tool for converting and remuxing video files
      into selection of modern and widely supported codecs
      and containers. Very versatile and customizable.
      Package provides:
      CLI - `HandbrakeCLI`
      GTK GUI - `ghb`
    '';
    license = licenses.gpl2Only;
    maintainers = with maintainers; [ Anton-Latukha wmertens ];
    platforms = with platforms; unix;
    broken = stdenv.isDarwin && lib.versionOlder stdenv.hostPlatform.darwinMinVersion "10.13";
  };
};
in self