summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoe <rbo@gmx.us>2025-08-14 20:15:22 +0200
committerjoe <rbo@gmx.us>2025-08-14 20:15:22 +0200
commit7852dd212ee6b42d20facff884f8f939ae1ccaf4 (patch)
tree7de051f4df7b2d27031aa3e6df39bf86f698efee
parentup (diff)
downloaddotfiles-bsd-7852dd212ee6b42d20facff884f8f939ae1ccaf4.tar.gz
dotfiles-bsd-7852dd212ee6b42d20facff884f8f939ae1ccaf4.tar.bz2
dotfiles-bsd-7852dd212ee6b42d20facff884f8f939ae1ccaf4.tar.xz
dotfiles-bsd-7852dd212ee6b42d20facff884f8f939ae1ccaf4.tar.zst
dotfiles-bsd-7852dd212ee6b42d20facff884f8f939ae1ccaf4.zip
linkview upgrade
-rwxr-xr-x.local/bin/linkview194
1 files changed, 98 insertions, 96 deletions
diff --git a/.local/bin/linkview b/.local/bin/linkview
index 309202d..d39c116 100755
--- a/.local/bin/linkview
+++ b/.local/bin/linkview
@@ -5,22 +5,23 @@ use warnings;
use Sys::Hostname;
use Scalar::Util qw(looks_like_number);
use File::HomeDir qw(home);
-use File::Basename qw(basename);
+use File::Basename qw(basename fileparse);
use Cwd qw(cwd);
use Env qw(BROWSER TERMINAL);
use Term::ReadKey;
use Capture::Tiny qw(capture);
use POSIX qw(setsid);
+use Data::UUID;
use feature qw(switch);
no warnings qw(experimental::smartmatch);
my $menu = "fzf";
-my $IMGVIEW_PATH = 'nsxiv -b -a';
use constant {
TERMINAL_PATH => $TERMINAL,
MPV_PATH => 'mpv',
YTDL_PATH => 'yt-dlp',
+ IMGVIEW_PATH => 'nsxiv -b -a',
FETCH_PATH => 'fetch',
CURL_PATH => 'curl',
ZATHURA_PATH => 'zathura',
@@ -32,9 +33,8 @@ use constant {
};
use constant PROG_LIST => "" .
"play" . "\n" .
-"thumb" . "\n" .
-"dl" . "\n" .
"img" . "\n" .
+"dl" . "\n" .
"pdf" . "\n" .
"w3m" . "\n" .
"browser" . "\n" .
@@ -63,6 +63,8 @@ sub open_link
my $ret;
my $tmp;
my $tmpfile;
+ my $ug;
+ my $uuid;
my $val;
my @wc;
@@ -87,8 +89,8 @@ sub open_link
elsif ($a eq "mpv-term") {
exec(TERMINAL_PATH, '-e', MPV_PATH, '--audio-channels=stereo', $url);
}
- elsif ($a eq "dl" || $a eq "ytdl") {
- if (is_yt($url) == 1) {
+ elsif ($a eq "dl") {
+ if (is_yt($url) != 0) {
$list = QUAL_LIST;
$quality = `printf "$list" | $menu --prompt 'quality > '`;
if (not $quality) {
@@ -110,11 +112,8 @@ sub open_link
else {
$pwd = '~/' . basename(cwd());
}
- if (is_yt($url) == 1) {
- $file_name = `yt-dlp -e $url`;
- if (not $file_name) {
- $file_name = "yt video";
- }
+ if (is_yt($url) != 0) {
+ $file_name = get_yt_vid_name($url);
}
else {
$file_name = $url;
@@ -132,21 +131,21 @@ sub open_link
$file_name .= "[...]";
}
$file_name =~ s/^[0-9]+/\[\.\.\.\]/;
- if (is_yt($url) == 1) {
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '2000',
- 'download started',
- ' <b>' . $file_name . '</b> started downloading'
- );
+ system(
+ NOTIFYSEND_PATH,
+ '-u', 'low',
+ '-t', '2000',
+ 'download starting',
+ ' downloading <b>' . $file_name . '</b>'
+ );
+ if (is_yt($url) != 0) {
$tmpfile = `mktemp`;
chomp $tmpfile;
$pid2 = fork();
if (not $pid2) {
(undef, undef, $ret) = capture {
if ($quality eq 'uncap') {
- system(YTDL_PATH . ' --newline --add-metadata ' . $url . ' >' . $tmpfile);
+ system(YTDL_PATH . ' -f \'bestvideo*+bestaudio/best\' --newline --add-metadata ' . $url . ' >' . $tmpfile);
}
elsif ($quality eq '1440') {
system(YTDL_PATH . " -f '308+140' --newline --add-metadata " . $url . ' >' . $tmpfile);
@@ -203,7 +202,7 @@ sub open_link
'downloading',
' downloading <b>' . $file_name . '</b>'
);
- if ($val == 100 || system('pgrep python >/dev/null 2>&1') != 0) {
+ if ($val == 100 || system('pgrep yt-dlp >/dev/null 2>&1') != 0) {
last;
}
}
@@ -220,13 +219,6 @@ sub open_link
return;
}
else {
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '10000',
- 'download started',
- ' <b>' . $file_name . '</b> started downloading'
- );
(undef, undef, $ret) = capture {
if (HOSTNAME eq "mother" or "po-rbo") {
system(CURL_PATH, "-fsSLO", $url);
@@ -238,7 +230,6 @@ sub open_link
system(
NOTIFYSEND_PATH,
'-u', 'normal',
- '-t', '10000',
'download complete',
' <b>' . $file_name . '</b> downloaded successfully to ' .
'<b>' . $pwd . '</b>'
@@ -248,7 +239,6 @@ sub open_link
system(
NOTIFYSEND_PATH,
'-u', 'critical',
- '-t', '10000',
'download failed',
' failed to download <b>' . $file_name . '</b>'
);
@@ -268,73 +258,48 @@ sub open_link
}
return;
}
- elsif ($a eq "thumb") {
+ elsif ($a eq "img" || $a eq "pdf") {
$pid = fork();
if (not $pid) {
setsid();
+ close_io();
chdir '/tmp' or die $!;
$file_name = $url;
$file_name =~ s/.+\///g;
- if ($file_name =~ m/^watch\?v=.+/) {
- $file_name = `yt-dlp -e $url`;
- if (not $file_name) {
- $file_name = "Youtube video";
- }
- chomp $file_name;
- }
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '5000',
- 'download started',
- ' fetching thumbnail for <b>'. $file_name . '</b>'
- );
- ($tmp, undef, $ret) = capture {
- system(YTDL_PATH, '--get-thumbnail', $url);
- };
- chomp $tmp;
- if ($ret != 0) {
+ if (is_yt($url) != 0) {
system(
NOTIFYSEND_PATH,
- '-u', 'critical',
- '-t', '10000',
- 'failed to get thumbnail',
- ' failed to get thumbail for <b>'. $file_name . '</b>'
+ '-u', 'low',
+ '-t', '5000',
+ 'download started',
+ ' fetching thumbnail'
+ );
+ ($tmp, undef, $ret) = capture {
+ system(YTDL_PATH, '--get-thumbnail', $url);
+ };
+ chomp $tmp;
+ if ($ret != 0) {
+ system(
+ NOTIFYSEND_PATH,
+ '-u', 'critical',
+ 'failed to get thumbnail',
+ ' failed to get thumbail'
);
- exit 0;
- }
- given (HOSTNAME) {
- when(["mother", "po-rbo"]) {
- system(CURL_PATH, "-fsSLO", $tmp);
- }
- when("mars") {
- system(FETCH_PATH, '-q', $tmp);
+ return;
}
+ $url = $tmp;
+ }
+ else {
+ system(
+ NOTIFYSEND_PATH,
+ '-u', 'low',
+ '-t', '5000',
+ 'download started',
+ ' fetching <b>'. $file_name . '</b> to <b>/tmp</b>'
+ );
}
- $file_name = $tmp;
- $file_name =~ s/.+\///g;
- chomp $file_name;
- system("magick", $file_name, $file_name . ".jpg");
- system($IMGVIEW_PATH . " " . $file_name . ".jpg");
- unlink($file_name);
- unlink($file_name . ".jpg");
- exit 0;
- }
- }
- elsif ($a eq "img" || $a eq "pdf") {
- $pid = fork();
- if (not $pid) {
- setsid();
- chdir '/tmp' or die $!;
$file_name = $url;
$file_name =~ s/.+\///g;
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '5000',
- 'download started',
- ' fetching <b>'. $file_name . '</b> to <b>/tmp</b>'
- );
given (HOSTNAME) {
when(["mother", "po-rbo"]) {
system(CURL_PATH, "-fsSLO", $url);
@@ -343,55 +308,72 @@ sub open_link
system(FETCH_PATH, '-q', $url);
}
}
+ my ($name, undef, $ext) = fileparse($file_name, qr/\.[^.]*/);
+ $ug = Data::UUID->new;
+ $uuid = $ug->create_str();
+ rename($file_name, $uuid . $ext);
+ $file_name = $uuid . $ext;
if ($a eq "img") {
- exec($IMGVIEW_PATH . " " . $file_name);
+ $ret = system(IMGVIEW_PATH . " " . $file_name);
}
else {
- exec(ZATHURA_PATH, $file_name);
+ $ret = system(ZATHURA_PATH, $file_name);
+ }
+ if ($ret != 0) {
+ system(
+ NOTIFYSEND_PATH,
+ '-u', 'critical',
+ 'failed to open image',
+ ' failed to open image <b>/tmp/'. $file_name . '</b>'
+ );
}
+ unlink($file_name);
+ return;
}
}
elsif ($a eq "w3m") {
+ close_io();
exec(TERMINAL_PATH, '-e', W3M_PATH, $url);
}
elsif ($a eq "browser") {
$pid = fork();
if (not $pid) {
setsid();
- capture {
- exec(BROWSER_PATH, $url);
- };
+ close_io();
+ exec(BROWSER_PATH, $url);
}
+ return;
}
elsif ($a eq "clip") {
$pid = fork();
if (not $pid) {
setsid();
+ close_io();
if (defined $ENV{WAYLAND_DISPLAY}) {
system("echo -n " . $url . " | wl-copy");
- exit(0);
+ return;
}
else {
- capture {
- exec(COPYQ_PATH, "copy", $url);
- };
+ exec(COPYQ_PATH, "copy", $url);
}
}
+ return;
}
return;
}
sub close_io
{
- open STDIN, '<', '/dev/null';
- open STDOUT, '>', '/dev/null';
- open STDERR, '>', '/dev/null';
+ open STDIN, '<', '/dev/null' or die $!;
+ open STDOUT, '>', '/dev/null' or die $!;
+ open STDERR, '>', '/dev/null' or die $!;
return;
}
sub is_yt
{
my ($url) = @_;
+
return $url =~ m{
^(?:https?://)?
(?:www\.|m\.)?
@@ -403,6 +385,26 @@ sub is_yt
}x;
}
+sub get_yt_vid_name
+{
+ my ($url) = @_;
+ my $file_name;
+
+ system(
+ NOTIFYSEND_PATH,
+ '-u', 'low',
+ '-t', '4000',
+ 'checking name',
+ ' looking for video name'
+ );
+ $file_name = `yt-dlp -e $url`;
+ if (not $file_name) {
+ $file_name = "yt video";
+ }
+ chomp $file_name;
+ return $file_name;
+}
+
sub fzf_prompt
{
my ($url) = @_;