404 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			404 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace Zotlabs\Module;
 | |
| 
 | |
| // oembed provider
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| class Oep extends \Zotlabs\Web\Controller {
 | |
| 
 | |
| 	function init() {
 | |
| 	
 | |
| 		logger('oep: ' . print_r($_REQUEST,true), LOGGER_DEBUG, LOG_INFO);
 | |
| 	
 | |
| 		$html = ((argc() > 1 && argv(1) === 'html') ? true : false);
 | |
| 		if($_REQUEST['url']) {
 | |
| 			$_REQUEST['url'] = strip_zids($_REQUEST['url']);
 | |
| 			$url = $_REQUEST['url'];
 | |
| 		}
 | |
| 	
 | |
| 		if(! $url)
 | |
| 			http_status_exit(404, 'Not found');
 | |
| 	
 | |
| 		$maxwidth  = $_REQUEST['maxwidth'];
 | |
| 		$maxheight = $_REQUEST['maxheight'];
 | |
| 		$format = $_REQUEST['format'];
 | |
| 		if($format && $format !== 'json')
 | |
| 			http_status_exit(501, 'Not implemented');
 | |
| 	
 | |
| 		if(fnmatch('*/photos/*/album/*',$url))
 | |
| 			$arr = $this->oep_album_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/photos/*/image/*',$url))
 | |
| 			$arr = $this->oep_photo_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/photos*',$url))
 | |
| 			$arr = $this->oep_phototop_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/display/*',$url))
 | |
| 			$arr = $this->oep_display_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/channel/*mid=*',$url))
 | |
| 			$arr = $this->oep_mid_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/channel*',$url))
 | |
| 			$arr = $this->oep_profile_reply($_REQUEST);
 | |
| 		elseif(fnmatch('*/profile/*',$url))
 | |
| 			$arr = $this->oep_profile_reply($_REQUEST);
 | |
| 	
 | |
| 		if($arr) {
 | |
| 			if($html) {
 | |
| 				if($arr['type'] === 'rich') {
 | |
| 					header('Content-Type: text/html');
 | |
| 					echo $arr['html'];
 | |
| 				}
 | |
| 			}
 | |
| 			else {
 | |
| 				header('Content-Type: application/json+oembed');
 | |
| 				echo json_encode($arr);
 | |
| 			}
 | |
| 			killme();
 | |
| 		}
 | |
| 	
 | |
| 		http_status_exit(404,'Not found');
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	function oep_display_reply($args) {
 | |
| 	
 | |
| 		$ret = array();
 | |
| 		$url = $args['url'];
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 			$res = $matches[5];
 | |
| 		}
 | |
| 	
 | |
| 		if(! ($chn && $res))
 | |
| 			return;
 | |
| 		$c = q("select * from channel where channel_address = '%s' limit 1",
 | |
| 			dbesc($chn)
 | |
| 		);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 		$sql_extra = item_permissions_sql($c[0]['channel_id']);
 | |
| 	
 | |
| 		$p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
 | |
| 	  		dbesc($res),
 | |
| 			intval($c[0]['channel_id'])
 | |
| 		);
 | |
| 		if(! $p)
 | |
| 			return;
 | |
| 		
 | |
| 		xchan_query($p,true);
 | |
| 		$p = fetch_post_tags($p,true);
 | |
| 	        
 | |
| 		$o = "[share author='".urlencode($p[0]['author']['xchan_name']).
 | |
| 	            "' profile='".$p[0]['author']['xchan_url'] .
 | |
| 	            "' avatar='".$p[0]['author']['xchan_photo_s'].
 | |
| 	            "' link='".$p[0]['plink'].
 | |
| 	            "' posted='".$p[0]['created'].
 | |
| 	            "' message_id='".$p[0]['mid']."']";
 | |
| 	    if($p[0]['title'])
 | |
| 	            $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
 | |
| 	        $o .= $p[0]['body'];
 | |
| 	        $o .= "[/share]";
 | |
| 		$o = bbcode($o);
 | |
| 	
 | |
| 		$ret['type'] = 'rich';
 | |
| 	
 | |
| 		$w = (($maxwidth) ? $maxwidth : 640);
 | |
| 		$h = (($maxheight) ? $maxheight : intval($w * 2 / 3));
 | |
| 	
 | |
| 		$ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
 | |
| 		
 | |
| 		$ret['width'] = $w;
 | |
| 		$ret['height'] = $h;
 | |
| 	
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	function oep_mid_reply($args) {
 | |
| 	
 | |
| 		$ret = array();
 | |
| 		$url = $args['url'];
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		if(preg_match('#//(.*?)/(.*?)/(.*?)/(.*?)mid\=(.*?)(&|$)#',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 			$res = $matches[5];
 | |
| 		}
 | |
| 	
 | |
| 		if(! ($chn && $res))
 | |
| 			return;
 | |
| 		$c = q("select * from channel where channel_address = '%s' limit 1",
 | |
| 			dbesc($chn)
 | |
| 		);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 		$sql_extra = item_permissions_sql($c[0]['channel_id']);
 | |
| 	
 | |
| 		$p = q("select * from item where mid = '%s' and uid = %d $sql_extra limit 1",
 | |
| 	  		dbesc($res),
 | |
| 			intval($c[0]['channel_id'])
 | |
| 		);
 | |
| 		if(! $p)
 | |
| 			return;
 | |
| 		
 | |
| 		xchan_query($p,true);
 | |
| 		$p = fetch_post_tags($p,true);
 | |
| 	        
 | |
| 		$o = "[share author='".urlencode($p[0]['author']['xchan_name']).
 | |
| 	            "' profile='".$p[0]['author']['xchan_url'] .
 | |
| 	            "' avatar='".$p[0]['author']['xchan_photo_s'].
 | |
| 	            "' link='".$p[0]['plink'].
 | |
| 	            "' posted='".$p[0]['created'].
 | |
| 	            "' message_id='".$p[0]['mid']."']";
 | |
| 	    if($p[0]['title'])
 | |
| 	            $o .= '[b]'.$p[0]['title'].'[/b]'."\r\n";
 | |
| 	        $o .= $p[0]['body'];
 | |
| 	        $o .= "[/share]";
 | |
| 		$o = bbcode($o);
 | |
| 	
 | |
| 		$ret['type'] = 'rich';
 | |
| 	
 | |
| 		$w = (($maxwidth) ? $maxwidth : 640);
 | |
| 		$h = (($maxheight) ? $maxheight : intval($w * 2 / 3));
 | |
| 	
 | |
| 		$ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
 | |
| 		
 | |
| 		$ret['width'] = $w;
 | |
| 		$ret['height'] = $h;
 | |
| 	
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	function oep_profile_reply($args) {
 | |
| 	
 | |
| 		
 | |
| 		require_once('include/channel.php');
 | |
| 
 | |
| 		$url = $args['url'];
 | |
| 	
 | |
| 		if(preg_match('#//(.*?)/(.*?)/(.*?)(/|\?|&|$)#',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 		}
 | |
| 	
 | |
| 		if(! $chn)
 | |
| 			return;
 | |
| 	
 | |
| 		$c = channelx_by_nick($chn);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 	
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		$width = 800;
 | |
| 		$height = 375;
 | |
| 	
 | |
| 		if($maxwidth) {
 | |
| 			$width = $maxwidth;
 | |
| 			$height = (375 / 800) * $width;
 | |
| 		}
 | |
| 		if($maxheight) {
 | |
| 			if($maxheight < $height) {
 | |
| 				$width = (800 / 375) * $maxheight;
 | |
| 				$height = $maxheight;
 | |
| 			}
 | |
| 		} 
 | |
| 		$ret = array();
 | |
| 	
 | |
| 		$ret['type'] = 'rich';
 | |
| 		$ret['width'] = intval($width);
 | |
| 		$ret['height'] = intval($height);
 | |
| 	
 | |
| 		$ret['html'] = get_zcard_embed($c,get_observer_hash(),array('width' => $width, 'height' => $height));
 | |
| 	
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	function oep_album_reply($args) {
 | |
| 	
 | |
| 		$ret = array();
 | |
| 		$url = $args['url'];
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		if(preg_match('|//(.*?)/(.*?)/(.*?)/album/|',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 			$res = hex2bin(basename($url));
 | |
| 		}
 | |
| 	
 | |
| 		if(! ($chn && $res))
 | |
| 			return;
 | |
| 		$c = q("select * from channel where channel_address = '%s' limit 1",
 | |
| 			dbesc($chn)
 | |
| 		);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 		$sql_extra = permissions_sql($c[0]['channel_id']);
 | |
| 	
 | |
| 		$p = q("select resource_id from photo where album = '%s' and uid = %d and imgscale = 0 $sql_extra order by created desc limit 1",
 | |
| 	  		dbesc($res),
 | |
| 			intval($c[0]['channel_id'])
 | |
| 		);
 | |
| 		if(! $p)
 | |
| 			return;
 | |
| 	
 | |
| 		$res = $p[0]['resource_id'];
 | |
| 	
 | |
| 		$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
 | |
| 			intval($c[0]['channel_id']),
 | |
| 			dbesc($res)
 | |
| 		);
 | |
| 	
 | |
| 		if($r) {
 | |
| 			foreach($r as $rr) {
 | |
| 				$foundres = false;
 | |
| 				if($maxheight && $rr['height'] > $maxheight)
 | |
| 					continue;
 | |
| 				if($maxwidth && $rr['width'] > $maxwidth)
 | |
| 					continue;
 | |
| 				$foundres = true;			
 | |
| 				break;
 | |
| 			}
 | |
| 	
 | |
| 			if($foundres) {
 | |
| 				$ret['type'] = 'link';
 | |
| 				$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
 | |
| 				$ret['thumbnail_width'] = $rr['width'];
 | |
| 				$ret['thumbnail_height'] = $rr['height'];
 | |
| 			}
 | |
| 				
 | |
| 	
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	function oep_phototop_reply($args) {
 | |
| 	
 | |
| 		$ret = array();
 | |
| 		$url = $args['url'];
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		if(preg_match('|//(.*?)/(.*?)/(.*?)$|',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 		}
 | |
| 	
 | |
| 		if(! $chn)
 | |
| 			return;
 | |
| 		$c = q("select * from channel where channel_address = '%s' limit 1",
 | |
| 			dbesc($chn)
 | |
| 		);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 		$sql_extra = permissions_sql($c[0]['channel_id']);
 | |
| 	
 | |
| 		$p = q("select resource_id from photo where uid = %d and imgscale = 0 $sql_extra order by created desc limit 1",
 | |
| 			intval($c[0]['channel_id'])
 | |
| 		);
 | |
| 		if(! $p)
 | |
| 			return;
 | |
| 	
 | |
| 		$res = $p[0]['resource_id'];
 | |
| 	
 | |
| 		$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
 | |
| 			intval($c[0]['channel_id']),
 | |
| 			dbesc($res)
 | |
| 		);
 | |
| 	
 | |
| 		if($r) {
 | |
| 			foreach($r as $rr) {
 | |
| 				$foundres = false;
 | |
| 				if($maxheight && $rr['height'] > $maxheight)
 | |
| 					continue;
 | |
| 				if($maxwidth && $rr['width'] > $maxwidth)
 | |
| 					continue;
 | |
| 				$foundres = true;			
 | |
| 				break;
 | |
| 			}
 | |
| 	
 | |
| 			if($foundres) {
 | |
| 				$ret['type'] = 'link';
 | |
| 				$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
 | |
| 				$ret['thumbnail_width'] = $rr['width'];
 | |
| 				$ret['thumbnail_height'] = $rr['height'];
 | |
| 			}
 | |
| 				
 | |
| 	
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	function oep_photo_reply($args) {
 | |
| 	
 | |
| 		$ret = array();
 | |
| 		$url = $args['url'];
 | |
| 		$maxwidth  = intval($args['maxwidth']);
 | |
| 		$maxheight = intval($args['maxheight']);
 | |
| 	
 | |
| 		if(preg_match('|//(.*?)/(.*?)/(.*?)/image/|',$url,$matches)) {
 | |
| 			$chn = $matches[3];
 | |
| 			$res = basename($url);
 | |
| 		}
 | |
| 	
 | |
| 		if(! ($chn && $res))
 | |
| 			return;
 | |
| 		$c = q("select * from channel where channel_address = '%s' limit 1",
 | |
| 			dbesc($chn)
 | |
| 		);
 | |
| 	
 | |
| 		if(! $c)
 | |
| 			return;
 | |
| 	
 | |
| 		$sql_extra = permissions_sql($c[0]['channel_id']);
 | |
| 	
 | |
| 	
 | |
| 		$r = q("select height, width, imgscale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by imgscale asc",
 | |
| 			intval($c[0]['channel_id']),
 | |
| 			dbesc($res)
 | |
| 		);
 | |
| 	
 | |
| 		if($r) {
 | |
| 			foreach($r as $rr) {
 | |
| 				$foundres = false;
 | |
| 				if($maxheight && $rr['height'] > $maxheight)
 | |
| 					continue;
 | |
| 				if($maxwidth && $rr['width'] > $maxwidth)
 | |
| 					continue;
 | |
| 				$foundres = true;			
 | |
| 				break;
 | |
| 			}
 | |
| 	
 | |
| 			if($foundres) {
 | |
| 				$ret['type'] = 'link';
 | |
| 				$ret['thumbnail_url'] = z_root() . '/photo/' . '/' . $rr['resource_id'] . '-' . $rr['imgscale'];
 | |
| 				$ret['thumbnail_width'] = $rr['width'];
 | |
| 				$ret['thumbnail_height'] = $rr['height'];
 | |
| 			}
 | |
| 				
 | |
| 	
 | |
| 		}
 | |
| 		return $ret;
 | |
| 	
 | |
| 	}
 | |
| }
 |