summaryrefslogtreecommitdiffstats
path: root/.local/bin
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin')
-rwxr-xr-x.local/bin/linkview635
1 files changed, 341 insertions, 294 deletions
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 <b>' . $article_name . '</b>'
+ );
+ if (system(TERMINAL_PATH, "-e", MPV_PATH, $url) != 0) {
+ exec(
+ NOTIFYSEND_PATH,
+ '-u', 'critical',
+ '-t', '10000',
+ 'playback failed',
+ ' failed to open <b>' . $url . '</b>'
+ );
+ }
+ 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 <b>' . $article_name . '</b>'
+ '-t', '5000',
+ 'fetching thumbnail',
+ ' fetching thumbnail for <b>' . $article_name . '</b>'
);
- 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 <b>' . $url . '</b>'
+ 'failed to get thumbnail',
+ ' failed to get thumbail for <b>' . $article_name . '</b>'
);
- }
- 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 <b>' . $file_name . '</b>'
+ '-t', '5000',
+ 'download started',
+ ' fetching <b>'. $file_name . '</b> to <b>/tmp</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);
- }
- 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',
- ' <b>' . $file_name . '</b> downloaded successfully to ' .
- '<b>' . $pwd . '</b>'
- );
+ }
+ $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 <b>/tmp/'. $file_name . '</b>'
+ );
+ }
+ 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 <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);
}
- else {
- system(
- NOTIFYSEND_PATH,
- '-u', 'critical',
- 'download failed',
- ' failed to download <b>' . $file_name . '</b>'
- );
+ 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 <b>fork(2)</b>'
- );
- 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 <b>' . $file_name . '</b>'
- );
- 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 <b>' . $file_name . '</b>'
);
}
+ return;
}
- return;
- }
- elsif ($pid < 0) {
- system(
- NOTIFYSEND_PATH,
- '-u', 'critical',
- '-t', '10000',
- 'download failed',
- ' failed to <b>fork(2)</b>'
- );
- return;
- }
- return;
- }
- elsif ($a eq "audio") {
- $pid = fork();
- if (not $pid) {
- setsid();
- close_io();
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '2000',
- 'playing media',
- ' playing <b>' . $article_name . '</b>'
- );
- 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 <b>' . $url . '</b>'
- );
- }
- 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 <b>' . $article_name . '</b>'
- );
- ($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 <b>' . $article_name . '</b>'
+ '-u', 'critical',
+ 'download failed',
+ ' failed to <b>fork(2)</b>'
);
- return;
- }
- $url = $tmp;
+ return;
}
else {
- system(
- NOTIFYSEND_PATH,
- '-u', 'low',
- '-t', '5000',
- 'download started',
- ' fetching <b>'. $file_name . '</b> to <b>/tmp</b>'
- );
+ $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 <b>' . $file_name . '</b>'
+ );
+ 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',
+ ' <b>' . $file_name . '</b> downloaded successfully to ' .
+ '<b>' . $pwd . '</b>'
+ );
}
else {
- $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>'
+ 'download failed',
+ ' failed to download <b>' . $file_name . '</b>'
);
}
- 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 <b>fork(2)</b>'
+ );
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 <b>' . $article_name . '</b>'
);
+ 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 <b>' . $url . '</b>'
+ );
+ }
+ 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 <b>' . $url . '</b>'
+ );
+ }
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;
}