summaryrefslogtreecommitdiffstats
path: root/play/index.php
diff options
context:
space:
mode:
authorPaul Arthur <flowerysong00@yahoo.com>2013-01-21 11:56:56 -0500
committerPaul Arthur <paul.arthur@flowerysong.com>2013-01-23 13:11:16 -0500
commit9340ff287c01eb9e5ebd0301dc9988f3536221dc (patch)
treecaabe3705c6d7bbb58bee4aa797d2750c8980712 /play/index.php
parent37e09a642828a06a5f19a547729f40b7e2433772 (diff)
downloadampache-9340ff287c01eb9e5ebd0301dc9988f3536221dc.tar.gz
ampache-9340ff287c01eb9e5ebd0301dc9988f3536221dc.tar.bz2
ampache-9340ff287c01eb9e5ebd0301dc9988f3536221dc.zip
Rework transcoding
Remove some of the roundabout complexity that had built up. Push people toward using a single, flexible tool for most of their transcoding needs. Increase backend and configuration flexibility to support user-requested format changes (e.g. for an HTML5 player); this functionality is not yet exposed.
Diffstat (limited to 'play/index.php')
-rw-r--r--play/index.php69
1 files changed, 45 insertions, 24 deletions
diff --git a/play/index.php b/play/index.php
index 86932f81..3909c234 100644
--- a/play/index.php
+++ b/play/index.php
@@ -309,32 +309,49 @@ if (Config::get('track_user_ip')) {
$GLOBALS['user']->insert_ip_history();
}
-$downsample_remote = false;
+$force_downsample = false;
if (Config::get('downsample_remote')) {
if (!Access::check_network('network', $GLOBALS['user']->id,'0')) {
- debug_event('downsample', 'Address ' . $_SERVER['REMOTE_ADDR'] . ' is not in a network defined as local', 5);
- $downsample_remote = true;
+ debug_event('play', 'Downsampling enabled for non-local address ' . $_SERVER['REMOTE_ADDR'], 5);
+ $force_downsample = true;
}
}
-// If they are downsampling, or if the song is not a native stream or it's non-local
-if (((Config::get('transcode') == 'always' && !$video) ||
- !$media->native_stream() ||
- $downsample_remote) && Config::get('transcode') != 'never') {
- debug_event('downsample',
- 'Decided to transcode. Transcode:' . Config::get('transcode') .
- ' Native Stream: ' . ($media->native_stream() ? 'true' : 'false') .
- ' Remote: ' . ($downsample_remote ? 'true' : 'false'), 5);
+// Determine whether to transcode
+$transcode = false;
+$transcode_cfg = Config::get('transcode');
+$valid_types = $media->get_stream_types();
+if ($transcode_cfg != 'never' && in_array('transcode', $valid_types)) {
+ if ($transcode_cfg == 'always') {
+ $transcode = true;
+ debug_event('play', 'Transcoding due to always', 5);
+ }
+ else if ($force_downsample) {
+ $transcode = true;
+ debug_event('play', 'Transcoding due to downsample_remote', 5);
+ }
+ else if (!in_array('native', $valid_types)) {
+ $transcode = true;
+ debug_event('play', 'Transcoding because native streaming is unavailable', 5);
+ }
+ else {
+ debug_event('play', 'Decided not to transcode', 5);
+ }
+}
+
+if ($transcode) {
header('Accept-Ranges: none');
- $media->set_transcode();
- $fp = Stream::start_transcode($media, $media_name, $start);
- $media_name = $media->f_artist_full . " - " . $media->title . "." . $media->type;
- $transcoded = true;
-} // end if downsampling
+ $transcoder = Stream::start_transcode($media);
+ $fp = $transcoder['handle'];
+ $media_name = $media->f_artist_full . " - " . $media->title . "." . $transcoder['format'];
+}
+else if (!in_array('native', $valid_types)) {
+ debug_event('play', 'Not transcoding and native streaming is not supported, aborting', 2);
+ exit();
+}
else {
header('Accept-Ranges: bytes');
$fp = fopen($media->file, 'rb');
- $transcoded = false;
}
if (!is_resource($fp)) {
@@ -347,7 +364,7 @@ if (get_class($media) == 'Song') {
Stream::insert_now_playing($media->id,$uid,$media->time,$sid,get_class($media));
}
-if ($transcoded) {
+if ($transcode) {
$stream_size = null;
}
else {
@@ -368,8 +385,8 @@ if ($start > 0 || $end > 0 ) {
$stream_size = $media->size - $start;
}
- if ($transcoded) {
- debug_event('play', 'Bad client behaviour. Content-Range header received, which we cannot fulfill due to transcoding', 1);
+ if ($transcode) {
+ debug_event('play', 'Bad client behaviour. Content-Range header received, which we cannot fulfill due to transcoding', 2);
$stream_size = null;
}
else {
@@ -385,19 +402,23 @@ else {
debug_event('play','Starting stream of ' . $media->file . ' with size ' . $media->size, 5);
}
-$browser->downloadHeaders($media_name, $media->mime, false, $stream_size);
+$mime = $transcode
+ ? $media->type_to_mime($transcoder['format'])
+ : $media->mime;
+
+$browser->downloadHeaders($media_name, $mime, false, $stream_size);
$bytes_streamed = 0;
// Actually do the streaming
do {
- $read_size = $transcoded
+ $read_size = $transcode
? 2048
: min(2048, $stream_size - $bytes_streamed);
$buf = fread($fp, $read_size);
print($buf);
$bytes_streamed += strlen($buf);
-} while (!feof($fp) && (connection_status() == 0) && ($transcoded || $bytes_streamed < $stream_size));
+} while (!feof($fp) && (connection_status() == 0) && ($transcode || $bytes_streamed < $stream_size));
$real_bytes_streamed = $bytes_streamed;
// Need to make sure enough bytes were sent.
@@ -439,7 +460,7 @@ else {
// We do this regardless of play amount.
if ($demo_id) { $democratic->delete_from_oid($oid,'song'); }
-if ($transcoded) {
+if ($transcode) {
pclose($fp);
}
else {