Search in sources :

Example 6 with VirtualVideoAction

use of net.pms.dlna.virtual.VirtualVideoAction in project UniversalMediaServer by UniversalMediaServer.

the class RootFolder method addAdminFolder.

private void addAdminFolder() {
    DLNAResource res = new VirtualFolder(Messages.getString("PMS.131"), null);
    DLNAResource vsf = getVideoSettingsFolder();
    if (vsf != null) {
        res.addChild(vsf);
    }
    res.addChild(new VirtualFolder(Messages.getString("NetworkTab.39"), null) {

        @Override
        public void discoverChildren() {
            final ArrayList<DownloadPlugins> plugins = DownloadPlugins.downloadList();
            for (final DownloadPlugins plugin : plugins) {
                addChild(new VirtualVideoAction(plugin.getName(), true) {

                    @Override
                    public boolean enable() {
                        try {
                            plugin.install(null);
                        } catch (Exception e) {
                        }
                        return true;
                    }
                });
            }
        }
    });
    if (configuration.getScriptDir() != null) {
        final File scriptDir = new File(configuration.getScriptDir());
        if (scriptDir.exists()) {
            res.addChild(new VirtualFolder(Messages.getString("PMS.132"), null) {

                @Override
                public void discoverChildren() {
                    File[] files = scriptDir.listFiles();
                    if (files != null) {
                        for (File file : files) {
                            String name = file.getName().replaceAll("_", " ");
                            int pos = name.lastIndexOf('.');
                            if (pos != -1) {
                                name = name.substring(0, pos);
                            }
                            final File f = file;
                            addChild(new VirtualVideoAction(name, true) {

                                @Override
                                public boolean enable() {
                                    try {
                                        ProcessBuilder pb = new ProcessBuilder(f.getAbsolutePath());
                                        pb.redirectErrorStream(true);
                                        Process pid = pb.start();
                                        // consume the error and output process streams
                                        StreamGobbler.consume(pid.getInputStream());
                                        pid.waitFor();
                                    } catch (IOException | InterruptedException e) {
                                    }
                                    return true;
                                }
                            });
                        }
                    }
                }
            });
        }
    }
    // Resume file management
    if (configuration.isResumeEnabled()) {
        res.addChild(new VirtualFolder(Messages.getString("PMS.135"), null) {

            @Override
            public void discoverChildren() {
                final File[] files = ResumeObj.resumeFiles();
                addChild(new VirtualVideoAction(Messages.getString("PMS.136"), true) {

                    @Override
                    public boolean enable() {
                        for (File f : files) {
                            f.delete();
                        }
                        getParent().getChildren().remove(this);
                        return false;
                    }
                });
                for (final File f : files) {
                    String name = FileUtil.getFileNameWithoutExtension(f.getName());
                    name = name.replaceAll(ResumeObj.CLEAN_REG, "");
                    addChild(new VirtualVideoAction(name, false) {

                        @Override
                        public boolean enable() {
                            f.delete();
                            getParent().getChildren().remove(this);
                            return false;
                        }
                    });
                }
            }
        });
    }
    // Reboot UMS
    res.addChild(new VirtualVideoAction(Messages.getString("PMS.149"), true) {

        @Override
        public boolean enable() {
            ProcessUtil.reboot();
            // Reboot failed if we get here
            return false;
        }
    });
    addChild(res);
}
Also used : VirtualFolder(net.pms.dlna.virtual.VirtualFolder) URISyntaxException(java.net.URISyntaxException) XmlParseException(xmlwise.XmlParseException) MalformedURLException(java.net.MalformedURLException) ConfigurationException(org.apache.commons.configuration.ConfigurationException) VirtualVideoAction(net.pms.dlna.virtual.VirtualVideoAction) DownloadPlugins(net.pms.configuration.DownloadPlugins)

Example 7 with VirtualVideoAction

use of net.pms.dlna.virtual.VirtualVideoAction in project UniversalMediaServer by UniversalMediaServer.

the class RemoteBrowseHandler method mkBrowsePage.

private String mkBrowsePage(String id, HttpExchange t) throws IOException {
    LOGGER.debug("Make browse page " + id);
    String user = RemoteUtil.userName(t);
    RootFolder root = parent.getRoot(user, true, t);
    String search = RemoteUtil.getQueryVars(t.getRequestURI().getQuery(), "str");
    List<DLNAResource> resources = root.getDLNAResources(id, true, 0, 0, root.getDefaultRenderer(), search);
    boolean upnpAllowed = RemoteUtil.bumpAllowed(t);
    boolean upnpControl = RendererConfiguration.hasConnectedControlPlayers();
    if (!resources.isEmpty() && resources.get(0).getParent() != null && (resources.get(0).getParent() instanceof CodeEnter)) {
        // this is a code folder the search string is  entered code
        CodeEnter ce = (CodeEnter) resources.get(0).getParent();
        ce.setEnteredCode(search);
        if (!ce.validCode(ce)) {
            // invalid code throw error
            throw new IOException("Auth error");
        }
        DLNAResource real = ce.getResource();
        if (!real.isFolder()) {
            // no folder   -> redirect
            Headers hdr = t.getResponseHeaders();
            hdr.add("Location", "/play/" + real.getId());
            RemoteUtil.respond(t, "", 302, "text/html");
            // return null here to avoid multiple responses
            return null;
        }
        // redirect to ourself
        Headers hdr = t.getResponseHeaders();
        hdr.add("Location", "/browse/" + real.getResourceId());
        RemoteUtil.respond(t, "", 302, "text/html");
        return null;
    }
    if (StringUtils.isNotEmpty(search) && !(resources instanceof CodeEnter)) {
        UMSUtils.postSearch(resources, search);
    }
    boolean hasFile = false;
    ArrayList<String> folders = new ArrayList<>();
    ArrayList<HashMap<String, String>> media = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    sb.setLength(0);
    sb.append("<a href=\"javascript:history.back()\" title=\"").append(RemoteUtil.getMsgString("Web.10", t)).append("\">");
    sb.append("<span>").append(RemoteUtil.getMsgString("Web.10", t)).append("</span>");
    sb.append("</a>");
    folders.add(sb.toString());
    // Generate innerHtml snippets for folders and media items
    for (DLNAResource resource : resources) {
        String newId = resource.getResourceId();
        String idForWeb = URLEncoder.encode(newId, "UTF-8");
        String thumb = "/thumb/" + idForWeb;
        String name = StringEscapeUtils.escapeHtml(resource.resumeName());
        if (resource instanceof VirtualVideoAction) {
            // Let's take the VVA real early
            sb.setLength(0);
            HashMap<String, String> item = new HashMap<>();
            sb.append("<a href=\"#\" onclick=\"umsAjax('/play/").append(idForWeb).append("', true);return false;\" title=\"").append(name).append("\">").append("<img class=\"thumb\" src=\"").append(thumb).append("\" alt=\"").append(name).append("\">").append("</a>");
            item.put("thumb", sb.toString());
            sb.setLength(0);
            sb.append("<a href=\"#\" onclick=\"umsAjax('/play/").append(idForWeb).append("', true);return false;\" title=\"").append(name).append("\">").append("<span class=\"caption\">").append(name).append("</span>").append("</a>");
            item.put("caption", sb.toString());
            item.put("bump", "<span class=\"floatRight\"></span>");
            media.add(item);
            hasFile = true;
            continue;
        }
        if (resource.isFolder()) {
            sb.setLength(0);
            // The resource is a folder
            String p = "/browse/" + idForWeb;
            boolean code = (resource instanceof CodeEnter);
            String txt = RemoteUtil.getMsgString("Web.8", t);
            if (code) {
                txt = RemoteUtil.getMsgString("Web.9", t);
            }
            if (resource.getClass().getName().contains("SearchFolder") || code) {
                // search folder add a prompt
                // NOTE!!!
                // Yes doing getClass.getname is REALLY BAD, but this
                // is to make legacy plugins utilize this function as well
                sb.append("<a href=\"javascript:void(0);\" onclick=\"searchFun('").append(p).append("','").append(txt).append("');\" title=\"").append(name).append("\">");
            } else {
                sb.append("<a href=\"").append(p).append("\" oncontextmenu=\"searchFun('").append(p).append("','").append(txt).append("');\" title=\"").append(name).append("\">");
            }
            sb.append("<span>").append(name).append("</span>");
            sb.append("</a>");
            folders.add(sb.toString());
        } else {
            // The resource is a media file
            sb.setLength(0);
            HashMap<String, String> item = new HashMap<>();
            if (upnpAllowed) {
                if (upnpControl) {
                    sb.append("<a class=\"bumpIcon\" href=\"javascript:bump.start('//").append(parent.getAddress()).append("','/play/").append(idForWeb).append("','").append(name.replace("'", "\\'")).append("')\" title=\"").append(RemoteUtil.getMsgString("Web.1", t)).append("\"></a>");
                } else {
                    sb.append("<a class=\"bumpIcon icondisabled\" href=\"javascript:notify('warn','").append(RemoteUtil.getMsgString("Web.2", t)).append("')\" title=\"").append(RemoteUtil.getMsgString("Web.3", t)).append("\"></a>");
                }
                if (resource.getParent() instanceof Playlist) {
                    sb.append("\n<a class=\"playlist_del\" href=\"#\" onclick=\"umsAjax('/playlist/del/").append(idForWeb).append("', true);return false;\" title=\"").append(RemoteUtil.getMsgString("Web.4", t)).append("\"></a>");
                } else {
                    sb.append("\n<a class=\"playlist_add\" href=\"#\" onclick=\"umsAjax('/playlist/add/").append(idForWeb).append("', false);return false;\" title=\"").append(RemoteUtil.getMsgString("Web.5", t)).append("\"></a>");
                }
            } else {
                // ensure that we got a string
                sb.append("");
            }
            item.put("bump", sb.toString());
            sb.setLength(0);
            if (WebRender.supports(resource) || resource.isResume() || resource.getType() == Format.IMAGE) {
                sb.append("<a href=\"/play/").append(idForWeb).append("\" title=\"").append(name).append("\">").append("<img class=\"thumb\" src=\"").append(thumb).append("\" alt=\"").append(name).append("\">").append("</a>");
                item.put("thumb", sb.toString());
                sb.setLength(0);
                sb.append("<a href=\"/play/").append(idForWeb).append("\" title=\"").append(name).append("\">").append("<span class=\"caption\">").append(name).append("</span>").append("</a>");
                item.put("caption", sb.toString());
            } else if (upnpControl && upnpAllowed) {
                // Include it as a web-disabled item so it can be thrown via upnp
                sb.append("<a class=\"webdisabled\" href=\"javascript:notify('warn','").append(RemoteUtil.getMsgString("Web.6", t)).append("')\"").append(" title=\"").append(name).append(' ').append(RemoteUtil.getMsgString("Web.7", t)).append("\">").append("<img class=\"thumb\" src=\"").append(thumb).append("\" alt=\"").append(name).append("\">").append("</a>");
                item.put("thumb", sb.toString());
                sb.setLength(0);
                sb.append("<span class=\"webdisabled caption\">").append(name).append("</span>");
                item.put("caption", sb.toString());
            }
            media.add(item);
            hasFile = true;
        }
    }
    HashMap<String, Object> vars = new HashMap<>();
    vars.put("name", id.equals("0") ? configuration.getServerDisplayName() : StringEscapeUtils.escapeHtml(root.getDLNAResource(id, null).getDisplayName()));
    vars.put("hasFile", hasFile);
    vars.put("folders", folders);
    vars.put("media", media);
    if (configuration.useWebControl()) {
        vars.put("push", true);
    }
    return parent.getResources().getTemplate("browse.html").execute(vars);
}
Also used : HashMap(java.util.HashMap) Headers(com.sun.net.httpserver.Headers) ArrayList(java.util.ArrayList) IOException(java.io.IOException) DLNAResource(net.pms.dlna.DLNAResource) Playlist(net.pms.dlna.Playlist) VirtualVideoAction(net.pms.dlna.virtual.VirtualVideoAction) RootFolder(net.pms.dlna.RootFolder) CodeEnter(net.pms.dlna.CodeEnter)

Aggregations

VirtualVideoAction (net.pms.dlna.virtual.VirtualVideoAction)7 VirtualFolder (net.pms.dlna.virtual.VirtualFolder)3 IOException (java.io.IOException)2 HashMap (java.util.HashMap)2 DLNAResource (net.pms.dlna.DLNAResource)2 Playlist (net.pms.dlna.Playlist)2 RootFolder (net.pms.dlna.RootFolder)2 ConfigurationException (org.apache.commons.configuration.ConfigurationException)2 Headers (com.sun.net.httpserver.Headers)1 File (java.io.File)1 MalformedURLException (java.net.MalformedURLException)1 URISyntaxException (java.net.URISyntaxException)1 ArrayList (java.util.ArrayList)1 DownloadPlugins (net.pms.configuration.DownloadPlugins)1 WebRender (net.pms.configuration.WebRender)1 CodeEnter (net.pms.dlna.CodeEnter)1 TranscodeVirtualFolder (net.pms.dlna.virtual.TranscodeVirtualFolder)1 ExternalListener (net.pms.external.ExternalListener)1 Format (net.pms.formats.Format)1 OutputParams (net.pms.io.OutputParams)1