diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2011-03-02 22:25:09 +0100 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2011-03-02 22:25:09 +0100 |
commit | 0c2f90ee5c713fcb3aedb236fcebe7dd6d323ba3 (patch) | |
tree | 5cd273e39a9679afd75a97bdb2bb6d1f839b0dc9 /music.cpp | |
parent | 0649a5c78eeef6eba731ee1c698e18554cad5670 (diff) |
Add ability to serve parts of a file.
Diffstat (limited to 'music.cpp')
-rw-r--r-- | music.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
@@ -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); + */ } } |