forked from lolcat/4get
1
0
Fork 0
4get/proxy.php

181 lines
3.5 KiB
PHP

<?php
include "data/config.php";
include "lib/curlproxy.php";
$proxy = new proxy();
if(!isset($_GET["i"])){
header("X-Error: No URL(i) provided!");
$proxy->do404();
die();
}
try{
// original size request, stream file to browser
if(
!isset($_GET["s"]) ||
$_GET["s"] == "original"
){
$proxy->stream_linear_image($_GET["i"]);
die();
}
// bing request, ask bing to resize and stream to browser
$image = parse_url($_GET["i"]);
if(
isset($image["host"]) &&
preg_match(
'/^[A-z0-9.]*bing\.(net|com)$/i',
$image["host"]
)
){
if(!isset($image["path"])){
header("X-Error: Missing bing image path");
$proxy->do404();
die();
}
//
// get image ID
// formations:
// https://tse2.mm.bing.net/th/id/OIP.3yLBkUPn8EXA1wlhWP2BHwHaE3
// https://tse2.mm.bing.net/th?id=OIP.3yLBkUPn8EXA1wlhWP2BHwHaE3
//
$id = null;
if(isset($image["query"])){
parse_str($image["query"], $str);
if(isset($str["id"])){
$id = $str["id"];
}
}
if($id === null){
$id = explode("/th/id/", $image["path"], 2);
if(count($id) !== 2){
// malformed
return $url;
}
$id = $id[1];
}
if(is_array($id)){
header("X-Error: Missing bing id parameter");
$proxy->do404();
die();
}
switch($_GET["s"]){
case "portrait": $req = "?w=50&h=90&p=0&qlt=90"; break;
case "landscape": $req = "?w=160&h=90&p=0&qlt=90"; break;
case "square": $req = "?w=90&h=90&p=0&qlt=90"; break;
case "thumb": $req = "?w=236&h=180&p=0&qlt=90"; break;
case "cover": $req = "?w=207&h=270&p=0&qlt=90"; break;
}
$proxy->stream_linear_image("https://" . $image["host"] . "/th/id/" . urlencode($id) . $req, "https://www.bing.com");
die();
}
// resize image ourselves
$payload = $proxy->get($_GET["i"], $proxy::req_image, true);
// get image format & set imagick
$image = null;
$format = $proxy->getimageformat($payload, $image);
try{
if($format !== false){
$image->setFormat($format);
}
$image->readImageBlob($payload["body"]);
$image_width = $image->getImageWidth();
$image_height = $image->getImageHeight();
switch($_GET["s"]){
case "portrait":
$width = 50;
$height = 90;
break;
case "landscape":
$width = 160;
$height = 90;
break;
case "square":
$width = 90;
$height = 90;
break;
case "thumb":
$width = 236;
$height = 180;
break;
case "cover":
$width = 207;
$height = 270;
break;
}
$ratio = $image_width / $image_height;
if($image_width > $width){
$image_width = $width;
$image_height = round($image_width / $ratio);
}
if($image_height > $height){
$ratio = $image_width / $image_height;
$image_height = $height;
$image_width = $image_height * $ratio;
}
$image->setImageBackgroundColor("#504945");
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->stripImage();
$image->setFormat("jpeg");
$image->setImageCompressionQuality(90);
$image->setImageCompression(Imagick::COMPRESSION_JPEG2000);
$image->resizeImage($image_width, $image_height, Imagick::FILTER_LANCZOS, 1);
$proxy->getfilenameheader($payload["headers"], $_GET["i"]);
header("Content-Type: image/jpeg");
echo $image->getImageBlob();
}catch(ImagickException $error){
header("X-Error: Could not convert the image: (" . $error->getMessage() . ")");
$proxy->do404();
}
}catch(Exception $error){
header("X-Error: " . $error->getMessage());
$proxy->do404();
die();
}