summaryrefslogtreecommitdiffstats
path: root/god
diff options
context:
space:
mode:
authoreuer <root@euer.krebsco.de>2012-12-20 03:19:28 +0100
committereuer <root@euer.krebsco.de>2012-12-20 03:19:28 +0100
commit38dbb8ee3867060fddd427d1bb4e57ee0300c8bb (patch)
treeabb7b2ab988934d6ddfbdd0448517b3a957645bf /god
parent7c1b02b086a8377ad76a46c277a224150c5b85d6 (diff)
parent09dc57b9d5f564d13f80707eefadd845a4aa9aec (diff)
Merge branch 'master' of github.com:krebscode/painload
Diffstat (limited to 'god')
-rw-r--r--god/claws/.gitignore1
-rw-r--r--god/claws/Makefile18
-rw-r--r--god/claws/README.md12
-rw-r--r--god/claws/communication.h25
-rw-r--r--god/claws/rcontrol.c479
-rw-r--r--god/streams/.gitignore1
-rw-r--r--god/streams/Makefile16
-rw-r--r--god/streams/README.md38
-rw-r--r--god/streams/bin/helper/streamfind10
-rw-r--r--god/streams/bin/helper/streamwrite6
-rwxr-xr-xgod/streams/bin/mpdstreams113
-rwxr-xr-xgod/streams/bin/relaxxapi.py140
-rwxr-xr-xgod/streams/bin/relaxxstreams107
-rwxr-xr-xgod/streams/bin/stream-starter19
-rwxr-xr-xgod/streams/bin/streams116
-rw-r--r--god/streams/db/direct.db78
-rw-r--r--god/streams/db/stream.db35
-rw-r--r--god/streams/doc/relaxxplayer.api13
-rw-r--r--god/twinter/init_stripped.py10
19 files changed, 1232 insertions, 5 deletions
diff --git a/god/claws/.gitignore b/god/claws/.gitignore
new file mode 100644
index 00000000..5da5924f
--- /dev/null
+++ b/god/claws/.gitignore
@@ -0,0 +1 @@
+rcontrol
diff --git a/god/claws/Makefile b/god/claws/Makefile
new file mode 100644
index 00000000..abfae5eb
--- /dev/null
+++ b/god/claws/Makefile
@@ -0,0 +1,18 @@
+# Makefile for the rcontrol program
+# We set a setuid bit as this tools needs root privilleges to open the FT232 device.
+
+BINARY=./rcontrol
+
+install: all
+ ln -snf $$PWD/$(BINARY) ../bin/
+
+all:$(BINARY)
+ chown root.root $(BINARY)
+ chmod +s $(BINARY)
+
+$(BINARY): rcontrol.c
+ #punani install libftdi1 libftdi-dev
+ gcc -Wall -lusb -lftdi rcontrol.c -o $(BINARY)
+
+clean:
+ rm -f $(BINARY)
diff --git a/god/claws/README.md b/god/claws/README.md
new file mode 100644
index 00000000..00c90a85
--- /dev/null
+++ b/god/claws/README.md
@@ -0,0 +1,12 @@
+# CLAWS
+
+Claws is a tool to manage some obscure Hardware Relay Board currently attached
+to the krebs infrastructure
+
+# Installation
+
+ make install
+
+# Usage
+
+ rcontrol --help
diff --git a/god/claws/communication.h b/god/claws/communication.h
new file mode 100644
index 00000000..db4b2c36
--- /dev/null
+++ b/god/claws/communication.h
@@ -0,0 +1,25 @@
+/* These are the command codes of the relay card. If you change something here you must
+ * recompile the firmware and the control tool. */
+#ifndef _COMMUNICATION_H
+#define _COMMUNICATION_H
+
+#define COMMAND_RELAY_ON 0x01
+#define COMMAND_RELAY_OFF 0x02
+#define COMMAND_RELAY_TOGGLE 0x04
+#define COMMAND_RELAY_SET 0x08
+#define COMMAND_RELAY_TIME_ON 0x10
+#define COMMAND_RELAY_TIME_OFF 0x20
+#define COMMAND_RELAY_TIME_CYCLIC 0x40
+#define COMMAND_GET_STATUS 0x80
+#define COMMAND_DEL_TIMERS 0x81
+#define COMMAND_SETUP_REMOTE 0x82
+
+
+#define RESPONSE_OK 0xff
+#define RESPONSE_INVALID_COMMAND 0xfe
+#define RESPONSE_INVALID_ARGUMENT 0xfd
+#define RESPONSE_TRANSMISSION_ERROR 0xfc
+
+#define COMMANDO_LENGTH 4
+
+#endif
diff --git a/god/claws/rcontrol.c b/god/claws/rcontrol.c
new file mode 100644
index 00000000..972c97d0
--- /dev/null
+++ b/god/claws/rcontrol.c
@@ -0,0 +1,479 @@
+/* +----------------------------------------------------------------------+
+ * | relay control program |
+ * | by mgr, 2007 |
+ * | last change: 2009-01-05 |
+ * | |
+ * | This program is used to control the relay card version 1.0. For more |
+ * | information have a look at the project homepage. |
+ * | You will need libftdi in order to compile this tool. |
+ * | |
+ * | NOTE: For some reason the -l option causes a program crash if I |
+ * | compile this program with -O2. On top of that this code seems to |
+ * | be quite optimal, the program size gets a little larger with -O2, |
+ * | so I suggest you just compile it without optimization. |
+ * +----------------------------------------------------------------------+
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <getopt.h>
+#include <ctype.h>
+#include <time.h>
+#include <ftdi.h> // libftdi
+
+/* Notice that if you experiment with the baud rate, you will have to adapt
+ * the firmware, too. Also I do not recommend it, as 9600 Bauds are completely
+ * sufficient for this application. */
+#define BAUD 9600
+
+/* If you are using more than one FT232-based pieces of hardware at once,
+ * we need a way to uniquely address any given one. This is done by the
+ * serial of the specific device which you can pass to this tool or specify
+ * here. If no serial is specified (NULL), the first found device is opened. */
+#define DEFAULT_FT_SERIAL "A6TMRSS6"
+
+#define VERSION "1.0"
+
+#define OPTION_ADDRESS 0x01
+#define OPTION_INTERVAL 0x04
+#define OPTION_CYCLIC 0x08
+#define OPTION_ON 0x10
+#define OPTION_OFF 0x20
+#define OPTION_TOGGLE 0x40
+#define OPTION_DEL_TIMERS 0x80
+#define OPTION_LIST_DEVICES 0x200
+
+#define EXIT_CODE_OK 0
+#define EXIT_CODE_FAILURE 1
+
+#include "communication.h"
+
+/* function prototypes */
+void usage(char* name);
+void version(void);
+const char* card_strerror(int error);
+int valid_argument(const char* str);
+void exit_gracefully(struct ftdi_context* ftdic, char exit_code);
+
+
+int main(int argc, char **argv)
+{
+ int ret=0, int_argument=0, option_flags=0, long_index=0, i=0, num_ops=0;
+ char c=0;
+ unsigned char buf[COMMANDO_LENGTH], char_argument=0, operation=0;
+ const char* ft_serial=DEFAULT_FT_SERIAL;
+ double double_argument;
+ char buf0[64], buf1[64], buf2[64];
+ time_t start_time;
+
+ //struct ftdi_eeprom eeprom;
+
+ struct ftdi_context ftdic;
+ struct ftdi_device_list *devlist=NULL, *curdev=NULL;
+
+ static struct option long_options[] =
+ {
+ {"help", 0, 0, '?'},
+ {"version", 0, 0, 'V'},
+ {"on", 1, 0, 'o'},
+ {"off", 1, 0, 'f'},
+ {"toggle", 1, 0, 't'},
+ {"set", 1, 0, 's'},
+ {"status", 0, 0, 'S'},
+ {"interval", 1, 0, 'v'},
+ {"cyclic", 0, 0, 'c'},
+ {"address", 1, 0, 'a'},
+ {"delete-timers", 0, 0, 'd'},
+ {"list-devices", 0, 0, 'l'},
+ {0, 0, 0, 0 }
+ };
+
+ /* fetch the command line options */
+ while ((c = getopt_long_only(argc, argv, "?Vo:f:t:s:Sv:ca:dl", long_options,
+ &long_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'o': case 'f': case 't':
+ int_argument = atoi(optarg);
+
+ if (int_argument > 6 || int_argument < 1 || !valid_argument(optarg))
+ {
+ fprintf(stderr, "%s: -s: invalid value `%s' (1-6 is valid)\n",
+ *argv, optarg);
+ return EXIT_CODE_FAILURE;
+ }
+
+ char_argument = (unsigned char)int_argument;
+
+ if (c == 't')
+ {
+ operation = COMMAND_RELAY_TOGGLE;
+ option_flags |= OPTION_TOGGLE;
+ } else if (c == 'o')
+ {
+ operation = COMMAND_RELAY_ON;
+ option_flags |= OPTION_ON;
+ } else
+ {
+ operation = COMMAND_RELAY_OFF;
+ option_flags |= OPTION_OFF;
+ }
+
+ num_ops++;
+
+ break;
+
+ case 's':
+ int_argument = atoi(optarg);
+
+ if (int_argument > (1 << 6)-1 || int_argument < 0 || !valid_argument(optarg))
+ {
+ fprintf(stderr, "%s: -s: invalid value `%s'\n", *argv, optarg);
+ return EXIT_CODE_FAILURE;
+ }
+
+ char_argument = (unsigned char)int_argument;
+ operation = COMMAND_RELAY_SET;
+ num_ops++;
+ break;
+
+ case 'S':
+ operation = COMMAND_GET_STATUS;
+ num_ops++;
+ break;
+
+ case 'v':
+ double_argument = atof(optarg);
+ int_argument = (int)(double_argument*60) /10;
+
+ if (int_argument < 1 || int_argument > (1 << 16)-1)
+ {
+ fprintf(stderr, "%s: -i: invalid interval `%s'\n", *argv, optarg);
+ return EXIT_CODE_FAILURE;
+ }
+
+ option_flags |= OPTION_INTERVAL;
+ break;
+
+ case 'c':
+ option_flags |= OPTION_CYCLIC;
+ break;
+
+ case 'd':
+ operation = COMMAND_DEL_TIMERS;
+ option_flags |= OPTION_DEL_TIMERS;
+ num_ops++;
+ break;
+
+ case 'a':
+ if (strlen(optarg) != 8)
+ {
+ fprintf(stderr, "%s: -s: invalid serial number `%s'\n", *argv, optarg);
+ return EXIT_CODE_FAILURE;
+ }
+
+ ft_serial = optarg;
+ option_flags |= OPTION_ADDRESS;
+ break;
+
+ case 'l':
+ option_flags |= OPTION_LIST_DEVICES;
+ break;
+
+ case 'V':
+ version();
+ break;
+ case '?': default:
+ usage(*argv);
+ break;
+ }
+ }
+
+ /* check whether the command line options are valid */
+ if ((option_flags & OPTION_INTERVAL))
+ {
+ if (option_flags & OPTION_DEL_TIMERS)
+ {
+ fprintf(stderr, "%s: -d cannot be mixed with timing options\n", *argv);
+ usage(*argv);
+ }
+
+ if (option_flags & OPTION_CYCLIC)
+ {
+ operation = COMMAND_RELAY_TIME_CYCLIC;
+ } else if (option_flags & OPTION_ON)
+ {
+ operation = COMMAND_RELAY_TIME_ON;
+ } else if (option_flags & OPTION_OFF)
+ {
+ operation = COMMAND_RELAY_TIME_OFF;
+ } else
+ {
+ fprintf(stderr, "%s: -v: you must also specify an operation (-o or -f)\n", *argv);
+ usage(*argv);
+ }
+ }
+
+ if (!operation && !(option_flags & OPTION_LIST_DEVICES))
+ {
+ usage(*argv);
+ }
+
+ if (((option_flags & OPTION_DEL_TIMERS) && (operation != COMMAND_DEL_TIMERS)))
+ {
+ fprintf(stderr, "%s: invalid mixture of options\n", *argv);
+ usage(*argv);
+ }
+
+ if (num_ops > 1)
+ {
+ fprintf(stderr, "%s: more than one operation specified\n", *argv);
+ usage(*argv);
+ }
+
+ if (ftdi_init(&ftdic) < 0)
+ {
+ fprintf(stderr, "%s: unable to initialize FTDI context: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ return EXIT_CODE_FAILURE;
+ }
+
+ /* list all found FT232 devices */
+ if (option_flags & OPTION_LIST_DEVICES)
+ {
+ printf("scanning for FT232 devices...\n"
+ "you can address the devices using `%s -a <serial>'\n", *argv);
+
+ if ((ret = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0)
+ {
+ fprintf(stderr, "%s: unable to scan devices: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit(EXIT_CODE_FAILURE);
+ }
+
+ if (ret == 0)
+ {
+ printf(" no devices found :(\n");
+ return EXIT_CODE_OK;
+ }
+
+ for (i=0, curdev = devlist; curdev != NULL; i++)
+ {
+ if (ftdi_usb_get_strings(&ftdic, curdev->dev, buf0, sizeof(buf0)/sizeof(char),
+ buf1, sizeof(buf1)/sizeof(char), buf2, sizeof(buf2)/sizeof(char)) < 0)
+ {
+ fprintf(stderr, "unable to fetch information for device #%i: %s\n", i,
+ ftdi_get_error_string(&ftdic));
+ // continue caused an endless loop in case of an error
+ break;
+ }
+
+ printf("\ndevice #%i%s:\n"
+ " manufacturer: %s\n"
+ " device: %s\n"
+ " serial: %s\n", i, (i == 0 ? " (default)" : ""),
+ (buf0 != NULL ? buf0 : "n/a"), (buf1 != NULL ? buf1 : "n/a"),
+ (buf2 != NULL ? buf2 : "n/a"));
+
+ curdev = curdev->next;
+ }
+
+ ftdi_list_free(&devlist);
+ return EXIT_CODE_OK;
+ }
+
+ /* Try to open the specified device. If that fails, we take a long shot
+ * and open the first found FT232 device and assume its the relay card.
+ * We don't do this if an address was specified with the -a option. */
+ if ((ret = ftdi_usb_open_desc(&ftdic, 0x0403, 0x6001, NULL, ft_serial)) < 0)
+ {
+ fprintf(stderr, "%s: unable to open ftdi device: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit(EXIT_CODE_FAILURE);
+ }
+
+ /* get rid of any data still floating around the buffer */
+ ftdi_usb_reset(&ftdic);
+ ftdi_usb_purge_buffers(&ftdic);
+
+
+ if ((ret = ftdi_set_baudrate(&ftdic, BAUD)) < 0)
+ {
+ fprintf(stderr, "%s: unable to set baudrate: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit_gracefully(&ftdic, EXIT_CODE_FAILURE);
+ }
+
+ if ((ret = ftdi_set_line_property(&ftdic, 8, 2, NONE)) < 0)
+ {
+ fprintf(stderr, "%s: unable to set line property: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit_gracefully(&ftdic, EXIT_CODE_FAILURE);
+ }
+
+ if ((ret = ftdi_setflowctrl(&ftdic, SIO_RTS_CTS_HS)) < 0) {
+ fprintf(stderr, "%s: unable to setup flow control: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit_gracefully(&ftdic, EXIT_CODE_FAILURE);
+ }
+
+ /*if ((ret = ftdi_set_latency_timer(&ftdic, 10)) < 0)
+ {
+ fprintf(stderr, "%s: unable to set latency timer: %d (%s)\n", *argv, ret,
+ ftdi_get_error_string(&ftdic));
+ exit_gracefully(&ftdic, EXIT_CODE_FAILURE);
+ }*/
+
+ buf[0] = operation;
+ buf[2] = 0; buf[3] = 0; buf[4] = 0;
+
+ switch (operation)
+ {
+ case COMMAND_RELAY_SET:
+ buf[1] = char_argument;
+ break;
+
+ case COMMAND_RELAY_ON: case COMMAND_RELAY_OFF:
+ case COMMAND_RELAY_TOGGLE:
+ buf[1] = (1 << (char_argument-1));
+ break;
+
+ case COMMAND_RELAY_TIME_ON:
+ case COMMAND_RELAY_TIME_OFF:
+ case COMMAND_RELAY_TIME_CYCLIC:
+ buf[1] = char_argument-1;
+ buf[2] = (int_argument & 0xff); // low byte
+ buf[3] = (int_argument >> 8); // high byte
+ break;
+
+ default:
+ break;
+ }
+
+ /* These values might not make much sense are vital to the correct
+ * funtion of this program, so better don't touch them. */
+ ftdi_write_data_set_chunksize(&ftdic, 1);
+ ftdi_read_data_set_chunksize(&ftdic, 4);
+
+ /* send the command */
+ if (ftdi_write_data(&ftdic, buf, COMMANDO_LENGTH) != COMMANDO_LENGTH)
+ {
+ fprintf(stderr, "%s: unable to send command: %s\n", *argv,
+ ftdi_get_error_string(&ftdic));
+ exit_gracefully(&ftdic, EXIT_CODE_FAILURE);
+ }
+
+ /* Read the card's response. */
+ start_time = time(NULL);
+ while ((ret = ftdi_read_data(&ftdic, buf, 1)) == 0) {
+ usleep(500);
+ if (time(NULL)-start_time >= 2) {
+ fprintf(stderr, "%s: unable to read card response, the operation might have "
+ "failed\n", *argv);
+ exit_gracefully(&ftdic, EXIT_FAILURE);
+ }
+ }
+
+ if (operation == COMMAND_GET_STATUS && buf[0] <= ((1 << 7)-1))
+ {
+ printf("relay status: %i (0b%s%s%s%s%s%s)\n", buf[0],
+ (buf[0] & (1 << 5)) ? "1" : "0",
+ (buf[0] & (1 << 4)) ? "1" : "0",
+ (buf[0] & (1 << 3)) ? "1" : "0",
+ (buf[0] & (1 << 2)) ? "1" : "0",
+ (buf[0] & (1 << 1)) ? "1" : "0",
+ (buf[0] & (1 << 0)) ? "1" : "0");
+ exit_gracefully(&ftdic, EXIT_CODE_OK);
+ }
+
+ if (buf[0] != RESPONSE_OK)
+ {
+ fprintf(stderr, "%s: relay card returned: %s\n", *argv, card_strerror(buf[0]));
+ exit_gracefully(&ftdic, EXIT_FAILURE);
+ }
+
+ /* we can exit now */
+ exit_gracefully(&ftdic, EXIT_CODE_OK);
+ return 0; // to make the compiler happy
+}
+
+void exit_gracefully(struct ftdi_context* ftdic, char exit_code)
+{
+ ftdi_usb_purge_buffers(ftdic);
+ ftdi_usb_close(ftdic);
+ ftdi_deinit(ftdic);
+
+ exit(exit_code);
+}
+
+int valid_argument(const char* str)
+{
+ int i;
+
+ for (i=0; i<strlen(str); i++)
+ {
+ if (!isdigit(str[i]) && (str[i] != '.'))
+ return 0;
+ }
+
+ return 1;
+}
+
+const char* card_strerror(int error)
+{
+ const char* message = "no error";
+
+ switch (error)
+ {
+ case RESPONSE_OK:
+ message = "all fine";
+ break;
+ case RESPONSE_INVALID_COMMAND:
+ message = "invalid command";
+ break;
+ case RESPONSE_INVALID_ARGUMENT:
+ message = "invalid command argument";
+ break;
+ case RESPONSE_TRANSMISSION_ERROR:
+ message = "transmission error";
+ break;
+ }
+
+ return message;
+}
+
+void usage(char *name)
+{
+ printf("\nrelay control program usage ==================================================\n"
+ " -?/--help .............. dump this screen\n"
+ " -V/--version ........... echo some program information\n"
+ " -o/--on <num>: ......... switch relay <num> on\n"
+ " -f/--off <num>: ........ switch relay <num> off \n"
+ " -t/--toggle <num>: ..... toggle relay <num> \n"
+ " -s/--set <mask>: ....... set the status of all relays to <mask>\n"
+ " -S/--status: ........... get the current relay status\n"
+ " -v/--interval <units> .. specify a timing interval (in minutes)\n"
+ " -c/--cyclic: ........... makes a timing operation (-v) cyclic\n"
+ " -a/--address <serial> .. addresses a specific card if multiple are installed\n"
+ " -d/--delete-timers ..... deletes all active timers\n"
+ " -l/--list-devices ...... lists all found FT232 devices\n\n");
+ exit(0);
+}
+
+void version(void)
+{
+ printf("\nThis is the relay control program version %s ($Revision: 26 $)\n"
+ "----------------------------------------------------------------\n"
+ " written by Michael Gross, 2007\n"
+ " binary compiled: %s %s\n\n"
+ "This program can be redistributed under the terms of the GNU GPL version 2\n"
+ "or later. For more information about this software and the hardware, visit\n"
+ "my homepage at http://www.coremelt.net. As usual with free software, there\n"
+ "is ABSOLUTELY NO WARRANTY. For details, refer to the GPL.\n\n", VERSION,
+ __DATE__, __TIME__);
+
+ exit(0);
+}
diff --git a/god/streams/.gitignore b/god/streams/.gitignore
new file mode 100644
index 00000000..0d20b648
--- /dev/null
+++ b/god/streams/.gitignore
@@ -0,0 +1 @@
+*.pyc
diff --git a/god/streams/Makefile b/god/streams/Makefile
new file mode 100644
index 00000000..2d0056f4
--- /dev/null
+++ b/god/streams/Makefile
@@ -0,0 +1,16 @@
+INITD = $(shell test -e /etc/rc.d/ && echo /etc/rc.d/ || echo /etc/init.d/)
+streams = $(shell cut -d\ -f2 stream.db)
+
+
+CURRDIR = ${PWD}
+.PHONY: all $(streams)
+local: ../../bin/streams
+
+../../bin/streams:
+ ln -sf $$PWD/bin/streams ../../bin/streams
+all: $(streams)
+ @update-rc.d groove defaults 2>/dev/null || echo "** put groove daemon in DAEMONS in /etc/rc.conf"
+
+$(streams): local
+ @test -L $(INITD)$@ || test ! -e $(INITD)$@ && \
+ ln -n -s -f $$PWD/stream-starter $(INITD)$@ && echo "writing $@ to $(INITD)"
diff --git a/god/streams/README.md b/god/streams/README.md
new file mode 100644
index 00000000..cc763ede
--- /dev/null
+++ b/god/streams/README.md
@@ -0,0 +1,38 @@
+# streams done right(tm)
+
+There are numerous ways to start streams ( make your computer or some server
+output streamed audio). Currently implemented are:
+
+# Streams Modules
+1. pure streams - will start mpd on your local machine
+2. mpdstreams - will use a given mpd server to start a stream
+3. relaxxstreams - will contact the relaxxplayer (mpd front-end) if the direct
+ connection to the mpd is prohibited by firewall rules
+# Database
+Currently there are a number of possible streams saved in the database files
+which contain of a link, a space, and the name of the stream. the database
+can be found in db/ .
+
+Currently there are two kinds of databases:
+1. streams.db - contains links to playlists of streams
+2. direct.db - contains links directly to the stream, not the playlist
+
+to generate direct.db from a list of playlists use the helper/* scripts
+
+# initscripts
+
+the most convenient way to start streams is to use stream-starter which is
+a script which, when symlinked with a name of a stream, invokes the streams
+tool with its own name as parameter.
+
+An example:
+
+ ln -s /krebs/god/streams/bin/stream-starter /etc/init.d/groove
+ /etc/init.d/groove start
+
+# Remarks
+deepmix,groovesalad and radiotux are now init.d scrips which can be
+started and stopped.
+
+scripts are dumped into /etc/init.d and groovesalad will be set as
+default via update-rc.d
diff --git a/god/streams/bin/helper/streamfind b/god/streams/bin/helper/streamfind
new file mode 100644
index 00000000..32b84a4e
--- /dev/null
+++ b/god/streams/bin/helper/streamfind
@@ -0,0 +1,10 @@
+#!/bin/sh
+cat stream.db | while read url name;do
+ curl $url --max-time 1 2>/dev/null| sed -n 's/[fF]ile[0-9]=\(.*\)/\1/p' > "streamfinder/$name"
+ if [ "x`cat \"streamfinder/$name\"`" == "x" ];then
+ rm "streamfinder/$name"
+ echo "$name empty or not a stream"
+ else
+ echo "wrote $name"
+ fi
+done
diff --git a/god/streams/bin/helper/streamwrite b/god/streams/bin/helper/streamwrite
new file mode 100644
index 00000000..a10fb155
--- /dev/null
+++ b/god/streams/bin/helper/streamwrite
@@ -0,0 +1,6 @@
+for i in `ls -1 streamfinder/`;
+do
+ for j in `cat "$i"`;do
+ echo "$j $i" >> direct.db
+ done
+done
diff --git a/god/streams/bin/mpdstreams b/god/streams/bin/mpdstreams
new file mode 100755
index 00000000..a2a5f77c
--- /dev/null
+++ b/god/streams/bin/mpdstreams
@@ -0,0 +1,113 @@
+#!/usr/bin/python2
+
+# this version cannot tell if a stream is running or just ordinary music
+import os
+import sys
+from subprocess import Popen, PIPE
+
+os.chdir(os.path.dirname(os.path.realpath(sys.argv[0])))
+pidfile = "/tmp/krebs.stream.pid"
+host="lounge.mpd.shack"
+url_file = os.environ.get("STREAM_DB", "../db/stream.db")
+urls = []
+for line in open(url_file):
+ urls.append(line.split())
+#print urls
+mybin = sys.argv[0]
+cmd = sys.argv[1] if len(sys.argv) > 1 else "you-are-made-of-stupid"
+stream = sys.argv[2] if len(sys.argv) == 3 else "groove"
+pipe_silent = open("/dev/null","w")
+
+def urlForStream(stream):
+ for url, s in urls:
+ if s == stream:
+ return url
+
+def streamForUrl(url):
+ for u, s in urls:
+ if u == url:
+ return stream
+
+def startStream(stream_url):
+ Popen(["mpc","--host",host,"crossfade","5"],
+ stdout=pipe_silent,stderr=pipe_silent)
+ Popen(["mpc","--host",host,"repeat","yes"],
+ stdout=pipe_silent,stderr=pipe_silent)
+ Popen(["mpc","--host",host,"clear"],
+ stdout=pipe_silent,stderr=pipe_silent)
+ Popen(["mpc","--host",host,"add",stream_url],
+ stdout=pipe_silent,stderr=pipe_silent).wait()
+ Popen(["mpc","--host",host,"play"],
+ stdout=pipe_silent,stderr=pipe_silent)
+
+def start(stream):
+ ret = running()
+ if ret:
+ print "!! Stream `%s` already running !" % \
+ (ret)
+ else:
+ startStream(urlForStream(stream))
+ print "** Starting `%s`."% stream
+
+
+def stop():
+ ret = running()
+ if not ret:
+ print "!! No Stream running!"
+ else:
+ print "** Stopping `%s`" % ret
+ Popen(["mpc","--host",host,"stop"],
+ stdout=pipe_silent,stderr=pipe_silent)
+
+
+def running():
+ try:
+ (out,err) = Popen(["mpc","--host",host,"current"],stdout=PIPE,stderr=PIPE).communicate()
+ out = out.rstrip()
+ return out
+ except Exception as e:
+ return ""
+
+
+def slist():
+ for url, name in urls:
+ print "%s : %s" % (name, url)
+
+
+def shorthelp():
+ print "start|stop|restart|status|list [audio stream]"
+
+
+def longhelp():
+ print "Usage: %s" % mybin,
+ shorthelp
+ print """ get all available streams with '/%(fil)s list'
+ Examples:
+ %(fil)s list
+ %(fil)s start groove
+ %(fil)s switch deepmix
+ %(fil)s status
+ %(fil)s stop""" % {'fil': mybin}
+
+if cmd == "start":
+ start(stream)
+elif cmd == "stop":
+ stop()
+elif cmd == "switch" or cmd == "restart":
+ stop()
+ start(stream)
+elif cmd == "status":
+ ret = running()
+ if not ret:
+ print "** nothing running" # , e
+ else:
+ print "Now Playing: %s" % ret
+elif cmd == "list":
+ slist()
+elif cmd == "--help":
+ longhelp()
+elif cmd == "-h":
+ shorthelp()
+else:
+ print "unknown command `%s`" % cmd
+ print "try `%s` --help" % os.path.basename(mybin)
diff --git a/god/streams/bin/relaxxapi.py b/god/streams/bin/relaxxapi.py
new file mode 100755
index 00000000..f367caef
--- /dev/null
+++ b/god/streams/bin/relaxxapi.py
@@ -0,0 +1,140 @@
+#!/usr/bin/python2
+import json
+from urllib import quote
+class relaxx:
+
+ def __init__(self,relaxxurl="http://lounge.mpd.shack/"):
+ self.baseurl=relaxxurl
+ import requests
+ ret = requests.get(relaxxurl) # grab cookie
+ try:
+ self.r = requests.session(cookies=ret.cookies,headers={"Referer":relaxxurl})
+ except:
+ print ("you are missing the `requests` dependency, please do a `pip install requests`")
+ def _status(self,value=0,data="json=null"):
+ """
+ value is some weird current playlist value, 0 seems to work
+ data is url encoded kv-store
+ """
+ # TODO get the current playlist value
+ url=self.baseurl+"include/controller-ping.php?value=%s"%value
+ return self.r.post(url,data="json=null").text
+
+ def _playlist(self,action,value="",json="null",method="get"):
+ """
+ This function is the interface to the controller-playlist api
+ use it if you dare
+ Possible actions:
+ clear
+ addSong url_encoded_path
+ moveSong 1:2
+ getPlaylists
+ getPlaylistInfo 1
+ listPlaylistInfo
+ as everything seems to be a get request, the method is set to GET as
+ default
+ """
+ url=self.baseurl+"include/controller-playlist.php?action=%s&value=%s&json=%s"%(action,value,json)
+ if method== "get":
+ return self.r.get(url).text
+ elif method == "post":
+ return r.post(url).text
+ else:
+ raise Exception("unknown method %s")
+
+ def _playback(self,action,value="",json="null",method="get"):
+ """
+ play
+ continue
+ stop
+ setCrossfade
+ """
+ url=self.baseurl+"include/controller-playback.php?action=%s&value=%s&json=%s"%(action,value,json)
+ # probably obsolete because everything is "get"
+ if method== "get":
+ return self.r.get(url).text
+ elif method == "post":
+ return r.post(url).text
+ else:
+ raise Exception("unknown method %s")
+
+ def _radio(self,playlist=""):
+ """
+ both, post and get the url seem to work here...
+ """
+ url=self.baseurl+"include/controller-netradio.php?playlist=%s"%quote(playlist)
+ return self.r.get(url).text
+
+ def add_radio(self,playlist=""):
+ print playlist
+ print self._radio(playlist)
+ print json.loads(self._radio(playlist)) #[1:-1])["url"]
+ resolved_url= json.loads(self._radio(playlist)[1:-1])["url"]
+ self.add_song(resolved_url)
+
+ def add_song(self,path):
+ return self._playlist("addSong",path)
+
+ def get_first(self):
+ return json.loads(self._playlist("getPlaylistInfo","0",""))[0]
+
+ def get_first(self):
+ return json.loads(self._playlist("getPlaylistInfo","0",""))[-1]
+
+ def clear(self):
+ return self._playlist("clear")
+
+ def crossfade(self,ident="0"):
+ """
+ default: no crossfade
+ """
+ return self._playback("setCrossfade",ident)
+
+ def repeat(self,ident="1"):
+ """
+ default: do repeat
+ """
+ return self._playback("repeat",ident)
+
+ def play(self,ident):
+ return self._playback("play",ident)
+
+ def stop(self):
+ return self._playback("stop")
+
+ def cont(self,ident):
+ return self._playback("continue",ident)
+
+ def play_first(self):
+ return self.play(self.get_first()["Id"])
+
+ def play_last(self):
+ return self.play(self.get_last()["Id"])
+
+ def state(self):
+ return json.loads(self._status())
+
+ def is_running(self):
+ return self.state()["status"]["state"] == "play"
+
+ def playing(self):
+ """ returns "" if not running
+ """
+ state = self.state()
+ if state["status"]["state"] == "play" :
+ ident = state["status"]["song"]
+ current = state["playlist"]["file"][int(ident)]
+ return current.get("Name",current.get("Artist")) + " - " + current["Title"]
+ else:
+ return ""
+
+if __name__ == "__main__":
+ r = relaxx()
+ print r.state()
+ print r.playing()
+ print r.add_radio("http://deluxetelevision.com/livestreams/radio/DELUXE_RADIO.pls")
+ #print r.clear()
+ #print r.add_radio("http://somafm.com/lush.pls")
+ #print r.get_first()["Id"]
+ #print r.play_first()
+ #print r.add_radio("http://somafm.com/lush.pls")
diff --git a/god/streams/bin/relaxxstreams b/god/streams/bin/relaxxstreams
new file mode 100755
index 00000000..0d3813a7
--- /dev/null
+++ b/god/streams/bin/relaxxstreams
@@ -0,0 +1,107 @@
+#!/usr/bin/python2
+
+# this version cannot tell if a stream is running or just ordinary music
+import os
+import sys
+import json
+from urllib import quote
+from relaxxapi import relaxx
+
+try:
+ import requests
+except:
+ print ("you are missing the `requests` dependency, please do a `pip install requests`")
+from subprocess import Popen, PIPE
+
+os.chdir(os.path.dirname(os.path.realpath(sys.argv[0])))
+pidfile = "/tmp/krebs.stream.pid"
+baseurl="http://lounge.mpd.shack/"
+url=baseurl+"include/controller-playlist.php?action=%s&value=%s&json=%s"
+url_