From 4f090db179517d13366533ac93a615a932d5ad85 Mon Sep 17 00:00:00 2001 From: profiteroles Date: Thu, 23 May 2019 04:48:00 -0700 Subject: [PATCH] 0.7.12.1 --- README.md | 2 +- Yuba.php | 132 ++++++++++++++++++++++++----------- YubaPrefs.php | 9 ++- bin/qltool | Bin 0 -> 76896 bytes functions.pashua.php | 23 +++++- prefs.php | 2 +- utils/generate_default_prefs | 1 + version.txt | 2 +- 8 files changed, 122 insertions(+), 49 deletions(-) create mode 100755 bin/qltool diff --git a/README.md b/README.md index 1115d30..88c4589 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Yuba** generates a web-browsable SQLite database from an HFS+ filesystem. Its client application gathers forensic-quality data about a locally attached disk, properly interpreting bundles, reading Spotlight data, Finder flags, labels, and other contextual information. It can generate hashes, thumbnails, and gather 3rd party metadata with exiftool and mediainfo. Yuba's filesystem catalogues are comprehensive, lightweight, optimized for massive (1 million+) trees, and reflect incremental changes to contents and metadata. A server-side PHP script is provided, which allows familiar, Finder-style browsing of a catalogue. -* **⇩ [Download Yuba 0.7.12](http://www.profiteroles.org/downloads/Yuba_0.7.12.zip)** +* **⇩ [Download Yuba 0.7.12.1](http://www.profiteroles.org/downloads/Yuba_0.7.12.1.zip)** ## Features diff --git a/Yuba.php b/Yuba.php index 23827b6..6f659f7 100755 --- a/Yuba.php +++ b/Yuba.php @@ -11,7 +11,14 @@ date_default_timezone_set("America/Los_Angeles"); // Includes & Prefs ////////////////////////////////////////// -$p = unserialize(file_get_contents(__DIR__."/prefs.php")); +$prefs_file = "/Users/".get_current_user()."/Library/Preferences/yuba_prefs.php"; +if (!file_exists($prefs_file)) { + if (!copy(__DIR__."/prefs.php",$prefs_file)) { + echo "Error creating preferences file"; + die; + } + } +$p = unserialize(file_get_contents($prefs_file)); $p['phpbin'] = "/usr/bin/php"; @@ -75,6 +82,8 @@ $bin_mediainfo = __DIR__."/bin/mediainfo"; $bin_exiftool = __DIR__."/bin/exiftool"; $bin_ffmpeg = __DIR__."/bin/ffmpeg"; $bin_qlthumb = __DIR__."/bin/ql-thumbnail"; +$bin_qltool = __DIR__."/bin/qltool"; +$bin_vips = "vipsthumbnail"; // Logfile $messages_log_file = $bpath."/".$stamp."_messages.log"; @@ -275,6 +284,7 @@ $dbo->exec("CREATE TABLE files ( thumb_filename TEXT, thumb_width INTEGER, thumb_height INTEGER, + thumb_tool TEXT, contents_filename TEXT )"); @@ -537,63 +547,102 @@ if ($p['thumbs']) { $ext = pathinfo($pathname,PATHINFO_EXTENSION); $tpath = $bpath."/thumbs/".substr($fid, 0, 2); if (!is_dir($tpath)) { mkdir($tpath); } - $tfile = $tpath."/".$fid.".jpg"; + $tfile = $tpath."/".$fid."_".$p['thumb_size'].".jpg"; + $tpfile = $tpath."/".$fid."_".$p['thumb_size'].".png"; if (count($p['t_skip']) && in_array($ext, $p['t_skip'])) { echo ProgressBar::next("Skipping ".shortlabel($pathname)); continue; } - // if no thumb file, then poll database - if (file_exists($tfile)) { - echo ProgressBar::next("Thumb file found for ".shortlabel($pathname)); - continue; - } elseif ($dbp->query("SELECT EXISTS(SELECT 1 FROM thumbs WHERE fid='".$fid."')")->fetch()[0]) { - echo ProgressBar::next("Thumb record found for ".shortlabel($pathname)); - continue; + // check for rebuild mode + if ($p['thumbs'] == 2) { + $update_rowid = $dbp->query("SELECT rowid FROM thumbs WHERE fid='".$fid."'")->fetch()[0]; + } else { + if (is_file($tfile) | is_file($tpfile)) { + // faster to check for a file first + echo ProgressBar::next("Thumb file found for ".shortlabel($pathname)); + continue; + } elseif ($dbp->query("SELECT EXISTS(SELECT 1 FROM thumbs WHERE fid='".$fid."')")->fetch()[0]) { + // if no thumb file, then poll database + echo ProgressBar::next("Thumb record found for ".shortlabel($pathname)); + continue; + } else { + $update_rowid = false; + } + } + + if ($update_rowid) { + echo ProgressBar::next("Updating thumb for ".shortlabel($pathname)); + $stmt = $dbp->prepare("UPDATE thumbs SET fid = :fid, created = :created, relative_path = :relative_path, width = :width, height = :height, tool = :tool WHERE rowid = ".$update_rowid); } else { echo ProgressBar::next("Generating thumb for ".shortlabel($pathname)); + $stmt = $dbp->prepare("INSERT INTO thumbs VALUES (:fid, :created, :relative_path, :width, :height, :tool)"); } - - $stmt = $dbp->prepare("INSERT INTO thumbs VALUES (:fid, :created, :relative_path, :width, :height, :tool)"); - $stmt->BindValue(":fid",$fid); - $stmt->BindValue(":created",time()); $shellpath = escapeshellarg($pathname); - - // first try to make a thumb with external tools - $cmd = null; + $tmp_path = escapeshellarg("/tmp/".basename($pathname).".png"); // qlmanage workaround + + $fmt['sips'] = $tfile; + $fmt['ffmpeg'] = $tfile; + $fmt['ql-thumbnail'] = $tfile; + $fmt['qltool'] = $tpfile; + $fmt['qlmanage'] = $tpfile; + $fmt['vips'] = $tfile; + + $cmd['sips'] = "sips -s format jpeg -s formatOptions 80 --resampleHeightWidthMax ".$p['thumb_size']." ".$shellpath." --out ".$tfile; + $cmd['ffmpeg'] = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath." | cut -d'.' -f1) / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile; + $cmd['ql-thumbnail'] = $bin_qlthumb." ".$shellpath." ".$tfile." public.jpeg ".$p['thumb_size']." ".$p['thumb_size']." .8"; + $cmd['qltool'] = $bin_qltool." di ".$shellpath." ".($p['thumb_size']/2)." ".($p['thumb_size']/2)." | base64 --decode > ".$tpfile; + $cmd['qlmanage'] = "qlmanage -ti -f ".floor($p['thumb_size']/128)." -o /tmp/ ".$shellpath."; mv ".$tmp_path." ".$tpfile; + $cmd['vips'] = $bin_vips." ".$shellpath." -o ".$tfile."[Q=90,optimize_coding] --size=".$p['thumb_size']; + if (in_array($ext, $p['t_files']['sips'])) { - //$cmd = $bin_tv." ".$shellpath." -o ".$tfile."[Q=90,optimize_coding] --size=".$p['thumb_size']; - $cmd = "sips -s format jpeg -s formatOptions 80 --resampleHeightWidthMax ".$p['thumb_size']." ".$shellpath." --out ".$tfile; - $stmt->BindValue(":tool","sips"); + $external_tool = "sips"; } elseif (in_array($ext, $p['t_files']['ffmpeg'])) { - //$cmd = $bin_tf." -i ".$shellpath." -o ".$tfile." -s ".$p['thumb_size']." -c jpg -q 8.5"; - $cmd = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath." | cut -d'.' -f1) / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile; - $stmt->BindValue(":tool","ffmpeg"); + $external_tool = "ffmpeg"; + } else { + $external_tool = null; } - - if ($cmd) { shell_exec($cmd." 2>&1"); } - - // if those tools failed, try quicklook - if (!@filesize($tfile)) { - //$cmd = $bin_qlthumb." ".$shellpath." ".$tfile." public.jpeg-2000 ".$p['thumb_size']." ".$p['thumb_size']." .8"; - $cmd = $bin_qlthumb." ".$shellpath." ".$tfile." public.jpeg ".$p['thumb_size']." ".$p['thumb_size']." .8"; - shell_exec($cmd." 2>&1"); - $stmt->BindValue(":tool","quicklook"); + + // using ql-tool or qlmanage may generate blank media icons + switch ($p['thumb_priority']) { + case 0: + // external tool priority + $priority = array($external_tool,"ql-thumbnail"); + break; + case 1: + // ql-thumbnail priority + $priority = array("ql-thumbnail",$external_tool,"qltool","qlmanage"); + break; + case 2: + // qltool priority + $priority = array("qltool","qlmanage","ql-thumbnail",$external_tool); + break; + case 3: + // qlmanage priority + $priority = array("qlmanage","qltool","ql-thumbnail",$external_tool); + break; } - // success, move thumb into the bundle - // ignore generic music icon thumbs (7133) - if (file_exists($tfile) && @filesize($tfile) && @filesize($tfile) != 7133) { - $stmt->BindValue(":relative_path",substr($tfile, strlen($bpath))); - list($width, $height) = getimagesize($tfile); - $stmt->BindValue(":width",$width); - $stmt->BindValue(":height",$height); + foreach ($priority as $tool) { + if (@$cmd[$tool]) { + shell_exec($cmd[$tool]." 2>&1"); + msg($cmd[$tool]); + if (is_file($fmt[$tool]) && @filesize($fmt[$tool])) { + $stmt->BindValue(":fid",$fid); + $stmt->BindValue(":created",time()); + $stmt->BindValue(":tool",$tool); + $stmt->BindValue(":relative_path",substr($fmt[$tool], strlen($bpath))); + list($width, $height) = getimagesize($fmt[$tool]); + $stmt->BindValue(":width",$width); + $stmt->BindValue(":height",$height); + $stmt->execute(); + break; + } + } } - $stmt->execute(); - } echo ProgressBar::finish(); @@ -860,7 +909,7 @@ foreach ($files as $splFileInfo) { // DB - $stmt = $dbo->prepare("INSERT INTO files VALUES (:pid, :fid, :Pathname, :Path, :Filename, :Extension, :Type, :Size, :Inode, :Perms, :Owner, :ATime, :MTime, :CTime, :LinkTarget, :RealPath, :stat, :items, :newest, :fkind, :gfi_type, :gfi_attr, :gfi_created, :has_exif, :has_mediainfo, :has_hash, :thumb_filename, :thumb_width, :thumb_height, :contents_filename)"); + $stmt = $dbo->prepare("INSERT INTO files VALUES (:pid, :fid, :Pathname, :Path, :Filename, :Extension, :Type, :Size, :Inode, :Perms, :Owner, :ATime, :MTime, :CTime, :LinkTarget, :RealPath, :stat, :items, :newest, :fkind, :gfi_type, :gfi_attr, :gfi_created, :has_exif, :has_mediainfo, :has_hash, :thumb_filename, :thumb_width, :thumb_height, :thumb_tool, :contents_filename)"); // Identify dir, file, link or bundle dir @@ -1008,6 +1057,7 @@ foreach ($files as $splFileInfo) { $stmt->BindValue(":thumb_filename",$fetch_thumb['relative_path']); $stmt->BindValue(":thumb_width",$fetch_thumb['width']); $stmt->BindValue(":thumb_height",$fetch_thumb['height']); + $stmt->BindValue(":thumb_tool",$fetch_thumb['tool']); } else { $stmt->BindValue(":thumb_filename",null); } diff --git a/YubaPrefs.php b/YubaPrefs.php index fd0161c..33dee53 100644 --- a/YubaPrefs.php +++ b/YubaPrefs.php @@ -10,7 +10,8 @@ require (__DIR__."/functions.pashua.php"); // Read Prefs -$p = unserialize(file_get_contents(__DIR__."/prefs.php")); +$prefs_file = "/Users/".get_current_user()."/Library/Preferences/yuba_prefs.php"; +$p = unserialize(file_get_contents($prefs_file)); if(!$p['bdest']) { $p['bdest'] = "/Users/".get_current_user()."/Documents/Yuba/"; if (!is_dir($p['bdest'])) { if (!mkdir($p['bdest'])) { echo "Error creating destination directory"; } } @@ -19,7 +20,8 @@ if(!$p['bdest']) { // Load strings $strings[] = array("Do nothing","Reveal result in Finder","Upload result with rsync"); -$strings[] = array("Bypass","Generate","Rebuild (tk)"); +$strings[] = array("Bypass","Generate","Rebuild"); +$strings[] = array("external","ql-thumbnail","qltool","qlmanage"); $result = Pashua::showDialog(makeWindowString($p, $strings)); @@ -34,6 +36,7 @@ if (@$result['cb']) { $result['postflight'] = array_search($result['postflight'],$strings[0]); $result['thumbs'] = array_search($result['thumbs'],$strings[1]); +$result['thumb_priority'] = array_search($result['thumb_priority'],$strings[2]); // If the user didn't specify a destpath, set to default @@ -47,7 +50,7 @@ $result['destpath'] = str_replace("Desktop/Desktop","Desktop",$result['destpath' // Write Prefs -file_put_contents("prefs.php",serialize($result)); +file_put_contents($prefs_file,serialize($result)); echo "1"; ?> \ No newline at end of file diff --git a/bin/qltool b/bin/qltool new file mode 100755 index 0000000000000000000000000000000000000000..448fe660aa1cfe6c1176162df660eb20477fd078 GIT binary patch literal 76896 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