0.7.9
This commit is contained in:
287
web/rtc.php
287
web/rtc.php
@@ -4,8 +4,10 @@
|
||||
// Skim RTC Browser
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
$browser_version = "0.7.9";
|
||||
|
||||
require "togggle.php";
|
||||
require "debug.php";
|
||||
require "lib/debug.php";
|
||||
|
||||
$db_dir = "skim";
|
||||
$icon_size = 64;
|
||||
@@ -15,6 +17,7 @@ $pad = 28;
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<style>
|
||||
|
||||
html { font-family: Helvetica; word-wrap: break-word; }
|
||||
@@ -23,14 +26,48 @@ div.container { display: flex; flex-flow: row wrap; justify-content: center; }
|
||||
div.item { width: <?=$icon_size+$pad;?>px; height: <?=$icon_size+$pad;?>px; padding: <?=$pad;?>px; }
|
||||
div.item { font-size: 11px; }
|
||||
div.flexfill { width: <?=$icon_size+($pad*3);?>px; height: 1px; }
|
||||
div.aborted { text-decoration: line-through; }
|
||||
|
||||
.red { background-color: #ea6c60; }
|
||||
.green { background-color: #9cde70; }
|
||||
.blue { background-color: #6dbcf4; }
|
||||
.yellow { background-color: #f8d657; }
|
||||
.orange { background-color: #f1ad4e; }
|
||||
.purple { background-color: #ca94e2; }
|
||||
.gray { background-color: #a4a4a7; }
|
||||
|
||||
.tag {
|
||||
height: 14px;
|
||||
width: 14px;
|
||||
border-radius: 50%;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
font-size: 500%;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin-left: -6px;
|
||||
}
|
||||
|
||||
div.size { color: grey; margin-top: 3px; }
|
||||
|
||||
img.thumb { padding: 6px; border: 1px solid gainsboro; }
|
||||
img.item { float: left; margin-right: 10px; width: 32px; height: 32px; }
|
||||
img#thumb { padding: 6px; border: 1px solid gainsboro; }
|
||||
img#item { float: left; margin-right: 10px; width: 32px; height: 32px; }
|
||||
img { margin-bottom: 8px; }
|
||||
|
||||
div.fileinfo { font-size: 12px; }
|
||||
div.fileinfo span.title { display: table-cell; font-weight: bold; width: 200px; }
|
||||
div.fileinfo span.value { display: table-cell; }
|
||||
|
||||
div.dcontainer { margin: 10px; margin-bottom: 20px;}
|
||||
|
||||
a.hidden img { opacity: .3; }
|
||||
|
||||
iframe { width: 425px; height: 550px; padding: 6px; border: 1px solid black; }
|
||||
|
||||
</style>
|
||||
|
||||
<script src="lib/lazysizes.min.js"></script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -39,12 +76,58 @@ img { margin-bottom: 8px; }
|
||||
|
||||
// Functions
|
||||
|
||||
function get_gps($gps_pos) {
|
||||
|
||||
# convert:
|
||||
# 40 deg 44' 49.36" N, 73 deg 56' 28.18" W
|
||||
# to:
|
||||
# 40.7470444,-073.9411611
|
||||
|
||||
$parts = explode(" ",str_replace(array("deg ",",","'","\""),"",$gps_pos));
|
||||
|
||||
$lat_deg = $parts[0];
|
||||
$lat_min = $parts[1];
|
||||
$lat_sec = $parts[2];
|
||||
$lat_dir = $parts[3];
|
||||
|
||||
$lon_deg = $parts[4];
|
||||
$lon_min = $parts[5];
|
||||
$lon_sec = $parts[6];
|
||||
$lon_dir = $parts[7];
|
||||
|
||||
if ($lat_dir == "N") {
|
||||
$lat_sin = "+";
|
||||
} else {
|
||||
$lat_sin = "-";
|
||||
}
|
||||
|
||||
if ($lon_dir == "E") {
|
||||
$lon_sin = "+";
|
||||
} else {
|
||||
$lon_sin = "-";
|
||||
}
|
||||
|
||||
$latitiude = $lat_sin.($lat_deg+($lat_min/60)+($lat_sec/3600));
|
||||
$longitude = $lon_sin.($lon_deg+($lon_min/60)+($lon_sec/3600));
|
||||
|
||||
return $latitiude.",".$longitude;
|
||||
|
||||
}
|
||||
|
||||
function is_serial($string) {
|
||||
return (@unserialize($string) !== false || $string == 'b:0;');
|
||||
}
|
||||
|
||||
function human_filesize($bytes, $decimals = 2) {
|
||||
$size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
|
||||
$factor = floor((strlen($bytes) - 1) / 3);
|
||||
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
|
||||
}
|
||||
|
||||
function utf8_for_xml($string) {
|
||||
return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
|
||||
}
|
||||
|
||||
class plistParser extends XMLReader {
|
||||
public function parseString($string) { $this->XML($string); return $this->process(); }
|
||||
private function process() {
|
||||
@@ -117,11 +200,7 @@ function shortlabel($filename, $max = 40) {
|
||||
|
||||
function findicon($filename) {
|
||||
$ext = pathinfo($filename)['extension'];
|
||||
if (!$ext) {
|
||||
$good = "icons/directory.png";
|
||||
} else {
|
||||
$good = "icons/null.png";
|
||||
}
|
||||
$good = "icons/null.png";
|
||||
foreach (glob("icons/*.png") as $file) {
|
||||
if (pathinfo($file)['filename'] == $ext) {
|
||||
$good = $file;
|
||||
@@ -135,6 +214,7 @@ function findicon($filename) {
|
||||
$db_file = $_GET['db'];
|
||||
$pid = $_GET['pid'];
|
||||
$search = $_POST['query'];
|
||||
$parser = new plistParser();
|
||||
|
||||
if ($db_file) {
|
||||
|
||||
@@ -156,13 +236,37 @@ if ($db_file) {
|
||||
|
||||
if (!$pid) {
|
||||
$pid = $dbo->query("SELECT pid FROM family WHERE (rowid=2)")->fetch()['pid'];
|
||||
$view = $dbo->query("SELECT * FROM _skim")->fetchAll()[0];
|
||||
// hide long strings
|
||||
$view['qlmanage'] = "hidden";
|
||||
$view['disks'] = "hidden";
|
||||
$view['diskutil'] = "hidden";
|
||||
$view = $dbo->query("SELECT * FROM _skim")->fetch();
|
||||
// handle special strings
|
||||
$view['opts'] = unserialize($view['opts']);
|
||||
$view['qlmanage'] = "hidden"; //array($view['qlmanage']);
|
||||
$view['profile'] = "hidden"; //array($view['profile']);
|
||||
if ($view['details']) {
|
||||
$view['details'] = unserialize($view['details']);
|
||||
}
|
||||
if (substr($view['disks'],0,5) == "<?xml") {
|
||||
//$view['disks'] = $parser->parseString(utf8_for_xml($view['disks']));
|
||||
$view['disks'] = "hidden";
|
||||
} else {
|
||||
$view['disks'] = "hidden";
|
||||
}
|
||||
if (substr($view['diskutil'],0,5) == "<?xml") {
|
||||
$view['diskutil'] = $parser->parseString(utf8_for_xml($view['diskutil']));
|
||||
} else {
|
||||
$view['diskutil'] = "hidden";
|
||||
}
|
||||
if ($view['vdisks']) {
|
||||
$view['vdisks'] = $parser->parseString(utf8_for_xml($view['vdisks']));
|
||||
}
|
||||
if ($view['hdiutil']) {
|
||||
$view['hdiutil'] = $parser->parseString(utf8_for_xml($view['hdiutil']));
|
||||
}
|
||||
} else {
|
||||
$view = $dbo->query("SELECT * FROM files WHERE (pid='".$pid."')")->fetchAll()[0];
|
||||
$view = $dbo->query("SELECT rowid, * FROM files WHERE (pid='".$pid."')")->fetch();
|
||||
if (is_serial($view['stat'])) {
|
||||
$view['stat'] = unserialize($view['stat']);
|
||||
}
|
||||
$dirmdls = $dbo->query("SELECT rowid, * FROM mdls WHERE (rowid='".$view['rowid']."')")->fetch();
|
||||
}
|
||||
|
||||
// Breadcrumbs
|
||||
@@ -201,11 +305,15 @@ if ($db_file) {
|
||||
echo "<table><tr>";
|
||||
|
||||
echo "<td valign='top'>";
|
||||
$row_a = $dbo->query("SELECT rowid, * FROM files WHERE (pid='".$pid."')")->fetchAll()[0];
|
||||
$row_a = $dbo->query("SELECT rowid, * FROM files WHERE (pid='".$pid."')")->fetch();
|
||||
if (is_serial($row_a['stat'])) {
|
||||
$row_a['stat'] = unserialize($row_a['stat']);
|
||||
}
|
||||
|
||||
if (!strpos($spotlight_status,"disabled")) {
|
||||
|
||||
$row_b = $dbo->query("SELECT * FROM mdls WHERE (rowid='".$row_a['rowid']."')")->fetchAll()[0];
|
||||
$row_b = $dbo->query("SELECT * FROM mdls WHERE (rowid='".$row_a['rowid']."')")->fetch();
|
||||
$row_e = @$dbo->query("SELECT * FROM milk WHERE (rowid='".$row_a['rowid']."')")->fetch();
|
||||
|
||||
}
|
||||
|
||||
@@ -214,18 +322,18 @@ if ($db_file) {
|
||||
// newer version stores rowid rather than 0 or 1 for has_exif etc
|
||||
|
||||
if (isset($row_a['has_exif'])) {
|
||||
$row_c = $dbx->query("SELECT * FROM exiftool WHERE (rowid='".$row_a['has_exif']."')")->fetchAll()[0];
|
||||
$row_c = $dbx->query("SELECT * FROM exiftool WHERE (rowid='".$row_a['has_exif']."')")->fetch();
|
||||
}
|
||||
if (isset($row_a['has_mediainfo'])) {
|
||||
$row_d = $dbx->query("SELECT * FROM mediainfo WHERE (rowid='".$row_a['has_mediainfo']."')")->fetchAll()[0];
|
||||
$row_d = $dbx->query("SELECT * FROM mediainfo WHERE (rowid='".$row_a['has_mediainfo']."')")->fetch();
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// fetch exif and mediainfo by slower fid
|
||||
|
||||
$row_c = $dbx->query("SELECT * FROM exiftool WHERE (fid='".$row_a['fid']."')")->fetchAll()[0];
|
||||
$row_d = $dbx->query("SELECT * FROM mediainfo WHERE (fid='".$row_a['fid']."')")->fetchAll()[0];
|
||||
$row_c = $dbx->query("SELECT * FROM exiftool WHERE (fid='".$row_a['fid']."')")->fetch();
|
||||
$row_d = $dbx->query("SELECT * FROM mediainfo WHERE (fid='".$row_a['fid']."')")->fetch();
|
||||
|
||||
}
|
||||
|
||||
@@ -233,22 +341,90 @@ if ($db_file) {
|
||||
$width = $row_a['thumb_width'];
|
||||
$height = $row_a['thumb_height'];
|
||||
$realfile = dirname($db_file).$row_a['thumb_filename'];
|
||||
$icon = "<img src='".$realfile."' width='".$width."' height='".$height."'>";
|
||||
$icon = "<img id='thumb' src='".$realfile."' width='".$width."' height='".$height."' class='lazyload'>";
|
||||
} elseif ($row_a['Type'] == "dir") {
|
||||
$icon = "<img src='/icons/directory.png' width='512' height='512'>";
|
||||
} else {
|
||||
$icon = "<img src='".findicon($row_a['Filename'])."' width='512' height='512'>";
|
||||
}
|
||||
|
||||
if ($row_a['contents_filename']) {
|
||||
$realcfile = dirname($db_file).$row_a['contents_filename'];
|
||||
$icon = "<iframe src='/handle_zip.php?file=".$realcfile."'></iframe>";
|
||||
}
|
||||
|
||||
echo $icon;
|
||||
|
||||
// debug milk
|
||||
|
||||
if (count(@$row_e) > 1) {
|
||||
echo "<div class='dcontainer'>";
|
||||
foreach($row_e as $title => $val) {
|
||||
if ($title == "GPS" && $val) {
|
||||
if (strpos($val,"deg") != false) {
|
||||
$val = get_gps($val);
|
||||
}
|
||||
$print = "<a href='https://www.google.com/maps?q=".$val."' target='_blank'>".$val."</a>";
|
||||
} else {
|
||||
$print = $val;
|
||||
}
|
||||
echo "<div class='fileinfo'><span class='title'>".$title."</span><span class='value'>".$print."</span></div>";
|
||||
}
|
||||
echo "</div>";
|
||||
}
|
||||
|
||||
// debug file times
|
||||
|
||||
$fileinfo['atime (php)'] = date("F jS, Y h:i:s",$row_a['ATime']);
|
||||
$fileinfo['mtime (php)'] = date("F jS, Y h:i:s",$row_a['MTime']);
|
||||
$fileinfo['ctime (php)'] = date("F jS, Y h:i:s",$row_a['CTime']);
|
||||
|
||||
if ($row_a['stat']) {
|
||||
|
||||
if (is_array($row_a['stat'])) {
|
||||
|
||||
$fileinfo['atime (stat)'] = date("F jS, Y h:i:s",$row_a['stat']['st_atime']);
|
||||
$fileinfo['mtime (stat)'] = date("F jS, Y h:i:s",$row_a['stat']['st_mtime']);
|
||||
$fileinfo['ctime (stat)'] = date("F jS, Y h:i:s",$row_a['stat']['st_ctime']);
|
||||
$fileinfo['btime (stat)'] = date("F jS, Y h:i:s",$row_a['stat']['st_birthtime']);
|
||||
|
||||
} else {
|
||||
|
||||
// parse old version stat
|
||||
preg_match('/^Access: ([^\r\n]*)/m', $row_a['stat'], $access);
|
||||
$fileinfo['atime (stat)'] = date("F jS, Y h:i:s",strtotime($access[1]));
|
||||
preg_match('/^Modify: ([^\r\n]*)/m', $row_a['stat'], $modify);
|
||||
$fileinfo['mtime (stat)'] = date("F jS, Y h:i:s",strtotime($modify[1]));
|
||||
preg_match('/^Change: ([^\r\n]*)/m', $row_a['stat'], $change);
|
||||
$fileinfo['ctime (stat)'] = date("F jS, Y h:i:s",strtotime($change[1]));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ($row_b['spotlight']) {
|
||||
$row_b['spotlight'] = $parser->parseString(utf8_for_xml($row_b['spotlight']));
|
||||
$fileinfo['added (mdls)'] = date("F jS, Y h:i:s",$row_b['DateAdded']);
|
||||
$fileinfo['mtime (mdls)'] = date("F jS, Y h:i:s",$row_b['ContentModificationDate']);
|
||||
$fileinfo['btime (mdls)'] = date("F jS, Y h:i:s",$row_b['ContentCreationDate']);
|
||||
}
|
||||
|
||||
ksort($fileinfo);
|
||||
|
||||
echo "<div class='dcontainer'>";
|
||||
|
||||
foreach ($fileinfo as $title => $value) {
|
||||
echo "<div class='fileinfo'><span class='title'>".$title."</span><span class='value'>".$value."</span></div>";
|
||||
}
|
||||
|
||||
echo "</div>";
|
||||
|
||||
echo "</td>";
|
||||
|
||||
echo "<td valign='top'>";
|
||||
|
||||
debug(array($row_a),"file");
|
||||
|
||||
if ($row_b) {
|
||||
$parser = new plistParser();
|
||||
$row_b['spotlight'] = $parser->parseString($row_b['spotlight']);
|
||||
if ($row_b['spotlight']) {
|
||||
debug(array($row_b),"mdls");
|
||||
}
|
||||
|
||||
@@ -280,12 +456,18 @@ if ($db_file) {
|
||||
|
||||
/////////////////////////
|
||||
|
||||
$row_a = $dbo->query("SELECT * FROM files WHERE (rowid='".$item."')")->fetchAll()[0];
|
||||
$row_b = $dbo->query("SELECT * FROM mdls WHERE (rowid='".$item."')")->fetchAll()[0];
|
||||
//$row_c = $dbo->query("SELECT * FROM milk WHERE (pid='".$item."')")->fetchAll()[0];
|
||||
$row_a = $dbo->query("SELECT rowid, * FROM files WHERE (rowid='".$item."')")->fetch();
|
||||
$row_b = $dbo->query("SELECT rowid, * FROM mdls WHERE (rowid='".$item."')")->fetch();
|
||||
//$row_c = $dbo->query("SELECT * FROM milk WHERE (rowid='".$item."')")->fetch();
|
||||
|
||||
/////////////////////////
|
||||
|
||||
if ($row_b['FSInvisible']) {
|
||||
$visibility = "hidden";
|
||||
} else {
|
||||
$visibility = "unhidden";
|
||||
}
|
||||
|
||||
if ($row_a['thumb_filename']) {
|
||||
$aspect = $row_a['thumb_width']/$row_a['thumb_height'];
|
||||
if ($aspect > 1) {
|
||||
@@ -296,21 +478,34 @@ if ($db_file) {
|
||||
$height = $icon_size;
|
||||
}
|
||||
$realfile = dirname($db_file).$row_a['thumb_filename'];
|
||||
$icon = "<img class='thumb' src='".$realfile."' width='".$width."' height='".$height."'>";
|
||||
$icon = "<img id='thumb' class='lazyload' data-src='".$realfile."' width='".$width."' height='".$height."'>";
|
||||
} elseif ($row_a['Type'] == "dir") {
|
||||
$icon = "<img src='/icons/directory.png' width='".$icon_size."' height='".$icon_size."'>";
|
||||
} else {
|
||||
$icon = "<img class='icon' src='".findicon($row_a['Filename'])."' width='".$icon_size."' height='".$icon_size."'>";
|
||||
$icon = "<img src='".findicon($row_a['Filename'])."' width='".$icon_size."' height='".$icon_size."'>";
|
||||
}
|
||||
|
||||
echo "\n<a href='?db=".$db_file."&pid=".$row_a['pid']."'>".$icon."</a>";
|
||||
echo "\n<a class='".$visibility."' href='?db=".$db_file."&pid=".$row_a['pid']."'>".$icon."</a>";
|
||||
|
||||
echo "<div class='title'>".htmlentities(shortlabel($row_a['Filename']))."</div>";
|
||||
echo "<div class='title'>";
|
||||
|
||||
if ($row_b['UserTags']) {
|
||||
foreach (unserialize($row_b['UserTags']) as $tag) {
|
||||
echo "<span class='tag ".$tag."'></span>";
|
||||
}
|
||||
echo " ";
|
||||
}
|
||||
|
||||
echo htmlentities(shortlabel($row_a['Filename']));
|
||||
|
||||
echo "</div>";
|
||||
|
||||
if ($row_a['Size']) {
|
||||
echo "<div class='size'>".human_filesize($row_a['Size'])."</div>";
|
||||
}
|
||||
|
||||
if ($row_a['Type'] == "dir" && $row_a['items']) {
|
||||
echo "<div class='size'>".$row_a['items']." items</div>";
|
||||
echo "<div class='size'>".number_format($row_a['items'])." items</div>";
|
||||
}
|
||||
|
||||
echo "</div>";
|
||||
@@ -321,7 +516,14 @@ if ($db_file) {
|
||||
echo str_repeat("<div class='flexfill'></div>", 100);
|
||||
echo "</div>";
|
||||
echo "</td><td valign='top'>";
|
||||
|
||||
debug($view,$view['Pathname']);
|
||||
|
||||
if ($dirmdls['spotlight']) {
|
||||
$dirmdls['spotlight'] = $parser->parseString(utf8_for_xml($dirmdls['spotlight']));
|
||||
debug(array($dirmdls),"mdls");
|
||||
}
|
||||
|
||||
echo "</td></tr></table>";
|
||||
|
||||
} else {
|
||||
@@ -363,18 +565,25 @@ if ($db_file) {
|
||||
if ($dbs[0]) {
|
||||
$dbo = new PDO("sqlite:".$dbs[0]);
|
||||
$type = $dbo->query("SELECT type FROM _skim")->fetch()['type'];
|
||||
echo "<img class='item' src='".$icons[$type]."'>";
|
||||
echo "<img id='item' src='".$icons[$type]."'>";
|
||||
}
|
||||
echo "<h2>".pathinfo($bundle)['filename']."</h2>";
|
||||
foreach ($dbs as $db_file) {
|
||||
$dbo = new PDO("sqlite:".$db_file);
|
||||
echo "<div>";
|
||||
$info = $dbo->query("SELECT * FROM _skim")->fetch();
|
||||
if (strpos($info['status'],"completed") === 0) {
|
||||
$seconds = str_replace("completed_in_","",$info['status']);
|
||||
$status = gmdate("H:i:s",$seconds);
|
||||
echo "<div>";
|
||||
} else {
|
||||
echo "<div class='aborted'>";
|
||||
}
|
||||
echo "<a href='?db=".$db_file."'>".pathinfo($db_file)['filename']."</a> ";
|
||||
echo $dbo->query("SELECT version FROM _skim")->fetch()['version'].", ";
|
||||
echo $dbo->query("SELECT passed_total FROM _skim")->fetch()['passed_total']." files, ";
|
||||
echo $dbo->query("SELECT status FROM _skim")->fetch()['status'];
|
||||
$spotlight_status = $dbo->query("SELECT mdutil FROM _skim")->fetch()['mdutil'];
|
||||
if (strpos($spotlight_status,"disabled")) { echo " (no spotlight)"; }
|
||||
echo $info['version'].", ";
|
||||
echo number_format($info['passed_total'])." files, ";
|
||||
if ($info['image_file']) { echo $info['image_file'].", "; }
|
||||
echo $status;
|
||||
if (strpos($info['spotlight_status'],"disabled")) { echo " (no spotlight)"; }
|
||||
echo "</div>";
|
||||
}
|
||||
echo "</div>";
|
||||
|
||||
Reference in New Issue
Block a user