* [bug#49238] Ytfzf
@ 2021-06-27 5:44 Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
` (4 more replies)
0 siblings, 5 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-06-27 5:44 UTC (permalink / raw)
To: 49238; +Cc: jgart
[-- Attachment #1.1: Type: text/plain, Size: 296 bytes --]
Hello Guix!
This is the patch-series to package Ytfzf, which is a joint effort by
Jorge (jgart) and I, as a part of LibreMiami.
The Ytfzf app is being placed in image-viewer.scm, as placing it in
video.scm causes conflict somewhere while importing image-viewer.scm.
Regards,
RG.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug.
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
@ 2021-06-27 5:47 ` Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-06-29 19:06 ` [bug#49238] [PATCH v2 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
` (3 subsequent siblings)
4 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-06-27 5:47 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart, LibreMiami
From: LibreMiami <packaging-guix@libremiami.org>
* gnu/packages/python-xyz.scm (python-ueberzug): New variable.
Co-authored-by: Raghav Gururajan <rg@raghavgururajan.name>
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/packages/python-xyz.scm | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 7dae6607a0..41761d8b7a 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -101,6 +101,7 @@
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
+;;; Copyright © 2021 jgart <jgart@dismail.de>
;;; Copyright © 2021 Danial Behzadi <dani.behzi@ubuntu.com>
;;;
;;; This file is part of GNU Guix.
@@ -221,6 +222,42 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26))
+(define-public python-ueberzug
+ (package
+ (name "python-ueberzug")
+ (version "18.1.9")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "ueberzug" version))
+ (sha256
+ (base32
+ "1hxd45dnwa9yv908acarr98n2drmar66wzq9z2qd3irj24srzr3w"))))
+ (build-system python-build-system)
+ (inputs
+ `(("libx11" ,libx11)
+ ("libxext" ,libxext)))
+ (propagated-inputs
+ `(("python-attrs" ,python-attrs)
+ ("python-docopt" ,python-docopt)
+ ("python-pillow" ,python-pillow)
+ ("python-xlib" ,python-xlib)))
+ (home-page "https://github.com/seebye/ueberzug")
+ (synopsis "Command line util to display images in combination with X11")
+ (description "Überzug is a command line util which allows to draw images on
+terminals by using child windows. The advantages of using Überzug are:
+@itemize
+@item No race conditions as a new window is created to display images.
+@item Expose events will be processed, so images will be redrawn on switch
+workspaces.
+@item Tmux support (excluding multi pane windows).
+@item Terminals without the WINDOWID environment variable are supported.
+@item Chars are used as position - and size unit.
+@item No memory leak (/ unlimited cache).
+@end itemize")
+ (license license:gpl3+)))
+
+
(define-public python-fire
(package
(name "python-fire")
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf.
2021-06-27 5:47 ` [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-06-27 5:47 ` Raghav Gururajan via Guix-patches via
2021-06-30 19:38 ` Maxime Devos
0 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-06-27 5:47 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart, LibreMiami
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
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
+
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v2 1/2] gnu: Add python-ueberzug.
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-06-29 19:06 ` Raghav Gururajan via Guix-patches via
2021-06-29 19:06 ` [bug#49238] [PATCH v2 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-05 11:14 ` [bug#49238] [PATCH v3 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
` (2 subsequent siblings)
4 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-06-29 19:06 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart, LibreMiami
From: LibreMiami <packaging-guix@libremiami.org>
* gnu/packages/python-xyz.scm (python-ueberzug): New variable.
Co-authored-by: Raghav Gururajan <rg@raghavgururajan.name>
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/packages/python-xyz.scm | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 1aa53b7825..f0fbe91b73 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -101,6 +101,7 @@
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
+;;; Copyright © 2021 jgart <jgart@dismail.de>
;;; Copyright © 2021 Danial Behzadi <dani.behzi@ubuntu.com>
;;;
;;; This file is part of GNU Guix.
@@ -221,6 +222,42 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26))
+(define-public python-ueberzug
+ (package
+ (name "python-ueberzug")
+ (version "18.1.9")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "ueberzug" version))
+ (sha256
+ (base32
+ "1hxd45dnwa9yv908acarr98n2drmar66wzq9z2qd3irj24srzr3w"))))
+ (build-system python-build-system)
+ (inputs
+ `(("libx11" ,libx11)
+ ("libxext" ,libxext)))
+ (propagated-inputs
+ `(("python-attrs" ,python-attrs)
+ ("python-docopt" ,python-docopt)
+ ("python-pillow" ,python-pillow)
+ ("python-xlib" ,python-xlib)))
+ (home-page "https://github.com/seebye/ueberzug")
+ (synopsis "Command line util to display images in combination with X11")
+ (description "Überzug is a command line util which allows to draw images on
+terminals by using child windows. The advantages of using Überzug are:
+@itemize
+@item No race conditions as a new window is created to display images.
+@item Expose events will be processed, so images will be redrawn on switch
+workspaces.
+@item Tmux support (excluding multi pane windows).
+@item Terminals without the WINDOWID environment variable are supported.
+@item Chars are used as position - and size unit.
+@item No memory leak (/ unlimited cache).
+@end itemize")
+ (license license:gpl3+)))
+
+
(define-public python-fire
(package
(name "python-fire")
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v2 2/2] gnu: Add ytfzf.
2021-06-29 19:06 ` [bug#49238] [PATCH v2 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-06-29 19:06 ` Raghav Gururajan via Guix-patches via
0 siblings, 0 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-06-29 19:06 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart, LibreMiami
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
diff --git a/gnu/local.mk b/gnu/local.mk
index 6b9202cba1..919a0d4a34 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..e6c8cfbe8c 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
+ ;; 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)
+ ;; Use correct $PREFIX path.
+ (substitute* "Makefile"
+ (("/usr/bin")
+ (format #f "~a/bin"
+ (assoc-ref outputs "out"))))
+ ;; Use absolute path to referenced programs.
+ (substitute* "ytfzf"
+ (("@catimg@")
+ (format #f "~a/bin/catimg"
+ (assoc-ref inputs "catimg")))
+ (("@chafa@")
+ (format #f "~a/bin/chafa"
+ (assoc-ref inputs "chafa")))
+ (("@curl@")
+ (format #f "~a/bin/curl"
+ (assoc-ref inputs "curl")))
+ (("@dmenu@")
+ (format #f "~a/bin/dmenu"
+ (assoc-ref inputs "dmenu")))
+ (("@fzf@")
+ (format #f "~a/bin/fzf"
+ (assoc-ref inputs "fzf")))
+ (("@jp2a@")
+ (format #f "~a/bin/jp2a"
+ (assoc-ref inputs "jp2a")))
+ (("@jq@")
+ (format #f "~a/bin/jq"
+ (assoc-ref inputs "jq")))
+ (("@mpv@")
+ (format #f "~a/bin/mpv"
+ (assoc-ref inputs "mpv")))
+ (("@notify-send@")
+ (format #f "~a/bin/notify-send"
+ (assoc-ref inputs "libnotify")))
+ (("@tput@")
+ (format #f "~a/bin/tput"
+ (assoc-ref inputs "ncurses")))
+ (("@ueberzug@")
+ (format #f "~a/bin/ueberzug"
+ (assoc-ref inputs "python-ueberzug")))
+ (("@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..efcd70823a
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-programs.patch
@@ -0,0 +1,372 @@
+From 8a796549d756a40a174954d2858d4c5042e3808f 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.
+
+Pattern the strings of referenced programs, 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..2d917df 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
+@@ -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,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 "@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
+@@ -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" &
++ @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" | @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,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"
++ @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
+@@ -668,7 +668,7 @@ 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 () {
+@@ -723,7 +723,7 @@ scrape_channel () {
+
+ #gets a list of videos
+ videos_json=$(printf "%s" "$yt_json" |\
+- jq '[ .contents | ..|.gridVideoRenderer? |
++ @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" | @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 \
++ @curl@ \
+ -s "https://sepiasearch.org/api/v1/search/videos" \
+ -G --data-urlencode "search=$*")
+ videos_json=$(printf "%s" "$pt_json" |\
+- jq '[ .data | .[] |
++ @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" | @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" | @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 "@ueberzug@" "@fzf@"
+ export YTFZF_THUMB_DISP_METHOD="$thumb_disp_method"
+- [ "$thumb_disp_method" = "ueberzug" ] && start_ueberzug
++ [ "$thumb_disp_method" = "@ueberzug@" ] && start_ueberzug
+ #thumbnails only work in fzf, use fzf
+- menu_command="fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \
++ menu_command="@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" = "@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" | @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=$(@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=$(@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") && @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"
++ @youtube-dl@ "$@" "$YTFZF_SUBT_NAME"
+ else
+- youtube-dl -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@"
++ @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" | @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"
++ @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"
++ @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=$( @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=$(@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" "$(@youtube-dl@ --version)"
++ command -v "@fzf@" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(@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 @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=$(@tput@ lines)
++ export TTY_COLS=$(@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" ||\
++ @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..3cdc12b015
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-updates.patch
@@ -0,0 +1,41 @@
+From 374bd725ad5e52931d9ffeb1563ba31eb298aa5c 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 2d917df..7b0b227 100755
+--- a/ytfzf
++++ b/ytfzf
+@@ -1260,22 +1260,8 @@ EOF
+ }
+
+ update_ytfzf () {
+- branch="$1"
+- updatefile="/tmp/ytfzf-update"
+- @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
+
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf.
2021-06-27 5:47 ` [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
@ 2021-06-30 19:38 ` Maxime Devos
2021-07-05 12:03 ` Raghav Gururajan via Guix-patches via
0 siblings, 1 reply; 18+ messages in thread
From: Maxime Devos @ 2021-06-30 19:38 UTC (permalink / raw)
To: Raghav Gururajan, 49238; +Cc: jgart, LibreMiami
[-- Attachment #1: Type: text/plain, Size: 9184 bytes --]
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.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v3 1/2] gnu: Add python-ueberzug.
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-06-29 19:06 ` [bug#49238] [PATCH v2 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-07-05 11:14 ` Raghav Gururajan via Guix-patches via
2021-07-05 11:14 ` [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-05 15:10 ` [bug#49238] [PATCH v5 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-07-06 5:37 ` bug#49238: (no subject) Raghav Gururajan via Guix-patches via
4 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 11:14 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart
* gnu/packages/python-xyz.scm (python-ueberzug): New variable.
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/packages/python-xyz.scm | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index b74b3b808f..aa2406287d 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -101,6 +101,7 @@
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
+;;; Copyright © 2021 jgart <jgart@dismail.de>
;;; Copyright © 2021 Danial Behzadi <dani.behzi@ubuntu.com>
;;;
;;; This file is part of GNU Guix.
@@ -221,6 +222,41 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26))
+(define-public python-ueberzug
+ (package
+ (name "python-ueberzug")
+ (version "18.1.9")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "ueberzug" version))
+ (sha256
+ (base32
+ "1hxd45dnwa9yv908acarr98n2drmar66wzq9z2qd3irj24srzr3w"))))
+ (build-system python-build-system)
+ (inputs
+ `(("libx11" ,libx11)
+ ("libxext" ,libxext)))
+ (propagated-inputs
+ `(("python-attrs" ,python-attrs)
+ ("python-docopt" ,python-docopt)
+ ("python-pillow" ,python-pillow)
+ ("python-xlib" ,python-xlib)))
+ (home-page "https://github.com/seebye/ueberzug")
+ (synopsis "Command line util to display images in combination with X11")
+ (description "Überzug is a command line util which allows to draw images on
+terminals by using child windows. The advantages of using Überzug are:
+@itemize
+@item No race conditions as a new window is created to display images.
+@item Expose events will be processed, so images will be redrawn on switch
+workspaces.
+@item Tmux support (excluding multi pane windows).
+@item Terminals without the WINDOWID environment variable are supported.
+@item Chars are used as position - and size unit.
+@item No memory leak (/ unlimited cache).
+@end itemize")
+ (license license:gpl3+)))
+
(define-public python-fire
(package
(name "python-fire")
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf.
2021-07-05 11:14 ` [bug#49238] [PATCH v3 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-07-05 11:14 ` Raghav Gururajan via Guix-patches via
2021-07-05 12:02 ` Maxime Devos
0 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 11:14 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, jgart
* gnu/packages/image-viewers.scm (ytfzf): New variable.
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/local.mk | 2 +
gnu/packages/image-viewers.scm | 160 ++++++
gnu/packages/patches/ytfzf-programs.patch | 650 ++++++++++++++++++++++
gnu/packages/patches/ytfzf-updates.patch | 44 ++
4 files changed, 856 insertions(+)
create mode 100644 gnu/packages/patches/ytfzf-programs.patch
create mode 100644 gnu/packages/patches/ytfzf-updates.patch
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 page url to channel video url
+- if ! printf "%s" "$channel_url" | grep -q '/videos *$'; then
++ if ! printf "%s" "$channel_url" | @grep@ -q '/videos *$'; then
+ channel_url=${channel_url%/featured}/videos
+ fi
+
+@@ -706,8 +706,8 @@ scrape_channel () {
+ fi
+
+ #gets the channel name from title of page
+- channel_name=$(printf "%s" "$yt_html" | grep -o '<title>.*</title>' |
+- sed \
++ channel_name=$(printf "%s" "$yt_html" | @grep@ -o '<title>.*</title>' |
++ @sed@ \
+ -e 's/ - YouTube//' \
+ -e 's/<\/\?title>//g' \
+ -e "s/'/'/g" \
+@@ -723,7 +723,7 @@ scrape_channel () {
+
+ #gets a list of videos
+ videos_json=$(printf "%s" "$yt_json" |\
+- jq '[ .contents | ..|.gridVideoRenderer? |
++ @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" | @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 \
++ @curl@ \
+ -s "https://sepiasearch.org/api/v1/search/videos" \
+ -G --data-urlencode "search=$*")
+ videos_json=$(printf "%s" "$pt_json" |\
+- jq '[ .data | .[] |
++ @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" | @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" | @jq@ '[ .contents|
+ ..|.playlistRenderer? |
+ select(. !=null) |
+ {
+@@ -904,31 +904,31 @@ get_search_query () {
+ #> To select videos from videos_data
+ user_selection () {
+ #remove subscription separators
+- videos_data_clean=$(printf "%s" "$videos_data" | sed "/.*$tab_space$/d")
++ videos_data_clean=$(printf "%s" "$videos_data" | @sed@ "/.*$tab_space$/d")
+
+ #$selected_data is the video the user picked
+ #picks the first n videos
+ if [ "$select_all" -eq 1 ] ; then
+ selected_data=$videos_data_clean
+ elif [ "$auto_select" -eq 1 ] ; then
+- selected_data=$(printf "%s\n" "$videos_data_clean" | sed "${link_count}"q )
++ selected_data=$(printf "%s\n" "$videos_data_clean" | @sed@ "${link_count}"q )
+ #picks n random videos
+ elif [ "$random_select" -eq 1 ] ; then
+- selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | head -n${link_count})
++ selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | @head@ -n${link_count})
+ #posix_shuf, pick the first $link_count videos
+
+ #show thumbnail menu
+ elif [ "$show_thumbnails" -eq 1 ] ; then
+- dep_ck "ueberzug" "fzf"
++ dep_ck "@ueberzug@" "@fzf@"
+ export YTFZF_THUMB_DISP_METHOD="$thumb_disp_method"
+- [ "$thumb_disp_method" = "ueberzug" ] && start_ueberzug
++ [ "$thumb_disp_method" = "@ueberzug@" ] && start_ueberzug
+ #thumbnails only work in fzf, use fzf
+- menu_command="fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \
++ menu_command="@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" = "@ueberzug@" ] && stop_ueberzug
+ # Deletes thumbnails if no video is selected
+ [ -z "$selected_data" ] && clean_up
+ #show regular menu
+@@ -951,10 +951,10 @@ handle_shortcuts () {
+ case $selected_key in
+ "$urls_shortcut") printf "%s\n" $selected_urls; return 1 ;;
+ "$title_shortcut")
+- printf "%s\n" "$selected_data" | awk -F " " '{print $1}'; return 1 ;;
++ printf "%s\n" "$selected_data" | @awk@ -F " " '{print $1}'; return 1 ;;
+ "$open_browser_shortcut")
+ for url in $selected_urls; do
+- nohup $BROWSER "$url" >/dev/null 2>&1
++ @nohup@ $BROWSER "$url" >/dev/null 2>&1
+ done
+ return 1 ;;
+ "$watch_shortcut") is_download=0; is_audio_only=0; return 0;;
+@@ -988,10 +988,10 @@ 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" | @jq@ '.[].url' | @grep@ -F "$surl" | @tr@ -d '"')" ;;
+ *) continue ;;
+ esac
+- refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | grep "|$surl" )
++ refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | @grep@ "|$surl" )
+ done<<-EOF
+ $selected_data
+ EOF
+@@ -1014,9 +1014,9 @@ print_data () {
+ get_video_format () {
+ # select format if flag given
+ [ $show_format -eq 0 ] && return
+- formats=$(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")
++ formats=$(@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;
+ [ $quality = "Audio" ] && video_pref= && video_player="$audio_player" || video_pref="bestvideo[height=?$quality][vcodec!=?vp9]+bestaudio/best"
+
+@@ -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=$(@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") && @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
+@@ -1046,10 +1046,10 @@ open_player () {
+ if [ $detach_player -eq 1 ]; then
+ if [ -z "$video_pref" ] || [ $is_audio_only -eq 1 ]; then
+ printf "Opening Player: %s\n" "$video_player $*"
+- setsid -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
++ @setsid@ -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
+ else
+ printf "Opening Player: %s\n" "$video_player_format$video_pref $*"
+- setsid -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
++ @setsid@ -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
+ fi
+ return
+ fi
+@@ -1064,9 +1064,9 @@ open_player () {
+ fi
+ elif [ $is_download -eq 1 ]; then
+ if [ -z "$video_pref" ]; then
+- youtube-dl "$@" "$YTFZF_SUBT_NAME"
++ @youtube-dl@ "$@" "$YTFZF_SUBT_NAME"
+ else
+- youtube-dl -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@"
++ @youtube-dl@ -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@"
+ fi
+ fi
+ }
+@@ -1087,7 +1087,7 @@ play_url () {
+ fi
+
+ #Delete the temp auto-gen subtitle file
+- [ $auto_caption -eq 1 ] && rm -f "${YTFZF_SUBT_NAME#*=}"
++ [ $auto_caption -eq 1 ] && @rm@ -f "${YTFZF_SUBT_NAME#*=}"
+
+ unset player_urls
+ }
+@@ -1102,7 +1102,7 @@ session_is_running () {
+ #> removes tmp files and clutter
+ clean_up () {
+ if ! session_is_running ; then
+- [ -d "$thumb_dir" ] && rm -r "$thumb_dir"
++ [ -d "$thumb_dir" ] && @rm@ -r "$thumb_dir"
+ : > "$pid_file"
+ function_exists "on_exit" && on_exit
+ fi
+@@ -1124,9 +1124,9 @@ save_before_exit () {
+ check_if_url () {
+ # to check if given input is a url
+ url_regex='^https\?://.*'
+- if printf "%s" "$1" | grep -q "$url_regex"; then
++ if printf "%s" "$1" | @grep@ -q "$url_regex"; then
+ is_url=1
+- selected_urls=$(printf "%s" "$1" | tr ' ' '\n')
++ selected_urls=$(printf "%s" "$1" | @tr@ ' ' '\n')
+ scrape="url"
+ else
+ is_url=0
+@@ -1139,10 +1139,10 @@ get_history () {
+ if [ "$enable_hist" -eq 1 ]; then
+ [ -e "$history_file" ] || : > "$history_file"
+ #gets history data in reverse order (makes it most recent to least recent)
+- hist_data=$( sed '1!G; h; $!d' "$history_file" )
++ hist_data=$( @sed@ '1!G; h; $!d' "$history_file" )
+ [ -z "$hist_data" ] && printf "History is empty!\n" >&2 && return 1;
+ #removes duplicate values from $history_data
+- videos_data=$(printf "%s" "$hist_data" | uniq )
++ videos_data=$(printf "%s" "$hist_data" | @uniq@ )
+ [ "$sort_videos_data" -eq 1 ] && videos_data="$(printf "%s" "$videos_data" | sort_video_data_fn)"
+ else
+ printf "History is not enabled. Please enable it to use this option (-H).\n" >&2;
+@@ -1177,10 +1177,10 @@ get_search_history () {
+ if [ "$enable_search_hist" -eq 1 ]; then
+ [ -e "$search_history_file" ] || : > "$search_history_file"
+ #gets history data in reverse order (makes it most recent to least recent)
+- hist_data=$( sed '1!G; h; $!d' "$search_history_file" )
++ hist_data=$( @sed@ '1!G; h; $!d' "$search_history_file" )
+ [ -z "$hist_data" ] && printf "Search history is empty!\n" >&2 && return 1;
+ #removes duplicate values from $history_data
+- search_history=$(printf "%s" "$hist_data" | uniq )
++ search_history=$(printf "%s" "$hist_data" | @uniq@ )
+ else
+ printf "Search history is not enabled. Please enable it to use this option (-q).\n" >&2;
+ exit 1;
+@@ -1190,7 +1190,7 @@ get_search_history () {
+
+ set_search_history () {
+ [ -z "$search_query" ] && return
+- [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ;
++ [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(@date@ '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ;
+ }
+
+ search_history_menu () {
+@@ -1200,15 +1200,15 @@ 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" | @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)
+ # second line is the fzf --expect key pressed
+ # third line is the search_history selection made
+- query="$( printf "%s" "$choice" | sed -n '1p' )"
+- key="$( printf "%s" "$choice" | sed -n '2p' )"
+- selection="$( printf "%s" "$choice" | sed -n '3p' )"
++ query="$( printf "%s" "$choice" | @sed@ -n '1p' )"
++ key="$( printf "%s" "$choice" | @sed@ -n '2p' )"
++ selection="$( printf "%s" "$choice" | @sed@ -n '3p' )"
+
+ # if no search history selection has been made
+ # and the user typed a query, use that instead
+@@ -1225,7 +1225,7 @@ search_history_menu () {
+ search_query="$query"
+ return;;
+ esac
+- search_query="$( printf "%s" "$selection" | awk -F'\t' '{printf "%s", $NF}' )"
++ search_query="$( printf "%s" "$selection" | @awk@ -F'\t' '{printf "%s", $NF}' )"
+ }
+
+ ! function_exists "send_select_video_notif" && send_select_video_notif () {
+@@ -1244,13 +1244,13 @@ 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"
++ @notify-send@ "$title" "$message" -i "$video_thumb"
+
+ unset message video_thumb title
+ }
+
+ send_notify () {
+- videos_selected_count=$(printf "%s\n" "$*" | wc -l)
++ videos_selected_count=$(printf "%s\n" "$*" | @wc@ -l)
+ while IFS=$tab_space read -r video_title video_channel video_views video_duration video_date video_shorturl; do
+ send_select_video_notif
+ done << EOF
+@@ -1284,14 +1284,14 @@ if ! function_exists "data_sort_key"; then
+ sort_by="${5#|}"
+ sort_by="${sort_by#Streamed}"
+ #print the data that should be sorted by
+- printf "%d" "$(date -d "${sort_by}" '+%s')"
++ printf "%d" "$(@date@ -d "${sort_by}" '+%s')"
+ unset sort_by
+ }
+ fi
+ #the function to use for sorting
+ if ! function_exists "data_sort_fn"; then
+ data_sort_fn () {
+- sort -nr
++ @sort@ -nr
+ }
+ fi
+ sort_video_data_fn () {
+@@ -1300,7 +1300,7 @@ sort_video_data_fn () {
+ IFS="$tab_space"
+ #run the key function to get the value to sort by
+ printf "%s\t%s\n" "$(data_sort_key $line)" "$line"
+- done | data_sort_fn | cut -f2-
++ done | data_sort_fn | @cut@ -f2-
+ unset IFS line
+ }
+
+@@ -1314,19 +1314,19 @@ scrape_subscriptions () {
+ while IFS= read -r url; do
+ scrape_channel "$url" &
+ done <<-EOF
+- $( sed \
++ $( @sed@ \
+ -e "s/#.*//" \
+ -e "/^[[:space:]]*$/d" \
+ -e "s/[[:space:]]*//g" \
+ "$subscriptions_file")
+ EOF
+ wait
+- videos_json="$(cat "$tmp_video_json_file")"
++ videos_json="$(@cat@ "$tmp_video_json_file")"
+ export videos_json
+ if [ $sort_videos_data -eq 1 ]; then
+ videos_data=$(sort_video_data_fn < "$tmp_video_data_file")
+ else
+- videos_data=$(cat "$tmp_video_data_file")
++ videos_data=$(@cat@ "$tmp_video_data_file")
+ fi
+ }
+
+@@ -1346,11 +1346,11 @@ create_subs () {
+ : > "$config_dir/subscriptions"
+
+ # check how many subscriptions there are in the file
+- sublength=$( jq '. | length' < "$yt_sub_import_file" )
++ sublength=$( @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")
+- printf "%s\n" "$(printf "%s" "$channelInfo" | tr -d '[]"\n,')" >> "$subscriptions_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")
++ printf "%s\n" "$(printf "%s" "$channelInfo" | @tr@ -d '[]"\n,')" >> "$subscriptions_file"
+ done
+ exit
+ }
+@@ -1367,10 +1367,10 @@ verify_thumb_disp_method () {
+
+ #sort -R is not posix
+ posix_shuf () {
+- awk -F '\n' '
++ @awk@ -F '\n' '
+ BEGIN {srand()} #set the random seed at the start
+ {print rand() " " $0} #prepend a random number for each line' |\
+- sort | sed -E 's/[^ ]* //'
++ @sort@ | @sed@ -E 's/[^ ]* //'
+ #sort by the random numbers, remove the random number
+ }
+
+@@ -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" "$(@youtube-dl@ --version)"
++ command -v "@fzf@" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(@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 @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=$(@tput@ lines)
++ export TTY_COLS=$(@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" ||\
++ @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..1790b7a238
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-updates.patch
@@ -0,0 +1,44 @@
+From 75bf4f584866a013d5618ea6be19e97a8196d63e Mon Sep 17 00:00:00 2001
+From: Raghav Gururajan <rg@raghavgururajan.name>
+Date: Mon, 5 Jul 2021 06:47:38 -0400
+Subject: [PATCH 2/2] Disable updates within the application.
+
+Patch the code responsible for self-updating the application.
+
+Co-authored-by: jgart <jgart@dismail.de>
+---
+ ytfzf | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+diff --git a/ytfzf b/ytfzf
+index 0a2c372..845e8e9 100755
+--- a/ytfzf
++++ b/ytfzf
+@@ -1260,22 +1260,8 @@ EOF
+ }
+
+ update_ytfzf () {
+- branch="$1"
+- updatefile="/tmp/ytfzf-update"
+- 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
+
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf.
2021-07-05 11:14 ` [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
@ 2021-07-05 12:02 ` Maxime Devos
2021-07-05 12:19 ` Raghav Gururajan via Guix-patches via
0 siblings, 1 reply; 18+ messages in thread
From: Maxime Devos @ 2021-07-05 12:02 UTC (permalink / raw)
To: Raghav Gururajan, 49238; +Cc: jgart
[-- Attachment #1: Type: text/plain, Size: 1228 bytes --]
Hi,
> + (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"))
The 'binutils' input doesn't seem to be used anywhere.
> + 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") && @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."
For a previous version of this patch series,
I noted that writing /tmp/ytfzf is quite possibly
insecure, and also incorrect on multi-user systems.
I don't see this addressed anywhere.
Greetings,
Maxime.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf.
2021-06-30 19:38 ` Maxime Devos
@ 2021-07-05 12:03 ` Raghav Gururajan via Guix-patches via
2021-07-05 12:13 ` Maxime Devos
0 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 12:03 UTC (permalink / raw)
To: Maxime Devos; +Cc: 49238, jgart
[-- Attachment #1.1: Type: text/plain, Size: 2744 bytes --]
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.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf.
2021-07-05 12:03 ` Raghav Gururajan via Guix-patches via
@ 2021-07-05 12:13 ` Maxime Devos
2021-07-05 12:20 ` Raghav Gururajan via Guix-patches via
0 siblings, 1 reply; 18+ messages in thread
From: Maxime Devos @ 2021-07-05 12:13 UTC (permalink / raw)
To: Raghav Gururajan; +Cc: 49238, jgart
[-- Attachment #1: Type: text/plain, Size: 900 bytes --]
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.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf.
2021-07-05 12:02 ` Maxime Devos
@ 2021-07-05 12:19 ` Raghav Gururajan via Guix-patches via
0 siblings, 0 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 12:19 UTC (permalink / raw)
To: Maxime Devos; +Cc: 49238, jgart
[-- Attachment #1.1: Type: text/plain, Size: 184 bytes --]
Hi Maxime!
> The 'binutils' input doesn't seem to be used anywhere.
>
> I don't see this addressed anywhere.
My v4 patch-set didn't come through it seems.
Regards,
RG.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf.
2021-07-05 12:13 ` Maxime Devos
@ 2021-07-05 12:20 ` Raghav Gururajan via Guix-patches via
0 siblings, 0 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 12:20 UTC (permalink / raw)
To: Maxime Devos; +Cc: 49238, jgart
[-- Attachment #1.1: Type: text/plain, Size: 737 bytes --]
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.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v5 1/2] gnu: Add python-ueberzug.
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
` (2 preceding siblings ...)
2021-07-05 11:14 ` [bug#49238] [PATCH v3 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-07-05 15:10 ` Raghav Gururajan via Guix-patches via
2021-07-05 15:10 ` [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-06 5:37 ` bug#49238: (no subject) Raghav Gururajan via Guix-patches via
4 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 15:10 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, maximedevos, jgart
* gnu/packages/python-xyz.scm (python-ueberzug): New variable.
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/packages/python-xyz.scm | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index b74b3b808f..aa2406287d 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -101,6 +101,7 @@
;;; Copyright © 2021 LibreMiami <packaging-guix@libremiami.org>
;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
;;; Copyright © 2021 Raghav Gururajan <rg@raghavgururajan.name>
+;;; Copyright © 2021 jgart <jgart@dismail.de>
;;; Copyright © 2021 Danial Behzadi <dani.behzi@ubuntu.com>
;;;
;;; This file is part of GNU Guix.
@@ -221,6 +222,41 @@
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26))
+(define-public python-ueberzug
+ (package
+ (name "python-ueberzug")
+ (version "18.1.9")
+ (source
+ (origin
+ (method url-fetch)
+ (uri (pypi-uri "ueberzug" version))
+ (sha256
+ (base32
+ "1hxd45dnwa9yv908acarr98n2drmar66wzq9z2qd3irj24srzr3w"))))
+ (build-system python-build-system)
+ (inputs
+ `(("libx11" ,libx11)
+ ("libxext" ,libxext)))
+ (propagated-inputs
+ `(("python-attrs" ,python-attrs)
+ ("python-docopt" ,python-docopt)
+ ("python-pillow" ,python-pillow)
+ ("python-xlib" ,python-xlib)))
+ (home-page "https://github.com/seebye/ueberzug")
+ (synopsis "Command line util to display images in combination with X11")
+ (description "Überzug is a command line util which allows to draw images on
+terminals by using child windows. The advantages of using Überzug are:
+@itemize
+@item No race conditions as a new window is created to display images.
+@item Expose events will be processed, so images will be redrawn on switch
+workspaces.
+@item Tmux support (excluding multi pane windows).
+@item Terminals without the WINDOWID environment variable are supported.
+@item Chars are used as position - and size unit.
+@item No memory leak (/ unlimited cache).
+@end itemize")
+ (license license:gpl3+)))
+
(define-public python-fire
(package
(name "python-fire")
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf.
2021-07-05 15:10 ` [bug#49238] [PATCH v5 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-07-05 15:10 ` Raghav Gururajan via Guix-patches via
2021-07-05 15:42 ` Maxime Devos
0 siblings, 1 reply; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-05 15:10 UTC (permalink / raw)
To: 49238; +Cc: Raghav Gururajan, maximedevos, jgart
* gnu/packages/image-viewers.scm (ytfzf): New variable.
Co-authored-by: jgart <jgart@dismail.de>
---
gnu/local.mk | 2 +
gnu/packages/image-viewers.scm | 173 ++++++
gnu/packages/patches/ytfzf-programs.patch | 650 ++++++++++++++++++++++
gnu/packages/patches/ytfzf-updates.patch | 44 ++
4 files changed, 869 insertions(+)
create mode 100644 gnu/packages/patches/ytfzf-programs.patch
create mode 100644 gnu/packages/patches/ytfzf-updates.patch
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..9850aabad6 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,177 @@
#: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"))))
+ (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 'apply-patches
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Pre-requisite for 'patch-script' phase.
+ (invoke "patch" "--input"
+ (assoc-ref inputs "ytfzf-programs"))
+ ;; Disables self-update.
+ (invoke "patch" "--input"
+ (assoc-ref inputs "ytfzf-updates"))))
+ (add-after 'apply-patches 'patch-script
+ (lambda* (#:key inputs outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (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"))))
+ (substitute* "ytfzf"
+ ;; Generate temporary files in the user-specific path,
+ ;; to avoid issues in multi-user systems.
+ (("/tmp/ytfzf")
+ "$HOME/.cache/ytfzf")
+ ;; Report errors to Guix.
+ (("report at: https://github.com/pystardust/ytfzf")
+ "report at: https://issues.guix.gnu.org"))))
+ (delete 'configure)))) ;no configure script
+ (native-inputs
+ `(("ytfzf-programs"
+ ,(search-patch "ytfzf-programs.patch"))
+ ("ytfzf-updates"
+ ,(search-patch "ytfzf-updates.patch"))))
+ (inputs
+ `(("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 page url to channel video url
+- if ! printf "%s" "$channel_url" | grep -q '/videos *$'; then
++ if ! printf "%s" "$channel_url" | @grep@ -q '/videos *$'; then
+ channel_url=${channel_url%/featured}/videos
+ fi
+
+@@ -706,8 +706,8 @@ scrape_channel () {
+ fi
+
+ #gets the channel name from title of page
+- channel_name=$(printf "%s" "$yt_html" | grep -o '<title>.*</title>' |
+- sed \
++ channel_name=$(printf "%s" "$yt_html" | @grep@ -o '<title>.*</title>' |
++ @sed@ \
+ -e 's/ - YouTube//' \
+ -e 's/<\/\?title>//g' \
+ -e "s/'/'/g" \
+@@ -723,7 +723,7 @@ scrape_channel () {
+
+ #gets a list of videos
+ videos_json=$(printf "%s" "$yt_json" |\
+- jq '[ .contents | ..|.gridVideoRenderer? |
++ @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" | @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 \
++ @curl@ \
+ -s "https://sepiasearch.org/api/v1/search/videos" \
+ -G --data-urlencode "search=$*")
+ videos_json=$(printf "%s" "$pt_json" |\
+- jq '[ .data | .[] |
++ @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" | @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" | @jq@ '[ .contents|
+ ..|.playlistRenderer? |
+ select(. !=null) |
+ {
+@@ -904,31 +904,31 @@ get_search_query () {
+ #> To select videos from videos_data
+ user_selection () {
+ #remove subscription separators
+- videos_data_clean=$(printf "%s" "$videos_data" | sed "/.*$tab_space$/d")
++ videos_data_clean=$(printf "%s" "$videos_data" | @sed@ "/.*$tab_space$/d")
+
+ #$selected_data is the video the user picked
+ #picks the first n videos
+ if [ "$select_all" -eq 1 ] ; then
+ selected_data=$videos_data_clean
+ elif [ "$auto_select" -eq 1 ] ; then
+- selected_data=$(printf "%s\n" "$videos_data_clean" | sed "${link_count}"q )
++ selected_data=$(printf "%s\n" "$videos_data_clean" | @sed@ "${link_count}"q )
+ #picks n random videos
+ elif [ "$random_select" -eq 1 ] ; then
+- selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | head -n${link_count})
++ selected_data=$(printf "%s\n" "$videos_data_clean" | posix_shuf | @head@ -n${link_count})
+ #posix_shuf, pick the first $link_count videos
+
+ #show thumbnail menu
+ elif [ "$show_thumbnails" -eq 1 ] ; then
+- dep_ck "ueberzug" "fzf"
++ dep_ck "@ueberzug@" "@fzf@"
+ export YTFZF_THUMB_DISP_METHOD="$thumb_disp_method"
+- [ "$thumb_disp_method" = "ueberzug" ] && start_ueberzug
++ [ "$thumb_disp_method" = "@ueberzug@" ] && start_ueberzug
+ #thumbnails only work in fzf, use fzf
+- menu_command="fzf -m --tabstop=1 --bind change:top --delimiter=\"$tab_space\" \
++ menu_command="@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" = "@ueberzug@" ] && stop_ueberzug
+ # Deletes thumbnails if no video is selected
+ [ -z "$selected_data" ] && clean_up
+ #show regular menu
+@@ -951,10 +951,10 @@ handle_shortcuts () {
+ case $selected_key in
+ "$urls_shortcut") printf "%s\n" $selected_urls; return 1 ;;
+ "$title_shortcut")
+- printf "%s\n" "$selected_data" | awk -F " " '{print $1}'; return 1 ;;
++ printf "%s\n" "$selected_data" | @awk@ -F " " '{print $1}'; return 1 ;;
+ "$open_browser_shortcut")
+ for url in $selected_urls; do
+- nohup $BROWSER "$url" >/dev/null 2>&1
++ @nohup@ $BROWSER "$url" >/dev/null 2>&1
+ done
+ return 1 ;;
+ "$watch_shortcut") is_download=0; is_audio_only=0; return 0;;
+@@ -988,10 +988,10 @@ 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" | @jq@ '.[].url' | @grep@ -F "$surl" | @tr@ -d '"')" ;;
+ *) continue ;;
+ esac
+- refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | grep "|$surl" )
++ refined_selected_data=$refined_selected_data$new_line$(printf '%s' "$videos_data" | @grep@ "|$surl" )
+ done<<-EOF
+ $selected_data
+ EOF
+@@ -1014,9 +1014,9 @@ print_data () {
+ get_video_format () {
+ # select format if flag given
+ [ $show_format -eq 0 ] && return
+- formats=$(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")
++ formats=$(@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;
+ [ $quality = "Audio" ] && video_pref= && video_player="$audio_player" || video_pref="bestvideo[height=?$quality][vcodec!=?vp9]+bestaudio/best"
+
+@@ -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=$(@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") && @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
+@@ -1046,10 +1046,10 @@ open_player () {
+ if [ $detach_player -eq 1 ]; then
+ if [ -z "$video_pref" ] || [ $is_audio_only -eq 1 ]; then
+ printf "Opening Player: %s\n" "$video_player $*"
+- setsid -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
++ @setsid@ -f $video_player "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
+ else
+ printf "Opening Player: %s\n" "$video_player_format$video_pref $*"
+- setsid -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
++ @setsid@ -f $video_player_format"$video_pref" "$@" $YTFZF_SUBT_NAME >/dev/null 2>&1
+ fi
+ return
+ fi
+@@ -1064,9 +1064,9 @@ open_player () {
+ fi
+ elif [ $is_download -eq 1 ]; then
+ if [ -z "$video_pref" ]; then
+- youtube-dl "$@" "$YTFZF_SUBT_NAME"
++ @youtube-dl@ "$@" "$YTFZF_SUBT_NAME"
+ else
+- youtube-dl -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@"
++ @youtube-dl@ -f "$video_pref" "$@" $YTFZF_SUBT_NAME || video_pref= open_player "$@"
+ fi
+ fi
+ }
+@@ -1087,7 +1087,7 @@ play_url () {
+ fi
+
+ #Delete the temp auto-gen subtitle file
+- [ $auto_caption -eq 1 ] && rm -f "${YTFZF_SUBT_NAME#*=}"
++ [ $auto_caption -eq 1 ] && @rm@ -f "${YTFZF_SUBT_NAME#*=}"
+
+ unset player_urls
+ }
+@@ -1102,7 +1102,7 @@ session_is_running () {
+ #> removes tmp files and clutter
+ clean_up () {
+ if ! session_is_running ; then
+- [ -d "$thumb_dir" ] && rm -r "$thumb_dir"
++ [ -d "$thumb_dir" ] && @rm@ -r "$thumb_dir"
+ : > "$pid_file"
+ function_exists "on_exit" && on_exit
+ fi
+@@ -1124,9 +1124,9 @@ save_before_exit () {
+ check_if_url () {
+ # to check if given input is a url
+ url_regex='^https\?://.*'
+- if printf "%s" "$1" | grep -q "$url_regex"; then
++ if printf "%s" "$1" | @grep@ -q "$url_regex"; then
+ is_url=1
+- selected_urls=$(printf "%s" "$1" | tr ' ' '\n')
++ selected_urls=$(printf "%s" "$1" | @tr@ ' ' '\n')
+ scrape="url"
+ else
+ is_url=0
+@@ -1139,10 +1139,10 @@ get_history () {
+ if [ "$enable_hist" -eq 1 ]; then
+ [ -e "$history_file" ] || : > "$history_file"
+ #gets history data in reverse order (makes it most recent to least recent)
+- hist_data=$( sed '1!G; h; $!d' "$history_file" )
++ hist_data=$( @sed@ '1!G; h; $!d' "$history_file" )
+ [ -z "$hist_data" ] && printf "History is empty!\n" >&2 && return 1;
+ #removes duplicate values from $history_data
+- videos_data=$(printf "%s" "$hist_data" | uniq )
++ videos_data=$(printf "%s" "$hist_data" | @uniq@ )
+ [ "$sort_videos_data" -eq 1 ] && videos_data="$(printf "%s" "$videos_data" | sort_video_data_fn)"
+ else
+ printf "History is not enabled. Please enable it to use this option (-H).\n" >&2;
+@@ -1177,10 +1177,10 @@ get_search_history () {
+ if [ "$enable_search_hist" -eq 1 ]; then
+ [ -e "$search_history_file" ] || : > "$search_history_file"
+ #gets history data in reverse order (makes it most recent to least recent)
+- hist_data=$( sed '1!G; h; $!d' "$search_history_file" )
++ hist_data=$( @sed@ '1!G; h; $!d' "$search_history_file" )
+ [ -z "$hist_data" ] && printf "Search history is empty!\n" >&2 && return 1;
+ #removes duplicate values from $history_data
+- search_history=$(printf "%s" "$hist_data" | uniq )
++ search_history=$(printf "%s" "$hist_data" | @uniq@ )
+ else
+ printf "Search history is not enabled. Please enable it to use this option (-q).\n" >&2;
+ exit 1;
+@@ -1190,7 +1190,7 @@ get_search_history () {
+
+ set_search_history () {
+ [ -z "$search_query" ] && return
+- [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ;
++ [ $enable_search_hist -eq 1 ] && printf "%s\t%s\n" "$(@date@ '+%Y-%m-%d %H:%M:%S')" "$search_query" >> "$search_history_file" ;
+ }
+
+ search_history_menu () {
+@@ -1200,15 +1200,15 @@ 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" | @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)
+ # second line is the fzf --expect key pressed
+ # third line is the search_history selection made
+- query="$( printf "%s" "$choice" | sed -n '1p' )"
+- key="$( printf "%s" "$choice" | sed -n '2p' )"
+- selection="$( printf "%s" "$choice" | sed -n '3p' )"
++ query="$( printf "%s" "$choice" | @sed@ -n '1p' )"
++ key="$( printf "%s" "$choice" | @sed@ -n '2p' )"
++ selection="$( printf "%s" "$choice" | @sed@ -n '3p' )"
+
+ # if no search history selection has been made
+ # and the user typed a query, use that instead
+@@ -1225,7 +1225,7 @@ search_history_menu () {
+ search_query="$query"
+ return;;
+ esac
+- search_query="$( printf "%s" "$selection" | awk -F'\t' '{printf "%s", $NF}' )"
++ search_query="$( printf "%s" "$selection" | @awk@ -F'\t' '{printf "%s", $NF}' )"
+ }
+
+ ! function_exists "send_select_video_notif" && send_select_video_notif () {
+@@ -1244,13 +1244,13 @@ 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"
++ @notify-send@ "$title" "$message" -i "$video_thumb"
+
+ unset message video_thumb title
+ }
+
+ send_notify () {
+- videos_selected_count=$(printf "%s\n" "$*" | wc -l)
++ videos_selected_count=$(printf "%s\n" "$*" | @wc@ -l)
+ while IFS=$tab_space read -r video_title video_channel video_views video_duration video_date video_shorturl; do
+ send_select_video_notif
+ done << EOF
+@@ -1284,14 +1284,14 @@ if ! function_exists "data_sort_key"; then
+ sort_by="${5#|}"
+ sort_by="${sort_by#Streamed}"
+ #print the data that should be sorted by
+- printf "%d" "$(date -d "${sort_by}" '+%s')"
++ printf "%d" "$(@date@ -d "${sort_by}" '+%s')"
+ unset sort_by
+ }
+ fi
+ #the function to use for sorting
+ if ! function_exists "data_sort_fn"; then
+ data_sort_fn () {
+- sort -nr
++ @sort@ -nr
+ }
+ fi
+ sort_video_data_fn () {
+@@ -1300,7 +1300,7 @@ sort_video_data_fn () {
+ IFS="$tab_space"
+ #run the key function to get the value to sort by
+ printf "%s\t%s\n" "$(data_sort_key $line)" "$line"
+- done | data_sort_fn | cut -f2-
++ done | data_sort_fn | @cut@ -f2-
+ unset IFS line
+ }
+
+@@ -1314,19 +1314,19 @@ scrape_subscriptions () {
+ while IFS= read -r url; do
+ scrape_channel "$url" &
+ done <<-EOF
+- $( sed \
++ $( @sed@ \
+ -e "s/#.*//" \
+ -e "/^[[:space:]]*$/d" \
+ -e "s/[[:space:]]*//g" \
+ "$subscriptions_file")
+ EOF
+ wait
+- videos_json="$(cat "$tmp_video_json_file")"
++ videos_json="$(@cat@ "$tmp_video_json_file")"
+ export videos_json
+ if [ $sort_videos_data -eq 1 ]; then
+ videos_data=$(sort_video_data_fn < "$tmp_video_data_file")
+ else
+- videos_data=$(cat "$tmp_video_data_file")
++ videos_data=$(@cat@ "$tmp_video_data_file")
+ fi
+ }
+
+@@ -1346,11 +1346,11 @@ create_subs () {
+ : > "$config_dir/subscriptions"
+
+ # check how many subscriptions there are in the file
+- sublength=$( jq '. | length' < "$yt_sub_import_file" )
++ sublength=$( @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")
+- printf "%s\n" "$(printf "%s" "$channelInfo" | tr -d '[]"\n,')" >> "$subscriptions_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")
++ printf "%s\n" "$(printf "%s" "$channelInfo" | @tr@ -d '[]"\n,')" >> "$subscriptions_file"
+ done
+ exit
+ }
+@@ -1367,10 +1367,10 @@ verify_thumb_disp_method () {
+
+ #sort -R is not posix
+ posix_shuf () {
+- awk -F '\n' '
++ @awk@ -F '\n' '
+ BEGIN {srand()} #set the random seed at the start
+ {print rand() " " $0} #prepend a random number for each line' |\
+- sort | sed -E 's/[^ ]* //'
++ @sort@ | @sed@ -E 's/[^ ]* //'
+ #sort by the random numbers, remove the random number
+ }
+
+@@ -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" "$(@youtube-dl@ --version)"
++ command -v "@fzf@" 1>/dev/null && printf "\033[1mfzf:\033[0m %s\n" "$(@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 @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=$(@tput@ lines)
++ export TTY_COLS=$(@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" ||\
++ @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..1790b7a238
--- /dev/null
+++ b/gnu/packages/patches/ytfzf-updates.patch
@@ -0,0 +1,44 @@
+From 75bf4f584866a013d5618ea6be19e97a8196d63e Mon Sep 17 00:00:00 2001
+From: Raghav Gururajan <rg@raghavgururajan.name>
+Date: Mon, 5 Jul 2021 06:47:38 -0400
+Subject: [PATCH 2/2] Disable updates within the application.
+
+Patch the code responsible for self-updating the application.
+
+Co-authored-by: jgart <jgart@dismail.de>
+---
+ ytfzf | 18 ++----------------
+ 1 file changed, 2 insertions(+), 16 deletions(-)
+
+diff --git a/ytfzf b/ytfzf
+index 0a2c372..845e8e9 100755
+--- a/ytfzf
++++ b/ytfzf
+@@ -1260,22 +1260,8 @@ EOF
+ }
+
+ update_ytfzf () {
+- branch="$1"
+- updatefile="/tmp/ytfzf-update"
+- 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
+
--
2.32.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf.
2021-07-05 15:10 ` [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
@ 2021-07-05 15:42 ` Maxime Devos
2021-07-06 5:25 ` Raghav Gururajan via Guix-patches via
0 siblings, 1 reply; 18+ messages in thread
From: Maxime Devos @ 2021-07-05 15:42 UTC (permalink / raw)
To: Raghav Gururajan, 49238; +Cc: jgart
[-- Attachment #1: Type: text/plain, Size: 214 bytes --]
Hi,
This patch looks good to me, but I haven't actually tested it.
Also, it may be a good idea to inform upstream on the /tmp/ytfzf
issue, such that non-Guix users can benefit as well.
Greetings,
Maxime.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf.
2021-07-05 15:42 ` Maxime Devos
@ 2021-07-06 5:25 ` Raghav Gururajan via Guix-patches via
0 siblings, 0 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-06 5:25 UTC (permalink / raw)
To: Maxime Devos; +Cc: 49238, jgart
[-- Attachment #1.1: Type: text/plain, Size: 275 bytes --]
Hi Maxime!
> This patch looks good to me, but I haven't actually tested it.
Cool! I'll test and push as v6.
> Also, it may be a good idea to inform upstream on the /tmp/ytfzf
> issue, such that non-Guix users can benefit as well.
Sure thing.
Regards,
RG.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
* bug#49238: (no subject)
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
` (3 preceding siblings ...)
2021-07-05 15:10 ` [bug#49238] [PATCH v5 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
@ 2021-07-06 5:37 ` Raghav Gururajan via Guix-patches via
4 siblings, 0 replies; 18+ messages in thread
From: Raghav Gururajan via Guix-patches via @ 2021-07-06 5:37 UTC (permalink / raw)
To: 49238-done; +Cc: jgart
[-- Attachment #1.1: Type: text/plain, Size: 47 bytes --]
Pushed as 586136d127..aa6e6fb2e9 to master.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 236 bytes --]
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2021-07-06 5:38 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-06-27 5:44 [bug#49238] Ytfzf Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-06-27 5:47 ` [bug#49238] [PATCH v1 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-06-30 19:38 ` Maxime Devos
2021-07-05 12:03 ` Raghav Gururajan via Guix-patches via
2021-07-05 12:13 ` Maxime Devos
2021-07-05 12:20 ` Raghav Gururajan via Guix-patches via
2021-06-29 19:06 ` [bug#49238] [PATCH v2 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-06-29 19:06 ` [bug#49238] [PATCH v2 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-05 11:14 ` [bug#49238] [PATCH v3 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-07-05 11:14 ` [bug#49238] [PATCH v3 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-05 12:02 ` Maxime Devos
2021-07-05 12:19 ` Raghav Gururajan via Guix-patches via
2021-07-05 15:10 ` [bug#49238] [PATCH v5 1/2] gnu: Add python-ueberzug Raghav Gururajan via Guix-patches via
2021-07-05 15:10 ` [bug#49238] [PATCH v5 2/2] gnu: Add ytfzf Raghav Gururajan via Guix-patches via
2021-07-05 15:42 ` Maxime Devos
2021-07-06 5:25 ` Raghav Gururajan via Guix-patches via
2021-07-06 5:37 ` bug#49238: (no subject) Raghav Gururajan via Guix-patches via
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).