diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fe461c..26ba2a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog All notable changes to this project will be documented in this file. Older changes are summarized on individual commits. +## [0.8.0.1] +- Move batchfile generation to Prescan +- Rewrite batchfile generation (batch now handles files, links, dirs) +- Rewrite spotlight and move to batch +- Replace directory previews with flacdiricon tool + ## [0.8.0.0] - Refactor for thumb/icon "modes" - Integrate ql-icon diff --git a/MainMenu.nib/designable.nib b/MainMenu.nib/designable.nib index 1a4ec07..770b5c8 100644 --- a/MainMenu.nib/designable.nib +++ b/MainMenu.nib/designable.nib @@ -55,7 +55,7 @@ - + diff --git a/MainMenu.nib/keyedobjects.nib b/MainMenu.nib/keyedobjects.nib index 5697209..1b4187b 100644 Binary files a/MainMenu.nib/keyedobjects.nib and b/MainMenu.nib/keyedobjects.nib differ diff --git a/README.md b/README.md index 8d651ba..be9b2f2 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Yuba** generates web-browsable catalogues from locally attached HFS+ filesystems. Its client application gathers forensic-quality data about a volume, 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 SQLite 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.8.0.0](https://www.profiteroles.org/git/p/Yuba/raw/master/Yuba.app.zip) ([Changelog](CHANGELOG.md)) +####[⇩ Download Yuba 0.8.0.1](https://www.profiteroles.org/git/p/Yuba/raw/master/Yuba.app.zip) ([Changelog](CHANGELOG.md)) ## Features diff --git a/Tester.zip b/Tester.zip index a3296a7..bee8654 100644 Binary files a/Tester.zip and b/Tester.zip differ diff --git a/Yuba.app.zip b/Yuba.app.zip index 5636eeb..8165acf 100644 Binary files a/Yuba.app.zip and b/Yuba.app.zip differ diff --git a/Yuba.php b/Yuba.php index 93a7e31..a6585fa 100755 --- a/Yuba.php +++ b/Yuba.php @@ -35,7 +35,7 @@ require("filetypes.php"); // Manual prefs -$wopt_steps = 8; // total number of steps +$wopt_steps = 7; // total number of steps $wopt_currstep = 1; if ($p['debug']) { $wopt_clear = 0; } else { $wopt_clear = 1; } $wopt_debug_unique = 0; @@ -307,6 +307,7 @@ $dbo->exec("CREATE TABLE files ( thumb_height INTEGER, thumb_tool TEXT, icon_filename TEXT, + icon_tool TEXT, contents_filename TEXT )"); @@ -421,6 +422,7 @@ $fids = array(); $noread = array(); $fx = new SplFixedArray($passed_file); $splcount = 0; +$bline = array(); echo ProgressBar::start($passed_total,"Prescan (".stepString().")"); @@ -431,6 +433,8 @@ foreach ($files as $splFileInfo) { $shellpath = escapeshellarg($splFileInfo->getPathname()); $realpath = $splFileInfo->getRealPath(); + $fid = md5($splFileInfo->getSize().$splFileInfo->getMtime().$splFileInfo->getBasename()); + $key = md5($pathname); $pkey = md5($path); @@ -444,7 +448,6 @@ foreach ($files as $splFileInfo) { if ($splFileInfo->getType() != "dir" && $splFileInfo->getType() != "link") { - $fid = md5($splFileInfo->getSize().$splFileInfo->getMtime().$splFileInfo->getBasename()); $dx[$fid][] = $pathname; $fx[$splcount] = array($fid, $pathname); $family[$key]['fid'] = $fid; @@ -473,22 +476,22 @@ foreach ($files as $splFileInfo) { // Create batch - $line = array(); if ($p['thumbs'] || $p['icons'] || $p['meta'] || $p['hash'] || $p['contents'] || $p['spotlight']) { $parts = array(); $parts[] = $bin_php; - $parts[] = escapeshellarg(realpath("helper2.php")); + $parts[] = escapeshellarg(realpath("helper.php")); $parts[] = $i; $parts[] = $passed_total; + $parts[] = $fid; $parts[] = escapeshellarg($pathname); $parts[] = $splFileInfo->getType(); $parts[] = escapeshellarg($bpath); $parts[] = $mytime; $tcmd = implode(" ",$parts); - msg($tcmd); - $line[] = $tcmd; + //msg($tcmd); + $bline[] = $tcmd; } @@ -508,10 +511,9 @@ foreach ($files as $splFileInfo) { } - -$batchfile = $tmpdir."/__batch.sh"; -if (!empty($line)) { - file_put_contents($batchfile,implode("\n", $line)); +$batchfile = $tmpdir."/batch.sh"; +if (!empty($bline)) { + file_put_contents($batchfile,implode("\n", $bline)); msg("Writing batch to file"); } @@ -591,41 +593,16 @@ $dbo->exec($stmt); $wopt_currstep++; -// Directory Previews +// Init Spotlight DB ////////////////////////////////////////// -echo ProgressBar::start(count($fx),"Searching for directory previews (".stepString().")"); -foreach ($fx as $array) { - $fid = $array[0]; - $pathname = $array[1]; - if (in_array(basename($pathname),$p['p_files'])) { - $dpreview[dirname($pathname)] = $fid; - } - echo ProgressBar::next(); - } -echo ProgressBar::finish($wopt_clear); +if ($p['spotlight']) { $dbo->exec("CREATE TABLE mdls (id INTEGER PRIMARY KEY,".implode(",",$cbuild).")"); } // Helper ////////////////////////////////////////// -if ($p['thumbs'] || $p['icons'] || $p['meta'] || $p['hash'] || $p['contents']) { +if (file_exists($batchfile)) { - echo ProgressBar::start($passed_file,"Creating batch (".stepString().")",1); - - $batchfile = $tmpdir."/_batch.sh"; - $helper = realpath("helper.php"); - - foreach ($fx as $count => $array) { - $fid = $array[0]; - $pathname = $array[1]; - $tcmd = $bin_php." ".escapeshellarg($helper)." ".$fid." ".escapeshellarg($pathname)." ".escapeshellarg($bpath)." ".$mytime."; printf '\\n".ProgressBar::next()."'"; - msg($tcmd); - $line[] = $tcmd; - } - - file_put_contents($batchfile,implode("\n", $line)); - echo ProgressBar::finish($wopt_clear); - echo ProgressBar::start($passed_file,"Running batch (".stepString().")"); if ($p['parallel']) { passthru($bin_parallel." < ".$batchfile); @@ -648,101 +625,7 @@ $dbp->exec("CREATE INDEX IF NOT EXISTS mediainfo_index ON mediainfo (fid)"); $dbp->exec("CREATE INDEX IF NOT EXISTS thumbs_index ON thumbs (fid)"); $dbp->exec("CREATE INDEX IF NOT EXISTS icons_index ON icons (fid)"); -// Spotlight -////////////////////////////////////////// - -$mb['i'] = array( "PixelWidth", - "PixelHeight", - "Latitude", - "Longitude", - "DurationSeconds", - "UseCount", - "FSInvisible", - "NumberOfPages", - "PageHeight", - "PageWidth", - "TotalBitRate" ); - -$mb['t'] = array( "Title", - "ContentType", - "Creator", - "FSCreatorCode", - "Kind", - "FSTypeCode" ); - -$mb['a'] = array( "UserTags", - "WhereFroms", - "EncodingApplications" ); - -$mb['d'] = array( "DateAdded", - "LastUsedDate", - "ContentModificationDate", - "ContentCreationDate" ); - -$ibuild[] = ":pid, :spotlight"; -$cbuild[] = "pid TEXT, spotlight TEXT"; -foreach (array_merge($mb['i'],$mb['d']) as $item) { - $cbuild[] = $item." INTEGER"; - $ibuild[] = ":".$item; - } -foreach (array_merge($mb['t'],$mb['a']) as $item) { - $cbuild[] = $item." TEXT"; - $ibuild[] = ":".$item; - } - -$dbo->exec("CREATE TABLE mdls (".implode(",",$cbuild).")"); - -if ($p['spotlight']) { - - echo ProgressBar::start($passed_total,"Spotlight (".stepString().")"); - - foreach ($files as $splFileInfo) { - - $path = $splFileInfo->getPathname(); - msg($path); - - $pid = md5($path); - $shellpath = escapeshellarg($path); - $mdls = shell_exec("mdls -plist - ".$shellpath." 2>&1"); - - if (substr_count(@$mdls,"\n") > 1) { - $spotlight = $parser->parseString(utf8_for_xml($mdls)); - } else { - $spotlight = array(); - } - - $stmt = $dbo->prepare("INSERT INTO mdls VALUES (".implode(",",$ibuild).")"); - - foreach ($mb as $key => $list) { - foreach ($list as $item) { - - if (@$spotlight["kMDItem".$item]) { - $stmt->BindValue(":pid",$pid); - $stmt->BindValue(":spotlight",$mdls); - switch($key) { - case "i": - case "t": - $stmt->BindValue(":".$item,$spotlight["kMDItem".$item]); - break; - case "a": - $stmt->BindValue(":".$item,serialize($spotlight["kMDItem".$item])); - break; - case "d": - $stmt->BindValue(":".$item,strtotime($spotlight["kMDItem".$item])); - break; - } - } - } - } - - $stmt->execute(); - echo ProgressBar::next(true); - - } - - echo ProgressBar::finish($wopt_clear); - - } +$dbo->exec("CREATE INDEX IF NOT EXISTS mdls_index ON mdls (id)"); // Files ////////////////////////////////////////// @@ -755,7 +638,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, :thumb_tool, :icon_filename, :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, :icon_filename, :icon_tool, :contents_filename)"); // Identify dir, file, link or bundle dir @@ -880,9 +763,25 @@ foreach ($files as $splFileInfo) { // Pool - if ($type == "file") { + if ($type == "dir") { - unset($fetch_exif, $fetch_media, $fetch_hash, $fetch_thumb, $yes_exif, $yes_media, $yes_hash); + unset($fetch_icon); + + $fetch_icon = @$dbp->query("SELECT * FROM icons WHERE fid='".$pid."'")->fetch(); + if (@$fetch_icon['relative_path']) { + $stmt->BindValue(":icon_filename",$fetch_icon['relative_path']); + $stmt->BindValue(":icon_tool",$fetch_icon['tool']); + } + + } elseif ($type == "file") { + + $fetch_icon = @$dbp->query("SELECT * FROM icons WHERE fid='".$fid."'")->fetch(); + if (@$fetch_icon['relative_path']) { + $stmt->BindValue(":icon_filename",$fetch_icon['relative_path']); + $stmt->BindValue(":icon_tool",$fetch_icon['tool']); + } + + unset($fetch_exif, $fetch_media, $fetch_hash, $fetch_thumb, $fetch_icon, $yes_exif, $yes_media, $yes_hash); $yes_exif = $dbp->query("SELECT rowid FROM exiftool WHERE fid='".$fid."'")->fetch()[0]; $stmt->BindValue(":has_exif",$yes_exif); @@ -896,9 +795,8 @@ foreach ($files as $splFileInfo) { $yes_contents = $dbp->query("SELECT relative_path FROM contents WHERE fid='".$fid."'")->fetch()[0]; $stmt->BindValue(":contents_filename",$yes_contents); - if (!in_array($extension, $p['t_skip'])) { - $fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$fid."'")->fetch(); - } + $fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$fid."'")->fetch(); + if (@$fetch_thumb['relative_path']) { $stmt->BindValue(":thumb_filename",$fetch_thumb['relative_path']); $stmt->BindValue(":thumb_width",$fetch_thumb['width']); @@ -907,30 +805,8 @@ foreach ($files as $splFileInfo) { } else { $stmt->BindValue(":thumb_filename",null); } - - $fetch_icon = $dbp->query("SELECT * FROM icons WHERE fid='".$fid."'")->fetch(); - if (@$fetch_icon['relative_path']) { - $stmt->BindValue(":icon_filename",$fetch_icon['relative_path']); - } else { - $stmt->BindValue(":icon_filename",null); - } - - } elseif ($type == "dir") { - - if (is_array(@$dpreview) && @$dpreview[$pathname]) { - $fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$dpreview[$pathname]."'")->fetch(); - if (@$fetch_thumb['relative_path']) { - $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); - } - } } - // ------------------------------------------------ // @@ -1109,7 +985,7 @@ while ($row_a = $loop->fetch()) { } elseif (!$found) { // find a single value - list($kind,$item) = explode("^",$dindex); + list($kind,$item) = @explode("^",$dindex); if (@$m[$kind][$item]) { $stmt->BindValue(":".$name,@sanitize($m[$kind][$item],$type)); $found = 1; diff --git a/current_version.txt b/current_version.txt index 01eb481..f588047 100755 --- a/current_version.txt +++ b/current_version.txt @@ -1 +1 @@ -0.8.0.0 \ No newline at end of file +0.8.0.1 \ No newline at end of file diff --git a/filetypes.php b/filetypes.php index dc1465a..4d05393 100755 --- a/filetypes.php +++ b/filetypes.php @@ -16,6 +16,7 @@ $bin_pngquant = escapeshellarg(__DIR__."/bin/pngquant"); $bin_parallel = escapeshellarg(__DIR__."/bin/parallel"); $bin_convert = escapeshellarg(__DIR__."/bin/convert"); $bin_flacicon = escapeshellarg(__DIR__."/bin/flacicon"); +$bin_flacdiricon = escapeshellarg(__DIR__."/bin/flacdiricon"); // System tools $bin_php = "php"; @@ -245,4 +246,47 @@ foreach ($p['t_skip'] as $ext) { $p['t_skip'][] = strtoupper($ext); } foreach ($p['i_skip'] as $ext) { $p['i_skip'][] = strtoupper($ext); } foreach ($p['p_files'] as $file) { $p['p_files'][] = strtoupper($file); } +// Spotlight ////////////////////////////////////////// + +$mb['i'] = array( "PixelWidth", + "PixelHeight", + "Latitude", + "Longitude", + "DurationSeconds", + "UseCount", + "FSInvisible", + "NumberOfPages", + "PageHeight", + "PageWidth", + "TotalBitRate" ); + +$mb['t'] = array( "Title", + "ContentType", + "Creator", + "FSCreatorCode", + "Kind", + "FSTypeCode" ); + +$mb['a'] = array( "UserTags", + "WhereFroms", + "EncodingApplications" ); + +$mb['d'] = array( "DateAdded", + "LastUsedDate", + "ContentModificationDate", + "ContentCreationDate" ); + +$ibuild[] = ":pid, :spotlight"; +$cbuild[] = "pid TEXT, spotlight TEXT"; +foreach (array_merge($mb['i'],$mb['d']) as $item) { + $cbuild[] = $item." INTEGER"; + $ibuild[] = ":".$item; + } +foreach (array_merge($mb['t'],$mb['a']) as $item) { + $cbuild[] = $item." TEXT"; + $ibuild[] = ":".$item; + } + +unset($item); + ?> \ No newline at end of file diff --git a/helper.php b/helper.php index a4376cd..c792600 100755 --- a/helper.php +++ b/helper.php @@ -4,6 +4,9 @@ // // ////////////////////////////////////////// +ini_set('memory_limit', '10240M'); +date_default_timezone_set("America/Los_Angeles"); + $prefs_file = "/Users/".get_current_user()."/Library/Preferences/org.profiteroles.Yuba.php"; $p = unserialize(file_get_contents($prefs_file)); @@ -17,7 +20,7 @@ $dm = ""; function dfm ($string, $flag = 0) { // dumb workaround for debug messages appearing out of order // uncomment next line to revert to instant message printing - dm($string); return; + //dm($string); return; global $dm; if ($flag == 1) { @@ -29,13 +32,19 @@ function dfm ($string, $flag = 0) { } } -$fid = $argv[1]; -$pathname = $argv[2]; +$bdone = $argv[1]; +$btotal = $argv[2]; +$fid = $argv[3]; +$pathname = $argv[4]; +$pid = md5($pathname); $shellpath = escapeshellarg($pathname); $ext = pathinfo($pathname,PATHINFO_EXTENSION); $file = pathinfo($pathname, PATHINFO_BASENAME); -$bpath = $argv[3]; -$mytime = $argv[4]; +$btype = $argv[5]; +$bpath = $argv[6]; +$mytime = $argv[7]; + +$parser = new plistParser(); $stamp = date("Y-m-d_H-i-s", $mytime); $messages_log_file = $bpath."/".$stamp."_messages.log"; @@ -43,6 +52,20 @@ $messages_log_file = $bpath."/".$stamp."_messages.log"; $tmpdir = "/tmp/yuba/".$mytime; if (!is_dir($tmpdir)) { mkdir($tmpdir,0777,true); dfm("mkdir ",$tmpdir); } +// Main DB + +$dbo = new PDO("sqlite:".$bpath."/".$stamp.".sqlite3"); +$dbo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$dbo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + +//$dbo->query("PRAGMA page_size = 4096"); +//$dbo->query("PRAGMA cache_size = 10000"); +//$dbo->query("PRAGMA locking_mode = EXCLUSIVE"); +//$dbo->query("PRAGMA synchronous = NORMAL"); +$dbo->query("PRAGMA journal_mode = WAL"); + +// Pool DB + $dbp = new PDO("sqlite:".$bpath."/pool.sqlite3"); $dbp->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbp->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); @@ -62,7 +85,7 @@ dfm("BATCH INIT ".$file.":".print_r($argv,true),2); // Thumbs ////////////////////////////////////////// thumbs: -if ($p['thumbs']) { +if ($p['thumbs'] && $btype == "file" && $ext != "DS_Store") { dfm("THUMBS",1); @@ -195,7 +218,7 @@ if ($p['thumbs']) { // Icons ////////////////////////////////////////// icons: -if ($p['icons']) { +if ($p['icons'] && ($btype == "file" || $btype == "dir") && $ext != "DS_Store") { dfm("ICONS",1); @@ -234,8 +257,7 @@ if ($p['icons']) { } - $stmt->BindValue(":fid",$fid); - + $cmd['flacdiricon'] = $bin_flacdiricon." ".$shellpath." ".$p['icon_size']." ".$tfile; $cmd['flacicon'] = $bin_flacicon." ".$shellpath." ".$p['icon_size']." ".$tfile; $cmd['ql-icon'] = $bin_qlicon." --input=".$shellpath." --width=".$p['icon_size']." --height=".$p['icon_size']." | ".$bin_pngquant." - -o ".$tfile; $cmd['qltool'] = $bin_qltool." di ".$shellpath." ".$p['icon_size']." ".$p['icon_size']." | base64 --decode | ".$bin_convert." - -scale 50% - | ".$bin_pngquant." - -o ".$tfile; @@ -267,16 +289,25 @@ if ($p['icons']) { } else { - if ($ext == "flac") { - $tools = array("flacicon","ql-icon","qltool"); + if ($btype == "dir") { + $stmt->BindValue(":fid",$pid); + $tools = array("flacdiricon","qltool"); } else { - $tools = array("ql-icon","qltool"); + $stmt->BindValue(":fid",$fid); + if ($ext == "flac") { + $tools = array("flacicon","ql-icon","qltool"); + } else { + $tools = array("ql-icon","qltool"); + } } + + unset($mytool); foreach ($tools as $tool) { if (!@filesize($tfile)) { shell_exec($cmd[$tool]." ".$redirect); dfm($cmd[$tool]); $estring .= " ->".$tool; + $mytool = $tool; } } @@ -309,7 +340,7 @@ if ($p['icons']) { dfm("moving ".$tfile." to ".$dfile); $stmt->BindValue(":created",time()); $stmt->BindValue(":relative_path",substr($dfile,strlen($bpath))); - $stmt->BindValue(":tool",$tool); + $stmt->BindValue(":tool",$mytool); $estring .= " ->use"; } @@ -317,7 +348,7 @@ if ($p['icons']) { } else { $estring .= " ->discard"; - dfm($tool." produced a bad file (size=".$checksize.")"); + dfm($mytool." produced a bad file (size=".$checksize.")"); } @@ -332,7 +363,7 @@ if ($p['icons']) { // Metadata ////////////////////////////////////////// meta: -if ($p['meta']) { +if ($p['meta'] && $btype == "file" && $ext != "DS_Store") { dfm("META",1); @@ -389,7 +420,7 @@ if ($p['meta']) { // Hash ////////////////////////////////////////// hashy: -if ($p['hash']) { +if ($p['hash'] && $btype == "file" && $ext != ".DS_Store") { dfm("HASH",1); @@ -423,7 +454,7 @@ if ($p['hash']) { // Contents ////////////////////////////////////////// contents: -if ($p['contents']) { +if ($p['contents'] && $btype == "file") { dfm("CONTENTS",1); @@ -463,6 +494,53 @@ if ($p['contents']) { } } +// Spotlight ////////////////////////////////////////// + +if ($p['spotlight']) { + + dfm("SPOTLIGHT",1); + $estring .= " SPOTLIGHT"; + + $cmd = "mdls -plist - ".$shellpath." ".$redirect; + dfm($cmd); + $mdls = shell_exec($cmd); + + if (substr_count(@$mdls,"\n") > 1) { + $spotlight = $parser->parseString(utf8_for_xml($mdls)); + } else { + $spotlight = array(); + } + + $stmt = $dbo->prepare("INSERT INTO mdls VALUES (:id,".implode(",",$ibuild).")"); + $stmt->BindValue(":id",$bdone+1); + + foreach ($mb as $key => $list) { + foreach ($list as $item) { + + if (@$spotlight["kMDItem".$item]) { + $stmt->BindValue(":pid",$pid); + $stmt->BindValue(":spotlight",$mdls); + switch($key) { + case "i": + case "t": + $stmt->BindValue(":".$item,$spotlight["kMDItem".$item]); + break; + case "a": + $stmt->BindValue(":".$item,serialize($spotlight["kMDItem".$item])); + break; + case "d": + $stmt->BindValue(":".$item,strtotime($spotlight["kMDItem".$item])); + break; + } + } + } + } + + $estring .= " ->db"; + $stmt->execute(); + + } + // Inserts ////////////////////////////////////////// dfm("SQL",1); @@ -471,5 +549,6 @@ foreach ($sbatch as $stmt) { $stmt->execute(); dfm($stmt->queryString); } dm($dm); echo msg($estring,false); +echo "\n"."PROGRESS:".round(($bdone/$btotal)*100,2)."\n"; ?> \ No newline at end of file diff --git a/web/rtc.php b/web/rtc.php index 8fd9ea3..f4c0fd1 100644 --- a/web/rtc.php +++ b/web/rtc.php @@ -4,7 +4,7 @@ // Yuba RTC Browser ///////////////////////////////////////////////////////////////// -$browser_version = "0.7.13.2"; +$browser_version = "0.8.0.1"; require "togggle.php"; require "lib/ref/ref.php"; @@ -25,7 +25,7 @@ $hidefiles = array(".DS_Store");