Merge remote-tracking branch 'mike/master' into dev
This commit is contained in:
commit
0325efeb35
62
Zotlabs/Daemon/Thumbnail.php
Normal file
62
Zotlabs/Daemon/Thumbnail.php
Normal 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');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
);
|
||||
|
@ -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>";
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -105,6 +105,10 @@ a,
|
||||
color: $link_colour;
|
||||
}
|
||||
|
||||
.cloud-icon.tiles i {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:focus,
|
||||
.fakelink:hover,
|
||||
|
@ -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}}
|
||||
|
Reference in New Issue
Block a user