244 lines
8.2 KiB
PHP
Executable File
244 lines
8.2 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
|
|
<?php
|
|
|
|
// This script is based on the work done by gadgetguru
|
|
// <david@vuistbijl.nl> 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 . "<p/>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 . "<p/>getId3 not in the system.<p/>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 . "<p/>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 . "<p/>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 . "<p/>getId3 directory to copy found at: '" . $getId3SourceDir . "'";
|
|
|
|
|
|
rcopy($getId3SourceDir, $getId3DestDir);
|
|
$htmlMessage = $htmlMessage . "<p/>getId3 directory copied to its final destination at: '" . realpath($getId3SourceDir) . "'";
|
|
|
|
rrmdir($tmpDir);
|
|
$htmlMessage = $htmlMessage . "<p/>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 . "<p/>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 = "<html><body><h1>" . $httpStatus . "</h1>" . $htmlMessage;
|
|
|
|
if ($httpStatus == "500 Internal Server Error") {
|
|
if (function_exists("error_get_last")) {
|
|
$errorArray = error_get_last();
|
|
if ($errorArray) {
|
|
$htmlMessage = sprintf("%s<p/>Error type: %d<p/>Error message: %s<p/>".
|
|
"Error file: %s<p/>Error line: %d",
|
|
$htmlMessage, $errorArray["type"], $errorArray["message"],
|
|
$errorArray["file"], $errorArray["line"]);
|
|
}
|
|
}
|
|
}
|
|
$htmlMessage = $htmlMessage . "</body><html>";
|
|
|
|
print($htmlMessage);
|
|
flush();
|
|
exit;
|
|
?>
|