about summary refs log tree commit diff stats
path: root/nix/package.nix
blob: 979696ba00f45a54e5314388085b37cbab989f01 (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
# yt - A fully featured command line YouTube client
#
# Copyright (C) 2024 Benedikt Peetz <benedikt.peetz@b-peetz.de>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This file is part of Yt.
#
# You should have received a copy of the License along with this program.
# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
{
  lib,
  rustPlatform,
  installShellFiles,
  # buildInputs
  mpv-unwrapped,
  ffmpeg,
  openssl,
  libffi,
  zlib,
  curl,
  # NativeBuildInputs
  makeWrapper,
  llvmPackages_latest,
  glibc,
  sqlite,
  fd,
  pkg-config,
  SDL2,
  python3,
  # Passthru
  tree-sitter-yts,
}: let
  python = python3.withPackages (ps: [ps.yt-dlp]);
in
  rustPlatform.buildRustPackage (finalAttrs: {
    pname = "yt";
    inherit
      ((builtins.fromTOML (builtins.readFile
            ../Cargo.toml)).workspace.package)
      version
      ;

    src = lib.cleanSourceWith {
      src = lib.cleanSource ./..;
      filter = name: type:
        (type == "directory")
        || (builtins.elem (builtins.baseNameOf name) [
          "Cargo.toml"
          "Cargo.lock"
          "mkdb.sh"
          "help.str"
          "raw_error_warning.txt"
          "golden.txt"
        ])
        || (lib.strings.hasSuffix ".rs" (builtins.baseNameOf name))
        || (lib.strings.hasSuffix ".h" (builtins.baseNameOf name))
        || (lib.strings.hasSuffix ".sql" (builtins.baseNameOf name));
    };

    nativeBuildInputs = [
      installShellFiles
      makeWrapper
      sqlite
      fd
      pkg-config
    ];

    buildInputs = [
      mpv-unwrapped.dev
      ffmpeg
      openssl
      libffi
      zlib
      curl.dev
      python
    ];

    checkInputs = [
      # Needed for the tests in `libmpv2`
      SDL2
    ];

    env = let
      clang_version =
        lib.versions.major
        llvmPackages_latest.clang-unwrapped.version;
    in {
      # Needed for the compile time sqlite checks.
      DATABASE_URL = "sqlite://database.sqlx";

      # Required by yt_dlp
      FFMPEG_LOCATION = "${lib.getExe ffmpeg}";

      # Tell pyo3 which python to use.
      PYO3_PYTHON = lib.getExe python;

      # Needed for the libmpv2.
      C_INCLUDE_PATH = "${glibc.dev}/include";
      LIBCLANG_INCLUDE_PATH = "${llvmPackages_latest.clang-unwrapped.lib}/lib/clang/${clang_version}/include";
      LIBCLANG_PATH = "${llvmPackages_latest.clang-unwrapped.lib}/lib/libclang.so";
    };

    doCheck = true;
    checkFlags = [
      # All of these tests try to connect to the internet to download test data.
      "--skip=select::base::test_base"
      "--skip=select::file::test_file"
      "--skip=select::options::test_options"
      "--skip=subscriptions::import_export::test_import_export"
      "--skip=subscriptions::naming_subscriptions::test_naming_subscriptions"
      "--skip=videos::downloading::test_downloading"
    ];

    prePatch = ''
      # Generate the sqlite db, so that we can run the comp-time sqlite checks.
      bash ./scripts/mkdb.sh
    '';

    passthru = {
      inherit tree-sitter-yts;
    };

    cargoLock = {
      lockFile = ../Cargo.lock;
    };

    postInstall = ''
      installShellCompletion --cmd yt \
        --bash <(COMPLETE=bash $out/bin/yt) \
        --fish <(COMPLETE=fish $out/bin/yt) \
        --zsh <(COMPLETE=zsh $out/bin/yt)

      # NOTE: We cannot clear the path, because we need access to the $EDITOR. <2025-04-04>
      wrapProgram $out/bin/yt \
        --prefix PATH : ${lib.makeBinPath finalAttrs.buildInputs} \
        --set YTDLP_NO_PLUGINS 1
    '';
  })