From af80bd2426282b7491d9ba0ebfb201abb42e3ca4 Mon Sep 17 00:00:00 2001 From: geronimo Date: Wed, 15 Aug 2012 07:55:07 +0200 Subject: next variant of java client --- .../de/schwarzrot/control/client/CMPClient.java | 171 +++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 cmpcj/src/de/schwarzrot/control/client/CMPClient.java (limited to 'cmpcj/src/de/schwarzrot/control/client/CMPClient.java') 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: 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; +} -- cgit v1.2.3