Toggle diff (466 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index beaf99bf71..66687b420c 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1858,6 +1858,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..caa4974974 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)
@@ -53,6 +56,7 @@
#:use-module (gnu packages documentation)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages freedesktop)
+ #:use-module (gnu packages gawk)
#:use-module (gnu packages gettext)
#:use-module (gnu packages ghostscript)
#:use-module (gnu packages gl)
@@ -63,7 +67,9 @@
#:use-module (gnu packages image)
#:use-module (gnu packages image-processing)
#:use-module (gnu packages imagemagick)
+ #:use-module (gnu packages linux)
#: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 +77,164 @@
#: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
+ ;; Pre-requisite 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)
+ (let* ((out (assoc-ref outputs "out"))
+ (binutils (assoc-ref inputs "binutils"))
+ (catimg (assoc-ref inputs "catimg"))
+ (chafa (assoc-ref inputs "chafa"))
+ (coreutils (assoc-ref inputs "coreutils"))
+ (curl (assoc-ref inputs "curl"))
+ (dmenu (assoc-ref inputs "dmenu"))
+ (fzf (assoc-ref inputs "fzf"))
+ (gawk (assoc-ref inputs "gawk"))
+ (grep (assoc-ref inputs "grep"))
+ (jp2a (assoc-ref inputs "jp2a"))
+ (jq (assoc-ref inputs "jq"))
+ (libnotify (assoc-ref inputs "libnotify"))
+ (mpv (assoc-ref inputs "mpv"))
+ (ncurses (assoc-ref inputs "ncurses"))
+ (python-ueberzug (assoc-ref inputs "python-ueberzug"))
+ (sed (assoc-ref inputs "sed"))
+ (util-linux (assoc-ref inputs "util-linux"))
+ (youtube-dl (assoc-ref inputs "youtube-dl")))
+ ;; Use correct $PREFIX path.
+ (substitute* "Makefile"
+ (("/usr/bin")
+ (string-append out "/bin")))
+ ;; Use absolute path for referenced programs.
+ (substitute* "ytfzf"
+ (("@awk@")
+ (string-append gawk "/bin/awk"))
+ (("@cat@")
+ (string-append coreutils "/bin/cat"))
+ (("@catimg@")
+ (string-append catimg "/bin/catimg"))
+ (("@chafa@")
+ (string-append chafa "/bin/chafa"))
+ (("@chmod@")
+ (string-append coreutils "/bin/chmod"))
+ (("@column@")
+ (string-append util-linux "/bin/column"))
+ (("@cp@")
+ (string-append coreutils "/bin/cp"))
+ (("@cut@")
+ (string-append coreutils "/bin/cut"))
+ (("@curl@")
+ (string-append curl "/bin/curl"))
+ (("@date@")
+ (string-append coreutils "/bin/date"))
+ (("@dmenu@")
+ (string-append dmenu "/bin/dmenu"))
+ (("@fzf@")
+ (string-append fzf "/bin/fzf"))
+ (("@grep@")
+ (string-append grep "/bin/grep"))
+ (("@head@")
+ (string-append coreutils "/bin/head"))
+ (("@jp2a@")
+ (string-append jp2a "/bin/jp2a"))
+ (("@jq@")
+ (string-append jq "/bin/jq"))
+ (("@mkdir@")
+ (string-append coreutils "/bin/mkdir"))
+ (("@mkfifo@")
+ (string-append coreutils "/bin/mkfifo"))
+ (("@mpv@")
+ (string-append mpv "/bin/mpv"))
+ (("@nohup@")
+ (string-append coreutils "/bin/nohup"))
+ (("@notify-send@")
+ (string-append libnotify "/bin/notify-send"))
+ (("@rm@")
+ (string-append coreutils "/bin/rm"))
+ (("@sed@")
+ (string-append sed "/bin/sed"))
+ (("@seq@")
+ (string-append coreutils "/bin/seq"))
+ (("@setsid@")
+ (string-append util-linux "/bin/setsid"))
+ (("@sleep@")
+ (string-append coreutils "/bin/sleep"))
+ (("@sort@")
+ (string-append coreutils "/bin/sort"))
+ (("@tput@")
+ (string-append ncurses "/bin/tput"))
+ (("@tr@")
+ (string-append coreutils "/bin/tr"))
+ (("@ueberzug@")
+ (string-append python-ueberzug "/bin/ueberzug"))
+ (("@uname@")
+ (string-append coreutils "/bin/uname"))
+ (("@uniq@")
+ (string-append coreutils "/bin/uniq"))
+ (("@wc@")
+ (string-append coreutils "/bin/wc"))
+ (("@youtube-dl@")
+ (string-append youtube-dl "/bin/youtube-dl"))))))
+ (delete 'configure)))) ;no configure script
+ (inputs
+ `(("binutils" ,binutils)
+ ("catimg" ,catimg)
+ ("chafa" ,chafa)
+ ("coreutils" ,coreutils)
+ ("curl" ,curl)
+ ("dmenu" ,dmenu)
+ ("fzf" ,fzf)
+ ("gawk" ,gawk)
+ ("grep" ,grep)
+ ("jp2a" ,jp2a)
+ ("jq" ,jq)
+ ("libnotify" ,libnotify)
+ ("mpv" ,mpv)
+ ("ncurses" ,ncurses)
+ ("python-ueberzug" ,python-ueberzug)
+ ("sed" ,sed)
+ ("util-linux" ,util-linux)
+ ("youtube-dl" ,youtube-dl)))
+ (synopsis "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..fc7684d3ef
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-programs.patch
@@ -0,0 +1,650 @@
+From 291a0cd6e24026da0cfd2007e48c00f0824bd0d2 Mon Sep 17 00:00:00 2001
+From: Raghav Gururajan <rg@raghavgururajan.name>
+Date: Mon, 5 Jul 2021 06:45:49 -0400
+Subject: [PATCH 1/2] Modify the strings of referenced programs.
+
+Pattern the strings of referenced programs, so that they can be easily
+substituted with absolute paths using a custom-phase.
+
+Co-authored-by: jgart <jgart@dismail.de>
+---
+ ytfzf | 202 +++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 101 insertions(+), 101 deletions(-)
+
+diff --git a/ytfzf b/ytfzf
+index f4d2e0d..0a2c372 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-@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-@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-@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-@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-@ueberzug@}}
+ #Storing the argument and location for autogenerated subtitles
+ [ -z "$YTFZF_SUBT_NAME" ] && YTFZF_SUBT_NAME=""
+ #Stores the language for the auto genereated subtitles
+@@ -85,8 +85,8 @@ subscriptions_file=${subscriptions_file-$config_dir/subscriptions}
+ #> stores the pid of running ytfzf sessions
+ pid_file="$cache_dir/.pid"
+ #> make folders that don't exist
+-[ -d "$cache_dir" ] || mkdir -p "$cache_dir"
+-[ -d "$thumb_dir" ] || mkdir -p "$thumb_dir"
++[ -d "$cache_dir" ] || @mkdir@ -p "$cache_dir"
++[ -d "$thumb_dir" ] || @mkdir@ -p "$thumb_dir"
+
+ #> config settings
+ #list of shortcuts to use in fzf
+@@ -177,12 +177,12 @@ dep_ck () {
+ done
+ unset Dep
+ }
+-dep_ck "jq" "youtube-dl" "curl"
++dep_ck "@jq@" "@youtube-dl@" "@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" = "@mpv@" ] && dep_ck "@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 ] && @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
+ }
+
+ ############################
+@@ -398,12 +398,12 @@ 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 "@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'
+ format_fzf
+ else
+ # Dmenu doesn't render tabs so removing it
+- menu_command='tr -d "$tab_space" | '"$external_menu"
++ menu_command='@tr@ -d "$tab_space" | '"$external_menu"
+ format_ext_menu
+ fi
+ }
+@@ -461,13 +461,13 @@ ID="ytfzf-ueberzug"
+ WIDTH=$FZF_PREVIEW_COLUMNS
+ HEIGHT=$FZF_PREVIEW_LINES
+ start_ueberzug () {
+- [ -e $FIFO ] || { mkfifo "$FIFO" || exit 1 ; }
+- ueberzug layer --parser json --silent < "$FIFO" &
++ [ -e $FIFO ] || { @mkfifo@ "$FIFO" || exit 1 ; }
++ @ueberzug@ layer --parser json --silent < "$FIFO" &
+ exec 3>"$FIFO"
+ }
+ stop_ueberzug () {
+ exec 3>&-
+- rm "$FIFO" > /dev/null 2>&1
++ @rm@ "$FIFO" > /dev/null 2>&1
+ }
+
+ preview_img () {
+@@ -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" | @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" | @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" ;;
++ @catimg@ -w "$((thumb_width * 2))" "$IMAGE" ;;
+ jp2a)
+ printf "\n"
+- jp2a --size="${thumb_width}x$((thumb_height / 2))" --colors --color-depth=24 "$IMAGE" ;;
++ @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" ;;
++ @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" ;;
++ @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" ;;
++ @jp2a@ --size="${thumb_width}x$((thumb_height / 2))" "$IMAGE" ;;
+ chafa)
+ printf "\n"
+- chafa --size="${thumb_width}x${thumb_height}" "$IMAGE" ;;
++ @chafa@ --size="${thumb_width}x${thumb_height}" "$IMAGE" ;;
+ chafa-gray|chafa-grey)
+ printf "\n"
+- chafa --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;;
++ @chafa@ --size="${thumb_width}x${thumb_height}" --colors=2 "$IMAGE" ;;
+ chafa-4)
+ printf "\n"
+- chafa --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;;
++ @chafa@ --size="${thumb_width}x${thumb_height}" --colors=16 "$IMAGE" ;;
+ chafa-8)
+ printf "\n"
+- chafa --size="${thumb_width}x${thumb_height}" --colors=256 "$IMAGE" ;;
++ @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,20 +585,20 @@ download_thumbnails () {
+ if [ "$thumbnail_quality" -eq 1 ]; then
+ image_download () {
+ # higher quality images
+- curl -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
++ @curl@ -s "$Url" -G --data-urlencode "sqp=" > "$thumb_dir/$Name.png"
+ }
+ else
+ image_download () {
+- curl -s "$Url" > "$thumb_dir/$Name.png"
++ @curl@ -s "$Url" > "$thumb_dir/$Name.png"
+ }
+ fi
+
+ print_info "Downloading Thumbnails...\n"
+ thumb_urls=$(printf "%s" "$*" |\
+- jq -r '.[]|[.thumbs,.videoID]|@tsv' )
++ @jq@ -r '.[]|[.thumbs,.videoID]|@tsv' )
+
+ while IFS=$tab_space read -r Url Name; do
+- sleep 0.001
++ @sleep@ 0.001
+ {
+ image_download
+ } &
+@@ -628,7 +628,7 @@ get_sp_filter () {
+ #another example is sort by filter + upload date filter only changes one character as well
+ if [ -n "$filter_id" ]; then
+ #gets the character in the filter_id that needs to be replaced if upload_date_filter is also given
+- upload_date_character=$(printf "%s" "$filter_id" | awk '{print substr($1, 8, 1)}')
++ upload_date_character=$(printf "%s" "$filter_id" | @awk@ '{print substr($1, 8, 1)}')
+ fi
+
+ #For each of these, if upload_date_character is unset, the filter_id should be the normal filter
+@@ -650,7 +650,7 @@ get_sp_filter () {
+ if [ -n "$upload_date_character" ]; then
+ #replaces the 8th character in the filter_id with the appropriate character
+ #the 8th character specifies the upload_date_filter
+- sp=$(printf "%s" "$filter_id" | sed 's/\(.\{7\}\)./\1'"$upload_date_character"'/')
++ sp=$(printf "%s" "$filter_id" | @sed@ 's/\(.\{7\}\)./\1'"$upload_date_character"'/')
+ #otherwise set it to the filter_id
+ else
+ sp=$filter_id
+@@ -660,15 +660,15 @@ get_sp_filter () {
+
+ get_yt_json () {
+ # scrapes the json embedded in the youtube html page
+- printf "%s" "$*" | sed -n '/var *ytInitialData/,$p' | tr -d '\n' |\
+- sed -E ' s_^.*var ytInitialData ?=__ ; s_;</script>.*__ ;'
++ printf "%s" "$*" | @sed@ -n '/var *ytInitialData/,$p' | @tr@ -d '\n' |\
++ @sed@ -E ' s_^.*var ytInitialData ?=__ ; s_;</script>.*__ ;'
+ }
+
+ get_yt_html () {
+ link=$1
+ query=$2
+ printf "%s" "$(
+- curl "$link" -s \
++ @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)"'
++ @jq@ -r '.[]| "\(.title)'"$tab_space"'|\(.channel)'"$tab_space"'|\(.views)'"$tab_space"'|\(.duration)'"$tab_space"'|\(.date)'"$tab_space"'|\(.videoID)"'
+ }
+
+ scrape_channel () {
+@@ -694,7 +694,7 @@ scrape_channel () {
+ channel_url=$*
+
+ # Converting channel title