Programming Forums

Programming Forums (http://www.programmingforums.org/forumindex.php)
-   PHP (http://www.programmingforums.org/forum29.html)
-   -   Php Music Sharing Program.. (completed, Source) (http://www.programmingforums.org/showthread.php?t=1198)

tempest Nov 18th, 2004 8:41 PM

:

<?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...

kurifu Nov 19th, 2004 1:05 AM

Hehe, interesting little script.. I have been meaning to learn how to use PHP files to send actual binary data (of a different content-type) guess I will use this script to learn how now :P


All times are GMT -5. The time now is 1:21 AM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC