parent
67de196e8a
commit
5790ea24ca
7 changed files with 80 additions and 398 deletions
@ -1,119 +0,0 @@ |
|||||||
#!/usr/bin/env 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)) |
|
||||||
|
|
@ -1,74 +0,0 @@ |
|||||||
#!/usr/bin/env python3 |
|
||||||
# (c) 2015 Taeyeon Mori |
|
||||||
# A simple script to make ln -s less painful |
|
||||||
# |
|
||||||
# Because of how symbolic links work (they're just a pathname that the OS reads and follows), |
|
||||||
# the link target path must always be relative to the symlink's containing directory, OR |
|
||||||
# an absolute path altogether. Unfortunately, ln -s does not automatically solve this issue |
|
||||||
# which makes it painful to create a relative symlink somewhere outside the current working |
|
||||||
# directory (It screws up shell completion for instance) |
|
||||||
# This script performs the path transformation before creating the link and can therefore be |
|
||||||
# used without worries of creating broken symlinks because one forgot to apply the correct |
|
||||||
# relative adjustment to the target path |
|
||||||
# |
|
||||||
# ex: |
|
||||||
# $ lns -v some-file dir/some-link |
|
||||||
# ln -s '../some-file' 'dir/some-link' |
|
||||||
# $ lns -v file ../derp/link # inside a directory called 'herp' |
|
||||||
# ln -s '../herp/file' '../derp/link' |
|
||||||
|
|
||||||
|
|
||||||
import os |
|
||||||
import argparse |
|
||||||
|
|
||||||
|
|
||||||
def transport_relpath(path, old_anchor, new_anchor): |
|
||||||
""" |
|
||||||
:brief: Transport a relative path from one anchor to another |
|
||||||
Anchors must both be absolute paths, path must be relative (to old_anchor) |
|
||||||
""" |
|
||||||
return os.path.relpath(os.path.normpath(os.path.join(old_anchor, path)), new_anchor) |
|
||||||
|
|
||||||
|
|
||||||
def verbose_symlink(target, dest): |
|
||||||
print("ln -s '%s' '%s'" % (target, dest)) |
|
||||||
return os.symlink(target, dest) |
|
||||||
|
|
||||||
|
|
||||||
def main(argv): |
|
||||||
# Command line interface to make_symlink() |
|
||||||
parser = argparse.ArgumentParser(prog=argv[0], |
|
||||||
description="A 'ln -s' command that automatically translates relative target paths to be relative to the resulting symlink's containing directory when necessary.") |
|
||||||
parser.add_argument("target", help="The file(s) to create symlink(s) to", nargs="+") |
|
||||||
parser.add_argument("destination", help="The path of the symbolic link(s) to create") |
|
||||||
parser.add_argument("-v", "--verbose", help="Print every operation", |
|
||||||
dest="symlink", const=verbose_symlink, action="store_const", default=os.symlink) |
|
||||||
|
|
||||||
args = parser.parse_args(argv[1:]) |
|
||||||
|
|
||||||
# Multiple |
|
||||||
if len(args.target) > 1: |
|
||||||
if not os.path.isdir(args.destination): |
|
||||||
print("Destination must be an existing directory when multiple targets are passed!") |
|
||||||
for target in args.target: |
|
||||||
dest = os.path.join(args.destination, os.path.basename(target)) |
|
||||||
args.symlink(target if os.path.isabs(target) else transport_relpath(target, os.curdir, args.destination), dest) |
|
||||||
|
|
||||||
# One |
|
||||||
else: |
|
||||||
target = args.target[0] |
|
||||||
|
|
||||||
dest = ldir = args.destination |
|
||||||
if os.path.isdir(dest): |
|
||||||
dest = os.path.join(dest, os.path.basename(target)) |
|
||||||
else: |
|
||||||
ldir = os.path.dirname(dest) |
|
||||||
|
|
||||||
args.symlink(target if os.path.isabs(target) else transport_relpath(target, os.curdir, ldir), dest) |
|
||||||
|
|
||||||
return 0 |
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__": |
|
||||||
import sys |
|
||||||
sys.exit(main(sys.argv)) |
|
@ -1,136 +0,0 @@ |
|||||||
#!/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() |
|
||||||
|
|
@ -1,37 +0,0 @@ |
|||||||
#!/bin/sh |
|
||||||
# connect to the mpd httpd and open ncmpcpp |
|
||||||
# Requirements: vlc, mpc, ncmpcpp |
|
||||||
# Use MPD_HOST, MPD_PORT, MPD_HTTP_SINK, MPD_HTTP_PORT environment variables instead of arguments |
|
||||||
|
|
||||||
: ${MPD_HOST:=127.0.0.1} ${MPD_PORT:=6600} |
|
||||||
: ${MPD_HTTP_SINK:=1} ${MPD_HTTP_PORT:=8080} |
|
||||||
|
|
||||||
export MPD_HOST |
|
||||||
export MPD_PORT |
|
||||||
|
|
||||||
# Find programs |
|
||||||
mpc=`which mpc 2>/dev/null` |
|
||||||
vlc=`which vlc 2>/dev/null` |
|
||||||
client=`which ncmpcpp 2>/dev/null || which ncmpc 2>/dev/null` |
|
||||||
|
|
||||||
if [ -z "$mpc" ]; then |
|
||||||
echo "ERROR: mpc (MusicPlayerClient) not found on the system" |
|
||||||
elif [ -z "$vlc" ]; then |
|
||||||
echo "ERROR: VLC is required for local stream playback" |
|
||||||
elif [ -z "$client" ]; then |
|
||||||
echo "ERROR: No MPD client installed (ncmpcpp or ncmpc)" |
|
||||||
else |
|
||||||
# Enable Stream |
|
||||||
mpc enable $MPC_HTTP_SINK |
|
||||||
|
|
||||||
# Play Stream (have vlc on fd:3) |
|
||||||
vlc --repeat http://$MPD_HOST:$MPD_HTTP_PORT/mpd.ogg -I dummy 2>/dev/null & |
|
||||||
vlc_pid=$! |
|
||||||
|
|
||||||
# Launch client in pty |
|
||||||
"$client" -h $MPD_HOST -p $MPD_PORT |
|
||||||
|
|
||||||
# Stop stream playback |
|
||||||
kill $vlc_pid |
|
||||||
fi |
|
||||||
|
|
Loading…
Reference in new issue