Merge remote-tracking branch 'mike/master' into dev

This commit is contained in:
Mario Vavti 2017-11-20 14:27:20 +01:00
commit 0325efeb35
11 changed files with 169 additions and 64 deletions

View File

@ -0,0 +1,62 @@
<?php /** @file */
namespace Zotlabs\Daemon;
class Thumbnail {
static public function run($argc,$argv) {
if(! $argc == 2)
return;
$c = q("select * from attach where hash = '%s' ",
dbesc($argv[1])
);
if(! $c)
return;
$preview_style = intval(get_config('system','thumbnail_security',0));
$attach = $c[0];
$isize = 300;
if(strpos($attach['filetype'],'text/') !== false) {
$stream = @fopen($attach['content'],'rb');
if($stream) {
$content = trim(stream_get_contents($stream,4096));
$content = str_replace("\r",'',$content);
$content_a = explode("\n",$content);
}
if($content_a) {
$fsize = 4;
$lsize = 8;
$image = imagecreate($isize,$isize);
imagecolorallocate($image,255,255,255);
$colour = imagecolorallocate($image,0,0,0);
$border = imagecolorallocate($image,64,64,64);
$x1 = 0;
$y1 = 0;
$x2 = ImageSX($image) - 1;
$y2 = ImageSY($image) - 1;
for($i = 0; $i < 2; $i++) {
ImageRectangle($image, $x1++, $y1++, $x2--, $y2--, $border);
}
foreach($content_a as $l => $t) {
$l = $l + 1;
$x = 3;
$y = ($l * $lsize) + 3 - $fsize;
imagestring($image,1,$x,$y,$t,$colour);
if(($l * $lsize) >= $isize) {
break;
}
}
imagejpeg($image,$attach['content'] . '.thumb');
}
}
}
}

View File

@ -492,10 +492,11 @@ class Ping extends \Zotlabs\Web\Controller {
$t3 = dba_timer();
if($vnotify & (VNOTIFY_NETWORK|VNOTIFY_CHANNEL)) {
$r = q("SELECT id, item_wall FROM item
WHERE item_unseen = 1 and uid = %d
$item_normal
AND author_xchan != '%s'",
AND author_xchan != '%s' $sql_extra ",
intval(local_channel()),
dbesc($ob_hash)
);

View File

@ -208,6 +208,16 @@ class Browser extends DAV\Browser\Plugin {
$photo_icon = '';
$preview_style = intval(get_config('system','thumbnail_security',0));
$r = q("select content from attach where hash = '%s' and uid = %d limit 1",
dbesc($attachHash),
intval($owner)
);
if($r && file_exists(dbunescbin($r[0]['content']) . '.thumb')) {
$photo_icon = 'data:image/jpeg;base64,' . base64_encode(file_get_contents(dbunescbin($r[0]['content']) . '.thumb'));
// logger('found thumb: ' . $photo_icon);
}
if(strpos($type,'image/') === 0 && $attachHash) {
$r = q("select resource_id, imgscale from photo where resource_id = '%s' and imgscale in ( %d, %d ) order by imgscale asc limit 1",
dbesc($attachHash),
@ -220,12 +230,11 @@ class Browser extends DAV\Browser\Plugin {
if($type === 'image/svg+xml' && $preview_style > 0) {
$photo_icon = $fullPath;
}
}
$g = [ 'resource_id' => $attachHash, 'thumbnail' => $photo_icon, 'security' => $preview_style ];
call_hooks('file_thumbnail', $g);
$photo_icon = $g['photo_icon'];
$photo_icon = $g['thumbnail'];
$attachIcon = ""; // "<a href=\"attach/".$attachHash."\" title=\"".$displayName."\"><i class=\"fa fa-arrow-circle-o-down\"></i></a>";

View File

@ -362,6 +362,8 @@ class Directory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
$args = array( 'resource_id' => $hash, 'album' => $album, 'os_syspath' => $f, 'os_path' => $xpath['os_path'], 'display_path' => $xpath['path'], 'filename' => $name, 'getimagesize' => $gis, 'directory' => $direct);
$p = photo_upload($c[0], \App::get_observer(), $args);
}
\Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $this->folder_hash ]);
$sync = attach_export_data($c[0], $hash);

View File

@ -244,6 +244,9 @@ class File extends DAV\Node implements DAV\IFile {
}
}
\Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $this->data['hash'] ]);
$sync = attach_export_data($c[0],$this->data['hash']);
if($sync)

View File

@ -951,6 +951,9 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
call_hooks('photo_upload_end', $ret);
}
\Zotlabs\Daemon\Master::Summon([ 'Thumbnail' , $hash ]);
if($dosync) {
$sync = attach_export_data($channel,$hash);

View File

@ -241,69 +241,84 @@ abstract class photo_driver {
}
/**
* @brief reads exif data from filename
*/
public function exif($filename) {
public function orient($filename) {
if((! function_exists('exif_read_data'))
|| (! in_array($this->getType(), [ 'image/jpeg' , 'image/tiff'] ))) {
return false;
}
/**
* This function is a bit unusual, because it is operating on a file, but you must
* first create an image from that file to initialise the type and check validity
* of the image.
/*
* PHP 7.2 allows you to use a stream resource, which should reduce/avoid
* memory exhaustion on large images.
*/
if(! $this->is_valid())
return false;
if((! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg'))
return false;
$exif = @exif_read_data($filename,null,true);
if($exif) {
$ort = $exif['IFD0']['Orientation'];
switch($ort)
{
case 1: // nothing
break;
case 2: // horizontal flip
$this->flip();
break;
case 3: // 180 rotate left
$this->rotate(180);
break;
case 4: // vertical flip
$this->flip(false, true);
break;
case 5: // vertical flip + 90 rotate right
$this->flip(false, true);
$this->rotate(-90);
break;
case 6: // 90 rotate right
$this->rotate(-90);
break;
case 7: // horizontal flip + 90 rotate right
$this->flip();
$this->rotate(-90);
break;
case 8: // 90 rotate left
$this->rotate(90);
break;
}
return $exif;
if(version_compare(PHP_VERSION,'7.2.0') >= 0) {
$f = @fopen($filename,'rb');
}
else {
$f = $filename;
}
return false;
if($f) {
return @exif_read_data($f);
}
return false;
}
/**
* @brief orients current image based on exif orientation information
*/
public function orient($exif) {
if(! ($this->is_valid() && $exif)) {
return false;
}
$ort = $exif['IFD0']['Orientation'];
if(! $ort) {
return false;
}
switch($ort) {
case 1: // nothing
break;
case 2: // horizontal flip
$this->flip();
break;
case 3: // 180 rotate left
$this->rotate(180);
break;
case 4: // vertical flip
$this->flip(false, true);
break;
case 5: // vertical flip + 90 rotate right
$this->flip(false, true);
$this->rotate(-90);
break;
case 6: // 90 rotate right
$this->rotate(-90);
break;
case 7: // horizontal flip + 90 rotate right
$this->flip();
$this->rotate(-90);
break;
case 8: // 90 rotate left
$this->rotate(90);
break;
default:
break;
}
return true;
}

View File

@ -203,7 +203,13 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
$exif = $ph->orient(($args['os_syspath']) ? $args['os_syspath'] : $src);
// obtain exif data from the source file if present
$exif = $ph->exif(($args['os_syspath']) ? $args['os_syspath'] : $src);
if($exif) {
$ph->orient($exif);
}
@unlink($src);

View File

@ -2704,8 +2704,8 @@ function linkify_tags($a, &$body, $uid, $diaspora = false) {
function getIconFromType($type) {
$iconMap = array(
//Folder
t('Collection') => 'fa-folder',
'multipart/mixed' => 'fa-folder', //dirs in attach use this mime type
t('Collection') => 'fa-folder-o',
'multipart/mixed' => 'fa-folder-o', //dirs in attach use this mime type
//Common file
'application/octet-stream' => 'fa-file-o',
//Text

View File

@ -105,6 +105,10 @@ a,
color: $link_colour;
}
.cloud-icon.tiles i {
color: #aaa;
}
a:hover,
a:focus,
.fakelink:hover,

View File

@ -3,7 +3,7 @@
{{if $parentpath}}
<div class="cloud-container" >
<div class="cloud-icon"><a href="{{$parentpath.path}}">
<div class="cloud-icon tiles"><a href="{{$parentpath.path}}">
<i class="fa fa-fw fa-level-up" ></i>
</a>
</div>
@ -14,7 +14,7 @@
{{foreach $entries as $item}}
<div class="cloud-container">
<div class="cloud-icon"><a href="{{$item.fullPath}}">
<div class="cloud-icon tiles"><a href="{{$item.fullPath}}">
{{if $item.photo_icon}}
<img src="{{$item.photo_icon}}" title="{{$item.type}}" >
{{else}}