|
Programming Guru
Join Date: Oct 2004
Posts: 1,041
Rep Power: 5 
|
<?php
/*
My PHP Shared Music Collection, v1.
By, Brett Bryant
-- Written and tested under linux --
Released under the GPL v2 (11/15/04)
under terms of disclaimer defined below.
DISCLAIMER:
Im not responsibile if you put copyrighted
mp3 in the directory that my program accesses
and then distributes...
...blah blah blah. Anyway, basically what this
program does is allows you to set a directory,
username and password and share this directory's
mp3 content with the world. After selecing which MP3's
they want they will get a personalized zip file with
the contents of their selections.
NOTE:
You must edit the php.ini maximum memory limit and
set it to an extremely large MB size for this
script to work...
*/
$_CONFIG = array();
$_CONFIG['dir'] = "/home/tempest/music"; // This is the dir that the
// MP3's will be found
$_CONFIG['user'] = ""; // This is the username
// for the auth screen
$_CONFIG['pass'] = ""; // This is the password
// for the Collection, v1.
By, Brett Bryant
Released under the GPL v2 (11/15/04)
under terms of disclaimer defined below.
DISCLAIMER:
Im not responsibile if you put copyrighted
mp3 in the directory that my program accesses
and then distributes...
...blah blah blah. Anyway, basically what this
program does is allows you to set a directory,
username and password and share this directory's
mp3 content with the world. After selecing which MP3's
they want they will get a personalized zip file with
the contents of their selections.
NOTE:
You must edit the php.ini maximum memory limit and
set it to an extremely large MB size for this
script to work...
*/
$_CONFIG = array();
$_CONFIG['dir'] = "/home/tempest/music"; // This is the dir that the
// MP3's will be found
$_CONFIG['user'] = ""; // This is the username
// for the auth screen
$_CONFIG['pass'] = ""; // This is the password
// for the auth screen
#######################################
## DO NOT EDIT BELOW THIS LINE.... ##
## that is of course unless you ##
## wont mess anything up... ##
#######################################
$_CONFIG['dir'] .= (substr($_CONFIG['dir'], -1) == "/")?"":"/";
if(isset($_POST['user']) && isset($_POST['pass'])) {
$_COOKIE['user'] = $_POST['user'];
$_COOKIE['pass'] = $_POST['pass'];
}
if($_COOKIE['user'] != $_CONFIG['user'] ||
$_COOKIE['pass'] != $_CONFIG['pass']) {
?>
<html>
<head>
<title>Auth required!</title>
</head>
<body style="font-family: Courier;">
<h1><font color="red">Authorization required...</font></h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<b>Username: </b><input type="text" name="user" value=""><br>
<b>Password: </b><input type="password" name="pass" value=""><br>
<input type="submit" value="Check user/pass">
</form>
</body>
</html>
<?php
exit;
}
include("zipClass.php");
$dir = $_CONFIG['dir'];
$files = array();
$i = 0;
if(is_dir($dir)) {
$h = opendir($dir) or die("Failed opening music dir.");
while (($tmp = readdir($h)) !== false)
if(substr($tmp, 0, 1) != "." && array_pop(explode(".", $tmp)) == "mp3")
$files[$i++] = $tmp;
}
natcasesort($files);
if(isset($_POST['chk'])) {
$selFiles = array();
$count = 0;
foreach($_POST['chk'] as $val => $file)
$selFiles[$count++] = $files[$val];
$zip = new zipfile();
$zip -> add_dir("music/");
foreach($selFiles as $col => $file)
$zip -> add_file(implode("", file($dir . $file)), "music/{$file}");
header("Content-type: application/octet-stream");
header("Content-disposition: attachment; filename=theMusic.zip");
echo $zip -> file();
die();
}
$jsStr = "<form name=\"form\" method=\"POST\" action=\"" . $_SERVER['PHP_SELF'] . " \">\n"
. "<ul>\n";
for($i=0;$i<count($files);$i++)
$jsStr .= " <input type=\"checkbox\" value=\"{$i}\" name=\"chk[{$i}]\"> {$files[$i]}<br>\n";
$jsStr .= "</ul>\n"
. "</form>\n";
$jsStr = str_replace("\n", "", addslashes($jsStr));
?>
<html>
<head>
<title>My music collection -- Freedom is a good thing</title>
<style type="text/css">
body {
font-family: Courier;
}
input {
border-bottom 10px solid white;
}
</style>
<script type="text/javascript">
function selectAll() {
for(i=0;i<document.forms[0].length;i++)
document.forms[0][i].checked = true;
}
function deSelectAll() {
for(i=0;i<document.forms[0].length;i++)
document.forms[0][i].checked = false;
}
</script>
</head>
<body>
<h1>My music collection...</h1>
<font size="1">By, Brett Bryant. Released under GPL v2 under terms of disclaimer.</font><br>
<form name="form" method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<ul>
<?php
for($i=0;$i<count($files);$i++)
echo " <input type=\"checkbox\" value=\"{$i}\" name=\"chk[{$i}]\"> {$files[$i]}<br>\n";
?>
</ul>
<br>
<a href="#" onclick="javascript: selectAll();">Select all</a>
<a href="#" onclick="javascript: deSelectAll();">Deselect all</a><br>
<input type="submit" value="Get them in a ZIP file">
</form>
</body>
</html>
zipClass.php
<?php
/*
Zip file creation class
makes zip files on the fly...
use the functions add_dir() and add_file() to build the zip file;
see example code below
by Eric Mueller
http://www.themepark.com
v1.1 9-20-01
- added comments to example
v1.0 2-5-01
initial version with:
- class appearance
- add_file() and file() methods
- gzcompress() output hacking
by Denis O.Philippov, webmaster@atlant.ru, http://www.atlant.ru
*/
// official ZIP file format: http://www. // pkware.com/appnote.txt
class zipfile
{
var $datasec = array(); // array to store compressed data
var $ctrl_dir = array(); // central directory
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00"; //end of Central directory record
var $old_offset = 0;
function add_dir($name)
// adds "directory" to archive - do this before putting any files in directory!
// $name - name of directory... like this: "path/"
// ...then you can add files using add_file with names like "path/file.txt"
{
$name = str_replace("\\", "/", $name);
$fr = "\x50\x4b\x03\x04";
$fr .= "\x0a\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x00\x00"; // compression method
$fr .= "\x00\x00\x00\x00"; // last mod time and date
$fr .= pack("V",0); // crc32
$fr .= pack("V",0); //compressed filesize
$fr .= pack("V",0); //uncompressed filesize
$fr .= pack("v", strlen($name) ); //length of pathname
$fr .= pack("v", 0 ); //extra field length
$fr .= $name;
// end of "local file header" segment
// no "file data" segment for path
// "data descriptor" segment (optional but necessary if archive is not served as file)
$fr .= pack("V",$crc); //crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize
// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode("", $this->datasec));
// ext. file attributes mirrors MS-DOS directory attr byte, detailed
// at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp
// now add to central record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .="\x00\x00"; // version made by
$cdrec .="\x0a\x00"; // version needed to extract
$cdrec .="\x00\x00"; // gen purpose bit flag
$cdrec .="\x00\x00"; // compression method
$cdrec .="\x00\x00\x00\x00"; // last mod time & date
$cdrec .= pack("V",0); // crc32
$cdrec .= pack("V",0); //compressed filesize
$cdrec .= pack("V",0); //uncompressed filesize
$cdrec .= pack("v", strlen($name) ); //length of filename
$cdrec .= pack("v", 0 ); //extra field length
$cdrec .= pack("v", 0 ); //file comment length
$cdrec .= pack("v", 0 ); //disk number start
$cdrec .= pack("v", 0 ); //internal file attributes
$ext = "\x00\x00\x10\x00";
$ext = "\xff\xff\xff\xff";
$cdrec .= pack("V", 16 ); //external file attributes - 'directory' bit set
$cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
$this -> old_offset = $new_offset;
$cdrec .= $name;
// optional extra field, file comment goes here
// save to array
$this -> ctrl_dir[] = $cdrec;
}
function add_file($data, $name)
// adds "file" to archive
// $data - file contents
// $name - name of file in archive. Add path if your want
{
$name = str_replace("\\", "/", $name);
//$name = str_replace("\\", "\\\\", $name);
$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= "\x00\x00\x00\x00"; // last mod time and date
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr( substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack("V",$crc); // crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize
$fr .= pack("v", strlen($name) ); //length of filename
$fr .= pack("v", 0 ); //extra field length
$fr .= $name;
// end of "local file header" segment
// "file data" segment
$fr .= $zdata;
// "data descriptor" segment (optional but necessary if archive is not served as file)
$fr .= pack("V",$crc); //crc32
$fr .= pack("V",$c_len); //compressed filesize
$fr .= pack("V",$unc_len); //uncompressed filesize
// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode("", $this->datasec));
// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .="\x00\x00"; // version made by
$cdrec .="\x14\x00"; // version needed to extract
$cdrec .="\x00\x00"; // gen purpose bit flag
$cdrec .="\x08\x00"; // compression method
$cdrec .="\x00\x00\x00\x00"; // last mod time & date
$cdrec .= pack("V",$crc); // crc32
$cdrec .= pack("V",$c_len); //compressed filesize
$cdrec .= pack("V",$unc_len); //uncompressed filesize
$cdrec .= pack("v", strlen($name) ); //length of filename
$cdrec .= pack("v", 0 ); //extra field length
$cdrec .= pack("v", 0 ); //file comment length
$cdrec .= pack("v", 0 ); //disk number start
$cdrec .= pack("v", 0 ); //internal file attributes
$cdrec .= pack("V", 32 ); //external file attributes - 'archive' bit set
$cdrec .= pack("V", $this -> old_offset ); //relative offset of local header
// &n // bsp; echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>";
$this -> old_offset = $new_offset;
$cdrec .= $name;
// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;
}
function file() { // dump out file
$data = implode("", $this -> datasec);
$ctrldir = implode("", $this -> ctrl_dir);
return
$data.
$ctrldir.
$this -> eof_ctrl_dir.
pack("v", sizeof($this -> ctrl_dir)). // total # of entries "on this disk"
pack("v", sizeof($this -> ctrl_dir)). // total # of entries overall
pack("V", strlen($ctrldir)). // size of central dir
pack("V", strlen($data)). // offset to start of central dir
"\x00\x00"; // .zip file comment length
}
}
?> Enjoy. Post any questions, comments, or errors you find in the program.
Edit: I guess i should add the include file...
__________________
|