summaryrefslogtreecommitdiff
path: root/cmpcj/src/de/schwarzrot/media/service
diff options
context:
space:
mode:
authorgeronimo <geronimo013@gmx.de>2012-08-15 07:55:07 +0200
committergeronimo <geronimo013@gmx.de>2012-08-15 07:55:07 +0200
commitaf80bd2426282b7491d9ba0ebfb201abb42e3ca4 (patch)
tree8aeac09a815f3133773cb927597738d4150030f1 /cmpcj/src/de/schwarzrot/media/service
parent7eb41fd1431019f44227af6f5d707e7c98e0416e (diff)
downloadcmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.gz
cmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.bz2
next variant of java client
Diffstat (limited to 'cmpcj/src/de/schwarzrot/media/service')
-rw-r--r--cmpcj/src/de/schwarzrot/media/service/DataManager.java152
-rw-r--r--cmpcj/src/de/schwarzrot/media/service/MediaExecutor.java58
-rw-r--r--cmpcj/src/de/schwarzrot/media/service/MediaFactory.java137
3 files changed, 347 insertions, 0 deletions
diff --git a/cmpcj/src/de/schwarzrot/media/service/DataManager.java b/cmpcj/src/de/schwarzrot/media/service/DataManager.java
new file mode 100644
index 0000000..3d6940f
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/media/service/DataManager.java
@@ -0,0 +1,152 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: DataManager.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.media.service;
+
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+import javax.swing.SwingUtilities;
+import javax.swing.tree.DefaultMutableTreeNode;
+import ca.odell.glazedlists.EventList;
+import de.schwarzrot.base.util.ApplicationServiceProvider;
+import de.schwarzrot.base.util.SuccessHandler;
+import de.schwarzrot.media.domain.AbstractMediaNode;
+import de.schwarzrot.media.domain.Genre;
+import de.schwarzrot.media.domain.Media;
+import de.schwarzrot.media.util.ElementConsumer;
+import de.schwarzrot.media.util.ListLoader;
+
+
+public class DataManager implements Runnable, ElementConsumer<Media> {
+ public DataManager(File input) {
+ this.input = input;
+ nodeCache = new HashMap<File, DefaultMutableTreeNode>();
+ }
+
+
+ @Override
+ public void consumeElement(Media m) {
+ if (m.getParent() == null)
+ m.setParent(getGenre(m.getRealPath().getParentFile()));
+
+ mediaList.getReadWriteLock().writeLock().lock();
+ mediaList.add(m);
+ mediaList.getReadWriteLock().writeLock().unlock();
+ }
+
+
+ public void load(DefaultMutableTreeNode root, EventList<Media> mediaList, SuccessHandler successHandler) {
+ Thread backgroundThread = new Thread(this);
+
+ nodeCache.clear();
+ resultHandler = successHandler;
+ rootNode = root;
+ nodeCache.put(new File("/"), rootNode);
+ this.mediaList = mediaList;
+ backgroundThread.setName("load media list");
+ backgroundThread.setDaemon(true);
+ backgroundThread.start();
+ }
+
+
+ @Override
+ public void run() {
+ @SuppressWarnings("unchecked")
+ ListLoader<Media> ll = ApplicationServiceProvider.getService(ListLoader.class);
+
+ try {
+ long[] info = ll.loadFirst(this);
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ resultHandler.handleSuccess(); // feedback to main thread
+ }
+ });
+ ll.loadRest(info, this);
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ resultHandler.handleSuccess(); // feedback to main thread
+ }
+ });
+ } catch (final Throwable t) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ resultHandler.handleFailure(t); // feedback to main thread
+ }
+ });
+ }
+ }
+
+
+ protected void createGenre(File path) {
+ File tmp = path;
+ Stack<File> unknownGenres = new Stack<File>();
+
+ while (tmp != null && !nodeCache.containsKey(tmp)) {
+ unknownGenres.push(tmp);
+ tmp = tmp.getParentFile();
+ }
+ DefaultMutableTreeNode treeNode = tmp == null ? rootNode : nodeCache.get(tmp);
+ AbstractMediaNode media = (AbstractMediaNode) treeNode.getUserObject();
+ DefaultMutableTreeNode subNode = null;
+ Genre g = null;
+
+ if (media != null && media instanceof Genre)
+ g = (Genre) media;
+
+ while (unknownGenres.size() > 0) {
+ tmp = unknownGenres.pop();
+ g = new Genre(g, tmp);
+ subNode = new DefaultMutableTreeNode(g);
+ nodeCache.put(tmp, subNode);
+ treeNode.add(subNode);
+ treeNode = subNode;
+ }
+ }
+
+
+ protected Genre getGenre(File path) {
+ if (!nodeCache.containsKey(path))
+ createGenre(path);
+ DefaultMutableTreeNode n = nodeCache.get(path);
+ AbstractMediaNode rv = (AbstractMediaNode) n.getUserObject();
+
+ if (rv instanceof Genre)
+ return (Genre) rv;
+ return null;
+ }
+
+ @SuppressWarnings("unused")
+ private File input;
+ private SuccessHandler resultHandler;
+ private DefaultMutableTreeNode rootNode;
+ private EventList<Media> mediaList;
+ private Map<File, DefaultMutableTreeNode> nodeCache;
+}
diff --git a/cmpcj/src/de/schwarzrot/media/service/MediaExecutor.java b/cmpcj/src/de/schwarzrot/media/service/MediaExecutor.java
new file mode 100644
index 0000000..0cd6fe7
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/media/service/MediaExecutor.java
@@ -0,0 +1,58 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaExecutor.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.media.service;
+
+
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import javax.swing.JTable;
+import ca.odell.glazedlists.EventList;
+import de.schwarzrot.control.client.MediaClientExecutor;
+import de.schwarzrot.media.domain.Media;
+
+
+public class MediaExecutor extends MouseAdapter {
+ public MediaExecutor(JTable table, EventList<Media> list, MediaClientExecutor mce) {
+ this.table = table;
+ this.list = list;
+ executor = mce;
+ }
+
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() > 1) {
+ int i = table.rowAtPoint(e.getPoint());
+ Media m = list.get(i);
+
+ executor.playMedia(m);
+ }
+ }
+
+ private JTable table;
+ private EventList<Media> list;
+ private MediaClientExecutor executor;
+}
diff --git a/cmpcj/src/de/schwarzrot/media/service/MediaFactory.java b/cmpcj/src/de/schwarzrot/media/service/MediaFactory.java
new file mode 100644
index 0000000..ff31822
--- /dev/null
+++ b/cmpcj/src/de/schwarzrot/media/service/MediaFactory.java
@@ -0,0 +1,137 @@
+/**
+ * ======================== legal notice ======================
+ *
+ * File: MediaFactory.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.media.service;
+
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+import de.schwarzrot.media.domain.AbstractMediaNode;
+import de.schwarzrot.media.domain.Audio;
+import de.schwarzrot.media.domain.DVDImage;
+import de.schwarzrot.media.domain.Genre;
+import de.schwarzrot.media.domain.LegacyVdrRecording;
+import de.schwarzrot.media.domain.Media;
+import de.schwarzrot.media.domain.Movie;
+import de.schwarzrot.media.domain.Picture;
+import de.schwarzrot.media.domain.VdrRecording;
+
+
+public class MediaFactory {
+ public MediaFactory(File baseDir) {
+ this.baseDir = baseDir;
+ prefix = baseDir.getAbsolutePath();
+ mediaCache = new HashMap<File, AbstractMediaNode>();
+ mediaCache.put(baseDir, new Genre(baseDir));
+ }
+
+
+ //TODO:
+ // here we can't rely on file system information.
+ // may be we got files from remote system ...
+ // so instead to use lookahead for multifile movies, we need to go back
+ // from keyfiles
+ public Media createMedia(File mayBeMedia) {
+ if (!mayBeMedia.getAbsolutePath().startsWith(prefix))
+ return null;
+ String xt = mayBeMedia.getName().substring(mayBeMedia.getName().lastIndexOf(".") + 1);
+ Genre parent = null;
+ Media rv = null;
+
+ if (VdrRecording.isKeyFile(mayBeMedia)) {
+ parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
+
+ rv = new VdrRecording(parent, mayBeMedia.getParentFile());
+ } else if (LegacyVdrRecording.isKeyFile(mayBeMedia)) {
+ parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
+
+ rv = new LegacyVdrRecording(parent, mayBeMedia.getParentFile());
+ } else if (DVDImage.isKeyFile(mayBeMedia)) {
+ parent = getGenre(mayBeMedia.getParentFile().getParentFile().getParentFile());
+
+ rv = new DVDImage(parent, mayBeMedia.getParentFile().getParentFile());
+ } else if (Movie.isSupportedExtension(xt)) {
+ parent = getGenre(mayBeMedia.getParentFile());
+ rv = new Movie(parent, mayBeMedia, Movie.getContentType(xt));
+ } else if (Audio.isSupportedExtension(xt)) {
+ parent = getGenre(mayBeMedia.getParentFile());
+ rv = new Audio(parent, mayBeMedia, Audio.getContentType(xt));
+ } else if (Picture.isSupportedExtension(xt)) {
+ parent = getGenre(mayBeMedia.getParentFile());
+ rv = new Picture(parent, mayBeMedia, Picture.getContentType(xt));
+ }
+ if (rv != null)
+ mediaCache.put(mayBeMedia, rv);
+
+ return rv;
+ }
+
+
+ public Map<File, AbstractMediaNode> getCache() {
+ return mediaCache;
+ }
+
+
+ public Genre getGenre(File mayBeGenre) {
+ if (!mayBeGenre.isDirectory())
+ return null;
+
+ if (!mediaCache.containsKey(mayBeGenre))
+ createGenre(mayBeGenre);
+ AbstractMediaNode rv = mediaCache.get(mayBeGenre);
+
+ if (rv instanceof Genre)
+ return (Genre) rv;
+ return null;
+ }
+
+
+ protected void createGenre(File shouldBeGenre) {
+ File tmp = shouldBeGenre;
+ Stack<File> unknownGenres = new Stack<File>();
+
+ while (tmp != null && !mediaCache.containsKey(tmp)) {
+ unknownGenres.push(tmp);
+ tmp = tmp.getParentFile();
+ }
+ AbstractMediaNode node = mediaCache.get(tmp != null ? tmp : baseDir);
+ Genre g = null;
+
+ if (node != null && node instanceof Genre)
+ g = (Genre) node;
+
+ while (unknownGenres.size() > 0) {
+ tmp = unknownGenres.pop();
+ g = new Genre(g, tmp);
+ mediaCache.put(tmp, g);
+ }
+ }
+
+ private Map<File, AbstractMediaNode> mediaCache;
+ private File baseDir;
+ private String prefix;
+}