diff options
-rwxr-xr-x | .local/bin/linkview | 194 |
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) = @_; |