summaryrefslogtreecommitdiffstats
path: root/.local/bin/linkview
diff options
context:
space:
mode:
authorjoe <rbo@gmx.us>2025-08-14 18:58:44 +0200
committerjoe <rbo@gmx.us>2025-08-14 18:58:44 +0200
commit6dd1eb323f5447752321d8bafdf60cfb1700159e (patch)
treee6b1c51d2c47c97b23d2e997d4f1e0e0e018a3f8 /.local/bin/linkview
parentup (diff)
downloaddotfiles-bsd-6dd1eb323f5447752321d8bafdf60cfb1700159e.tar.gz
dotfiles-bsd-6dd1eb323f5447752321d8bafdf60cfb1700159e.tar.bz2
dotfiles-bsd-6dd1eb323f5447752321d8bafdf60cfb1700159e.tar.xz
dotfiles-bsd-6dd1eb323f5447752321d8bafdf60cfb1700159e.tar.zst
dotfiles-bsd-6dd1eb323f5447752321d8bafdf60cfb1700159e.zip
up
Diffstat (limited to '.local/bin/linkview')
-rwxr-xr-x.local/bin/linkview211
1 files changed, 106 insertions, 105 deletions
diff --git a/.local/bin/linkview b/.local/bin/linkview
index d276634..309202d 100755
--- a/.local/bin/linkview
+++ b/.local/bin/linkview
@@ -14,14 +14,9 @@ use POSIX qw(setsid);
use feature qw(switch);
no warnings qw(experimental::smartmatch);
-my $menu = "dmenu";
+my $menu = "fzf";
my $IMGVIEW_PATH = 'nsxiv -b -a';
-if (defined $ENV{WAYLAND_DISPLAY}) {
- $menu = "wmenu";
- $IMGVIEW_PATH = 'imv';
-}
-
use constant {
TERMINAL_PATH => $TERMINAL,
MPV_PATH => 'mpv',
@@ -33,28 +28,26 @@ use constant {
BROWSER_PATH => $BROWSER,
NOTIFYSEND_PATH => 'notify-send',
COPYQ_PATH => 'copyq',
- HOSTNAME => (split /\./, hostname())
+ HOSTNAME => (split /\./, hostname())[0]
};
use constant PROG_LIST => "" .
-"mpv" . "\n" .
-"mpv-term" . "\n" .
-"ytdl" . "\n" .
-"ytdl thumbnail" . "\n" .
-"fetch" . "\n" .
-"img" . "\n" .
-"zathura" . "\n" .
-"w3m" . "\n" .
-"browser" . "\n" .
-"clip" . "\n";
+"play" . "\n" .
+"thumb" . "\n" .
+"dl" . "\n" .
+"img" . "\n" .
+"pdf" . "\n" .
+"w3m" . "\n" .
+"browser" . "\n" .
+"clip";
use constant QUAL_LIST => "" .
-"1440" . "\n" .
-"1080" . "\n" .
-"720" . "\n" .
-"480" . "\n" .
-"360" . "\n" .
-"240" . "\n" .
-"144" . "\n" .
-"uncap" . "\n";
+"uncap" . "\n" .
+"1440" . "\n" .
+"1080" . "\n" .
+"720" . "\n" .
+"480" . "\n" .
+"360" . "\n" .
+"240" . "\n" .
+"144" . "\n";
sub open_link
{
@@ -73,60 +66,73 @@ sub open_link
my $val;
my @wc;
- if ($a eq "mpv") {
- if (system(MPV_PATH, $url) != 0) {
- system(
- NOTIFYSEND_PATH,
- '-u', 'critical',
- '-t', '10000',
- 'playback failed',
- ' Failed to open <b>' . $url . '</b>'
+ if ($a eq "play") {
+ $pid = fork();
+ if (not $pid) {
+ setsid();
+ close_io();
+ if (system(MPV_PATH, $url) != 0) {
+ exec(
+ NOTIFYSEND_PATH,
+ '-u', 'critical',
+ '-t', '10000',
+ 'playback failed',
+ ' Failed to open <b>' . $url . '</b>'
);
+ }
+ return;
}
- exit 0;
+ return;
}
elsif ($a eq "mpv-term") {
exec(TERMINAL_PATH, '-e', MPV_PATH, '--audio-channels=stereo', $url);
}
- elsif ($a eq "fetch" || $a eq "ytdl") {
+ elsif ($a eq "dl" || $a eq "ytdl") {
+ if (is_yt($url) == 1) {
+ $list = QUAL_LIST;
+ $quality = `printf "$list" | $menu --prompt 'quality > '`;
+ if (not $quality) {
+ return;
+ }
+ chomp $quality;
+ }
$pid = fork();
if (not $pid) {
setsid();
+ close_io();
$ret = -1;
- if ($a eq "ytdl") {
- $list = QUAL_LIST;
- $quality = `printf "$list" | $menu -l 8`;
- if (not $quality) {
- exit 0;
- }
- chomp $quality;
- chdir home() . "/dl" or
- chdir home() . "/Downloads" or
- chdir home() or die $!;
- if (basename(cwd()) eq basename(home())) {
- $pwd = '~/';
- }
- else {
- $pwd = '~/' . basename(cwd());
- }
- $file_name = $url;
- $file_name =~ s/.+\///g;
+ chdir home() . "/dl" or
+ chdir home() . "/Downloads" or
+ chdir home() or die $!;
+ if (basename(cwd()) eq basename(home())) {
+ $pwd = '~/';
+ }
+ else {
+ $pwd = '~/' . basename(cwd());
+ }
+ if (is_yt($url) == 1) {
$file_name = `yt-dlp -e $url`;
if (not $file_name) {
- $file_name = "YouTube video";
+ $file_name = "yt video";
}
- chomp $file_name;
- @wc = split / /, $file_name;
- if (@wc > 8) {
- $file_name = "";
- $i = 0;
- while ($i < 8) {
- $file_name .= "$wc[$i] ";
- $i++;
- }
- $file_name .= "[...]";
+ }
+ else {
+ $file_name = $url;
+ $file_name =~ s/.+\///g;
+ }
+ chomp $file_name;
+ @wc = split / /, $file_name;
+ if (@wc > 8) {
+ $file_name = "";
+ $i = 0;
+ while ($i < 8) {
+ $file_name .= "$wc[$i] ";
+ $i++;
}
- $file_name =~ s/^[0-9]+/\[\.\.\.\]/;
+ $file_name .= "[...]";
+ }
+ $file_name =~ s/^[0-9]+/\[\.\.\.\]/;
+ if (is_yt($url) == 1) {
system(
NOTIFYSEND_PATH,
'-u', 'low',
@@ -159,7 +165,6 @@ sub open_link
system(
NOTIFYSEND_PATH,
'-u', 'normal',
- '-t', '10000',
'download complete',
' <b>' . $file_name . '</b> downloaded successfully to ' .
'<b>' . $pwd . '</b>'
@@ -169,22 +174,20 @@ sub open_link
system(
NOTIFYSEND_PATH,
'-u', 'critical',
- '-t', '10000',
'download failed',
' failed to download <b>' . $file_name . '</b>'
);
}
- exit 0;
+ return;
}
elsif ($pid2 < 0) {
system(
NOTIFYSEND_PATH,
'-u', 'critical',
- '-t', '10000',
'download failed',
' failed to <b>fork(2)</b>'
);
- exit 0;
+ return;
}
else {
$count = 0;
@@ -214,31 +217,9 @@ sub open_link
}
unlink $tmpfile;
}
- exit 0;
+ return;
}
else {
- chdir home() . "/dl" or
- chdir home() . "/Downloads" or
- chdir home() or die $!;
- if (basename(cwd()) eq basename(home())) {
- $pwd = '~/';
- }
- else {
- $pwd = '~/' . basename(cwd());
- }
- $file_name = $url;
- $file_name =~ s/.+\///g;
- @wc = split / /, $file_name;
- if (@wc > 8) {
- $file_name = "";
- $i = 0;
- while ($i < 8) {
- $file_name .= "$wc[$i] ";
- $i++;
- }
- $file_name .= "[...]";
- }
- $file_name =~ s/^[0-9]+/\[\.\.\.\]/;
system(
NOTIFYSEND_PATH,
'-u', 'low',
@@ -273,7 +254,7 @@ sub open_link
);
}
}
- exit 0;
+ return;
}
elsif ($pid < 0) {
system(
@@ -283,13 +264,11 @@ sub open_link
'download failed',
' failed to <b>fork(2)</b>'
);
- exit 0;
- }
- else {
- exit 0;
+ return;
}
+ return;
}
- elsif ($a eq "ytdl thumbnail") {
+ elsif ($a eq "thumb") {
$pid = fork();
if (not $pid) {
setsid();
@@ -342,7 +321,7 @@ sub open_link
exit 0;
}
}
- elsif ($a eq "img" || $a eq "zathura") {
+ elsif ($a eq "img" || $a eq "pdf") {
$pid = fork();
if (not $pid) {
setsid();
@@ -402,18 +381,40 @@ sub open_link
return;
}
-sub dmenu_prompt
+sub close_io
+{
+ open STDIN, '<', '/dev/null';
+ open STDOUT, '>', '/dev/null';
+ open STDERR, '>', '/dev/null';
+ return;
+}
+
+sub is_yt
+{
+ my ($url) = @_;
+ return $url =~ m{
+ ^(?:https?://)?
+ (?:www\.|m\.)?
+ (?:youtube\.com|youtu\.be)/
+ (?:
+ (?:watch\?v=|embed/|v/|shorts/)?
+ )
+ ([\w-]{11})
+ }x;
+}
+
+sub fzf_prompt
{
my ($url) = @_;
my $answer;
my $list = PROG_LIST;
- $answer = `printf "$list\nURL: $url\n" | $menu -i`;
+ $answer = `printf "$list\n" | $menu --prompt '$url > '`;
chomp $answer;
return $answer;
}
-sub main
+sub linkview
{
my $answer;
@@ -421,11 +422,11 @@ sub main
print STDERR "linkview: no URL\n";
exit 1;
}
- $answer = dmenu_prompt($ARGV[0]);
+ $answer = fzf_prompt($ARGV[0]);
open_link($answer, $ARGV[0]);
return;
}
-main();
+linkview();
__END__