register_hook('MEDIA_UPLOAD_FINISH', 'BEFORE', $this, '_media_finish'); $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, '_insert_exif'); } function __construct() { $this->init_fields(); $this->toolTipOptions = $this->getConf('fields'); if(!empty($this->toolTipOptions)) $this->toolTipOptions = explode(',',$this->toolTipOptions); } /* Array ( [FileModified] => 1541022351 [Time] => 1541022351 [TimeSource] =>. [TimeStr] => 2018-10-31 16:45:51 [EarliestTime] => 1541022351 [EarliestTimeSource] =>. [EarliestTimeStr] => 2018-10-31 16:45:51 [LatestTime] => 1541022351 [LatestTimeSource] => FileModified [LatestTimeStr] => 2018-10-31 16:45:51 ) */ function _media_finish(Doku_Event $event, $param) { global $USERINFO, $INPUT; $this->setupLocale(); $meta = new JpegMeta($event->data[0]); $camera = $meta->getCamera(); if(!$camera) return; $dt = $this->date_time($event->data[0]); $user =$this->_user_name(); if(!$dt && !$user) return; if($user) { $user = '_' . $user . '.'; } else $user = '.'; if($dt) { $dt .= '_'; } $parts = pathinfo($event->data[1]); $parts['filename'] = trim($parts['filename'],'_'); $file_name = $dt . $parts['filename'] . $user . $parts['extension']; $path = $parts['dirname'] . "/$file_name"; $ow = $INPUT->str('ow'); if(!empty($camera) && file_exists($path) && $ow == 'false') { $event->preventDefault(); } $event->data[1] = $path; } /*set up user and client (user's real name) */ function _user_name() { global $USERINFO; $user = ""; $dw_session = array_keys($_SESSION); $auth =$_SESSION[$dw_session[0]]; $use_real = $this->getConf('enable_real'); $photogroups = $this->getConf('groups'); if(!empty($photogroups) ) { if(isset($auth)) { $user_grps = $auth['auth']['info']['grps']; } else if(isset($USERINFO) ) { $user_grps = $auth['auth']['info']['grps']; } if(!empty($user_grps)) { foreach($user_grps as $grp) { if(strpos($photogroups,$grp) !== false) { return $grp; } } } } if(isset($auth)) { if($this->getConf('enable_userid')) { $user = $auth['auth']['user']; } else if($use_real) { $user = $auth['auth']['info']['name']; $user=preg_replace('/\s+/', '_',$user); } } if($use_real && empty($user) && isset($USERINFO)) { $client_name = $USERINFO['name']; if(!empty($client_name)) $client_name = preg_replace('/\s+/', '_',$client_name); if(empty($user)) { $user = $client_name; } } if(!empty($user)) { if(function_exists ( 'utf8_strtolower' )) { $user = utf8_strtolower($user); } else $user = strtolower($user); } return $user; } function date_time($upload_path) { $date_style = $this->getConf('date_style'); if($date_style == 'none') return ""; $meta = new JpegMeta($upload_path); $dates = $meta->getDates(); $time_str = $dates['TimeStr']; list($dt,$tm) = preg_split("/\s/",$time_str); if($date_style=='date') return $dt; if(strpos($date_style,'s')== false) { $tm = preg_replace("/:\d+$/","",$tm,1); } $time_format = $this->getConf('time_format'); $tmsep = ($time_format == 'hour.min.sec') ? '.': ($time_format == 'hour-min-sec' ? '-' : "_"); $tm = str_replace(':',$tmsep,$tm); $dt=$dt . '_' .$tm; return $dt; } function _insert_exif(Doku_Event $event) { if(empty($this->toolTipOptions)) { return; } $event->data = preg_replace_callback( "/title=\"([^\"]+\.(jpg|jpeg|tiff))/i", function ($matches) { list($_pre,$_img) = explode('=',$matches[0]); // $matchs[0] has complete path to image $_img = trim($_img,'"'); $meta = new JpegMeta(mediaFN($_img)); /* if filename is omitted, then an artist and/or title is required */ $useFileName = in_array('File',$this->toolTipOptions); if(!$useFileName && $this->getFieldValue('Artist',$meta)) { $matches[0] = 'title="'; $BR = ""; } else $BR = '
'; if(in_array('Camera', $this->toolTipOptions)) { $camera = $meta->getCamera(); $camera = trim($camera); } else $camera = ""; if(in_array('Date', $this->toolTipOptions)) { $dates = $meta->getDates(); $time_str = $dates['TimeStr']; } else $time_str = ""; if(in_array('ImgSize', $this->toolTipOptions)) { $w = $this->getFieldValue('Width',$meta); $h = $this->getFieldValue('Height',$meta); if(!empty($w) && !empty($h)) { $matches[0] .= '" data-size ="' . $this->format_attribute("$w X $h pixels"); } } if(in_array('FileSize', $this->toolTipOptions)) { $matches[0] .= ', " data-fsize ="' . $this->format_attribute($this->getFieldValue('FileSize',$meta)); } if($camera) { //remove sometimes duplicate camera name $camera = preg_replace("/\b(\w+)(?:\s+\\1\b)/i", "$1", $camera); $speed = $meta->_info['exif']['ExposureTime']['val'];//getShutterSpeed(); $fstop = $meta->_info['exif']['FNumber']['val']; if($fstop) { $camera .= "  F:$fstop @ $speed sec."; } } if($time_str) { $camera .= "   tm=$time_str"; } if(in_array('Artist', $this->toolTipOptions)) { $artist = $this->getFieldValue('Artist',$meta); } if($_img) { $_title = $_img; } else $_title = $meta->getTitle(); if(!empty($artist) && !empty($_title)) { $matches[0] .= " $BR" . 'Artist: ' . trim($artist); if(!empty($_title) && strpos($matches[0],$_title) === false) $matches[0] .= ", " . $_title; } else if(!empty($artist)) { $matches[0] .= $this->getLang('creator') . $artist; } elseif(!$useFileName && !empty($_title)) { $matches[0] .= trim($_title); } $captionpos = $this->getConf('captionpos'); if(in_array('Caption', $this->toolTipOptions)) { $caption = $this->getFieldValue('Caption',$meta); if(!empty($caption) && $caption != $_title) { $matches[0] .= '" data-caption ="' . "$captionpos::" . $this->format_attribute($caption); } } if($camera) { $matches[0] .= '" data-rel ="' . $this->format_attribute($camera); } if(in_array('Copyright', $this->toolTipOptions)) { $copy = $meta->_info['exif']['Copyright']; if(empty($copy)) $copy = $this->getFieldValue('Copyright',$meta); } if(!empty($copy)) { $copypos = trim($this->getConf('copypos')); if($captionpos == 'screen') { $copypos = 'tooltip'; } $matches[0] .= '" license="' . "$copypos::" .$this->format_attribute($copy); } $matches[0] = preg_replace("/data-/","\n data-",$matches[0]); // msg(htmlentities($matches[0]),2); return $matches [0]; }, $event->data ); $event->data = str_replace('>\n data); } function format_attribute($value) { $value = trim($value); $value = htmlentities($value,ENT_DISALLOWED|ENT_QUOTES); $value = preg_replace('/\s+/',' ',$value); return $value; } function getFieldValue($field,$meta) { $ar = $this->fields[$field]; foreach($ar AS $el) { if(is_array($el)) { while(!empty($el)) { $inner = array_shift($el); $value = $meta->getField($inner); if($value) return $value; } } $value = $meta->getField($el); if($value) { return $value; } } return false; } function init_fields() { $this->fields = array( 'Title' => array('Iptc.Headline', 'img_title', 'text'), 'Date' => array('', 'img_date', 'date', array('Date.EarliestTime')), 'File' => array('', 'img_fname', 'text', array('File.Name')), 'Caption' => array('Iptc.Caption', 'img_caption', 'textarea', array('Exif.UserComment', 'Exif.TIFFImageDescription', 'Exif.TIFFUserComment')), 'Artist' => array('Iptc.Byline', 'img_artist', 'text', array('Exif.TIFFArtist', 'Exif.Artist', 'Iptc.Credit')), 'Copyright' => array('Iptc.CopyrightNotice', 'img_copyr', 'text', array('Exif.TIFFCopyright', 'Exif.Copyright')), 'FileSize' => array('', 'img_fsize', 'text', array('File.NiceSize')), 'Width'=> array('', 'img_width', 'text', array('File.Width')), 'Height' => array('', 'img_height', 'text', array('File.Height')), 'Camera' => array('', 'img_camera', 'text', array('Simple.Camera')), ); /* Exif.ApertureValue Exif.MaxApertureValue Exif.ShutterSpeedValue Exif.XResolution Exif.YResolution */ } function write_debug($data) { return; if (!$handle = fopen(DOKU_INC .'uploadnename.txt', 'a')) { return; } if(is_array($data) || is_object($data)) { $data = print_r($data,true); } // Write $somecontent to our opened file. fwrite($handle, "$data\n"); fclose($handle); } }