about summary refs log tree commit diff
path: root/nixpkgs/pkgs/build-support/fetchbittorrent/default.nix
blob: 916c7e7d8c94faebbde8f2773d6a48bc6cad4ae4 (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
{ lib, runCommand, transmission_noSystemd, rqbit, writeShellScript, formats, cacert, rsync }:
let
  urlRegexp = ''.*xt=urn:bt[im]h:([^&]{64}|[^&]{40}).*'';
in
{ url
, name ?
  if (builtins.match urlRegexp url) == null then
    "bittorrent"
  else
    "bittorrent-" + builtins.head (builtins.match urlRegexp url)
, config ? if (backend == "transmission") then { } else throw "json config for configuring fetchFromBitorrent only works with the transmission backend"
, hash
, backend ? "transmission"
, recursiveHash ? true
, postFetch ? ""
, postUnpack ? ""
}:
let
  afterSuccess = writeShellScript "fetch-bittorrent-done.sh" ''
    ${postUnpack}
    # Flatten the directory, so that only the torrent contents are in $out, not
    # the folder name
    shopt -s dotglob
    mv -v $downloadedDirectory/*/* $out
    rm -v -rf $downloadedDirectory
    unset downloadedDirectory
    ${postFetch}
    kill $PPID
  '';
  jsonConfig = (formats.json {}).generate "jsonConfig" config;
in
runCommand name {
  nativeBuildInputs = [ cacert ] ++ (if (backend == "transmission" ) then [ transmission_noSystemd ] else if (backend == "rqbit") then [ rqbit ] else throw "rqbit or transmission are the only available backends for fetchbittorrent");
  outputHashAlgo = if hash != "" then null else "sha256";
  outputHash = hash;
  outputHashMode = if recursiveHash then "recursive" else "flat";

  # url will be written to the derivation, meaning it can be parsed and utilized
  # by external tools, such as tools that may want to seed fetchBittorrent calls
  # in nixpkgs
  inherit url;
}
(if (backend == "transmission") then ''
  export HOME=$TMP
  export downloadedDirectory=$out/downloadedDirectory
  mkdir -p $downloadedDirectory
  mkdir -p $HOME/.config/transmission
  cp ${jsonConfig} $HOME/.config/transmission/settings.json
  function handleChild {
    # This detects failures and logs the contents of the transmission fetch
    find $out
    exit 0
  }
  trap handleChild CHLD
  transmission-cli --port $(shuf -n 1 -i 49152-65535) --portmap --finish ${afterSuccess} --download-dir $downloadedDirectory --config-dir "$HOME"/.config/transmission "$url"
'' else
''
  export HOME=$TMP
  rqbit --disable-dht-persistence --http-api-listen-addr "127.0.0.1:$(shuf -n 1 -i 49152-65535)" download -o $out --exit-on-finish "$url"
'')