Zunächst mal vielen Dank an Roland0. Habe mir Deine Implementierung
angeschaut, habe mich dann doch entschieden, was eigenes in Java zu
machen.
Damit auch andere was davon haben, hier eine Kopie davon.
Das Ganze macht dann aber noch etwas mehr. Schaltet
Lautsprecher/Verstärker ein/aus, je nachdem, ob von Squeezebox benötigt.
Müsst Ihr halt ausbauen, wenn nicht benötigt (einfach Einträge aus
config properties raus) oder anpassen, je nachdem was für eine Steuerung
Ihr dafür habt.
Die Schlüssel zur Erkennung, ob Werbung läuft, müsst Ihr dann auch noch
an Eure Sender anpassen. Sie sind im String[] ads in
SqueezeboxCLIListener definiert. Ich einen Sender der tatsächlich
"silence" einblendet, wenn Werbung kommt.
Viel Erfolg
Squeezy
==============
config.properties
Code:
--------------------
SB_WOHNEN =00:04:20:07:d3:a8
SB_GALERIE =00:04:20:07:d3:0f
SB_PI =74:da:38:54:29:a6
SB_BAD =00:04:20:06:4d:cb
SB_SERVER =zeus.whitehouse.lan
SB_CLI_PORT =9090
SB_WOHNEN_SPEAKER
=http://zeus.whitehouse.lan:8080/WhitehouseControl/pages/control1BitDpt1.jsp?adr=1/2/3&value=%1&return=controlRooms.jsp
SB_GALERIE_SPEAKER
=http://zeus.whitehouse.lan:8080/WhitehouseControl/pages/control1BitDpt1.jsp?adr=1/2/8&value=%1&return=controlRooms.jsp
SB_PI_SPEAKER
=http://zeus.whitehouse.lan:8080/WhitehouseControl/pages/control1BitDpt1.jsp?adr=1/2/8&value=%1&return=controlRooms.jsp
--------------------
Player.java
Code:
--------------------
import java.util.Properties;
public class Player {
String name = "- unset -";
String mac;
SqueezeboxCLIListener cli;
String speakerOnURL;
String speakerOffURL;
private boolean adPlaying = false;
public Player(String _name, Properties config, SqueezeboxCLIListener
_cli) {
name=_name;
mac=config.getProperty(name);
cli=_cli;
String speakerControl = config.getProperty(name+"_SPEAKER");
if (speakerControl != null) {
speakerOnURL = speakerControl.replace("%1", "On");
speakerOffURL = speakerControl.replace("%1", "Off");
}
cli.players.put(mac.hashCode(), this);
}
public void setAdPlaying(boolean _adPlaying) {
if(adPlaying != _adPlaying) { //something changed
adPlaying = _adPlaying;
if (adPlaying) {
cli.logger.info("Ad has started now");
cli.setMuting(this,1);
}
else {
cli.logger.info("Ad has ended now");
cli.setMuting(this,0);
}
}
}
public void powerOn() {
if(speakerOnURL != null)
cli.doHttpCommand(speakerOnURL);
}
public void powerOff() {
if(speakerOffURL != null)
cli.doHttpCommand(speakerOffURL);
}
public String toString() {
return name;
}
public boolean isAdplaying() {
return adPlaying;
}
}
--------------------
SqueezeboxCLIListener.java
Code:
--------------------
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.URL;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Properties;
import org.apache.commons.net.telnet.TelnetClient;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class SqueezeboxCLIListener {
private static final String[] speaker_on = {
"power 1",
"button play",
"playlist play",
"play "
};
private static final String[] speaker_off = {
"power 0"
};
private static final String[] ads = {
"playlist newsong Live365%20-%20Advertisement",
"playlist newsong 90s%20Alt%20_Get%2090s",
"playlist newsong Silence"
};
private static final String[] end_ads = {
"playlist newsong",
};
protected static Hashtable<Integer, Player> players = new
Hashtable<Integer, Player>();
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
/**
* The default logger for messages and errors
*/
protected Logger logger;
StringBuffer sb = new StringBuffer();
public SqueezeboxCLIListener() throws IOException {
logger = Logger.getLogger(getClass());
Properties log4JProperties = new Properties();
try {
log4JProperties.load(
ClassLoader.getSystemResourceAsStream("log4j.properties"));
PropertyConfigurator.configure(log4JProperties);
} catch (IOException e) {
System.err.println("log4j.properties not found or not
configured correctly. Read the log4j manual if you need help.");
throw e;
}
logger.info("Version 2017-10-08 started");
Properties config = new Properties();
try {
config.load(
ClassLoader.getSystemResourceAsStream("config.properties"));
} catch (IOException e) {
System.err.println("config.properties not found or not
configured correctly.");
throw e;
}
new Player("SB_WOHNEN",config,this);
new Player("SB_GALERIE",config,this);
new Player("SB_PI",config,this);
new Player("SB_BAD",config,this);
while(true) { //loop forever
try {
// Connect to the specified server
telnet.connect(config.getProperty("SB_SERVER"),
new Integer(config.getProperty("SB_CLI_PORT")));
// Get input and output stream references
in = telnet.getInputStream();
out = new PrintStream(telnet.getOutputStream());
sb.append("Read -> ");
write("listen 1");
read();
}
catch (Exception e) {
try {
Thread.sleep(30000); //wait 30 secs
before reconnect
} catch (InterruptedException e1) {
}
}
}
}
public String read() throws IOException {
char ch = (char) in.read();
while (true) {
if (ch=='\n') {
interpretCommand();
} else
{
if (ch!='\r')
sb.append(ch);
if ((int)ch > 65000) {
logger.fatal("Squeezeboxserver is dead,
try to reconnect.");
throw new IOException();
}
}
ch = (char) in.read();
}
}
/**
* @param sb
*/
protected void interpretCommand() {
String line = sb.toString().replaceAll("%3A", ":");
if (line.contains("listen"))
logger.info(line);
else
logger.debug(line);
String _player = line.split(" ")[2];
Player player = players.get(_player.hashCode());
testLineForSpeakerOn(player, line);
testLineForSpeakerOff(player, line);
testLineForAds(player, line);
testLineForEndAds(player, line);
sb.setLength(0);
sb.append("Read -> ");
}
private void testLineForSpeakerOn(Player player, String line) {
if (testLineFor(speaker_on, line)) {
logger.info("Speaker on for player: " + player);
player.powerOn();
}
}
private void testLineForSpeakerOff(Player player, String line) {
if (testLineFor(speaker_off, line)) {
logger.info("Speaker off for player: " + player);
player.powerOff();
}
}
private void testLineForAds(Player player, String line) {
if (testLineFor(ads, line)) {
logger.info("Ad detected for player: " + player);
player.setAdPlaying(true);
}
}
private void testLineForEndAds(Player player, String line) {
if (testLineFor(ads, line)) return;
if (testLineFor(end_ads, line))
{
logger.info("Something different than ad detected for
player: " + player);
player.setAdPlaying(false);
}
}
protected boolean testLineFor(String[] keys, String line) {
ArrayIterator ai = new ArrayIterator(keys);
while(ai.hasNext()) {
String test = (String)ai.next();
if (line.contains(test)) {
return true;
}
}
return false;
}
protected void doHttpCommand(String cmd) {
URL url;
try {
url = new URL(cmd);
InputStream is;
is = url.openStream();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void write(String value) {
try {
out.println(value);
out.flush();
logger.info("Write-> "+value);
}
catch (Exception e) {
e.printStackTrace();
}
}
public void disconnect() {
try {
telnet.disconnect();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
SqueezeboxCLIListener telnet = new
SqueezeboxCLIListener();
telnet.disconnect();
}
catch (Exception e) {
e.printStackTrace();
}
}
public void setMuting(Player player, int mute) {
write(player.mac + " mixer muting " + mute);
}
}
--------------------
------------------------------------------------------------------------
Squeezy's Profile: http://forums.slimdevices.com/member.php?userid=4276
View this thread: http://forums.slimdevices.com/showthread.php?t=107846
_______________________________________________
slimserver-de mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/slimserver-de