package com.amaze.filemanager.utils.SmbStreamer;
import android.util.Log;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import java.util.regex.Pattern;
import jcifs.smb.SmbFile;
/**
* Created by Arpit on 06-07-2015.
*/
public class Streamer extends StreamServer {
public static final int PORT = 7871;
public static final String URL = "http://127.0.0.1:" + PORT;
private SmbFile file;
long length = 0;
//protected List<SmbFile> extras; //those can be subtitles
// private InputStream stream;
// private long length;
private static Streamer instance;
private static Pattern pattern = Pattern.compile("^.*\\.(?i)(mp3|wma|wav|aac|ogg|m4a|flac|mp4|avi|mpg|mpeg|3gp|3gpp|mkv|flv|rmvb)$");
// private CBItem source;
// private String mime;
protected Streamer(int port) throws IOException {
super(port, new File("."));
}
public static Streamer getInstance() {
if (instance == null)
try {
instance = new Streamer(PORT);
} catch (IOException e) {
e.printStackTrace();
}
return instance;
}
public static boolean isStreamMedia(SmbFile file) {
return pattern.matcher(file.getName()).matches();
}
public void setStreamSrc(SmbFile file, long len) {
this.file = file;
//this.extras = extraFiles;
this.length = len;
}
@Override
public Response serve(String uri, String method, Properties header, Properties parms, Properties files) {
Response res = null;
try {
SmbFile sourceFile = null;
String name = getNameFromPath(uri);
if (file != null && file.getName().equals(name))
sourceFile = file;
/*else if(extras!=null){
for(SmbFile i : extras){
if(i!=null && i.getName().equals(name)){
sourceFile = i;
break;
}
}
}*/
if (sourceFile == null)
res = new Response(HTTP_NOTFOUND, MIME_PLAINTEXT, null);
else {
long startFrom = 0;
long endAt = -1;
String range = header.getProperty("range");
if (range != null) {
if (range.startsWith("bytes=")) {
range = range.substring("bytes=".length());
int minus = range.indexOf('-');
try {
if (minus > 0) {
startFrom = Long.parseLong(range.substring(0, minus));
endAt = Long.parseLong(range.substring(minus + 1));
}
} catch (NumberFormatException nfe) {
}
}
}
Log.d("Explorer", "Request: " + range + " from: " + startFrom + ", to: " + endAt);
// Change return code and add Content-Range header when skipping
// is requested
//source.open();
final StreamSource source = new StreamSource(sourceFile, length);
long fileLen = source.length();
if (range != null && startFrom > 0) {
if (startFrom >= fileLen) {
res = new Response(HTTP_RANGE_NOT_SATISFIABLE, MIME_PLAINTEXT, null);
res.addHeader("Content-Range", "bytes 0-0/" + fileLen);
} else {
if (endAt < 0)
endAt = fileLen - 1;
long newLen = fileLen - startFrom;
if (newLen < 0)
newLen = 0;
Log.d("Explorer", "start=" + startFrom + ", endAt=" + endAt + ", newLen=" + newLen);
final long dataLen = newLen;
source.moveTo(startFrom);
Log.d("Explorer", "Skipped " + startFrom + " bytes");
res = new Response(HTTP_PARTIALCONTENT, source.getMimeType(), source);
res.addHeader("Content-length", "" + dataLen);
}
} else {
source.reset();
res = new Response(HTTP_OK, source.getMimeType(), source);
res.addHeader("Content-Length", "" + fileLen);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
res = new Response(HTTP_FORBIDDEN, MIME_PLAINTEXT, null);
}
res.addHeader("Accept-Ranges", "bytes"); // Announce that the file
// server accepts partial
// content requestes
return res;
}
private static String getNameFromPath(String path) {
if (path == null || path.length() < 2)
return null;
int slash = path.lastIndexOf('/');
if (slash == -1)
return path;
else
return path.substring(slash + 1);
}
}