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
'';
})
|