package com.amaze.filemanager.utils;
import android.util.Log;
import com.amaze.filemanager.utils.SmbStreamer.CloudStreamServer;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.regex.Pattern;
import jcifs.smb.SmbFile;
/**
* Created by Vishal on 30-04-2017.
*/
public class CloudStreamer extends CloudStreamServer {
public static final int PORT = 7871;
public static final String URL = "http://127.0.0.1:" + PORT;
private InputStream inputStream;
private String fileName;
long length = 0;
private static CloudStreamer 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 CloudStreamer(int port) throws IOException {
super(port, new File("."));
}
public static CloudStreamer getInstance() {
if (instance == null)
try {
instance = new CloudStreamer(PORT);
} catch (IOException e) {
e.printStackTrace();
}
return instance;
}
public static boolean isStreamMedia(SmbFile file) {
return pattern.matcher(file.getName()).matches();
}
public void setStreamSrc(InputStream inputStream, String fileName, long length) {
this.inputStream = inputStream;
this.fileName = fileName;
this.length = length;
}
@Override
public CloudStreamServer.Response serve(String uri, String method, Properties header, Properties parms, Properties files) {
CloudStreamServer.Response res = null;
try {
if (inputStream == null)
res = new CloudStreamServer.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 CloudStreamSource source = new CloudStreamSource(fileName, length, inputStream);
long fileLen = source.length();
if (range != null && startFrom > 0) {
if (startFrom >= fileLen) {
res = new CloudStreamServer.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 CloudStreamServer.Response(HTTP_PARTIALCONTENT, source.getMimeType(), source);
res.addHeader("Content-length", "" + dataLen);
}
} else {
source.reset();
res = new CloudStreamServer.Response(HTTP_OK, source.getMimeType(), source);
res.addHeader("Content-Length", "" + fileLen);
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
res = new CloudStreamServer.Response(HTTP_FORBIDDEN, MIME_PLAINTEXT, null);
}
res.addHeader("Accept-Ranges", "bytes"); // Announce that the file
// server accepts partial
// content requestes
return res;
}
}