Package net.pms.remote

Source Code of net.pms.remote.RemoteMediaHandler

package net.pms.remote;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import net.pms.PMS;
import net.pms.configuration.FormatConfiguration;
import net.pms.configuration.RendererConfiguration;
import net.pms.dlna.DLNAMediaInfo;
import net.pms.dlna.DLNAResource;
import net.pms.dlna.Range;
import net.pms.dlna.RootFolder;
import net.pms.encoders.WebPlayer;
import net.pms.external.StartStopListenerDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RemoteMediaHandler implements HttpHandler {
  private static final Logger LOGGER = LoggerFactory.getLogger(RemoteMediaHandler.class);
  private RemoteWeb parent;
  private String path;
  private RendererConfiguration render;
  private boolean flash;

  public RemoteMediaHandler(RemoteWeb parent) {
    this(parent, "media/", null);
  }

  public RemoteMediaHandler(RemoteWeb parent, boolean flash) {
    this(parent, "fmedia/", null);
    this.flash = flash;
  }

  public RemoteMediaHandler(RemoteWeb parent, String path, RendererConfiguration render) {
    this.flash = false;
    this.parent = parent;
    this.path = path;
    this.render = render;
  }

  @Override
  public void handle(HttpExchange t) throws IOException {
    if (RemoteUtil.deny(t)) {
      throw new IOException("Access denied");
    }
    RootFolder root = parent.getRoot(RemoteUtil.userName(t), t);
    if (root == null) {
      throw new IOException("Unknown root");
    }
    Headers h = t.getRequestHeaders();
    for(String h1: h.keySet())  {
      LOGGER.debug("key "+h1+"="+h.get(h1));
    }
    String id = RemoteUtil.getId(path, t);
    id = RemoteUtil.strip(id);
    RendererConfiguration r = render;
    if (render == null) {
      r = root.getDefaultRenderer();
    }
    List<DLNAResource> res = root.getDLNAResources(id, false, 0, 0, r);
    if (res.size() != 1) {
      // another error
      LOGGER.debug("media unkonwn");
      throw new IOException("Bad id");
    }
    long len = res.get(0).length();
    Range range = RemoteUtil.parseRange(t.getRequestHeaders(), len);
    String mime = root.getDefaultRenderer().getMimeType(res.get(0).mimeType());
    DLNAResource dlna = res.get(0);
    DLNAMediaInfo m = dlna.getMedia();
    if(mime.equals(FormatConfiguration.MIMETYPE_AUTO) && m != null && m.getMimeType() != null) {
      mime = m.getMimeType();
    }
    if (dlna.getFormat().isVideo()) {
      if (flash) {
        mime = "video/flash";
        dlna.setPlayer(new WebPlayer(WebPlayer.FLASH));
      } else if (!RemoteUtil.directmime(mime)) {
        mime = RemoteUtil.MIME_TRANS;
        dlna.setPlayer(new WebPlayer(WebPlayer.TRANS));
      }
      else {
        dlna.setPlayer(null);
      }
    }

    LOGGER.debug("dumping media " + mime + " " + res);
    InputStream in = dlna.getInputStream(range, root.getDefaultRenderer());
    Headers hdr = t.getResponseHeaders();
    hdr.add("Content-Type", mime);
    hdr.add("Accept-Ranges", "bytes");
    hdr.add("Server", PMS.get().getServerName());
    hdr.add("Connection", "keep-alive");
    t.sendResponseHeaders(200, 0);
    OutputStream os = t.getResponseBody();
    StartStopListenerDelegate startStop = new StartStopListenerDelegate(t.getRemoteAddress().getHostString());
    PMS.get().getFrame().setStatusLine("Serving " + dlna.getName());
    startStop.start(dlna);
    RemoteUtil.dump(in, os, startStop);
    PMS.get().getFrame().setStatusLine("");
  }
}
TOP

Related Classes of net.pms.remote.RemoteMediaHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.