Compare commits
3 commits
058f230ef0
...
010ecad8ce
Author | SHA1 | Date | |
---|---|---|---|
dece | 010ecad8ce | ||
dece | 46780a5b06 | ||
dece | d981729145 |
198
enhance-ls-colors.sh
Executable file
198
enhance-ls-colors.sh
Executable file
|
@ -0,0 +1,198 @@
|
|||
#!/bin/bash -e
|
||||
# Provide a more complete configuration for LS_COLORS, which can be useful in
|
||||
# some specific directories, but is a bit cumbersome to enable by default
|
||||
# because of the gigantic and ugly env variable it sets.
|
||||
# This script has to be sourced and not merely executed to have any effect!
|
||||
CONFIG_PATH="$(mktemp)"
|
||||
cat << EOF > "$CONFIG_PATH"
|
||||
# Configuration file for dircolors, a utility to help you set the
|
||||
# LS_COLORS environment variable used by GNU ls with the --color option.
|
||||
# Copyright (C) 1996-2016 Free Software Foundation, Inc.
|
||||
# Copying and distribution of this file, with or without modification,
|
||||
# are permitted provided the copyright notice and this notice are preserved.
|
||||
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
|
||||
# slackware version of dircolors) are recognized but ignored.
|
||||
# Below are TERM entries, which can be a glob patterns, to match
|
||||
# against the TERM environment variable to determine if it is colorizable.
|
||||
TERM Eterm
|
||||
TERM ansi
|
||||
TERM *color*
|
||||
TERM con[0-9]*x[0-9]*
|
||||
TERM cons25
|
||||
TERM console
|
||||
TERM cygwin
|
||||
TERM dtterm
|
||||
TERM gnome
|
||||
TERM hurd
|
||||
TERM jfbterm
|
||||
TERM konsole
|
||||
TERM kterm
|
||||
TERM linux
|
||||
TERM linux-c
|
||||
TERM mlterm
|
||||
TERM putty
|
||||
TERM rxvt*
|
||||
TERM screen*
|
||||
TERM st
|
||||
TERM terminator
|
||||
TERM tmux*
|
||||
TERM vt100
|
||||
TERM xterm*
|
||||
# Below are the color init strings for the basic file types. A color init
|
||||
# string consists of one or more of the following numeric codes:
|
||||
# Attribute codes:
|
||||
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
|
||||
# Text color codes:
|
||||
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
|
||||
# Background color codes:
|
||||
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
|
||||
#NORMAL 00 # no color code at all
|
||||
#FILE 00 # regular file: use no color at all
|
||||
RESET 0 # reset to "normal" color
|
||||
DIR 01;34 # directory
|
||||
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
|
||||
# numerical value, the color is as for the file pointed to.)
|
||||
MULTIHARDLINK 00 # regular file with more than one link
|
||||
FIFO 40;33 # pipe
|
||||
SOCK 01;35 # socket
|
||||
DOOR 01;35 # door
|
||||
BLK 40;33;01 # block device driver
|
||||
CHR 40;33;01 # character device driver
|
||||
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
||||
MISSING 00 # ... and the files they point to
|
||||
SETUID 37;41 # file that is setuid (u+s)
|
||||
SETGID 30;43 # file that is setgid (g+s)
|
||||
CAPABILITY 30;41 # file with capability
|
||||
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w)
|
||||
OTHER_WRITABLE 30;42 # dir that is other-writable (o+w) and not sticky
|
||||
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
|
||||
# This is for files with execute permission:
|
||||
EXEC 01;32
|
||||
# List any file extensions like '.gz' or '.tar' that you would like ls
|
||||
# to colorize below. Put the extension, a space, and the color init string.
|
||||
# (and any comments you want to add after a '#')
|
||||
# If you use DOS-style suffixes, you may want to uncomment the following:
|
||||
#.cmd 01;32 # executables (bright green)
|
||||
#.exe 01;32
|
||||
#.com 01;32
|
||||
#.btm 01;32
|
||||
#.bat 01;32
|
||||
# Or if you want to colorize scripts even if they do not have the
|
||||
# executable bit actually set.
|
||||
#.sh 01;32
|
||||
#.csh 01;32
|
||||
# archives or compressed (bright red)
|
||||
.tar 01;31
|
||||
.tgz 01;31
|
||||
.arc 01;31
|
||||
.arj 01;31
|
||||
.taz 01;31
|
||||
.lha 01;31
|
||||
.lz4 01;31
|
||||
.lzh 01;31
|
||||
.lzma 01;31
|
||||
.tlz 01;31
|
||||
.txz 01;31
|
||||
.tzo 01;31
|
||||
.t7z 01;31
|
||||
.zip 01;31
|
||||
.z 01;31
|
||||
.Z 01;31
|
||||
.dz 01;31
|
||||
.gz 01;31
|
||||
.lrz 01;31
|
||||
.lz 01;31
|
||||
.lzo 01;31
|
||||
.xz 01;31
|
||||
.zst 01;31
|
||||
.tzst 01;31
|
||||
.bz2 01;31
|
||||
.bz 01;31
|
||||
.tbz 01;31
|
||||
.tbz2 01;31
|
||||
.tz 01;31
|
||||
.deb 01;31
|
||||
.rpm 01;31
|
||||
.jar 01;31
|
||||
.war 01;31
|
||||
.ear 01;31
|
||||
.sar 01;31
|
||||
.rar 01;31
|
||||
.alz 01;31
|
||||
.ace 01;31
|
||||
.zoo 01;31
|
||||
.cpio 01;31
|
||||
.7z 01;31
|
||||
.rz 01;31
|
||||
.cab 01;31
|
||||
# image formats
|
||||
.jpg 01;35
|
||||
.jpeg 01;35
|
||||
.mjpg 01;35
|
||||
.mjpeg 01;35
|
||||
.gif 01;35
|
||||
.bmp 01;35
|
||||
.pbm 01;35
|
||||
.pgm 01;35
|
||||
.ppm 01;35
|
||||
.tga 01;35
|
||||
.xbm 01;35
|
||||
.xpm 01;35
|
||||
.tif 01;35
|
||||
.tiff 01;35
|
||||
.png 01;35
|
||||
.svg 01;35
|
||||
.svgz 01;35
|
||||
.mng 01;35
|
||||
.pcx 01;35
|
||||
.mov 01;35
|
||||
.mpg 01;35
|
||||
.mpeg 01;35
|
||||
.m2v 01;35
|
||||
.mkv 01;35
|
||||
.webm 01;35
|
||||
.ogm 01;35
|
||||
.mp4 01;35
|
||||
.m4v 01;35
|
||||
.mp4v 01;35
|
||||
.vob 01;35
|
||||
.qt 01;35
|
||||
.nuv 01;35
|
||||
.wmv 01;35
|
||||
.asf 01;35
|
||||
.rm 01;35
|
||||
.rmvb 01;35
|
||||
.flc 01;35
|
||||
.avi 01;35
|
||||
.fli 01;35
|
||||
.flv 01;35
|
||||
.gl 01;35
|
||||
.dl 01;35
|
||||
.xcf 01;35
|
||||
.xwd 01;35
|
||||
.yuv 01;35
|
||||
.cgm 01;35
|
||||
.emf 01;35
|
||||
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
|
||||
.ogv 01;35
|
||||
.ogx 01;35
|
||||
# audio formats
|
||||
.aac 00;36
|
||||
.au 00;36
|
||||
.flac 00;36
|
||||
.m4a 00;36
|
||||
.mid 00;36
|
||||
.midi 00;36
|
||||
.mka 00;36
|
||||
.mp3 00;36
|
||||
.mpc 00;36
|
||||
.ogg 00;36
|
||||
.ra 00;36
|
||||
.wav 00;36
|
||||
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions
|
||||
.oga 00;36
|
||||
.opus 00;36
|
||||
.spx 00;36
|
||||
.xspf 00;36
|
||||
EOF
|
||||
eval "$(dircolors "$CONFIG_PATH")"
|
116
nectarine-playing.py
Executable file
116
nectarine-playing.py
Executable file
|
@ -0,0 +1,116 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Python bindings to the Nectarine Queue interface
|
||||
|
||||
If used as a script, print on stdout the current track song and artist(s).
|
||||
|
||||
It's mainly useful if you work with terminals around and don't want to keep the
|
||||
Nectarine tab under your eyes all the time (even if it's raina's design).
|
||||
Respect their servers, and long live Nectarine!
|
||||
|
||||
Requirements: the requests package.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import xml.etree.ElementTree as ElementTree
|
||||
from dataclasses import dataclass
|
||||
|
||||
import requests
|
||||
|
||||
QUEUE_URL = "https://scenestream.net/demovibes/xml/queue/"
|
||||
|
||||
|
||||
@dataclass
|
||||
class Artist:
|
||||
ident: int
|
||||
flag: str
|
||||
name: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class Song:
|
||||
ident: int
|
||||
length: str
|
||||
title: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class Requester:
|
||||
flag: str
|
||||
name: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class Entry:
|
||||
request_time: str
|
||||
artists: list[Artist]
|
||||
song: Song
|
||||
requester: Requester
|
||||
playstart: str
|
||||
|
||||
|
||||
def get_queue_xml(url=QUEUE_URL):
|
||||
"""Return the XML tree from the API, or None on error."""
|
||||
response = requests.get(url)
|
||||
if response.status_code != 200:
|
||||
sys.stderr.write(f"Failed to open URL: {QUEUE_URL}")
|
||||
return None
|
||||
return ElementTree.XML(response.text)
|
||||
|
||||
|
||||
def get_now_playing(queue_xml):
|
||||
"""Return the Entry of the currently playing song."""
|
||||
entry_node = queue_xml.find("now").find("entry")
|
||||
return parse_entry(entry_node)
|
||||
|
||||
|
||||
def parse_entry(entry_node) -> Entry:
|
||||
artists = entry_node.findall("artist")
|
||||
song = entry_node.find("song")
|
||||
req = entry_node.find("requester")
|
||||
playstart = entry_node.find("playstart")
|
||||
return Entry(
|
||||
request_time=entry_node.get("request_time"),
|
||||
artists=[
|
||||
Artist(
|
||||
ident=artist.get("id"),
|
||||
flag=artist.get("flag"),
|
||||
name=artist.text,
|
||||
)
|
||||
for artist in artists
|
||||
],
|
||||
song=Song(
|
||||
ident=song.get("id"),
|
||||
length=song.get("length"),
|
||||
title=song.text,
|
||||
),
|
||||
requester=Requester(
|
||||
flag=req.get("flag"),
|
||||
name=req.text,
|
||||
),
|
||||
playstart=playstart.text,
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
queue_xml = get_queue_xml()
|
||||
if queue_xml is None:
|
||||
return
|
||||
now_playing = get_now_playing(queue_xml)
|
||||
|
||||
print(
|
||||
"{artists} — {song} [{length}] — requested by {req}".format(
|
||||
artists=(
|
||||
" & ".join(
|
||||
f"{a.name} ({a.flag})"
|
||||
for a in now_playing.artists
|
||||
)
|
||||
),
|
||||
song=now_playing.song.title,
|
||||
length=now_playing.song.length,
|
||||
req=now_playing.requester.name,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -34,7 +34,9 @@ cat << EOF > "$HTML_FILE"
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre>
|
||||
$(cat "$1")
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
|
Loading…
Reference in a new issue