summaryrefslogtreecommitdiff
path: root/music.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'music.cpp')
-rw-r--r--music.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/music.cpp b/music.cpp
index 51c44a8..712a461 100644
--- a/music.cpp
+++ b/music.cpp
@@ -169,23 +169,60 @@ MusicDirectory::MusicDirectory(const fs::path root) {
}
void MusicTrack::render(HTTP::Connection::p req) {
- req->add_header("content-type", "application/octet-stream");
+<<<<<<< HEAD
+ req->add_header("Content-Type", "audio/mpeg");
fs::path file_path = path;
-
+
+ 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);
-
+
EncodedCache ec(path, decoder, encoder);
file_path = ec.get_path();
if(!fs::exists(file_path))
ec.create_cache();
+ // 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)
+ req->send_data(data, size);
+ }
}
+ req->send_file(path);
+
+ /*
fs::ifstream is(file_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);
+ */
}