diff options
| author | geronimo <geronimo013@gmx.de> | 2012-08-15 07:55:07 +0200 |
|---|---|---|
| committer | geronimo <geronimo013@gmx.de> | 2012-08-15 07:55:07 +0200 |
| commit | af80bd2426282b7491d9ba0ebfb201abb42e3ca4 (patch) | |
| tree | 8aeac09a815f3133773cb927597738d4150030f1 /cmpcj/src/de/schwarzrot/media/service | |
| parent | 7eb41fd1431019f44227af6f5d707e7c98e0416e (diff) | |
| download | cmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.gz cmp-af80bd2426282b7491d9ba0ebfb201abb42e3ca4.tar.bz2 | |
next variant of java client
Diffstat (limited to 'cmpcj/src/de/schwarzrot/media/service')
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; +} |
