Skip to content

Instantly share code, notes, and snippets.

@stopher
Last active December 7, 2017 16:40

Revisions

  1. stopher revised this gist May 1, 2013. 1 changed file with 21 additions and 20 deletions.
    41 changes: 21 additions & 20 deletions ByteRangeRequestsController.java
    Original file line number Diff line number Diff line change
    @@ -1,51 +1,52 @@
    public class ByteRangeRequestsController extends Controller {

    // 206 Partial content Byte range requests
    private static Result stream(long start, long length, File file) throws IOException {
    private static Result stream(long start, long length, File file) throws IOException {

    FileInputStream fis = new FileInputStream(file);
    fis.skip(start);
    response().setContentType(MimeTypes.forExtension("mp4").get());
    response().setHeader(CONTENT_LENGTH, ((length - start) +1l)+"");
    response().setHeader(CONTENT_RANGE, String.format("bytes %d-%d/%d", start, length,file.length()));
    FileInputStream fis = new FileInputStream(file);
    fis.skip(start);
    response().setContentType(MimeTypes.forExtension("mp4").get());
    response().setHeader(CONTENT_LENGTH, ((length - start) +1l)+"");
    response().setHeader(CONTENT_RANGE, String.format("bytes %d-%d/%d", start, length,file.length()));

    response().setHeader(ACCEPT_RANGES, "bytes");
    response().setHeader(CONNECTION, "keep-alive");
    return status(PARTIAL_CONTENT, fis);
    response().setHeader(ACCEPT_RANGES, "bytes");
    response().setHeader(CONNECTION, "keep-alive");
    return status(PARTIAL_CONTENT, fis);
    }

    // GET a file item
    public static Result file(Long id, String filename) throws IOException {

    Item item = Item.fetch(id);
    File file = item.getFile();

    if(file== null || !file.exists()) {
    Logger.error("File no longer exist item"+id+" filename:"+filename);
    return notFound();
    return notFound();
    }

    String rangeheader = request().getHeader(RANGE);
    if(rangeheader != null) {

    String[] split = rangeheader.substring("bytes=".length()).split("-");
    if(Logger.isDebugEnabled()) { Logger.debug("Range header is:"+rangeheader); }
    if(Logger.isDebugEnabled()) { Logger.debug("Range header is:"+rangeheader); }

    if(split.length == 1) {
    long start = Long.parseLong(split[0]);
    long length = file.length()-1l;
    return stream(start, length, file);
    if(split.length == 1) {
    long start = Long.parseLong(split[0]);
    long length = file.length()-1l;
    return stream(start, length, file);
    } else {
    long start = Long.parseLong(split[0]);
    long length = Long.parseLong(split[1]);
    return stream(start, length, file);
    }
    long start = Long.parseLong(split[0]);
    long length = Long.parseLong(split[1]);
    return stream(start, length, file);
    }
    }

    // if no streaming is required we simply return the file as a 200 OK
    if(Play.isProd()) {
    response().setHeader("Cache-Control", "max-age=3600, must-revalidate");
    }
    return ok(file);
    return ok(file);
    }

    }
  2. stopher renamed this gist May 1, 2013. 1 changed file with 0 additions and 1 deletion.
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@

    public class ByteRangeRequestsController extends Controller {

    // 206 Partial content Byte range requests
  3. stopher created this gist May 1, 2013.
    52 changes: 52 additions & 0 deletions ByteRangeRequestsController
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,52 @@

    public class ByteRangeRequestsController extends Controller {

    // 206 Partial content Byte range requests
    private static Result stream(long start, long length, File file) throws IOException {

    FileInputStream fis = new FileInputStream(file);
    fis.skip(start);
    response().setContentType(MimeTypes.forExtension("mp4").get());
    response().setHeader(CONTENT_LENGTH, ((length - start) +1l)+"");
    response().setHeader(CONTENT_RANGE, String.format("bytes %d-%d/%d", start, length,file.length()));

    response().setHeader(ACCEPT_RANGES, "bytes");
    response().setHeader(CONNECTION, "keep-alive");
    return status(PARTIAL_CONTENT, fis);
    }

    // GET a file item
    public static Result file(Long id, String filename) throws IOException {
    Item item = Item.fetch(id);
    File file = item.getFile();

    if(file== null || !file.exists()) {
    Logger.error("File no longer exist item"+id+" filename:"+filename);
    return notFound();
    }

    String rangeheader = request().getHeader(RANGE);
    if(rangeheader != null) {

    String[] split = rangeheader.substring("bytes=".length()).split("-");
    if(Logger.isDebugEnabled()) { Logger.debug("Range header is:"+rangeheader); }

    if(split.length == 1) {
    long start = Long.parseLong(split[0]);
    long length = file.length()-1l;
    return stream(start, length, file);
    } else {
    long start = Long.parseLong(split[0]);
    long length = Long.parseLong(split[1]);
    return stream(start, length, file);
    }
    }

    // if no streaming is required we simply return the file as a 200 OK
    if(Play.isProd()) {
    response().setHeader("Cache-Control", "max-age=3600, must-revalidate");
    }
    return ok(file);
    }

    }