summaryrefslogtreecommitdiffstats
path: root/play/index.php
diff options
context:
space:
mode:
authorKarl 'vollmerk' Vollmer <vollmer@ampache.org>2005-06-09 16:34:40 +0000
committerKarl 'vollmerk' Vollmer <vollmer@ampache.org>2005-06-09 16:34:40 +0000
commitbcad40a05ab2dc2a341a3227e30b96668bce4500 (patch)
tree6fca27588d53a1b24705bd2834e9e643bb729bd1 /play/index.php
downloadampache-bcad40a05ab2dc2a341a3227e30b96668bce4500.tar.gz
ampache-bcad40a05ab2dc2a341a3227e30b96668bce4500.tar.bz2
ampache-bcad40a05ab2dc2a341a3227e30b96668bce4500.zip
New Import
Diffstat (limited to 'play/index.php')
-rw-r--r--play/index.php282
1 files changed, 282 insertions, 0 deletions
diff --git a/play/index.php b/play/index.php
new file mode 100644
index 00000000..0091db10
--- /dev/null
+++ b/play/index.php
@@ -0,0 +1,282 @@
+<?php
+/*
+
+ Copyright (c) 2001 - 2005 Ampache.org
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+/*
+
+ This is the wrapper for opening music streams from this server. This script
+ will play the local version or redirect to the remote server if that be
+ the case. Also this will update local statistics for songs as well.
+
+*/
+
+$no_session = true;
+require_once('../modules/init.php');
+require_once(conf('prefix') . '/lib/Browser.php');
+
+
+/* These parameters has better come on the url. */
+$uid = htmlspecialchars($_REQUEST['uid']);
+$song_id = htmlspecialchars($_REQUEST['song']);
+$sid = htmlspecialchars($_REQUEST['sid']);
+
+/* Misc Housework */
+$dbh = dbh();
+$user = new User(0,$uid);
+
+if (conf('require_session') && !conf('xml_rpc')) {
+ if(!session_exists($sid)) {
+ die(_("Session Expired: please log in again at") . " " . conf('web_path') . "/login.php");
+ }
+
+ // Now that we've confirmed the session is valid
+ // extend it
+ extend_session($sid);
+}
+
+/* If we are in demo mode.. die here */
+if (conf('demo_mode') || !$user->has_access('25')) {
+ if (conf('debug')) {
+ log_event($user->usrename,' access_denied ', "Streaming Access Denied, " . conf('demo_mode') . "is the value of demo_mode. Current user level is $user->access");
+ }
+// access_denied();
+}
+
+/*
+ If they are using access lists let's make sure
+ that they have enough access to play this mojo
+*/
+if (conf('access_control')) {
+
+ $access = new Access(0);
+ if (!$access->check("25", $_SERVER['REMOTE_ADDR'])) {
+ if (conf('debug')) {
+ log_event($user->username,' access_denied ', "Streaming Access Denied, " . $_SERVER['REMOTE_ADDR'] . " does not have stream level access");
+ }
+ access_denied();
+ }
+
+} // access_control is enabled
+
+
+// require a uid and valid song
+if ( isset( $uid ) ) {
+ $song = new Song($song_id);
+ $song->format_song();
+
+ // Create the user object if possible
+
+ if (!$song->file OR ( !is_readable($song->file) AND $catalog->catalog_type != 'remote' ) ) {
+ if (conf('debug')) {
+ log_event($user->username,' file_not_found ',"Error song ($song->title) does not have a valid filename specified");
+ }
+ echo "Error: No Song";
+ exit;
+ }
+ if ($song->status === 'disabled') {
+ exit;
+ }
+ if ($user->access === 'disabled') {
+ if (conf('debug')) {
+ log_event($user->username,' user_disabled ',"Error $user->username is currently disabled, stream access denied");
+ }
+ echo "Error: User Disabled";
+ exit;
+ }
+ if (!$user->id && !$user->is_xmlrpc()) {
+ if (conf('debug')) {
+ log_event($user->username,' user_not_found ',"Error $user->id not found, stream access denied");
+ }
+ echo "Error: No User Found";
+ exit;
+ }
+
+}
+else {
+ if (conf('debug')) {
+ log_event("Unknown", ' user_not_found ',"Error no UID passed with URL, stream access denied");
+ }
+ echo "Error: No UID specified";
+ exit;
+}
+
+$catalog = new Catalog($song->catalog);
+
+if ( $catalog->catalog_type == 'remote' ) {
+ // redirect to the remote host's play path
+ header("Location: $song->file");
+}
+else {
+ if ($user->prefs['play_type'] == 'downsample') {
+ $ds = $user->prefs['sample_rate'];
+ }
+
+ // Update the users last seen
+ $user->update_last_seen();
+
+ // Garbage collection for stale entries in the now_playing table
+ $time = time();
+ $expire = $time - 900; // 86400 seconds = 1 day
+ $sql = "DELETE FROM now_playing WHERE start_time < $expire";
+ $db_result = mysql_query($sql, $dbh);
+
+ // If we are running in Legalize mode, don't play songs already playing
+ if (conf('lock_songs') == 'true') {
+ $sql = "SELECT COUNT(*) FROM now_playing" .
+ " WHERE song_id = '$song_id'";
+ $db_result = mysql_query($sql, $dbh);
+ while ($r = mysql_fetch_row($db_result)) {
+ if ($r[0] == 1) {
+ // Song is already playing, so exit without returning song
+ exit;
+ }
+ }
+ }
+
+ // Put this song in the now_playing table
+ $end_time = time() - $song->time;
+ $sql = "INSERT INTO now_playing (`song_id`, `user_id`, `start_time`)" .
+ " VALUES ('$song_id', '$uid', '$end_time')";
+ $db_result = mysql_query($sql, $dbh);
+ $lastid = mysql_insert_id($dbh);
+
+ // make fread binary safe
+ set_magic_quotes_runtime(0);
+
+ // don't abort the script if user skips this song because we need to update now_playing
+ ignore_user_abort(TRUE);
+
+ /* Format the Song Name */
+ if (conf('stream_name_format')) {
+ $song_name = conf('stream_name_format');
+ $song_name = str_replace("%basename",basename($song->file),$song_name);
+ $song_name = str_replace("%filename",$song->file,$song_name);
+ $song_name = str_replace("%type",$song->type,$song_name);
+ $song_name = str_replace("%catalog",$catalog->name,$song_name);
+ $song_name = str_replace("%A",$song->f_album_full,$song_name); // this and next could be truncated version
+ $song_name = str_replace("%a",$song->f_artist_full,$song_name);
+ $song_name = str_replace("%C",$catalog->path,$song_name);
+ $song_name = str_replace("%c",$song->comment,$song_name);
+ $song_name = str_replace("%g",$song->f_genre,$song_name);
+ $song_name = str_replace("%T",$song->track,$song_name);
+ $song_name = str_replace("%t",$song->title,$song_name);
+ $song_name = str_replace("%y",$song->year,$song_name);
+ }
+ else {
+ $song_name = $song->f_artist_full . " - " . $song->title . "." . $song->type;
+ }
+
+
+
+ // Send file, possible at a byte offset
+ $fp = @fopen($song->file, 'r');
+
+ if (!is_resource($fp)) {
+ if (conf('debug')) {
+ log_event($user->username,' file_read_error ',"Error: Unable to open $song->file for reading");
+ }
+ cleanup_and_exit($lastid);
+ }
+
+ $startArray = sscanf( $_SERVER[ "HTTP_RANGE" ], "bytes=%d-" );
+ $start = $startArray[0];
+
+ // Generate browser class for sending headers
+ $browser = new Browser();
+ header("Accept-Ranges: bytes" );
+ header("Content-Length: " . $song->size);
+
+ // Prevent the script from timing out
+ set_time_limit(0);
+
+ if ($ds) {
+ $ds = $user->prefs['sample_rate'];
+ $dsratio = $ds/$song->bitrate*1024;
+ $browser->downloadHeaders($song_name, $song->mime, false,$dsratio*$song->size);
+
+ /* Get Offset */
+ $offset = ( $start*$song->time )/( $dsratio*$song->size );
+ $offsetmm = floor($offset/60);
+ $offsetss = floor($offset-$offsetmm*60);
+ $offset = sprintf("%02d.%02d",$offsetmm,$offsetss);
+
+ /* Get EOF */
+ $eofmm = floor($song->time/60);
+ $eofss = floor($song->time-$eofmm*60);
+ $eof = sprintf("%02d.%02d",$eofmm,$eofss);
+
+ /* Replace Variables */
+ $downsample_command = conf('downsample_cmd');
+ $downsample_command = str_replace("%FILE%",$song->file,$downsample_command);
+ $downsample_command = str_replace("%OFFSET%",$offset,$downsample_command);
+ $downsample_command = str_replace("%EOF%",$eof,$downsample_command);
+ $downsample_command = str_replace("%SAMPLE%",$ds,$downsample_command);
+
+ // If we are debugging log this event
+ if (conf('debug')) {
+ $message = "Exec: $downsample_command";
+ log_event($user->username,'downsample',$message);
+ } // if debug
+
+ $fp = @popen($downsample_command, 'r');
+ } // if downsampling
+
+ elseif ($start) {
+ $browser->downloadHeaders($song_name, $song->mime, false, $song->size);
+ fseek( $fp, $start );
+ $range = $start ."-". $song->size . "/" . $song->size;
+ header("HTTP/1.1 206 Partial Content");
+ header("Content-Range: bytes=$range");
+ }
+ /* Last but not least pump em out */
+ else {
+ $browser->downloadHeaders($song_name, $song->mime, false, $song->size);
+ }
+
+
+ while (!feof($fp) && (connection_status() == 0)) {
+ print(fread($fp, 8192));
+ }
+
+ if ( ! $start ) {
+ $user->update_stats($song_id);
+ }
+
+ // If the played flag isn't set, set it
+ if (!$song->played) {
+ $sql = "UPDATE song SET played='1' WHERE id='$song->id'";
+ $db_results = mysql_query($sql, $dbh);
+ }
+
+ // Remove the song from the now_playing table
+ $sql = "DELETE FROM now_playing WHERE id = '$lastid'";
+ $db_result = mysql_query($sql, $dbh);
+
+ /* Clean up any open ends */
+ if ($ds) {
+ @pclose($fp);
+ }
+ else {
+ @fclose($fp);
+ }
+
+}
+
+?>