From 0c2f90ee5c713fcb3aedb236fcebe7dd6d323ba3 Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Wed, 2 Mar 2011 22:25:09 +0100 Subject: Add ability to serve parts of a file. --- music.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'music.cpp') diff --git a/music.cpp b/music.cpp index ee9f2ba..e277ee5 100644 --- a/music.cpp +++ b/music.cpp @@ -247,8 +247,19 @@ MusicDirectory::MusicDirectory(const fs::path root) { } void MusicTrack::render(HTTP::Connection::p req) { - req->add_header("content-type", "application/octet-stream"); - + req->add_header("Content-Type", "audio/mpeg"); + + int skip = 0; + int range = 0; + + if(req->headers.count("Range")) { + if(req->headers["Range"] == "bytes=0-1024") { + range = 1025; + } else { + skip = 1025; + } + } + if(req->args.count("decoder") && req->args.count("encoder")) { Decoder::p decoder = Decoder::get(req->args["decoder"], path.string()); Encoder::p encoder = Encoder::get(req->args["encoder"], decoder); @@ -256,6 +267,19 @@ void MusicTrack::render(HTTP::Connection::p req) { // TODO: Make an encoder-to-istream adapter to get rid of this: char data[0x10000]; std::streamsize size = 1; + + if(skip) { + size = encoder->read(data, skip); + } + + if(range) { + size = encoder->read(data, range); + if(size > 0) { + req->send_data(data, size); + } + return; + } + while(size) { size = encoder->read(data, 0x10000); if(size > 0) @@ -263,11 +287,14 @@ void MusicTrack::render(HTTP::Connection::p req) { } } else { + req->send_file(path); + /* fs::ifstream is(path, std::ios::in | std::ios::binary); is.seekg(0, std::ios::end); req->add_header("content-length", boost::str(boost::format("%d") % is.tellg())); is.seekg(0, std::ios::beg); req->send_data(is); + */ } } -- cgit v1.2.3