Change:
When started, ClipGrab always want to download youtube-dl. When after that, ClipGrab never finds the video and stays stuck on «please wait while ClipGrab downloads video info» (translated from french). Steps to reproduce the behavior: ... or ... Start ClipGrab ... youtube-dl dependency should be accessible, and video info should be fetched ! !

Discussion:
{ lib, fetchurl, makeDesktopItem, ffmpeg , qmake, qttools, mkDerivation , qtbase, qtdeclarative, qtlocation, qtquickcontrols2, qtwebchannel, qtwebengine <ins> , yt-dlp </ins> }: mkDerivation rec {

buildInputs = [ ffmpeg qtbase qtdeclarative qtlocation qtquickcontrols2 qtwebchannel qtwebengine ]; nativeBuildInputs = [ qmake qttools ]; <del> postPatch = lib.optionalString (ffmpeg != null) '' </del> <ins> patches = [ ./yt-dlp-path.patch ]; postPatch = '' substituteInPlace youtube_dl.cpp  --replace 'QString YoutubeDl::path = QString();'  'QString YoutubeDl::path = QString("${yt-dlp}/bin/yt-dlp");' '' + lib.optionalString (ffmpeg != null) '' </ins> substituteInPlace converter_ffmpeg.cpp  --replace '"ffmpeg"' '"${ffmpeg.bin}/bin/ffmpeg"'  --replace '"ffmpeg ' '"${ffmpeg.bin}/bin/ffmpeg '

<ins> --- a/main.cpp +++ b/main.cpp @@ -91,14 +91,5 @@ int main(int argc, char *argv[]) w.show(); } -    QTimer::singleShot(0, [=] { -       cg->getUpdateInfo(); -       QObject::connect(cg, &ClipGrab::updateInfoProcessed, [cg] { -           bool force = QSettings().value("forceYoutubeDlDownload", false).toBool(); -           if (force) QSettings().setValue("forceYoutubeDlDownload", false); -           cg->downloadYoutubeDl(force); -       }); -    }); - return app.exec(); } --- a/youtube_dl.cpp +++ b/youtube_dl.cpp @@ -8,52 +8,16 @@ YoutubeDl::YoutubeDl() QString YoutubeDl::path = QString(); QString YoutubeDl::find(bool force) { -    if (!force && !path.isEmpty()) return path; - -    // Prefer downloaded youtube-dl -    QString localPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, "yt-dlp"); -    QProcess* process = instance(localPath, QStringList() << "--version"); -    process->start(); -    process->waitForFinished(); -    process->deleteLater(); -    if (process->state() != QProcess::NotRunning) process->kill(); -    if (process->exitCode() == QProcess::ExitStatus::NormalExit) { -        path = localPath; -        return path; -    } - -    // Try system-wide youtube-dlp installation -    QString globalPath = QStandardPaths::findExecutable("yt-dlp"); -    process = instance(globalPath, QStringList() << "--version"); -    process->start(); -    process->waitForFinished(); -    process->deleteLater(); -    if (process->state() != QProcess::NotRunning) process->kill(); -    if (process->exitCode() == QProcess::ExitStatus::NormalExit) { -        path = globalPath; -        return path; -    } - -    return ""; +    // We supply yt-dlp from nixpkgs, so the downloading +    // machinery is not needed anymore. +    (void)force; +    return path; } QProcess* YoutubeDl::instance(QStringList arguments) { -    return instance(find(), arguments); -} - -QProcess* YoutubeDl::instance(QString path, QStringList arguments) { QProcess *process = new QProcess(); -    QString execPath = QCoreApplication::applicationDirPath(); -    QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); -    env.insert("PATH", execPath + ":" + env.value("PATH")); -    process->setEnvironment(env.toStringList()); - -    #if defined Q_OS_WIN -        process->setProgram(execPath + "/python/python.exe"); -    #else -        process->setProgram(QStandardPaths::findExecutable("python3")); -    #endif +    process->setProgram(path); QSettings settings; QStringList proxyArguments; @@ -81,7 +45,7 @@ QProcess* YoutubeDl::instance(QString path, QStringList arguments) { networkArguments << "--force-ipv4"; } -    process->setArguments(QStringList() << path << arguments << proxyArguments << networkArguments); +    process->setArguments(QStringList() << arguments << proxyArguments << networkArguments); return process; } </ins>