/**
* ======================== legal notice ======================
*
* File: CMPClient.java
* Created: 13. June 2012, 04:57
* Author: Geronimo
* Project: cmpc - a java frontend (client) part of compound media player
* uses external players to play the media
*
* CMP - compound media player
*
* is a client/server mediaplayer intended to play any media from any workstation
* without the need to export or mount shares. cmps is an easy to use backend
* with a (ready to use) HTML-interface. Additionally the backend supports
* authentication via HTTP-digest authorization.
* cmpc is a client with vdr-like osd-menues.
*
* Copyright (c) 2012 Reinhard Mantey, some rights reserved!
* published under Creative Commons by-sa
* For details see http://creativecommons.org/licenses/by-sa/3.0/
*
* The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
*
* --------------------------------------------------------------
*/
package de.schwarzrot.control.client;
import java.net.ConnectException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Date;
import ca.odell.glazedlists.EventList;
import de.schwarzrot.base.util.ApplicationServiceProvider;
import de.schwarzrot.media.domain.AbstractMediaNode;
import de.schwarzrot.media.domain.Media;
import de.schwarzrot.media.domain.MediaServer;
import de.schwarzrot.media.domain.PlayList;
import de.schwarzrot.media.util.ElementConsumer;
import de.schwarzrot.media.util.ListLoader;
import de.schwarzrot.media.util.MedialistParser;
public class CMPClient implements ListLoader {
public CMPClient(MediaServer serverDefinition) {
server = serverDefinition;
}
public void execServerRescan() {
try {
URL request = new URL("http", server.getHostName(), server.getPort(), "/refresh");
URLConnection conn = request.openConnection();
conn.connect();
conn.getContentLength();
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
public void execServerShutdown() {
try {
URL request = new URL("http", server.getHostName(), server.getPort(), "/stop");
URLConnection conn = request.openConnection();
conn.connect();
conn.getContentLength();
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
public MediaServer getServerDefinition() {
return server;
}
@Override
public long[] loadFirst(ElementConsumer consumer) {
MedialistParser jsonParser = ApplicationServiceProvider.getService(MedialistParser.class);
URL request = null;
Date start, end;
long[] rv = new long[2];
try {
start = new Date();
request = new URL("http", server.getHostName(), server.getPort(), "/?format=json");
URLConnection conn = request.openConnection();
final PlayList firstPlaylist = jsonParser.parseListChunk(conn.getInputStream());
for (Media m : firstPlaylist.getResults())
consumer.consumeElement(m);
end = new Date();
rv[0] = firstPlaylist.getResults().size();
rv[1] = firstPlaylist.getTotal();
System.out.println("processing of first playlist-part took " + (end.getTime() - start.getTime()) + " ms.");
} catch (UnknownHostException uhe) {
throw new RuntimeException("failed to connect to " + server.getHostName(), uhe);
} catch (ConnectException ce) {
throw new RuntimeException("connection failure with " + server.getHostName(), ce);
} catch (Throwable t) {
t.printStackTrace();
}
return rv;
}
@Override
public long loadRest(long[] listInfo, ElementConsumer consumer) {
MedialistParser jsonParser = ApplicationServiceProvider.getService(MedialistParser.class);
URL request = null;
Date start, end;
long rv = 0;
try {
PlayList next;
URLConnection conn;
long total = listInfo[1];
long n = listInfo[0];
long elementsRead = 0;
String uri;
start = new Date();
try {
while (n < total) {
uri = String.format("/?start=%d&limit=%d&format=json", n, 100);
request = new URL("http", server.getHostName(), server.getPort(), uri);
conn = request.openConnection();
next = jsonParser.parseListChunk(conn.getInputStream());
for (Media m : next.getResults())
consumer.consumeElement(m);
elementsRead = next.getResults().size();
n += elementsRead;
rv += elementsRead;
Thread.sleep(10);
}
} catch (UnknownHostException uhe) {
throw new RuntimeException("failed to connect to " + server.getHostName(), uhe);
} catch (ConnectException ce) {
throw new RuntimeException("connection failure with " + server.getHostName(), ce);
} catch (Throwable t) {
System.err.println("Error on chunk #" + n);
t.printStackTrace();
}
end = new Date();
System.out.println("processing of rest of playlist took " + (end.getTime() - start.getTime()) + " ms.");
} catch (Throwable t) {
t.printStackTrace();
}
return rv;
}
public void transmitChanges(EventList changes) {
for (AbstractMediaNode n : changes) {
System.out.println("geƤnderter Eintrag: " + n.getClass().getSimpleName() + " - " + n.getName()); //$NON-NLS-1$
System.out.println("\tverschieben von " + n.getOriginalPath().getAbsolutePath() + " nach "
+ n.getRealPath().getAbsolutePath());
//TODO: really create jobs for changes, so backend can participate on work
}
}
private MediaServer server;
}