398 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			398 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| // oembed provider
 | |
| 
 | |
| 
 | |
| 
 | |
| function oep_init(&$a) {
 | |
| 
 | |
| 	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 = oep_album_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/photos/*/image/*',$url))
 | |
| 		$arr = oep_photo_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/photos*',$url))
 | |
| 		$arr = oep_phototop_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/display/*',$url))
 | |
| 		$arr = oep_display_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/channel/*mid=*',$url))
 | |
| 		$arr = oep_mid_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/channel*',$url))
 | |
| 		$arr = oep_profile_reply($_REQUEST);
 | |
| 	elseif(fnmatch('*/profile/*',$url))
 | |
| 		$arr = 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 : $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 : $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/identity.php');
 | |
| 	require_once('include/Contact.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($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 scale = 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, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale 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['scale'];
 | |
| 			$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 scale = 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, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale 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['scale'];
 | |
| 			$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, scale, resource_id from photo where uid = %d and resource_id = '%s' $sql_extra order by scale 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['scale'];
 | |
| 			$ret['thumbnail_width'] = $rr['width'];
 | |
| 			$ret['thumbnail_height'] = $rr['height'];
 | |
| 		}
 | |
| 			
 | |
| 
 | |
| 	}
 | |
| 	return $ret;
 | |
| 
 | |
| } |