private static Result video(String fileSource) {
File videoFile = new File(fileSource);
String[] range = request().headers().get("Range");
if(range == null) {
return ok(new File(fileSource));
}
return videoStream(range[0], videoFile);
}
private static Result videoStream(String range, File videoFile) {
try {
String[] splitRange = range.substring("bytes=".length()).split("-");
long bytesToSkip = Long.parseLong(splitRange[0]);
if(bytesToSkip == 0) {
return ok(videoFile);
}
FileInputStream stream = new FileInputStream(videoFile);
stream.skip(bytesToSkip);
long totalBytes = getTotalBytes(splitRange, stream, bytesToSkip);
response().getHeaders().put(CONTENT_RANGE, String.format("bytes %d-%d/%d", bytesToSkip, totalBytes, totalBytes));
response().setHeader(ACCEPT_RANGES, "bytes");
response().setHeader(CONNECTION, "keep-alive");
return status(PARTIAL_CONTENT, stream);
} catch (IOException e) {
e.printStackTrace();
return notFound();
}
}
private static Result video(String fileSource) {
File videoFile = new File(fileSource);
String[] range = request().headers().get("Range");
if(range == null) {
return ok(new File(fileSource));
}
return videoStream(range[0], videoFile);
}
private static Result videoStream(String range, File videoFile) {
try {
String[] splitRange = range.substring("bytes=".length()).split("-");
long bytesToSkip = Long.parseLong(splitRange[0]);
if(bytesToSkip == 0) {
return ok(videoFile);
}
FileInputStream stream = new FileInputStream(videoFile);
stream.skip(bytesToSkip);
long totalBytes = getTotalBytes(splitRange, stream, bytesToSkip);
response().getHeaders().put(CONTENT_RANGE, String.format("bytes %d-%d/%d", bytesToSkip, totalBytes - 1, totalBytes));