diff mbox series

[bug#49238,v1,2/2] gnu: Add ytfzf.

Message ID 20210627054737.7972-2-rg@raghavgururajan.name
State Accepted
Headers show
Series [bug#49238,v1,1/2] gnu: Add python-ueberzug. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Raghav Gururajan June 27, 2021, 5:47 a.m. UTC
From: LibreMiami <packaging-guix@libremiami.org>

* gnu/packages/image-viewers.scm (ytfzf): New variable.

Co-authored-by: Raghav Gururajan <rg@raghavgururajan.name>
Co-authored-by: jgart <jgart@dismail.de>
---
 gnu/local.mk                              |   2 +
 gnu/packages/image-viewers.scm            | 102 ++++++
 gnu/packages/patches/ytfzf-programs.patch | 372 ++++++++++++++++++++++
 gnu/packages/patches/ytfzf-updates.patch  |  41 +++
 4 files changed, 517 insertions(+)
 create mode 100644 gnu/packages/patches/ytfzf-programs.patch
 create mode 100644 gnu/packages/patches/ytfzf-updates.patch

Comments

M June 30, 2021, 7:38 p.m. UTC | #1
Raghav Gururajan via Guix-patches via schreef op zo 27-06-2021 om 01:47 [-0400]:
> +       (patches
> +        (search-patches
> +         ;; Prerequisite for 'patch phase.
> +         "ytfzf-programs.patch"

That's a neat trick to avoid fragile (substitute* ...).
However, as I understand it, the origin is meant to be
usable as source code (think install dependencies && guix build && tar xzf stuff.tgz
&& ./configure && make && try it out), such that
"guix build --source=transitive stuff" would give all the
source code for building stuff (in the sense of ‘Corresponding Source’
of the GPL), and "guix-mpv", 'guix-jq" ... don't exist anywhere.

I don't know if that has been spelled out somewhere though.

I'd suggest adding "patch" to 'native-inputs', adding the patch
to 'inputs' or 'native-inputs' (doesn't really matter which) and
doing (invoke "patch" OPTIONS "blabla.patch") before the substitute*.

Actually, myself I'm not convinced because you could consider
the package definition itself to be part of the ‘corresponding source’.

> +             (substitute* "ytfzf"
> +               (("guix-catimg")
> +                (format #f "~a/bin/catimg"
> +                        (assoc-ref inputs "catimg")))

I'm wondering if (string-append (assoc-ref inputs "catimg") "/bin/catimg")
would be better, as 'string-append' is less complex than 'format'
and "format" doesn't seem to provide any additional value here.

Now about the patch:

> + ############################
> + #       Help Texts         #
> +@@ -326,8 +326,8 @@ print_info () {
> + }
> + 
> + print_error () {
> +-    [ $ext_menu_notifs -eq 1 ] && notify-send "error" "$*" || printf "\033[31m$*\033[0m" >&2
> +-    [ $ext_menu_notifs -eq 1 ] && notify-send "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2
> ++    [ $ext_menu_notifs -eq 1 ] && guix-notify-send "error" "$*" || printf "\033[31m$*\033[0m" >&2
> ++    [ $ext_menu_notifs -eq 1 ] && guix-notify-send "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2

Maybe tell people to report issues at bug-guix@gnu.org or #guix? Dunno

> + }
> + 
> + ############################
> +@@ -398,8 +398,8 @@ format_fzf () {
> + format_menu () {
> + 	if [ "$is_ext_menu" -eq 0 ]; then
> + 		#dep_ck fzf here because it is only necessary to use here
> +-		dep_ck "fzf"
> +-		menu_command='column -t -s "$tab_space" | fzf -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS'
> ++		dep_ck "guix-fzf"
> ++		menu_command='column -t -s "$tab_space" | guix-fzf -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS'
> + 		format_fzf

Don't forget to patch 'column'.

> + 	else
> + 		# Dmenu doesn't render tabs so removing it
> +@@ -462,7 +462,7 @@ WIDTH=$FZF_PREVIEW_COLUMNS
> + HEIGHT=$FZF_PREVIEW_LINES
> + start_ueberzug () {
> +     [ -e $FIFO ] || { mkfifo "$FIFO" || exit 1 ; }
> +-    ueberzug layer --parser json --silent < "$FIFO" &
> ++    guix-ueberzug layer --parser json --silent < "$FIFO" &
> +     exec 3>"$FIFO"
> + }
> + stop_ueberzug () {

Don't forget to patch "mkfifo".

> +@@ -585,17 +585,17 @@ download_thumbnails () {
> + 	if [ "$thumbnail_quality" -eq 1 ]; then
> + 		image_download () {
> + 			# higher quality images
> +-			curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
> ++			guix-curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
> + 		}
> + 	else
> + 		image_download () {
> +- 			curl -s "$Url"  > "$thumb_dir/$Name.png"
> ++			guix-curl -s "$Url"  > "$thumb_dir/$Name.png"
> + 		}
> + 	fi
> + 
> + 	print_info "Downloading Thumbnails...\n"
> + 	thumb_urls=$(printf "%s" "$*" |\
> +-		jq  -r '.[]|[.thumbs,.videoID]|@tsv' )
> ++		guix-jq  -r '.[]|[.thumbs,.videoID]|@tsv' )
> + 
> + 	while IFS=$tab_space read -r Url Name; do
> + 	    sleep 0.001
> 

Don't forget patching 'sleep'. It is not shell a built-in
(try "type sleep" and "type [" in a terminal").


> +@@ -988,7 +988,7 @@ format_user_selection () {
> + 			11) selected_urls=$selected_urls$new_line'https://www.youtube.com/watch?v='$surl ;;
> + 			34) selected_urls=$selected_urls$new_line'https://www.youtube.com/playlist?list='$surl ;;
> + 			36)
> +-			    selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | jq '.[].url' | grep -F "$surl" | tr -d '"')" ;;
> ++			    selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | guix-jq '.[].url' | grep -F "$surl" | tr -d '"')

Don't forget patching 'grep' and 'tr'.

> " ;;
> + 			*) continue ;;
> + 		esac
> + 		refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | grep "|$surl" )
> +@@ -1014,7 +1014,7 @@ print_data () {
> + get_video_format () {
> + 	# select format if flag given
> + 	[ $show_format -eq 0 ] && return
> +-        formats=$(youtube-dl -F "$(printf "$selected_urls")") 
> ++        formats=$(guix-youtube-dl -F "$(printf "$selected_urls")")
> +         line_number=$(printf "$formats" | grep -n '.*extension  resolution.*' | cut -d: -f1)

Don't forget 'grep -> guix-grep' and 'cut -> guix-cut'

> +         quality=$(printf "$formats \n1 2 xAudio" | awk -v lineno=$line_number 'FNR > lineno {print $3}' | sort -n |  awk -F"x" '{print $2 "p"}' | uniq | sed -e "s/Audiop/Audio/" -e "/^p$/d" | eval "$menu_command" | sed "s/p//g")

Don't forget 'awk -> guix-awk' and 'sort -> guix-sort' and 'uniq -> 'guix-uniq'

> + 		[ -z "$quality"  ] && exit;
> +@@ -1026,9 +1026,9 @@ get_video_format () {
> + get_sub_lang () {
> +     if [ $auto_caption -eq 1 ]; then
> +         #Gets the auto generated subs and stores them in a file
> +-        sub_list=$(youtube-dl --list-subs  --write-auto-sub "$selected_urls" | sed '/Available subtitles/,$d' | awk '{print $1}' | sed '1d;2d;3d')
> ++        sub_list=$(guix-youtube-dl --list-subs  --write-auto-sub "$selected_urls" | sed '/Available subtitles/,$d' | awk '{print $1}' | sed '1d;2d;3d')

Don't forget 'sed -> guix-sed' and 'awk -> guix-awk'

> +         if [ -n "$sub_list" ]; then
> +-            [ -n "$selected_sub" ] ||  selected_sub=$(printf "$sub_list" | eval "$menu_command") &&  youtube-dl  --sub-lang $selected_sub  --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available."
> ++            [ -n "$selected_sub" ] ||  selected_sub=$(printf "$sub_list" | eval "$menu_command") &&  guix-youtube-dl  --sub-lang $selected_sub  --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available."

FWIW, writing to "/tmp/ytfzf" seems to be a potential security problem
and bad behaviour on multiple-user systems.

What would happen if /tmp/ytfzf is a symlink to /etc/passwd an ytfzf is run
as root (yes, running as root is not recommended)? Would that brick the system?
What if /tmp/ytfzf is a symlink to ~/.profile? Would that brick the login?

What if multiple users run ytfzf concurrently? Would they overwrite eaech
other subtitles?  Would a different user be able to see what the other
is downloading?

A relatively easy fix would be to write to, say, $HOME/.cache/ytzf-subs
instead (not sure what the proper directory would be), which is completely
under the user's control.

> +@@ -1262,7 +1262,7 @@ EOF
> + update_ytfzf () {
> + 	branch="$1"
> + 	updatefile="/tmp/ytfzf-update"
> +-	curl -L "https://raw.githubusercontent.com/pystardust/ytfzf/$branch/ytfzf" -o "$updatefile"
> ++	guix-curl -L "https://raw.githubusercontent.com/pystardust/ytfzf/$branch/ytfzf" -o "$updatefile"
> + 
> + 	if sed -n '1p' < "$updatefile" | grep -q '#!/bin/sh'; then

FWIW, as update-ytfzf will be more-or-less deleted
in the next patch, don't forget to patch 'sed' and 'grep'

> + 		chmod 755 "$updatefile"
> +@@ -1346,10 +1346,10 @@ create_subs () {
> +     : > "$config_dir/subscriptions"
> + 
> +     # check how many subscriptions there are in the file
> +-    sublength=$( jq '. | length' < "$yt_sub_import_file" )
> ++    sublength=$( guix-jq '. | length' < "$yt_sub_import_file" )
> + 
> +     for i in $(seq $((sublength - 1))); do
> +-        channelInfo=$(jq --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file")
> ++        channelInfo=$(guix-jq --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file")
> + 	printf "%s\n" "$(printf "%s" "$channelInfo" | tr -d '[]"\n,')" >> "$subscriptions_file"

And don't forget 'tr'.

Greetings,
Maxime.
Raghav Gururajan July 5, 2021, 12:03 p.m. UTC | #2
Hi Maxime!

> That's a neat trick to avoid fragile (substitute* ...).
> However, as I understand it, the origin is meant to be
> usable as source code (think install dependencies && guix build && tar xzf stuff.tgz
> && ./configure && make && try it out), such that
> "guix build --source=transitive stuff" would give all the
> source code for building stuff (in the sense of ‘Corresponding Source’
> of the GPL), and "guix-mpv", 'guix-jq" ... don't exist anywhere.
> 
> I don't know if that has been spelled out somewhere though.
> 
> I'd suggest adding "patch" to 'native-inputs', adding the patch
> to 'inputs' or 'native-inputs' (doesn't really matter which) and
> doing (invoke "patch" OPTIONS "blabla.patch") before the substitute*.
> 
> Actually, myself I'm not convinced because you could consider
> the package definition itself to be part of the ‘corresponding source’.

I get the idea, but I don't think we can call .patch files inside 
phases, the patches directory is not exposed/available inside 
build-environment.

> I'm wondering if (string-append (assoc-ref inputs "catimg") "/bin/catimg")
> would be better, as 'string-append' is less complex than 'format'
> and "format" doesn't seem to provide any additional value here.

Cool! I have made this change in v4.

> Now about the patch:
> 
> Maybe tell people to report issues at bug-guix@gnu.org or #guix? Dunno

Changed in v4.

> Don't forget to patch 'column'.
> 
> Don't forget to patch "mkfifo".
> 
> Don't forget patching 'sleep'. It is not shell a built-in
> (try "type sleep" and "type [" in a terminal").
> 
> Don't forget patching 'grep' and 'tr'.
> 
> Don't forget 'grep -> guix-grep' and 'cut -> guix-cut'
> 
> Don't forget 'awk -> guix-awk' and 'sort -> guix-sort' and 'uniq -> 'guix-uniq'
> 
> Don't forget 'sed -> guix-sed' and 'awk -> guix-awk'

Thanks, I have patched these in v4.

> FWIW, writing to "/tmp/ytfzf" seems to be a potential security problem
> and bad behaviour on multiple-user systems.
> 
> What would happen if /tmp/ytfzf is a symlink to /etc/passwd an ytfzf is run
> as root (yes, running as root is not recommended)? Would that brick the system?
> What if /tmp/ytfzf is a symlink to ~/.profile? Would that brick the login?
> 
> What if multiple users run ytfzf concurrently? Would they overwrite eaech
> other subtitles?  Would a different user be able to see what the other
> is downloading?
> 
> A relatively easy fix would be to write to, say, $HOME/.cache/ytzf-subs
> instead (not sure what the proper directory would be), which is completely
> under the user's control.

Good catch. I have changed this in v4.

Let me know if v4 looks good.

Regards,
RG.
M July 5, 2021, 12:13 p.m. UTC | #3
Raghav Gururajan schreef op ma 05-07-2021 om 08:03 [-0400]:
> [...]
> > 
> > I'd suggest adding "patch" to 'native-inputs', adding the patch
> > to 'inputs' or 'native-inputs' (doesn't really matter which) and
> > doing (invoke "patch" OPTIONS "blabla.patch") before the substitute*.
> > 
> > [...]
>
> I get the idea, but I don't think we can call .patch files inside 
> phases, the patches directory is not exposed/available inside 
> build-environment.

If the relevant patch files are added to 'inputs' or 'native-inputs',
then they are available in the build environment.  As an example,
see the "libpng-apng" package.  It adds the patch to 'inputs'
(named "apng") and invokes "patch" during the 'patch-apng' phase.

The "apng" input uses an 'origin' reference, but you could use
(local-file ...) there as well.  Or beter: use 'search-patch'
instead.

Greetings,
Maxime.
Raghav Gururajan July 5, 2021, 12:20 p.m. UTC | #4
Hi Maixme!

>> I get the idea, but I don't think we can call .patch files inside
>> phases, the patches directory is not exposed/available inside
>> build-environment.
> 
> If the relevant patch files are added to 'inputs' or 'native-inputs',
> then they are available in the build environment.  As an example,
> see the "libpng-apng" package.  It adds the patch to 'inputs'
> (named "apng") and invokes "patch" during the 'patch-apng' phase.
> 
> The "apng" input uses an 'origin' reference, but you could use
> (local-file ...) there as well.  Or beter: use 'search-patch'
> instead.

Ah thanks so much for the pointer. Since my v4 patch-set didn't come 
through, I'll make this change and send v5.

Regards,
RG.
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index f507fe566f..d494663f8e 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1856,6 +1856,8 @@  dist_patch_DATA =						\
   %D%/packages/patches/xsane-support-ipv6.patch			\
   %D%/packages/patches/xsane-tighten-default-umask.patch	\
   %D%/packages/patches/yggdrasil-extra-config.patch	\
+  %D%/packages/patches/ytfzf-programs.patch        \
+  %D%/packages/patches/ytfzf-updates.patch        \
   %D%/packages/patches/ytnef-CVE-2021-3403.patch	\
   %D%/packages/patches/ytnef-CVE-2021-3404.patch	\
   %D%/packages/patches/zstd-CVE-2021-24031_CVE-2021-24032.patch	\
diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm
index f01b6a614a..ccbbb3bc2d 100644
--- a/gnu/packages/image-viewers.scm
+++ b/gnu/packages/image-viewers.scm
@@ -18,6 +18,8 @@ 
 ;;; Copyright © 2021 Rovanion Luckey <rovanion.luckey@gmail.com>
 ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
 ;;; Copyright © 2021 Stefan Reichör <stefan@xsteve.at>
+;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
+;;; Copyright © 2021 jgart <jgart@dismail.de>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -46,6 +48,7 @@ 
   #:use-module (guix build-system python)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages algebra)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
@@ -64,6 +67,7 @@ 
   #:use-module (gnu packages image-processing)
   #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages maths)
+  #:use-module (gnu packages ncurses)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages perl-check)
   #:use-module (gnu packages photo)
@@ -71,10 +75,108 @@ 
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages qt)
+  #:use-module (gnu packages suckless)
+  #:use-module (gnu packages terminals)
+  #:use-module (gnu packages video)
+  #:use-module (gnu packages web)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages))
 
+(define-public ytfzf
+  (package
+    (name "ytfzf")
+    (version "1.2.0")
+    (home-page "https://github.com/pystardust/ytfzf")
+    (source
+     (origin
+       (method git-fetch)
+       (uri
+        (git-reference
+         (url home-page)
+         (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "00d416qb4109pm77ikhnmds8qng90ni2jan9kdnxz7b6sh5f61nz"))
+       (patches
+        (search-patches
+         ;; Prerequisite for 'patch phase.
+         "ytfzf-programs.patch"
+         ;; Disables self-update.
+         "ytfzf-updates.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f                      ; no test suite
+       #:modules
+       ((guix build gnu-build-system)
+        (guix build utils)
+        (srfi srfi-26))
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             ;; Use correct $PREFIX path.
+             (substitute* "Makefile"
+               (("/usr/bin")
+                (format #f "~a/bin"
+                        (assoc-ref outputs "out"))))
+             ;; Use absolute path to referenced programs.
+             (substitute* "ytfzf"
+               (("guix-catimg")
+                (format #f "~a/bin/catimg"
+                        (assoc-ref inputs "catimg")))
+               (("guix-chafa")
+                (format #f "~a/bin/chafa"
+                        (assoc-ref inputs "chafa")))
+               (("guix-curl")
+                (format #f "~a/bin/curl"
+                        (assoc-ref inputs "curl")))
+               (("guix-dmenu")
+                (format #f "~a/bin/dmenu"
+                        (assoc-ref inputs "dmenu")))
+               (("guix-fzf")
+                (format #f "~a/bin/fzf"
+                        (assoc-ref inputs "fzf")))
+               (("guix-jp2a")
+                (format #f "~a/bin/jp2a"
+                        (assoc-ref inputs "jp2a")))
+               (("guix-jq")
+                (format #f "~a/bin/jq"
+                        (assoc-ref inputs "jq")))
+               (("guix-mpv")
+                (format #f "~a/bin/mpv"
+                        (assoc-ref inputs "mpv")))
+               (("guix-notify-send")
+                (format #f "~a/bin/notify-send"
+                        (assoc-ref inputs "libnotify")))
+               (("guix-tput")
+                (format #f "~a/bin/tput"
+                        (assoc-ref inputs "ncurses")))
+               (("guix-ueberzug")
+                (format #f "~a/bin/ueberzug"
+                        (assoc-ref inputs "python-ueberzug")))
+               (("guix-youtube-dl")
+                (format #f "~a/bin/youtube-dl"
+                        (assoc-ref inputs "youtube-dl"))))))
+         (delete 'configure))))         ;no configure script
+    (inputs
+     `(("catimg" ,catimg)
+       ("chafa" ,chafa)
+       ("curl" ,curl)
+       ("dmenu" ,dmenu)
+       ("fzf" ,fzf)
+       ("jp2a" ,jp2a)
+       ("jq" ,jq)
+       ("libnotify" ,libnotify)
+       ("mpv" ,mpv)
+       ("ncurses" ,ncurses)
+       ("python-ueberzug" ,python-ueberzug)
+       ("youtube-dl" ,youtube-dl)))
+    (synopsis "Find and watch PeerTube or YouTube videos from the terminal")
+    (description "@code{ytfzf} is a POSIX script that helps you find PeerTube or
+YouTube videos without requiring API and opens/downloads them using mpv/ytdl.")
+    (license license:gpl3+)))
+
 (define-public feh
   (package
     (name "feh")
diff --git a/gnu/packages/patches/ytfzf-programs.patch b/gnu/packages/patches/ytfzf-programs.patch
new file mode 100644
index 0000000000..f744c19aeb
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-programs.patch
@@ -0,0 +1,372 @@ 
+From a5ed861c4d1ee0902650eb6aa68c5ffa17e7fa48 Mon Sep 17 00:00:00 2001
+From: LibreMiami <packaging-guix@libremiami.org>
+Date: Sat, 26 Jun 2021 20:23:11 -0400
+Subject: [PATCH 1/2] Modify the strings of referenced programs.
+
+Prefix the strings of referenced programs with the string "guix-", so that they
+can be easily substituted with absolute paths using a custom-phase.
+---
+ ytfzf | 110 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 55 insertions(+), 55 deletions(-)
+
+diff --git a/ytfzf b/ytfzf
+index f4d2e0d..28e320b 100755
+--- a/ytfzf
++++ b/ytfzf
+@@ -49,19 +49,19 @@ cache_dir=${YTFZF_CACHE-${cache_dir-$HOME/.cache/ytfzf}}
+ #video type preference (mp4/1080p, mp4/720p, etc..)
+ video_pref=${YTFZF_PREF-${video_pref-}}
+ #the menu to use instead of fzf when -D is specified
+-external_menu=${YTFZF_EXTMENU-${external_menu-dmenu -i -l 30 -p Search:}}
++external_menu=${YTFZF_EXTMENU-${external_menu-guix-dmenu -i -l 30 -p Search:}}
+ #number of columns (characters on a line) the external menu can have
+ #necessary for formatting text for external menus
+ external_menu_len=${YTFZF_EXTMENU_LEN-${external_menu_len-220}}
+ #player settings (players need to support streaming with youtube-dl)
+ #player to use for watching the video
+-video_player=${YTFZF_PLAYER-${video_player-mpv}}
++video_player=${YTFZF_PLAYER-${video_player-guix-mpv}}
+ #if YTFZF_PREF is specified, use this player instead
+-video_player_format=${YTFZF_PLAYER_FORMAT-${video_player_format-mpv --ytdl-format=}}
++video_player_format=${YTFZF_PLAYER_FORMAT-${video_player_format-guix-mpv --ytdl-format=}}
+ #player to use for audio only
+-audio_player=${YTFZF_AUDIO_PLAYER-${audio_player-mpv --no-video}}
++audio_player=${YTFZF_AUDIO_PLAYER-${audio_player-guix-mpv --no-video}}
+ #the command to use for displaying thumbnails
+-thumb_disp_method=${YTFZF_THUMB_DISP_METHOD-${thumb_disp_method-ueberzug}}
++thumb_disp_method=${YTFZF_THUMB_DISP_METHOD-${thumb_disp_method-guix-ueberzug}}
+ #Storing the argument and location for autogenerated subtitles
+ [ -z "$YTFZF_SUBT_NAME" ] && YTFZF_SUBT_NAME=""
+ #Stores the language for the auto genereated subtitles
+@@ -177,12 +177,12 @@ dep_ck () {
+ 	done
+ 	unset Dep
+ }
+-dep_ck "jq" "youtube-dl" "curl"
++dep_ck "guix-jq" "guix-youtube-dl" "guix-curl"
+ 
+ 
+ #only check for mpv if $YTFZF_PLAYER is set to it
+ #don't check $YTFZF_PLAYER as it could be multiple commands
+-[ "$video_player" = "mpv" ] && dep_ck "mpv"
++[ "$video_player" = "guix-mpv" ] && dep_ck "guix-mpv"
+ 
+ ############################
+ #       Help Texts         #
+@@ -326,8 +326,8 @@ print_info () {
+ }
+ 
+ print_error () {
+-    [ $ext_menu_notifs -eq 1 ] && notify-send "error" "$*" || printf "\033[31m$*\033[0m" >&2
+-    [ $ext_menu_notifs -eq 1 ] && notify-send "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2
++    [ $ext_menu_notifs -eq 1 ] && guix-notify-send "error" "$*" || printf "\033[31m$*\033[0m" >&2
++    [ $ext_menu_notifs -eq 1 ] && guix-notify-send "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" || printf "Check for new versions and report at: https://github.com/pystardust/ytfzf\n" >&2
+ }
+ 
+ ############################
+@@ -398,8 +398,8 @@ format_fzf () {
+ format_menu () {
+ 	if [ "$is_ext_menu" -eq 0 ]; then
+ 		#dep_ck fzf here because it is only necessary to use here
+-		dep_ck "fzf"
+-		menu_command='column -t -s "$tab_space" | fzf -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS'
++		dep_ck "guix-fzf"
++		menu_command='column -t -s "$tab_space" | guix-fzf -m --bind change:top --tabstop=1 --layout=reverse --delimiter="$tab_space" --nth=1,2 --expect="$shortcuts" $FZF_DEFAULT_OPTS'
+ 		format_fzf
+ 	else
+ 		# Dmenu doesn't render tabs so removing it
+@@ -462,7 +462,7 @@ WIDTH=$FZF_PREVIEW_COLUMNS
+ HEIGHT=$FZF_PREVIEW_LINES
+ start_ueberzug () {
+     [ -e $FIFO ] || { mkfifo "$FIFO" || exit 1 ; }
+-    ueberzug layer --parser json --silent < "$FIFO" &
++    guix-ueberzug layer --parser json --silent < "$FIFO" &
+     exec 3>"$FIFO"
+ }
+ stop_ueberzug () {
+@@ -476,12 +476,12 @@ preview_img () {
+ 	shorturl=${args##*${tab_space}|}
+ 	shorturl="${shorturl%% *}"
+ 
+-	json_obj=$(printf "%s" "$videos_json" | jq '.[]|select( .videoID == "'"$shorturl"'")')
++	json_obj=$(printf "%s" "$videos_json" | guix-jq '.[]|select( .videoID == "'"$shorturl"'")')
+ 
+ 
+ 	IFS=$tab_space read -r title channel duration views date description <<-EOF
+ 	$(
+-		printf "%s" "$json_obj" | jq -r \
++		printf "%s" "$json_obj" | guix-jq -r \
+ 		'
+ 		[.title,.channel,.duration,.views,.date,.description]|@tsv
+ 		'
+@@ -530,31 +530,31 @@ preview_img () {
+ 		} > "$FIFO" ;;
+ 	    catimg)
+ 		printf "\n"
+-		catimg -w "$((thumb_width * 2))" "$IMAGE" ;;
++		guix-catimg -w "$((thumb_width * 2))" "$IMAGE" ;;
+ 	    jp2a)
+ 		printf "\n"
+-		jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=24 "$IMAGE" ;;
++		guix-jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=24 "$IMAGE" ;;
+ 	    jp2a-8)
+ 		printf "\n"
+-		jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=8 "$IMAGE" ;;
++		guix-jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=8 "$IMAGE" ;;
+ 	    jp2a-4)
+ 		printf "\n"
+-		jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=4 "$IMAGE" ;;
++		guix-jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors  --color-depth=4 "$IMAGE" ;;
+ 	    jp2a-gray|jp2a-grey)
+ 		printf "\n"
+-		jp2a --size="${thumb_width}x$((thumb_height / 2))" "$IMAGE" ;;
++		guix-jp2a --size="${thumb_width}x$((thumb_height / 2))" "$IMAGE" ;;
+ 	    chafa)
+ 		printf "\n"
+-		chafa --size="${thumb_width}x${thumb_height}" "$IMAGE" ;;
++		guix-chafa --size="${thumb_width}x${thumb_height}" "$IMAGE" ;;
+ 	    chafa-gray|chafa-grey)
+ 		printf "\n"
+-		chafa --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;;
++		guix-chafa --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;;
+ 	    chafa-4)
+ 		printf "\n"
+-		chafa --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;;
++		guix-chafa --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;;
+ 	    chafa-8)
+ 		printf "\n"
+-		chafa --size="${thumb_width}x${thumb_height}" --colors=256 "$IMAGE" ;;
++		guix-chafa --size="${thumb_width}x${thumb_height}" --colors=256 "$IMAGE" ;;
+ 	    custom)
+ 		if ! function_exists "handle_display_img"; then
+ 		    printf "\033[031mERROR[#07]: \033[0m\033[1mhandle_display_img\033[0m is not defined" >&2
+@@ -585,17 +585,17 @@ download_thumbnails () {
+ 	if [ "$thumbnail_quality" -eq 1 ]; then
+ 		image_download () {
+ 			# higher quality images
+-			curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
++			guix-curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
+ 		}
+ 	else
+ 		image_download () {
+- 			curl -s "$Url"  > "$thumb_dir/$Name.png"
++			guix-curl -s "$Url"  > "$thumb_dir/$Name.png"
+ 		}
+ 	fi
+ 
+ 	print_info "Downloading Thumbnails...\n"
+ 	thumb_urls=$(printf "%s" "$*" |\
+-		jq  -r '.[]|[.thumbs,.videoID]|@tsv' )
++		guix-jq  -r '.[]|[.thumbs,.videoID]|@tsv' )
+ 
+ 	while IFS=$tab_space read -r Url Name; do
+ 	    sleep 0.001
+@@ -668,7 +668,7 @@ get_yt_html () {
+     link=$1
+     query=$2
+     printf "%s" "$(
+-	curl "$link" -s \
++	guix-curl "$link" -s \
+ 	  -G --data-urlencode "search_query=$query" \
+ 	  -G --data-urlencode "sp=$sp" \
+ 	  -H 'Authority: www.youtube.com' \
+@@ -684,7 +684,7 @@ get_video_data () {
+ 	# outputs tab and pipe separated fields: title, channel, view count, video length, video upload date, and the video id/url
+ 	# from the videos_json
+ 	printf "%s" "$*" |\
+-	    jq -r '.[]| "\(.title)'"$tab_space"'|\(.channel)'"$tab_space"'|\(.views)'"$tab_space"'|\(.duration)'"$tab_space"'|\(.date)'"$tab_space"'|\(.videoID)"'
++	    guix-jq -r '.[]| "\(.title)'"$tab_space"'|\(.channel)'"$tab_space"'|\(.views)'"$tab_space"'|\(.duration)'"$tab_space"'|\(.date)'"$tab_space"'|\(.videoID)"'
+ }
+ 
+ scrape_channel () {
+@@ -723,7 +723,7 @@ scrape_channel () {
+ 
+ 	#gets a list of videos
+ 	videos_json=$(printf "%s" "$yt_json" |\
+-	jq '[ .contents | ..|.gridVideoRenderer? |
++	guix-jq '[ .contents | ..|.gridVideoRenderer? |
+ 	select(. !=null) |
+ 	    {
+ 	    	title: .title.runs[0].text,
+@@ -736,7 +736,7 @@ scrape_channel () {
+ 	    }
+ 	]')
+ 
+-	videos_json=$(printf "%s" "$videos_json" | jq '.[0:'$sub_link_count']')
++	videos_json=$(printf "%s" "$videos_json" | guix-jq '.[0:'$sub_link_count']')
+ 	printf "%s\n" "$videos_json" >> "$tmp_video_json_file"
+ 	#checks if it's empty in case it was defined in a config function eg: on_get_search
+ 	[ -z "$videos_data" ] && videos_data=$(get_video_data "$videos_json")
+@@ -768,11 +768,11 @@ get_trending_url_data () {
+ scrape_pt () {
+      #gets a list of videos
+      pt_json=$(
+-     curl \
++     guix-curl \
+          -s "https://sepiasearch.org/api/v1/search/videos" \
+ 	 -G --data-urlencode "search=$*") 
+      videos_json=$(printf "%s" "$pt_json" |\
+-	jq '[ .data | .[] |
++	guix-jq '[ .data | .[] |
+ 	    {
+ 		title: .name,
+ 		channel: .channel.displayName,
+@@ -829,7 +829,7 @@ scrape_yt () {
+ 	fi
+ 
+ 	#gets a list of videos
+-	videos_json=$(printf "%s" "$yt_json" | jq '[ .contents|
++	videos_json=$(printf "%s" "$yt_json" | guix-jq '[ .contents|
+ 	..|.videoRenderer? |
+ 	select(. !=null) |
+ 		{
+@@ -844,7 +844,7 @@ scrape_yt () {
+ 		}
+ 	]')
+ 
+-	playlist_json=$(printf "%s" "$yt_json" | jq '[ .contents|
++	playlist_json=$(printf "%s" "$yt_json" | guix-jq '[ .contents|
+ 	..|.playlistRenderer? |
+ 	select(. !=null) |
+ 		{
+@@ -919,16 +919,16 @@ user_selection () {
+ 
+ 	#show thumbnail menu
+ 	elif [ "$show_thumbnails" -eq 1 ] ; then
+-		dep_ck "ueberzug" "fzf"
++		dep_ck "guix-ueberzug" "guix-fzf"
+ 		export YTFZF_THUMB_DISP_METHOD="$thumb_disp_method"
+-		[ "$thumb_disp_method" = "ueberzug" ] && start_ueberzug
++		[ "$thumb_disp_method" = "guix-ueberzug" ] && start_ueberzug
+ 		#thumbnails only work in fzf, use fzf
+-		menu_command="fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \
++		menu_command="guix-fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \
+ 		--nth=1,2 --expect='$shortcuts' $FZF_DEFAULT_OPTS \
+ 		--layout=reverse --preview \"sh $0 -U {}\" \
+         	--preview-window \"$PREVIEW_SIDE:50%:noborder:wrap\""
+ 		selected_data=$( title_len=200 video_menu "$videos_data" )
+-		[ "$thumb_disp_method" = "ueberzug" ] && stop_ueberzug
++		[ "$thumb_disp_method" = "guix-ueberzug" ] && stop_ueberzug
+ 		# Deletes thumbnails if no video is selected
+ 		[ -z "$selected_data" ] && clean_up
+ 	#show regular menu
+@@ -988,7 +988,7 @@ format_user_selection () {
+ 			11) selected_urls=$selected_urls$new_line'https://www.youtube.com/watch?v='$surl ;;
+ 			34) selected_urls=$selected_urls$new_line'https://www.youtube.com/playlist?list='$surl ;;
+ 			36)
+-			    selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | jq '.[].url' | grep -F "$surl" | tr -d '"')" ;;
++			    selected_urls=$selected_urls$new_line"$(printf "%s" "$videos_json" | guix-jq '.[].url' | grep -F "$surl" | tr -d '"')" ;;
+ 			*) continue ;;
+ 		esac
+ 		refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | grep "|$surl" )
+@@ -1014,7 +1014,7 @@ print_data () {
+ get_video_format () {
+ 	# select format if flag given
+ 	[ $show_format -eq 0 ] && return
+-        formats=$(youtube-dl -F "$(printf "$selected_urls")") 
++        formats=$(guix-youtube-dl -F "$(printf "$selected_urls")")
+         line_number=$(printf "$formats" | grep -n '.*extension  resolution.*' | cut -d: -f1)
+         quality=$(printf "$formats \n1 2 xAudio" | awk -v lineno=$line_number 'FNR > lineno {print $3}' | sort -n |  awk -F"x" '{print $2 "p"}' | uniq | sed -e "s/Audiop/Audio/" -e "/^p$/d" | eval "$menu_command" | sed "s/p//g")
+ 		[ -z "$quality"  ] && exit;
+@@ -1026,9 +1026,9 @@ get_video_format () {
+ get_sub_lang () {
+     if [ $auto_caption -eq 1 ]; then
+         #Gets the auto generated subs and stores them in a file
+-        sub_list=$(youtube-dl --list-subs  --write-auto-sub "$selected_urls" | sed '/Available subtitles/,$d' | awk '{print $1}' | sed '1d;2d;3d')
++        sub_list=$(guix-youtube-dl --list-subs  --write-auto-sub "$selected_urls" | sed '/Available subtitles/,$d' | awk '{print $1}' | sed '1d;2d;3d')
+         if [ -n "$sub_list" ]; then
+-            [ -n "$selected_sub" ] ||  selected_sub=$(printf "$sub_list" | eval "$menu_command") &&  youtube-dl  --sub-lang $selected_sub  --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available."
++            [ -n "$selected_sub" ] ||  selected_sub=$(printf "$sub_list" | eval "$menu_command") &&  guix-youtube-dl  --sub-lang $selected_sub  --write-auto-sub --skip-download "$selected_urls" -o /tmp/ytfzf && YTFZF_SUBT_NAME="--sub-file=/tmp/ytfzf.$selected_sub.vtt" || printf "Auto generated subs not available."
+         fi
+ 	unset sub_list
+     fi
+@@ -1064,9 +1064,9 @@ open_player () {
+ 		fi
+ 	elif [ $is_download -eq 1 ]; then
+ 		if [ -z "$video_pref" ]; then
+-			youtube-dl "$@"  "$YTFZF_SUBT_NAME"
++			guix-youtube-dl "$@"  "$YTFZF_SUBT_NAME"
+ 		else
+-			youtube-dl -f "$video_pref"  "$@"  $YTFZF_SUBT_NAME || video_pref= open_player "$@"
++			guix-youtube-dl -f "$video_pref"  "$@"  $YTFZF_SUBT_NAME || video_pref= open_player "$@"
+ 		fi
+ 	fi
+ }
+@@ -1200,7 +1200,7 @@ search_history_menu () {
+     #when using an external menu, the search history will be done there
+         choice=$( printf "%s\n" "$search_history" | eval "$external_menu" )
+     else
+-        choice="$( printf "%s\n" "$search_history" | fzf --prompt="$search_history_prompt" --print-query --no-multi -d '\t' --with-nth=2.. --expect='alt-enter' --bind='tab:replace-query' )"
++        choice="$( printf "%s\n" "$search_history" | guix-fzf --prompt="$search_history_prompt" --print-query --no-multi -d '\t' --with-nth=2.. --expect='alt-enter' --bind='tab:replace-query' )"
+     fi
+ 
+     # first line is the fzf query (what the user types in fzf)
+@@ -1244,7 +1244,7 @@ search_history_menu () {
+ 
+ 	#if downloading, say Downloading not currently playing
+ 	[ $is_download -eq 1 ] && title="Downloading" || title="Currently playing"
+-	notify-send "$title" "$message" -i "$video_thumb"
++	guix-notify-send "$title" "$message" -i "$video_thumb"
+ 
+ 	unset message video_thumb title
+ }
+@@ -1262,7 +1262,7 @@ EOF
+ update_ytfzf () {
+ 	branch="$1"
+ 	updatefile="/tmp/ytfzf-update"
+-	curl -L "https://raw.githubusercontent.com/pystardust/ytfzf/$branch/ytfzf" -o "$updatefile"
++	guix-curl -L "https://raw.githubusercontent.com/pystardust/ytfzf/$branch/ytfzf" -o "$updatefile"
+ 
+ 	if sed -n '1p' < "$updatefile" | grep -q '#!/bin/sh'; then
+ 		chmod 755 "$updatefile"
+@@ -1346,10 +1346,10 @@ create_subs () {
+     : > "$config_dir/subscriptions"
+ 
+     # check how many subscriptions there are in the file
+-    sublength=$( jq '. | length' < "$yt_sub_import_file" )
++    sublength=$( guix-jq '. | length' < "$yt_sub_import_file" )
+ 
+     for i in $(seq $((sublength - 1))); do
+-        channelInfo=$(jq --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file")
++        channelInfo=$(guix-jq --argjson index ${i} '[ "https://www.youtube.com/channel/" + .[$index].snippet.resourceId.channelId + "/videos", "#" + .[$index].snippet.title ]' < "$yt_sub_import_file")
+ 	printf "%s\n" "$(printf "%s" "$channelInfo" | tr -d '[]"\n,')" >> "$subscriptions_file"
+     done
+     exit
+@@ -1486,8 +1486,8 @@ parse_opt () {
+ 			exit ;;
+ 		version)
+ 			printf "\033[1mytfzf:\033[0m %s\n" "$YTFZF_VERSION"
+-			printf "\033[1myoutube-dl:\033[0m %s\n" "$(youtube-dl --version)"
+-			command -v "fzf" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(fzf --version)"
++			printf "\033[1myoutube-dl:\033[0m %s\n" "$(guix-youtube-dl --version)"
++			command -v "guix-fzf" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(guix-fzf --version)"
+ 			exit ;;
+ 
+ 		subt)
+@@ -1559,19 +1559,19 @@ done
+ shift $((OPTIND-1))
+ 
+ #only apply to ext_menu since they dont have a terminal to print to
+-[ $is_ext_menu -eq 1 ] && command -v notify-send 1>/dev/null 2>&1 && ext_menu_notifs=1 || ext_menu_notifs=0
++[ $is_ext_menu -eq 1 ] && command -v guix-notify-send 1>/dev/null 2>&1 && ext_menu_notifs=1 || ext_menu_notifs=0
+ 
+ #used for thumbnail previews in ueberzug
+ if [ $is_ext_menu -eq 0 ]; then
+-	export TTY_LINES=$(tput lines)
+- 	export TTY_COLS=$(tput cols)
++	export TTY_LINES=$(guix-tput lines)
++	export TTY_COLS=$(guix-tput cols)
+ fi
+ 
+ #if both are true, it defaults to using fzf, and if fzf isnt installed it will throw an error
+ #so print this error instead and set $show_thumbnails to 0
+ if [ $is_ext_menu -eq 1 ] && [ $show_thumbnails -eq 1 ]; then
+ 	[ $ext_menu_notifs -eq 1 ] &&\
+-	    notify-send "warning" "Currently thumbnails do not work in external menus" ||\
++	    guix-notify-send "warning" "Currently thumbnails do not work in external menus" ||\
+ 	    printf "\033[33mWARNING: Currently thumbnails do not work in external menus\033[0m\n" >&2
+ 	show_thumbnails=0
+ fi
+-- 
+2.32.0
+
diff --git a/gnu/packages/patches/ytfzf-updates.patch b/gnu/packages/patches/ytfzf-updates.patch
new file mode 100644
index 0000000000..9811bd64be
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-updates.patch
@@ -0,0 +1,41 @@ 
+From b39ea2784c7616ca1e00bc605bf84b1360f4125f Mon Sep 17 00:00:00 2001
+From: LibreMiami <packaging-guix@libremiami.org>
+Date: Sat, 26 Jun 2021 20:34:39 -0400
+Subject: [PATCH 2/2] Disable updates within the application.
+
+---
+ ytfzf | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+diff --git a/ytfzf b/ytfzf
+index 28e320b..69a6f8e 100755
+--- a/ytfzf
++++ b/ytfzf
+@@ -1260,22 +1260,8 @@ EOF
+ }
+ 
+ update_ytfzf () {
+-	branch="$1"
+-	updatefile="/tmp/ytfzf-update"
+-	guix-curl -L "https://raw.githubusercontent.com/pystardust/ytfzf/$branch/ytfzf" -o "$updatefile"
+-
+-	if sed -n '1p' < "$updatefile" | grep -q '#!/bin/sh'; then
+-		chmod 755 "$updatefile"
+-		[ "$(uname)" = "Darwin" ] && prefix="/usr/local/bin" || prefix="/usr/bin"
+-		function_exists "sudo" && doasroot="sudo" || doasroot="doas"
+-		$doasroot cp "$updatefile" "$prefix/ytfzf"
+-		unset prefix doasroot
+-	else
+-		printf "%bFailed to update ytfzf. Try again later.%b" "$c_red" "$c_reset"
+-	fi
+-
+-	rm "$updatefile"
+-	exit 0
++       printf "%bUpdates have to be installed with Guix.%b\n" "$c_red" "$c_reset"
++       exit 1
+ }
+ 
+ #gives a value to sort by (this will give the unix time the video was uploaded)
+-- 
+2.32.0
+