summaryrefslogtreecommitdiff
path: root/music.cpp
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2011-03-02 22:25:09 +0100
committerVegard Storheil Eriksen <zyp@jvnv.net>2011-03-02 22:25:09 +0100
commit0c2f90ee5c713fcb3aedb236fcebe7dd6d323ba3 (patch)
tree5cd273e39a9679afd75a97bdb2bb6d1f839b0dc9 /music.cpp
parent0649a5c78eeef6eba731ee1c698e18554cad5670 (diff)
Add ability to serve parts of a file.
Diffstat (limited to 'music.cpp')
-rw-r--r--music.cpp31
1 files changed, 29 insertions, 2 deletions
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);
+ */
}
}