#!/usr/bin/env php at // https://github.com/gadgetguru/PHP-Streaming-Audio and released // under the Public Domain. // This script creates, overwriting if needed, the "metadata.json" // file used by scripts such as "serve-video.py". // // For creating or updating an existing file you have to run // the file as an executable, passing a single argument which // is the name of the file we are accessing to get the media // directory // // With this, a new "metadaba.json" file will be create in the // directory containing the referred file. In this example, the // database will be created at: // // $ LayoutTests/media/content/metadata.json function tmpdir($dir=FALSE, $prefix='php') { if ($dir) { $tmpFile = tempnam($dir, $prefix); } else { if (!sys_get_temp_dir()) return FALSE; $tmpFile = tempnam(sys_get_temp_dir(), $prefix); } if (!file_exists($tmpFile)) return FALSE; unlink($tmpFile); mkdir($tmpFile); if (!is_dir($tmpFile)) return FALSE; return $tmpFile; } function rrmdir($dir) { if (is_dir($dir)) { $objects = array_diff(scandir($dir), array(".", "..")); foreach ($objects as $object) (is_dir($dir . "/" . $object)) ? rrmdir($dir . "/" . $object) : unlink($dir . "/" . $object); reset($objects); rmdir($dir); } } function rcopy($src, $dst) { if (file_exists($dst)) rrmdir($dst); if (is_dir($src)) { mkdir($dst); $files = array_diff(scandir($src), array(".", "..")); foreach ($files as $file) rcopy("$src/$file", "$dst/$file"); } else if (file_exists($src)) { copy($src, $dst); } } function first_dir($name, $dir=FALSE) { $result = FALSE; $root = $dir ? $dir : "./"; $queue = array(realpath($root)); while (sizeof($queue)) { $vertex = array_pop($queue); $objects = array_diff(scandir($vertex), array(".", "..")); foreach ($objects as $object) { $fullPath = $vertex . "/" . $object; if (is_dir($fullPath)) { if ($name == basename($fullPath)) { $result = $fullPath; return $result; } else { array_unshift($queue, $fullPath); } } } } } // 500 on errors $httpStatus = "500 Internal Server Error"; $htmlMessage = ""; if (sizeof($argv) < 2) { trigger_error("You have not specified a 'name' parameter.", E_USER_WARNING); goto answering; } $mediaDirectory = dirname($argv[1]); if (!is_dir($mediaDirectory)) { trigger_error("The provided directory path doesn't exist.", E_USER_WARNING); goto answering; } $databaseFile = realpath($mediaDirectory) . "/metadata.json"; if (file_exists($databaseFile)) { unlink($databaseFile); $htmlMessage = $htmlMessage . "

Deleted previously existing db file at: '" . $databaseFile . "'"; } // We don't have getid3 in WebKit. If not currently present, we // will try to download it now before making use of it. // // getid3 is available at http://getid3.sourceforge.net $getId3DestDir = "getid3"; if (!file_exists($getId3DestDir)) { $tmpDir = tmpdir(FALSE, "php"); if (!is_dir($tmpDir)) { trigger_error("Impossible to create temporal directory.", E_USER_WARNING); goto answering; } $id3DestPath = $tmpDir . "/getid3.zip"; $phpVersion = explode(".", PHP_VERSION); if (($phpVersion[0] > 4) && ($phpVersion[1] > 0)) $id3Url = "http://sourceforge.net/projects/getid3/files/getID3%28%29%201.x/1.9.7/getID3-1.9.7.zip/download"; else $id3Url = "http://sourceforge.net/projects/getid3/files/getID3%28%29%201.x/1.7.10/getid3-1.7.10-20090426.zip/download"; $htmlMessage = $htmlMessage . "

getId3 not in the system.

Downloading from: '" . $id3Url . "'"; $ctxtOpts = array("http" => array( "method" => "GET", "timeout" => 60, ) ); $ctxt = stream_context_create($ctxtOpts); $src = fopen($id3Url, "rb", false, $ctxt); $dest = fopen($id3DestPath, "wb"); $copied = stream_copy_to_stream($src, $dest); fclose($src); fclose($dest); if ($copied == 0) { trigger_error("Impossible to copy the latest getid3 zip release file.", E_USER_WARNING); goto answering; } $htmlMessage = $htmlMessage . "

getId3 downloaded to: '" . $id3DestPath . "'"; if (!exec("unzip " . $id3DestPath . " -d " . $tmpDir)) { trigger_error("Impossible to extract the downloaded zip file.", E_USER_WARNING); goto answering; } $htmlMessage = $htmlMessage . "

Zip file successfully extracted."; $getId3SourceDir = first_dir($getId3DestDir, $tmpDir); if (!$getId3SourceDir) { trigger_error("Impossible to find the getid3 directory with the PHP code to copy.", E_USER_WARNING); goto answering; } $htmlMessage = $htmlMessage . "

getId3 directory to copy found at: '" . $getId3SourceDir . "'"; rcopy($getId3SourceDir, $getId3DestDir); $htmlMessage = $htmlMessage . "

getId3 directory copied to its final destination at: '" . realpath($getId3SourceDir) . "'"; rrmdir($tmpDir); $htmlMessage = $htmlMessage . "

Deleted all temporal files at: '" . $tmpDir . "'"; } // getid3 downloaded. Let's create the database file. require_once("getid3/getid3.php"); $getID3 = new getID3; $id3FileNames = array_diff(scandir($mediaDirectory), array(".", "..")); foreach ($id3FileNames as $id3FileName) { $id3 = $getID3->analyze($mediaDirectory . "/" . $id3FileName); $playfile = array( "fileName" => $id3["filename"], "fileSize" => $id3["filesize"], "playTime" => $id3["playtime_seconds"], "audioStart" => $id3["avdataoffset"], "audioEnd" => $id3["avdataend"], "audioLength" => $id3["avdataend"] - $id3["avdataoffset"], "artist" => $id3["tags"]["id3v2"]["artist"][0], "title" => $id3["tags"]["id3v2"]["title"][0], "bitRate" => $id3["audio"]["bitrate"], "mimeType" => $id3["mime_type"], "fileFormat" => $id3["fileformat"], ); if (empty($playfile["artist"]) || empty($playfile["title"])) list($playfile["artist"], $playfile["title"]) = explode(" - ", substr($playfile["fileName"], 0 , -4)); $playFiles[] = $playfile; } if (!file_put_contents($databaseFile, json_decode($playFiles))) { trigger_error("Impossible to write the getid3 db.", E_USER_WARNING); goto answering; } $htmlMessage = $htmlMessage . "

Written new database file at: '" . $databaseFile . "'"; // Database created, everything OK. $httpStatus = "200 OK"; answering: header("Status: " . $httpStatus); header("HTTP/1.1 " . $httpStatus); header("Connection: close"); header("Content-Type: text/html"); $htmlMessage = "

" . $httpStatus . "

" . $htmlMessage; if ($httpStatus == "500 Internal Server Error") { if (function_exists("error_get_last")) { $errorArray = error_get_last(); if ($errorArray) { $htmlMessage = sprintf("%s

Error type: %d

Error message: %s

". "Error file: %s

Error line: %d", $htmlMessage, $errorArray["type"], $errorArray["message"], $errorArray["file"], $errorArray["line"]); } } } $htmlMessage = $htmlMessage . ""; print($htmlMessage); flush(); exit; ?>