summaryrefslogtreecommitdiff
path: root/cmpcj/src/de/schwarzrot/control/client
diff options
context:
space:
mode:
Diffstat (limited to 'cmpcj/src/de/schwarzrot/control/client')
-rw-r--r--cmpcj/src/de/schwarzrot/control/client/CMPClient.java171
-rw-r--r--cmpcj/src/de/schwarzrot/control/client/MediaClientExecutor.java34
2 files changed, 205 insertions, 0 deletions
diff --git a/cmpcj/src/de/schwarzrot/control/client/CMPClient.java b/cmpcj/src/de/schwarzrot/control/client/CMPClient.java
new file mode 100644
index 0000000..38c6ccb
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/control/client/CMPClient.java
@@ -0,0 +1,171 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: CMPClient.java
+ * Created: 13. June 2012, 04:57
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * 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<Media> {
+ 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<Media> 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<Media> 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<AbstractMediaNode> 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;
+}
diff --git a/cmpcj/src/de/schwarzrot/control/client/MediaClientExecutor.java b/cmpcj/src/de/schwarzrot/control/client/MediaClientExecutor.java
new file mode 100644
index 0000000..4ad39f2
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/control/client/MediaClientExecutor.java
@@ -0,0 +1,34 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaClientExecutor.java
+ * Created: 13. June 2012, 04:57
+ * Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
+ * 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 de.schwarzrot.media.domain.Media;
+
+
+public interface MediaClientExecutor {
+ public void playMedia(Media m);
+}