summaryrefslogtreecommitdiff
path: root/hel/recv-media.nix
blob: 5d2d2ea2b7f8a30d45b1cb40a91028cf2c77fed4 (plain)
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
{ stdenv
, coreutils
, writeScriptBin
, eject
, shadow
, notifyUser ? "gkleen"
, showTitle ? true
, ffmpeg ? null
, gnused ? null
, wrapperDir ? "/run/wrappers/bin"
}:

assert showTitle -> ffmpeg != null && gnused != null && notifyUser != null;

writeScriptBin "recv-media" ''
  #!${stdenv.shell}

  pid=$?
  notify=${if notifyUser == null then "false" else "true"}
  notifyUser=${if notifyUser == null then "" else notifyUser}

  PATH=${eject}/bin:${coreutils}/bin:${shadow}/bin:${if showTitle then ''${ffmpeg}/bin:${gnused}/bin:'' else ""}${wrapperDir}

  exec 1> >(logger --id=$pid -t recv-media -p user.notice)
  exec 2> >(logger --id=$pid -t recv-media -p user.error)

  [[ -z "$1" || -z "$2" ]] && exit 2

  dir=/var/media
  tmpFile="''${dir}"/.tmp/$(basename "$1")
  target="''${dir}"/$(basename "$1")

  logger --id=$pid -t recv-media -p user.debug <<EOF
  $(id)
  $(stat ''${dir})
  $(stat ''${1})
  $(echo ''${2})
  EOF

  if [[ $(id -gn) != "media" ]]; then
    printf "Primary group is %s, trying to switch to media..." $(id -gn)
    exec -- sg media "$0 $*"
  fi

  (
    if ! cp -lnv --preserve=all "$1" "''${target}"; then
      mkdir -pv $(dirname "''${tmpFile}") || exit 1

      ionice -c 3 -t cp -vn --preserve=all "$1" "''${tmpFile}" && mv -v "''${tmpFile}" "''${target}" || exit 1
    fi
    touch -c -m -t "$2" "''${target}" || exit 1
  ) || (
    if $notify; then
      printf "%s\n%s\n" $(basename "$1") "Failed to download" | notify-''${notifyUser} -a recv-media -u Critical
    fi
  )

  if $notify; then
    (
      summary=${if showTitle then ''$(ffmpeg -i "''${target}" -f ffmetadata pipe:1 2>/dev/null | sed -r '/^\[CHAPTER\]$/q; /^title=/!d; s/^title=//')'' else ''""''}
      [[ -z "''${summary}" ]] && summary=$(basename "$1")
      printf "%s\n%s\n" "''${summary}" "" | notify-''${notifyUser} -a recv-media || true
    ) || true
  fi
''