diff options
author | psyc://loupsycedyglgamf.onion/~lynX <ircs://psyced.org/youbroketheinternet> | 2016-08-10 15:28:51 +0000 |
---|---|---|
committer | psyc://loupsycedyglgamf.onion/~lynX <ircs://psyced.org/youbroketheinternet> | 2016-08-10 15:28:51 +0000 |
commit | 1580386217695e12d8eb6152a2d447262ef2d29d (patch) | |
tree | a607544c3fa1eca69fbbcb31ae832be9a63c49ee | |
parent | 8b41a25b65da90b6c5432595059867d26ec3f70c (diff) | |
download | perlpsyc-1580386217695e12d8eb6152a2d447262ef2d29d.tar.gz perlpsyc-1580386217695e12d8eb6152a2d447262ef2d29d.zip |
signals for remotor, improved trash and duration for psycamp
-rwxr-xr-x | bin/psycamp | 75 | ||||
-rwxr-xr-x | bin/remotor | 17 |
2 files changed, 62 insertions, 30 deletions
diff --git a/bin/psycamp b/bin/psycamp index d48baf9..f8844f6 100755 --- a/bin/psycamp +++ b/bin/psycamp | |||
@@ -386,6 +386,7 @@ sub ginread { | |||
386 | print RED, unlink ($deleteLater) ? | 386 | print RED, unlink ($deleteLater) ? |
387 | "\r***" : "\r - ", BOLD, GREEN, "[\n", RESET; | 387 | "\r***" : "\r - ", BOLD, GREEN, "[\n", RESET; |
388 | $deleteLater = undef; | 388 | $deleteLater = undef; |
389 | &trash; | ||
389 | } elsif ($opt_d && ($Volatile || | 390 | } elsif ($opt_d && ($Volatile || |
390 | $CurrentFile =~ /\b$VOLATILE\b/oi)) { | 391 | $CurrentFile =~ /\b$VOLATILE\b/oi)) { |
391 | print RED, unlink ($CurrentFile) ? | 392 | print RED, unlink ($CurrentFile) ? |
@@ -395,13 +396,13 @@ sub ginread { | |||
395 | $CurrentFile !~ /\b$KEEP\b/oi) { | 396 | $CurrentFile !~ /\b$KEEP\b/oi) { |
396 | print RED, unlink ($CurrentFile) ? | 397 | print RED, unlink ($CurrentFile) ? |
397 | "\r***" : "\r - ", BOLD, GREEN, "[\n", RESET; | 398 | "\r***" : "\r - ", BOLD, GREEN, "[\n", RESET; |
398 | } elsif ($DUR/1000 - $tc > 4) { | 399 | } elsif ($DUR - $tc > 4) { |
399 | # Both ffmpeg and mplayer have a bug of | 400 | # Both ffmpeg and mplayer have a bug of |
400 | # dividing the sum of frame bitrates by | 401 | # dividing the sum of frame bitrates by |
401 | # the duration of the complete track, thus | 402 | # the duration of the complete track, thus |
402 | # counting zero for the missing part. This | 403 | # counting zero for the missing part. This |
403 | # formula compensates for that bug. | 404 | # formula compensates for that bug. |
404 | my $estira = $I{bitrate} * $DUR/$tc/1000; | 405 | my $estira = $I{bitrate} * $DUR/$tc; |
405 | printf "%s%sIncomplete file. Estimated actual bitrate: %.1f%s\n", BOLD, YELLOW, $estira, RESET if $estira < 1000 and $estira > 50; | 406 | printf "%s%sIncomplete file. Estimated actual bitrate: %.1f%s\n", BOLD, YELLOW, $estira, RESET if $estira < 1000 and $estira > 50; |
406 | # Then again, this approach sometimes | 407 | # Then again, this approach sometimes |
407 | # fails if mplayer doesn't let us have | 408 | # fails if mplayer doesn't let us have |
@@ -599,15 +600,7 @@ X | |||
599 | #{ O | 600 | #{ O |
600 | if ( $ALLOW_DELETE_KEY ) { | 601 | if ( $ALLOW_DELETE_KEY ) { |
601 | if ( /^T(T?)\s*$/ ) { | 602 | if ( /^T(T?)\s*$/ ) { |
602 | # 'T' deletes song and remembers it in the index of trash media | 603 | $trashLater = $CurrentFile; |
603 | if (open(HATE, ">>", HATEINDEX)) { | ||
604 | printf HATE "%10d %5s %3s\t%s\r\n", | ||
605 | $CurrentSize, $I{duration}, $I{bitrate}, $CurrentFile; | ||
606 | close HATE; | ||
607 | print CYAN, ">> marked as trash\n", RESET; | ||
608 | } else { | ||
609 | print BOLD, RED, "*** Failed to write to ", HATEINDEX, ":\n", RESET, $out; | ||
610 | } | ||
611 | # dirty way to fall through into one of the following ifs | 604 | # dirty way to fall through into one of the following ifs |
612 | $_ = $1? 'DD': 'D'; | 605 | $_ = $1? 'DD': 'D'; |
613 | } | 606 | } |
@@ -620,19 +613,20 @@ X | |||
620 | if ( /^D\s*$/ ) { | 613 | if ( /^D\s*$/ ) { |
621 | my $f = $CurrentFile; | 614 | my $f = $CurrentFile; |
622 | &ginclose; | 615 | &ginclose; |
616 | &trash; | ||
623 | print BOLD, RED, ">> deleted: $f\n", RESET if unlink $f; | 617 | print BOLD, RED, ">> deleted: $f\n", RESET if unlink $f; |
624 | &ginopen; | 618 | &ginopen; |
625 | &next(0); | 619 | &next(0); |
626 | next; | 620 | next; |
627 | } | 621 | } |
628 | } | 622 | } |
629 | if ( /^(J|U|K|E|M|V|X|C|F|L|W|S|R)(\w?)\s*$/ ) { | 623 | if ( /^(J|U|K|E|M|V|X|C|F|L|W|S|R|Y)(\w?)\s*$/ ) { |
630 | my $r = $2; | 624 | my $r = $2; |
631 | if ($r and $r ne $1) { | 625 | if ($r and $r ne $1) { |
632 | print BOLD, RED, ">> command $1$r not defined\n", RESET; | 626 | print BOLD, RED, ">> command $1$r not defined\n", RESET; |
633 | next; | 627 | next; |
634 | } | 628 | } |
635 | $deleteLater = undef; | 629 | $trashLater = $deleteLater = undef; |
636 | my $t = $1 eq 'J' ? 'DEEJAY' : | 630 | my $t = $1 eq 'J' ? 'DEEJAY' : |
637 | $1 eq 'U' ? 'USE' : | 631 | $1 eq 'U' ? 'USE' : |
638 | $1 eq 'K' ? 'KEEP' : | 632 | $1 eq 'K' ? 'KEEP' : |
@@ -640,6 +634,7 @@ X | |||
640 | $1 eq 'M' ? 'REMASTER' : | 634 | $1 eq 'M' ? 'REMASTER' : |
641 | $1 eq 'V' ? 'VOLATILE' : | 635 | $1 eq 'V' ? 'VOLATILE' : |
642 | $1 eq 'X' ? 'EXPORT' : | 636 | $1 eq 'X' ? 'EXPORT' : |
637 | $1 eq 'Y' ? 'EASY' : | ||
643 | $1 eq 'C' ? 'CRITICIZE' : | 638 | $1 eq 'C' ? 'CRITICIZE' : |
644 | $1 eq 'F' ? 'FAVES' : | 639 | $1 eq 'F' ? 'FAVES' : |
645 | $1 eq 'W' ? 'WRONG' : | 640 | $1 eq 'W' ? 'WRONG' : |
@@ -649,7 +644,7 @@ X | |||
649 | $f = $ENV{PWD}. '/'. $f unless $f =~ m!^/!; | 644 | $f = $ENV{PWD}. '/'. $f unless $f =~ m!^/!; |
650 | my $f2 = $f; | 645 | my $f2 = $f; |
651 | # the initial (.*) is a hack to make the regexp match the last occurance in the path string rather than earlier ones | 646 | # the initial (.*) is a hack to make the regexp match the last occurance in the path string rather than earlier ones |
652 | unless ($f =~ s:^(.*)/(SHARE|T|COMPLETE|KEEP|EDITABLE|FAVES|WRONG|SECONDARY|REPERTOIRE|NEW|SEEK|TODO|USE|DEEJAY|REMASTER|CRITICIZE|INCOMING|incomingDJ|EXPORT|VOLATILE|L8R|CHAOS|DJ|byArtist|byGenre|vol)\d?/:\1/$t/:i) | 647 | unless ($f =~ s:^(.*)/(SHARE|T|COMPLETE|KEEP|EDITABLE|FAVES|WRONG|SECONDARY|REPERTOIRE|NEW|TODO|USE|DEEJAY|REMASTER|CRITICIZE|EASY|INCOMING|incomingDJ|EXPORT|VOLATILE|L8R|CHAOS|DJ|byArtist|byGenre|vol)\d?/:\1/$t/:i) |
653 | { | 648 | { |
654 | print BOLD, RED, ">> not applicable for $f\n", RESET; | 649 | print BOLD, RED, ">> not applicable for $f\n", RESET; |
655 | next; | 650 | next; |
@@ -661,7 +656,7 @@ X | |||
661 | } | 656 | } |
662 | if ($r) { | 657 | if ($r) { |
663 | $moveLater = $f; | 658 | $moveLater = $f; |
664 | print BOLD, BLUE, ">> scheduled to move to $t: $f\n", RESET; | 659 | print BOLD, BLUE, ">> scheduled to move to $t\n", RESET; |
665 | } else { | 660 | } else { |
666 | &moveFile($f); | 661 | &moveFile($f); |
667 | &next(0); | 662 | &next(0); |
@@ -671,7 +666,7 @@ X | |||
671 | if ( /^\.\s*$/ ) { | 666 | if ( /^\.\s*$/ ) { |
672 | print BOLD, BLUE, ">> no longer scheduled to go to $moveLater\n", RESET if $moveLater; | 667 | print BOLD, BLUE, ">> no longer scheduled to go to $moveLater\n", RESET if $moveLater; |
673 | print BOLD, BLUE, ">> no longer scheduled for removal\n", RESET if $deleteLater; | 668 | print BOLD, BLUE, ">> no longer scheduled for removal\n", RESET if $deleteLater; |
674 | $moveLater = $deleteLater = undef; | 669 | $trashLater = $moveLater = $deleteLater = undef; |
675 | next; | 670 | next; |
676 | } | 671 | } |
677 | #} O | 672 | #} O |
@@ -758,7 +753,7 @@ sub moveFile { | |||
758 | print BOLD, RED, ">> could not move asd file to $d\n", RESET; | 753 | print BOLD, RED, ">> could not move asd file to $d\n", RESET; |
759 | return; | 754 | return; |
760 | } | 755 | } |
761 | print BOLD, BLUE, ">> moved to $d\n", RESET; | 756 | print BOLD, BLUE, ">> moved to $f\n", RESET; |
762 | } | 757 | } |
763 | 758 | ||
764 | sub sleep { | 759 | sub sleep { |
@@ -861,7 +856,7 @@ sub duration { | |||
861 | if ( $t =~ /(\d*)(:|')(\S+)/ ) { | 856 | if ( $t =~ /(\d*)(:|')(\S+)/ ) { |
862 | $t = $1 ? $1*60+$3 : $3; | 857 | $t = $1 ? $1*60+$3 : $3; |
863 | } | 858 | } |
864 | $DUR = $t * 1000; | 859 | $DUR = $t; |
865 | print YELLOW, "[duration is $t secs]\n", RESET unless $opt_q; | 860 | print YELLOW, "[duration is $t secs]\n", RESET unless $opt_q; |
866 | return 1; | 861 | return 1; |
867 | } | 862 | } |
@@ -875,7 +870,7 @@ sub jump { | |||
875 | if ( $t =~ /(\d*)(:|')(\S*)/ ) { | 870 | if ( $t =~ /(\d*)(:|')(\S*)/ ) { |
876 | $t = $1 ? $1*60+$3 : $3; | 871 | $t = $1 ? $1*60+$3 : $3; |
877 | } | 872 | } |
878 | &gin( "seek ". $t*1000 .' '. $DUR ); | 873 | &gin( "seek ". $t*1000 .' '. $DUR*1000 ); |
879 | return 1; | 874 | return 1; |
880 | } | 875 | } |
881 | 876 | ||
@@ -1081,7 +1076,12 @@ sub ginparse { | |||
1081 | #% $TC eq $1 #? X | 1076 | #% $TC eq $1 #? X |
1082 | $tc == $1 #? !X | 1077 | $tc == $1 #? !X |
1083 | ) { | 1078 | ) { |
1084 | &seek(87) if $opt_j and $tc == 8; | 1079 | if ($opt_j) { |
1080 | # skip to 2/5 of track when 8th sec is reached | ||
1081 | &seek(48) if $tc == 8; | ||
1082 | # skip to end of track when 66% of track is reached | ||
1083 | &seek(96) if $tc == int($DUR*2/3); | ||
1084 | } | ||
1085 | #% $TC = $1; #? X | 1085 | #% $TC = $1; #? X |
1086 | $tc = $1; #? !X | 1086 | $tc = $1; #? !X |
1087 | $TC = time2str('[%T]', $tc, 0); #? !X | 1087 | $TC = time2str('[%T]', $tc, 0); #? !X |
@@ -1102,14 +1102,13 @@ sub ginparse { | |||
1102 | #% # kludge to get around a bug in xaudio (duration output twice) | 1102 | #% # kludge to get around a bug in xaudio (duration output twice) |
1103 | #% if ($1 != $LDUR) { | 1103 | #% if ($1 != $LDUR) { |
1104 | #% $LDUR = $DUR = $1; | 1104 | #% $LDUR = $DUR = $1; |
1105 | #% $DUR *= 1000 if $DUR < 1000; | ||
1106 | #% $CDUR += $DUR; # cumulative duration | 1105 | #% $CDUR += $DUR; # cumulative duration |
1107 | #% } | 1106 | #% } |
1108 | #% return 0; | 1107 | #% return 0; |
1109 | #% } | 1108 | #% } |
1110 | #% if (/ stream info \[(.+)\]/) { | 1109 | #% if (/ stream info \[(.+)\]/) { |
1111 | #% %I = split /[=,\s]+/, $1; | 1110 | #% %I = split /[=,\s]+/, $1; |
1112 | #% my $d = $DUR / 1000; | 1111 | #% my $d = $DUR; |
1113 | #% $I{duration} = sprintf("%02d:%02d", $d / 60, $d % 60); | 1112 | #% $I{duration} = sprintf("%02d:%02d", $d / 60, $d % 60); |
1114 | #%# if ($opt_l) { | 1113 | #%# if ($opt_l) { |
1115 | #%# my $f = $file[$order[$CS]]; | 1114 | #%# my $f = $file[$order[$CS]]; |
@@ -1119,7 +1118,7 @@ sub ginparse { | |||
1119 | #%# } | 1118 | #%# } |
1120 | #% $I{mode} = lc $I{mode}; | 1119 | #% $I{mode} = lc $I{mode}; |
1121 | #% if ($opt_c) { | 1120 | #% if ($opt_c) { |
1122 | #% my $d = $CDUR / 1000; | 1121 | #% my $d = $CDUR; |
1123 | #% $I{cumulative} = sprintf("%02d:%02d", $d / 60, $d % 60); | 1122 | #% $I{cumulative} = sprintf("%02d:%02d", $d / 60, $d % 60); |
1124 | #% &progress("$TC -> [$I{duration}] {$I{cumulative}} $I{bitrate} mp$I{layer}.$I{level} $I{frequency} $I{mode} "); | 1123 | #% &progress("$TC -> [$I{duration}] {$I{cumulative}} $I{bitrate} mp$I{layer}.$I{level} $I{frequency} $I{mode} "); |
1125 | #% } else { | 1124 | #% } else { |
@@ -1158,8 +1157,7 @@ sub ginparse { | |||
1158 | $CurrentCodec = $codec; | 1157 | $CurrentCodec = $codec; |
1159 | $CurrentSize = $size || -s $nf; | 1158 | $CurrentSize = $size || -s $nf; |
1160 | if ($CurrentFile ne $nf) { | 1159 | if ($CurrentFile ne $nf) { |
1161 | $moveLater = undef; | 1160 | $trashLater = $deleteLater = $moveLater = undef; |
1162 | $deleteLater = undef; | ||
1163 | $size = undef; | 1161 | $size = undef; |
1164 | $codec = undef; | 1162 | $codec = undef; |
1165 | } | 1163 | } |
@@ -1218,7 +1216,7 @@ sub ginparse { | |||
1218 | and $I{bitrate} and abs($br-$I{bitrate}) > 1; | 1216 | and $I{bitrate} and abs($br-$I{bitrate}) > 1; |
1219 | $I{bitrate} = $br if $br; | 1217 | $I{bitrate} = $br if $br; |
1220 | $I{duration} = $hh eq '00' ? "$mm:$ss" : "$hh:$mm:$ss"; | 1218 | $I{duration} = $hh eq '00' ? "$mm:$ss" : "$hh:$mm:$ss"; |
1221 | $DUR = (60*60*$1 + 60*$2 + $3) * 1000; | 1219 | $DUR = 60*60*$1 + 60*$2 + $3; |
1222 | $CDUR += $DUR; # cumulative duration | 1220 | $CDUR += $DUR; # cumulative duration |
1223 | break; | 1221 | break; |
1224 | } | 1222 | } |
@@ -1316,10 +1314,24 @@ sub ginopen { | |||
1316 | $output_open = 1; | 1314 | $output_open = 1; |
1317 | } | 1315 | } |
1318 | 1316 | ||
1317 | sub trash { | ||
1318 | if ($trashLater eq $CurrentFile) { | ||
1319 | # 'T' deletes song and remembers it in the index of trash media | ||
1320 | if (open(HATE, ">>", HATEINDEX)) { | ||
1321 | printf HATE "%10d %5s %3s\t%s\r\n", | ||
1322 | $CurrentSize, $I{duration}, $I{bitrate}, $CurrentFile; | ||
1323 | close HATE; | ||
1324 | print RED, ">> marked as trash\n", RESET; | ||
1325 | } else { | ||
1326 | print BOLD, RED, "*** Failed to write to ", HATEINDEX, ":\n", RESET, $out; | ||
1327 | } | ||
1328 | } | ||
1329 | $trashLater = undef; | ||
1330 | } | ||
1331 | |||
1319 | sub exit { | 1332 | sub exit { |
1320 | &ginstop; | 1333 | &ginstop; |
1321 | if ($CDUR and not $opt_q) { | 1334 | if ($CDUR and not $opt_q) { |
1322 | $CDUR /= 1000; | ||
1323 | my $SS = int $CDUR % 60; | 1335 | my $SS = int $CDUR % 60; |
1324 | my $M2 = int $CDUR / 60; | 1336 | my $M2 = int $CDUR / 60; |
1325 | my $HH = int $M2 / 60; | 1337 | my $HH = int $M2 / 60; |
@@ -1382,7 +1394,7 @@ sub addtolist { | |||
1382 | 1394 | ||
1383 | sub help { print BOLD, BLACK, &head, RESET, <<X, &sep('='); } | 1395 | sub help { print BOLD, BLACK, &head, RESET, <<X, &sep('='); } |
1384 | 1396 | ||
1385 | basics: (q)uit (h)elp | 1397 | basics: (h)elp, (q)uit, (qq)uit after this song is over |
1386 | 1398 | ||
1387 | motion: (p)lay (s)top pa(u)se | 1399 | motion: (p)lay (s)top pa(u)se |
1388 | [ (j)ump ] <mm:ss> jump to an absolute point in the song | 1400 | [ (j)ump ] <mm:ss> jump to an absolute point in the song |
@@ -1418,15 +1430,20 @@ Whenever media is in a directory like INCOMING, NEW or TODO, it can be | |||
1418 | moved into a different subdirectory on the same hierarchy level by using | 1430 | moved into a different subdirectory on the same hierarchy level by using |
1419 | the following uppercase commands: | 1431 | the following uppercase commands: |
1420 | 1432 | ||
1433 | C = send to CRITICIZE folder | ||
1434 | E = send to EDITABLE folder | ||
1421 | F = send to FAVES folder | 1435 | F = send to FAVES folder |
1422 | J = send to DEEJAY folder | 1436 | J = send to DEEJAY folder |
1423 | L = send to L8R | ||
1424 | K = send to KEEP | 1437 | K = send to KEEP |
1438 | L = send to L8R | ||
1439 | M = send to REMASTER | ||
1425 | R = send to REPERTOIRE | 1440 | R = send to REPERTOIRE |
1426 | S = send to SECONDARY | 1441 | S = send to SECONDARY |
1442 | S = send to USE | ||
1427 | V = send to VOLATILE | 1443 | V = send to VOLATILE |
1428 | W = send to WRONG | 1444 | W = send to WRONG |
1429 | X = send to EXPORT | 1445 | X = send to EXPORT |
1446 | Y = send to EASY | ||
1430 | 1447 | ||
1431 | If you prefer to execute the command *after* having finished playing it, | 1448 | If you prefer to execute the command *after* having finished playing it, |
1432 | you can schedule the move for later by doubling the command letter. So | 1449 | you can schedule the move for later by doubling the command letter. So |
diff --git a/bin/remotor b/bin/remotor index 50a75f0..a3e3d32 100755 --- a/bin/remotor +++ b/bin/remotor | |||
@@ -86,7 +86,9 @@ sub terror { | |||
86 | my $msg = "Error on the Tor control socket. $_"; | 86 | my $msg = "Error on the Tor control socket. $_"; |
87 | say $msg; | 87 | say $msg; |
88 | tellpsyc('_notice_warning_remotor', $msg); | 88 | tellpsyc('_notice_warning_remotor', $msg); |
89 | return &quit; | 89 | &quit; |
90 | # when the auth is wrong, the elegant &quit fails... forcing exit for now: | ||
91 | exit; | ||
90 | } | 92 | } |
91 | 93 | ||
92 | sub torparse { | 94 | sub torparse { |
@@ -244,6 +246,19 @@ sub mkdirhier { | |||
244 | register_uniform(); | 246 | register_uniform(); |
245 | say "Listening for PSYC controls on $bind"; | 247 | say "Listening for PSYC controls on $bind"; |
246 | 248 | ||
249 | local $SIG{HUP} = sub { | ||
250 | print STDERR "Received SIGHUP. Reloading configuration.\n"; | ||
251 | goto RESTART; | ||
252 | }; | ||
253 | local $SIG{USR1} = sub { | ||
254 | if ($torsock) { | ||
255 | print STDERR "Received SIGUSR1. Sending NEWNYM.\n"; | ||
256 | print $torsock "SIGNAL NEWNYM"; | ||
257 | } else { | ||
258 | print STDERR "Received SIGUSR1, but we're not connected.\n"; | ||
259 | } | ||
260 | }; | ||
261 | RESTART: | ||
247 | $|=1; | 262 | $|=1; |
248 | &iniparse($ini); | 263 | &iniparse($ini); |
249 | $host = $1 if $ENV{http_proxy} =~ m!^http://(\S+):\d+$!; | 264 | $host = $1 if $ENV{http_proxy} =~ m!^http://(\S+):\d+$!; |