diff options
Diffstat (limited to 'modules/lib.php')
-rw-r--r-- | modules/lib.php | 1518 |
1 files changed, 1518 insertions, 0 deletions
diff --git a/modules/lib.php b/modules/lib.php new file mode 100644 index 00000000..735f579a --- /dev/null +++ b/modules/lib.php @@ -0,0 +1,1518 @@ +<?php +/* + + Copyright (c) 2004 ampache.org + All rights reserved. + + All of the main functions for Ampache. + FIXME: Remove this file... shouldn't be used anymore + +*/ + + +/* + * show_local_catalog_info() + * + */ +function show_local_catalog_info() { + global $settings, $username; + $dbh = dbh(); + + $query = "SELECT count(*) AS songs, SUM(size) AS size, SUM(time) as time FROM song"; + $db_result = mysql_query($query, $dbh); + $songs = mysql_fetch_array($db_result); + + $query = "SELECT count(*) FROM album"; + $db_result = mysql_query($query, $dbh); + $albums = mysql_fetch_row($db_result); + + $query = "SELECT count(*) FROM artist"; + $db_result = mysql_query($query, $dbh); + $artists = mysql_fetch_row($db_result); + + $sql = "SELECT count(*) FROM user"; + $db_result = mysql_query($sql, $dbh); + $users = mysql_fetch_row($db_result); + + $time = time(); + $last_seen_time = $time - 1200; + $sql = "SELECT count(DISTINCT s.username) FROM session AS s " . + "INNER JOIN user AS u ON s.username = u.id " . + "WHERE s.expire > " . $time . " " . + "AND u.last_seen > " . $last_seen_time; + $db_result = mysql_query($sql, $dbh); + $connected_users = mysql_fetch_row($db_result); + + $hours = floor($songs['time']/3600); + $size = $songs['size']/1048576; + + $days = floor($hours/24); + $hours = $hours%24; + + $time_text = "$days "; + $time_text .= ($days == 1) ? _("day") : _("days"); + $time_text .= ", $hours "; + $time_text .= ($hours == 1) ? _("hour") : _("hours"); + + if ( $size > 1024 ) { + $total_size = sprintf("%.2f", ($size/1024)); + $size_unit = "GB"; + } + else { + $total_size = sprintf("%.2f", $size); + $size_unit = "MB"; + } + + + print ' +<table class="border" cellspacing="1" cellpadding="3" width="100%" border="0"> + <tr class="table-header"> + <td colspan="2">' . _("Catalog Statistics") . '</td> + </tr> + <tr class="even"> + <td> ' . _("Total Users") . ' </td> + <td> <b>' . $users[0] .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Connected Users") . ' </td> + <td> <b>' . $connected_users[0] .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Albums") . ' </td> + <td> <b>' . $albums[0] .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Artists") . ' </td> + <td> <b>' . $artists[0] .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Songs") . ' </td> + <td> <b>' . $songs[0] .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Catalog Size") . ' </td> + <td> <b>' . $total_size .' ' . $size_unit .'</b> </td> + </tr> + <tr class="even"> + <td> ' . _("Catalog Time") . ' </td> + <td> <b>' . $time_text .'</b> </td> + </tr> +</table> +'; + +} // show_local_catalog_info() + + +/* + * get_popular_songs() + * + */ + +function get_popular_songs( $threshold, $type, $user_id = '' ) { + + $dbh = dbh(); + + if ( $type == 'your' ) { + $sql = "SELECT object_id FROM object_count" . + " WHERE object_type = 'song'" . + " AND userid = '$user_id'" . + " ORDER BY count DESC LIMIT $threshold"; + } + else { + $sql = "SELECT object_id FROM object_count" . + " WHERE object_type = 'song'" . + " ORDER BY count DESC LIMIT $threshold"; + } + + $db_result = mysql_query($sql, $dbh); + $songs = array(); + + while ( $id = mysql_fetch_array($db_result) ) { + $songs[] = $id[0]; + } + + return $songs; +} // get_popular_songs() + + +/* + * show_random_play() + * + */ + +function show_random_play() { + $web_path = conf('web_path'); + + print ' + <form name="random" method="post" enctype="multipart/form-data" action="' . $web_path . '/song.php"> + <input type="hidden" name="action" value="m3u" /> + <table class="border" border="0" cellpadding="3" cellspacing="1" width="100%"> + <tr class="table-header"> + <td colspan="4">' . _("Play Random Selection") . '</td> + + </tr> + <tr class="even"> + <td> + <table border="0"> + <tr class="even"> + <td>' . _("Item count") .'</td> + <td> + <select name="random"> + <option value="1">1</option> + <option value="5">5</option> + <option value="10">10</option> + <option value="20">20</option> + <option value="30">30</option> + <option value="50">50</option> + <option value="100">100</option> + <option value="500">500</option> + <option value="1000">1000</option> + <option value="-1">' . _("All") . '</option> + </select></td> + <td rowspan="3" valign="top"> ' . _("From genre") . '</td> + <td rowspan="3"> +'; + + show_genre_pulldown( -1, 0 ); + + print ' + </td></tr> + <tr class="even"> + <td> + ' . _("Favor Unplayed") . ' <br /> + ' . _("Full Albums") . ' <br /> + ' . _("Full Artist") . ' + </td> + <td> + <input type="checkbox" id="unplayed" name="unplayed" value="1" onclick="flipField(\'album\');flipField(\'artist\')" /><br /> + <input type="checkbox" id="album" name="full_album" value="1" onclick="flipField(\'unplayed\');flipField(\'artist\')" /><br /> + <input type="checkbox" id="artist" name="full_artist" value="1" onclick="flipField(\'unplayed\');flipField(\'album\')" /> + </td> + </tr> + <tr class="even"> + <td nowrap> ' . _("from catalog") . '</td> + <td> +'; + + show_catalog_pulldown( -1, 0); + + print ' + </tr> + <tr> + <td colspan="4"> + <input type="hidden" name="aaction" value="Play!" /> + <input class="button" type="submit" name="aaction" value="' . _("Play Random Songs") . '" /> + </td> + </tr> + </table> + </td></tr> + </table> + </form> +'; + +} // show_random_play() + + +/* + * show_artist_pulldown() + * + * Helper functions for album and artist functions + * + */ + +function show_artist_pulldown ($artist) { + + global $settings; + $dbh = dbh(); + + $query = "SELECT id,name FROM artist ORDER BY name"; + $db_result = mysql_query($query, $dbh); + echo "<select name=\"artist\">\n"; + + while ( $r = mysql_fetch_row($db_result) ) { + // $r[0] = id, $r[1] = name + if ( $artist == $r[0] ) { + echo "<option value=\"$r[0]\" selected=\"selected\">$r[1]</option>\n"; + } + else { + echo "<option value=\"$r[0]\">$r[1]</option>\n"; + } + } + + echo " </select>"; +} // show_artist_pulldown() + + +/* + * show_album_pulldown() + * + */ + +function show_album_pulldown ($album) { + + global $settings; + $dbh = dbh(); + + $sql = "SELECT id,name FROM album ORDER BY name"; + $db_result = mysql_query($sql, $dbh); + + echo "<select name=\"album\">\n"; + + while ( $r = mysql_fetch_row($db_result) ) { + // $r[0] = id, $r[1] = name + if ( $album == $r[0] ) { + echo "\t <option value=\"${r[0]}\" selected=\"selected\">".htmlspecialchars($r[1])."</option>\n"; + } + else { + echo "\t <option value=\"${r[0]}\">".htmlspecialchars($r[1])."</option>\n"; + } + }//while + + echo "</select>\n"; +} // show_album_pulldown() + + +/* + * show_flagged_popup($reason); + * + * Shows a listing of the flagged_types for when people want to mark + * a song as being broken in some way. + */ + +function show_flagged_popup($reason,$label='value', $name='flagged_type', $other='') { + + global $settings; + $dbh = dbh(); + + $access = $_SESSION['userdata']['access']; + + $query = "SELECT type,value FROM flagged_types"; + if ($access !== 'admin') { + $query .= " WHERE access = '$access'"; + } + $db_result = mysql_query($query, $dbh); + + echo "<select name=\"$name\" $other>\n"; + + while ( $r = mysql_fetch_array($db_result) ) { + // $r[0] = id, $r[1] = type + if ( $reason === $r['type'] ) { + echo "\t<option value=\"".$r['type']."\" selected=\"selected\">".$r[$label]."</option>\n"; + } + else { + echo "\t<option value=\"".$r['type']."\">".$r[$label]."</option>\n"; + } + } + + echo "</select>\n"; +} // show_flagged_popup() + + +/* + * show_genre_pulldown() + * + * Set complete=1 if you want the entire genre list + * + */ + +function show_genre_pulldown ($genre, $complete) { + global $settings; + $dbh = dbh(); + + // find the genres we have in use + if ( $complete ) { + $sql = "SELECT id FROM genre ORDER BY name"; + } + else { + $sql = "SELECT DISTINCT song.genre FROM genre, song" . + " WHERE song.genre = genre.id" . + " ORDER BY genre.name"; + } + + $db_result = mysql_query($sql, $dbh); + + echo "<select name=\"genre[]\" MULTIPLE size=\"7\">\n"; + + if ( ! $complete ) { + $genre_info = get_genre_info( -1 ); + if ( $genre == -1 ) { + echo " <option value=\"-1\" selected=\"selected\">${genre_info[0]} - (${genre_info[1]})</option>\n"; + } + else { + echo " <option value=\"-1\">${genre_info[0]} - (${genre_info[1]})</option>\n"; + } + } + + while ( $r = mysql_fetch_row($db_result) ) { + // $r[0] = genre id + list($genre_name, $genre_count) = get_genre_info($r[0]); + $genre_name = htmlspecialchars($genre_name); + + if ( $genre == $r[0] ) { + echo " <option value=\"${r[0]}\" selected=\"selected\">$genre_name - ($genre_count)</option>\n"; + } + else { + echo " <option value=\"${r[0]}\">$genre_name - ($genre_count)</option>\n"; + } + } + + echo "</select>"; +} // show_genre_pulldown() + +/* + * show_catalog_pulldown() + * + * Set complete=1 if you want the entire catalog list (including disabled) + * + */ + +function show_catalog_pulldown ($catalog, $complete) { + global $settings; + // find the genres we have in use + $sql = "SELECT id,name FROM catalog ORDER BY name"; + + $db_result = mysql_query($sql, dbh()); + + echo "<select name=\"catalog\">\n"; + + echo " <option value=\"-1\" selected=\"selected\">All</option>\n"; + + while ( $r = mysql_fetch_row($db_result) ) + { + // $r[0] = genre id + $catalog_name = htmlspecialchars($r[1]); + + if ( $catalog == $r[0] ) + { + echo " <option value=\"${r[0]}\" selected=\"selected\">$catalog_name</option>\n"; + } + else + { + echo " <option value=\"${r[0]}\">$catalog_name</option>\n"; + } + } + echo "</select>"; +} // show_catalog_pulldown() + + +/* + * update_counter() + * + * update what song/album/artist has just been played + * + */ + +function update_counter ($type, $id, $dbh=0) { + + global $settings; + if (!is_resource($dbh)) { + $dbh = dbh(); + } + + // from hopson: these queries will be very useful for generating overall statistics: + /* + SELECT song.title,SUM(object_count.count) FROM song,object_count WHERE object_count.object_type = 'song' AND object_count.object_id = song.id GROUP BY song.id; + + SELECT album.name,SUM(object_count.count) FROM album,object_count WHERE object_count.object_type = 'album' AND object_count.object_id = album.id GROUP BY album.id; + + SELECT artist.name,SUM(object_count.count) FROM artist,object_count WHERE object_count.object_type = 'artist' AND object_count.object_id = artist.id GROUP BY artist.id; + + SELECT playlist.name,SUM(object_count.count) FROM playlist,object_count WHERE object_count.object_type = 'playlist' AND object_count.object_id = playlist.id GROUP BY playlist.id; + */ + + if ( $type == 'song' ) { + $sql = "UPDATE $type SET times_played = times_played + 1 WHERE id = '$id'"; + } + else { + $sql = "UPDATE $type SET times_played = times_played + 1 WHERE id = '$id'"; + } + + $db_result = mysql_query($sql, $dbh); +} // update_counter() + + + +/* + * delete_user_stats() + * + * just delete stats for specific users or all of them + * + */ + +function delete_user_stats ($user) { + + $dbh = dbh(); + + if ( $user == 'all' ) { + $sql = "DELETE FROM object_count"; + } + else { + $sql = "DELETE FROM object_count WHERE userid = '$user'"; + } + $db_result = mysql_query($sql, $dbh); +} // delete_user_stats() + + +/* + * insert_flagged_song() + * + */ + +function insert_flagged_song($song, $reason, $comment) { + + $user = $_SESSION['userdata']['id']; + $time = time(); + $sql = "INSERT INTO flagged (user,song,type,comment,date)" . + " VALUES ('$user','$song', '$reason', '$comment', '$time')"; + $db_result = mysql_query($sql, dbh()); + +} // insert_flagged_song() + + +/* + * get_flagged(); + * + * Get all of the songs from the flagged table. These are songs that + * may or may not be broken. + * Deprecated by hopson on 7/27 + */ + +function get_flagged() { + + $dbh = dbh(); + + $sql = "SELECT flagged.id, user.username, type, song, date, comment" . + " FROM flagged, user" . + " WHERE flagged.user = user.id" . + " ORDER BY date"; + $db_result = mysql_query($sql, $dbh); + + $arr = array(); + + while ( $flag = mysql_fetch_object($db_result) ) { + $arr[] = $flag; + } + + return $arr; +} // get_flagged() + + +/* + * get_flagged_type($type); + * + * Return the text associated with this type. + */ + +function get_flagged_type($type) { + + $dbh = dbh(); + + $sql = "SELECT value FROM flagged_types WHERE type = '$type'"; + echo $sql; + $db_result = mysql_query($sql, $dbh); + + if ($flagged_type = mysql_fetch_object($db_result)) { + return $flagged_type->value; + } + else { + return FALSE; + } +} // get_flagged_type() + + +/* + * delete_flagged( $flag ); + * + */ + +function delete_flagged($flag) { + + $dbh = dbh(); + + $sql = "DELETE FROM flagged WHERE id = '$flag'"; + $db_result = mysql_query($sql, $dbh); +} // delete_flagged() + + +/*********************************************************/ +/* Functions for getting songs given artist, album or id */ +/*********************************************************/ +// TODO : albums should be always gruoped by +// id, like 'greatest hits' album is below, never by name. +// Other catalog functions should take care of assigning all +// songs with same name album to the same album id. It should +// not be done here. +// I'm commenting all this out to always sort by ID, to +// see how bad it is. -Rubin +function get_songs_from_album ($album) { + + global $settings; + $dbh = dbh(); + + $songs = array(); + + $query = "SELECT track, id as song FROM song" . + " WHERE album = '$album'" . + " ORDER BY track, title"; + + $db_result = mysql_query($query, $dbh); + + while ( $r = mysql_fetch_array($db_result) ) { + $songs[] = $r; + } + + return $songs; +} + + +function get_song_ids_from_album ($album) { + + $dbh = dbh(); + + $song_ids = array(); + + $query = "SELECT id FROM song" . + " WHERE album = '$album'" . + " ORDER BY track, title"; + + $db_result = mysql_query($query, $dbh); + + while ( $r = mysql_fetch_object($db_result) ) { + $song_ids[] = $r->id; + } + + return $song_ids; + +} + + +function get_song_ids_from_artist ($artist) { + + global $settings; + $dbh = dbh(); + + $song_ids = array(); + $artist = sql_escape($artist); + + $query = "SELECT id FROM song" . + " WHERE artist = '$artist'" . + " ORDER BY album, track"; + + $db_result = mysql_query($query, $dbh); + + while ( $r = mysql_fetch_object($db_result) ) { + $song_ids[] = $r->id; + } + + return $song_ids; +} + + +/* + * get_song_ids_from_artist_and_album(); + * + * Get all of the songs that are from this album and artist + * + */ +function get_song_ids_from_artist_and_album ($artist, $album) { + + global $settings; + $dbh = dbh(); + + $sql = "SELECT id FROM song" . + " WHERE artist = '$artist'" . + " AND album = '$album'" . + " ORDER BY track, title"; + $db_result = mysql_query($sql, $dbh); + + $song_ids = array(); + + while ( $r = mysql_fetch_object($db_result) ) { + $song_ids[] = $r->id; + } + + return $song_ids; +} + + +// Used by playlist functions when you have an array of something of type +// and you want to extract the songs from it whether type is artists or albums +function get_songs_from_type ($type, $results, $artist_id = 0) { + + $dbh = dbh(); + + $count = 0; + $song = array(); + + foreach ($results as $value) { + + // special case from the album view where we don't want every orphan + if ($type == 'album' && ($value == 'orphans' || $artist_id != 0)) { + $sql = "SELECT id FROM song WHERE $type = '$value' AND artist = '$artist_id'"; + $db_result = mysql_query($sql, $dbh); + } + else { + $sql = "SELECT id FROM song WHERE $type = '$value'"; + $db_result = mysql_query($sql, $dbh); + } + + while ( $r = mysql_fetch_row($db_result) ) { + $song[$count] = $r[0]; + $count++; + } + } + return $song; +} + + +/*********************************************************/ +/* This is the main song display function. I found tieing it to the playlist functions + was really handy in getting added functionality at no cost. +/* Lets tie it to album too, so we can show art ;) */ +/*********************************************************/ +function show_songs ($song_ids, $playlist_id=0, $album=0) { + + $dbh = dbh(); + + // Get info about current user + $user = new User($_SESSION['userdata']['username']); + + // Get info about playlist owner + if (isset($playlist_id) && $playlist_id != 0) { + $sql = "SELECT owner FROM playlist WHERE id = '$playlist_id'"; + $db_result = mysql_query($sql, $dbh); + if ($r = mysql_fetch_array($db_result)) { + $pluser = get_user_byid($r[0]); + } + } + + $totaltime = 0; + $totalsize = 0; + + require (conf('prefix') . "/templates/show_songs.inc"); + + return TRUE; + +}// function show_songs + + + +function show_playlist_form () { + + print <<<ECHO +<table cellpadding="5" class="tabledata"> + <tr align="center" class="odd"> + <td> + <input type="button" name="select_all" value="Select All" onclick="this.value=check_results()" /> + </td> + <td> Playlist:</td> + <td> + <input name="action" class="button" type="submit" value="Add to" /> +ECHO; + + show_playlist_dropdown(); + + print <<<ECHO + <input name="action" class="button" type="submit" value="View" /> + <input name="action" class="button" type="submit" value="Edit" /> + + </td> + </tr> + <tr align="center" class="even"> + <td colspan="6"> + <input name="action" class="button" type="submit" value="Play Selected" /> + </td> + </tr> +</table> +ECHO; + +} + + +function get_artist_name ($artist, $dbh=0) { + + global $settings; + if (!is_resource($dbh)) { + $dbh = dbh(); + } + + $query = "SELECT name FROM artist WHERE id = '$artist'"; + $db_result = mysql_query($query, $dbh); + + if ($r = mysql_fetch_object($db_result)) { + return $r->name; + } + else { + return FALSE; + } +} + + +function get_artist_info ($artist_id) { + + $dbh = dbh(); + + $sql = "SELECT * FROM artist WHERE id = '$artist_id'"; + $db_result = mysql_query($sql, $dbh); + if ($info = mysql_fetch_array($db_result)) { + $sql = "SELECT COUNT(song.album) FROM song " . + " WHERE song.artist = '$artist_id'" . + " GROUP BY song.album"; + $db_result = mysql_query($sql, $dbh); + + $albums = 0; + $songs = 0; + while(list($song) = mysql_fetch_row($db_result)) { + $songs += $song; + $albums++; + } + $info['songs'] = $songs; + $info['albums'] = $albums; + //FIXME: Lame place to put this + //if ($songs < conf('min_artist_songs') || $albums < conf('min_artist_albums')) { + // return FALSE; + //} + return $info; + } + else { + return FALSE; + } +} + + +function get_artist_from_album ($album_id) { + + global $settings; + $dbh = dbh(); + + $query = "SELECT DISTINCT artist.id, artist.name FROM artist,song" . + " WHERE song.album = '$album_id' AND song.artist = artist.id"; + $db_result = mysql_query($query, $dbh); + $r = mysql_fetch_object($db_result); + return $r; +} + + +function get_artist_name_from_song ($song_id) { + + $dbh = dbh(); + + $sql = "SELECT artist.name AS name FROM artist, song" . + " WHERE artist.id = song.artist" . + " AND song.id = '$song_id'"; + $db_result = mysql_query($sql, $dbh); + + if ($r = mysql_fetch_object($db_result)) { + return $r->name; + } + else { + return FALSE; + } +} + + +function get_album_name ($album, $dbh = 0) { + + $album = new Album($album); + return $album->name; +} // get_album_name + + +function get_genre_info($genre_id) { + + global $settings; + $dbh = dbh(); + + $sql = "SELECT name FROM genre WHERE id = '$genre_id'"; + $db_result = mysql_query($sql, $dbh); + + // if its -1 then we're doing all songs + if ( $genre_id < 0 ) { + $sql = "SELECT count(*) FROM song"; + } + else { + $sql = "SELECT count(*) FROM song WHERE genre = '$genre_id'"; + } + + $genre_result = mysql_query($sql, $dbh); + + $genre_count = mysql_fetch_row($genre_result); + + $r = mysql_fetch_row($db_result); + + // Crude hack for non-standard genre types + if ($genre_id == -1) { + return array('All', $genre_count[0]); + } + elseif ($genre_id == 0) { + return array('N/A', $genre_count[0]); + } + else { + return array($r[0], $genre_count[0]); + } +} + + +function get_genre($id) { + + global $settings; + $dbh = dbh(); + + $query = "SELECT * FROM genre WHERE id = '$id'"; + $db_result = mysql_query($query, $dbh); + + $r = mysql_fetch_object($db_result); + return $r; +} + + +// Utility function to help move things along +function get_song_info ($song, $dbh = 0) { + + $song = new Song($song); + return $song; + +} // get_song_info + + +/*! + @function show_albums + @discussion show many albums, uses view class +*/ +function show_albums ($albums,$view=0) { + + $dbh = libglue_param(libglue_param('dbh_name')); + + if (!$view) { + $view = new View($_SESSION['view_base_sql'], $_SESSION['script'], $total_items,$_SESSION['view_offset_limit']); + } + + if ($albums) { + require (conf('prefix') . "/templates/show_albums.inc"); + } + else { + echo "<p><font color=\"red\">No Albums Found</font></p>"; + } + +} // show_albums + + +// Had to tweak this so it would show both public and private playlists +// Defaults to showing both although you could pass type=private|adminprivate|public +// to see only those +function show_playlists ($type = 'all') { + + $dbh = dbh(); + + $user = $GLOBALS['user']; + + $web_path = conf('web_path'); + + // mapping of types to pretty names + $typemap = array( "public" => _("Public"), + "private" => _("Your Private"), + "adminprivate" => _("Other Private") + ); + + if ($type == 'all') { + show_playlists('private'); + if ( $user->access === 'admin' ) { + show_playlists('adminprivate'); + } + show_playlists('public'); + return true; + } + elseif ($type == 'public') { + $sql = "SELECT id,name,owner,date ". + " FROM playlist ". + " WHERE type='public'". + " ORDER BY name"; + } + elseif ($type == 'private') { + $sql = "SELECT id,name,owner,date ". + " FROM playlist ". + " WHERE type='private'" . + " AND owner = '$user->id'" . + " AND name <> 'Temporary'". + " ORDER BY name"; + } + elseif ($type == 'adminprivate') { + if ( $user->access === 'admin' ) { + $sql = "SELECT id,name,owner,date ". + " FROM playlist ". + " WHERE type='private'" . + " AND owner != '$user->id'" . + " AND name <> 'Temporary'". + " ORDER BY name"; + } + else { + // No admin access + $sql = 'SELECT 1+1'; + } + } + else { + echo "** Error ** Call to show_playlists with unknown type $type ". + "in file ".$_SERVER['PHP_SELF']." ** <br />\n"; + $sql = 'SELECT 1+1'; + } + + $db_result = mysql_query($sql, $dbh); + + print <<<ECHO +<h3>$typemap[$type] Playlists</h3> + +<table class="tabledata" cellspacing="0" cellpadding="0" border="0"> + <tr class="table-header"> + <th>Playlist Name</th> + <th># Songs</th> + <th>Owner</th> + <th colspan="6">Actions</th> + </tr> + +ECHO; + + flip_class(array('even','odd')); + + if ( mysql_num_rows($db_result) ) { + while ( $r = mysql_fetch_array($db_result) ) { + $plname = $r['name']; + $plid = $r['id']; + $pluser = get_user_byid($r['owner']); + $plfullname = $pluser->fullname; + $plowner = $pluser->username; + + // find out how many songs in this playlist + $count_query = "SELECT count(*) ". + " FROM playlist_data ". + " WHERE playlist = '$plid'"; + $count_result = mysql_query($count_query, $dbh); + list($count) = mysql_fetch_row($count_result); + $class = flip_class(); + echo " <tr class=\"$class\">\n"; + echo " <td><a href=\"$web_path/playlist.php?playlist_id=$plid&action=view_list\">$plname</a></td>\n"; + echo " <td>$count</td>\n"; + echo " <td>$plfullname</td>\n"; + echo " <td><a href=\"$web_path/playlist.php?playlist_id=$plid&action=view_list\">" . _("View") . "</a></td>\n"; + + if ($user->id == $pluser->id || $user->access === 'admin') { + echo " <td><a href=\"$web_path/playlist.php?playlist_id=$plid&action=edit\">" . _("Edit") . "</a></td>\n"; + echo " <td><a href=\"$web_path/playlist.php?playlist_id=$plid&action=delete_playlist\">" . _("Delete") . "</a></td>\n"; + } + else { + echo " <td> </td>\n"; + echo " <td> </td>\n"; + } + + if ( $count[0] ) { + echo " <td><a href=\"$web_path/song.php?action=m3u&playlist_id=$plid\">" . _("Play") . "</a> | " . + "<a href=\"$web_path/song.php?action=random&playlist_id=$plid\">" . _("Random") . "</a></td>\n"; + } + else { + echo " <td> </td>\n"; + } + if( batch_ok() ) { + echo" <td><a href=\"$web_path/batch.php?action=pl&id=$plid\">" . _("Download") . "</a></td>\n"; + } else { + echo" <td> </td>\n"; + } + + echo " </tr>\n"; + } + echo "</ul>\n"; + } //if rows in result + else { + echo " <tr class=\"even\">\n"; + echo " <td colspan=\"7\">" . _("There are no playlists of this type") . "</td>\n"; + echo " </tr>\n"; + } + + echo "</table>\n"; + echo "<br>\n"; + +} + +function get_playlist_track_from_song ( $playlist_id, $song_id ) { + + $dbh = dbh(); + + $sql = "SELECT track FROM playlist_data" . + " WHERE playlist = '$playlist_id'" . + " AND song = '$song_id'"; + $db_result = mysql_query($sql, $dbh); + if ($r = mysql_fetch_array($db_result)) { + return $r[0]; + } + else { + return FALSE; + } +} + +//FIXME: Pull this and put it in a template +function show_playlist_create () { + + $web_path = conf('web_path'); + + print <<<ECHO +<form name="songs" method="post" action="$web_path/playlist.php"> +<table class="border"><tr class="table-header"><td colspan="2" align="center"> +ECHO; + +print _("Create a new playlist"); + print <<<ECHO + </td> + </tr> + <tr class="even"> + <td align="left"> Name: </td> + <td align="left"><input type="text" name="playlist_name" size="20" /></td> + </tr> + <tr class="odd"> + <td align="left"> Type: </td> + <td align="left"> + <select name="type"> + <option value="private"> Private </option> + <option value="public"> Public </option> + </select> + </td> + </tr> + <tr class="even"> + <td align="left"> </td> + <td align="left"> + <input type="submit" name="action" value="Create" /> + <input type="reset" name="Reset" /> + </td> + </tr> +</table> +</form> + +ECHO; + +} + + +function show_playlist_edit ( $playlist ) { + + $username = $_SESSION['userdata']['username']; + if (check_playlist_access($playlist->id,$username) == false) { + show_playlist_access_error($playlist, $username); + return; + } + + $plname = $playlist->name; + $self = $_SERVER['PHP_SELF']; + + print <<<ECHO +<form name="songs" method="post" action="$self"> +<input type="hidden" name="playlist_id" value="$playlist->id" /> +<table class="border"> + <tr class="table-header"> + <td colspan="2">Editing Playlist</td> + </tr> + <tr> + <td align="left"> Name: </td> + <td align="left"> + <input type="text" name="new_playlist_name" value="$plname" size="20" /> + </td> + </tr> + <tr> + <td align="left"> Type: </td> + <td align="left"> + <select name="type"> +ECHO; + + if ($playlist->type == 'public') { + echo "<option value=\"public\" selected=\"selected\">Public</option>"; + } + else { + echo "<option value=\"public\">Public</option>"; + } + + if ($playlist->type == 'private') { + echo "<option value=\"private\" selected=\"selected\">Private</option>"; + } + else { + echo "<option value=\"private\">Private</option>"; + } + + print <<<ECHO + </select> + </td> + </tr> + <tr> + <td align="left"> </td> + <td align="left"> + <input type="submit" name="action" value="Update" /> + </td> + </tr> +</table> +</form> +ECHO; + +} + + +// See if this user has access to work on this list +function check_playlist_access ($playlist_id, $username) { + + $dbh = dbh(); + + $sql = "SELECT playlist.id FROM playlist, user" . + " WHERE playlist.id = '$playlist_id'" . + " AND playlist.owner = user.id" . + " AND user.username = '$username'"; + $db_result = mysql_query($sql, $dbh); + + if ( mysql_num_rows($db_result) == 1) { + return TRUE; + } + else { + if (!conf('use_auth')) { + return TRUE; + } + // check to see if this user is an admin + if ($user = get_user($username)) { + if ( $user->access == 'admin' ) { + return TRUE; + } + } + } + + // If we get here, access is denied + return FALSE; + +} + + +function show_playlist_dropdown ($playlist_id=0) { + + global $settings; + $dbh = dbh(); + + $userid = scrub_in($_SESSION['userdata']['id']); + $sql = "SELECT * FROM playlist" . + " WHERE owner = '$userid'" . + " AND name <> 'Temporary'" . + " ORDER BY name"; + $db_result = @mysql_query($sql, $dbh); + + print <<<ECHO +<select name="playlist_id"> +<option value="0"> -New Playlist- </option> + +ECHO; + + while ( $r = @mysql_fetch_object($db_result) ) { + if ( $playlist_id == $r->id ) { + echo "<option value=\"" . $r->id . "\" selected=\"selected\">" . $r->name . "</option>\n"; + } + else { + echo "<option value=\"" . $r->id . "\">" . $r->name . "</option>\n"; + } + } + echo "</select>\n"; +} + + +// Used to show when we have an access error for a playlist +function show_playlist_access_error ($playlist, $username) { + + $plname = $playlist->name; + $pluser = new User($playlist->owner); + $plowner = $pluser->username; + + print <<<ECHO +<p style="font: 12px bold;"> Playlist Access Error </p> +<p>$username doesn't have access to update the '$plname' playlist, it is owned by $plowner.</p> + +ECHO; + +} + + +// Used to show a form with confirm action button on it (for deleting playlists, users, etc) +/*! + @function show_confirm_action + @discussion shows a confirmation of an action, gives a YES/NO choice +*/ +function show_confirm_action ($text, $script, $arg) { + + $web_path = conf('web_path'); + require (conf('prefix') . "/templates/show_confirm_action.inc.php"); + +} // show_confirm_action + + +// search functions +function search_by_type ($type, $search) { + + $dbh = dbh(); + + // supported types are album, artist and song + if ( $type == 'Album' ) { + $query = "SELECT id FROM album WHERE name LIKE '%$search%'"; + } + elseif ( $type == 'Artist' ) { + $query = "SELECT id FROM artist WHERE name LIKE '%$search%'"; + } + elseif ( $type == 'Song title' ) { + $query = "SELECT id FROM song WHERE title LIKE '%$search%'"; + } + elseif ( $type == 'Genre' ) { + $query = "SELECT song.id as id FROM song, genre" . + " WHERE song.genre = genre.id" . + " AND genre.name LIKE '%$search%'"; + } + + $db_result = mysql_query($query, $dbh); + + $search_result = array(); + + while ( $r = mysql_fetch_array($db_result) ) { + $search_result[] = $r; + } + + return ($search_result); +} + + +function get_global_popular($type) { + + global $settings; + $dbh = dbh(); + + $sql = "SELECT object_id, SUM(count) as count FROM object_count" . + " WHERE object_type = '$type'" . + " GROUP BY object_id" . + " ORDER BY count DESC LIMIT " . conf('popular_threshold'); + $db_result = mysql_query($sql, $dbh); + + $items = array(); + $web_path = conf('web_path'); + + while ( $r = @mysql_fetch_object($db_result) ) { + if ( $type == 'song' ) { + $song = new Song($r->object_id); + $artist = $song->get_artist_name(); + $text = "$artist - $song->title"; + /* Add to array */ + $items[] = "<li> <a href=\"$web_path/song.php?action=m3u&song=$song->id\" title=\"$text\">" . truncate_with_ellipse($text, conf('ellipse_threshold_title')+3) . " ($r->count)</a> </li>"; + + } // if it's a song + + elseif ( $type == 'artist' ) { + $artist = get_artist_name($r->object_id); + if ($artist) { + $items[] = "<li> <a href=\"$web_path/artists.php?action=show&artist=$r->object_id\" title=\"$artist\">" . truncate_with_ellipse($artist, conf('ellipse_threshold_artist')+3) . " ($r->count)</a> </li>"; + } // if no artist found + } // if type isn't artist + elseif ( $type == 'album' ) { + $album = new Album($r->object_id); + if ($album) { + $items[] = "<li> <a href=\"$web_path/albums.php?action=show&album=$r->object_id\" title=\"$album->name\">" . truncate_with_ellipse($album->name,conf('ellipse_threshold_album')+3) . " ($r->count)</a> </li>"; + } + } + } // end while + + return $items; +} + + +// Get a list of newest $type (which can then be handed to show_info_box +function get_newest ($type = 'artist') { + + $dbh = dbh(); + + if (conf('popular_threshold') < 1) { conf(array('popular_threshold'=>'10'),1); } + + $sql = "SELECT DISTINCT $type FROM song ORDER BY addition_time " . + "DESC LIMIT " . conf('popular_threshold'); + $db_result = mysql_query($sql, $dbh); + + $items = array(); + $web_path = conf('web_path'); + + while ( $item = mysql_fetch_row($db_result) ) { + if ( $type == 'artist' ) { + $artist = new Artist($item[0]); + $artist->format_artist(); + $items[] = "<li>" . $artist->link . "</li>\n"; + } + elseif ( $type == 'album' ) { + $album = new Album($item[0]); + $album->format_album(); + $items[] = "<li>" . $album->f_name . "</li>"; + } + } + return $items; +} + + +function show_info_box ($title, $type, $items) { + + $web_path = conf('web_path'); + $popular_threshold = conf('popular_threshold'); + + echo "<table class=\"border\" cellspacing=\"1\" cellpadding=\"3\" width=\"100%\" border=\"0\">"; + echo " <tr class=\"table-header\">"; + + + if ($type == 'your_song') { + echo "<td>$title - <a href=\"$web_path/song.php?action=m3u&your_popular_songs=$popular_threshold\">Play</a></td>\n"; + } + elseif ($type == 'song') { + echo "<td>$title - <a href=\"$web_path/song.php?action=m3u&popular_songs=$popular_threshold\">Play</a></td>\n"; + } + else { + echo "<td>$title</td>\n"; + } + + print <<<ECHO + </tr> + <tr class="even"> + <td align="left"> + <ol> + +ECHO; + + foreach ($items as $item) { + echo "$item\n"; + } + + print <<<ECHO + </ol> + </td> + </tr> +</table> + +ECHO; + +} + + +/* + * show_add_user() + * + */ + +function show_add_user () { + + global $error_color; + + $web_path = conf('web_path'); + + print <<<ECHO +<h3> 2. Add the Admin user for Ampache </h3> +<p><font color="$error_color">$error_text</font></p> +<p>This will be the administration user to get you started. You can delete/chage it later. </p> +<form name="user" method="post" action="$web_path/setup.php"> +<table border="0" cellpadding="2" cellspacing="0"> + <tr> + <td>Username:</td> + <td><input type="text" name="username" value="" size="30" /></td> + </tr> + <tr> + <td>Fullname:</td> + <td><input type="text" name="fullname" value="" size="30" /></td> + </tr> + <tr> + <td>Password:</td> + <td><input type="password" name="password_1" value="" size="30" /></td> + </tr> + <tr> + <td>Password: (again)</td> + <td><input type="password" name="password_2" value="" size="30" /></td> + </tr> +</table> +<input type="hidden" name="step" value="user" /><br /> +<input type="hidden" name="step_text" value="Add the Admin user for Ampache" /><br /> +<input type="submit" name="action" value="Add the Admin User" /><br /> +</form> +ECHO; + +} // show_add_user() + + +function scrub_out($str) { + + return stripslashes($str); +} + + +function unhtmlentities ($string) { + + $trans_tbl = get_html_translation_table (HTML_ENTITIES); + $trans_tbl = array_flip ($trans_tbl); + $ret = strtr ($string, $trans_tbl); + return preg_replace('/&#(\d+);/me', "chr('\\1')",$ret); +} + + +function insert_album($album) { + + global $settings; + $dbh = dbh(); + + preg_match("/^(A |An |The ){0,1}(.*?)$/i",$album, $matches); + $album = sql_escape($matches[2]); + + switch($matches[1]) { + case 'The ': + case 'the ': + $prefix = 'The'; + break; + case 'A ': + case 'a ': + $prefix = 'A'; + break; + case 'An ': + case 'an ': + $prefix = 'An'; + break; + default: + $prefix = ''; + } + + $sql = "INSERT INTO album (name, prefix)" . + " VALUES ( '$album', '$prefix' )"; + $db_result = mysql_query($sql, $dbh); + + return (mysql_insert_id($dbh)); +} // insert_album + + +/* + * insert_artist() + * + */ + +function insert_artist($artist) { + + global $settings; + $dbh = dbh(); + + $matches = array(); + $var = preg_match('/^(A |An |The ){0,1}(.*?)$/i',$artist, $matches); + $artist = sql_escape($matches[2]); + + switch($matches[1]) { + case 'The ': + case 'the ': + $prefix = 'The'; + break; + case 'A ': + case 'a ': + $prefix = 'A'; + break; + case 'An ': + case 'an ': + $prefix = 'An'; + break; + default: + $prefix = ''; + } + + $sql = "INSERT INTO artist (name, prefix)" . + " VALUES ( '$artist', '$prefix' )"; + $db_result = mysql_query($sql, $dbh); + return (mysql_insert_id($dbh)); +} // insert_artist +?> |