From 1ed06b43c145af4354c594fdb7da0006ab258156 Mon Sep 17 00:00:00 2001 From: joe Date: Thu, 21 Aug 2025 12:29:03 +0200 Subject: up --- .local/bin/linkview | 635 ++++++++++++++++++++++++++++------------------------ 1 file changed, 341 insertions(+), 294 deletions(-) (limited to '.local') diff --git a/.local/bin/linkview b/.local/bin/linkview index 67c227d..bd3a7b1 100755 --- a/.local/bin/linkview +++ b/.local/bin/linkview @@ -31,15 +31,18 @@ use constant { COPYQ_PATH => 'copyq', HOSTNAME => (split /\./, hostname())[0] }; -use constant PROG_LIST => "" . -"play" . "\n" . -"img" . "\n" . -"dl" . "\n" . -"audio" . "\n" . -"pdf" . "\n" . -"w3m" . "\n" . -"browser" . "\n" . -"clip"; + +my %func_list = ( + 'play' => \&play, + 'img' => \&img_pdf, + 'dl' => \&dl, + 'audio' => \&audio, + 'pdf' => \&img_pdf, + 'w3m' => \&w3m, + 'browser' => \&browser, + 'clip' => \&clip, +); + use constant QUAL_LIST => "" . "uncap" . "\n" . "1440" . "\n" . @@ -50,185 +53,204 @@ use constant QUAL_LIST => "" . "240" . "\n" . "144" . "\n"; -sub open_link +sub play { - my ($a, $url, $article_name) = @_; - my $count; + my ($url, $article_name) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + system( + NOTIFYSEND_PATH, + '-u', 'low', + '-t', '2000', + 'playing media', + ' playing ' . $article_name . '' + ); + if (system(TERMINAL_PATH, "-e", MPV_PATH, $url) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'playback failed', + ' failed to open ' . $url . '' + ); + } + return; + } + return; +} + +sub img_pdf +{ + my ($url, $article_name, $key) = @_; my $file_name; - my $i; - my $list; my $pid; - my $pid2; - my $pwd; - my $quality; my $ret; my $tmp; - my $tmpfile; my $ug; my $uuid; - my $val; - my @wc; - if ($a eq "play") { - $pid = fork(); - if (not $pid) { - setsid(); - close_io(); + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + chdir '/tmp' or die $!; + $file_name = $url; + $file_name =~ s/.+\///g; + if (is_yt($url) != 0) { system( NOTIFYSEND_PATH, '-u', 'low', - '-t', '2000', - 'playing media', - ' playing ' . $article_name . '' + '-t', '5000', + 'fetching thumbnail', + ' fetching thumbnail for ' . $article_name . '' ); - if (system(TERMINAL_PATH, "-e", MPV_PATH, $url) != 0) { - exec( + ($tmp, undef, $ret) = capture { + system(YTDL_PATH, '--get-thumbnail', $url); + }; + chomp $tmp; + if ($ret != 0) { + system( NOTIFYSEND_PATH, '-u', 'critical', - '-t', '10000', - 'playback failed', - ' failed to open ' . $url . '' + 'failed to get thumbnail', + ' failed to get thumbail for ' . $article_name . '' ); - } - return; - } - return; - } - elsif ($a eq "dl") { - if (is_yt($url) != 0) { - $list = QUAL_LIST; - $quality = `printf "$list" | $menu --prompt 'quality > '`; - if (not $quality) { return; } - chomp $quality; + $url = $tmp; } - $pid = fork(); - if (not $pid) { - setsid(); - close_io(); - $ret = -1; - 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) != 0) { - $file_name = get_yt_vid_name($url); - } - 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 .= "[...]"; - } - $file_name =~ s/^[0-9]+/\[\.\.\.\]/; + else { system( NOTIFYSEND_PATH, '-u', 'low', - '-t', '2000', - 'download starting', - ' downloading ' . $file_name . '' + '-t', '5000', + 'download started', + ' fetching '. $file_name . ' to /tmp' ); - 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); - } - elsif ($quality eq '1440') { - system(YTDL_PATH . " -f '308+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - elsif ($quality eq '1080') { - system(YTDL_PATH . " -f '299+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - elsif ($quality eq '720') { - system(YTDL_PATH . " -f '298+140' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - else { - system(YTDL_PATH . " -f '[height<=" . $quality . "]' --newline --add-metadata " . $url . ' >' . $tmpfile); - } - }; - if ($ret == 0) { - system( - NOTIFYSEND_PATH, - '-u', 'normal', - 'download complete', - ' ' . $file_name . ' downloaded successfully to ' . - '' . $pwd . '' - ); + } + $file_name = $url; + $file_name =~ s/.+\///g; + given (HOSTNAME) { + when(["mother", "po-rbo"]) { + system(CURL_PATH, "-fsSLO", $url); + } + when("mars") { + 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 ($key eq "img") { + $ret = system(IMGVIEW_PATH . " " . $file_name); + } + else { + $ret = system(ZATHURA_PATH, $file_name); + } + if ($ret != 0) { + system( + NOTIFYSEND_PATH, + '-u', 'critical', + 'failed to open image', + ' failed to open file /tmp/'. $file_name . '' + ); + } + unlink($file_name); + return; + } + return; +} + +sub dl +{ + my ($url) = @_; + my $count; + my $file_name; + my $i; + my $list; + my $pid; + my $pid2; + my $pwd; + my $quality; + my $ret; + my $tmpfile; + my $val; + my @wc; + + if (is_yt($url) != 0) { + $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; + 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) != 0) { + $file_name = get_yt_vid_name($url); + } + 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 .= "[...]"; + } + $file_name =~ s/^[0-9]+/\[\.\.\.\]/; + system( + NOTIFYSEND_PATH, + '-u', 'low', + '-t', '2000', + 'download starting', + ' downloading ' . $file_name . '' + ); + 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); } - else { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - 'download failed', - ' failed to download ' . $file_name . '' - ); + elsif ($quality eq '1440') { + system(YTDL_PATH . " -f '308+140' --newline --add-metadata " . $url . ' >' . $tmpfile); } - return; - } - elsif ($pid2 < 0) { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - 'download failed', - ' failed to fork(2)' - ); - return; - } - else { - $count = 0; - while (1) { - $val = `tail -n 1 "$tmpfile" | awk '{print \$2}' | tr -d '%'`; - if (looks_like_number($val) != 0) { - system( - NOTIFYSEND_PATH, - '-h', - 'int:value:' . $val, - '-u', 'low', - '-t', '5000', - 'downloading', - ' downloading ' . $file_name . '' - ); - if ($val == 100 || system('pgrep yt-dlp >/dev/null 2>&1') != 0) { - last; - } - } - else { - if ($count == 10) { - last; - } - $count += 1; - } - sleep 2; + elsif ($quality eq '1080') { + system(YTDL_PATH . " -f '299+140' --newline --add-metadata " . $url . ' >' . $tmpfile); } - unlink $tmpfile; - } - return; - } - else { - (undef, undef, $ret) = capture { - if (HOSTNAME eq "mother" or "po-rbo") { - system(CURL_PATH, "-fsSLO", $url); - } elsif (HOSTNAME == "mars") { - system(FETCH_PATH, $url); + elsif ($quality eq '720') { + system(YTDL_PATH . " -f '298+140' --newline --add-metadata " . $url . ' >' . $tmpfile); + } + else { + system(YTDL_PATH . " -f '[height<=" . $quality . "]' --newline --add-metadata " . $url . ' >' . $tmpfile); } }; if ($ret == 0) { @@ -248,165 +270,190 @@ sub open_link ' failed to download ' . $file_name . '' ); } + return; } - return; - } - elsif ($pid < 0) { - system( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'download failed', - ' failed to fork(2)' - ); - return; - } - return; - } - elsif ($a eq "audio") { - $pid = fork(); - if (not $pid) { - setsid(); - close_io(); - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '2000', - 'playing media', - ' playing ' . $article_name . '' - ); - if (system( - TERMINAL_PATH, - "-e", - MPV_PATH, - "--vo=null", - "--video=no", - "--no-video", - $url - ) != 0) { - exec( - NOTIFYSEND_PATH, - '-u', 'critical', - '-t', '10000', - 'playback failed', - ' failed to open ' . $url . '' - ); - } - return; - } - return; - } - 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 (is_yt($url) != 0) { + elsif ($pid2 < 0) { system( NOTIFYSEND_PATH, - '-u', 'low', - '-t', '5000', - 'fetching thumbnail', - ' fetching thumbnail for ' . $article_name . '' - ); - ($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 for ' . $article_name . '' + '-u', 'critical', + 'download failed', + ' failed to fork(2)' ); - return; - } - $url = $tmp; + return; } else { - system( - NOTIFYSEND_PATH, - '-u', 'low', - '-t', '5000', - 'download started', - ' fetching '. $file_name . ' to /tmp' - ); + $count = 0; + while (1) { + $val = `tail -n 1 "$tmpfile" | awk '{print \$2}' | tr -d '%'`; + if (looks_like_number($val) != 0) { + system( + NOTIFYSEND_PATH, + '-h', + 'int:value:' . $val, + '-u', 'low', + '-t', '5000', + 'downloading', + ' downloading ' . $file_name . '' + ); + if ($val == 100 || system('pgrep yt-dlp >/dev/null 2>&1') != 0) { + last; + } + } + else { + if ($count == 10) { + last; + } + $count += 1; + } + sleep 2; + } + unlink $tmpfile; } - $file_name = $url; - $file_name =~ s/.+\///g; - given (HOSTNAME) { - when(["mother", "po-rbo"]) { + return; + } + else { + (undef, undef, $ret) = capture { + if (HOSTNAME eq "mother" or "po-rbo") { system(CURL_PATH, "-fsSLO", $url); + } elsif (HOSTNAME == "mars") { + system(FETCH_PATH, $url); } - when("mars") { - 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") { - $ret = system(IMGVIEW_PATH . " " . $file_name); + }; + if ($ret == 0) { + system( + NOTIFYSEND_PATH, + '-u', 'normal', + 'download complete', + ' ' . $file_name . ' downloaded successfully to ' . + '' . $pwd . '' + ); } else { - $ret = system(ZATHURA_PATH, $file_name); - } - if ($ret != 0) { system( NOTIFYSEND_PATH, '-u', 'critical', - 'failed to open image', - ' failed to open image /tmp/'. $file_name . '' + 'download failed', + ' failed to download ' . $file_name . '' ); } - unlink($file_name); - return; } + return; } - elsif ($a eq "w3m") { - close_io(); - exec(TERMINAL_PATH, '-e', W3M_PATH, $url); - } - elsif ($a eq "browser") { - $pid = fork(); - if (not $pid) { - setsid(); - close_io(); - exec(BROWSER_PATH, $url); - } + elsif ($pid < 0) { + system( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'download failed', + ' failed to fork(2)' + ); return; } - elsif ($a eq "clip") { - $pid = fork(); - if (not $pid) { - setsid(); - close_io(); - if (defined $ENV{WAYLAND_DISPLAY}) { - system("echo -n " . $url . " | wl-copy"); - return; - } - else { - exec(COPYQ_PATH, "copy", $url); - } - } + return; +} + +sub audio +{ + my ($url, $article_name) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); system( NOTIFYSEND_PATH, '-u', 'low', '-t', '2000', - 'clipped url', - ' clipped url' + 'playing media', + ' playing ' . $article_name . '' ); + if (system( + TERMINAL_PATH, + "-e", + MPV_PATH, + "--vo=null", + "--video=no", + "--no-video", + $url + ) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'playback failed', + ' failed to open ' . $url . '' + ); + } + return; + } + return; +} + +sub w3m +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + if (system(TERMINAL_PATH, '-e', W3M_PATH, $url) != 0) { + exec( + NOTIFYSEND_PATH, + '-u', 'critical', + '-t', '10000', + 'w3m failed', + ' failed to open ' . $url . '' + ); + } return; } return; } +sub browser +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + exec(BROWSER_PATH, $url); + } + return; +} + +sub clip +{ + my ($url) = @_; + my $pid; + + $pid = fork(); + if (not $pid) { + setsid(); + close_io(); + if (defined $ENV{WAYLAND_DISPLAY}) { + system("echo -n " . $url . " | wl-copy"); + return; + } + else { + exec(COPYQ_PATH, "copy", $url); + } + } + system( + NOTIFYSEND_PATH, + '-u', 'low', + '-t', '2000', + 'clipped url', + ' clipped url' + ); + return; +} + sub close_io { open STDIN, '<', '/dev/null' or die $!; @@ -454,7 +501,7 @@ sub fzf_prompt { my ($url) = @_; my $answer; - my $list = PROG_LIST; + my $list = join("\n", keys %func_list); $answer = `printf "$list\n" | $menu --prompt '$url > '`; chomp $answer; @@ -470,7 +517,7 @@ sub linkview exit 1; } $answer = fzf_prompt($ARGV[0]); - open_link($answer, $ARGV[0], $ARGV[1]); + $func_list{$answer}->($ARGV[0], $ARGV[1], $answer); return; } -- cgit v1.2.3