parent
e477196e62
commit
079729918f
18 changed files with 822 additions and 6 deletions
@ -0,0 +1,119 @@ |
||||
#!/usr/bin/python3 |
||||
# (c) 2014 Taeyeon MORI |
||||
|
||||
import os |
||||
import argparse |
||||
import subprocess |
||||
import hashlib |
||||
import contextlib |
||||
import sys |
||||
import termios |
||||
import shutil |
||||
|
||||
|
||||
system = lambda *a: subprocess.check_call(a) |
||||
|
||||
|
||||
class Package: |
||||
def __init__(self, x): |
||||
self.fqn = x |
||||
self.repo, self.name = x.split("/") |
||||
|
||||
|
||||
def parse_args(argv): |
||||
parser = argparse.ArgumentParser(prog=argv[0]) |
||||
|
||||
def add_option(option, default, help=None): |
||||
parser.add_argument(option, default=default) |
||||
|
||||
def add_switch(option, default=False, help=None): |
||||
parser.add_argument(option, default=default, action="store_const", const=not default) |
||||
|
||||
parser.add_argument("package", type=Package) |
||||
|
||||
add_option("-buildroot", "/tmp/abs-%i" % os.getuid()) |
||||
add_option("-makepkg", "makepkg") |
||||
|
||||
add_switch("-nobuild") |
||||
add_switch("-install") |
||||
|
||||
return parser.parse_args(argv[1:]) |
||||
|
||||
|
||||
def file_sha1(name): |
||||
with open(name, "rb") as f: |
||||
hash = hashlib.sha1() |
||||
while True: |
||||
data = f.read(2048) |
||||
if not data: |
||||
return hash.digest() |
||||
hash.update(data) |
||||
|
||||
|
||||
@contextlib.contextmanager |
||||
def rawinput(file): |
||||
fd = file.fileno() if hasattr(file, "fileno") else file |
||||
flags = save = termios.tcgetattr(fd) |
||||
flags[3] &= ~termios.ICANON |
||||
flags[6][termios.VMIN] = 1 |
||||
flags[6][termios.VTIME] = 0 |
||||
termios.tcsetattr(fd, termios.TCSADRAIN, flags) |
||||
yield |
||||
termios.tcsetattr(fd, termios.TCSADRAIN, save) |
||||
|
||||
|
||||
def yesno(prompt): |
||||
ch = "" |
||||
while ch not in "yYnN": |
||||
sys.stdout.write(prompt) |
||||
sys.stdout.write(" [Y/N] ") |
||||
sys.stdout.flush() |
||||
with rawinput(sys.stdin): |
||||
ch = sys.stdin.read(1) |
||||
sys.stdout.write("\r") |
||||
sys.stdout.write("\n") |
||||
return ch in "yY" |
||||
|
||||
|
||||
def main(argv): |
||||
args = parse_args(argv) |
||||
|
||||
print("===> Synchronizing ABS") |
||||
system("sudo", "abs", args.package.fqn) |
||||
|
||||
print("===> Updating build directory") |
||||
ABS_DIR = os.path.join("/var/abs", args.package.fqn) |
||||
if not os.path.exists(ABS_DIR): |
||||
print("=ERROR=> No such pacakge: %s" % args.package.fqn) |
||||
return 1 |
||||
REPODIR = os.path.join(args.buildroot, args.package.repo) |
||||
PACKDIR = os.path.join(REPODIR, args.package.name) |
||||
if not os.path.exists(PACKDIR): |
||||
os.makedirs(PACKDIR) |
||||
for path, dirs, files in os.walk(ABS_DIR): |
||||
rel_path = os.path.relpath(path, ABS_DIR) |
||||
dest_path = os.path.join(PACKDIR, rel_path) |
||||
for dir in dirs: |
||||
dest = os.path.join(dest_path, dir) |
||||
os.path.exists(dest) or os.mkdir(dest) |
||||
for file in files: |
||||
source = os.path.join(path, file) |
||||
dest = os.path.join(dest_path, file) |
||||
(not os.path.exists(dest) or (file_sha1(source) != file_sha1(dest) and yesno("=> Overwrite %s?" % os.path.join(rel_path, file)))) and shutil.copy(source, dest) |
||||
|
||||
yesno("=> Edit %s PKGBUILD?" % args.package.fqn) and system(os.environ.get("EDITOR", "vim"), os.path.join(PACKDIR, "PKGBUILD")) |
||||
|
||||
if not args.nobuild: |
||||
print("===> Building Package %s" % args.package.fqn) |
||||
os.chdir(PACKDIR) |
||||
if args.install: |
||||
system(args.makepkg, "-i") |
||||
else: |
||||
system(args.makepkg) |
||||
|
||||
return 0 |
||||
|
||||
|
||||
if __name__ == "__main__": |
||||
sys.exit(main(sys.argv)) |
||||
|
@ -0,0 +1,136 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
import os |
||||
import sys |
||||
import subprocess |
||||
import argparse |
||||
|
||||
def main(): |
||||
try: |
||||
return main_() |
||||
except SystemExit as e: |
||||
try: |
||||
return int(e.code) |
||||
except: |
||||
print(e.code) |
||||
return 1 |
||||
|
||||
def kvpair(x): |
||||
if x == "YES": |
||||
return True |
||||
elif x == "NO": |
||||
return False |
||||
elif x == "\\YES": |
||||
return "YES" |
||||
elif x == "\\NO": |
||||
return "NO" |
||||
else: |
||||
return x |
||||
|
||||
def main_(): |
||||
argp = argparse.ArgumentParser() |
||||
argp.add_argument("source", nargs="+") |
||||
argp.add_argument("destination") |
||||
argp.add_argument("-p", "--profile", choices=["aac", "m4a", "ogg", "wav", "wma"]) |
||||
argp.add_argument("-u", "--update", help="Only process new files", action="store_true") |
||||
argp.add_argument("--avconv", default="avconv") |
||||
argp.add_argument("-m", nargs=2, action="append", type=kvpair, default=[]) |
||||
argp.add_argument("-i", nargs=2, action="append", type=kvpair, default=[]) |
||||
argp.add_argument("-o", nargs=2, action="append", type=kvpair, default=[]) |
||||
|
||||
args = argp.parse_args() |
||||
|
||||
i_flags = dict() |
||||
o_flags = dict() |
||||
m_flags = dict() |
||||
|
||||
# no video |
||||
o_flags["vn"] = True |
||||
m_flags["update"] = args.update |
||||
|
||||
# capability checks |
||||
s = subprocess.check_output([args.avconv, "-codecs"], stderr=subprocess.DEVNULL) |
||||
if b"faac" in s: |
||||
aac = {"acodec": "faac"} |
||||
else: |
||||
aac = {"acodec": "aac", "strict": "experimental"} |
||||
if b"libvorbis" in s: |
||||
vorbis = {"acodec": "libvorbis"} |
||||
else: |
||||
vorbis = {"acodec": "vorbis", "strict": "experimental"} |
||||
|
||||
# profiles |
||||
m_flags["fileext"] = "raw" |
||||
|
||||
if args.profile == "aac": |
||||
m_flags["fileext"] = "aac" |
||||
o_flags.update(aac) |
||||
elif args.profile == "m4a": |
||||
m_flags["fileext"] = "m4a" |
||||
o_flags.update(aac) |
||||
elif args.profile == "ogg": |
||||
m_flags["fileext"] = "ogg" |
||||
o_flags.update(vorbis) |
||||
elif args.profile == "wav": |
||||
m_flags["fileext"] = "wav" |
||||
o_flags["acodec"] = "pcm_f32le" |
||||
elif args.profile == "wma": |
||||
m_flags["fileext"] = "wma" |
||||
o_flags["acodec"] = "wmav2" |
||||
o_flags["ac"] = 2 |
||||
|
||||
i_flags.update(dict(args.i)) |
||||
o_flags.update(dict(args.o)) |
||||
m_flags.update(dict(args.m)) |
||||
|
||||
if len(args.source) > 1: |
||||
run_multiple(m_flags, args.avconv, i_flags, args.source, o_flags, args.destination) |
||||
else: |
||||
run_once(m_flags, args.avconv, i_flags, args.source[0], o_flags, args.destination) |
||||
return 0 |
||||
|
||||
|
||||
def make_destfile(source, m, destination): |
||||
if not os.path.isdir(destination): |
||||
return destination |
||||
stem, ext = os.path.splitext(source) |
||||
destfile = ".".join((stem, m["fileext"])) |
||||
return os.path.join(destination, destfile) |
||||
|
||||
|
||||
def add_args(argv, argdict): |
||||
for k,v in argdict.items(): |
||||
argv.append("-%s" % k) |
||||
if v is not True: |
||||
argv.append(str(v)) |
||||
|
||||
|
||||
def make_argv(m, avconv, i, source, o, destination): |
||||
argv = [avconv] |
||||
add_args(argv, i) |
||||
argv.append("-i") |
||||
argv.append(source) |
||||
add_args(argv, o) |
||||
argv.append(make_destfile(source, m, destination)) |
||||
return argv |
||||
|
||||
|
||||
def run_once(m, avconv, i, source, o, destination): |
||||
dest = make_destfile(source, m, destination) |
||||
if m["update"] and os.path.exists(dest) and os.stat(dest).st_mtime >= os.stat(source).st_mtime: |
||||
return |
||||
try: |
||||
subprocess.check_call(make_argv(m, avconv, i, source, o, destination)) |
||||
except subprocess.CalledProcessError as e: |
||||
raise SystemExit("Worker avconv process exited with nonzero return code: %i\nCommand was: %s\nAborting." % (e.returncode, e.cmd)) |
||||
|
||||
|
||||
def run_multiple(m, avconv, i, sources, o, destination): |
||||
if not os.path.isdir(destination): |
||||
os.mkdir(destination) |
||||
for source in sources: |
||||
run_once(m, avconv, i, source, o, destination) |
||||
|
||||
if __name__ == "__main__": |
||||
main() |
||||
|
@ -0,0 +1,51 @@ |
||||
#!/bin/zsh |
||||
# vim: ft=sh:ts=2:sw=2:et |
||||
|
||||
source "$DOTFILES/zsh/lib.zsh" |
||||
source "$DOTFILES/etc/aur.conf" |
||||
|
||||
function throw { |
||||
err "$2" |
||||
exit $1 |
||||
} |
||||
|
||||
tmpbuild=$TMPDIR/aur.sh.$$ |
||||
build="${BUILDDIR:-$tmpbuild}" |
||||
test -d "$build" || mkdir -p "$build" || exit 1 |
||||
|
||||
packages=(${@##-*}) |
||||
makepkg_flags=(${@##[^\-]*}) |
||||
|
||||
msg "[AUR] AURDIR=$AURDIR; PKGDEST=$PKGDEST" |
||||
test "$build" = "$PWD" || \ |
||||
msg "[AUR] Working in $build." |
||||
msg "[AUR] Building packages: $packages" |
||||
|
||||
for p in "${packages[@]}"; do |
||||
cd "$AURDIR" |
||||
|
||||
msg "[AUR] $p: Getting PKGBUILD" |
||||
{ |
||||
test -d $p && \ |
||||
test -f $p/PKGBUILD && \ |
||||
grep -q "#CUSTOMPKG" $p/PKGBUILD && \ |
||||
warn "[AUR] $p: Found #CUSTOMPKG; not updating PKGBUILD from AUR!" \ |
||||
} || \ |
||||
{ curl https://aur.archlinux.org/packages/${p:0:2}/$p/$p.tar.gz | tar xz } || \ |
||||
throw 2 "[AUR] $p: Couldn't download package" |
||||
|
||||
cd $p |
||||
|
||||
msg "[AUR] $p: Building..." |
||||
makepkg "${makepkg_flags[@]}" || \ |
||||
throw 1 "[AUR] $p: Makepkg failed!" |
||||
|
||||
msg "[AUR] $p: Done!" |
||||
done |
||||
|
||||
msg "[AUR] All Done!" |
||||
|
||||
test "$build" = "$tmpbuild" && \ |
||||
warn "[AUR] Removing temporary directory $tmpbuild" && \ |
||||
rm -rf "$tmpbuild" |
||||
|
@ -0,0 +1,94 @@ |
||||
#!/bin/bash |
||||
# (c) 2012-2014 MORI Taeyeon |
||||
# Convert video for playback on Sony PSP |
||||
|
||||
usage() { |
||||
echo "Usage: `basename "$1"` [-subs] [-nothumb] <infile> [outfile] [-- <HandBrakeCLI options>]" |
||||
echo |
||||
echo "ffpsp (c) 2012-2014 MORI Taeyeon" |
||||
echo "Convert a video for Sony PSP" |
||||
echo |
||||
echo "Positional Arguments:" |
||||
echo -e "\tinfile\t\tInput file" |
||||
echo -e "\toutfile\t\tOutput file (default: same name in psp/ subdir)" |
||||
echo |
||||
echo "Options:" |
||||
echo -e "\t-h\t\tDisplay this help message and exit." |
||||
echo -e "\t-subs\t\tHardcode softsubs" |
||||
echo -e "\t-nothumb\tDon't generate Thumbnails" |
||||
echo |
||||
echo "Override Application executables:" |
||||
echo -e "\t-avprobe -ffmpeg -hbcli -videothumb" |
||||
echo |
||||
echo "Additional HB-CLI options may be added after a '--' (if you know what you're doing!)" |
||||
} |
||||
|
||||
# commandline options |
||||
SUBTITLES=false |
||||
THUMBNAIL=true |
||||
INPUT_FILE= |
||||
OUTPUT_FILE= |
||||
|
||||
avprobe=avprobe |
||||
hbcli=HandBrakeCLI |
||||
ffmpeg=ffmpeg |
||||
videothumb=videothumb |
||||
|
||||
# Parse commandline options |
||||
pos_args=0 |
||||
next= |
||||
for i in "$@"; do |
||||
shift; |
||||
if [[ -z "$next" ]]; then |
||||
case "$i" in |
||||
-subs) |
||||
SUBTITLES=true;; |
||||
-nothumb) |
||||
THUMBNAIL=false;; |
||||
-avprobe|-ffmpeg|-hbcli|-videothumb) |
||||
next=${1#-};; |
||||
--) |
||||
break;; |
||||
-h|-help|--help) |
||||
usage $0 |
||||
exit 0;; |
||||
*) |
||||
case $pos_args in |
||||
0) INPUT_FILE=$i;; |
||||
1) OUTPUT_FILE=$i;; |
||||
esac |
||||
pos_args=$[$pos_args+1];; |
||||
esac |
||||
else |
||||
eval "$next=\"\$i\"" |
||||
next= |
||||
fi |
||||
done |
||||
[[ $pos_args -lt 1 || $pos_args -gt 2 ]] && usage $0 && exit 1 |
||||
|
||||
# Generate output filename |
||||
if [[ -z "$OUTPUT_FILE" ]]; then |
||||
OUTPUT_DIR=`dirname "$INPUT_FILE"`/psp |
||||
OUTPUT_FILE=`basename "$INPUT_FILE"` |
||||
OUTPUT_FILE=$OUTPUT_DIR/${OUTPUT_FILE%.*}.mp4 |
||||
if ! [[ -e "$OUTPUT_DIR" ]]; then |
||||
mkdir -p "$OUTPUT_DIR" |
||||
elif [[ -e "$OUTPUT_FILE" ]]; then |
||||
echo "File already exists: \"$OUTPUT_FILE\". Specify it explicitly to overwrite" |
||||
exit 1 |
||||
fi |
||||
fi |
||||
THUMBNAIL_FILE=${OUTPUT_FILE%.*}.thm |
||||
|
||||
# Handle Softsubs |
||||
if $SUBTITLES && $avprobe "$INPUT_FILE" 2>&1 | grep -i Subtitle | grep -qi ass; then |
||||
SUB_ARGS="--subtitle-burned 1 -s 1" |
||||
echo "Found a subtitle Track!" |
||||
fi |
||||
|
||||
# Go! |
||||
$hbcli -X 480 -Y 272 --modulus 16 -E faac -B 128 -R 44.1 -6 stereo -e x264 -r 23.976 -x profile=main:level=30:weightp=1:subq=9:rc-lookahead=20:8x8dct=0:b-pyramid=none:me=umh:bframes=16 -i "$INPUT_FILE" -o "$OUTPUT_FILE" -q 20 $SUB_ARGS "$@" || exit $? |
||||
|
||||
|
||||
$THUMBNAIL && $videothumb "$OUTPUT_FILE" "$THUMBNAIL_FILE" -s 160x120 || exit $? |
||||
|
@ -0,0 +1,98 @@ |
||||
#!/bin/bash |
||||
# (c) 2012-2014 MORI Taeyeon |
||||
# Batch-convert videos for playback on Sony PSP |
||||
|
||||
usage() { |
||||
echo "Usage: `basename "$1"` [-subs] [-nothumb] [-log <path>] [-out <path>] <file [...]>" |
||||
echo |
||||
echo "ffpsp-batch (c) 2012-2014 MORI Taeyeon" |
||||
echo "Batch-convert videos for Sony PSP" |
||||
echo |
||||
echo "Options:" |
||||
echo -e "\t-h\t\tDisplay this help message and exit." |
||||
echo -e "\t-subs\t\tHardcode softsubs" |
||||
echo -e "\t-nothumb\tDon't generate Thumbnails" |
||||
echo -e "\t-log <path>\tThe logfile path" |
||||
echo -e "\t-out <path>\tThe output directory" |
||||
echo |
||||
echo "Override Application executables: -<prog> <path>" |
||||
echo -e "\t-avprobe -ffmpeg -hbcli -videothumb -ffpsp" |
||||
} |
||||
|
||||
FFPSP_OPT=() |
||||
FILES=() |
||||
|
||||
log="${XDG_CACHE_HOME-$HOME/.cache}/ffpsp/ffpsp-batch.$(date +%Y%m%d-%H%M).$$.log" |
||||
|
||||
ffpsp=ffpsp |
||||
|
||||
# Parse commandline options |
||||
next= |
||||
for i in "$@"; do |
||||
shift |
||||
if [[ -z "$next" ]]; then |
||||
case "$i" in |
||||
-subs|-nothumb) |
||||
FFPSP_OPT+=("$i");; |
||||
-avprobe|-ffmpeg|-hbcli|-videothumb) |
||||
FFPSP_OPT+=("$i") |
||||
next=ffpsp-opt;; |
||||
-ffpsp|-out|-log) |
||||
next=${i#-};; |
||||
-h|-help|--help) |
||||
usage "$0" |
||||
exit 0;; |
||||
--) |
||||
FILES+=("$@") |
||||
break;; |
||||
*) |
||||
FILES+=("$i") |
||||
esac |
||||
elif [[ "$next" == "ffpsp-opt" ]]; then |
||||
FFPSP_OPT+=("$i") |
||||
next= |
||||
else |
||||
eval "$next=\"\$i\"" |
||||
next= |
||||
fi |
||||
done |
||||
|
||||
# Create log dir |
||||
mkdir -p "`dirname "$log"`" |
||||
|
||||
# Set title |
||||
echo -ne "\033]1;ffpsp\007" |
||||
|
||||
# sort input files, for convenience |
||||
readarray -t sorted < <(for a in "${FILES[@]}"; do echo "$a"; done | sort) |
||||
|
||||
# Report Queue |
||||
echo "-- ffpsp-batch v1 --" | tee "$log" |
||||
echo "[[ QUEUE ]]" |
||||
for f in "${sorted[@]}"; do echo "`basename "$f"`"; done |
||||
echo |
||||
|
||||
# Process queue |
||||
i=0 |
||||
for f in "${sorted[@]}"; do |
||||
# Report progress. |
||||
i=$[ i + 1 ] |
||||
echo [[ \>\> $f \<\< ]] | tee -a "$log" |
||||
echo -ne "\033]2;[ffpsp] ($i of ${#sorted[@]}) $f\007" |
||||
|
||||
# Generate output filename |
||||
OUTPUT_DIR=${out-$(dirname "$f")/psp} |
||||
OUTPUT_FILE=`basename "$f"` |
||||
OUTPUT_FILE=$OUTPUT_DIR/${OUTPUT_FILE%.*}.mp4 |
||||
if ! [[ -e "$OUTPUT_DIR" ]]; then |
||||
mkdir -p "$OUTPUT_DIR" |
||||
elif [[ -e "$OUTPUT_FILE" ]]; then |
||||
echo "File already exists: \"$OUTPUT_FILE\". Skipping" |
||||
continue |
||||
fi |
||||
|
||||
$ffpsp "${FFPSP_OPT[@]}" "$f" "$OUTPUT_FILE" 2> >(tee -a "$log" >&2) |
||||
done |
||||
|
||||
# Notify completion |
||||
echo -ne "\033]1;ffpsp - done\007\033]2;[ffpsp] done.\007" |
@ -0,0 +1,72 @@ |
||||
#!/usr/bin/env python3 |
||||
|
||||
import sys, os |
||||
import argparse |
||||
import subprocess |
||||
|
||||
def existing_filename(f): |
||||
if not os.path.exists(f): |
||||
raise ValueError("No such file or directory.") |
||||
return f |
||||
|
||||
def existing_dirname_or_dash(f): |
||||
if f == '-': |
||||
pass |
||||
elif not os.path.exists(f): |
||||
raise ValueError("No such file or directory.") |
||||
elif not os.path.isdir(f): |
||||
raise ValueError("Not a directory: %s" % f) |
||||
return f |
||||
|
||||
def int_1plus(s): |
||||
i = int(s) |
||||
if i < 1: |
||||
raise ValueError("Index must be greater 0.") |
||||
return i |
||||
|
||||
def parse_args(argv): |
||||
parser = argparse.ArgumentParser(prog=argv[0]) |
||||
parser.add_argument("image", help="image file", type=existing_filename) |
||||
parser.add_argument("mountpoint", help="mount point/loop device ['-' uses next available]", type=existing_dirname_or_dash) |
||||
parser.add_argument("-p", help="partition index, 1-based [default: 1]", type=int_1plus, default=1, metavar="index", dest="part") |
||||
parser.add_argument("-l", help="Don't mount, just setup the loop device.", action="store_true", default=False) |
||||
parser.add_argument("-t", help="filesystem type [default: auto]", metavar="vfstype") |
||||
parser.add_argument("-o", help="mount options [default: none]", metavar="options") |
||||
parser.add_argument("-parted", help="parted executable [default: parted]", default="parted") |
||||
parser.add_argument("-mount", help="mount executable [default: mount]", default="mount") |
||||
parser.add_argument("-losetup", help="losetup executable [default: losetup]", default="losetup") |
||||
return parser.parse_args(argv[1:]) |
||||
|
||||
def main(argv): |
||||
args = parse_args(argv) |
||||
|
||||
parted = subprocess.check_output([args.parted, args.image, "-s", "-m", "u", "b", "p"]) |
||||
partitions = parted.split(b";\n")[2:] |
||||
|
||||
try: |
||||
part = partitions[args.part-1] |
||||
except IndexError: |
||||
raise SystemExit("Partition index out of range: %i, has %i" % (args.part, len(partitions))) |
||||
|
||||
offset = part.split(b':')[1].rstrip(b'B').decode("ascii") |
||||
|
||||
if args.l: |
||||
if args.mountpoint == '-': |
||||
args.mountpoint = "-f" |
||||
losetup = [args.losetup, "--show", "--offset", offset, args.mountpoint, args.image] |
||||
subprocess.check_call(losetup) |
||||
else: |
||||
if args.mountpoint == '-': |
||||
raise ValueError("Mountpoint cannot be '-' unless -l (only setup loop device) is also given") |
||||
options = "offset=%s" % offset |
||||
if args.o: |
||||
options += ',' + args.o |
||||
mount = [args.mount, args.image, args.mountpoint, "-o", options] |
||||
if args.t: |
||||
mount.append("-t") |
||||
mount.append(args.t) |
||||
subprocess.check_call(mount) |
||||
|
||||
if __name__ == "__main__": |
||||
import sys |
||||
sys.exit(main(sys.argv)) |
@ -0,0 +1,28 @@ |
||||
#!/bin/bash |
||||
echo "[ShedShut v1] Waiting for \"$1\" to finish" |
||||
NXC="$IFS";IFS=$'\n' |
||||
ps=($(ps xaht | grep -v grep | grep -v "$0" | grep "$1" | awk '{ printf "("$1") "; for (i=5; i<=NF; i++) printf $i" "; printf "\n" }')) |
||||
IFS="$NXC" |
||||
echo "Expression matches on:"; for i in "${ps[@]}"; do echo " $i"; done |
||||
#echo "Filtering Keywords: 'grep', '$0'" |
||||
if test -z "$2"; then cmd="shutdown -h now"; else cmd="$2"; fi |
||||
echo "Sheduled Command: $cmd" |
||||
if ! test `id -u` = 0; then echo "WARNING: Your Command may not work as user '$(id -un)'"; fi |
||||
|
||||
f="date +%H:%M:%S" |
||||
|
||||
watch() { |
||||
declare -g -a watch_pids=($(ps xaht | grep -v grep | grep -v "$0" | grep "$1" | awk '{ print $1 }')) |
||||
if test ${#watch_pids[@]} -gt 0; then |
||||
echo "[$($f)] Processes: ${watch_pids[@]}" |
||||
return 0 |
||||
else |
||||
echo "[$($f)] No Processes." |
||||
return 1 |
||||
fi |
||||
} |
||||
|
||||
while watch $1; do sleep 60; done |
||||
|
||||
echo "[$($f)] Shutting down: $cmd" |
||||
$cmd |
@ -0,0 +1,63 @@ |
||||
#!/usr/bin/python3 |
||||
# (c) 2013 MORI Taeyeon |
||||
# Create Video Thumbnails using FFmpeg |
||||
|
||||
from __future__ import print_function, division, absolute_import, unicode_literals |
||||
|
||||
import subprocess |
||||
import re |
||||
import os |
||||
import random |
||||
import argparse |
||||
|
||||
ffmpeg_cmd = ["ffmpeg"] |
||||
ffprobe_cmd = ["ffmpeg", "-i"] |
||||
regexp = re.compile(r"Duration: (\d+):(\d\d):(\d\d).\d\d,") |
||||
|
||||
def getdur(file): |
||||
cmd = ffprobe_cmd + [file] |
||||
pipe = subprocess.Popen(cmd, stderr=subprocess.PIPE) |
||||
pipe.wait() |
||||
try: |
||||
for line in pipe.stderr: |
||||
sys.stderr.buffer.write(line) |
||||
line = str(line, "utf8").rstrip() |
||||
if "Duration:" in line: |
||||
dur = regexp.search(line) |
||||
return int(dur.group(1))*3600+int(dur.group(2))*60+int(dur.group(3)) |
||||
else: |
||||
raise ValueError("Duration not in FFMpeg output!") |
||||
finally: |
||||
sys.stderr.buffer.flush() |
||||
sys.stderr.flush() |
||||
|
||||
def randpos(file): |
||||
dur = getdur(file) |
||||
pos = random.randint(1, dur) |
||||
print("Dur: %i, Pos: %i" % (dur, pos)) |
||||
return pos |
||||
|
||||
def mkthumb(file, pos, target, res=None): |
||||
cmd = ffmpeg_cmd + ["-ss", pos, "-i", file, "-an", "-vframes", 1, "-f", "image2"] |
||||
if res is not None: |
||||
cmd.extend(["-s", res]) |
||||
cmd.append(target) |
||||
return subprocess.check_call(map(str,cmd)) |
||||
|
||||
def main(argv): |
||||
parser = argparse.ArgumentParser(prog=argv[0]) |
||||
parser.add_argument("input", help="input file name") |
||||
parser.add_argument("target", help="thumbnail file name") |
||||
parser.add_argument("-p", help="Position in Video (random if omitted)", type=int) |
||||
parser.add_argument("-s", help="scale picture (WxH)") |
||||
args = parser.parse_args(argv[1:]) |
||||
os.stat(args.input) |
||||
if args.p: |
||||
mkthumb(args.input, args.p, args.target, args.s) |
||||
else: |
||||
mkthumb(args.input, randpos(args.input), args.target, args.s) |
||||
|
||||
if __name__ == "__main__": |
||||
import sys |
||||
sys.exit(main(sys.argv)) |
||||
|
@ -1,6 +1,20 @@ |
||||
# vim: ft=sh |
||||
|
||||
# Packager Info |
||||
source "$DOTFILES/user-info" |
||||
PACKAGER="$REALNAME <$EMAIL>" |
||||
|
||||
# Optimizations |
||||
function fix_march { |
||||
echo $@ | sed 's/-march=[\w-]+ -mtune=\w+/-march=native/' |
||||
} |
||||
|
||||
CFLAGS="`fix_march $CFLAGS`" |
||||
CXXFLAGS="`fix_march $CXXFLAGS`" |
||||
LDFLAGS="$LDFLAGS" |
||||
|
||||
MAKEFLAGS="-j4" |
||||
CFLAGS="-march=native" |
||||
|
||||
# Store stuff |
||||
source "$DOTFILES/etc/aur.conf" |
||||
|
||||
|
@ -0,0 +1,11 @@ |
||||
# vim: ft=sh |
||||
|
||||
# Folders |
||||
AURDIR="$HOME/aur" |
||||
PKGDEST="$AURDIR/Packages" |
||||
SRCDEST="$AURDIR/Source" |
||||
|
||||
test -d "$AURDIR" || mkdir -p "$AURDIR" || exit 1 |
||||
test -d "$PKGDEST" || mkdir -p "$PKGDEST" || exit 1 |
||||
test -d "$SRCDEST" || mkdir -p "$SRCDEST" || exit 1 |
||||
|
@ -0,0 +1,11 @@ |
||||
# vim: ft=sh |
||||
|
||||
# Folders |
||||
AURDIR="$HOME/aur" |
||||
PKGDEST="$AURDIR/.pkg" |
||||
SRCDEST="$AURDIR/.sauce" |
||||
|
||||
test -d "$AURDIR" || mkdir -p "$AURDIR" || exit 1 |
||||
test -d "$PKGDEST" || mkdir -p "$PKGDEST" || exit 1 |
||||
test -d "$SRCDEST" || mkdir -p "$SRCDEST" || exit 1 |
||||
|
@ -0,0 +1,6 @@ |
||||
[Desktop Entry] |
||||
Type=Application |
||||
Exec=ffpsp-batch -subs %F |
||||
Terminal=true |
||||
Name=[ffpsp] Drop files to convert |
||||
Icon=hb-icon |
@ -0,0 +1,111 @@ |
||||
#!/bin/bash |
||||
# libssh-agent 0.1 |
||||
# (c) 2013-2014 Orochimarufan |
||||
# |
||||
# Managing SSH keys and agents |
||||
|
||||
LSA_VERSION=0.1 |
||||
|
||||
# === Tools === |
||||
# Echo colored text to STDERR |
||||
echocolor() { |
||||
# (int color, string... text) |
||||
local COLOR=$1 && shift |
||||
echo -e "\e[${COLOR}m$*\e[0m" >&2 |
||||
} |
||||
|
||||
# Look for keys in ssh argv |
||||
ssh_keys_from_argv() { |
||||
# (string... argv) -> global "KEYS" |
||||
local EX=false |
||||
declare -ga KEYS |
||||
|
||||
for arg in "$@"; do |
||||
if $EX; then |
||||
KEYS=("${KEYS[@]}" "$arg") |
||||
EX=false |
||||
else |
||||
[ "$arg" = "-i" ] && EX=true |
||||
fi |
||||
done |
||||
} |
||||
|
||||
# === Private Functions === |
||||
# Private SSH Agent instance management |
||||
PRIVATE_SSH_AGENT=false |
||||
|
||||
private_ssh_agent_start() { |
||||
echocolor 35 "Starting private SSH Agent." |
||||
PRIVATE_SSH_AGENT_P_PID=$SSH_AGENT_PID |
||||
PRIVATE_SSH_AGENT_P_SOCK=$SSH_AUTH_SOCK |
||||
# We don't want the PID printed. |
||||
eval `ssh-agent -s` >/dev/null |
||||
PRIVATE_SSH_AGENT=true |
||||
} |
||||
|
||||
private_ssh_agent_stop() { |
||||
echocolor 35 "Stopping private SSH Agent." |
||||
# We don't need the output. |
||||
eval `ssh-agent -ks` >/dev/null |
||||
PRIVATE_SSH_AGENT=false |
||||
export SSH_AGENT_PID=$PRIVATE_SSH_AGENT_P_PID |
||||
export SSH_AUTH_SOCK=$PRIVATE_SSH_AGENT_P_SOCK |
||||
} |
||||
|
||||
gnome_keyring_ssh_agent_ckeck() { |
||||
# the GNOME Keyring agent doesn't support ecdsa keys. |
||||
local PID=$1; shift |
||||
|
||||
# FIXME: Linux specific! |
||||
# FIXME: is this reliable? |
||||
CMDLINE="/proc/$PID/cmdline" |
||||
if grep -qi gnome-session "$CMDLINE" 2>/dev/null; then |
||||
echocolor 33 "Warning: Detected GNOME Keyring, lacking ECDSA support." |
||||
for key in "$@"; do |
||||
if grep -q "BEGIN EC PRIVATE KEY" "$key"; then |
||||
echocolor 31 "Found ECDSA Identity: $key" |
||||
echocolor 31 "Identities contain ECDSA key(s). Forcing creation of a private OpenSSH agent." |
||||
return 1 |
||||
fi |
||||
done |
||||
fi |
||||
return 0 |
||||
} |
||||
|
||||
# === Public API === |
||||
# Check for running agent or start a new one |
||||
# Keys will be added if they don't exist. |
||||
# Setting start to false will basically do a dry run. |
||||
# You should use the aliases below. |
||||
ssh_agent() { |
||||
# (bool start, string... keys) |
||||
local START=$1 && shift |
||||
|
||||
local KEYS="`ssh-add -l 2>/dev/null`" |
||||
{ [ $? -eq 2 ] || ! gnome_keyring_ssh_agent_ckeck $SSH_AGENT_PID "$@" || $START && test -n "$LSA_FORCE_AGENT"; } && \ |
||||
{ $START && private_ssh_agent_start || return 2; } |
||||
|
||||
local RT=0 |
||||
for key in "$@"; do |
||||
echo "$KEYS" | grep -q "$key" \ |
||||
|| { $START && ssh-add "$key"; } \ |
||||
|| { RT=1; echocolor 34 "SSH Agent is missing a key: $key"; } |
||||
done |
||||
return $RT |
||||
} |
||||
|
||||
ssh_agent_dry() { |
||||
# (string... keys) |
||||
ssh_agent false "$@" |
||||
} |
||||
|
||||
ssh_agent_begin() { |
||||
# (string... keys) |
||||
ssh_agent true "$@" |
||||
} |
||||
|
||||
ssh_agent_end() { |
||||
# (void) |
||||
$PRIVATE_SSH_AGENT && private_ssh_agent_stop |
||||
} |
||||
|
Loading…
Reference in new issue